var allLayers = new Array();
var globalZIndex = startZIndex;

function addContextMenuActions()
{
	getEl("bringToFrontBtn").innerHTML  = translate("Bring_To_Front");
	getEl("moveToBackBtn").innerHTML    = translate("Move_To_Back");
	getEl("moveForwardsBtn").innerHTML  = translate("Move_Forwards");
	getEl("sendBackwardsBtn").innerHTML = translate("Send_Backwards");
	getEl("createGroup").innerHTML = translate("Create_Group");



	getEl("bringToFrontBtn").onclick  = function(){doLayerAction("bringToFront()");}
	getEl("moveToBackBtn").onclick    = function(){doLayerAction("moveToBack()");}
	getEl("moveForwardsBtn").onclick  = function(){doLayerAction("moveForwards()");}
	getEl("sendBackwardsBtn").onclick = function(){doLayerAction("sendBackwards()");}


	getEl("doLock").onclick = function(){toggleLockEl();}
	if(document.all)
	{
		top.fixupMenuHoverIE(document);
	}
//	getEl("doGroup").onclick = function(){toggleGroupEl();}


}

function toggleContextPanel(status)
{
//	toggleGroupContextPanel(false);
	if ( !status )
	{
		document.getElementById('pluginPanel').style.display = "none";
//		if( !isPressShiftKey )
//			selectionObj.clear();
	}
	else
	{
		toggleLockContextPanel();
		//toggleGroupContextPanel();
		document.getElementById('pluginPanel').style.display = "block";
//		if ( groupObj.isGrouped(lastSelectedElement) )
//			getEl("doGroup").innerHTML = translate("LANG_Ungroup");
//		else
//			getEl("doGroup").innerHTML = translate("LANG_Group");

	}

//	document.onkeydown  = checkPressedKey;
}
function toggleLockContextPanel()
{
	var lObj = new LockStatus(lastSelectedElement);
	if (lObj.isLocked())
		getEl("doLock").innerHTML = "Unlock";
	else
		getEl("doLock").innerHTML = "Lock";

	delete lObj;
	document.getElementById('pluginPanel').style.display = "block";
}



function doLayerAction(action)
{
	rightMouseBtnClicked = true;
	getMinZIndex(editor);

	eval(action);
	toggleContextPanel();
//	toggleLockContextPanel();

	minArtZIndex = 0;
	getMaxZIndex(editor);
}








function toggleLockEl()
{
	toggleLockContextPanel();

	var lObj = new LockStatus(lastSelectedElement);
	lObj.toggleStatus();
	delete lObj;
	toggleContextPanel();
}



function bringToFront()
{
	raiseToTop(lastSelectedElement);
}
function moveToBack()
{
	raiseToBack(lastSelectedElement);
}
function moveForwards0()
{
	var allLayersObj = new layersList(editor);
	allLayersObj.sortListAsc();

	var zi = lastSelectedElement.style.zIndex;
	for(var i=0; i<allLayersObj.allLayers.length; i++)
	{
		if ( allLayersObj.getLayer(i).zindex >= zi && lastSelectedElement.id != allLayersObj.getLayer(i).id )
		{
			lastSelectedElement.style.zIndex =  allLayersObj.getLayer(i).zindex + 1;
		}
	}
	delete allLayersObj;
}

function moveForwards()
{
	var allLayersObj = new layersList(editor);
	allLayersObj.sortList("desc");

	var zi = lastSelectedElement.style.zIndex;
	if (!zi)
		zi = 0;
	processNewUpZIndex(zi,lastSelectedElement);
	delete allLayersObj;
	return;
}

function sendBackwards()
{

	var allLayersObj = new layersList(editor);
	allLayersObj.sortList();

	var zi = lastSelectedElement.style.zIndex;
	if (!zi)
		zi = 0;
	for(var i=0; i<allLayersObj.allLayers.length; i++)
	{
		if ( allLayersObj.getLayer(i).zindex < zi )
		{
			if ( (allLayersObj.getLayer(i).zindex-1) < minArtZIndexLimit)
			{
				processNewDownZIndex("", minArtZIndexLimit);
				lastSelectedElement.style.zIndex = minArtZIndexLimit;
				return;
			}
			if (allLayersObj.getLayer(i+1))
			{
				if ( (allLayersObj.getLayer(i).zindex-1) ==  allLayersObj.getLayer(i+1).zindex )
				{
					processNewDownZIndex("", (allLayersObj.getLayer(i).zindex));
					lastSelectedElement.style.zIndex =  allLayersObj.getLayer(i).zindex;
					return;
				}
			}
			lastSelectedElement.style.zIndex =  allLayersObj.getLayer(i).zindex-1;
			return;
		}
	}
	if ( (zi-1) < minArtZIndexLimit)
	{
		processNewDownZIndex("", minArtZIndexLimit);
		lastSelectedElement.style.zIndex = minArtZIndexLimit; // move behind lower el
	}
	else
		lastSelectedElement.style.zIndex = zi-1; // move behind lower el
	delete allLayersObj;
	return true;
}



function processNewUpZIndex(oldZIndex, el) // 
{
	var allLayersObj = new layersList(editor);
	
	var prevIndex = null;
	var emptyRange = false;
	for ( var i=0; i<allLayersObj.allLayers.length; i++)
        {
		if (!isNaN(allLayersObj.allLayers[i].zindex))
			prevIndex = allLayersObj.allLayers[i].zindex;
		else
			prevIndex = 0;
		if (prevIndex == 0 )
		{
			allLayersObj.allLayers[i].obj.style.zIndex =  minArtZIndexLimit +1;
			allLayersObj.allLayers[i].zindex =  minArtZIndexLimit +1;
		}

	}
	allLayersObj.sortList("desc");
	for ( var i=0; i<allLayersObj.allLayers.length; i++)
	{
		if (allLayersObj.getLayer(i).zindex <= oldZIndex)
			continue;

		if (allLayersObj.getLayer(i).zindex > oldZIndex)
		{
			el.style.zIndex = allLayersObj.getLayer(i).zindex;
			allLayersObj.getLayer(i).obj.style.zIndex = oldZIndex;
			delete allLayersObj;
			return;
		}
	}
	delete allLayersObj;
	return;
}



function processNewDownZIndex(el, newZIndex) // 
{
	var allLayersObj = new layersList(editor);

	var prevIndex = null;
	var emptyRange = false;
	for ( var i=0; i<allLayersObj.allLayers.length; i++)
        {
		if (!isNaN(allLayersObj.allLayers[i].zindex))
			prevIndex = allLayersObj.allLayers[i].zindex;
		else
			prevIndex = 0;

		
		if (prevIndex == 0 )
		{
			allLayersObj.allLayers[i].obj.style.zIndex =  minArtZIndexLimit +1;
			allLayersObj.allLayers[i].zindex =  minArtZIndexLimit +1;
		}

	}
	allLayersObj.sortList("desc");
	prevIndex = minArtZIndexLimit;
	for ( var i=0; i<allLayersObj.allLayers.length; i++)
	{
		
		if (allLayersObj.getLayer(i).zindex < newZIndex)
			continue;
//		if (allLayersObj.getLayer(i).zindex == newZIndex)
		if (allLayersObj.getLayer(i).zindex >= newZIndex)
		{
			allLayersObj.getLayer(i).obj.style.zIndex = allLayersObj.getLayer(i).zindex + 1;
		}
		if (allLayersObj.getLayer(i+1))
		{
			if (allLayersObj.getLayer(i+1).zindex > allLayersObj.getLayer(i).zindex + 1)
			{
				delete allLayersObj;
				return;
			}
		}
//		allLayersObj.getLayer(i).obj.style.zIndex = allLayersObj.getLayer(i).zindex + 1;	
	}
	delete allLayersObj;
	return newZIndex;
}

// This fucntion will propgate to be the closest element to the user in the viewport
function raiseToTop(docRef)
{
	debug("raiseToTop()", 'info');

		++maxZIndex;
		setStyle(docRef, 'zIndex', maxZIndex);
		debug("raiseToTop(): maxZIndex = " + maxZIndex, 'info');
}

// This fucntion will propgate to be the closest element to the user in the viewport
function raiseToBack(docRef)
{
	debug("raiseToBack()", 'info');

	var allLayersObj = new layersList(editor);

	if (docRef.style.zIndex == allLayersObj.getMinimum())
		return;
	


	processNewDownZIndex("", minArtZIndexLimit);
	lastSelectedElement.style.zIndex = minArtZIndexLimit; // move behind lower el
	
	delete allLayersObj;
}

// Move page menu to top
function movePageMenuToTop0(docRef)
{
	if (!docRef)
		return;
	var pmzIndex = docRef.document.getElementById(PAGE_MENU_ID).style.zIndex;
	var maxZIndex = getMaxZIndex(docRef);
	if ( pmzIndex < maxZIndex )
		docRef.document.getElementById().style.zIndex = maxZIndex + 1;
	delete pmzIndex;
	delete maxZIndex;
	return;
}
function movePageMenuToTop(docRef, gIter, cIter)
{
	debug("moveTextToForeground", 'info');

	if (!docRef)
		return;

	if (docRef.nodeType == 1 /*Node.ELEMENT_NODE*/)  // Check if n is an Element
	{
		if ( docRef.id &&  docRef.id == PAGE_MENU_ID )
		{
			var pmzIndex = docRef.style.zIndex;
			if ( pmzIndex < maxZIndex ) 
				docRef.style.zIndex = maxZIndex + 1;
			delete pmzIndex;
			return true;
		}
	}
	// Now get all children of docref	
	var children = docRef.childNodes;

	// Loop through the children and recurse the children
	for(var i = 0; i < children.length, i < 150; i++)
	{
		cIter += 1;
		if ( movePageMenuToTop(children[i], gIter, cIter))
			return true;
	}
	return false;


}
// Move all text divs (non art) to foreground

function moveTextToForeground(docRef, gIter, cIter)
{
	debug("moveTextToForeground", 'info');

	if (!docRef)
		return;

	if (docRef.nodeType == 1 /*Node.ELEMENT_NODE*/)  // Check if n is an Element
	{
		var tempZIndex = parseInt(getStyle(docRef, 'zIndex', true));


		if (!tempZIndex || isNaN(tempZIndex) ) 
			tempZIndex = 0;
		
		if ( docRef.className && ( docRef.className.indexOf('art') > -1 
			 || docRef.className.indexOf(PAGECONTENT_CLASS) > -1 
			 || docRef.className.indexOf('editable') > -1 
			 || docRef.className.indexOf('draggable') > -1)   
			 && tempZIndex < startZIndex
			)
		{
			if (tempZIndex > 0 )
			{
				var a=1;
				delete a;
			}
			else if (tempZIndex == 0 )
			{
				globalZIndex ++;
				setStyle(docRef, 'zIndex', globalZIndex );
			}
		//	return;
		}
	}
	delete tempZIndex;	
	// Now get all children of docref	
	var children = docRef.childNodes;

	// Loop through the children and recurse the children
	for(var i = 0; i < children.length, i < 150; i++)
	{
		cIter += 1;
		moveTextToForeground(children[i], gIter, cIter);
	}
}

// This function will recurse all the elements of a DOM node and find the loweres z-index
// it is used to find the highest index so we can propogate clicked on elements to the top of the document
function getMinZIndex(docRef)
{
	debug("getMinZindex()", 'info');

	var tempZIndex = minZIndex;
	var tempArtZIndex = minArtZIndex;

	if (docRef.nodeType == 1 /*Node.ELEMENT_NODE*/)  // Check if n is an Element
	{
		tempZIndex = parseInt(getStyle(docRef, 'zIndex', true));
		if (docRef.className && docRef.className.indexOf('art') > -1)
		{
			if(tempZIndex && tempZIndex < minArtZIndex)
			{
				minArtZIndex = tempZIndex;
			}
		}
		else
		{
			if(tempZIndex && tempZIndex < minZIndex)
				minZIndex = tempZIndex;
		}

	}
		
	// Now get all children of docref	
	var children = docRef.childNodes;

	// Loop through the children and recurse the children
	for(var i = 0; i < children.length - 1; i++)
		getMinZIndex(children[i]);

	debug("getMinZIndex(): minZIndex = " + minZIndex, 'info');
	debug("getMinArtZIndex(): minArtZIndex = " + minArtZIndex, 'info');
}


function sortBy_zindex_asc(a, b)
{
	var x = a.zindex;
	var y = b.zindex;
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function sortBy_zindex_ascending(a, b)
{
//	var x = a.zindex;
//	var y = b.zindex;
//	return ((x < y) ? 1 : ((x > y) ? -1 : 0));
	return (x-y) *-1;

}

function sortBy_zindex_desc(a, b)
{
	var x = a.zindex;
	var y = b.zindex;
	return ((x < y) ? 1 : ((x > y) ? -1 : 0));
}
function showContextMenu(event)
{
	if (!event) {event=window.event};
	var wind_width = document.getElementById('pluginPanel').clientWidth;
	var wind_height = document.getElementById('pluginPanel').clientHeight;
	if ( ie )
	{
		var pageX = event.clientX + document.body.scrollLeft;
		var pageY = event.clientY + document.body.scrollTop;
	}
	else
	{
		var pageX = event.pageX;
		var pageY = event.pageY;
	}
	var top =  parseInt(pageY) + 5;
	var left = parseInt(pageX)+5;

	if ((left + wind_width) > getWindowWidth()) 
	{
		left = pageX - wind_width;
		top = top + 20;
	}
	if ((top + wind_height) > getWindowHeight()) 
	{
		top = pageY - 20 - wind_height;
	}
	document.getElementById('pluginPanel').style.left = left + 'px';
	document.getElementById('pluginPanel').style.top  = top  + 'px';

	document.getElementById('groupPanel').style.left = left + 'px';
	document.getElementById('groupPanel').style.top  = top  + 'px';

}


/*  List Obj      */
function layersList(docRef)
{
	this.allLayers = new Array();
	this.docRef = docRef;
	//this.startHTMLObj = htmlObj;

//	function layersList()
//	{
//	}
	this.getLayer = function(lid)
	{
		if (this.allLayers[lid])
			return this.allLayers[lid];
		else
			return false;
	}


	this.getAllLayers = function(docRef)
	{
		if (docRef.nodeType == 1 /*Node.ELEMENT_NODE*/)  // Check if n is an Element
		{
			tempZIndex = parseInt(getStyle(docRef, 'zIndex', true));
			if (isNaN(tempZIndex) || !tempZIndex)
				tempZIndex = 0;
			var layerInfo = new Array();
		


			//if ( docRef.className && ( (mode == "art" && docRef.className.indexOf('art') > -1) 
			//	|| (  mode != "art" && docRef.className.indexOf('art') == -1 )) )
		        if ( docRef.className && 
				( docRef.className.indexOf('art') > -1 
				|| docRef.className.indexOf(PAGECONTENT_CLASS) > -1 
				|| docRef.className.indexOf('editable') > -1 
				|| docRef.className.indexOf('draggable') > -1) 
			   )
			{
				layerInfo.id = docRef.id;
				layerInfo.zindex = tempZIndex;
				layerInfo.obj = docRef;
				this.allLayers.push(layerInfo);
			}
		}
		// Now get all children of docref	
		var children = docRef.childNodes;

		// Loop through the children and recurse the children
		for(var i = 0; i < children.length - 1; i++)
		{
			this.getAllLayers(children[i]);
		}

//		debug("getMinZIndex(): minZIndex = " + minZIndex, 'info');
		return false;

	}
	this.sortList = function(ascending)
	{
		var method = ascending ? "asc" : "desc";
		this.allLayers.sort(eval("sortBy_zindex_" + method));
	}

	this.sortListAsc = function()
	{
		var newArr = this.getCopyAllLayers();
		newArr.sort(sortBy_zindex_asc);
		this.setAllLayers(newArr);
		return true;
	}
	this.setAllLayers = function(newArr)
	{
		this.allLayers.length = 0;

		for (var i=0;i<newArr.length;i++)
		this.allLayers.push(newArr[i]);
	}
	this.getCopyAllLayers = function()
	{
		var newArr = new Array();

		for (var i=0;i<this.allLayers.length;i++)
			newArr.push(this.getLayer(i));
		return newArr;
	}
	



	this.getMinimum = function()
	{
		var minimum = this.getMaximum();
		for (var i=0; i<this.allLayers.length;i++)
		{
			if (this.getLayer(i).zindex < minimum)
				minimum = this.getLayer(i).zindex;
		}
		if (minimum < minArtZIndexLimit)
			minimum = minArtZIndexLimit;
		
		return minimum;
	}

	this.getMaximum = function()
	{
		var max = -1;
		for (var i=0; i<this.allLayers.length;i++)
		{
			if (this.getLayer(i).zindex > max)
				max = this.getLayer(i).zindex;

		}
		return max;
	}


	this.getAllLayers(this.docRef);

}


/*  Lock Obj      */
function LockStatus(docRef)
{
	this.docRef = docRef;
	this.lockStatusAttr = "lock_status";
	this.locked = 0;
	this.unlocked = 1;

	this.getStatus = function()
	{
		var lSatus = this.docRef.getAttribute(this.lockStatusAttr, 0);
		if (lSatus == this.locked)
			return true;
		else
			return false;
	}
	this.isLocked = function()
	{
		if (this.getStatus())
			return true;
		else
			return false;
	}
	this.setStatus = function(status)
	{
		this.docRef.setAttribute(this.lockStatusAttr, status, 0);
	}
	this.toggleStatus = function()
	{
		if (this.getStatus())
			this.setStatus(this.unlocked);
		else
			this.setStatus(this.locked);
	}
}

