/** 
 * @fileoverview JavaScript And DHTML Extensions.
 * @author Iain White iain.white@aot.com.au
 * @version 3.2
 */

// Root name space
JADE = {
    version : "3.2",
    params: {},
    __Construct: function()
    {
        var url = document.location.href;
        var queryString = url.replace(/^[^\?]+\??/,'');
        JADE.params = JADE.parseQuery(queryString);
    },
    getInnerText: function(elem)
    {
        return (typeof(elem.innerText) != 'undefined') ? elem.innerText :
            (typeof(elem.textContent) != 'undefined') ? elem.textContent : elem.innerHTML.replace(/<[^>]+>/g, '');
    },
    getElementsByClassName: function(className, parentElm, tagName, fn)
    {
        tagName = tagName || "*";
        parentElm = parentElm || document;
        var objColl = parentElm.getElementsByTagName(tagName);
        if (!objColl.length &&  tagName == "*" &&  parentElm.all) {
            objColl = parentElm.all;
        }
        var arr = new Array();
        var delim = className.indexOf('|') != -1  ? '|' : ' ';
        var arrClass = className.split(delim);
        for (var i = 0, j = objColl.length; i < j; i++) {
            var arrObjClass = objColl[i].className.split(' ');
            if (delim == ' ' && arrClass.length > arrObjClass.length) {
                continue;
            }
            var c = 0;
            comparisonLoop:
            for (var k = 0, l = arrObjClass.length; k < l; k++) {
                for (var m = 0, n = arrClass.length; m < n; m++) {
                    if (arrClass[m] == arrObjClass[k]) {
                        c++;
                    }
                    if ((delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
                        arr.push(objColl[i]);
                        if (fn) {
                            fn(objColl[i]);
                        }
                    break comparisonLoop;
                    }
                }
            }
        }
        return arr;
    }, 
    addLoadListener: function(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(); 
                    }; 
            } 
        } 
    },
    addUnloadListener: function(fn) 
    { 
        if (typeof window.addEventListener != 'undefined') { 
            window.addEventListener('unload', fn, false); 
        } 
        else if (typeof document.addEventListener != 'undefined') { 
            document.addEventListener('unload', fn, false);
        } 
        else if (typeof window.attachEvent != 'undefined') { 
            window.attachEvent('onunload', fn); 
        } 
        else { 
            var oldfn = window.onunload; 
            if (typeof window.onunload != 'function') { 
                window.onunload = fn; 
            } 
            else { 
                window.onunload = function() 
                    { 
                    oldfn(); 
                    fn(); 
                    }; 
            } 
        } 
    },
    vd: function(object)
    {
        alert(this.var_dump(object));
    },
    var_dump: function(obj)
    {
        if (typeof obj == "object") {
            return "Type: " + typeof(obj) + ((obj.constructor) ? "\nConstructor: " + obj.constructor : "") + "\nValue: " + obj;
        } else {
            return "Type: " + typeof(obj) + "\nValue: "+obj;
       }
    },
    prependToTable: function(tableEl, el)
    {
        if (tableEl.children) {
            tableEl.children[0].appendChild(el);
        } else {
            // For FireFox < 3
            if (tableEl.firstChild.nextSibling) {
                tableEl.firstChild.nextSibling.appendChild(el);
            } else {
                tableEl.firstChild.appendChild(el);
            }
        }
    },
    createIframe: function(iframeId) 
    {
        var iframeRef = null;
        if ((document.forms[0]) && (document.forms[0].appendChild)) {
            // Create the IFrame shim...
            iframeRef = document.createElement('iframe');
            iframeRef.id = iframeId;
            iframeRef.name = iframeId;
            iframeRef.src = 'JavaScript:void(0);';
            iframeRef.scrolling = 'no';
            iframeRef.frameborder = '0';
            iframeRef.style.border = 'none';
            iframeRef.style.position = 'absolute';
            iframeRef.style.visibility = 'hidden';
            iframeRef.style.display = 'none';
            iframeRef.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
            iframeRef.style.zIndex = '0';
            document.forms[0].appendChild(iframeRef);
        }
        return iframeRef;
    },
    iFrameShimRequired: function()
    {
        var rv = -1;
        if (navigator.appName == 'Microsoft Internet Explorer') {
            var ua = navigator.userAgent;
            var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
            if (re.exec(ua) != null) {
                rv = parseFloat(RegExp.$1);
            }
            if (rv < 7 && rv > 5) {
                return true;
            }
        }
        return false;
    },
    getStyle: function(el, styleProp)
    {
        if (typeof(el) == 'string') {
            var x = document.getElementById(el);
        } else {
            var x = el;
        }
        if (x.currentStyle) {
            var y = x.currentStyle[styleProp];
        } else if (window.getComputedStyle) {
            var y = document.defaultView.getComputedStyle(x, null).getPropertyValue(styleProp);
        }
        return y;
    },
    removeDupsArray: function(a)
    {
        var r = new Array();
        o : for (var i = 0, n = a.length; i < n; i++) {
            for (var x = 0, y = r.length; x < y; x++) {
                if (r[x] == a[i]) {
                    continue o;
                }
            }
            r[r.length] = a[i];
        }
        return r;
    },
    replaceQueryString: function(url, param, value)
    {
        var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i");
        if (url.match(re)) {
            return url.replace(re,'$1' + param + "=" + value + '$2');
        } else {
            return url + '&' + param + "=" + value;
        }
    },
    parseQuery: function(query)
    {
        var Params = new Object();
        if (!query) {
            return Params;
        }
        var Pairs = query.split(/[;&]/);
        for (var i = 0; i < Pairs.length; i++) {
            var KeyVal = Pairs[i].split('=');
            if (! KeyVal || KeyVal.length != 2) {
                continue;
            }
            var key = unescape(KeyVal[0]);
            var val = unescape(KeyVal[1]);
            val = val.replace(/\+/g, ' ');
            Params[key] = val;
        }
        return Params;
    }
};

JADE.__Construct();

JADE.timeDiff = {
    timer: null,
    setStartTimer: function()
    {
        var d = new Date();
        this.timer = d.getTime();
    },
    getTimeDiff: function()
    {
        // Returns milliseconds 
        var d = new Date();
        return (d.getTime() - this.timer);
    }
}

JADE.Cookies = {
    create: function(name, value, days)
    {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = "; expires=" + date.toGMTString();
        } else {
            var expires = "";
        }
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    createJSON: function(name, value, days)
    {
        JADE.Cookies.create(name, JSON.stringify(value), days);
    },
    read: function(name)
    {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1, c.length);
            }
            if (c.indexOf(nameEQ) == 0) {
                return c.substring(nameEQ.length, c.length);
            }
        }
        return null;
    },
    readJSON: function(name)
    {
        return JSON.parse(JADE.Cookies.read(name));
    },
    erase: function (name)
    {
        this.create(name, "", -1);
    }
}

JADE.Session = function(free, clear)
{
    if (!JSON) {
        alert("No JSON parser loaded!");
        return;
    };
    this.clear = function()
    {
        for (var key = k.split("."), i = 0, l = key.length - 1, t = get(); i < l; i++) {
            if (!t[key[i]]) {
                t[key[i]] = {};
            }
            t = t[key[i]];
        };
        t[key[i]] = {};
        sync();
    };
    this.read = function(key)
    {
        var o = find(key);
        return o.o[o.key]
    };
    this.write = function(key, value)
    {
        var o = find(key);
        o.o[o.key] = value;
        sync();
    };
    var find = function(key)
    {
        for (var i = 0, l = (key = k.concat(".", key).split(".")).length - 1, t = get(); i < l; i++) {
            if (!t[key[i]]) {
                t[key[i]] = {};
            }
            t = t[key[i]];
        };
        return {o:t, key:key.pop()}
    },
    get = function()
    {
        return o = window.name ? JSON.parse(window.name) : o
    },
    sync = function()
    {
        window.name = JSON.stringify(o)
    },
    unload = clear ? function(){window.name = ""} : null,
    k = !free ? location.href.split("/").slice(2, 3)[0].replace(/:[0-9]+/, "") : "o.o",
    o = {};
    get();
    if (unload) {
        window.addEventListener ? window.addEventListener("unload", unload, false) : window.attachEvent("on".concat("unload"), unload);
    }
};

/**
 * Get the position of an object
 */
var Position = (function() 
    {
    // Resolve a string identifier to an object
    function resolveObject(s)
        {
        if (document.getElementById && document.getElementById(s) != null) {
            return document.getElementById(s);
        } else if (document.all && document.all[s] != null) {
            return document.all[s];
        } else if (document.anchors && document.anchors.length && document.anchors.length > 0 && document.anchors[0].x) {
            for (var i = 0; i < document.anchors.length; i++) {
                if (document.anchors[i].name == s) { 
                    return document.anchors[i];
                }
            }
        }
    }

    var pos = {};
    
    pos.set = function(o, left, top)
    {
        if (typeof(o) == "string") {
            o = resolveObject(o);
        }
        if (o == null || !o.style) {
            return false;
        }
        // If the second parameter is an object, it is assumed to be the result of getPosition()
        if (typeof(left) == "object") {
            var pos = left;
            left = pos.left;
            top = pos.top;
        }
        o.style.left = left + "px";
        o.style.top = top + "px";
        return true;
    };

    // Retrieve the position and size of an object
    pos.get = function(o)
    {
        var fixBrowserQuirks = true;
        // If a string is passed in instead of an object ref, resolve it
        if (typeof(o) == "string") {
            o = resolveObject(o);
        }
        if (o == null) {
            return null;
        }
        var left = 0;
        var top = 0;
        var width = 0;
        var height = 0;
        var parentNode = null;
        var offsetParent = null;
        offsetParent = o.offsetParent;
        var originalObject = o;
        var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
        while (el.parentNode != null) {
            el = el.parentNode;
            if (el.offsetParent == null) {
            } else {
                var considerScroll = true;
 
                if (fixBrowserQuirks && window.opera) {
                    if (el == originalObject.parentNode || el.nodeName == "TR") {
                        considerScroll = false;
                    }
                }
                if (considerScroll) {
                    if (el.scrollTop && el.scrollTop>0) {
                        top -= el.scrollTop;
                    }
                    if (el.scrollLeft && el.scrollLeft>0) {
                        left -= el.scrollLeft;
                    }
                }
            }
            // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
            if (el == offsetParent) {
                left += o.offsetLeft;
                if (el.clientLeft && el.nodeName != "TABLE") { 
                    left += el.clientLeft;
                }
                top += o.offsetTop;
                if (el.clientTop && el.nodeName != "TABLE") {
                    top += el.clientTop;
                }
                o = el;
                if (o.offsetParent == null) {
                    if (o.offsetLeft) {
                        left += o.offsetLeft;
                    }
                    if (o.offsetTop) {
                        top += o.offsetTop;
                    }
                }
                offsetParent = o.offsetParent;
            }
        }

        if (originalObject.offsetWidth) {
            width = originalObject.offsetWidth;
        }
        if (originalObject.offsetHeight) {
            height = originalObject.offsetHeight;
        }

        return {'left':left, 'top':top, 'width':width, 'height':height};
    };

    // Retrieve the position of an object's center point
    pos.getCenter = function(o)
    {
        var c = this.get(o);
        if (c == null) {
            return null;
        }
        c.left = c.left + (c.width / 2);
        c.top = c.top + (c.height / 2);
        return c;
    };

    pos.getVH = function(o, v, h)
    {
        var c = this.get(o);
        if (c == null) {
            return null;
        }
        if (h == 'left') {
            c.left = c.left;
        }
        if (h == 'right') {
            c.left = c.left + (c.width);
        }
        if (h == 'center') {
            c.left = c.left + (c.width / 2);
        }
        if (v == 'top') {
            c.top = c.top;
        }
        if (v == 'bottom') {
            c.top = c.top + (c.height);
        }
        if (v == 'center') {
            c.top = c.top + (c.height / 2);
        }
        return c;
    };

    return pos;
})();


