var oldWindowOnLoad = (window.onload) ? window.onload : function () { };

window.onload = function () {
	oldWindowOnLoad();
	
	dropDownMenu('dropdown_trigger', 'active_trigger', 'activated', 'deactivated');
};

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;
				secondaryClass();
			}
		}
	}
	
	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"), "");
		});
		
		primaryClass();
	}
	
	function primaryClass() {
		var s = document.getElementById('search_bar_container');
		s.className = 'primary';
	}
	
	function secondaryClass() {
		var s = document.getElementById('search_bar_container');
		s.className = 'secondary';
	}
	
	var elements = getElementsByClassName(document, triggerClass, function(element) {
		registerEvent(element, 'click', displayDropdownMenus);
		//registerEvent(element, 'mouseout', switchDropdownMenus);
	});
	
	elements = getElementsByClassName(document, hiddenMenuClass,function(element) {
		registerEvent(element, 'mouseout', hideDropdownMenus);
	});
};