﻿document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
var dragObject = null;
var overObject = null;
var clickObject = null;
var resizeStartPos = null;
var mouseOffset = null;
var resizeObject = null;
var resizeDirection = null;
var resizeStartPos = null;
var resizeStartSize = null;
var bInResize = false;
var ActiveTemplateMenu = null;
var ButtonMenu = null;
var bDraftEmail;

function InitializeTemplateTables()
{
	var block = document.getElementById("TemplateInputBlock");
	block.style.width = GetWindowWidth() - (IsMSIE ? 50 : 80);
	if (block != null)
	{
		var cells = block.getElementsByTagName("TD");
		for (iCell = 0; iCell < cells.length; iCell++)
		{
			var cell = cells[iCell];
			var size = cellSize(cell);
			if (size.height > 0 && size.width > 0)
				makeResizeable(cell);
			if (cell.getAttribute("ShowBorder") != "true")
			{
				cell.style.borderWidth = "1px";
				cell.style.borderStyle = "solid";
				cell.style.borderColor = "gray";
			}
			cell.style.cursor = "pointer";
			makeClickable(cell);
		}
	}

	var CurrentCell = document.getElementById("CurrentCell");
	if (CurrentCell != null && CurrentCell.value.length > 0)
	{
		clickObject = document.getElementById(CurrentCell.value);
		CurrentCell.value = "";
		if (clickObject != null)
		{
			clickObject.removeAttribute("id");
			if (HasText(clickObject))
				ToggleContentMenu(false);
			else
				ToggleTemplateMenu();
		}
	}
}

function TemplateSave()
{
	CleanDragDrop();
	var Input = document.getElementById("TemplateInputBlock");
	if (Input != null)
	{
		var Output = document.getElementById("TemplateOutputBlock");
		if (Output != null)
			Output.value = Input.innerHTML;
	}
	PostClientCommand('Save');
}

function TemplateSend()
{
	CleanDragDrop();
	SyncOutput();
	PostClientCommand('SendMail');
}

function BlockContinue()
{
	CleanDragDrop();
	SyncOutput();
	PostClientCommand('Continue');
}

function SyncOutput()
{
	var Input = document.getElementById("TemplateInputBlock");
	if (Input != null)
	{
		var Output = document.getElementById("TemplateOutputBlock");
		if (Output != null)
			Output.value = Input.innerHTML;
	}
}

function ToggleContentMenu(bUpdate)
{
	Menu = document.getElementById("RichTextBlock");
	if (Menu != null)
	{
		if (Menu.style.visibility.toLowerCase() == "visible")
		{
			if (bUpdate)
			{
				UpdateRTE();
				var Editor = document.getElementById("TextEditor");
				if (Editor != null)
					clickObject.innerHTML = Editor.value;
			}
			SyncOutput();
			HideRTE();
			ActiveTemplateMenu = null;
			Menu.style.visibility = "hidden";
			RTEFileUploadOverride = null;
		}
		else
		{
			if (HasTables(clickObject))
			{
				alert("This cell contains one or more tables and cannot be edited.");
			}
			else
			{
				var width = Menu.style.width;
				var height = Menu.style.height;
				width = Number(width.substr(0, width.indexOf("px")));
				height = Number(height.substr(0, height.indexOf("px")));
				Menu.style.left = (((GetWindowWidth() / 2) - (width / 2)) - (IsMSIE ? 6 : 15)) + "px";
				Menu.style.top = (((GetWindowHeight() / 2) - (height / 2)) + getScrollXY().y) + "px";
				//			Menu.style.top = getScrollXY().y + "px";
				Menu.style.visibility = "visible";
				var Editor = document.getElementById("TextEditor");
				if (Editor != null)
				{
					Editor.value = clickObject.innerHTML;
					InitializeRTE();
				}
				RTEFileUploadOverride = UploadContentImageFile;
			}
		}
	}
}

function UploadContentImageFile()
{
	clickObject.setAttribute("id", "CurrentCell");
	document.getElementById("CurrentCell").value = clickObject.id;
	ToggleContentMenu(true);
	PostClientCommand("TemplateUploadFile");
}

function ToggleTemplateMenu()
{
	ClearActiveMenu();

	var Menu = document.getElementById("TemplateMenu");
	if (Menu != null)
	{
		if (Menu.style.visibility.toLowerCase() == "visible")
		{
			SyncOutput();
			Menu.style.visibility = "hidden";
			ActiveTemplateMenu = null;
			Menu.style.visibility = "hidden";
			document.getElementById("TemplateInputBlock").style.visibility = "visible";
		}
		else
		{
			var width = Menu.style.width;
			var height = Menu.style.height;
			width = Number(width.substr(0, width.indexOf("px")));
			height = Number(height.substr(0, height.indexOf("px")));
			Menu.style.left = (((GetWindowWidth() / 2) - (width / 2)) - (IsMSIE ? 6 : 15)) + "px";
			Menu.style.top = (((GetWindowHeight() / 2) - (height / 2)) + getScrollXY().y) + "px";
//			Menu.style.top = getScrollXY().y + "px";
			Menu.style.visibility = "visible";
			height = Number(clickObject.parentNode.style.height.substr(0, clickObject.parentNode.style.height.indexOf("px")));
			document.getElementById("Height").value = (isNaN(height) ? 0 : height);
			width = Number(clickObject.style.width.substr(0, clickObject.style.width.indexOf("px")));
			document.getElementById("Width").value = (isNaN(width) ? 0 : width);
			var background = (clickObject.style.backgroundImage.length > 0 ? clickObject.style.backgroundImage : clickObject.style.background);
			if (background.length > 0 && background != "none")
			{
				document.getElementById("Repeat").checked = (clickObject.style.background.toLowerCase().indexOf("no-repeat") == -1);
				background = background.substr(background.indexOf("(") + 1, background.length);
				background = background.substr(0, background.indexOf(")"));
			}
			else
				background = "none";
			document.getElementById("BackgroundImageUrl").value = background;
			document.getElementById("BackgroundColor").value = clickObject.style.backgroundColor;
			size = Number(clickObject.style.paddingTop.substr(0, clickObject.style.paddingTop.indexOf("px")));
			document.getElementById("PaddingTop").value = (isNaN(size) ? 0 : size);
			size = Number(clickObject.style.paddingRight.substr(0, clickObject.style.paddingRight.indexOf("px")));
			document.getElementById("PaddingRight").value = (isNaN(size) ? 0 : size);
			size = Number(clickObject.style.paddingBottom.substr(0, clickObject.style.paddingBottom.indexOf("px")));
			document.getElementById("PaddingBottom").value = (isNaN(size) ? 0 : size);
			size = Number(clickObject.style.paddingLeft.substr(0, clickObject.style.paddingLeft.indexOf("px")));
			document.getElementById("PaddingLeft").value = (isNaN(size) ? 0 : size);
			width = Number(clickObject.style.borderWidth.substr(0, clickObject.style.borderWidth.indexOf("px")));
			if (clickObject.getAttribute("ShowBorder") == "true")
			{
				document.getElementById("BorderWidth").value = (isNaN(width) ? 0 : width);
				var borderStyles = document.getElementById("BorderStyles");
				borderStyles.selectedIndex = 0;
				for (var i = 0; i < borderStyles.options.length; i++)
				{
					if (borderStyles.options[i].value.toLowerCase() == clickObject.style.borderStyle.toLowerCase())
					{
						borderStyles.selectedIndex = i;
						break;
					}
				}
				document.getElementById("BorderColor").value = clickObject.style.borderColor;
			}
			else
			{
				document.getElementById("BorderWidth").value = 0;
				document.getElementById("BorderStyles").selectedIndex = 0;
				document.getElementById("BorderColor").value = "";
			}
			var verticalAlign = document.getElementById("VerticalAlign");
			verticalAlign.selectedIndex = 0;
			for (var i = 0; i < verticalAlign.options.length; i++)
			{
				if (verticalAlign.options[i].value == clickObject.style.verticalAlign.toLowerCase())
				{
					verticalAlign.selectedIndex = i;
					break;
				}
			}
			var tableAlign = document.getElementById("TableAlign");
			tableAlign.selectedIndex = 0;
			var setting = getTableAlign();
			for (var i = 0; i < tableAlign.options.length; i++)
			{
				if (tableAlign.options[i].value == setting)
				{
					tableAlign.selectedIndex = i;
					break;
				}
			}
			document.getElementById("Height").focus();
		}
	}
}

function TemplateMenuCancel()
{
	ToggleTemplateMenu();
}

function TemplateMenuDone()
{
	UpdateTemplateControl("Height");
	UpdateTemplateControl("Weight");
	UpdateTemplateControl("BackgroundImageUrl");
	UpdateTemplateControl("Repeat");
	UpdateTemplateControl("BackgroundColor");
	UpdateTemplateControl("PaddingTop");
	UpdateTemplateControl("PaddingRight");
	UpdateTemplateControl("PaddingBottom");
	UpdateTemplateControl("PaddingLeft");
	UpdateTemplateControl("BorderStyle");
	UpdateTemplateControl("BorderWidth");
	UpdateTemplateControl("BorderColor");
	UpdateTemplateControl("VerticalAlign");
	UpdateTemplateControl("TableAlign");
	ToggleTemplateMenu();
}

function UpdateTemplateControl(control)
{
	var value = "";
	switch (control)
	{
		case "Height":
			{
				value = document.getElementById("Height").value;
				clickObject.parentNode.style.height = (value.length == 0 || isNaN(value) ? "inherit" : value + "px");
				break;
			}
		case "Width":
			{
				value = document.getElementById("Width").value;
				clickObject.style.width = (value.length == 0 || isNaN(value) ? "inherit" : value + "px");
				break;
			}
		case "BackgroundImageUrl":
			{
				var background = document.getElementById("BackgroundImageUrl").value;
				if (background.length > 0 && background.toLowerCase() != "none")
				{
					if (IsMSIE)
						clickObject.style.background = "background-image: url(" + background + ")" +
													(clickObject.style.backgroundColor.length > 0 ? " " + clickObject.style.backgroundColor : "");
					else
						clickObject.style.background = "url(" + background + ")";

					clickObject.style.backgroundRepeat = (document.getElementById("Repeat").checked ? "repeat" : "no-repeat");
				}
				else
					clickObject.style.background = "none";

				break;
			}
		case "Repeat":
			{
				clickObject.style.backgroundRepeat = (document.getElementById("Repeat").checked ? "repeat" : "no-repeat");
				break;
			}
		case "BackgroundColor":
			{
				clickObject.style.backgroundColor = document.getElementById("BackgroundColor").value;
				break;
			}
		case "PaddingTop":
			{
				value = document.getElementById("PaddingTop").value;
				clickObject.style.paddingTop = (value.length == 0 || isNaN(value) ? 0 : value) + "px";
				break;
			}
		case "PaddingRight":
			{
				value = document.getElementById("PaddingRight").value;
				clickObject.style.paddingRight = (value.length == 0 || isNaN(value) ? 0 : value) + "px";
				break;
			}
		case "PaddingBottom":
			{
				value = document.getElementById("PaddingBottom").value;
				clickObject.style.paddingBottom = (value.length == 0 || isNaN(value) ? 0 : value) + "px";
				break;
			}
		case "PaddingLeft":
			{
				value = document.getElementById("PaddingLeft").value;
				clickObject.style.paddingLeft = (value.length == 0 || isNaN(value) ? 0 : value) + "px";
				break;
			}
		case "VerticalAlign":
			{
				clickObject.style.verticalAlign = document.getElementById("VerticalAlign").options[document.getElementById("VerticalAlign").selectedIndex].value;
				break;
			}
		case "TableAlign":
			{
				setTableAlign(document.getElementById("TableAlign").options[document.getElementById("TableAlign").selectedIndex].value);
				break;
			}
		case "BorderStyles":
			{
				var StyleIndex = document.getElementById("BorderStyles").selectedIndex;
				if (StyleIndex == 0)
				{
					clickObject.removeAttribute("ShowBorder");
					clickObject.style.borderStyle = "solid";
					clickObject.style.borderWidth = "1px";
					clickObject.style.borderColor = "gray";
					document.getElementById("BorderWidth").value = 0;
					document.getElementById("BorderColor").value = "";
				}
				else
				{
					clickObject.setAttribute("ShowBorder", "true");
					clickObject.style.borderStyle = document.getElementById("BorderStyles").options[StyleIndex].value;
					document.getElementById("BorderWidth").value = Number(clickObject.style.borderWidth.substr(0, clickObject.style.borderWidth.indexOf("px")));
					document.getElementById("BorderColor").value = clickObject.style.borderColor;
				}
				break;
			}
		case "BorderWidth":
			{
				value = document.getElementById("BorderWidth").value;
				if (clickObject.getAttribute("ShowBorder") == "true")
					clickObject.style.borderWidth = (value.length == 0 || isNaN(value) ? 0 : value) + "px";
				else
					clickObject.style.borderWidth = "1px";
				break;
			}
		case "BorderColor":
			{
				if (clickObject.getAttribute("ShowBorder") == "true")
					clickObject.style.borderColor = document.getElementById("BorderColor").value;
				else
					clickObject.style.borderColor = "gray";
				break;
			}
	}
}

function ClearActiveMenu()
{
	if (TemplateMenuBar.bToggleMenuUp && ButtonMenu != null)
	{
		ToggleButtonMenu(ButtonMenu);
		ButtonMenu = null;
	}
	if (TemplateMenuBar.bToggleMenuUp && ActiveTemplateMenu != null)
	{
		var MenuCell = null;
		var MenuItem = null;
		if (ActiveTemplateMenu == "XmlMenuCell_AddElements")
		{
			MenuCell = document.getElementById("XmlMenuCell_AddElements");
			if (MenuCell != null)
			{
				ToggleElementsMenu(MenuCell, "XmlMenu_ChildMenuAddElements");
				MenuCell.style.cursor = "pointer";
			}
			MenuItem = document.getElementById("XmlMenuItem_AddElements");
		}
		else
		{
			MenuCell = document.getElementById("XmlMenuCell_DeleteElements");
			if (MenuCell != null)
			{
				ToggleElementsMenu(MenuCell, "XmlMenu_ChildMenuDeleteElements");
				MenuCell.style.cursor = "pointer";
			}
			MenuItem = document.getElementById("XmlMenuItem_DeleteElements");
		}
		if (MenuItem != null)
			MenuItem.style.color = "black";
		ActiveTemplateMenu = null;
	}
}

function ToggleChildMenu(e)
{
	if (TemplateMenuBar.bToggleMenuUp && e.id != ActiveTemplateMenu)
		ClearActiveMenu();

	ActiveTemplateMenu = e.id;

	switch (ActiveTemplateMenu)
	{
		case "XmlMenuCell_AddElements":
			{
				ToggleElementsMenu(e, "XmlMenu_ChildMenuAddElements");
				break;
			}
		case "XmlMenuCell_DeleteElements":
			{
				ToggleElementsMenu(e, "XmlMenu_ChildMenuDeleteElements");
				break;
			}
		case "XmlMenuCell_TemplateInsertImage":
			{
				ToggleButtonMenu(e);
				break;
			}
		case "XmlMenuCell_TemplateBackColor":
			{
				ToggleButtonMenu(e);
				break;
			}
		case "XmlMenuCell_TemplateBorderColor":
			{
				ToggleButtonMenu(e);
				break;
			}
	}
}

function ToggleElementsMenu(e, menu)
{
	TemplateMenuBar.ToggleMenu(e, menu, false);
	e.style.cursor = "pointer";
	if (!TemplateMenuBar.bToggleMenuUp)
	{
		e.style.color = "black";
		ActiveTemplateMenu = null;
	}
}

function ToggleButtonMenu(e)
{
	ButtonMenu = document.getElementById(e.id);
	var menu = (e.id == "XmlMenuCell_TemplateInsertImage" ? "XmlMenu_TemplateImageOptions" : "XmlMenu_TemplateColorSelector");
	if (ButtonMenu != null)
	{
		TemplateMenuBar.ToggleMenu(ButtonMenu, menu);
		RTECurrentMenu = (TemplateMenuBar.bToggleMenuUp ? menu : null);
		if (TemplateMenuBar.bToggleMenuUp)
			OnMouseDown(ButtonMenu);
		else
			OnMouseOut(ButtonMenu);
	}
}

function TemplateInsertImage(e)
{
	var bFileUpload = false;
	var url = "";
	var obj = document.getElementById("TemplateImageFiles");
	if (obj.selectedIndex == 0)
	{
		bFileUpload = true;
		obj = document.getElementById("TemplateImageFileUpload.FileUpload");
		if (obj.value.toUpperCase().lastIndexOf(".GIF") == -1 && obj.value.toUpperCase().lastIndexOf(".JPG") == -1)
		{
			alert("The file you have selected to upload is not a valid image file. Valid image files include .GIF and .JPG.");
			return;
		}
		url = obj.value;
		if (url.lastIndexOf("\\") > 0)
			url = "http://uploadfolder/" + url.substr(url.lastIndexOf("\\") + 1, url.length - (url.lastIndexOf("\\") + 1));
		else if (url.lastIndexOf("/") > 0)
			url = "http://uploadfolder" + url.substr(url.lastIndexOf("/"), url.length - url.lastIndexOf("/"));
		else if (url.length > 0 && url != "http://")
		{
			if (IsMSIE)
			{
				alert("ERROR:  A file path was not specified.  Please specify a valid path and file name and try again.");
				obj.parentNode.removeNode(obj);
				PostClientCommand("Reset")
			}
			url = "http://uploadfolder/" + obj.value;
		}
	}
	else
	{
		url = obj.value;
		obj.value = "";
	}
	if (url.length == 0 || url == "http://")
	{
		alert("Please select an existing image or upload a new image to the web server.");
		return;
	}

	document.getElementById("BackgroundImageUrl").value = url;
	UpdateTemplateControl("BackgroundImageUrl");

	obj = document.getElementById("XmlMenuCell_TemplateInsertImage");
	if (bFileUpload)
	{
		clickObject.setAttribute("id", "CurrentCell");
		document.getElementById("CurrentCell").value = clickObject.id;
		var Input = document.getElementById("TemplateInputBlock");
		if (Input != null)
		{
			var Output = document.getElementById("TemplateOutputBlock");
			if (Output != null)
				Output.value = Input.innerHTML;
		}
		ToggleButtonMenu(obj);
		popupMessageBox(document.getElementById("TemplatePleaseWait"));
		PostClientCommand("TemplateUploadFile");
	}
	else
		ToggleButtonMenu(obj);
}

function DeleteCell()
{
	var iCells = getCellCount(clickObject.parentNode);
	var iRows = getRowCount(clickObject.parentNode.parentNode);
	if (iCells == 1 && iRows == 1)
		DeleteTable();
	else if (iCells == 1)
		DeleteRow();
	else
	{
		clickObject.parentNode.removeChild(clickObject);
		ToggleTemplateMenu();
	}
}

function DeleteRow()
{
	var iRows = getRowCount(clickObject.parentNode.parentNode);

	if (iRows == 1)
		DeleteTable();
	else
	{
		if (clickObject.parentNode.tagName.toLowerCase() == "tr")
			clickObject.parentNode.parentNode.removeChild(clickObject.parentNode);
		ToggleTemplateMenu();
	}
}

function setTableAlign(text)
{
	var bFound = false;
	var node = clickObject.parentNode;
	while (!bFound)
	{
		switch (node.tagName.toLowerCase())
		{
			case "tr":
			case "tbody":
				{
					node = node.parentNode;
					break;
				}
			case "table":
				{
					bFound = true;
					break;
				}
			default:
				break;
		}
	}
	if (bFound)
		node.setAttribute("align", text);
}

function getTableAlign()
{
	var bFound = false;
	var node = clickObject.parentNode;
	while (!bFound)
	{
		switch (node.tagName.toLowerCase())
		{
			case "tr":
			case "tbody":
				{
					node = node.parentNode;
					break;
				}
			case "table":
				{
					bFound = true;
					break;
				}
			default:
				break;
		}
	}
	if (bFound)
		return (node.getAttribute("align") == null ? "left" : node.getAttribute("align"));

	return "left";
}

function DeleteTable()
{
	var bFound = false;
	var node = clickObject.parentNode;
	while (!bFound)
	{
		switch (node.tagName.toLowerCase())
		{
			case "tr":
			case "tbody":
				{
					node = node.parentNode;
					break;
				}
			case "table":
				{
					bFound = true;
					break;
				}
			default:
				break;
		}
	}
	if (bFound)
		node.parentNode.removeChild(node);
	ToggleTemplateMenu();
}

function InsertTable()
{
	ClearActiveMenu();

	var element = document.getElementById("EmptyTable").cloneNode(true);
	element.removeAttribute("id");
	var cells = element.getElementsByTagName("TD");
	for (var i = 0; i < cells.length; i++)
	{
		makeClickable(cells.item(i));
		makeResizeable(cells.item(i));
	}
	clickObject.appendChild(element);
}

function InsertRow(bAbove)
{
	ClearActiveMenu();

	var element = clickObject.parentNode.cloneNode(true);
	for (var i = 0; i < element.childNodes.length; i++)
	{
		if (element.childNodes.item(i).tagName != null && element.childNodes.item(i).tagName.toLowerCase() == "td")
		{
			element.childNodes.item(i).innerHTML = "";
			makeClickable(element.childNodes.item(i));
			makeResizeable(element.childNodes.item(i));
		}
	}
	var iIndex = getChildNodeIndex(clickObject.parentNode.parentNode, clickObject.parentNode);
	if (iIndex > -1)
	{
		if (bAbove)
			clickObject.parentNode.parentNode.insertBefore(element, clickObject.parentNode);
		else
		{
			if (iIndex + 1 < clickObject.parentNode.parentNode.childNodes.length)
				clickObject.parentNode.parentNode.insertBefore(element, clickObject.parentNode.parentNode.childNodes.item(iIndex + 1));
			else
				clickObject.parentNode.parentNode.appendChild(element);
		}
	}
}

function InsertCell(bBefore)
{
	ClearActiveMenu();

	var element = clickObject.cloneNode(false);

	var width = Number(element.style.width.substr(0, element.style.width.indexOf("px")));
	if (width == 0)
		element.style.width = "100px";

	makeResizeable(element);
	makeClickable(element);
	element.style.cursor = "pointer";

	var iIndex = getChildNodeIndex(clickObject.parentNode, clickObject);
	if (iIndex > -1)
	{
		if (bBefore)
			clickObject.parentNode.insertBefore(element, clickObject);
		else
		{
			if (iIndex + 1 < clickObject.parentNode.childNodes.length)
				clickObject.parentNode.insertBefore(element, clickObject.parentNode.childNodes.item(iIndex + 1));
			else
				clickObject.parentNode.appendChild(element);
		}
	}
}

function getChildNodeIndex(parent, child)
{
	var iIndex = -1;
	for (var i = 0; i < parent.childNodes.length; i++)
	{
		if (parent.childNodes.item(i) == child)
		{
			iIndex = i;
			break;
		}
	}
	return iIndex;
}

function getCellCount(row)
{
	var iCount = 0;
	for (var i = 0; i < row.childNodes.length; i++)
	{
		if (row.childNodes.item(i).tagName.toLowerCase() == "td")
			iCount += 1;
	}
	return iCount;
}

function getRowCount(table)
{
	var iCount = 0;
	for (var i = 0; i < table.childNodes.length; i++)
	{
		if (table.childNodes.item(i).tagName.toLowerCase() == "tr")
			iCount += 1;
	}
	return iCount;
}

function _cSet(e)
{
	if (ButtonMenu != null)
	{
		switch (ButtonMenu.id)
		{
			case "XmlMenuCell_TemplateBackColor":
				{
					document.getElementById("BackgroundColor").value = e.style.backgroundColor;
					UpdateTemplateControl("BackgroundColor");
					break;
				}
			case "XmlMenuCell_TemplateForeColor":
				{
					document.getElementById("ForegroundColor").value = e.style.backgroundColor;
					UpdateTemplateControl("ForegroundColor");
					break;
				}
			case "XmlMenuCell_TemplateBorderColor":
				{
					document.getElementById("BorderColor").value = e.style.backgroundColor;
					UpdateTemplateControl("BorderColor");
					break;
				}
			default:
				{
					break;
				}
		}
	}
	ToggleButtonMenu(ButtonMenu);
}

function CleanDragDrop()
{
	var cells = document.getElementsByTagName("TD");
	for (i = 0; i < cells.length; i++)
	{
		var cell = cells[i];
		if (cell.getAttribute("ShowBorder") != "true")
		{
			cell.style.borderStyle = "none";
			cell.style.borderWidth = "0px";
			cell.style.borderColor = "";
		}
		cell.style.cursor = "default";
	}
}

function mouseCoords(ev)
{
	ev = ev || window.event;

	if (ev == null || document.body == null || document.body.clientLeft == null || document.body.clientTop == null)
		return;

	if (ev.pageX || ev.pageY)
	{
		return { x: ev.pageX, y: ev.pageY };
	}
	return {
		x: ev.clientX + getScrollXY().x - document.body.clientLeft,
		y: ev.clientY + getScrollXY().y - document.body.clientTop
	};
}

function mouseUp(ev)
{
	if (dragObject)
		dragObject.onmousedown = null;
	dragObject = null;
	resizeObject = null;
	resizeDirection = null;
}

function getMouseOffset(target, ev)
{
	ev = ev || window.event;

	var docPos = getPosition(target);
	var mousePos = mouseCoords(ev);
	return { x: mousePos.x - docPos.x, y: mousePos.y - docPos.y };
}

function getPosition(e)
{
	var left = 0;
	var top = 0;

	while (e.offsetParent)
	{
		left += e.offsetLeft;
		top += e.offsetTop;
		e = e.offsetParent;
	}

	left += e.offsetLeft;
	top += e.offsetTop;

	return { x: left, y: top };
}

function cellSize(item)
{
	var w = item.style.width;
	var row = item.parentNode;
	var h = 0;
	if (row != null)
		h = row.style.height;
	w = Number(w.substr(0, w.indexOf("px")));
	h = Number(h.substr(0, h.indexOf("px")));

	return { width: w, height: h };
}

function mouseMove(ev)
{
	ev = ev || window.event;

	var mousePos = mouseCoords(ev);

	if (resizeObject)
	{
		var row = resizeObject.parentNode;
		var height = 0;
		var width = 0;
		var size = cellSize(resizeObject);

		bInResize = true;

		switch (resizeDirection)
		{
			case "nw-resize":
				{
					height = (size.height + (mousePos.y - mouseOffset.y));
					width = (size.width + (mousePos.x - mouseOffset.x));
					if (height > 0 && width > 0)
					{
						if (row != null)
							row.style.height = height + "px";
						resizeObject.style.width = width + "px";
					}
					break;
				}
			case "n-resize":
				{
					height = (size.height + (mousePos.y - mouseOffset.y));
					if (height > 0 && row != null)
						row.style.height = height + "px";
					break;
				}
			case "w-resize":
				{
					width = (size.width + (mousePos.x - mouseOffset.x));
					if (width > 0)
						resizeObject.style.width = width + "px";
					break;
				}
			case "sw-resize":
				{
					height = (resizeStartSize.height + (mousePos.y - resizeStartPos.y));
					width = (size.width + (mousePos.x - mouseOffset.x));
					if (height > 0 && width > 0)
					{
						if (row != null)
							row.style.height = height + "px";
						resizeObject.style.width = width + "px";
					}
					break;
				}
			case "s-resize":
				{
					height = (resizeStartSize.height + (mousePos.y - resizeStartPos.y));
					if (height > 0 && row != null)
						row.style.height = height + "px";
					break;
				}
			case "se-resize":
				{
					height = (resizeStartSize.height + (mousePos.y - resizeStartPos.y));
					width = (resizeStartSize.width + (mousePos.x - resizeStartPos.x));
					if (height > 0 && width > 0)
					{
						if (row != null)
							row.style.height = height + "px";
						resizeObject.style.width = width + "px";
					}
					break;
				}
			case "e-resize":
				{
					width = (resizeStartSize.width + (mousePos.x - resizeStartPos.x));
					if (width > 0)
						resizeObject.style.width = width + "px";
					break;
				}
			case "ne-resize":
				{
					height = (size.height + (mousePos.y - mouseOffset.y));
					width = (resizeStartSize.width + (mousePos.x - resizeStartPos.x));
					if (height > 0 && width > 0)
					{
						if (row != null)
							row.style.height = height + "px";
						resizeObject.style.width = width + "px";
					}
					break;
				}
		}
	}
	else if (dragObject)
	{
		dragObject.style.position = 'absolute';
		dragObject.style.top = (mousePos.y - mouseOffset.y) + "px";
		dragObject.style.left = (mousePos.x - mouseOffset.x) + "px";
	}
	else if (overObject)
	{
		var size = cellSize(overObject);
		var currentOffset = getMouseOffset(overObject, ev);
		if ((size.width - currentOffset.x) <= 3 && (size.height - currentOffset.y) <= 3)
			overObject.style.cursor = "se-resize";
		else if ((size.height - currentOffset.y) <= 3)
			overObject.style.cursor = "s-resize";
		else if ((size.width - currentOffset.x) <= 3)
			overObject.style.cursor = "e-resize";
		else
		{
			overObject.style.cursor = "pointer";
			bInResize = false;
		}
	}
}

function makeResizeable(item)
{
	if (!item) return;
	item.onmousedown = function (ev)
	{
		if (resizeObject == null || !IsParentOf(this, resizeObject))
		{
			resizeObject = this;
			resizeDirection = item.style.cursor;
			resizeStartSize = cellSize(item);
			resizeStartPos = mouseCoords(ev);
			mouseOffset = getMouseOffset(this, ev);
		}
		return false;
	}
	item.onmouseover = function (ev)
	{
		if (overObject == null || !IsParentOf(this, overObject))
		{
			overObject = this;
			item.onmouseout = function (ev)
			{
				if (resizeObject == null && overObject != null)
					overObject.style.cursor = "default";
				overObject = null;
			}
		}
	}
}

function makeClickable(item)
{
	if (!item) return;
	item.onclick = function (ev)
	{
		ev = ev || window.event;

		// stop event bubble-up
		ev.cancelBubble = true;
		if (ev.stopPropagation)
			ev.stopPropagation();

		if (bInResize)
			return;

		clickObject = this;

		if (HasText(clickObject) && !HasTables(clickObject))
			ToggleContentMenu(false);
		else
			ToggleTemplateMenu();
		mouseOffset = getMouseOffset(this, ev);
		return false;
	}
}

function makeDraggable(item)
{
	if (!item) return;
	item.onmousedown = function (ev)
	{
		dragObject = this;
		mouseOffset = getMouseOffset(this, ev);
		return false;
	}
}

function IsParentOf(parent, obj)
{
	for (var i = 0; i < parent.childNodes.length; i++)
	{
		var child = parent.childNodes[i];
		if (child == obj || IsParentOf(child, obj))
			return true;
	}
	return false;
}

function HasText(element)
{
	for (var i = 0; i < element.childNodes.length; i++)
	{
		if (element.childNodes.item(i).nodeValue != null && element.childNodes.item(i).nodeValue.length > 0 || HasText(element.childNodes.item(i)))
			return true;
	}
	return false;
}

function HasTables(element)
{
	for (var i = 0; i < element.childNodes.length; i++)
	{
		if (element.childNodes.item(i).tagName != null && element.childNodes.item(i).tagName.toLowerCase() == "table" || HasTables(element.childNodes.item(i)))
			return true;
	}
	return false;
}
