/*
 * sfDelay - Suckerfish CSS menu with JS delay.
 *
 * Copyright (c) 2008 Peter Ryan (peter-ryan.co.uk)
 * This function is free for anyone to use, modify and redistribute.
 *
 * $Id: sfdelay.js 19 2008-05-19 15:33:48Z pryan $
 *
 * Modified by Ray Yates 2010-02-16 -- Added mainfoldericon and subfoldericon

 */
function obj_exists(id){
	try {
		var x = document.getElementById(id).id;
		return true;
	} catch(err) {
		return false;
	}
}

function addLoadListener(fn) {
    if (typeof window.addEventListener != "undefined"){
        window.addEventListener("load", fn, false);
    } else if (typeof document.addEventListener != "undefined") {
        document.addEventListener("load", fn, false);
    } else if (typeof window.attachEvent != "undefined") {
        window.attachEvent("onload", fn);
    } else {
        var oldfn=window.onload;
        if (typeof window.onload != "function") window.onload = fn; else window.onload = function() { oldfn(); fn();}
    }
}

var sfHover = function() {
	var ultag_id = "nav";
	var timein = 250;
	var timeout = 600;
	var cssClass = "sfhover";

	var queue = [];
	var reCSS = new RegExp("\\b" + cssClass + "\\b");
	var sfEls = document.getElementById(ultag_id).getElementsByTagName("li");


	// Flush the queue / close the menu:
	//if the document is navigated away
	window.onunload=function() { queueFlush() }

	//if the mouse moves above it
	document.getElementById("logowrapper").onmouseover = function() {
		queueFlush();
		delayMouseout();
	}

	//if a static link added to the menu is hovered over.
	document.getElementById("homelink").onmouseover = function() { queueFlush() }
	document.getElementById("helplink").onmouseover = function() { queueFlush() }


	var sfmask = document.getElementById("mousemask");
	sfmask.onmouseover = function(){
		timein? thover = setTimeout(delayMouseover,timein) : delayMouseover();
	}

	//if the document is clicked on
	document.onclick = function() {
		queueFlush();
		delayMouseout();
	}
	if(obj_exists("mainbody")) {
		document.getElementById("mainbody").onmouseover = function() {
			timeout? thover = setTimeout(delayMouseout,timeout) : delayMouseout();
		}
	} else if(obj_exists("mainbody_wide")){
		document.getElementById("mainbody_wide").onmouseover = function() {
			timeout? thover = setTimeout(delayMouseout,timeout) : delayMouseout();
		}
	} else if(obj_exists("mainbody_account")){
		document.getElementById("mainbody_account").onmouseover = function() {
			timeout? thover = setTimeout(delayMouseout,timeout) : delayMouseout();
		}
	}

	for (var i=0; i<sfEls.length; i++) {

		// mouseover and mouseout handlers for regular mouse based interface.
		sfEls[i].onmouseover = function() {
			queueFlush();
			this.className += " " + cssClass;
		}
		sfEls[i].onmouseout = function() {
			queue.push([setTimeout(queueTimeout, timeout), this]);
		}
		// focus and blur handlers for keyboard based navigation.
		sfEls[i].onfocus = function() {
			queueFlush();
			this.className += " " + cssClass;
		}
		sfEls[i].onblur = function() {
			queue.push([setTimeout(queueTimeout, timeout), this]);
		}
		// add main folder downarrows
		if(sfEls[i].parentNode.id==ultag_id) {
			sfEls[i].getElementsByTagName("a")[0].className="mainfoldericon";
		} else {
			// add subfolder left arrows
			if(sfEls[i].parentNode.parentNode.parentNode.id!=ultag_id) {
				sfEls[i].parentNode.parentNode.getElementsByTagName("a")[0].className="subfoldericon";
			}
		}

		// click event handler needed for tablet type interfaces (e.g. Apple iPhone).
		sfEls[i].onclick = function(e) {
			if (this.className.search(reCSS) == -1) {
				// CSS not set, so clear all sibling (and decendants) menus, and then set CSS on this menu...
				var elems = this.parentNode.getElementsByTagName("li");
				for (var i=0; i<elems.length; i++) {
					elems[i].className = elems[i].className.replace(reCSS, "");
				}
				this.className += " " + cssClass;
			} else {
				// CSS already set, so clear all decendant menus and then this menu...
				var elems = this.getElementsByTagName("li");
				for (var i=0; i<elems.length; i++) {
					elems[i].className = elems[i].className.replace(reCSS, "");
				}
				this.className = this.className.replace(reCSS, "");
			}
			if (e && e.stopPropagation)
				e.stopPropagation();
			else
				window.event.cancelBubble = true;
		}
	}

	var queueFlush = function () {
		while (queue.length) {
			clearTimeout(queue[0][0]);
			queueTimeout();
		}
	}
	var queueTimeout = function() {
		if (queue.length) {
			var el = queue.shift()[1];
			el.className = el.className.replace(reCSS, "");
		}
	}
	var delayMouseover = function() {
		sfmask.style.zIndex=1;
	}
	var delayMouseout = function() {
		sfmask.style.zIndex=10;
	}

}

addLoadListener(sfHover);

