/* dom_functions.js
 * Author: Chad E. Jennings
 * Copyright: 2007, Bluedilla, LLC.
 */
/* Loading/Attaching */
function addLoadListener(fn) {
    if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('load', fn, false);
    }
    else if (typeof document.addEventListener != 'undefined') {
        document.addEventListener('load', fn, false);
    }
    else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onload', fn);
    }
    else {
        var oldfn = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = fn;
        }
        else {
            window.onload = function() {
                oldfn();
                fn();
            };
        }
    }
}

function attachEventListener(target, eventType, functionRef, capture) {
    if (typeof target.addEventListener != "undefined") {
        target.addEventListener(eventType, functionRef, capture);
    }
    else if (typeof target.attacheEvent != "undefined") {
        target.attachEvent("on" + eventType, functionRef);
    }
    else {
        eventType = "on" + eventType;
        
        if (typeof target[eventType] == "function") {
            var oldListener = target[eventType];
            
            target[eventType] = function() {
                oldListener();
                
                return functionRef();
            };
        }
        else {
            target[eventType] = functionRef;
        }
    }
}

function detachEventListener(target, eventType, functionRef, capture) {
    if (typeof target.removeEventListener != "undefined") {
        target.removeEventListener(eventType, functionRef, capture);
    }
    else if (typeof target.detachEvent != "undefined") {
        target.detachEvent("on" + eventType, functionRef);
    }
    else {
        target["on" + eventType] = null;
    }
}

function stopDefaultAction(event) {
    event.returnValue = false;
    
    if (typeof event.preventDefault != "undefined") {
        event.preventDefault();
    }
}

function getEventTarget(event) {
    var targetElement = null;
    
    if (typeof event.target != "undefined") {
        targetElement = event.target;
    }
    else {
        targetElement = event.srcElement;
    }
    
    while (targetElement.nodeType == 3 && targetElement.parentNode != null) {
        targetElement = targetElement.parentNode;
    }
    
    return targetElement;
}

function getElementsByAttribute(attribute, attributeValue) {
    var elementArray = new Array();
    var matchedArray = new Array();
    
    if (document.all) {
        elementArray = document.all;
    }
    else {
        elementArray = document.getElementsByTagName("*");
    }
    
    for (var i = 0; i < elementArray.length; i++) {
        if (attribute == "class") {
            var pattern = new RegExp("(^| )" + attributeValue + "( |$)");
            
            if (pattern.test(elementArray[i].className)) {
                matchedArray[matchedArray.length] = elementArray[i];
            }
        }
        else if (attribute == "for") {
            if (elementArray[i].getAttribute("htmlFor") || elementArray[i].getAttribute("for")) {
                if (elementArray[i].htmlFor == atrributeValue) {
                    matchedArray[matchedArray.length] = elementArray[i];
                }
            }
        }
        else if (elementArray[i].getAttribute(attribute) == attributeValue) {
            matchedArray[matchedArray.length] = elementArray[i];
        }
    }
    
    return matchedArray;
}

/* Browser Detection */
function identifyBrowser() {
    var agent = navigator.userAgent.toLowerCase();
    
    if (typeof navigator.vendor != "undefined" && navigator.vendor == "KDE" && typeof window.sidebar != "undefined") {
        return "kde";
    }
    else if (typeof window.opera != "undefined") {
        var version = parseFloat(agent.replace(/.*opera[\/ ]([^ $]+).*/, "$1"));
        
        if (version >= 7) {
            return "opera7";
        }
        else if (version >= 5) {
            return "opera5";
        }
        
        return false;
    }
    else if (typeof document.all != "undefined") {
        if (typeof document.getElementById != "undefined") {
            var browser = agent.replace(/.*ms(ie[\/ ][^ $]+).*/, "$1").replace(/ /, "");
            
            if (typeof document.uniqueID != "undefined") {
                if (browser.indexOf("5.5") != -1) {
                    return browser.replace(/(.*5\.5).*/, "$1");
                }
                else {
                    return browser.replace(/(.*)\..*/, "$1");
                }
            }
            else {
                return "ie5mac";
            }
        }
        
        return false;
    }
    else if (typeof document.getElementById != "undefined") {
        if (navigator.vendor.indexOf("Apple Computer, Inc.") != -1) {
            if (typeof window.XMLHttpRequest != "undefined") {
                return "safari1.2";
            }
            
            return "safari1";
        }
        else if (agent.indexOf("gecko") != -1) {
            return "mozilla";
        }
    }
    
    return false;
}

function identifyOS() {
    var agent = navigator.userAgent.toLowerCase();
    
    if (agent.indexOf("win") != -1) {
        return "win";
    }
    else if (agent.indexOf("mac")) {
        return "mac";
    }
    else {
        return "unix";
    }
    
    return false;
}

/* Position Functions */
function getPosition(theElement) {
    var positionX = 0;
    var positionY = 0;
    
    while (theElement != null) {
        positionX += theElement.offsetLeft;
        positionY += theElement.offsetTop;
        theElement = theElement.offsetParent;
    }
    
    return [positionX, positionY];
}

function getScrollingPosition() {
    var position = [0, 0];
    
    if (typeof window.pageYOffset != "undefined") {
        position = [
            window.pageXOffset,
            window.pageYOffset
        ];
    }
    else if (typeof document.documentElement.scrollTop != "undefined" && document.documentElement.scrollTop > 0) {
        position = [
            document.documentElement.scrollLeft,
            document.documentElement.scrollTop
        ];
    }
    else if (typeof document.body.scrollTop != "undefined") {
        position = [
            document.body.scrollLeft,
            document.body.scrollTop
        ];
    }
    
    return position;
}

function retrieveComputedStyle(element, styleProperty) {
    var computedStyle = null;
    
    if (typeof element.currentStyle != "undefined") {
        computedStyle = element.currentStyle;
    }
    else {
        computedStyle = document.defaultView.getComputedStyle(element, null);
    }
    
    return computedStyle[styleProperty];
}

function getText (element) {
   var hasInnerText =
   (document.getElementsByTagName("body")[0].innerText != undefined) ? true : false;
   
   if(!hasInnerText){
      return element.textContent;
   }
   else {
      return element.innerText;
   }
}
