/*
*   Requires: base.js
*/

/************************************************
*   Predeclare some functions to avoid errors   *
************************************************/
window.addOnload = function() {}




/************************
*   Now the real code   *
************************/
function dynLib() {
    function clearClassName(c) {
        return c.replace(/\s*(active|firstActive|lastActive|tabLogoActive|tabLogoFirstActive|tabLogoLastActive)\s*/g, ' ');
    }
    
    getCorrespondingLi = function(obj) {
        var tabs = obj.parentNode.getElementsByTagName('li');
        var temp = obj.parentNode.nextSibling;
        while (temp.nodeName != obj.parentNode.nodeName) {
            temp = temp.nextSibling;
        }
        var bats = new Array();
        for (var i=0; i<temp.childNodes.length; i++) {
            if (temp.childNodes[i].nodeName.toLowerCase() == 'li') {
                bats.push(temp.childNodes[i]);
            }
        }
        for (var i=0; i<tabs.length; i++) {
            if (tabs[i] == obj) {
                return bats[i];
            }
        }
        return null;
    }
    
    getActiveListItem = function(obj) {
        if (isSet(obj.activeItem)) { return obj.activeItem; }
        var items = obj.getElementsByTagName('li');
        var reActive = new RegExp(/\bactive\b/);
        for (var i=0; i<items.length; i++) {
            if (items[i].parentNode != obj) { continue; }
            if (reActive.test(items[i].className)) {
                obj.activeItem = items[i];
                return items[i];
            }
        }
        items[0].className += ' active firstActive';
        if (new RegExp(/\btabLogo\b/).test(items[0].className)) {
            items[0].className += ' tabLogoActive tabLogoFirstActive';
        }
        obj.activeItem = items[0];
        return items[0];
    }
    setActiveListItem = function(list, item) {
        list.activeItem = item;
    }
    
    getCorrespondingContents = function(obj) {
        if (isSet(obj.correspondingContents)) { return obj.correspondingContents; }
        var items = new Array();
        var temp  = obj.nextSibling;
        while (temp.nodeName != obj.nodeName) {
            temp = temp.nextSibling;
        }
        for (var i=0; i<temp.childNodes.length; i++) {
            if (temp.childNodes[i].nodeName.toLowerCase() == 'li') {
                items.push(temp.childNodes[i]);
            }
        }
        obj.correspondingContents = items;
        return items;
    }
    getCorrespondingContent = function(obj) {
        if (isSet(obj.correspondingContent)) { return obj.correspondingContent; }
        var items    = obj.parentNode.getElementsByTagName('li');
        var contents = getCorrespondingContents(obj.parentNode);
        var reLast   = new RegExp(/\blast\b/);
        var result   = null;
        for (var i=0; i<items.length; i++) {
            items[i].listIndex    = i;
            contents[i].listIndex = i;
            if (items[i] == obj) { result = contents[i]; }
            if (reLast.test(items[i].className))  {
                items[i].isLast    = true;
                contents[i].isLast = true;
                break;
            }
        }
        obj.correspondingContent = result;
        return result;
    }
    
    select = function(obj) {
        if (!UserAgent.knowsDom) { return true; }
        var currentItem    = getActiveListItem(obj.parentNode);
        var currentContent = getCorrespondingContent(currentItem);
        var newContent     = getCorrespondingContent(obj);
        var hasTabLogo     = new RegExp(/\btabLogo\b/).test(obj.className);
        var c = obj.className        + ' active';
        var d = newContent.className + ' active';
        if (hasTabLogo) {
            c += ' tabLogoActive';
        }
        if (obj.listIndex == 0) {
            c += ' firstActive';
            if (hasTabLogo) {
                c += ' tabLogoFirstActive';
            }
            d += ' firstActive';
        }
        if (obj.isLast) {
            c += ' lastActive';
            if (hasTabLogo) {
                c += ' tabLogoLastActive';
            }
            d += ' lastActive';
        }
        currentItem.className    = clearClassName(currentItem.className);
        currentContent.className = clearClassName(currentContent.className);
        obj.className            = c;
        newContent.className     = d;
        setActiveListItem(obj.parentNode, obj);
        obj.getElementsByTagName('a')[0].blur();
        return false;
    }
    
    searchSelect = function(obj) {
        qs(obj);
        var form = obj.parentNode.parentNode.parentNode;
        var id   = obj.parentNode.id.substring(10).toLowerCase();
        form.className = id;
        var additions  = document.getElementById('fieldsetSearchAdditional');
        var additional = document.getElementById('fieldsetSearchAdditional'+id.ucfirst());
        for (var i=0; i<additions.childNodes.length; i++) {
            var el = additions.childNodes[i];
            if (el.nodeType != 1) { continue; }
            el.className = (el == additional) ? 'active' : '';
        }
        document.forms['s'].action = obj.href;
        return false;
    }
    
    blowup = function(obj) {
        if (!document.getElementById) { return true; }
        var items = obj.parentNode.getElementsByTagName('li');
        for (var i=0; i<items.length; i++) {
            items[i].className = (items[i]==obj) ? 'active' : '';
        }
        return false;
    }
    
    
    
    EventHandler = function(obj, events) {
        this._object     = obj;
        this._events     = new Object();
        this._registered = new Array(); // See constructor below.
        
        this.registerEvent = function(eName) {
            eName = this.normalizeEventName(eName, true);
            if (!this._registered.hasValue(eName.toLowerCase())) {
                this._registered.push(eName.toLowerCase());
                this['add'+eName]     = new Function('func', "this.addEvent('"+eName+"', func)").bind(this);
                this['remove'+eName]  = new Function('func', "this.removeEvent('"+eName+"', func)").bind(this);
                this['get'+eName+'s'] = new Function('',     "this.getEvents('"+eName+"')").bind(this);
                this['run'+eName+'s'] = new Function('e',    "return this.runEvents('"+eName+"', e)").bind(this);
                this._object['add'+eName]    = this['add'+eName];
                this._object['remove'+eName] = this['remove'+eName];
                this._events[eName.toLowerCase()] = new Array();
                if (isSet(this._object[eName.toLowerCase()])) {
                    this['add'+eName](this._object[eName.toLowerCase()].bind(this._object));
                }
                this._object[eName.toLowerCase()] = this['run'+eName+'s'];
            }
        }
        
        this.normalizeEventName = function(eName, ucfirst) {
            eName = ((eName.substring(0, 2).toLowerCase() == 'on' ? '' : 'on') + eName).toLowerCase();
            return ucfirst ? eName.substring(0,1).toUpperCase()+eName.substr(1) : eName;
        }
        
        this.getEvents = function(eName) {
            eName = this.normalizeEventName(eName);
            return this._events[eName];
        }
        
        this.addEvent = function(eName, func) {
            eName = this.normalizeEventName(eName);
            this._events[eName].push(func);
        }
        
        this.removeEvent = function(eName, func) {
            eName = this.normalizeEventName(eName);
            if (this._events[eName].hasValue(func)) {
                this._events[eName].remove(func);
            }
        }
        
        this.runEvents = function(eName, e) {
            var events = this.getEvents(eName);
            var result = true;
            for (var i=0; i<events.length; i++) {
                var func = events[i];
                var temp;
                if (isFunction(func)) {
                    temp = func(e);
                } else if (isString(func)) {
                    temp = eval(func);
                }
                if (temp === false) { result = false; }
            }
            return result;
        }
        
        this.unload = function() {
            for (var r=0; r<this._registered.length; r++) {
                var name = this._registered[r];
                for (var e=0; e<this._events[name].length; e++) {
                    //this.removeEvent(this._registered[r], this._events[this._registered[r]][e]);
                    this._events[name][e] = null;
                }
                this._events[name]  = null;
                this._registered[r] = null;
                this._object[name]  = null;
                this._object.registerEvent = null;
                this._object['add'+name.ucfirst()]    = null;
                this._object['remove'+name.ucfirst()] = null;
            }
        }
        
        // Constructor:
        if (!isArray(events)) {
            events = new Array('load', 'change', 'keydown');
        }
        for (var i=0; i<events.length; i++) {
            this.registerEvent(events[i]);
        }
        this._object.registerEvent = this.registerEvent.bind(this);
        GC.add(this);
    }
    new EventHandler(window, new Array('load', 'unload'));
    
    
    
    Tooltip = function(obj) {
        this.object  = obj;
        this.tooltip = obj.getAttribute ? obj.getAttribute('title') : obj.title;
        obj.title    = '';
        this.timeout = 300;
        this.timer   = null;
        
        this.show = function(e) {
            document.addOnmousemove(this.setPosition.bindAsEventListener(this));
            this.setPosition(e);
            this.timer = window.setTimeout(function() { this.object.tooltipElement.style.display = 'block'; }.bind(this), this.timeout);
        }
        this.hide = function() {
            document.removeOnmousemove(this.setPosition.bind(this));
            if (this.timer) { window.clearTimeout(this.timer); }
            this.object.tooltipElement.style.display = 'none';
        }
        this.setPosition = function(e) {
            if (isNone(e) && isNone(window.event)) { return; }
            var x = window.event ? window.event.clientX + document.documentElement.scrollLeft : e.pageX;
            var y = window.event ? window.event.clientY + document.documentElement.scrollTop  : e.pageY;
            this.object.tooltipElement.style.left = (x+18) + 'px';
            this.object.tooltipElement.style.top  = (y+12) + 'px';
        }
        
        this.unload = function() {
            this.object.tooltipElement = null;
            this.object.tooltip        = null;
            this.object                = null;
        }
        
        var className = 'tooltip';
        var html      = this.tooltip.toHtml();
        if (html.length < 30) { className += ' littlecontent'; }
        obj.tooltipElement = newElement('div', {'class':className}, html);
        var body = document.getElementsByTagName('body')[0];
        body.insertBefore(obj.tooltipElement, body.firstChild);
        new EventHandler(obj, new Array('mouseover', 'mouseout', 'click'));
        obj.addOnmouseover(this.show.bind(this));
        obj.addOnmouseout(this.hide.bind(this));
        obj.addOnclick(this.hide.bind(this));
        GC.add(this);
    }
    new EventHandler(document, new Array('mousemove'));
    
    
    
    checkForTooltips = function(els) {
        for (var i=0; i<els.length; i++) {
            if (els[i].getAttribute('title')) {
                els[i].tooltip = new Tooltip(els[i]);
            }
        }
    }
    initTooltips = function(baseElement) {
        var els = new Array(
            'a', 'abbr', 'acronym', 'address', 'blockquote', 'button', 'caption', 'cite', 'code',
            'col', 'colgroup', 'dd', 'del', 'dfn', 'div', 'dl', 'dt', 'em', 'fieldset', 'form',
            'h1', 'h2', 'h3', 'h4', 'h5', 'h6',  'hr', 'img', 'input', 'ins', 'kbd', 'label', 'legend',
            'li', 'object', 'ol', 'optgroup', 'option', 'p', 'q', 'samp', 'select', 'span', 'strong',
            'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'ul', 'var'
        );
        for (var i=0; i<els.length; i++) {
            checkForTooltips(baseElement.getElementsByTagName(els[i]));
        }
    }
    //window.addOnload(function() { initTooltips(document); });
    
    jsLoaded('dynLib.js');
}

requires('prototype.js', dynLib);
