var oldWindowOnLoad = (window.onload) ? window.onload : function () { };

window.onload = function () {
        oldWindowOnLoad();
        
        dropDownMenu('dd_trigger', 'dd_active', 'menu_display', 'menu_hidden');
};

var dropDownMenu = function(triggerClass, activeTriggerClass, menuClass, hiddenMenuClass) {
        var globalEventsTable = [];
        
        var addEvent = function() {
                function ieAddEvent(element, event, functionName) {
                        element.attachEvent('on' + event, functionName);
                }
                function w3cAddEvent(element, event, functionName) {
                        element.addEventListener(event, functionName, false);
                }
        
                if (typeof window.addEventListener !== 'undefined') {
                        return w3cAddEvent;
                }
                else if (typeof window.attachEvent !== 'undefined') {
                        return ieAddEvent;
                }
        }();
                
        function registerEvent(element, event, functionName) {
                var eventId = globalEventsTable.length+1;
                
                globalEventsTable[eventId] = new Object;
                globalEventsTable[eventId].callback = functionName;
                globalEventsTable[eventId].element = element;
                globalEventsTable[eventId].event = event;
        
                addEvent(element, event, function (e) { eventHandler(e, eventId); });
        }
        
        function eventHandler(e, eventId) {
                if (!e) {
                        var e = window.event;
                }
        
                e.actualElement = globalEventsTable[eventId].element;
                
                if (globalEventsTable[eventId].event == 'mouseout') {
                        e.relatedElement = (e.relatedTarget) ? e.relatedTarget : e.toElement;
                }
                else if (globalEventsTable[eventId].event == 'mouseover') {
                        e.relatedElement = (e.relatedTarget) ? e.relatedTarget : e.fromElement;
                }
                
                if (!e.relatedElement) {
                        e.relatedElement = new Object;
                        e.relatedElement.className = '';
                }
                
                if (e.relatedElement != e.actualElement) {
                        e.sourceElement = (window.event) ? e.srcElement : e.target;
                        if (e.sourceElement.nodeType == 3) {
                                e.sourceElement = sourceElement.parentNode;
                        }
                        e.triggeredByChild = false;
                
                        if (e.sourceElement != e.actualElement) {
                                e.triggeredByChild = isElementChildOf(e.actualElement, e.sourceElement);
                        }
                
                        e.sourceElement.className = (e.sourceElement.className) ? e.sourceElement.className : '';
                        e.relatedElement.className = (e.relatedElement.className) ? e.relatedElement.className : '';
                        e.actualElement.className = (e.actualElement.className) ? e.actualElement.className : '';
                
                        globalEventsTable[eventId].callback(e);
                        
                        e.cancelBubble = true;
                        if (e.stopPropagation) {
                                e.stopPropagation();
                        }
                }
        }
        
        function getElementsByClassName(element, className, callback) {
                var elements = [];
        
                while (element) {
                        if (element.className && element.className.lastIndexOf(className) != -1) {
                                elements.push(element);
                                callback(element);
                        }
                        if (element.hasChildNodes()) {
                                elements = elements.concat(getElementsByClassName(element.firstChild, className, callback));
                        }
                        element = element.nextSibling;
                }
                return elements;
        }
        
        function isElementChildOf(sourceElement, childElement) {
                if (sourceElement === childElement) {
                        return false;
                }
                while (childElement && childElement !== sourceElement) {
                        childElement = childElement.parentNode;
                }
                return childElement === sourceElement;
        }
        
        function checkParentForClass(sourceElement, className) {
                while (sourceElement) {
                        if (sourceElement.className && sourceElement.className.lastIndexOf(className) != -1) {
                                return true;
                        }
                        sourceElement = sourceElement.parentNode;
                }
                return false;
        }
        
        function getSiblingByClassName(element, className) {
                var elements = [];
                while (element) {
                        if (element.className && element.className.lastIndexOf(className) != -1) {
                                return element;
                        }
                        if (element.hasChildNodes()) {
                                elements.push(element.firstChild);
                        }
                        element = element.nextSibling;
                }
                for (var i = 0; i < elements.length; ++i) {
                        element = getSiblingByClassName(elements[i], className);
                        if (element.className && element.className.lastIndexOf(className) != -1) {
                                return element;
                        }
                }
                return false;
        }
        
        function switchDropdownMenus(e) {
                if (e.relatedElement.className.lastIndexOf(menuClass) == -1 
                                && !checkParentForClass(e.relatedElement, menuClass)
                                && e.relatedElement.className.lastIndexOf(activeTriggerClass) == -1) {
                        hideAllDropdownMenus();
                }
        }
        
        function hideDropdownMenus(e) {
                if ((e.relatedElement.className.lastIndexOf(menuClass) == -1
                                && !isElementChildOf(e.actualElement, e.relatedElement)
                                && !e.triggeredByChild)
                        || (!isElementChildOf(e.actualElement, e.relatedElement) && e.triggeredByChild)) {
                        hideAllDropdownMenus();
                }
        }
        
        function displayDropdownMenus(e) {
                var siblingElement = getSiblingByClassName(e.actualElement.nextSibling, hiddenMenuClass);
                if (siblingElement) {
                        siblingElement.className = siblingElement.className.replace(new RegExp(hiddenMenuClass+"\\b"), menuClass);
                        if (e.actualElement.className && e.actualElement.className.lastIndexOf(activeTriggerClass) == -1) {
                                e.actualElement.className += ' '+activeTriggerClass;
                        }
                }
               for(i=0; i < document.getElementsByTagName('select').length; i++) document.getElementsByTagName('select')[i].className = hiddenMenuClass;
                
        }
        
        function hideAllDropdownMenus() {
                var elements = getElementsByClassName(document, menuClass, function (element) {
                        element.className = element.className.replace(new RegExp(menuClass+"\\b"), hiddenMenuClass);
                });
                
                elements = getElementsByClassName(document, activeTriggerClass, function (element) {
                        element.className = element.className.replace(new RegExp(" "+activeTriggerClass+"\\b"), "");
                });
                
               for(i=0; i < document.getElementsByTagName('select').length; i++) document.getElementsByTagName('select')[i].className = menuClass;
                
        }
        
        var elements = getElementsByClassName(document, triggerClass, function(element) {
                registerEvent(element, 'mouseover', displayDropdownMenus);
                registerEvent(element, 'mouseout', switchDropdownMenus);
        });
        
        elements = getElementsByClassName(document, hiddenMenuClass,function(element) {
                registerEvent(element, 'mouseout', hideDropdownMenus);
        });
};


