Array.prototype.isArray=true;
Function.prototype.isFunction=true;

var m_MenuPrefix="m";
var m_MenuSeparator="_";
var m_MenuHideDelay=4000;
var m_MenuVisible=[];
var m_MenuHidden=[];
var m_TimerID=null;
var m_ChildOffsetX=1;
var m_ChildOffsetY=0;
var m_MenuWidth=140; //need for Opera 5

var m_TopOffsetX=0;

var m_UA=navigator.userAgent;
var m_BW_DOM=(document.getElementById) ? true : false;
var m_BW_NS4=(document.layers) ? true : false;
var m_BW_IE=(document.all) ? true : false;
var m_BW_IE4=m_BW_IE && !m_BW_DOM;
var m_BW_Mac=(navigator.appVersion.indexOf("Mac") != -1);
var m_BW_IE4M=m_BW_IE4 && m_BW_Mac;
var m_BW_Opera=(window.opera) ? true : false;
var m_BW_Opera5=(m_UA.indexOf('Opera 5')!=-1) ? true : false;
var m_LastOver=null;


Array.prototype.insert=function(item)
{
	this[this.length]=item;
}
Array.prototype.remove=function(arg) //remove items from array
{
var returnArray=[];
var found;
if(arg.isArray==true)
{
for(var j=0; j<this.length; j++)
{
for(var i=0; i<arg.length; i++)
{
found=false;
if(this[j]==arg[i])
{
found=true;
break;
}
}
if(!found) returnArray.insert(this[j]);
}
}
else
{
for(var j=0; j<this.length; j++)
{
if(this[j]!=arg)
{
returnArray.insert(this[j]);
}
}
}
return returnArray;
}
Array.prototype.in_array=function(val)
{
for(var i=0; i<this.length; i++)
{
//alert(this[i] + " == "+val);
if(String(this[i])==String(val)) return true;
}
return false;
}
Array.prototype.unique=function(argArray) //returns unique element from current and arg's array
{
//flip current array
var tmpArray=[];
var returnArray=[];
for(var i=0; i<this.length; i++)
{
returnArray.insert(this[i]);
}
//insert arg's array
for(var i=0; i<argArray.length; i++)
{
if(!returnArray.in_array(argArray[i])) returnArray.insert(argArray[i]);
}
return returnArray;
}
Array.prototype.make_copy=function()
{
var newArray=[];
for(var i=0; i<this.length; i++)
{
newArray.insert(this[i]);
}
return newArray;
}
function m_fnExtractIndex(strElementID)
{
var numPrefixLength=m_MenuPrefix.length;
if(strElementID.substr(0,numPrefixLength) != m_MenuPrefix)
{
return -1;
}
return strElementID.substr(numPrefixLength);
}
function m_fnPushInVisible(strElementID)
{
var strMenu=m_fnExtractIndex(strElementID);
if(strMenu==-1) return;
var arMenuLevels=strMenu.split(m_MenuSeparator);
var arRealIDs=[];
var numIterations=arMenuLevels.length;
for(var i=0; i<numIterations; i++)
{
		arRealIDs.insert(arMenuLevels.join(m_MenuSeparator));
		arMenuLevels.pop();
	}
	
	m_MenuVisible=arRealIDs;
}

function m_fnPushInHidden(strElementID)
{
	var strMenu=m_fnExtractIndex(strElementID);
	if(strMenu==-1) return;
	var arMenuLevels=strMenu.split(m_MenuSeparator);
	var arRealIDs=[];
	var numIterations=arMenuLevels.length;
	for(var i=0; i<numIterations; i++)
	{
		arRealIDs.insert(arMenuLevels.join(m_MenuSeparator));
		arMenuLevels.pop();
	}
	m_MenuHidden=m_MenuHidden.unique(arRealIDs);
}

function m_fnMakeVisible()
{
	var strElementID="";
	var objRef;
	for(var i=0; i<m_MenuVisible.length; i++)
	{
		strElementID=m_MenuPrefix+m_MenuVisible[i];
		if(objRef=document.getElementById(strElementID))
			objRef.style.visibility="visible";
	}
}

function m_fnMakeHidden(boolSkip)
{
	var strElementID="";
	var objRef;
	if(!m_MenuHidden.length) return;
	for(var i=0; i<m_MenuHidden.length; i++)
	{
		strElementID=m_MenuPrefix+m_MenuHidden[i];
		if(objRef=document.getElementById(strElementID))
			objRef.style.visibility="hidden";
	}
	m_MenuHidden=[];
}

function m_fnShowMenu(strElementID,objCaller)
{
	var objTmp, newX, newY;
	if(m_BW_IE)
	{
		window.event.cancelBubble=true;
	}
	
	clearTimeout(m_TimerID);
	m_fnPushInVisible(strElementID);
	m_MenuHidden=m_MenuHidden.remove(m_MenuVisible);
	//recalc menu position
	if(objTmp=document.getElementById(strElementID))
	{
		if(objCaller!=null && objTmp.style.visibility!="visible")
		{
			var wndDims=m_fnGetWindowDims();
			
			if(typeof(objCaller)=="object")
			{
				var pos=m_fnFindElementLoc(objCaller);
				
				newX=pos[0]+m_ChildOffsetX+((m_BW_Opera5) ? m_MenuWidth : objCaller.offsetWidth);
				newY=pos[1]+m_ChildOffsetY;
					
				if((objTmp.offsetWidth+newX)>wndDims[0]) newX=pos[0]-objTmp.offsetWidth-m_ChildOffsetX;
				if((objTmp.offsetHeight+newY)>wndDims[1]) newY=Math.max(0,wndDims[1]-objTmp.offsetHeight);
					
				objTmp.style.top=newY+"px";
				objTmp.style.left=newX+"px";

			}
			else
			{
				objCaller=document.getElementById(objCaller);
				var pos=m_fnFindElementLoc(objCaller);
				newX=pos[0]+m_TopOffsetX;
				if(objTmp.offsetWidth+newX>wndDims[0]) newX=wndDims[0]-objTmp.offsetWidth-m_TopOffsetX-2;
				objTmp.style.left=newX+"px";
			}
		}
	}
	
	m_fnMakeHidden();
	m_fnMakeVisible();
}


function m_fnHideMenu(strElementID)
{
	m_fnPushInHidden(strElementID);
	m_MenuHidden=m_MenuHidden.unique(m_MenuVisible);
	m_MenuVisible=m_MenuVisible.remove(m_MenuHidden);
	m_TimerID=setTimeout("m_fnMakeHidden()",m_MenuHideDelay);
}

function m_fnFindElementLoc(objRef)
{
	var x=0, y=0;
	
	obj=objRef;
	
	while(obj.offsetParent != null)
	{
		x+=obj.offsetLeft;
		y+=obj.offsetTop;
		obj=obj.offsetParent;
	}
	x+=obj.offsetLeft;
	y+=obj.offsetTop;
	
	return [x,y];
}

function m_fnDebug(str)
{
	if(str=='') return;
	var obj;
	if(obj=document.getElementById('debug'))
		obj.innerHTML+=str+"<br />";
}

function m_fnGetWindowDims()
{
	if(m_BW_IE)
	{
		return [document.body.clientWidth,document.body.clientHeight]
	}
	else
	{
		return [window.innerWidth,window.innerHeight];
	}
}

//short-hand functions
var mov=m_fnShowMenu;
var mout=m_fnHideMenu;
