
function cssdropdownC() 
{
	this.disappeardelay = 250; // Delay in milli-seconds onmouseout to remove menu
	this.dropdownindicator = '';
	this.enableswipe = 1; //enable swipe effect? 1 for yes, 0 for no
	this.enableiframeshim = 1; //enable "iframe shim" in IE5.5/IE6? (1=yes, 0=no)
	
	this.dropmenuobj = null;
	this.asscmenuitem = null;
	this.domsupport = document.all || document.getElementById;
	this.standardbody = null;
	this.iframeshimadded = false;
	this.swipetimer = undefined;
	this.bottomclip = 0;
	
	// functions
	this.setDownImage = setDownImage;
	this.getposOffset = getposOffset;
	this.swipeeffect = swipeeffect;
	this.css = css;
	this.showhide = showhide;
	this.clearbrowseredge = clearbrowseredge;
	this.dropit = dropit;
	this.positionshim = positionshim;
	this.hideshim = hideshim;
	this.isContained = isContained;
	this.dynamichide = dynamichide;
	this.delayhidemenu = delayhidemenu;
	this.hidemenu = hidemenu;
	this.clearhidemenu = clearhidemenu;
	this.addEvent = addEvent; 
	this.start = start;
	
	function setDownImage(downImage)
	{	// Rix
		this.dropdownindicator = '<img src="' + downImage + '" border="0" />';
	}
	
	function getposOffset(what, offsettype)
	{
		var totaloffset = 0;
		var elementObj = what;
		
		do
		{
			totaloffset = (offsettype == "left") ? totaloffset + elementObj.offsetLeft : totaloffset + elementObj.offsetTop;
			//elementObj = elementObj.offsetParent;
			elementObj = elementObj.parent; // Rix
		}
		while (elementObj != null)
		
		return totaloffset;
	}
	
	function swipeeffect()
	{
		if (this.bottomclip < parseInt(this.dropmenuobj.offsetHeight))
		{
			this.bottomclip += 10 + (this.bottomclip / 10); //unclip drop down menu visibility gradually
			this.dropmenuobj.style.clip = "rect(0 auto " + this.bottomclip + "px 0)";
		}
		else
		{
			return;
		}
		
		this.swipetimer = setTimeout("cssdropdown.swipeeffect()", 10);
	}
	
	function css(el, targetclass, action)
	{
		var needle = new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "ig");
		
		if (action == "check")
			return needle.test(el.className);
		else if (action == "remove")
			el.className = el.className.replace(needle, "");
		else if (action == "add" && !needle.test(el.className))
			el.className += " " + targetclass;
	}
	
	function showhide(obj, e)
	{
		this.dropmenuobj.style.left = this.dropmenuobj.style.top = "-500px";
		
		if (this.enableswipe == 1)
		{
			if (typeof this.swipetimer != "undefined")
				clearTimeout(this.swipetimer);
			
			obj.clip = "rect(0 auto 0 0)"; //hide menu via clipping
			this.bottomclip = 0;
			this.swipeeffect();
		}
		
		obj.visibility = "visible";
		this.css(this.asscmenuitem, "selected", "add");
	}
	
	function clearbrowseredge(obj, whichedge)
	{
		var edgeoffset = 0;
		
		if (whichedge == "rightedge")
		{
			var windowedge = document.all && 
				!window.opera ? this.standardbody.scrollLeft + this.standardbody.clientWidth - 15 : 
				window.pageXOffset+window.innerWidth - 15;
				
			this.dropmenuobj.contentmeasure = this.dropmenuobj.offsetWidth;
			
			if (windowedge - this.dropmenuobj.x < this.dropmenuobj.contentmeasure)  //move menu to the left?
				edgeoffset = this.dropmenuobj.contentmeasure - obj.offsetWidth;
		}
		else
		{
			var topedge = document.all && !window.opera ? this.standardbody.scrollTop : window.pageYOffset;
			var windowedge = document.all && !window.opera ? this.standardbody.scrollTop + this.standardbody.clientHeight - 15 :
				window.pageYOffset + window.innerHeight - 18;
			this.dropmenuobj.contentmeasure = this.dropmenuobj.offsetHeight;
			
			if (windowedge-this.dropmenuobj.y < this.dropmenuobj.contentmeasure)
			{ //move up?
				edgeoffset = this.dropmenuobj.contentmeasure + obj.offsetHeight;
				
				if ((this.dropmenuobj.y - topedge) < this.dropmenuobj.contentmeasure) //up no good either?
					edgeoffset = this.dropmenuobj.y + obj.offsetHeight - topedge;
			}
		}
		
		return edgeoffset;
	}
	
	function dropit(obj, e, dropmenuID)
	{
		if (this.dropmenuobj != null) //hide previous menu
			this.hidemenu(); //hide menu
		
		this.clearhidemenu();
		this.dropmenuobj = document.getElementById(dropmenuID); //reference drop down menu
		this.asscmenuitem = obj; //reference associated menu item
		this.showhide(this.dropmenuobj.style, e);
		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 + 1 + "px";
		this.positionshim(); //call iframe shim function
	}
	
	function positionshim()
	{ //display iframe shim function
		if (this.enableiframeshim && typeof this.shimobject != "undefined")
		{
			if (this.dropmenuobj.style.visibility == "visible")
			{
				this.shimobject.style.width = this.dropmenuobj.offsetWidth + "px";
				this.shimobject.style.height = this.dropmenuobj.offsetHeight + "px";
				this.shimobject.style.left = this.dropmenuobj.style.left;
				this.shimobject.style.top = this.dropmenuobj.style.top;
			}
			
			this.shimobject.style.display = (this.dropmenuobj.style.visibility == "visible") ? "block" : "none";
		}
	}
	
	function hideshim()
	{
		if (this.enableiframeshim && typeof this.shimobject != "undefined")
			this.shimobject.style.display = 'none';
	}
	
	function isContained(m, e)
	{
		var e = window.event || e;
		var c = e.relatedTarget || ((e.type == "mouseover") ? e.fromElement : e.toElement);
		
		while (c && c != m)
			try 
			{
				c = c.parentNode;
			}
			catch(e)
			{
				c = m;
			}
			
			if (c == m)
				return true;
			else
				return false;
	}
	
	function dynamichide(m, e)
	{
		if (!this.isContained(m, e))
		{
			this.delayhidemenu();
		}
	}
	
	function delayhidemenu()
	{
		this.delayhide = setTimeout("cssdropdown.hidemenu()", this.disappeardelay); //hide menu
	}
	
	function hidemenu()
	{
		this.css(this.asscmenuitem, "selected", "remove");
		this.dropmenuobj.style.visibility = 'hidden';
		this.dropmenuobj.style.left = this.dropmenuobj.style.top = 0;
		this.hideshim();
	}
	
	function clearhidemenu()
	{
		if (this.delayhide != "undefined")
			clearTimeout(this.delayhide);
	}
	
	function addEvent(target, functionref, tasktype)
	{
		if (target.addEventListener)
			target.addEventListener(tasktype, functionref, false);
		else if (target.attachEvent)
			target.attachEvent('on' + tasktype, function(){return functionref.call(target, window.event)});
	}
	
	function start()
	{
		if (!this.domsupport)
			return;
		
		this.standardbody = (document.compatMode == "CSS1Compat") ? document.documentElement : document.body;
		
		for (var ids = 0; ids < arguments.length; ids++)
		{
			var menuitems = document.getElementById(arguments[ids]).getElementsByTagName("a");
			
			for (var i = 0; i < menuitems.length; i++)
			{
				if (menuitems[i].getAttribute("rel"))
				{
					var relvalue = menuitems[i].getAttribute("rel");
					var asscdropdownmenu = document.getElementById(relvalue);
					this.addEvent(asscdropdownmenu, function(){cssdropdown.clearhidemenu()}, "mouseover");
					this.addEvent(asscdropdownmenu, function(e){cssdropdown.dynamichide(this, e)}, "mouseout");
					this.addEvent(asscdropdownmenu, function(){cssdropdown.delayhidemenu()}, "click");
					try
					{
						menuitems[i].innerHTML=menuitems[i].innerHTML + " " + this.dropdownindicator;
					}
					catch(e)
					{
					}
					
					this.addEvent(menuitems[i], function(e)
						{ //show drop down menu when main menu items are mouse over-ed
							if (!cssdropdown.isContained(this, e))
							{
								var evtobj=window.event || e;
								cssdropdown.dropit(this, evtobj, this.getAttribute("rel"));
							}
						}, "mouseover");
					
					this.addEvent(menuitems[i], function(e){cssdropdown.dynamichide(this, e)}, "mouseout"); //hide drop down menu when main menu items are mouse out
					this.addEvent(menuitems[i], function(){cssdropdown.delayhidemenu()}, "click"); //hide drop down menu when main menu items are clicked on
				}
			} //end inner for
		} //end outer for
		
		if (window.createPopup && !window.XmlHttpRequest && !this.iframeshimadded)
		{ //if IE5.5 to IE6, create iframe for iframe shim technique
			document.write('<IFRAME id="iframeshim"  src="" style="display: none; left: 0; top: 0; z-index: 90; position: absolute; filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)" frameBorder="0" scrolling="no"></IFRAME>');
			this.shimobject = document.getElementById("iframeshim"); //reference iframe object
			this.iframeshimadded = true;
		}
	}
}
