/*************************************************************
addVisibleMenu(Sender, menuID)
removeVisibleMenu(Sender, menuID)
renderMenu()
showMenuItem(menuID)
hideMenuItem(menuID)
new menu fuctions etc
***************************************************************/


var aTreeElements = new Array();
var aTreeElements2 = new Array();
var aCombinedMenuElements = new Array();
var aCombinedMenus = new Array();
var oCurrentElement
var bHideAll;


/***************************************************************
Combined Menu structure
***************************************************************/

function checkCombinedMenu(menuID){

	for(var i=0;i<aCombinedMenus.length;i++) 
	{	
		menuID = menuID.replace(aCombinedMenus[i][0],aCombinedMenus[i][1]);
	}
	return menuID;
}

function addCombinedMenu(victimID,targetID){
	aCombinedMenus[aCombinedMenus.length]=new Array (aCombinedMenuElements[victimID],aCombinedMenuElements[targetID])
}

function addCombinedMenuData(menuID,menuGUID){
	aCombinedMenuElements[menuID] = menuGUID;
}
/***************************************************************
hierchal structure
***************************************************************/
function treeElement(strId)
{
	this.childElements = new Array();
	this.id = strId;
	this.parentElement = null;
	this.top = 0;
	this.left = 0;
	this.visible = false;
	this.locked = false;
    this.depth = 1;
	aTreeElements[aTreeElements.length] = this;
}

treeElement.prototype.appendChild = function(oTreeElement)
{
	oTreeElement.parentElement = this;
	this.childElements[this.childElements.length] = oTreeElement;
    oTreeElement.depth = this.depth +1;
	return oTreeElement;
}

treeElement.prototype.show = function()
{
  var oElement=document.getElementById(this.id);
  if (oElement!=null)
  {
		oElement.style.top=this.top;
		oElement.style.left=this.left;
		oElement.style.visibility="visible";
	}
}

//sets parents of an element back to the root
treeElement.prototype.setParentDisplayStatus = function(bDisplaystatus)
{
	if(this.parentElement!=null)
	{
		this.parentElement.visible=bDisplaystatus;
		this.parentElement.setParentDisplayStatus(bDisplaystatus);
	}
}

//sets all childs of an element
treeElement.prototype.setChildsDisplayStatus = function(bDisplaystatus)
{
	for(var i=0;i<this.childElements.length;i++) 
	{
		this.childElements[i].visible=bDisplaystatus;
		this.childElements[i].setChildsDisplayStatus(bDisplaystatus);
	}
}

treeElement.prototype.hide = function()
{
  var oElement=document.getElementById(this.id);
  if (oElement!=null)
  {
		oElement.style.visibility="hidden";
	}
}

//

//fill method
function addTreeElement(strID, strParentID)
{
	var oParentElement;

	oParentElement=findTreeElement(strParentID);
	oParentElement.appendChild(new treeElement(strID));
} 

function findTreeElement(strID)
{
	strID = checkCombinedMenu(strID);

	for(var i=0;i<aTreeElements.length;i++) 
	{	
		if(aTreeElements[i].id == strID) 
		{ 
			return aTreeElements[i];
		}
	}
	return null;
}

function addVisibleMenu(sender, menuID)
{
	bHideAll=false;
	hideAllTreeElements();
	var oElement=findTreeElement(menuID);

	if (oElement!=null)
	{
		oElement.visible=true;
		oElement.setParentDisplayStatus(true);
        if(oElement.depth>2)
        {
    		oElement.top=getPosition(sender).top;
            oElement.left=getPosition(sender).right;
        }
        else
        {
    		oElement.top=getPosition(sender).bottom-10  ;
	    	oElement.left=getPosition(sender).left+15;
        }
		renderMenu();
	}
}


function removeVisibleMenu(sender, menuID)
{
	var oElement=findTreeElement(menuID);

	if (oElement!=null)
	{
		oElement.setChildsDisplayStatus(false);
		oElement.visible=false;
		initiateHide(menuID);
	}
}

function lockTreeElement(menuID)
{

	//get new object
	var oElement=findTreeElement(menuID);

	//set lock
	oElement.locked=true;
}

function unlockTreeElement(menuID)
{
	//get new object
	var oElement=findTreeElement(menuID);
	
	//set lock
	oElement.locked=false;
}

function lockParentTreeElement(menuID)
{
	//get new object
	var oElement=findTreeElement(menuID);
	
	//set lock
	if(oElement.parentElement!=null)
		oElement.parentElement.locked=true;
}

function unlockParentTreeElement(menuID)
{
	//get new object
	var oElement=findTreeElement(menuID);

	//set lock
	if(oElement.parentElement!=null)
		oElement.parentElement.locked=false;
}

function unlockAllTreeElements()
{
	for(var i=0;i<aTreeElements.length;i++) 
	{	
		aTreeElements[i].locked=false;
		aTreeElements[i].visible=false;
	}
}

function hideAllTreeElements()
{
	for(var i=0;i<aTreeElements.length;i++) 
	{	
		aTreeElements[i].visible=false;
	}
}

/***************************************************************
Render methods & Props
***************************************************************/
function renderMenu()
{
	for(var i=0;i<aTreeElements.length;i++) 
	{	
		if(aTreeElements[i].visible) 
		{ 
			aTreeElements[i].show();
		}
		else
		{
			if(!aTreeElements[i].locked)
				aTreeElements[i].hide();
		}
	}
	return null;
}

function preRenderMenu()
{
	if (bHideAll)
	{
		unlockAllTreeElements();
	}
	renderMenu();
}

function initiateHide(menuID) {
	unlockTreeElement(menuID);
	unlockParentTreeElement(menuID);
	timer = setTimeout(renderMenu, 25);
}

function initiateHideAll()
{
	bHideAll=true;
  timer = setTimeout(preRenderMenu, 25);
}
