/*----------------- 1. Global variables for IE mac detection -----------------------------*/

var agt = navigator.userAgent.toLowerCase();
var is_mac = (agt.indexOf("mac") !== -1);
var is_ie  = ((agt.indexOf("msie") !== -1) && (agt.indexOf("opera") === -1));


/*
----------------- 1. Global object containing commonoly used funcitons -----------------*/


var g = {
	
// Add Event Listeners
    getTarget: function (e) {
        var target = window.event ? window.event.srcElement : e ? e.target : null;
        if (!target) {
            return false; 
        }
        while (target.nodeType !== 1 && target.nodeName.toLowerCase() !== 'body') {
            target = target.parentNode;
        }
        return target;
    },
	
// Srop propagation and cancel bubble
    stopBubble: function (e) {
        if (window.event) {
            window.event.cancelBubble = true;
        } 
        if (e && e.stopPropagation) {
            e.stopPropagation();
        }
    },

// Prenvent default action
    stopDefault: function (e) {
        if (window.event) {
            window.event.returnValue = false;
        } 
        if (e && e.preventDefault) {
            e.preventDefault();
        }
    },

// Cancel click
    cancelClick: function (e) {
        if (window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
    },

// Cross browser add event
    addEvent: function (elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    },

// Cancel safari click
    safariClickFix: function () {
        return false;
    },

// Add class
    addClass: function (target, classValue) {
        var pattern = new RegExp("(^| )" + classValue + "( |$)");
        if (!pattern.test(target.className)) {
            if (target.className === "") {
                target.className = classValue;
            } else {
                target.className += " " + classValue;
            }
        }
        return true;
    },

// Remove class
    removeClass: function (target, classValue) {
        var removedClass = target.className;
        var pattern = new RegExp("(^| )" + classValue + "( |$)");
        removedClass = removedClass.replace(pattern, "$1");
        removedClass = removedClass.replace(/ $/, "");
        target.className = removedClass;
        return true;
    },

// Add Load 
    addLoadEvent: function (func) {
        var oldonload = window.onload;				
        if (typeof window.onload !== 'function') {	
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            };
        }
    },

// Insert After
    insertAfter: function (newElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild === targetElement) {
            parent.appendChild(newElement);
        } else {
            parent.insertBefore(newElement, targetElement.nextSibling);
        }
    },

// Get Parent until UL
    getParentUL: function (node) {
        if (node.nodeName === "UL") {
            return node;
        }
        if (node.nodeName !== "UL") { 
            return g.getParentUL(node.parentNode);
        }
        return null;
    },
	
    getParentWithIdAttribute: function (node) {
    // If node is not an element node return the nodes parent - RETEST FOR PARENT
        if (node.parentNode.nodeType !== 1) { 
            return g.getParentWithIdAttribute(node.parentNode);
        // else if its an element node but has no id attribute  - RETEST FOR PARENT
        } else if (!node.parentNode.getAttribute("id")) { 
            return g.getParentWithIdAttribute(node.parentNode);	
        } else {
        // else if its and element node with an attribute and has an id of inner or container - RETEST FOR PARENT
            if (node.parentNode.id.indexOf("inner") !== -1 || node.parentNode.id.indexOf("container") !== -1)  {
                return g.getParentWithIdAttribute(node.parentNode);
            } else {
            // The node has an id that is sutiable for passing and indicates the links positin within the site.
                return node.parentNode;
            }
        }	
    },	

    closestSibling: function (node, direction) {
        var tempObj;
        if (direction === -1 && node.previousSibling !== null) {
            tempObj = node.previousSibling;
            while (tempObj.nodeType !== 1 && tempObj.previousSibling !== null) {
                tempObj = tempObj.previousSibling;
            }
        } else if (direction === 1 && node.nextSibling !== null) {
            tempObj = node.nextSibling;
            while (tempObj.nodeType !== 1 && tempObj.nextSibling !== null) {
                tempObj = tempObj.nextSibling;
            }
        }
        return tempObj.nodeType === 1 ?tempObj:false;
    },

// Get elements by their Id
    id: function (strId) {
        return document.getElementById(strId);
    },	

// Get elements by their tag name
    tn: function (strId) {
        return document.getElementsByTagName(strId);
    },

// Get tags within a certain element
    idTn: function (strId, strTn) {
        return document.getElementById(strId).getElementsByTagName(strTn);
    },

// Create and element
    ce: function (strId) {
        return document.createElement(strId);
    },

// Create an element with an attribute
    ceA: function (strId, ele, eleName) {
        var newEle = document.createElement(strId);
        newEle.setAttribute(ele, eleName);
        return newEle;
    },

// Create an element with a className
    ceCn: function (strId, cName) {
        var newEle = document.createElement(strId);
        newEle.className = cName;
        return newEle;
    },

/* Wrap all children in a surrounding wrapper */
    elementWrap: function (container) {
        var content = container.childNodes;
        var contentArray = [];
        for (var i = 0; i < content.length; i ++) {
            if (content[i].nodeType === 1) {
                contentArray.push(content[i]);
            }
        }
        return contentArray;
    }

};	



	
/********* Get elements by class name Jonathan Snook, http://www.snook.ca/jonathan & Robert Nyman, http://www.robertnyman.com *******/
		
function getElementsByClassName(oElm, strTagName, strClassName) {
    var arrElements = (strTagName === "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = [];
    // The next line was changed from original suggestion due to multiple class issue (var oRegExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");)
    //strClassName = strClassName.replace(/-/g, "\-"); 
    strClassName = strClassName.replace(/-/g, "-"); 
    var oRegExp = new RegExp("(^| )" + strClassName + "( |$)");			  
    var oElement;
    for (var i = 0; i < arrElements.length; i++) {
        oElement = arrElements[i];
        if (oRegExp.test(oElement.className)) {
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements);
}	

/*
if (typeof Array.prototype.push !== "function") {
    var Array.prototype.push = ArrayPush;
    function ArrayPush(value) {
        this[this.length] = value;
    }
}*/
if (typeof Array.prototype.push !== "function") {
    Array.prototype.push = ArrayPush;
    function ArrayPush(value) {
        this[this.length] = value;
    }
}
