
var snm = function(data, config) {
	this.level = 0;
	this.config = config;
	this.data = data;
	this.strHTML="";

	this.isDefined=function(el){return (typeof(el)=="undefined"||el==null)?false:true;};
	this.build=function()
	{	
		var strHTML = "";
		strHTML += "<div><ul id=\""+this.config.prefix+"_root\" class=\""+this.config.prefix+"menu\">";		
		for(var i=0; i<this.data.length; i++)
		{
			strHTML += this.buildRow(this.data[i]);
		}
		strHTML += "</ul></div>";
		this.container.innerHTML = strHTML;
	};
	this.buildsection=function(n)
	{		
		this.data = n;
		var strHTML = "";
		strHTML += "<div>";
		strHTML += "<h4><a href=\""+this.root+this.data[2]+"\">Back to "+this.data[0]+"</a></h4>";
		strHTML += "<ul id=\""+this.config.prefix+"_root\" class=\""+this.config.prefix+"menu\">";
		strHTML += this.buildRow(this.data[this.ssindex]);		
		strHTML += "</ul></div>";
		this.container.innerHTML = strHTML;
		
		this.selectednodelevel -= 2;
	};
	this.getSubArray=function(n)
	{
		var path = n.split("/");
		if(path.length>4)
		{
			var tofind = path[0]+"/"+path[1]+"/";
			var i=2;
			var df = this.sausages(this.data, tofind);
			while(i<3)
			{
				tofind += path[i]+"/";
				df = this.sausages(df, tofind);
				i++;
			}
			this.data = (df!=null)?df:data;
			return (df!=null);
		}
		else
			return false;
		
	};
	this.getPartialDataFile=function(df, tofind)
	{
		if(df)
		{
			for(var i=0; i<df.length; i++)
			{
				if(df[i][1]==tofind)
				{
					return df[i];
				}
			}
		}
		else
			return null;
	};
	this.init=function(n)
	{
		this.root = dots;
		this.container = getElement(this.config.container);
		
		this.specialsection = (n!=null)?this.ss(n):false;
		if(this.specialsection)
			this.buildsection(this.specialsection);
		else
			this.build();
			
		if(this.isDefined(n)) this.expandToNode(n);
	};
	this.ss = function(node)
	{
		this.selectednodelevel=(node.split("/").length)-2;
		var path = node.split("/");
		if(this.selectednodelevel>=3)
		{
			var tofind = path[0]+"/"+path[1]+"/";
			var i=2;
			var df = this.getPartialDataFile(this.data, tofind);
			while(i<3 )
			{
				tofind += path[i]+"/";
				df = this.getPartialDataFile(df, tofind);
				i++;
			}
			var john = false;
			if(df)
			{
				john = this.havesection(df, node);
			}
			if(df && john) return df;
			else return false;
		}
		else return false;
	};
	this.havesection=function(arr, tofind)
	{
		for(var i=3; i<arr.length; i++)
		{
			if(tofind.match(arr[i][1]) && arr[i][3]!=null)
			{
				this.ssindex = i;
				return true;
			}
		}
		return false;
	};
	this.setPref = function(pref)
	{
		var pref = (this.isDefined(pref))?pref:false;
		this.config.prefix = (pref && pref.prefix)?pref.prefix:this.config.prefix;
		this.config.indent = (pref && pref.indent)?pref.indent:this.config.indent;
		this.config.bg = (pref && pref.bg)?pref.bg:this.config.bg;
		this.config.iconPosition = (pref && pref.iconPosition)?pref.iconPosition:this.config.iconPosition;
	};
	this.addItems=function(arr)
	{
		// this is the generic add item that's used to add an item to the SNM
		var child = 3;		
		var display = (arr[2]!=null)?"display:none;":"";
		var str = "<ul class=\"subnav\" style=\""+display+"\">";
		var img;
		do{
			str += this.buildRow(arr[child]);
			child++;
		}while(arr[child]&&arr[child]!=null)
		
		str += "</ul>";
		this.menus++;
		return str;
	};
	this.buildRow=function(arr)
	{
		var str = ""; var bg = ""; var style = ""; var url; var target;
		if(arr)
		{
			var mover=""; var mout=""; var bg_arrow = "";
			if(this.isDefined(arr[3])&& this.level<1) bg_arrow="style=\"background-image:url("+this.root+"resources/images/jumeirah/arrow_green_right.gif);background-repeat:no-repeat; background-position:176px 50%;\"";
			
			url = (arr[2].indexOf("http")!=-1)?arr[2]:this.root+arr[2];
			target = (arr[2].indexOf("http")!=-1)?"_blank":"";
			str += "<li "+((this.level==0)?"class=\"root\"":"class=\"sub\"")+" id=\""+this.config.prefix+""+arr[1]+"\" "+mover+" "+mout+"><a "+((this.level==0)?"class=\"root\"":"class=\"sub\"")+" href=\""+url+"\" "+bg_arrow+" target=\""+target+"\">"+((this.level==2)?"&nbsp;&nbsp;-&nbsp;":"")+arr[0]+"</a>";
			
			if(this.isDefined(arr[3]) && this.level<2)
			{
				this.level++;
				str += this.addItems(arr);
				this.level--;
			}
			str += "</li>";
		}
		return str;
	};
	this.getStyle = function()
	{
		var sli = this.config.style[this.level].li;
		var sa = this.config.style[this.level].a;
		var li = "";
		var a = "";
		for(key in sli)
		{
			li += key+":"+sli[key];
		}
		for(key in sa)
		{
			a += key+":"+sa[key];
		}
		return [li, a];
	};
	this.expandToNode=function(node, selItem)
	{
		var n = getElement(this.config.prefix+""+node);
		var childUL = findChild(n, "UL");el = null;
		// IF THE NODE HAS A CHILD UL THEN SHOW.
		if(childUL)
		{
			n.firstChild.style.background = "url("+this.root+"resources/images/jumeirah/arrow_white_down.gif) #A4B03D no-repeat 176px 50%";
			childUL.style.display = "";
		}
		// THIS ITERATES THROUGH ALL THE PARENT NODES EXPANDING.
		if(n!=null)
		{
			this.selectednodelevel--;
			n.firstChild.style.backgroundColor=this.config.colours[this.selectednodelevel].selected;
			n.firstChild.style.color="#FFFFFF";
			while(n.parentNode && this.selectednodelevel>=0)
			{
				if(n.parentNode.id==(this.config.prefix+"_root"))
					break;
				if(n.parentNode.tagName=="UL")
				{
					n.parentNode.style.display = "";
				}
				else if(n.parentNode.tagName == "LI")
				{
					this.selectednodelevel--;
					n.parentNode.firstChild.style.color="#FFFFFF";
					var cs = this.getColourScheme();					
					n.parentNode.firstChild.style.background = "url("+this.root+"resources/images/jumeirah/arrow_white_down.gif) "+cs.sel+" no-repeat 176px 50%";
				}				
				n = n.parentNode;
			}
		}
	};
	this.changeImage=function(el)
	{
		// this is called to change the plus and minus when you're showing and hiding a nodes children
		if(getFileName(el.src)=="arrow_right.gif")
			changeImage(el, this.ptr+dots+'resources/images/jumeirah/arrow_down.gif');
		else
			changeImage(el, this.ptr+dots+'resources/images/jumeirah/arrow_right.gif');
	};
	this.getColourScheme=function()
	{
		var cs = new Array();
		if(this.selectednodelevel<0) this.selectednodelevel=1;
		var index = (this.selectednodelevel<3)?this.selectednodelevel:2
		
		cs["bg"] = this.config.colours[index].background;
		cs["sel"] = this.config.colours[index].selected;
		
		return cs;
	};
	this.getPadding=function(cl)
	{
		// this is used to get the padding that we're going to apply to an item in the SNM
		var pt, pb, pl;
		if(cl=="root")
		{
			pt=1; pb=2;
		}
		else{
			pt=2; pb=3;
			pl = 6;
		}
		return [pt, pb, pl];
	};
	this.getUrl=function(str)
	{
		// this is used to create a URL, basically wrapping a current url in a confirm function.
		var ahref = str;
		ahref = (ahref!=null)?(ahref.indexOf("javascript:void(")==-1)?"javascript:confirmRedirect(\""+ahref+"\");":ahref:"javascript:void(0);";
		return ahref;
	};
}
var el = null;
function findChild(a, b)
{	
	for(var i=0; i<a.childNodes.length; i++)
	{
		if(a.childNodes[i].tagName==b)
		{
			if(!el)
				el = a.childNodes[i];
			return el;
		}
		if(a.childNodes[i].hasChildNodes())
			findChild(a.childNodes[i], b);
	}
	return el;
}
function findParent(e, t)
{
	var tmp = null;
	while(e.parentNode)
	{
		if(e.parentNode.tagName==t)
		{
			tmp = e.parentNode;
			break;
		}
		e = e.parentNode;	
	}
	return tmp;
}

var main = new snm(topNav,
	{
		name:"main",
		width:"150px",
		indent:"0",
		container:"navigation", 
		prefix:"main_",
		iconPosition:"left",
		colours:[
			{ selected:"#46791a", background:"#D3D3D3" },
			{ selected:"#aac97d", background:"#DADEB7" },
			{ selected:"#aac97d", background:"#DADEB7" },
			{ selected:"#aac97d", background:"#DADEB7" }
		]
	}
);
