PLU = new Object();

PLU.Browser = function ()
{
    var ua = navigator.userAgent;
    var msie = ua.indexOf("MSIE") != -1;
    var gecko = ua.indexOf("Gecko") != -1 && navigator.userAgent.indexOf("like Gecko") == -1;
    var khtml = ua.indexOf("KHTML") != -1;
    var opera = ua.indexOf("Opera") != -1;
    var firefox = ua.indexOf("Firefox") != -1;
    var netscape = ua.indexOf("Netscape") != -1;
    
    var x11 = ua.indexOf("X11") != -1;
    var macos = ua.indexOf("Macintosh") != -1;
    var windows = ua.indexOf("Windows") != -1;
    var windowsNT = ua.indexOf("Windows NT") != -1;
    
    var version = 0.0;
    
    if(msie)
        var version = new Number(ua.substring(ua.indexOf("MSIE") + 5, ua.indexOf(";", ua.indexOf("MSIE") + 5)));
    else if(firefox)
        var version = new Number(ua.substring(ua.lastIndexOf("/") + 1, ua.indexOf(".", ua.lastIndexOf("/"))));
    else
        var version = navigator.appVersion;
        
    return {
        MSIE: msie,
        GECKO: gecko,
        KHTML: khtml,
        OPERA: opera,
        X11: x11,
        MACOS: macos,
        WINDOWS: windows,
        WINNT: windowsNT,
        VERSION: version
    };
}();

if(window.XMLHttpRequest)
    PLU.HttpRequest = window.XMLHttpRequest;
else if(window.ActiveXObject)
    PLU.HttpRequest = function () { return new ActiveXObject("Microsoft.XMLHTTP"); };

PLU.Event = function ()
{
    function copyEventData (evtMoz, evtIE)
    {
        if(evtMoz.target)
        {
            for(prop in evtMoz)
            {
                eval("PLU.Event." + prop + " = evtMoz." + prop);
            }
            PLU.Event.offsetX = 0;
            PLU.Event.offsetY = 0;
            PLU.Event.stopPropagation = function () { evtMoz.stopPropagation(); };
            PLU.Event.preventDefault = function () { evtMoz.preventDefault(); };
        }
        else if(evtIE.srcElement)
        {
            PLU.Event.target = evtIE.srcElement;
            PLU.Event.pageX = evtIE.clientX; // + document.body.scrollLeft + document.documentElement.scrollLeft;
            PLU.Event.pageY = evtIE.clientY; // + document.body.scrollTop + document.documentElement.scrollTop;
            
            for(prop in evtIE)
            {
                try
                {
                    eval("PLU.Event." + prop + " = evtIE." + prop);
                }
                catch(e)
                {
                }
            }
            
            PLU.Event.stopPropagation = function () { event.cancelBubble = true; };
            PLU.Event.preventDefault = function () { event.returnValue = false; };
        }
    }
    
    return {
        addListener: function (elem, evtName, handler)
        {
            if(PLU.SyntheticEvent.isRegisteredEvent(evtName))
            {
                PLU.SyntheticEvent.addListener(elem, evtName, handler);
            }
            else
            {
                if(!elem)
                    elem = window;
                    
                if(elem == window && evtName != "load" && navigator.userAgent.indexOf("MSIE") != -1)
                    elem = document;
                    
                if(elem.addEventListener)
                    elem.addEventListener(evtName, function (evt) { copyEventData(evt, window.event); handler(); }, false);
                else if(elem.attachEvent)
                    elem.attachEvent("on" + evtName, function (evt) { copyEventData(evt, window.event); handler(); });
                else
                {                
                    if(typeof(eval("elem.on" + evtName)) == "function")
                    {                    
                        existingHandler = eval("elem.on" + evtName);
                        
                        eval("elem.on" + evtName + " = function (evt) { if(evt.target) PLU.Event.target = evt.target; else if(window.event) PLU.Event.target = event.srcElement; existingHandler(); handler(); };");
                    }
                    else
                        eval("elem.on" + evtName + " = function (evt) { if(evt.target) PLU.Event.target = evt.target; else if(window.event) PLU.Event.target = event.srcElement; handler(); };");
                }                
            }
        }
    };
}();

PLU.SyntheticEvent = function ()
{
    var listeners = [];
    var registeredEvents = [];
    
    return {
        addListener: function (elem, evtName, handler)
        {
            if(this.isRegisteredEvent(evtName) && !this.isInitiated(evtName))
                this.initEvent(evtName);
                
            listeners[listeners.length] = {elem: elem, evtName: evtName, handler: handler};
        },
        
        fireEvent: function (evtName)
        {
            if(arguments.length > 1)
                elem = arguments[1];
            else
                elem = null;

            for(index = 0; index < listeners.length; index++)
            {
                if(listeners[index].evtName == evtName)
                {
                    if((!listeners[index].elem) || (listeners[index].elem && listeners[index].elem == elem))
                    {
                        PLU.Event.target = elem;
                        listeners[index].handler();
                    }
                }
            }
        },
        
        registerEvent: function (evtName, initFn)
        {
            registeredEvents[registeredEvents.length] = {evtName: evtName, initFn: initFn, initiated: initFn == null};
        },
        
        isRegisteredEvent: function (evtName)
        {
            for(var index = 0; index < registeredEvents.length; index++)
            {
                if(registeredEvents[index].evtName == evtName)
                    return true;
            }
            return false;
        },
        
        isInitiated: function (evtName)
        {
            for(var index = 0; index < registeredEvents.length; index++)
            {
                if(registeredEvents[index].evtName == evtName)
                    return registeredEvents[index].initiated;
            }
            return false;
        },
        
        initEvent: function (evtName)
        {
            for(var index = 0; index < registeredEvents.length; index++)
            {
                if(registeredEvents[index].evtName == evtName)
                {
                    if(!registeredEvents[index].initiated)
                    {
                        registeredEvents[index].initFn();
                        registeredEvents[index].initiated = true;
                    }
                }
            }
        }
    };
}();

PLU.FontResizeEvent = function ()
{
    var span = null;
    
    function init ()
    {
        if(!document.body)
        {
            setTimeout(init, 500);
            return;
        }
        
        span = document.createElement("span");
        span.style.position = "absolute";
        span.style.left = "0px";
        span.style.top = "0px";
        span.innerHTML = "&nbsp;";
        
        document.body.appendChild(span);
        
        PLU.FontResizeEvent.baseFontSize = span.offsetHeight;
        PLU.FontResizeEvent.currentFontSize = PLU.FontResizeEvent.baseFontSize;
        PLU.FontResizeEvent.fontSizeDelta = 0;
        
        setTimeout(fontSizeDetect, 500);
    }
    
    function fontSizeDetect ()
    {
        fontSize = span.offsetHeight;

        if(fontSize != PLU.FontResizeEvent.currentFontSize)
        {
            PLU.FontResizeEvent.fontSizeDelta = fontSize - PLU.FontResizeEvent.currentFontSize;
            PLU.FontResizeEvent.currentFontSize = fontSize;

            PLU.SyntheticEvent.fireEvent("fontresize");
        }
        setTimeout(fontSizeDetect, 250);           
    }
    
    PLU.SyntheticEvent.registerEvent("fontresize", init);
    
    return {
        baseFontSize: 0,
        currentFontSize: 0,
        fontSizeDelta: 0
    };
}();


PLU.Columns = function ()
{
    var allDivs;
    var colGroups;
    
    ColumnAdjustmentGroup = function (groupID)
    {
        this.groupID = groupID;
        this.divs = new Array();
        
        this.addDiv = function (div) { this.divs[this.divs.length] = div; };
    };
    
    return {
        init: function ()
        {
            allDivs = document.getElementsByTagName("div");
            colGroups = new Array();
            
            for(index = 0; index < allDivs.length; index++)
            {
                div = allDivs[index];
                
                if((offset = div.className.indexOf("col-group-")) != -1)
                {
                    remainder = div.className.substring(offset + 10, div.className.length);
                    if(remainder.indexOf(" ") != -1)
                        remainder = remainder.substring(0, remainder.indexOf(" "));
                    groupID = remainder;
                    groupIndex = -1;
                    
                    for(colIndex = 0; colIndex < colGroups.length; colIndex++)
                    {
                        if(colGroups[colIndex].groupID == groupID)
                        {
                            groupIndex = colIndex;
                            break;
                        }
                    }
                    if(groupIndex == -1)
                    {
                        groupIndex = colGroups.length;
                        colGroups[groupIndex] = new ColumnAdjustmentGroup(groupID);
                    }
                    
                    colGroups[groupIndex].addDiv(div);
                }
            }
            
            if(PLU.FontResizeEvent)
                PLU.Event.addListener(null, "fontresize", PLU.Columns.adjust);
            
            PLU.Columns.adjust();
        },
        
        adjust: function ()
        {
            for(index = 0; index < colGroups.length; index++)
            {
                maxHeight = 0;
                colGroup = colGroups[index];
                
                for(divIndex = 0; divIndex < colGroup.divs.length; divIndex++)
                {
                    colGroup.divs[divIndex].style.height = "auto";
                }
                
                for(divIndex = 0; divIndex < colGroup.divs.length; divIndex++)
                {
                    height = colGroup.divs[divIndex].offsetHeight;
        
                    if(height > maxHeight)
                        maxHeight = height;
                }
                
                for(divIndex = 0; divIndex < colGroup.divs.length; divIndex++)
                {
                    colGroup.divs[divIndex].style.height = maxHeight + "px";
                }
            }
        }
    };
}();

PLU.Event.addListener(window, "load", PLU.Columns.init);

PLU.Array = function ()
{
    return {
        indexOf: function (haystack, needle)
        {
            if(haystack.indexOf)
                return haystack.indexOf(needle);
            else
            {
                for(index = 0; index < haystack.length; index++)
                {
                    if(haystack[index] == needle)
                        return index;
                }
            }
            return -1;
        },
        
        merge: function (a1)
        {
            for(index = 1; index < arguments.length; index++)
            {
                a2 = arguments[index];
                
                for(a2_index = 0; a2_index < a2.length; a2_index++)
                {
                    a1[a1.length] = a2[a2_index];
                }
            }
            
            return a1;            
        }
    };
}();

PLU.DOM = function ()
{
    var parseSelector = function (selector)
    {
        dotIndex = selector.indexOf(".");
        hashIndex = selector.indexOf("#");
        if(dotIndex == -1)
            className = "";
        else
            className = selector.substring(dotIndex + 1);
            
        if(hashIndex == -1)
            id = "";
        else
        {
            if(dotIndex != -1)
                id = selector.substring(hashIndex + 1, dotIndex);
            else
                id = selector.substring(hashIndex + 1);
        }

        if(selector.charAt(0) != "#" && selector.charAt(0) != ".")
        {
            tagName = selector;
            if(dotIndex != -1)
                tagName = selector.substring(0, dotIndex);
            if(tagName.indexOf("#") != -1)
                tagName = tagName.substring(0, tagName.indexOf("#"));
        }
        else
            tagName = "*";
            
        return {tagName: tagName, id: id, className: className};
    };
    
    return {
        isParentOf: function (parentNode, childNode)
        {
            do
            {
                if(childNode.parentNode == parentNode)
                    return true;
            }while(childNode = childNode.parentNode);
            return false;
        },
        
        hasClass: function (elem, className)
        {
            if(!elem.getAttribute)
                return false;
  
            if(typeof(elem.getAttribute("class")) == "string")
                elemClass = elem.getAttribute("class");
            else
                elemClass = elem.className;

            var classList = elemClass.indexOf(" ") != -1 ? elemClass.split(" ") : [elemClass];
            return PLU.Array.indexOf(classList, className) != -1;
        },
        
        getElementById: function (id)
        {
            if(document.getElementById)
                return document.getElementById(id);
            else if(document.all)
                return document.all(id);
        },
        
        find: function (selector)
        {
            var baseElem;
            if(arguments.length > 1)
                baseElem = arguments[1];
            if(!baseElem)
                baseElem = document;

            var selectorParsed = parseSelector(selector);
            
            elems = baseElem.getElementsByTagName(selectorParsed.tagName);

            keep = [];
            for(var index = 0; index < elems.length; index++)
            {
                if(selectorParsed.id && elems[index].id != selectorParsed.id)
                    continue;
                if(selectorParsed.className && !this.hasClass(elems[index], selectorParsed.className))
                    continue;
                keep[keep.length] = elems[index];
            }            

            return keep;
        },
        
        findUp: function (selector, elem)
        {
            var selectorParsed = parseSelector(selector);
            var keep = [];
            do
            {
                if(selectorParsed.className && !PLU.DOM.hasClass(elem, selectorParsed.className))
                    continue;
                if(selectorParsed.id && elem.id != selectorParsed.id)
                    continue;
                if(selectorParsed.tagName != "*" && elem.nodeName.toUpperCase() != selectorParsed.tagName.toUpperCase())
                    continue;
                keep[keep.length] = elem;
            }while(elem = elem.parentNode);
            
            return keep;
        },
        
        elemOffsetX: function (elem)
        {
            var offset = 0;
            
            /*if(PLU.Browser.MSIE)
            {
                if(elem.style.position == "absolute")
                    return parseInt(elem.style.left);
                else
                    return elem.offsetLeft;
            }*/
            
            do
            {
                //alert(offset + " (" + elem + "#" + elem.id + " added " + elem.offsetLeft + ")");
                if(elem.style && elem.style.position == "absolute")
                {
                    offset += parseInt(elem.style.left);
                    return offset;
                }
                else
                {
                    if(typeof(elem.offsetLeft) == "number")
                        offset += elem.offsetLeft;
                }
            }while(elem = elem.offsetParent);
            
            return offset;
        },
        
        elemOffsetY: function (elem)
        {
            var offset = 0;
            
            /*if(PLU.Browser.MSIE)
            {
                if(elem.style.position == "absolute")
                    return parseInt(elem.style.top);
                else
                    return elem.offsetTop;
            }*/

            do
            {
                if(elem.style && elem.style.position == "absolute")
                {
                    offset += parseInt(elem.style.top);
                    return offset;
                }
                else
                {
                    if(typeof(elem.offsetTop) == "number")
                        offset += elem.offsetTop;
                }
            }while(elem = elem.offsetParent);
            
            return offset;
        }
    };
}();


PLU.Tabs = function ()
{
    var showTab = function ()
    {
        var target = PLU.Event.target;
        PLU.Event.preventDefault();
        PLU.Event.stopPropagation();
        var id = target.href.substring(target.href.indexOf("#") + 1);
        var tabDiv = PLU.DOM.getElementById(id);
        if(tabDiv.className.indexOf("current") != -1)
            return;

        var container = PLU.DOM.findUp("div.tab-content", tabDiv)[0];

        var divs = PLU.DOM.find("div.tab-data", container);
        tabDiv.className += " current";
        for(var index = 0; index < divs.length; index++)
        {
            if(divs[index].parentNode == container && divs[index] != tabDiv)
                divs[index].className = divs[index].className.replace(/current/, "");
            //else
            //    divs[index].className += " current";
        }
        
        var tabsUl = PLU.DOM.findUp("ul.plu-tabs", target)[0];
        if(!tabsUl)
            return;
            
        var lis = PLU.DOM.find("li", tabsUl);
        
        for(var index = 0; index < lis.length; index++)
        {
            if(lis[index] == target.parentNode)
                lis[index].className += " current-item";
            else
                lis[index].className = lis[index].className.replace(/current\-item/, "");
        }
    };
    
    return {
        init: function ()
        {
            var tabsUls = PLU.DOM.find("ul.plu-tabs");

            for(var index = 0; index < tabsUls.length; index++)
            {
                var ul = tabsUls[index];
                var lis = PLU.DOM.find("li", ul);
                for(var liIndex = 0; liIndex < lis.length; liIndex++)
                {
                    var a = PLU.DOM.find("a", lis[liIndex])[0];
                    
                    if(a)
                        PLU.Event.addListener(a, "click", showTab);
                }
            }
        }
    };
}();

PLU.Event.addListener(window, "load", PLU.Tabs.init);

