// based on http://www.alistapart.com/articles/dropdowns and http://www.htmldog.com/articles/suckerfish/dropdowns/
function jsnAddEvent(target, event, func){ 
	if (target.addEventListener){ 
		target.addEventListener(event, func, false); 
		return true; 
	} else if (target.attachEvent){ 
		var result = target.attachEvent("on"+event, func); 
		return result; 
	} else { 
		return false; 
	}
}

function jsnCheckSubstring(targetString, targetSubstring, delimeter)
{
	var parts = targetString.split(delimeter);
	for (var i = 0; i < parts.length; i++){
		if (parts[i] == targetSubstring) return true;
	}
	return false;
}

function jsnGetElementsByClass(targetParent, targetTag, targetClass)
{
	if(!targetParent.getElementsByTagName) return;
	
	var elements, tags;
	
	tags = targetParent.getElementsByTagName(targetTag);
	elements = [];
	
	for(var i=0;i<tags.length;i++){
		if(jsnCheckSubstring(tags[i].className, targetClass, " ")){
			elements[elements.length] = tags[i];
		}
	}
	
	return elements;
}

function jsnDigTag(targetTag, targetName, digLevel)
{
	if(digLevel) {
		var n, d;
		n = targetTag.childNodes;
		for(var i=0;i<n.length;i++){
			d = n[i];
			if(d.tagName == targetName)
				return jsnDigTag(d, targetName, --digLevel);
		}
	}
	return targetTag;
}

function jsnWriteCookie(name,value,days)
{
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	} else expires = "";
	
	document.cookie = name+"="+value+expires+"; path=/";
}

function jsnReadCookie(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;
}


/* Menu functions */
function jsnMakeDivMenu(menuClass)
{
	var lists = jsnGetElementsByClass(document, "UL", menuClass);
	for(var i=0;i<lists.length;i++){
		var list = lists[i];
		var listItems;
		
		if(list != undefined) {
			listItems = list.getElementsByTagName("LI");
			listItems[0].style.border = "none";
		}
	}
}

function jsnMakeIconMenu(menuClass, icons)
{
	var lists = jsnGetElementsByClass(document, "UL", menuClass);
	var iconId = 0;
	
	for(var i=0;i<lists.length;i++){
		var list = lists[i];
		var listItems;
		
		if(list != undefined) {
			listItems = list.getElementsByTagName("LI");
			for(var j=0;j<listItems.length;j++){
				listItems[j].firstChild.style.backgroundImage = 'url(' + icons[iconId] + ')';
				iconId = (iconId >= icons.length-1)?1:iconId+1;
			}
		}
	}
}



/* Accessibility functions */

function jsnSetFontSize(targetId, fontSize)
{
	var targetObj = (document.getElementById) ? document.getElementById(targetId) : document.all(targetId);
	targetObj.style.fontSize = fontSize + '%';
	
	//alert (document.body.style.fontSize);
}

function MenuListElementHoverFix() {
	var _this	= this;
	
	if (typeof(Array.prototype.push) == 'undefined') {
		// IE < 5.5 does not support push/pop
		function push() {
			var j = this.length;
			for (var i = 0; i < push.arguments.length; ++i) {
				this[j] = push.arguments[i];
				j++;
			}
		}
		function pop() {
			var i = this[this.length - 1];
			this.length--;
			return i;
		}
		Array.prototype.push	= push;
		Array.prototype.pop		= pop;
	}
	
	this.className				= 'hover';	// change the class name to use here if you are not happy with it
	this.classNameSuffix		= ' ' + this.className;
	this.removeClassNameRegExp	= new RegExp("\\b ?" + this.className + "\\b");
	this.hoverElementStack		= new Array();
	
	this.onmouseover	= function() {
		if (!_this.isHover(this)) {
			if (this.getAttribute('is_hover_class_removing') != 'true') {
				this.className	+= _this.classNameSuffix;
			}
			this.setAttribute('is_hover', 'true');
		}
	}
	this.isHover	= function(element) {
		return (element.getAttribute('is_hover') == 'true');
	}
	this.checkNonHoverState	= function(element) {
		if (!_this.isHover(element)) {
			element.className	= element.className.replace(_this.removeClassNameRegExp, '');
		}
		element.removeAttribute('is_hover_class_removing');
	}
	this.checkLastNonHoverState	= function() {
		var hoverElement	= null;
		if (_this.hoverElementStack.length > 0) {
			hoverElement	= _this.hoverElementStack.pop();
		}
		for (var i = _this.hoverElementStack.length - 1; i >= 0; i--) {
			// we need to apply the "non-hover" class to the children first - else the result is mixed in the IE
			var o = _this.hoverElementStack[i];
			while (o != null) {
				o	= o.offsetParent;
				if (o == hoverElement) {
					_this.checkNonHoverState(_this.hoverElementStack[i]);
					break;
				}
			}
		}
		if (hoverElement != null) {
			_this.checkNonHoverState(hoverElement);
		}
	}
	this.onmouseout		= function() {
		// all this mess to not change the class immediately (which would cause flickering in the IE)
		this.setAttribute('is_hover', 'false');
		if (this.getAttribute('is_hover_class_removing') != 'true') {
			this.setAttribute('is_hover_class_removing', 'true');
			_this.hoverElementStack.push(this);
			window.setTimeout(_this.checkLastNonHoverState, 100);
		}
	}
	this.fixElement		= function(elementRoot) {
		for (var i=0; i < elementRoot.childNodes.length; i++) {
			var node = elementRoot.childNodes[i];
			if (node.nodeName == "LI") {
				node.onmouseover	= this.onmouseover;
				node.onmouseout		= this.onmouseout;
			}
			this.fixElement(node);
		}
	};
	
	this.fix			= function() {
		var uls, ul;
		uls	= document.getElementsByTagName("UL");
		
		for (var i=0; i< uls.length; i++) {
			ul = uls[i];
			if (ul.className != '' && ul.className.indexOf("menu")>=0) {
				this.fixElement(ul);
			}
		}
	}
}

function fixList(){
	var hoverFix;
	if (document.all && document.getElementsByTagName) {
		hoverFix = new MenuListElementHoverFix();
		hoverFix.fix();
	}
}

jsnAddEvent(window, 'load', fixList);
