// Written by Ahmad Azarinurazie (aien@pixl8.co.uk).
// Created on October 17th. 2008

// rel for use: initonload,samestate,differentstate

// This make sure that even if the file is loaded many times, it still works.
if (typeof(aSwitcher) == 'undefined') {
	
	aSwitcher = new Array();
	aSwitcherStatus = new Array();
	
	initSwitcher = function() {
		var obj = null;
		var aSwitcher = new Array();
		
		// Loop through all arguments
		for (i=0; i<arguments.length; i++) {
			if (arguments[i] && document.getElementById(arguments[i])) {
				obj = document.getElementById(arguments[i]);
				
				if (obj) {
					if (obj.nodeName == "UL" || obj.nodeName == "OL") {
						for (var i=0; i<obj.childNodes.length; i++)
							if (obj.childNodes[i].nodeName == "LI")
								for (var j=0; j<obj.childNodes[i].childNodes.length; j++)
									if (obj.childNodes[i].childNodes[j].nodeName == "A") {
										obj.childNodes[i].childNodes[j].onclick = switchGroup;
										
										sCommand = getValue(obj.childNodes[i].childNodes[j].rel, "initonload:");
										if (sCommand == "true") {
											// This is written for google map as google map cannot use display = none when rendering, so hide it using absolute position
											if (obj.childNodes[i].childNodes[j].className.indexOf("selected") == -1) {
											
												obj_target = getValue(obj.childNodes[i].childNodes[j].href, "#");
												obj_target = document.getElementById(obj_target);
												
												if (obj_target.id == "map") {
													obj_target.style.position = "absolute";
													obj_target.style.top = "-9999px";
												}
												else {
													aSwitcher.push(obj.childNodes[i].childNodes[j]);
													aSwitcherStatus.push("hide");
												}
											}
											else {
												aSwitcher.push(obj.childNodes[i].childNodes[j]);
												aSwitcherStatus.push("show");
											}
										}
									}
					}
					else if (obj.nodeName == "DL") {
						for (var i=0; i<obj.childNodes.length; i++)
							if (obj.childNodes[i].nodeName == "DT")
								for (var j=0; j<obj.childNodes[i].childNodes.length; j++)
									if (obj.childNodes[i].childNodes[j].nodeName == "A") {
										obj.childNodes[i].childNodes[j].onclick = switchSingle;
										
										sCommand = getValue(obj.childNodes[i].childNodes[j].rel, "initonload:");
										if (sCommand == "true") {
											// Init the target show/hide onLoad using the switcher state
											aSwitcher.push(obj.childNodes[i].childNodes[j]);
											
											if (obj.childNodes[i].childNodes[j].className.indexOf("selected") == -1) aSwitcherStatus.push("hide");
											else aSwitcherStatus.push("show");
										}
									}
					}
					else if (obj.nodeName == "A") {
						obj.onclick = switchSingle;
						
						sCommand = getValue(obj.rel, "initonload:");
						if (sCommand == "true") {
							// Init the target show/hide onLoad using the switcher state
							aSwitcher.push(obj);
							
							if (obj.className.indexOf("selected") == -1) aSwitcherStatus.push("hide");
							else aSwitcherStatus.push("show");
						}
					}
				}
			}
		}
		
		if (typeof(addEvent) == 'undefined') {
			addEvent = function(obj, type, fn) {
				if (obj.addEventListener) obj.addEventListener( type, fn, false );
				else if (obj.attachEvent) {
					obj["e"+type+fn] = fn;
					obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
					obj.attachEvent( "on"+type, obj[type+fn] );
				}
			}
		}
		
		addEvent(window, "load", function() { if (aSwitcher) for (var i=0;i<aSwitcher.length; i++) switchClass(aSwitcher[i], aSwitcherStatus[i]); aSwitcher=null; });
	}
	
	// This is written for HDWE frontpage
	initSwitcher2 = function() {
		var obj = null;
		var obj_selected = null;
		var sCookieValue = "";
		
		// Loop through all arguments
		for (i=0; i<arguments.length; i++) {
			if (arguments[i] && document.getElementById(arguments[i])) {
				obj = document.getElementById(arguments[i]);
				
				if (obj) {
					initSwitchFirstSibling(obj);
					obj.onclick = switchSingle;
					switchClass(obj, "hide");
				}
			}
		}
	}
	
	// This function will find the next sibling and assign the target to the href of the switcher
	initSwitchFirstSibling = function(obj) {
		var oNextSibling;
		
		// Get next sibling
		if (obj.nextSibling) oNextSibling = obj.nextSibling;
		else oNextSibling = obj.parentNode.nextSibling;
		while (oNextSibling.nodeName == "#text") oNextSibling = oNextSibling.nextSibling;
		
		// Assign random id to the target
		if (!oNextSibling.id) oNextSibling.id = "switcher-target-" + Math.floor(Math.random()*101);
		
		// Assign target id to switcher
		obj.href = "#" + oNextSibling.id;
	}
	
	getValue = function(str, var_name) {
		var value = null;
		var iPos;
		
		if (!str) return null;
		
		iPos = str.indexOf(var_name);
		
		if (iPos > -1) {
			iPos += var_name.length;
			
			value = str.substr(iPos);
			
			iPos = value.indexOf(";");
			if (iPos > -1) value = value.substr(0, iPos);
		}
		
		return value;
	}
	
	switchSingle = function(obj) {
		var aTarget;
		var oTarget;
		var sCommand;
		var i;
		
		if (!obj || !obj.href) obj = this;
		
		switchClass(obj);
		
		sCommand = getValue(obj.rel, "samestate:");
		if (sCommand) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) {
				oTarget = document.getElementById(aTarget[i]);
				
				if (oTarget) {
					if (obj.className.indexOf("selected") == -1) switchClass(oTarget, "hide");
					else switchClass(oTarget, "show");
				}
			}
		}
		
		sCommand = getValue(obj.rel, "differentstate:");
		if (sCommand) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) {
				oTarget = document.getElementById(aTarget[i]);
				
				if (oTarget) {
					if (obj.className.indexOf("selected") == -1) switchClass(oTarget, "show");
					else switchClass(oTarget, "hide");
				}
			}
		}
		
		sCommand = getValue(obj.rel, "onafterselected:");
		if (sCommand && obj.className.indexOf("selected") > -1) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) {
			
				eval(aTarget[i]);
			}
		}
		
		sCommand = getValue(obj.rel, "onafternotselected:");
		if (sCommand && obj.className.indexOf("selected") == -1) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) {
			
				eval(aTarget[i]);
			}
		}
		
		return false;
	}
	
	switchClass = function(obj, state) {
		var obj_target;
		var sCommand;
		
		if (!obj || !obj.href) obj = document.getElementById(obj);
		
		obj_target = getValue(obj.href, "#");
		obj_target = document.getElementById(obj_target);
		
		if (!obj_target) return false; 
		
		// Change text from switchtext1 and switchtext2
		sCommand = getValue(obj.rel, "switchtext1:");
		if (sCommand) {
			sCommand = getValue(obj.rel, "switchtext2:");
			if (sCommand) {
				if (obj.innerHTML == sTarget) obj.innerHTML = sTarget2;
				else obj.innerHTML = sTarget;
			}
		}
		
		// state value is supplied
		if (state) {
			if (state == "hide") {
				obj.className = obj.className.replace(/selected/g, "");
				obj_target.className = obj_target.className + " hide";
			}
			else if (state == "show") {
				obj.className = obj.className + " selected";
				obj_target.className = obj_target.className.replace(/hide/g, "");
			}
		}
		// else just switch the class
		else {
			if (obj.className.indexOf("selected") == -1) {
				obj.className = obj.className + " selected";
				obj_target.className = obj_target.className.replace(/hide/g, "");
			}
			else {
				obj.className = obj.className.replace(/selected/g, "");
				obj_target.className = obj_target.className + " hide";
			}
		}
	}
	
	switchGroup = function(obj) {
		var obj;
		var obj_target;
		var obj_list;
		
		if (!obj || !obj.href) obj = this;
		
		obj_list = obj.parentNode.parentNode;
		
		if (obj.className.indexOf("selected") == -1) {
			switchClass(obj, "show");
		}
		else {
			switchClass(obj, "hide");
		}
		
		obj_target = getValue(obj.href, "#");
		obj_target = document.getElementById(obj_target);
		
		// For google map usage
		if (obj_target.id == "map") {
			obj_target.style.top = "0";
			obj_target.style.position = "relative";
		}
		
		sCommand = getValue(obj.rel, "onafterselected:");
		if (sCommand && obj.className.indexOf("selected") > -1) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) eval(aTarget[i]);
		}
		
		sCommand = getValue(obj.rel, "onafternotselected:");
		if (sCommand && obj.className.indexOf("selected") == -1) {
			aTarget = sCommand.split(",");
			for (i=0; i<aTarget.length; i++) eval(aTarget[i]);
		}
		
		if (obj_list.nodeName == "UL" || obj_list.nodeName == "OL") {
			for (i=0; i<obj_list.childNodes.length; i++) {
				if (obj_list.childNodes[i].nodeName == "LI") {
					for (j=0; j<obj_list.childNodes[i].childNodes.length; j++) {
						if (obj_list.childNodes[i].childNodes[j].nodeName == "A" && obj_list.childNodes[i].childNodes[j] != this) 
							switchClass(obj_list.childNodes[i].childNodes[j], "hide");
					}
				}
			}
		}
		
		return false;
	}
}