/*
	Iownies administrator drag n' drop script
	By Chris Johnson
*/

//Configuration options

//Height of the handle for dragging boxes.
var dragBoxHeight=20;

//Width of the handles for resizing boxes.
var sizeBoxWidth=20;

//Width of the handles for resizing columns
var sizeColWidth=25;

var isIEnow=false;


//Array of containers.
var Containers=new Array();

//Place to save container dimensions
var containerDimensions=new Array();

//Array of boxes
var Boxes=new Array();
var boxDimensions=new Array();

//Array of cursor divs
var cursorDivs=new Array();

//The object we are currently dragging.
var dragging=null;
var shadow=null;
var shadowChild=null;
var rootSibling=null;
var rootParent=null;

//What we are trying to add
var adding=null;
var addboxid=-1;

//The object we are currently resizing.
var sizing=null;
var divsizing=null;
var divsizing2=null;
var sizeSide="";

//Current mouse position
var mousePos;

//The offset of the mouse from the moved object's position  
var mouseOffset;

//The position of the mouse when the object started being modified.
var mouseStartPos;

//Edit mode switch
var infoboxEditMode=false;
var divEditMode=false;
var downallowed=true;


/*
	Container management functions
*/

function getId(obj)
{
	return obj.id.replace(/(box_)|(div_)/,"");
}

function getMyContainer(obj)
{
	return containerMap[getId(obj)];
}

function addContainer(obj)
{
	Containers.push(obj);
}

function setBoxParent(box,parent)
{
	//containerMap[getId(box)]=parent;
	Boxes.push(box);
}

function duplicateBox(id)
{
	addhelper=document.createElement("div");
	var boxid=ajaxRequestData("dupebox "+id);
	var boxcode=ajaxRequestData("getboxcode "+boxid);
	addhelper.innerHTML=boxcode;
	var box=document.getElementById("box_"+id);
	var before=box.nextSibling;
	var nbox=addhelper.lastChild;
	addhelper.removeChild(nbox);
	if(before!=null)
	{
		box.parentNode.insertBefore(nbox,before);
	}
	else
	{
		box.parentNode.appendChild(nbox);
	}
	
	makeModifiable(nbox);
	
	Boxes.push(nbox);
	
	clearMode();
	boxMode();
	
}

function makeModifiable(obj)
{
	
	//if(navigator.appName!="Microsoft Internet Explorer")
	if(true)
	{
		var height=obj.offsetHeight;
		obj.innerHTML+="<div style='position:absolute; display:none; z-index: 1; left:0px; top:0px; height:100%; width:"+sizeBoxWidth+"px; cursor:w-resize; border-top: 1px dotted #000000;  background-color:transparent;'><br/></div>";
		obj.innerHTML+="<div style='position:absolute; display:none; z-index: 1; right:0px; top:0px; height:100%; width:"+sizeBoxWidth+"px; cursor:e-resize; border-top: 1px dotted #000000;   background-color:transparent;'><br/></div>";
		obj.innerHTML+="<div style='position:absolute; display:none; z-index: 4; left:0px; top:0px; width:100%; height:"+dragBoxHeight+"px; cursor:move; background-color:#FFFFFF; border-color:#000000; border-style:solid; border-width: thin;'></div>";
	}
	else
	{
		var add=document.createElement("<div style='position:absolute; display:none; z-index: 1; left:0px; top:0px; min-height:100%; width:"+sizeBoxWidth+"px; cursor:w-resize; background-color:transparent;'><br/></div>");
		obj.appendChild(add);
		add=document.createElement("<div style='position:absolute; display:none; z-index: 1; right:0px; top:0px; min-height:100%; width:"+sizeBoxWidth+"px; cursor:e-resize; background-color:transparent;'><br/></div>");
		obj.appendChild(add);
		add=document.createElement("<div style='position:absolute; display:none; z-index: 2; left:0px; top:0px; min-width:100%; height:"+dragBoxHeight+"px; cursor:move; background-color:transparent;'></div>");
		obj.appendChild(add);
	}
	
	var addme=new Array();
	addme.push(obj.lastChild);
	addme.push(obj.lastChild.previousSibling);
	addme.push(obj.lastChild.previousSibling.previousSibling);
	
	addme[0].innerHTML+="<b>Tools:</b>&nbsp;";
	addme[0].innerHTML+=makeCloseButton(obj);
	addme[0].innerHTML+=makeFillColButton(obj);
	addme[0].innerHTML+=makeLeftButton(obj);
	addme[0].innerHTML+=makeCenterButton(obj);
	addme[0].innerHTML+=makeRightButton(obj);
	addme[0].innerHTML+=makeEditButton(obj.id.substr(4));
	addme[0].innerHTML+=makeDupeButton(obj.id.substr(4));
	addme[0].innerHTML+=makeAdminButton(obj.id.substr(4));
	
	
	
	var e=document.createElement("div");
	//e.innerHTML="&nbsp;";
	e.style.position="static";
	e.style.paddingBottom="20px";
	e.style.display="none";
	if(infoboxEditMode)
		e.style.display="block";
	
	obj.insertBefore(e,obj.firstChild);
	
	for(i in addme)
	{
		addme[i].setAttribute("curs",addme[i].style.cursor);
		if(!infoboxEditMode)
		{
			addme[i].style.cursor="default";
		}
	}
	
	cursorDivs=cursorDivs.concat(addme);
	
}

function refreshArrays()
{
	var newBoxes=new Array();
	for(b in Boxes)
	{
		var box=Boxes[b];
		if(box.id)
		{
			newBoxes.push(box);
		}
	}
	Boxes=newBoxes;
	
	var newbd=new Array();
	for(b in boxDimensions)
	{
		var bd=boxDimensions[b];
		if(bd.box.id)
		{
			newbd.push(bd);
		}
	}
	boxDimensions=newbd;
	
	var newContainers=new Array();
	for(c in Containers)
	{
		var div=Containers[c];
		if(div.id)
		{
			newContainers.push(div);
		}
	}
	Containers=newContainers;
	
	var newcd=new Array();
	for(c in containerDimensions)
	{
		var cd=containerDimensions[c];
		if(cd.div.id)
		{
			newcd.push(cd);
		}
	}
	containerDimensions=newcd;
	
	var newcdivs=new Array();
	for(c in cursorDivs)
	{
		var cd=cursorDivs[c];
		if(cd)
		{
			newcdivs.push(cd);
		}
	}
	cursorDivs=newcdivs;
}

/*
	Container style functions
*/

function centerElement(elt)
{
	elt.style.left="50%";
	var width=parseInt(elt.style.width);
	elt.style.marginLeft=(-1*width/2)+"px";
	elt.style.marginRight="auto";
}

function leftAlignElement(elt)
{
	offsetElement(elt,0);
}

function rightAlignElement(elt)
{
	offsetElement(elt,Math.max(parseInt(elt.parentNode.offsetWidth)-parseInt(elt.style.width),0));
}

function offsetElement(elt,off)
{
	if(off<0)
		off=0;
	elt.style.left=off+"px";
	elt.style.marginLeft="";
	elt.style.marginRight="";
}

function resizeElement(elt,side,change)
{
	if(side=="left")
	{
		if(elt.style.left!="50%")
		{
			//It is not centered
			offsetElement(elt,elt.offsetLeft-change);
		}
	}
	
	if(elt.style.left=="50%")
		change=change*2;
	
	elt.style.width=(elt.offsetWidth+change)+"px";
	
	if(elt.style.left=="50%")
	{
		//Recenter object
		elt.style.marginLeft=(Math.floor(-1*(elt.offsetWidth+change)/2))+"px";
	}
}

function resizeColumn(col,side,change)
{
	if(side=="left")
	{
		var effected=col.previousSibling;
		if(effected)
		{
			//Resize column and resize previous
		
			var currentIEwidth=effected.offsetWidth+col.offsetWidth;
			var ewidth=effected.style.width;
			var cwidth=col.style.width;
			var cleft=col.style.left;
			
			//IE version
			if(isIEnow)
			{
				effected.style.width=(effected.offsetWidth-change)+"px";
				col.style.left=(effected.offsetLeft+effected.offsetWidth)+"px";
				col.style.width=(col.offsetWidth+change)+"px";
			}
			//Everyone else
			else
			{
				effected.style.width=(effected.clientWidth-change)+"px";
				col.style.left=(effected.offsetLeft+effected.clientWidth)+"px";
				col.style.width=(col.clientWidth+change)+"px";
			}
			
			var newIEwidth=effected.offsetWidth+col.offsetWidth;
			
			if((newIEwidth>currentIEwidth) && (isIEnow))
			{
				effected.style.width=ewidth;
				col.style.width=cwidth;
				col.style.left=cleft;
			}
			
		}
	}
	if(side=="right")
	{
		
		var effected=col.nextSibling;
		if(effected)
		{
			var currentIEwidth=effected.offsetWidth+col.offsetWidth;
			var eleft=effected.style.left;
			var cwidth=col.style.width;
			var ewidth=effected.style.width;
			
			//IE version
			if(isIEnow)
			{
				effected.style.width=(effected.offsetWidth-change)+"px";
				col.style.width=(col.offsetWidth+change)+"px";
				effected.style.left=(col.offsetLeft+col.offsetWidth)+"px";
			}
			//Everyone else's version
			else
			{
				effected.style.width=(effected.clientWidth-change)+"px";
				col.style.width=(col.clientWidth+change)+"px";
				effected.style.left=(col.offsetLeft+col.clientWidth)+"px";
				
			}
			
			var newIEwidth=effected.offsetWidth+col.offsetWidth;
			
			if((newIEwidth>currentIEwidth) && (isIEnow))
			{
				effected.style.width=ewidth;
				col.style.width=cwidth;
				effected.style.left=eleft;
			}
		}
	}
	
	//Save settings for col and effected
}


/*
	Functions to add and delete columns and rows
*/
function createRow(row_before)
{
	var newrow=document.createElement("div");
	newrow.setAttribute("style","width: 100%; position: relative; left:0px; top:0px;");
	
	//AJAX to add row and get its id and the id of its column
	var sendid;
	if(row_before)
	{
		sendid=parseInt(row_before.id.substr(4));
	}
	else
		sendid=-1;
	var ids=ajaxRequestData("addrow "+sendid).split(" ");
	//alert(ids);
	var id=parseInt(ids[0]);
	var rid=parseInt(ids[1]);
	
	newrow.setAttribute("id","div_"+id);
	newrow.setAttribute("name","row_"+id);
	newrow.style.position="relative";
	newrow.style.left="0px";
	newrow.style.top="0px";
	newrow.style.verticalAlign="top";
	
	var maindiv=document.getElementById("main_div");
	if(row_before)
		maindiv.insertBefore(newrow,row_before);
	else
		maindiv.appendChild(newrow);
	
	var newcol=document.createElement("div");
	var width=maindiv.clientWidth;
	newcol.setAttribute("style","");
	
	newcol.setAttribute("id","div_"+rid);
	
	newrow.appendChild(newcol);
	
	newcol.style.width=width+"px";
	newcol.style.position="relative";
	newcol.style.left="0px";
	newcol.style.top="0px";
	newcol.style.verticalAlign="top";
	
	newcol.innerHTML+="&nbsp;";
	
	Containers.push(newcol);
	containerDimensions.push({d:getDimensions(newcol), div:newcol});
	
	
	
	
	//Reset mode
	fitRowSizes();
	
	clearMode();
	columnMode();
	
	
		
}

function createColumn(column_split,side,offset)
{
	var newwidth;
	var oldwidth;
	var left;
	left=column_split.offsetLeft+offset;
	if(side=="left")
	{
		newwidth=offset;
		oldwidth=column_split.clientWidth-offset;
	}
	else if(side=="right")
	{
		newwidth=column_split.clientWidth-offset;
		oldwidth=offset;
	}
	
	var newdiv=document.createElement("div");
	newdiv.setAttribute("style","");
	newdiv.style.top="0px";
	newdiv.style.width=newwidth+"px";
	newdiv.style.position="absolute";
	
	column_split.style.position="absolute";
	
	
	/*
		Get new id for div using ajax
	*/
	var beforeid;
	
	if(side=="left")
		beforeid=parseInt(column_split.id.substr(4));
	else if(side=="right")
	{
		var cnext=column_split.nextSibling;
		if(cnext)
		{
			beforeid=parseInt(cnext.id.substr(4));
		}
		else
			beforeid=-1;
	}
	
	var parentid=column_split.parentNode.id.substr(4);
	
	var newid=parseInt(ajaxRequestData("addcol "+parentid+" "+beforeid));
	
	ajaxRequest("resizecol "+column_split.id.substr(4)+" "+oldwidth+" "+newid+" "+newwidth);
	
	newdiv.setAttribute("id","div_"+newid.toString());
	
	column_split.style.width=oldwidth+"px";
	
	if(side=="left")
	{
		column_split.parentNode.insertBefore(newdiv,column_split);
		newdiv.style.left=column_split.offsetLeft+"px";
		column_split.style.left=left+"px";
	}
	else if(side=="right")
	{
		column_split.parentNode.insertBefore(newdiv,column_split.nextSibling);
		newdiv.style.left=left+"px";
	}
	
	newdiv.innerHTML+="&nbsp;";
	Containers.push(newdiv);
	containerDimensions.push({div:newdiv, d:getDimensions(newdiv)});
	
	//Reset mode
	fitRowSizes();
	
	clearMode();
	columnMode();
}

function createBox(box_before)
{
	if(addhelper==null || addhelper.firstChild==null)
	{
		//alert("You need to choose a box type in the popup window.\nIf you accidentally closed it, clear the mode and try again.");
		return;
	}
	
	
	var newbox=addhelper.firstChild;
	box_before=addhelper.nextSibling;
	addhelper.removeChild(newbox);
	addhelper.style.display="none";
	
	
	
	if(addhelper.parentNode)
		addhelper.parentNode.removeChild(addhelper);
	
	newbox.style.display="block";
	newbox.style.visibility="visible";
	
	
	makeModifiable(newbox);
	
	
	if(box_before.id.substr(0,3)!="box")
	{
		//Put it at the end of the div
		box_before.parentNode.insertBefore(newbox,box_before);
		ajaxRequest("movebox "+addboxid+" "+box_before.parentNode.id.substr(4)+" -1 nochange");
	}
	else
	{
		//Put it before the given box.
		box_before.parentNode.insertBefore(newbox,box_before);
		ajaxRequest("movebox "+addboxid+" "+box_before.parentNode.id.substr(4)+" "+box_before.id.substr(4)+" nochange");
	}
	
	
	Boxes.push(newbox);
	
	
	//Reset addboxid
	addboxid=-1;
	
	//Reset mode and sizes
	fitRowSizes();
	clearMode();
	boxMode();
}


/*
	Function to prevent selection.
*/
function clearSelection()
{
	document.body.focus();
	
	if(document.selection)
		document.selection.clear();
}

/*
	Mouse moved handler
*/
document.onmousemove=mouseMoved;
function mouseMoved(evt)
{
	if(window.event)
		evt=window.event;
	
	
	
	updateMouseCoords(evt);
	
	
	if(dragging)
	{
		//Clear selection
		clearSelection();
		
		//Hide the real box
		dragging.style.visibility="hidden";
		
		//Show the shadow box
		shadow.style.position="absolute";
		shadow.style.left=mousePos.x-mouseOffset.x+"px";
		shadow.style.top=mousePos.y-mouseOffset.y+"px";
		shadow.style.display="block";
		
		
		var currentParent=dragging.parentNode;
		
		
		if(currentParent)
		{
			var newParent=null;
			for(c in containerDimensions)
			{
				var containerDim=containerDimensions[c];
				if(insideBounds(mousePos,containerDim.d))
				{
					newParent=containerDim.div;
					break;
				}
			}
			
			if(newParent)
			{
				
				var before=null;
				var min=9999999999;
				for(b in boxDimensions)
				{
					var id=getId(boxDimensions[b].box);
					
					if(boxDimensions[b].box.parentNode==newParent && mousePos.y<boxDimensions[b].d.y+(boxDimensions[b].d.height/2))
					{
						var bottom=boxDimensions[b].d.y+(boxDimensions[b].d.height/2);
						if(min>bottom && boxDimensions[b].box!=dragging)
						{
							min=bottom;
						}
						else
							continue;
						
						before=boxDimensions[b].box;
						if(before==dragging)
							continue;
						
					}
				}
				
				var off=false;
				
				//If it is dragged on top of itself
				if(before==dragging)
				{
					off=true;
				}
				
				//If it is dragged off to the side
				if(before==null && newParent.lastChild.previousSibling==dragging)
				{
					off=true;
				}
				
				//If it is dragged on top of itself (second check)
				if(before==dragging.nextSibling)
				{
					off=true;
				}
				
				
				//Don't do drag, set offset.
				if(off)
				{
					
					var parentDim;
					for(c in containerDimensions)
					{
						if(containerDimensions[c].div==currentParent)
						{
							parentDim=containerDimensions[c].d;
						}
					}
					var offset=mousePos.x-mouseOffset.x-parentDim.x;
					if(offset<0)
						leftAlignElement(dragging);
					else if((offset+dragging.offsetWidth)>(parentDim.width))
						rightAlignElement(dragging);
					else
					{
						offsetElement(dragging,offset);
					}
					
					
					return false;
				}
				
				currentParent.removeChild(dragging);
				
				if(before)
				{
					newParent.insertBefore(dragging,before);
				}
				else
					newParent.insertBefore(dragging,newParent.lastChild);
				
				fitRowSizes();
				
				//Debug
				//document.getElementById("div_4").innerHTML+="<br/>Added to "+newParent.id;
			}
		}
		
		
		
		return false;
	}
	
	if(sizing)
	{
		var change=0;
		clearSelection();
		if(sizeSide=="left")
		{
			change=mouseStartPos.x-mousePos.x;
		}
		if(sizeSide=="right")
		{
			change=mousePos.x-mouseStartPos.x;
		}
		
		resizeElement(sizing,sizeSide,change);
		mouseStartPos=mousePos;
	}

	if(divsizing)
	{
		var change=0;
		var dist=0;
		var maxMove=0;
		clearSelection();
		if(sizeSide=="left")
		{
			change=mouseStartPos.x-mousePos.x;
			dist=divsizing.offsetLeft;
			var e=divsizing.previousSibling;
			divsizing2=e;
			if(e)
			{
				if(isIEnow)
					maxMove=e.offsetWidth;
				else
					maxMove=e.clientWidth;
			}
		}
		if(sizeSide=="right")
		{
			change=mousePos.x-mouseStartPos.x;
			var mydim=getDimensions(divsizing);
			var parentdim=getDimensions(divsizing.parentNode);
			dist=parentdim.x+parentdim.width-mydim.x-mydim.width;
			var e=divsizing.nextSibling;
			divsizing2=e;
			if(e)
			{
				if(isIEnow)
					maxMove=e.offsetWidth;
				else
					maxMove=e.clientWidth;
			}
		}
		
		if(isIEnow)
		{
			if((change+divsizing.offsetWidth)<=0)
				change=0;
		}
		else
		{
			if((change+divsizing.clientWidth)<=0)
				change=0;
		}
		
		
		resizeColumn(divsizing,sizeSide,Math.min(Math.min(change,dist),maxMove));
		mouseStartPos=mousePos;
		
		
	}
	
	if(adding=="box" && addboxid!=-1)
	{
		
		var currentParent=null;
		if(addhelper.parentNode)
			currentParent=addhelper.parentNode;
		
		
		var newParent=null;
		for(c in containerDimensions)
		{
			var containerDim=containerDimensions[c];
			if(insideBounds(mousePos,containerDim.d))
			{
				newParent=containerDim.div;
				break;
			}
		}
			
		if(newParent)
		{
				
			var before=null;
			var min=9999999999;
			for(b in boxDimensions)
			{
				var id=getId(boxDimensions[b].box);
					
				if(boxDimensions[b].box.parentNode==newParent && mousePos.y<boxDimensions[b].d.y+(boxDimensions[b].d.height/2))
				{
					var bottom=boxDimensions[b].d.y+(boxDimensions[b].d.height/2);
					if(min>bottom && boxDimensions[b].box!=dragging)
					{
						min=bottom;
					}
					else
						continue;
						
					before=boxDimensions[b].box;
					if(before==dragging)
						continue;
						
				}
			}
		
		
			if(currentParent)
				currentParent.removeChild(addhelper);
				
			if(before)
			{
				newParent.insertBefore(addhelper,before);
			}
			else
				newParent.insertBefore(addhelper,newParent.lastChild);
			
			fitRowSizes();
		}
	}
	
}


/*
	Global mouse coordinate updater
*/

function updateMouseCoords(evt)
{
	
	var posx = 0;
	var posy = 0;
	//if (evt.pageX || evt.pageY) 	{
	//	posx = evt.pageX;
	//	posy = evt.pageY;
	//}
	//else if (evt.clientX || evt.clientY) 	{
		//posx = evt.clientX + document.body.scrollLeft
		//	+ document.documentElement.scrollLeft;
		//posy = evt.clientY + document.body.scrollTop
		//	+ document.documentElement.scrollTop;
		
		posx = evt.clientX  + document.body.scrollLeft;
			//+ document.documentElement.scrollLeft;
		posy = evt.clientY  + document.body.scrollTop;
			//+ document.documentElement.scrollTop;
	//}
	
	mousePos={x:posx,y:posy};
}









/*
	Mouse down handler
*/

document.onmousedown=tryMouseDown;

function tryMouseDown(evt)
{
	if(adding)
		return true;
	
	if(!((infoboxEditMode || divEditMode) && downallowed))
		return true;
	
	if(document.getElementById('popupwindow'))
		return true;
	
	evt = evt || window.event;
	
	updateMouseCoords(evt);
	
	if(infoboxEditMode)
	{
		for(i in Boxes)
		{
			var box=Boxes[i];
			var d=getDimensions(box);
			var xoff=mousePos.x-d.x;
			var yoff=mousePos.y-d.y;
			if(insideBounds(mousePos,d))
			{
				//The element was clicked.
				if(yoff<dragBoxHeight)
				{
					mouseDown(box,"drag");
					return true;
				}
			
				if(xoff<sizeBoxWidth)
				{
					mouseDown(box,"size left");
				}
			
				if(xoff>d.width+3-sizeBoxWidth)
				{
					mouseDown(box,"size right");
				}
			}
		}
	}
	else if(divEditMode)
	{
		for(i in Containers)
		{
			var div=Containers[i];
			var d=getDimensions(div);
			var xoff=mousePos.x-d.x;
			var yoff=mousePos.y-d.y;
			if(insideBounds(mousePos,d))
			{
				if(xoff<sizeColWidth)
				{
					mouseDown(div,"div size left");
				}
			
				if(xoff>d.width-sizeColWidth)
				{
					mouseDown(div,"div size right");
				}
			}
		}
	}
	
	
}

function mouseDown(obj,doing)
{
	
	
	var pos=getDimensions(obj);
	
	mouseOffset={x:mousePos.x-pos.x, y:mousePos.y-pos.y};
	mouseStartPos={x:mousePos.x, y:mousePos.y};
	
	
	
	
	
	if(doing=="drag")
	{
		dragging=obj;
		rootParent=obj.parentNode;
		rootSibling=obj.previousSibling;
		
		shadowChildCode=ajaxRequestData("getboxcode "+getId(dragging));
		
		shadow.innerHTML=shadowChildCode;
		shadowChild=shadow.firstChild;
		
		bar=dragging.lastChild.cloneNode(true);
		shadowChild.appendChild(bar);
		bar2=dragging.firstChild.cloneNode(true);
		shadowChild.insertBefore(bar2,shadowChild.firstChild);
	
		
		//shadowChild=dragging.cloneNode(true);
		shadowChild.style.left="";
		shadowChild.style.float="";
		shadowChild.style.top="";
		shadowChild.style.margin="";
		//shadow.appendChild(shadowChild);
		shadow.style.display="block";
		
		
		dragging.style.visibility="hidden";
		
		shadow.style.position="absolute";
		shadow.style.left=mousePos.x-mouseOffset.x+"px";
		shadow.style.top=mousePos.y-mouseOffset.y+"px";
		shadow.style.display="block";
		
		showColumnBorders();
		
		
		
	}
	else if(doing=="size left")
	{
		obj.setAttribute("oborder",obj.style.border);
		obj.style.border="";
		sizing=obj;
		sizeSide="left";
	}
	else if(doing=="size right")
	{
		obj.setAttribute("oborder",obj.style.border);
		obj.style.border="";
		sizing=obj;
		sizeSide="right";
	}
	else if(doing=="div size left")
	{
		divsizing=obj;
		sizeSide="left";
	}
	else if(doing=="div size right")
	{
		divsizing=obj;
		sizeSide="right";
	}
	
	if(sizing)
	{
		showColumnBorders();
	}
	
	fitRowSizes();
	
	//Debug	
	//document.getElementById("div_4").innerHTML+="<br/>"+doing+" "+mouseOffset.x+" "+mouseOffset.y;
	//fitRowSizes();
}

/*
	Mouse up handler
*/

document.onmouseup=mouseUp;
function mouseUp(evt)
{
	
	if(!downallowed)
		return;
	
	if(adding)
	{
		if(adding=="row")
		{
			var made=false;
			for(c in Containers)
			{
				var col=Containers[c];
				var d=getDimensions(col);
				if(insideBounds(mousePos,d))
				{
					createRow(col.parentNode);
					made=true;
					break;
				}
			}
			if(!made)
				createRow(null);
		}
		
		else if(adding=="column")
		{
			for(c in Containers)
			{
				var col=Containers[c];
				var d=getDimensions(col);
				if(insideBounds(mousePos,d))
				{
					var center=d.x+(d.width/2);
					var side="left";
					if(mousePos.x>center)
						side="right";
					
					var offset=mousePos.x-d.x;
						
					createColumn(col,side,offset);
					break;
				}
			}
		}
		
		else if(adding=="box")
		{
			for(c in Containers)
			{
				var col=Containers[c];
				var d=getDimensions(col);
				if(insideBounds(mousePos,d))
				{
					var child=col.firstChild;
					while(child)
					{
						var d2=getDimensions(child);
						if(insideBounds(mousePos,d2))
						{
							createBox(child);
							hideColumnBorders();
							showColumnBorders();
							return true;
						}
						
						child=child.nextSibling;
					}
					createBox(col);
					hideColumnBorders();
					showColumnBorders();
					return true;
				}
			}
			
		}
	}
	
	if(dragging)
	{
		dragging.style.visibility="visible";
		shadow.style.display="none";
		shadow.removeChild(shadowChild);
		var id=dragging.id.substr(4);
		var parent=dragging.parentNode.id.substr(4);
		var before;
		
		if(dragging.nextSibling.id)
		{
			before=dragging.nextSibling.id.substr(4);
		}
		else
			before="-1";
		
		var offset=parseInt(dragging.style.left);
		
		ajaxRequest("movebox "+id+" "+parent+" "+before+" "+offset);
		
		hideColumnBorders();
		showColumnBorders();
	}
	
	if(sizing)
	{
		var id=sizing.id.substr(4);
		var width=parseInt(sizing.style.width);
		ajaxRequest("resizebox "+id+" "+width);
		
		sizing.style.border=sizing.getAttribute("oborder");
		
		hideColumnBorders();
		showColumnBorders();
	}
	
	if(divsizing)
	{
		var id=divsizing.id.substr(4);
		var width=parseInt(divsizing.style.width);
			
		var append="";
		if(divsizing2)
		{
			var id2=divsizing2.id.substr(4);
			var width2=parseInt(divsizing2.style.width);
			append=" "+id2+" "+width2;
		}
		if(width)
			ajaxRequest("resizecol "+id+" "+width+append);
	}
	
	if(dragging || sizing || divsizing)
		fitRowSizes();
	
	
	dragging=null;
	sizing=null;
	divsizing=null;
	divsizing2=null;
	adding=null;
	addboxid=-1;
}




/*
	Sizing, positioning, and bounds functions
*/

//Function fits the row around the divs they contain.
function fitRowSizes()
{
	var col;
	
	var rowmaxes=new Array();
	
	
	
	
	for(col in Containers)
	{
		var column=Containers[col];
		var parent=getId(column.parentNode);
		if(!rowmaxes[parent])
			rowmaxes[parent]=0;
		
		rowmaxes[parent]=Math.max(rowmaxes[parent],column.offsetHeight);
		
		column.className="div_"+getId(column);
		
		
	}
	
	var row;
	
	
	var request="";
	for(row in rowmaxes)
	{
		var height=rowmaxes[row];
		
		document.getElementById("div_"+row).style.height=height+"px";
		
		if(!(infoboxEditMode || divEditMode))
		{
			request+=row+"="+height+"{}";
		}
		
	}
	
	if(request!="")
	{
		//Unnecessary
		//ajaxRequest("saverows "+request);
	}
	
	boxDimensions=new Array();
	containerDimensions=new Array();
	for(b in Boxes)
	{
		var box=Boxes[b];
		boxDimensions.push({d:getDimensions(box), box:box});
	}
	for(col in Containers)
	{
		var div=Containers[col];
		containerDimensions.push({d:getDimensions(div), div:div});
		
		if(!(infoboxEditMode || divEditMode))
		{
			if(div.lastChild)
			if(div.lastChild==div.firstChild && div.lastChild.tagName=="BR")
			{
				//Remove the spacing break from the div.
				div.removeChild(div.lastChild);
			}
		}
	}
		
}

function insideBounds(cur,d)
{
	var xoff=cur.x-d.x;
	var yoff=cur.y-d.y;
	if(xoff<d.width+3 && xoff>0 && yoff<d.height+1 && yoff>0)
	{
		return true;
	}
	else
		return false;
}

function getDimensions(obj)
{
	var top=0;
	var left=0;
	var width=0;
	var height=0;
	
	width=obj.offsetWidth;
	height=obj.offsetHeight;
	
	while(obj.offsetParent)
	{
		top+=obj.offsetTop;
		left+=obj.offsetLeft;
		obj=obj.offsetParent;
	}
	
	top+=obj.offsetTop;
	left+=obj.offsetLeft;
	
	return {x:left,y:top,width:width,height:height};
}

function stretchSite()
{
	fitRowSizes();
	setTimeout("stretchSite()",1000);
	
}



/*
	Edit Mode Functions
*/
function activateBoxEditMode()
{
	infoboxEditMode=true;
	showColumnBorders();
	for(b in Boxes)
	{
		var elm=Boxes[b];
		elm.firstChild.style.display="block";
	}
	
	//Show cursorDivs
	for(d in cursorDivs)
	{
		cursorDivs[d].style.cursor=cursorDivs[d].getAttribute("curs");
		cursorDivs[d].style.display="block";
	}
}

function deactivateBoxEditMode()
{
	if(!infoboxEditMode)
		return;
	hideColumnBorders();
	infoboxEditMode=false;
	
	for(b in Boxes)
	{
		var elm=Boxes[b];
		elm.firstChild.style.display="none";
	}
	
	//Show cursorDivs
	for(d in cursorDivs)
	{
		cursorDivs[d].style.cursor="default";
		cursorDivs[d].style.display="none";
	}
}


function activateDivEditMode()
{
	divEditMode=true;
	
	showColumnBorders();
}

function deactivateDivEditMode()
{
	if(!divEditMode)
		return;
	
	
	divEditMode=false;
	hideColumnBorders();
}

function allowDown()
{
	downallowed=true;
}

function blockDown()
{
	downallowed=false;
}

var stretchbrs=new Array();
function showColumnBorders()
{
	for(c in Containers)
	{
		var col=Containers[c];
		if(!col.getAttribute("oborder-width"))
		{
			col.setAttribute("oborder-width",col.style.borderWidth);
			col.setAttribute("oborder-color",col.style.borderColor);
			col.setAttribute("oborder-style",col.style.borderStyle);
		}
		col.style.borderColor="#000000";
		col.style.borderWidth="3px";
		col.style.borderStyle="solid";
		var e=document.createElement("br");
		col.appendChild(e);
		stretchbrs.push(e);
	}
	fitRowSizes();
}

function hideColumnBorders()
{
	for(c in Containers)
	{
		var col=Containers[c];
		
		if(col.getAttribute("oborder-color"))
		{
			col.style.borderWidth=col.getAttribute("oborder-width");
			col.style.borderColor=col.getAttribute("oborder-color");
			col.style.borderStyle=col.getAttribute("oborder-style");
		}
		else
		{
			col.style.borderStyle="none";
		}
	}
	
	
	for(i in stretchbrs)
	{
		var e=stretchbrs[i];
		if(e.parentNode)
		{
			e.parentNode.removeChild(e);
		}
	}
	stretchbrs=new Array();
	
	fitRowSizes();
}

