Array.prototype.isArray=true;
Function.prototype.isFunction=true;

var GNM_MenuPrefix="GNM";
var GNM_MenuSeparator="_";
var GNM_MenuVisible=[];
var GNM_MenuHidden=[];
var GNM_HideOther=false;

var GNM_UA=navigator.userAgent;
var GNM_BW_DOM=(document.getElementById) ? true : false;
var GNM_BW_NS4=(document.layers) ? true : false;
var GNM_BW_IE=(document.all) ? true : false;
var GNM_BW_IE4=GNM_BW_IE && !GNM_BW_DOM;
var GNM_BW_Mac=(navigator.appVersion.indexOf("Mac") != -1);
var GNM_BW_IE4M=GNM_BW_IE4 && GNM_BW_Mac;
var GNM_BW_Opera=(window.opera) ? true : false;
var GNM_BW_Opera5=(GNM_UA.indexOf('Opera 5')!=-1) ? true : false;
var GNM_LastOver=null;


function GN_fnImgPreload(strImg, strImg2)
{
	this.norm=new Image();
	this.over=new Image();
	
	if(strImg2==null)
	{
		var ar=strImg.split(".");
		this.norm.src=strImg;
		this.over.src=ar[0]+"_a."+ar[1];
	}
	else
	{
		this.norm.src=strImg;
		this.over.src=strImg2;
	}
	return this;
}

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 GNM_fnExtractIndex(strElementID)
{
	var numPrefixLength=GNM_MenuPrefix.length;
	if(strElementID.substr(0,numPrefixLength) != GNM_MenuPrefix)
	{
		return -1;
	}
	
	return strElementID.substr(numPrefixLength);
}

function GNM_fnPushInVisible(strElementID)
{
	var strMenu=GNM_fnExtractIndex(strElementID);
	if(strMenu==-1) return;
	var arMenuLevels=strMenu.split(GNM_MenuSeparator);
	var arRealIDs=[];
	var numIterations=arMenuLevels.length;
	for(var i=0; i<numIterations; i++)
	{
		arRealIDs.insert(arMenuLevels.join(GNM_MenuSeparator));
		arMenuLevels.pop();
	}
	
	GNM_MenuVisible=arRealIDs;
}

function GNM_fnPushInHidden(strElementID)
{
	var strMenu=GNM_fnExtractIndex(strElementID);
	if(strMenu==-1) return;
	var arMenuLevels=strMenu.split(GNM_MenuSeparator);
	var arRealIDs=[];
	var numIterations=arMenuLevels.length;
	for(var i=0; i<numIterations; i++)
	{
		arRealIDs.insert(arMenuLevels.join(GNM_MenuSeparator));
		arMenuLevels.pop();
	}
	GNM_MenuHidden=GNM_MenuHidden.unique(arRealIDs);
}

function GNM_fnMakeVisible()
{
	var strElementID="";
	var objRef;
	var strProp="block"
	var strTemp;
	for(var i=0; i<GNM_MenuVisible.length; i++)
	{
		strElementID=GNM_MenuPrefix+GNM_MenuVisible[i];
		if(objRef=document.getElementById(strElementID))
		{
			if(!i) objRef.style.display=(objRef.style.display=="block" &&  objRef.isBlocked != true) ? "none" : "block";
			else objRef.style.display="block";
		}
		strTemp=String(GNM_MenuVisible[i]);
		if(strTemp.indexOf(GNM_MenuSeparator) == -1)
		{
			//GNOV('i'+strTemp);
			GNM_fnHiliteItem(strElementID+'-ref', 1);
		}
	}
}

function GNM_fnMakeHidden()
{
	var strElementID="";
	var objRef;
	var strTemp;
	if(!GNM_MenuHidden.length) return;
	for(var i=0; i<GNM_MenuHidden.length; i++)
	{
		strElementID=GNM_MenuPrefix+GNM_MenuHidden[i];
		if(objRef=document.getElementById(strElementID))
			if(objRef.isBlocked != true)
				objRef.style.display="none";
		strTemp=String(GNM_MenuHidden[i]);
		if(strTemp.indexOf(GNM_MenuSeparator) == -1 && objRef.isBlocked != true)
		{
			GNM_fnHiliteItem(strElementID+'-ref', 0);
			//GNOU('i'+strTemp);
		}
	}
	GNM_MenuHidden=[];
}

function GNM_fnShowMenu(strElementID)
{
	var objTmp;
	if(GNM_HideOther) GNM_MenuHidden=GNM_MenuVisible.make_copy();
	GNM_fnPushInVisible(strElementID);
	GNM_MenuHidden=GNM_MenuHidden.remove(GNM_MenuVisible);
	GNM_fnMakeHidden();
	GNM_fnMakeVisible();
	
	if(GNM_BW_DOM && (obj=document.getElementById(strElementID)))
	{
		if(true)
		{
			if(obj.style.display!="none") GNM_fnHiliteItem(strElementID+'-ref', 1);
			else if(obj.isBlocked != true) GNM_fnHiliteItem(strElementID+'-ref', 0);
		}
	}
	
	return false;
}

function GNM_fnBlockItem(strElementID)
{
	if(obj=document.getElementById(strElementID))
	{
		obj.isBlocked=true;
	}
}

function GNM_fnHiliteItem(strItemID, bState)
{
	if(GNM_BW_DOM && (obj=document.getElementById(strItemID)))
	{
		var objHref=obj.firstChild;
		var objImg=objHref.firstChild;
		if(bState)
		{
			objImg.blocked=1;
			objHref.className="selected";
		}
		else
		{
			objImg.blocked=0;
			objHref.className="";
		}
	}
}

//short-hand functions
var GNMCL=GNM_fnShowMenu;