/*
 * contextmenu.js	- JavaScript support routines for EPiServer
 * Copyright (c) 2003 ElektroPost Stockholm AB
*/
	

var nItemCount			= 0;
var nMenuCount			= 0;
var nOpenMenu			= null;
var aMenuItem			= new Array();
var aMenu				= new Array();
var sClearImageURL		= '/sa/graphics/misc/pixel.gif';
var htmlMenuContainer	= null;

/* 
	Public functions
	
	Name:			NewMenu()
	Description:	Initialize a new menu

	Name:			SaveMenu(sName)
	Description:	Save menu with unique name <sName>

	Name:			ShowMenu(sName)
	Description:	Call to display menu at any time

	Name:			AddMenuItem(sCaption,sURL,sJavascript,sActive,sImageURL,sDisabledImageURL)
	Description:	Add a item to menu where..
						sCaption			- Text to appear in menu (use null for separator)
						sURL				- URL to open on click (can be null)
						sJavascript			- Code to execute on click (can be null)
						sActive				- Code to evaluate to determine if item is active
						sImageURL			- URL to item image, null for empty
						sDisabledImageURL	- URL to disabled/inactive item image, null for empty

*/
function NewMenu()
{
	if(!htmlMenuContainer)
		InitializeMenu();
		
	aMenuItem = new Array();
	nItemCount=0;
}
function AddMenuItem(sCaption,sURL,sJavascript,sActive,sImageURL,sDisabledImageURL,sSubMenu)
{
	aMenuItem[nItemCount++] = new MenuItem(sCaption,sURL,sJavascript,sActive,sImageURL,sDisabledImageURL,sSubMenu);
}

function SaveMenu(sName)
{	
	aMenu[nMenuCount++] = new Menu(sName,aMenuItem,false);
}

function ShowMenu(sName)
{
	var idx = GetMenu(sName);
	var oMenu=null;
	
	if(event!=null && ((event.ctrlKey || event.srcElement.tagName=='IMG' || event.srcElement.tagName=='INPUT') || (event.srcElement.tagName.toLowerCase() =='a' && event.type.toLowerCase() != 'contextmenu')))
	{
		CloseOpenMenu();
	}
	else if(idx!=null)
	{
		oMenu = aMenu[idx];
		CloseOpenMenu();
		if(oMenu.Enabled==false)
			return;
			
		nOpenMenu = idx;
		
		if(oMenu.aMenuItem.length==0)
			return;
			
		WriteHTML(sName,oMenu.aMenuItem);
		
		oMenu.fVisible = true;
		
		htmlMenuContainer.style.leftPos	+= 10;
		htmlMenuContainer.style.posLeft	= event.clientX + document.body.scrollLeft;
		htmlMenuContainer.style.posTop	= event.clientY + document.body.scrollTop;
		
		AdjustContextPosition(htmlMenuContainer);
		htmlMenuContainer.style.display='';
		htmlMenuContainer.style.zIndex='1000000';
				
		event.cancelBubble = true;
		
		return false;
	}
	else
		alert("Cannot find menu " + sName);

}

/* Classes for menu and menuitem */

function MenuItem(sCaption,sURL,sJavascript,sActive,sImageURL,sDisabledImageURL,sSubMenu)
{
	this.sCaption			= sCaption;
	this.sURL				= sURL;
	this.sJavascript		= sJavascript;
	this.sActive			= sActive;
	this.sImageURL			= sImageURL;
	this.sDisabledImageURL	= sDisabledImageURL;
	this.sSubMenu			= sSubMenu;
}

function Menu(sName,aMenuItem,fVisible)
{	
	this.sName		= sName;
	this.aMenuItem	= aMenuItem;
	this.fVisible	= fVisible;
	this.Enabled	= true;
}

/* Only function which is generating HTML for menu */
function WriteHTML(sName,aItems)
{
	var sHTML			= '';
	var sItemName		= '';
	var sImage			= '';
	var sDisabledImage	= '';
	
	
	for(var i=0;i<aItems.length;i++)
	{
		sItemName = sName + i;
		
		if(aItems[i].sImageURL)
			sImage = aItems[i].sImageURL;
		else
			sImage = sClearImageURL;
			
		if(aItems[i].sDisabledImageURL)
			sDisabledImage = aItems[i].sDisabledImageURL
		else
			sDisabledImage = sClearImageURL;
		
		if(!aItems[i].sCaption && (i==0 || i==(aItems.length-1)))
			continue;
		else if(!aItems[i].sCaption)
			sHTML += '<nobr><span fActive="0" OnMouseDown="this.setCapture();" OnMouseUp="this.releaseCapture();" OnClick="return OpenMenuItem(' + i + ');" class="ContextMenuItem-Separator" id="' + sItemName + '"><hr width="95%"></span></nobr>';					
		else if( eval(aItems[i].sActive) )
			sHTML += '<nobr><span fActive="1" OnMouseDown="this.setCapture();" OnMouseUp="this.releaseCapture();" OnClick="return OpenMenuItem(' + i + ');" OnMouseOver="ActiveMenuItem(\'' + i + '\',\'' + sItemName + '\')" OnMouseOut="InactiveMenuItem(\'' + i + '\',\'' + sItemName + '\')" class="ContextMenuItem" id="' + sItemName + '"><img height="17" width="17" src="' + sImage + '"  align="left" valign="middle">' + aItems[i].sCaption + '</span></nobr>';
		else
			sHTML += '<nobr><span fActive="0" OnMouseDown="this.setCapture();" OnMouseUp="this.releaseCapture();" OnClick="return OpenMenuItem(' + i + ');" OnMouseOver="ActiveMenuItem(\'' + i + '\',\'' + sItemName + '\')" OnMouseOut="InactiveMenuItem(\'' + i + '\',\'' + sItemName + '\')" class="ContextMenuItem-Disabled" id="' + sItemName + '"><img height="17" width="17" src="' + sDisabledImage + '"  align="left" valign="middle">' + aItems[i].sCaption + '</span></nobr>';
	}
	
	htmlMenuContainer.innerHTML = sHTML;
	
	return true;

}

/* Handling for mouse-over action */
function ActiveMenuItem(nMenuItem,sName)
{
	var oMenu = aMenu[nOpenMenu];
	var oMenuItem = oMenu.aMenuItem[nMenuItem];

	var oSpan = document.all[sName]; 
	
	if( oSpan.fActive==1 )
	{		
		oSpan.className = 'ContextMenuItem-Active';
	}
	
	if(oMenuItem.sSubMenu!=null)
		ShowMenu(oMenuItem.sSubMenu);
}

/* Handling for mouse-out action */
function InactiveMenuItem(nMenuItem,sName)
{
	var oMenu = aMenu[nOpenMenu];
	var oMenuItem = oMenu.aMenuItem[nMenuItem];

	var oSpan = document.all[sName]; 
	
	if( oSpan.fActive==1 )
	{
		oSpan.className = 'ContextMenuItem';
	}

}

/* Handling for click action */
function OpenMenuItem(nMenuItem)
{
	var oMenu = aMenu[nOpenMenu];
	var oMenuItem = oMenu.aMenuItem[nMenuItem];

	if( eval(oMenuItem.sActive) && oMenuItem.sCaption )
	{
		CloseOpenMenu();
				
		if(oMenuItem.sJavascript)
			eval(oMenuItem.sJavascript);
		if(oMenuItem.sURL)
			window.open(oMenuItem.sURL,'_top');
	}		

	event.cancelBubble = true;
	return false;

}

/* Get menu index by name */
function GetMenu(sName)
{
	for(var i=0;i<nMenuCount;i++)
	{
		if(aMenu[i].sName==sName)
			return i;
	}
	
	return null;

}

/* Close current open menu */
function CloseOpenMenu()
{
	htmlMenuContainer.style.display = 'none';
}

/* Setup container for menu */
function InitializeMenu()
{
	htmlMenuContainer = document.createElement('<span class="ContextMenu" id="MenuContainer" style="display:none">&nbsp;</span>');
	document.body.appendChild(htmlMenuContainer);

}

function DisableMenu(sName)
{
	var idx = GetMenu(sName);
	if(idx!=null)
		aMenu[idx].Enabled=false;
}

function AdjustContextPosition( oItem )
{
	oItem.style.display	= '';

	var nBodyWidth = document.body.clientWidth + document.body.scrollLeft - 5;
	var nBodyHeight = document.body.clientHeight + document.body.scrollTop - 5;
	
	if (oItem.style.posLeft + oItem.clientWidth > nBodyWidth)
		oItem.style.posLeft = nBodyWidth - oItem.clientWidth;
	if (oItem.style.posTop + oItem.clientHeight > nBodyHeight)
		oItem.style.posTop = nBodyHeight - oItem.clientHeight;
		
	if(oItem.style.posTop<0)
		oItem.style.posTop = 0;
}