/*************************************************************\*                                                             **                       PUPIUS.CO.UK MENU                     **                                                             ** THIS SCRIPT IS MESSY!!!  But it works, it breaks down the   ** list and builds a nice dynamic menu for it.  Note if JS is  ** is disabled CSS should handle it quite gracefully.          **                                                             ** creator:     Daniel Pupius <http://pupius.co.uk/contact/>   ** date:        April 2004  (release version, 02/02/2005)      ** version:     1.2                                            ** rights:      copyright(c)2004 Dan Pupius www.pupius.co.uk   **                                                             ** You are free to use the scripts for non-commercial projects,** as long as you leave these copyright statements intact.      **                                                             *\*************************************************************/var MENU_TOP_OFFSET = 68;	// this needs to be hard coded as I was being a bit lazy when I wrote the script.var Site = {	menuitems:	new Array(),	tracer:		null,	active:		0,	selected:	-1,	tracerAnim:	null,	timer:		null,	setup:		function() {				if(!document.getElementsByTagName || !document.createElement || !document.appendChild) return false;				//grab list, hide it and create a list object from it				var navbar = document.getElementById("nav");				var list = navbar.getElementsByTagName("ul")[0];				list.style.display = "none";				var menu = new ListObject(list);				//create the tracer element which will show the current menu item				this.tracer = document.createElement("div");				this.tracer.className = "menutracer";				navbar.appendChild(this.tracer);				this.menuitems[-1] = null;				//process first level menu items				for(var i=0;i<menu.items.length;i++) {										//create a new element for this item					var item = document.createElement("div");					item.className = "menuitem";					item.index = i;					item.href = menu.items[i].href;					item.appendChild(document.createTextNode(menu.items[i].caption));					if(menu.items[i].className=="selected") this.selected=i; 					//append item to navbar					navbar.appendChild(item);					//create events					Toolkit.Events.addListener(item,"onmouseover",function() { if(Site.timer) window.clearTimeout(Site.timer); Site.setActive(this.index); Site.show_menu(this.index); window.status = this.href; },item);					Toolkit.Events.addListener(item,"onmouseout",function() {if(!this.menuholder) Site.setActive(Site.selected); else Site.timer = setTimeout("Site.setActive(Site.selected); Site.show_menu(-1)",750); window.status = ""; },item);					Toolkit.Events.addListener(item,"onclick",function() { location.href = this.href; },item);					//if this item has sub-items, render them now					if(menu.items[i].subList) {						var sub = document.createElement("div");						sub.className = "menuback";						sub.index = i;						item.className = "menuitem x";						item.menuholder = sub;												Toolkit.Events.addListener(sub,"onmouseover",function() { if(Site.timer) window.clearTimeout(Site.timer); Site.setActive(this.index);  },sub);						Toolkit.Events.addListener(sub,"onmouseout",function() { Site.timer = setTimeout("Site.setActive(Site.selected); Site.show_menu(-1)",750); },sub);												//add the content to the menu (using a table)						var table = document.createElement("table");						var tb = document.createElement("tbody");						var tr = document.createElement("tr");						table.appendChild(tb);						tb.appendChild(tr);						sub.appendChild(table);						document.getElementById("canvas").appendChild(sub);												//create columns for each level (max of 5) ** ultra-messy bit **						var level1 = document.createElement("td");						level1.id = "td_" + i + "_1";level1.className="td1";						tr.appendChild(level1);						var level2 = document.createElement("td");						level2.id = "td_" + i + "_2";level2.className="td2";						tr.appendChild(level2);						var level3 = document.createElement("td");						level3.id = "td_" + i + "_3";level3.className="td3";						tr.appendChild(level3);						var level4= document.createElement("td");						level4.id = "td_" + i + "_4";level4.className="td4";						tr.appendChild(level4);						var level5 = document.createElement("td");						level5.id = "td_" + i + "_5";level5.className="td5";						tr.appendChild(level5);						//add level one items and recurse on other levels						for(var k=0;k<menu.items[i].subList.items.length;k++) {							var d = document.createElement("a");							d.href = menu.items[i].subList.items[k].href;														var caption = menu.items[i].subList.items[k].caption							if(menu.items[i].subList.items[k].className=="selected") caption = "--> " + caption;							d.appendChild(document.createTextNode(caption));							level1.appendChild(d);														if(menu.items[i].subList.items[k].subList) {								d.className = "menulink sub";								d.menu = i;								d.level = 2;								d.index = menu.items[i].subList.items[k].caption;								Toolkit.Events.addListener(d,"onmouseover",function() { Site.show_sub_menu(this.menu,this.level,this.index); this.className = "menulink sub active";  },d);													Site.recurseMenus(menu.items[i].subList.items[k].subList,i,2,menu.items[i].subList.items[k].caption);							} else {								d.className = "menulink";								d.menu = i;								d.level = 2;								d.index = "";								Toolkit.Events.addListener(d,"onmouseover",function() { Site.show_sub_menu(this.menu,this.level,this.index); },d);							}						}					} else item.menuholder = null;					//keep track of this item					this.menuitems.push(item);				}				Toolkit.Events.addListener(document,"onclick",function() { if(Site.timer) window.clearTimeout(Site.timer); Site.setActive(Site.selected); Site.show_menu(-1); },item);				//position primary elements				var cursor = 0;				for(i=0;i<this.menuitems.length;i++) { // (i already defined reuse it for this loop)					this.menuitems[i].style.marginLeft = cursor + "px";					cursor += this.menuitems[i].offsetWidth;					if(this.menuitems[i].menuholder) {						this.menuitems[i].menuholder.style.left = (navbar.offsetLeft + this.menuitems[i].offsetLeft - 1) + "px";						this.menuitems[i].menuholder.style.top = MENU_TOP_OFFSET + "px";					}				}				Site.tracer.style.marginLeft = "0px";  				Site.tracer.style.width = "1px";       				//set the active menu item;				Site.setActive(Site.selected);				Site.show_menu(-1);				return true;			},	recurseMenus:	function(list,menu,level,parent) {				for(var k=0;k<list.items.length;k++) {					var d = document.createElement("a");					d.href = list.items[k].href;					d.parent = parent;										var caption = list.items[k].caption;					if(list.items[k].className=="selected") caption = "--> " + caption;					d.appendChild(document.createTextNode(caption));					document.getElementById("td_"+menu+"_"+level).appendChild(d);										if(list.items[k].subList) {						d.className = "menulink sub";						Site.recurseMenus(list.items[k].subList,menu,level+1,list.items[k].caption);						d.menu = menu;						d.level = level+1;						d.index = list.items[k].caption;						Toolkit.Events.addListener(d,"onmouseover",function() { Site.show_sub_menu(this.menu,this.level,this.index); this.className = "menulink sub active"; },d);										} else {						d.className = "menulink";						d.menu = menu;						d.level = level+1;						d.index = "";						Toolkit.Events.addListener(d,"onmouseover",function() { Site.show_sub_menu(this.menu,this.level,this.index); },d);					}				}			},	show_menu:	function(n) {				for(var i=0;i<Site.menuitems.length;i++) {					if(i==n && Site.menuitems[i].menuholder) Site.menuitems[i].menuholder.style.visibility = "visible";					else if(Site.menuitems[i].menuholder) Site.menuitems[i].menuholder.style.visibility = "hidden";				}				Site.show_sub_menu(n,2,"");			},	//note this is super messy as no references are used, this is to try	//and help avoid memory leaks in IE	show_sub_menu:	function(menu,level,index) {				if(Site.menuitems[menu] && Site.menuitems[menu].menuholder) {					if(index != "") {						if(typeof document.all != "undefined" ) document.getElementById("td_"+menu+"_"+level).style.display = "inline";						else document.getElementById("td_"+menu+"_"+level).style.display = "table-cell";											for(var x=0;x<document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a").length;x++) {							if(document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a")[x].parent==index) document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a")[x].style.display = "block";							else document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a")[x].style.display = "none";							if(document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a")[x].className=="menulink sub active") {								document.getElementById("td_"+menu+"_"+level).getElementsByTagName("a")[x].className="menulink sub";							}						}					} else document.getElementById("td_"+menu+"_"+level).style.display = "none";				}				for(var j=level+1;j<=5;j++) if(document.getElementById("td_"+menu+"_"+j)) document.getElementById("td_"+menu+"_"+j).style.display = "none";				if(document.getElementById("td_"+menu+"_"+(level-1))) {					for(var y=0;y<document.getElementById("td_"+menu+"_"+(level-1)).getElementsByTagName("a").length;y++) {						if(document.getElementById("td_"+menu+"_"+(level-1)).getElementsByTagName("a")[y].className=="menulink sub active") {							document.getElementById("td_"+menu+"_"+(level-1)).getElementsByTagName("a")[y].className="menulink sub";						}						}				}			},	setActive:	function(n) {				this.active = n;				//if an anmation is already running, stop it				if(Site.tracerAnim != null) Site.tracerAnim.stop();				//calculate start position				var startX = parseInt(Site.tracer.style.marginLeft);				var startW = Site.tracer.offsetWidth;				//calculate end position				var endX = -2;				var endW = 1;				if(n!=-1) {					endX = parseInt(Site.menuitems[n].style.marginLeft);					endW = Site.menuitems[n].offsetWidth;				}				//create 2D line for the movement (not in xy space but xw :)				var line = new Toolkit.Drawing.Curves.Line([startX,startW],[endX,endW]);				//create animation object				Site.tracerAnim = new Toolkit.Drawing.Animation(line,500,0.999);				Toolkit.Events.addListener(Site.tracerAnim,"onanimate",Site.drawTracer);				Toolkit.Events.addListener(Site.tracerAnim,"onend",Site.stopTracer);				//start animation				Site.tracerAnim.start();			},	drawTracer:	function(animobj) {				var x = Math.round(animobj.coordinates[0]);				var w =  Math.round(animobj.coordinates[1]);								if(!isNaN(x)) Site.tracer.style.marginLeft = x + "px";				if(!isNaN(w)) Site.tracer.style.width = w + "px";			},	stopTracer:	function(){				Site.tracerAnim = null;			}}Toolkit.Events.addListener(window,"onload",function() {Site.setup();});//onload = function() { Site.setup(); }function openPopup(url,w,h) {	var x = (screen.width / 2) - (w / 2);	var y = (screen.height / 2) - (2* h / 3);	var NewWindow = window.open(url, "_blank", "status=0,scrollbars=1,resizable=0,toolbar=0,menubar=0,width="+w+",height="+h+",left="+x+",top="+y);	if(NewWindow) return false;	else return true;}