﻿//define a node object so we can deal with HTML (need to Add XML one here if needed) nodes
if (!window.Node) {
    var Node = {            
        ELEMENT_NODE: 1,
        ATTRIBUTE_NODE: 2,
        TEXT_NODE: 3,      
        COMMENT_NODE: 8,    
        DOCUMENT_NODE: 9,
        DOCUMENT_FRAGMENT_NODE: 11
    };
} 

//Add a trim function to ALL string elements
String.prototype.trim = function () { 
    return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
};

var KEY_PAGEUP = 33;
var KEY_PAGEDOWN = 34;
var KEY_END = 35;
var KEY_HOME = 36;

var KEY_LEFT = 37;
var KEY_UP = 38;
var KEY_RIGHT = 39;
var KEY_DOWN = 40;

var KEY_SPACE = 32;
var KEY_TAB = 9;

var KEY_BACKSPACE = 8;
var KEY_DELETE = 46;
var KEY_ENTER = 13;
var KEY_INSERT = 45;
var KEY_ESCAPE = 27;

var NS_XHTML = "http://www.w3.org/1999/xhtml";
var NS_STATE = "http://www.w3.org/2005/07/aaa";

var ARIA_STATE = "aria-";

function getNextSibling(node) {
    var onNode = node.nextSibling;
    while (onNode && (onNode.nodeType !== Node.ELEMENT_NODE)) {
	    onNode = onNode.nextSibling;
    }
    return onNode;
}

function getPreviousSibling(node) {
    var onNode = node.previousSibling;
    while (onNode && (onNode.nodeType !== Node.ELEMENT_NODE)) {
	    onNode = onNode.previousSibling;
    }  
    return onNode;
}

function getFirstChild(node) {
    var onNode = node.firstChild;
    while (onNode && (onNode.nodeType !== Node.ELEMENT_NODE)) {
	    onNode = onNode.nextSibling;
    }
    return onNode;
}
    
function getTextContentOfNode(node) {
    var onNode = node.firstChild;
    var s = "";
    while (onNode) {
	    if ((onNode.nodeType === Node.TEXT_NODE) && (onNode.length > 0)) {
	        s += onNode.data;
	    }
        onNode = onNode.nextSibling;
    }  
    return s;
}

function setTextContentOfNode(node, text) {
    var textNode = document.createTextNode(text);
    while (node.firstChild) {
        node.removeChild(node.firstChild);
    } 
    node.appendChild(textNode);
}

function Widgets() {
    this.widgets = new Array();
}

Widgets.prototype.add = function (obj) {
    this.widgets[this.widgets.length] = obj;
};

Widgets.prototype.init = function () {
    for(var i = 0; i < this.widgets.length; i++) {
        this.widgets[i].init();
    }
};


function getObjByEmsDataId(emsDataId) {
   var inputs = document.getElementsByTagName("input");
   for(var i = 0; i < inputs.length; i++)    {
    
       if(inputs[i].emsDataId) {
           if(inputs[i].emsDataId === emsDataId)
           { 
                return inputs[i];
           }
           else if (inputs[i].name === emsDataId)
           {
               return inputs[i];
           }
       }
       else {
            if(inputs[i].getAttribute("emsDataId") === emsDataId) {
                return inputs[i];
            }
            
            if(inputs[i].name === emsDataId) {
                return inputs[i];            
            }
       }
   }
   var selects = document.getElementsByTagName("select");
   for(var i = 0; i < selects.length; i++)
   {
       if(selects[i].emsDataId)
       {
            if(selects[i].emsDataId === emsDataId)
            { 
                return selects[i];
            }
       }
       else {
            if(selects[i].getAttribute("emsDataId") === emsDataId) {
                return selects[i];
            }
       }
   }
   
   var textareas = document.getElementsByTagName("textarea");
   for(var i = 0; i < textareas.length; i++)
   {
       if(textareas[i].emsDataId){
            if(textareas[i].emsDataId === emsDataId)
            { 
                return textareas[i];
            }
       }
       else
       {
           if(textareas[i].getAttribute("emsDataId") === emsDataId)
            { 
                return textareas[i];
            }
       }
   }
 
   return null;
}


function $(id) {
    return document.getElementById(id) || getObjByEmsDataId(id);
}


//give us a common place to reset browser differences...ah the joy
function WebBrowser() {}

if (document.addEventListener) {
    WebBrowser.prototype.setMouseEvents = function (node, clickHandler, downHandler, moveHandler, upHandler) {
        if (clickHandler) {
            document.addEventListener("click", clickHandler, true);
        }
        if (downHandler) {
            document.addEventListener("mousedown", downHandler, true);
        }
        if (moveHandler) {
            document.addEventListener("mousemove", moveHandler, true);
        }
        if (upHandler) {
            document.addEventListener("mouseup", upHandler, true);
        }
    };
    
    WebBrowser.prototype.releaseMouseCapture = function (node, clickHandler, downHandler, moveHandler, upHandler) {
    	if (upHandler) {
            document.removeEventListener("mouseup", upHandler, true);
        }
        if (moveHandler) {
            document.removeEventListener("mousemove", moveHandler, true);
        }
		if (downHandler) {
            document.removeEventListener("mousedown", downHandler,  true);
        }
		if (clickHandler) {
            document.removeEventListener("click", clickHandler, true);
        }
    };
} else { 
    WebBrowser.prototype.setMouseCapture = function (node, clickHandler, downHandler, moveHandler, upHandler) {
        node.setCapture();
        if (clickHandler) {
	        node.attachEvent("onclick", clickHandler);
	    }
        if (downHandler) {
            node.attachEvent("onmousedown", downHandler);
        }
		if (moveHandler) {
	        node.attachEvent("onmousemove", moveHandler);
	    }
		if (upHandler) {
	        node.attachEvent("onmouseup", upHandler);
	    }
    };
    
    WebBrowser.prototype.releaseMouseCapture = function (node, clickHandler, downHandler, moveHandler, upHandler) {
        if (upHandler) {
            node.detachEvent("onmouseup", upHandler);
        }
		if (moveHandler) {
            node.detachEvent("onmousemove", moveHandler);
        }
        if (downHandler) {
            node.detachEvent("onmousedown", downHandler);
        }
        if (clickHandler) {
            node.detachEvent("onclick", clickHandler);
        }
        node.releaseCapture();
    };
}

if (document.createEvent) {
    WebBrowser.prototype.simulateOnClickEvent = function (node) {
        var e = document.createEvent('MouseEvents');
        e.initEvent('click', true, true);
        node.dispatchEvent(e);
    };
} else {
    WebBrowser.prototype.simulateOnClickEvent = function (node) {
        var e = document.createEventObject();
        node.fireEvent("onclick", e);
    };
}

WebBrowser.prototype.keyCode = function (event) {
    var e = event || window.event;
    return e.keyCode;
};


if (typeof document.documentElement.setAttributeNS !== 'undefined') {
    WebBrowser.prototype.stopPropagation = function (event) {
        event.stopPropagation();
        event.preventDefault();
        return false;
    };

    WebBrowser.prototype.target = function (event) {
	    return event.target;
    };
    WebBrowser.prototype.charCode = function (event) {
        return event.charCode;
    };
    WebBrowser.prototype.calculateOffsetLeft = function (node) {
	    return node.offsetLeft;	  
    };
    WebBrowser.prototype.calculateOffsetTop = function (node) {
	    return node.offsetTop;	  
    };
    WebBrowser.prototype.pageX = function (e) {
		return e.pageX;
    };
    WebBrowser.prototype.pageY = function (e) {
		return e.pageX;	  
    };
} else {
    WebBrowser.prototype.stopPropagation = function (event) {
        window.event.cancelBubble = true; 
        window.event.returnValue = false;
        return false;
    };
    WebBrowser.prototype.charCode = function (event) {
        return window.browser.keyCode(event);
    };
    WebBrowser.prototype.target = function (event) {
        return window.event.srcElement;
    };
    WebBrowser.prototype.calculateOffsetLeft = function (node) {
	    var offset = 0;
		while (node) {
	        offset += node.offsetLeft;
	        node = node.offsetParent;
	    }
        return offset;	  
    };
    WebBrowser.prototype.calculateOffsetTop = function (node) {
	    var offset = 0;
		while (node) {
		    offset = offset + node.offsetTop;
		    node = node.offsetParent;
	    }
    	return offset;	  
    };
    WebBrowser.prototype.pageX = function (e) {
		return e.clientX + document.body.scrollLeft;	  
    };
    WebBrowser.prototype.pageY = function (e) {
		return e.clientY + document.body.scrollTop;	  
    };
}


if (document.addEventListener) {
    WebBrowser.prototype.addEvent = function (elmTarget, sEventName, fCallback) {
        elmTarget.addEventListener(sEventName, fCallback, false);
        returnValue = true;
    };
    WebBrowser.prototype.removeEvent = function (elmTarget, sEventName, fCallback) {
        elmTarget.removeEventListener(sEventName, fCallback, false);
        returnValue = true;
    };
    WebBrowser.prototype.addChangeEvent =  function (elmTarget, fCallback) {
        elmTarget.addEventListener("DOMAttrModified", fCallback, false);
        returnValue = true;
    };
} else {
    if (document.attachEvent) {
        WebBrowser.prototype.addEvent = function (elmTarget, sEventName, fCallback) {
            returnValue = elmTarget.attachEvent('on' + sEventName, fCallback);
        };
        WebBrowser.prototype.removeEvent = function (elmTarget, sEventName, fCallback) {
            returnValue = elmTarget.detachEvent('on' + sEventName, fCallback);
        };

        WebBrowser.prototype.addChangeEvent =  function (elmTarget, fCallback) {
            returnValue = elmTarget.attachEvent("onpropertychange", fCallback);
        };
    } else {
        WebBrowser.prototype.addEvent = function (elmTarget, sEventName, fCallback) {
            return false;
        };
        WebBrowser.prototype.removeEvent = function (elmTarget, sEventName, fCallback) {
            return false;
         };
        WebBrowser.prototype.addChangeEvent =  function (elmTarget, fCallback) {
            return false;
         };
    }
}

function Aria() {}

Aria.prototype.setAriaState = function (elmTarget, sStateName, sStateValue) {
    elmTarget.setAttribute(ARIA_STATE + sStateName, sStateValue);
};

Aria.prototype.setRole = function (elmTarget, sStateValue) {
    elmTarget.setAttribute("role", sStateValue);
};
  
Aria.prototype.getAriaState = function (elmTarget, sStateName) {
    return elmTarget.getAttribute(ARIA_STATE + sStateName);
};

Aria.prototype.removeAriaState = function (elmTarget, sStateName) {
    return elmTarget.removeAttribute(ARIA_STATE + sStateName);
};

Aria.prototype.hasAriaState = function (elmTarget, sStateName) {
    return elmTarget.hasAttribute(ARIA_STATE + sStateName);
};

Aria.prototype.setRolesAndStates = function (elmAccessible) {
  var STATE_MACHINE_BEGIN = 0;
  var STATE_MACHINE_IN_ACCESSIBLE = 1;
  var STATE_MACHINE_ROLE_IS_SET = 2;

  var sClass = elmAccessible.className;
  var arClassNames = sClass.split(' ');
  var machineState = STATE_MACHINE_BEGIN;
  var role = "";

    for (j = 0; j < arClassNames.length; j++) {
        // Delete spaces in CNAMEs
        var sClass = arClassNames[j].replace(/ /g, '');

        // Test to see if there are any CNAMEs to process, if not exit
        if (!sClass) { continue; }
    	
        // Look for CNAMEs assocaited with ARIA markup
        if (sClass == 'axs') {
            /* found "axs" accessible keyword, rest of class will be treated as ARIA roles and states */
            machineState = STATE_MACHINE_IN_ACCESSIBLE;
        } else if (machineState === STATE_MACHINE_IN_ACCESSIBLE) {
            /* found role, set it and move on */
            this.setRole(elmAccessible, sClass);

            machineState = STATE_MACHINE_ROLE_IS_SET;
            role = sClass;
        } else if (machineState == STATE_MACHINE_ROLE_IS_SET) {
            /* found state, set it and look for more */
            if (sClass.indexOf('-') != -1) {
                /* state has specific value, parse it out and set it */
                var arValue = sClass.split(/-/);
                // arValue[0] is state name, arValue[1] is value 
	            // 
	            // test for tabindex value
	            if (arValue[0] !== "tabindex") {
        	        // If not tabindex set the aria property and value
                    this.setAriaState(elmAccessible, arValue[0], arValue[1]);
                }
	            else {
        	        // If tabindex use Microsoft IE property to set tabindex value
	                if (arValue[1] !=+ "") {
	                    elmAccessible.tabIndex = arValue[1];		  
                    } else {
	                    // if tabindex value is undefined assume it is a negative number and set tabindex=-1
	                    elmAccessible.tabIndex = -1;		  		  
	                }
	            }
            } else {
                /* state is simply a name, value is null - make it a string to match other values as strings*/
                this.setAriaState(elmAccessible, sClass, "");
            }
        }
    }
};


initApp = function (elmRoot) {
  
    if (document.isInitialized) {
        return;  // Avoid second initialization -- we inited early because of DOMContentLoaded
    }
  
    document.isInitialized = true;
   
    // If elmRoot is undefined start with the BODY element
    if ((!elmRoot) || (!elmRoot.getElementsByTagName)) {
        elmRoot = document.body;
    }

    // Check elmRoot node for information in the CLASS attribute to convert to ARIA markup
    if (/axs /.test(elmRoot.className)) {
        aria.setRolesAndStates(elmRoot);  // First do root element
    }

    // Check for W3C Standards compliant implementation of XPATH evaluation
    if (document.evaluate) {
    	// Get ARIA Roles and States  
        var snapAccessibleElements = document.evaluate(".//*[contains(@class, 'axs ')]", elmRoot, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var i = snapAccessibleElements.snapshotLength - 1; i >= 0; i--) {
            aria.setRolesAndStates(snapAccessibleElements.snapshotItem(i), "wairole:");
        }
    } else {   // Otherwise use Micrsoft IE technique for identifying nodes
	    var axsElements = new Array();
	    var axsElementCount = 0;
        var arElements = (typeof elmRoot.all != 'undefined') ? elmRoot.all : elmRoot.getElementsByTagName('*');
        var iElementCount = arElements.length;

    	// Find elements with ARIA markup and save their IDs
        for (var i = 0; i < iElementCount; i++) {
            if (/axs /.test(arElements[i].className)) {
 		        aria.setRolesAndStates(arElements[i]);
            }
        } 
	}
 
  widgets.init();

};

// Initialize global variables used to initial widgets and provide browser independence for handling events and lack of namespace support in IE DOM functions

widgets_flag = true;
var widgets = new Widgets();
var browser = new WebBrowser();
var aria = new Aria();


function checkCss(o, c) {
    if(typeof(o) === "string") {
        o = $(o);
    }
    return new RegExp('\\b'+c+'\\b').test(o.className);
}

function swapCss(o,c1,c2) {
     if(typeof(o) === "string") {
        o = $(o);
    }
    o.className = !checkCss(o,c1) ? o.className.replace(c2,c1) : o.className.replace(c1,c2);
}

function addCss(o, c) {
     if(typeof(o) === "string") {
        o = $(o);
    }
    if(!checkCss(o,c)){
        o.className += o.className ? ' ' + c : c;
    }
}

function removeCss(o, c) {
    if(typeof(o) === "string") {
        o = $(o);
    }
    if(o.className) {
        var rep = o.className.match(' '+c) ? ' '+c : c;
        o.className=o.className.replace(rep,'');
    }
}

function suppressSubmitOnReturn(e)
{
   if(browser.charCode(e) === KEY_ENTER){ return false; }
}


    var oFeatureWin  = null;
    function openFeature(s)  {
        var oFeatureWin = window.open("Features/" + s, "featureWindow", "location=0,status=1,scrollbars=1,width=1000,height=600", 1)
        if(oFeatureWin) {
            oFeatureWin.focus();
        }
        return false;
    }


