window.onload = mladdevents;
function mladdevents()
{
	if(window.mlrunShim == true)
	{
		var Iframe = document.createElement("iframe");
		Iframe.setAttribute( "src" , "about:blank" );
		Iframe.setAttribute( "scrolling" , "no" );
		Iframe.setAttribute( "frameBorder" , "0");
		Iframe.style.zIndex = "2";
		Iframe.style.filter = 'alpha(opacity=0)';
	}
	
	var effects_a = new Array();
	var divs = document.getElementsByTagName('div');
	
	for( var j=0 ; j < divs.length ; j++ )
	{
		if(divs[j].className.indexOf('mlmenu') != -1)
		{
			var lis = divs[j].getElementsByTagName('li');
			for( var i = 0 ; i < lis.length ; i++ )
			{
				lis[i].onmouseover = mlover;
				lis[i].onmouseout = mloutSetTimeout;
				if( window.mlrunShim == true )
				{
					lis[i].appendChild( Iframe.cloneNode(false) );
				}
				
				if( lis[i].getElementsByTagName('ul').length > 0 )
				{
					lis[i].className += 'haschild';
					if( divs[j].className.indexOf('arrow') != -1 )
					{
						if( divs[j].className.indexOf('vertical') != -1 || lis[i].parentNode.parentNode.nodeName != 'DIV' )
						{
							lis[i].getElementsByTagName('a')[0].innerHTML += '<span class="vert">&rarr;</span>';
						}
						else
						{
							lis[i].getElementsByTagName('a')[0].innerHTML += '<span class="horiz">&darr;</span>';
						}
					}
					else if( divs[j].className.indexOf('plus') != -1 )
					{
						lis[i].getElementsByTagName('a')[0].innerHTML += '<span class="plus">+</span>';
					}
				}
				else
				{
					if( divs[j].className.indexOf('arrow') != -1 )
					{
						//This accounts for a wierd IE-specific bug in horizontal menus. CSS will set visibility: hidden;. This keeps the menu level(in IE)
						lis[i].getElementsByTagName('a')[0].innerHTML += '<span class="noshow">&darr;</span>';
					}
				}
				
				var uls = lis[i].getElementsByTagName('ul');
				
				for( var k = 0 ; k < uls.length ; k++ )
				{
					var found = 'no';
					
					for( var z=0 ; z < effects_a.length ; z++ )
					{
						if( effects_a[z] == uls[k] )
						{
							found = 'yes';
						}
					}
					
					if( found == 'no' )
					{
						effects_a[effects_a.length] = uls[k];
						uls[k].style.zIndex = '100';
						mlEffectLoad( uls[k] );
					}
				}
			}
		}
	}
}

function mloutSetTimeout(e)
{
	if(!e)
	{
		var the_e = window.event;
	}
	else
	{
		var the_e = e;
	}
	
	var reltg = ( the_e.relatedTarget ) ? the_e.relatedTarget : the_e.toElement;
	if(reltg)
	{
		var under = ancestor(reltg,this);

		if( under === false && reltg != this )
		{
			window.mlLast = this;
			var parent = this.parentNode;
			while(parent.parentNode && parent.className.indexOf('mlmenu') == -1)
			{
				parent = parent.parentNode;
			}
			
			if(parent.className.indexOf('delay') != -1)
			{
				window.mlTimeout = setTimeout(function(){mlout()},500);
			}
			else
			{
				mlout();
			}
		}
	}
}

function mlout()
{
	if(window.mlLast==null)
		return false;
	var uls = window.mlLast.getElementsByTagName('ul');
	var sib;
	for( var i=0 ; i < uls.length ; i++ )
	{
		mlEffectOut(uls[i]);
		window.mlLast.className = 'haschild hide';
		if(window.mlrunShim == true)
		{
			sib = uls[i];							
			while(sib.nextSibling && sib.nodeName != 'IFRAME')
			{
				sib = sib.nextSibling
			}
			
			sib.style.display = 'none';
		}
	}
	
	window.lastover = null;
}

function mlover(e)
{
	if(!e)
	{
		var the_e = window.event;
	}
	else
	{
		var the_e = e;
	}
	
	the_e.cancelBubble = true;
	
	if(the_e.stopPropagation)
	{
		the_e.stopPropagation();
	}
	
	clearTimeout(window.mlTimeout);
	
	if(window.mlLast && window.mlLast != this && ancestor(this,window.mlLast) == false)
	{
		mlout();
	}
	else{
		window.mlLast = null;
	}
	
	var reltg = (the_e.relatedTarget) ? the_e.relatedTarget : the_e.fromElement;
	var ob = this.getElementsByTagName('ul');
	var under = ancestor(reltg,this);
	if(ob[0] && under == false)
	{
		if(window.lastover != ob[0])
		{
			if(window.mlrunShim == true)
			{
				var sib = ob[0];
				while(sib.nextSibling && sib.nodeName != 'IFRAME')
				{
					sib = sib.nextSibling
				}
				ob[0].style.display = 'block';
				sib.style.top = ob[0].offsetTop+'px';
				sib.style.left = ob[0].offsetLeft-2+'px';
				sib.style.width = ob[0].offsetWidth+'px';
				sib.style.height = ob[0].offsetHeight-2+'px';
				sib.style.border = '1px solid red';
				sib.style.display = 'block';
			}
			
			this.className = 'haschild';
			mlEffectOver(ob[0],this);
			window.lastover = ob[0];
		}
	}
}

function mlSetOpacity(ob,level)
{
	if(ob)
	{
		//level is between 0 and 10
		//need to convert to decimal for standard
		var standard = level/10;
		//need to convert to 0-100 scale for IE filter
		var ie = level*10;
		ob.style.opacity = standard;
		ob.style.filter = "alpha(opacity="+ie+")"
	}
}

function mlIncreaseOpacity(ob)
{
	var current = ob.style.opacity;
	if(lastob == ob && lastop == current)
	{
		//mlout has not interfered
		current = current *10;
		var upone = current +1;
		mlSetOpacity(ob,upone);
		lastob = ob;
		lastop = upone/10;
	}
}

function mlIncreaseHeight(ob)
{
	var current = parseInt(ob.style.height);
	var newh = current + 1;
	ob.style.height = newh+'px';
}

function mlIncreaseWidth(ob)
{
	var current = parseInt(ob.style.width);
	var newh = current + 1;
	ob.style.width = newh+'px';
}

function mlBlink(ob)
{
	var newb = '1px solid red';
	var old = '';
	if(ob.style.border==old)
	{
		ob.style.border=newb;
	}
	else
	{
		ob.style.border=old;
		ob.style.borderTop = '1px solid';
	}
}

function mlShake(ob)
{
	var newp = '5px';
	var old = '';
	if(ob.style.paddingLeft==old)
	{
		ob.style.paddingLeft=newp;
	}
	else
	{
		ob.style.paddingLeft=old;
	}
}

function mlEffectOver(ob,parent)
{
	switch(ob.className)
	{
		case 'fade':
			ob.style.display = 'block';
			if(ob.style.opacity == 0)
			{
				lastob = ob
				lastop = 0;
				for(var i = 1;i<=10;i++)
				{
					setTimeout(function(){mlIncreaseOpacity(ob)},i*50);
				}
				
				setTimeout(function(){ob.style.filter = ''},500);
			}
			break;
			
		case 'blink':
			ob.style.display = 'block';
			for(var i = 0 ; i < 10 ; i++ )
			{
				setTimeout(function(){mlBlink(ob)},i*50);
			}			
			break;
			
		case 'shake':
			ob.style.display = 'block';
			for(var i=0;i<10;i++)
			{
				setTimeout(function(){mlShake(ob)},i*50);
			}
			break;
			
		case 'blindv':
			ob.style.display = 'block';
			if(ob.offsetHeight)
			{
				var height = ob.offsetHeight
				ob.style.height = '0px';
				ob.style.overflow = 'hidden';
				for(var i=0;i<height;i++)
				{
					setTimeout( function(){mlIncreaseHeight(ob)} , i*3 );
				}
				setTimeout(function(){ob.style.overflow='visible';},height*3)
			}
			break;
			
		case 'blindh':
			ob.style.display = 'block';
			if(ob.offsetWidth)
			{
				var width = ob.offsetWidth;
				ob.style.width = '0px';
				ob.style.overflow = 'hidden';
				for(var i=0;i<width;i++)
				{
					setTimeout(function(){mlIncreaseWidth(ob)},i*3);
				}
				setTimeout(function(){ob.style.overflow='visible';},width*3)
			}
			break;
			
		default:
			ob.style.display = 'block';
			break;
	}
}

function mlEffectOut(ob)
{
	switch(ob.className)
	{
		case 'fade':
			mlSetOpacity(ob,0);
			ob.style.display = 'none';
			break;
			
		case 'blink':
			ob.style.border = '';
			ob.style.display = 'none';
			break;
			
		case 'shake':
			ob.style.paddingLeft = '';
			ob.style.display = 'none';
			break;
			
		default:
			ob.style.display = 'none';
			break;
	}
}

function mlEffectLoad(ob)
{
	var parent = ob.parentNode;
	while(parent.parentNode && parent.className.indexOf('mlmenu') == -1)
	{
		parent = parent.parentNode;
	}
	
	if(parent.className.indexOf('fade') != -1)
	{
			ob.style.display = 'none';
			ob.className = 'fade';
			mlSetOpacity(ob,0);
	}
	else if(parent.className.indexOf('blink') != -1)
	{
		ob.className = 'blink';
		ob.style.display = 'none';
	}
	else if(parent.className.indexOf('shake') != -1)
	{
		ob.className = 'shake';
		ob.style.display = 'none';
	}
	else if(parent.className.indexOf('blindv') != -1)
	{
		ob.className = 'blindv';
		ob.style.display = 'none';
	}
	else if(parent.className.indexOf('blindh') != -1)
	{
		ob.className = 'blindh';
		ob.style.display = 'none';
	}
	else
	{
		ob.className = 'none';
		ob.style.display = 'none';
	}
}

function ancestor(child, parent)
{
	if(child==null)
		return false;//Saves checking elsewhere
	//This is a fix for a Firefox bug *gasp*
	//Aparantly causes a bug in Opera!
	//I see no choice but a browser detect. *sigh* I didn't want to have to do this.
	if(navigator.userAgent.indexOf('Gecko') != -1 && navigator.userAgent.indexOf('Opera') == -1)
	{
		//This should only be run by Gecko based browsers. this code should be fine in everything but Opera so forge away browsers.
		var allc = parent.getElementsByTagName('*');
		for(var i = 0;i < allc.length ; i++ )
		{
			if(allc[i] == child)
			{
				return true;
			}
		}
	}
	else
	{
		//http://www.dynamicdrive.com/forums/showthread.php?t=12341 Thanks Twey!
		for( ; child.parentNode ; child = child.parentNode)
		{
			if(child.parentNode === parent) 
				return true;
		}
	}
	return false;
}



<!--20090331 Jackal
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->

