/*

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
	
	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.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, _this){
		
		_this = (_this) ? _this : this ;
		
		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)
		this.dropmenuobj.innerHTML="<div id='menuInner_"+menustyle+"' class='width_"+menustyle+"'><div class='tcap_"+menustyle+"'></div><div id='menuInnerInner_"+menustyle+"'>" + what + "<!--[if lte IE 9]><iframe src='javascript:false;'></iframe><![endif]--><div id='menuColClear'></div></div><div class='bcap_"+menustyle+"'></div></div>";
			
	}
	
	this.dropdownmenu = function( _this, obj, menucontents, menustyle, override_hide, position_reference_object, offsets, e){	
		
		_this = (_this) ? _this : this ;
		
		if (!e) var e = window.event;
		
		_this.offsets = (typeof offsets != 'undefined' && offsets!=null) ? 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", _this)+"px"
			_this.dropmenuobj.style.top = _this.dropmenuobj.y-_this.clearbrowseredge(obj, "bottomedge", _this)+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(_this){
		_this = (_this) ? _this : this ;
		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.hidemenu_onclick=="yes"){ document.onclick=this.hidemenu; }
	
}
