/*

Supply menus as
---------------------

<script language="javascript" type="text/javascript">
	
	var info = "";
	info += "<a href='#'>Test1</a>";
	info += "<a href='#'>Test2</a>";
	info += "<a href='#'>Test3</a>";
	info += "<a href='#'>Test4</a>";
	info += "<a href='#'>Test5</a>";
	
	var m = new dropmenu('m','d1');
	var m1 = new dropmenu('m1','d2');
	
</script>
<link rel="stylesheet" href="../main.css" type="text/css" />
<br />
<div>
<a href="javascript:void(0);" onmouseover="m.dropdownmenu(this, event, document.getElementById('a').innerHTML, 1);" onmouseout="m.delayhidemenu();">test</a>
<div id='a' style="display:none;">
	<a href="#">Test 1</a>
	<a href="#">Test 2</a>
	<a href="javascript:void(0);" onmouseover="m1.dropdownmenu(this, event, info, 1);" onmouseout="m1.delayhidemenu();">Test 3</a>		
</div>
<br />

*/
function dropmenu(o_name,menu_id,offsets,disappeardelay,hidemenu_onclick){

	this.disappeardelay = (typeof disappeardelay == 'undefined') ? 250 : disappeardelay ;  	//menu disappear speed onMouseout (in miliseconds)
	this.hidemenu_onclick = (typeof disappeardelay == 'undefined') ? "yes" : hidemenu_onclick ;//hide menu when user clicks within menu?
	this.menu_id = (typeof menu_id == 'undefined') ? "dropmenudiv" : menu_id ;//hide menu when user clicks within menu?
	this.o_name = o_name;
	this.offsets = (typeof offsets != 'undefined') ? offsets : {'top':0,'left':0} ;
	
	this.ie4=document.all
	this.ns6=document.getElementById&&!document.all
	
	this.insert_container = function(_this){
		var container = '<div id="'+_this.menu_id+'" onmouseover="'+_this.o_name+'.clearhidemenu()" onmouseout="'+_this.o_name+'.dynamichide(event)"></div>';
		var div = document.createElement("div");
		div.innerHTML = container;
		document.body.appendChild(div);
	}
			
	this.getposOffset = function(what, offsettype){
		var totaloffset=(offsettype=="left") ? what.offsetLeft : what.offsetTop;
		var parentEl=what.offsetParent;
		while(parentEl!=null){
			totaloffset = (offsettype=="left") ? totaloffset + parentEl.offsetLeft : totaloffset + parentEl.offsetTop;
			parentEl = parentEl.offsetParent;
		}
		return totaloffset;
	}
	
	this.showhide = function(obj, e, visible, hidden, override_hide){
		if(this.ie4||this.ns6){ this.dropmenuobj.style.left=this.dropmenuobj.style.top="-500px"; }
		if(e.type=="click" && obj.visibility==hidden || e.type=="click" && override_hide || e.type=="mouseover" || e.type=="keypress"){
			obj.visibility=visible;
		}else if(e.type=="click"){
			obj.visibility=hidden;
		}
	}
	
	this.iecompattest = function(){
		return (document.compatMode && document.compatMode!="BackCompat") ? document.documentElement : document.body ;
	}
	
	this.clearbrowseredge = function(obj, whichedge){
		var edgeoffset=0
		if (whichedge=="rightedge"){
			var windowedge=this.ie4 && !window.opera ? this.iecompattest().scrollLeft + this.iecompattest().clientWidth - 15 : window.pageXOffset+window.innerWidth - 15
			this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetWidth;
			var offset_extra = this.offsets.left;
			if(windowedge - this.dropmenuobj.x - offset_extra < this.dropmenuobj.contentmeasure){ //is the content larger than the avilable space ? yes -> Move Left
				offset_extra = this.offsets.left * -1;
				edgeoffset=this.dropmenuobj.contentmeasure-obj.offsetWidth;
			}
		}else{
			var topedge = this.ie4 && !window.opera? this.iecompattest().scrollTop : window.pageYOffset ;
			var windowedge = this.ie4 && !window.opera? this.iecompattest().scrollTop + this.iecompattest().clientHeight - 15 : window.pageYOffset+window.innerHeight - 18 ;
			this.dropmenuobj.contentmeasure = this.dropmenuobj.offsetHeight;
			var offset_extra = this.offsets.top;
			if( windowedge - this.dropmenuobj.y - offset_extra < this.dropmenuobj.contentmeasure ){ //is the content larger than the avilable space ? yes -> move up?
				edgeoffset = this.dropmenuobj.contentmeasure + obj.offsetHeight;
				offset_extra = this.offsets.top * -1;
				if( (this.dropmenuobj.y - topedge - offset_extra) < this.dropmenuobj.contentmeasure ){ //up no good either?
					edgeoffset=this.dropmenuobj.y + obj.offsetHeight-topedge;
				}
			}
		}
		return edgeoffset - offset_extra;
	}
	
	this.populatemenu = function(what, menustyle){
		if (this.ie4||this.ns6)
		switch(menustyle){
			case 1:
				this.dropmenuobj.innerHTML="<div id='menuInner' class='wrp_1'><div class='tcap_1'></div><div id='menuInnerInner' class='bdy_1'>" + what + "<!--[if lte IE 8]><iframe src='javascript:false;'></iframe><![endif]--><div id='menuColClear'></div></div><div class='bcap_1'></div></div>"
			break;
			case 2:
				this.dropmenuobj.innerHTML="<div id='menuInner' class='wrp_2'><div class='tcap_2'></div><div id='menuInnerInner' class='bdy_2'>" + what + "<!--[if lte IE 8]><iframe src='javascript:false;'></iframe><![endif]--><div id='menuColClear'></div></div><div class='bcap_2'></div></div>"
			break;
			case 3:
				this.dropmenuobj.innerHTML="<div id='menuInner' class='wrp_3'><div class='tcap_3'></div><div id='menuInnerInner' class='bdy_3'>" + what + "<!--[if lte IE 8]><iframe src='javascript:false;'></iframe><![endif]--><div id='menuColClear'></div></div><div class='bcap_3'></div></div>"
			break;
			case 4:
				this.dropmenuobj.innerHTML="<div id='menuInner_2' class='wrp_4'><div class='tcap_4'></div><div id='menuInnerInner_2' class='bdy_4'>" + what + "<!--[if lte IE 8]><iframe src='javascript:false;'></iframe><![endif]--><div id='menuColClear'></div></div><div class='bcap_4'></div></div>"
			break;
		}
			
	}
	
	this.dropdownmenu = function(obj, e, menucontents, menustyle, override_hide, position_reference_object, offsets){	
	
		this.offsets = (typeof offsets != 'undefined') ? offsets : this.offsets ;
			
		if (window.event) event.cancelBubble = true;
		else if (e.stopPropagation) e.stopPropagation();
		
		obj = (typeof position_reference_object != 'undefined' && position_reference_object != null) ? position_reference_object : obj ; 
		
		this.clearhidemenu();
		this.dropmenuobj = document.getElementById ? document.getElementById(this.menu_id) : this.menu_id ;
		this.populatemenu(menucontents, menustyle);
		
		if (this.ie4||this.ns6){
			this.showhide(this.dropmenuobj.style, e, "visible", "hidden", override_hide)
			this.dropmenuobj.x=this.getposOffset(obj, "left")
			this.dropmenuobj.y=this.getposOffset(obj, "top")
			this.dropmenuobj.style.left = this.dropmenuobj.x-this.clearbrowseredge(obj, "rightedge")+"px"
			this.dropmenuobj.style.top = this.dropmenuobj.y-this.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px"
		}
	
		return this.clickreturnvalue()
	}
	
	this.clickreturnvalue = function(){
		if (this.ie4||this.ns6) return false
		else return true
	}
	
	this.contains_ns6 = function(a, b) {
		while (b.parentNode)
		if ((b = b.parentNode) == a)
		return true;
		return false;
	}
	
	this.dynamichide = function(e){
		if (this.ie4&&!this.dropmenuobj.contains(e.toElement))
		this.delayhidemenu()
		else if (this.ns6&&e.currentTarget!= e.relatedTarget&& !this.contains_ns6(e.currentTarget, e.relatedTarget))
		this.delayhidemenu()
	}
	
	this.hidemenu = function(_this,e){
		if(typeof _this.dropmenuobj!="undefined"){
			if(_this.ie4||_this.ns6){ _this.dropmenuobj.style.visibility="hidden"; }
		}
	}
	
	this.delayhidemenu = function(){
		if(this.ie4||this.ns6)
		var hidemenu = this.curry(this.hidemenu,this);
		this.delayhide=setTimeout(function(){ hidemenu(); },this.disappeardelay)
	}
	
	this.clearhidemenu = function(obj){
		if (typeof this.delayhide!="undefined"){ clearTimeout(this.delayhide); }
	}

	this.curry = function(method){
		var curried = [];
		for (var i = 1; i < arguments.length; i++) {
			curried.push(arguments[i]);
		}
		return function() {
			var args = [];
			for (var i = 0; i < curried.length; i++) {
				args.push(curried[i]);
			}
			for (var i = 0; i < arguments.length; i++) {
				args.push(arguments[i]);
			}
			return method.apply(null, args);
		}
	}
	
	this.add_e_handler = function(obj, e, func){
		//test if func exists - prevents problems in IE
		if(typeof func != "undefined"){		
			if(obj.attachEvent){
				obj.attachEvent('on' + e, func);
			}else if(obj.addEventListener){
				obj.addEventListener(e, func, false);
			}else{
				obj['on' + e] = func;
			}
		}
	}
	
	this.remove_e_handler = function(obj, e, func){
		//test if func exists - prevents problems in IE		
		if(typeof func != "undefined"){
			if (obj.detachEvent){
				obj.detachEvent('on' + e, func);
			}else if(obj.removeEventListener){
				obj.removeEventListener(e, func, false);
			}else{
				obj['on' + e] = null;
			}
		}
	}	
	
	this.dumpObj = function(obj, name, indent, depth){

		depth = (depth) ? depth : 10 ;
		name = (name) ? name : "unknown" ;
		indent = (indent) ? indent : " " ;
 
		var MAX_DUMP_DEPTH = 10;
		if(depth > MAX_DUMP_DEPTH){
			return indent + name + ": <Maximum Depth Reached>\n";
		}
		if (typeof obj == "object"){
			var child = null;
			var output = indent + name;
			var total = 0;
			if(obj instanceof Array){
				total = obj.length;
				output += " (Array)\n";
			}else{
				for(var item in obj){
				   total++;
				}
				output += " (Object)\n";
			}
			output += indent + "Total item: " + total + "\n";
			indent += "\t";
			if(obj instanceof Array){
				for(var i = 0; i < obj.length; i++){
				   child = obj[i];
				   output += dumpObj(child, i, indent, depth + 1);
				}
			}else{
				for(var item in obj){
				   try{
					   child = obj[item];
				   }catch(e){
					   child = "<Unable to Evaluate>";
				   }
				   if(typeof child == "object"){
					   output += this.dumpObj(child, item, indent, depth + 1);
				   }else{
					   output += indent + item + ": " + child + "\n";
				   }
				}
			}
			return output;
		}else{
			return obj + " is not an object.";
		}
	}
	
	if(this.ie4||this.ns6){
		//document.write('<div id="'+this.menu_id+'" onmouseover="'+this.o_name+'.clearhidemenu()" onmouseout="'+this.o_name+'.dynamichide(event)"></div>');
		this.insert = this.curry(this.insert_container,this);
		this.add_e_handler(window,'load',this.insert);
	}	
			
	if(this.hidemenu_onclick=="yes"){ document.onclick=this.hidemenu; }
	
}