﻿function de_RootElementAtForm(elemId)
{
	var elem = document.getElementById(elemId);
	if (elem)
	{
		var parent = elem;
		while (parent && parent.tagName != "FORM" && parent.tagName != "BODY")
			parent = parent.parentNode;
		if (parent)
			parent.appendChild(elem);
	}
}

/******************************************************************************
 * Enums
 ******************************************************************************/
var de_EditorModes = new Object();
de_EditorModes.NotSet = 0;
de_EditorModes.Resize = 1;
de_EditorModes.Crop = 2;
de_EditorModes.CropMove = 3;

var de_KeyCodes = new Object();
de_KeyCodes.Shift = 16;

/******************************************************************************
 * Globals
 ******************************************************************************/
var de_ToolbarButtons = new Array();
var de_CurrMode = de_EditorModes.NotSet;
var de_ImageToEdit;
var de_ImageToEditLeft = 0;
var de_ImageToEditTop = 0;
var de_InitImageWidth = 450;
var de_KeyHeld = null;
var de_CropAspectRatio = new Object();
var de_IsCropAspectRatioSetByShift = false;
var de_MinResultWidth;
var de_MinResultHeight;
var de_MaxResizeWidth = 0;

var de_CropXField;
var de_CropYField;
var de_CropWidthField;
var de_CropHeightField;
var de_ResizeWidthField;

var de_OffsetX = 0;
var de_OffsetY = 0;
var de_IEOffsetX = 0;
var de_IEOffsetY = 0;
var de_ScrollLeftOffset = 0;
var de_ScrollTopOffset = 0;

var de_UseIEBehavior = (navigator.appVersion.indexOf("MSIE") >= 0);

var de_FixedCropWidth = 0;
var de_FixedCropHeight = 0;

/******************************************************************************
 * Global Functions
 ******************************************************************************/
function de_InitImageEditor(imageToEditId, minResultWidth, minResultHeight,
	cropAspectRatioWidth, cropAspectRatioHeight, cropXFieldId, cropYFieldId,
	cropWidthFieldId, cropHeightFieldId, resizeWidthFieldId, maxResizeWidth,
	offsetX, offsetY, ieOffsetX, ieOffsetY, fixedCropWidth, fixedCropHeight)
{
	de_OffsetX = parseInt(offsetX);
	de_OffsetY = parseInt(offsetY);
	de_IEOffsetX = parseInt(ieOffsetX);
	de_IEOffsetY = parseInt(ieOffsetY);
	
	de_FixedCropWidth = parseInt(fixedCropWidth);
	de_FixedCropHeight = parseInt(fixedCropHeight);

	de_ImageToEdit = document.getElementById(imageToEditId);
	de_ImageToEdit.onmousedown = de_ImageToEditMousedown;
	de_ImageToEdit.onload = de_ShowFixedCropBox; // This fires when the image is rotated and re-loads
	
	de_MinResultWidth = minResultWidth;
	de_MinResultHeight = minResultHeight;
	de_MaxResizeWidth = maxResizeWidth;
	
	de_CropAspectRatio.x = cropAspectRatioWidth;
	de_CropAspectRatio.y = cropAspectRatioHeight;
	
	de_CropXField = document.getElementById(cropXFieldId);
	de_CropYField = document.getElementById(cropYFieldId);
	de_CropWidthField = document.getElementById(cropWidthFieldId);
	de_CropHeightField = document.getElementById(cropHeightFieldId);
	de_ResizeWidthField = document.getElementById(resizeWidthFieldId);
	
	var resizeWidth = de_ResizeWidthField.getAttribute("value");
	if (resizeWidth > 0)
		de_InitImageWidth = parseInt(resizeWidth);
	
	de_SetImageSize(de_InitImageWidth);
	
	var imgCoords = de_GetElementScreenCoordinates(de_ImageToEdit);
	de_ImageToEditLeft = imgCoords.x;
	de_ImageToEditTop = imgCoords.y;
	
	de_GetImageScrollOffsets();
	
	de_InitToolbar();
	de_InitCropBox();
	
	de_ShowFixedCropBox();
}

function de_ShowFixedCropBox()
{
	if (de_FixedCropWidth > 0 && de_FixedCropHeight > 0)
	{
		// Mimic starting a crop
		de_GetImageScrollOffsets();
		de_EnsureCropBox();
		de_CropBox.style.display = '';
		
		// Center the crop box
		de_CurrCropX = Math.floor((de_ImageToEdit.offsetWidth - de_FixedCropWidth) / 2);
		de_CurrCropY = Math.floor((de_ImageToEdit.offsetHeight - de_FixedCropHeight) / 2);
		if (de_CurrCropX < 0) de_CurrCropX = 0;
		if (de_CurrCropY < 0) de_CurrCropY = 0;
		
		// Make sure crop box doesn't extend outside of the image
		if (de_CurrCropX + de_FixedCropWidth + 2 > de_ImageToEdit.offsetWidth)
		{
			de_CurrCropX = 0;
			de_InitImageWidth = de_FixedCropWidth + 2; // 2 for border
			de_SetImageSize(de_InitImageWidth);
		}
		if (de_CurrCropY + de_FixedCropHeight + 2 > de_ImageToEdit.offsetHeight)
		{
			de_CurrCropY = 0;
			de_InitImageWidth = de_ImageToEdit.offsetWidth * (de_FixedCropHeight + 2) / de_ImageToEdit.offsetHeight; // 2 for border
			de_SetImageSize(de_InitImageWidth);
		}
		
		// Set the dimensions and position of the crop box
		de_CropBox.style.width = de_FixedCropWidth + "px";
		de_CropBox.style.height = de_FixedCropHeight + "px";
		de_CropBox.style.left = de_CurrCropX + "px";
		de_CropBox.style.top = de_CurrCropY + "px";
		
		// Mimic finishing a crop
		de_CropBox.style.cursor = "move";
		de_CropBox.onmousedown = de_BeginCropMove;
		de_PersistCropValues();
		
		de_CropBoxVisible = true;
		de_CropMovePrevMode = de_CurrMode;
		
		// Reset crop boundaries to reflect new image size
		de_CropXMin = 0;
		de_CropXMax = de_CropXMin + de_ImageToEdit.offsetWidth;
		de_CropYMin = 0;
		de_CropYMax = de_CropYMin + de_ImageToEdit.offsetHeight;
	}
}

function de_ResetImageEditor()
{
	de_ClearCropBox();
	de_SetImageSize(de_InitImageWidth);
}

function de_GetEventScreenCoordinates(evt)
{
	var result = new Object();
	if (evt.pageX || evt.pageY) {
		result.x = evt.pageX;
		result.y = evt.pageY;
	}
	else if (evt.clientX || evt.clientY)
	{
		result.x = evt.clientX + document.body.scrollLeft;
		result.y = evt.clientY + document.body.scrollTop;
	}
	return result;
}

function de_CancelEventPropagation(evt, preventDefault)
{
	evt.cancelBubble = true;
	if (evt.stopPropagation)
		evt.stopPropagation();
	if (preventDefault && evt.preventDefault)
		evt.preventDefault();
	return !preventDefault;
}

function de_GetOffsetX()
{
	if (de_UseIEBehavior)
		return de_IEOffsetX;
	else
		return de_OffsetX;
}

function de_GetOffsetY()
{
	if (de_UseIEBehavior)
		return de_IEOffsetY;
	else
		return de_OffsetY;
}

function de_GetElementScreenCoordinates(elem)
{
	var result = new Object();
	result.x = elem.offsetLeft;
	result.y = elem.offsetTop;
	if (elem.offsetParent)
	{
		while (elem = elem.offsetParent)
		{
			result.x += elem.offsetLeft;
			result.y += elem.offsetTop;
		}
	}
	return result;
}

function de_GetImageScrollOffsets()
{
	de_ScrollLeftOffset = 0;
	de_ScrollTopOffset = 0;
	var currParent = de_ImageToEdit.offsetParent.offsetParent;
	while (currParent)
	{
		de_ScrollLeftOffset += currParent.scrollLeft;
		de_ScrollTopOffset += currParent.scrollTop;
		currParent = currParent.offsetParent;
	}
}

/******************************************************************************
 * de_ImageToEdit Event Handlers
 ******************************************************************************/
function de_ImageToEditMousedown(evt)
{
	if (!evt && window.event)
		evt = window.event;
	
	switch (de_CurrMode)
	{
		case de_EditorModes.Resize :
			de_BeginResizeImage(evt);
			break;
		case de_EditorModes.Crop :
			de_BeginCropImage(evt);
			break;
	}
	
	return de_CancelEventPropagation(evt, true);
}

/******************************************************************************
 * Toolbar Functions
 ******************************************************************************/
function de_InitToolbar()
{
	de_WireupToolbar();

	for (var i = 0; i < de_ToolbarButtons.length; i++)
	{
		if (de_GetToolbarCommandName(de_ToolbarButtons[i]) == "Resize")
		{
			de_SetActiveTool(de_ToolbarButtons[i]);
			break;
		}
	}
}

function de_WireupToolbar()
{
	var tbar = document.getElementById('ToolBar');
	var nodes = tbar.getElementsByTagName("LI");
	for (var i = 0; i < nodes.length; i++)
	{
		var currChild = nodes[i];
		if (!currChild.getAttribute("id"))
		{
			var imgElem = currChild.getElementsByTagName("IMG")[0];
			if (imgElem)
			{
				imgElem.onmouseover = new Function("de_ToolbarImageMouseover(this);");
				imgElem.onmouseout = new Function("de_ToolbarImageMouseout(this);");
			}
			else
			{
				currChild.onmouseover = new Function("de_ToolbarButtonMouseover(this);");
				currChild.onmouseout = new Function("de_ToolbarButtonMouseout(this);");
			}
			currChild.onclick = new Function("de_SetActiveTool(this);");
			de_ToolbarButtons[de_ToolbarButtons.length] = currChild;
		}
	}
}

function de_GetToolbarCommandName(buttonElement)
{
	return buttonElement.getAttribute("title");
}

function de_ToolbarButtonMouseover(buttonElement)
{
	if (!buttonElement.className)
		buttonElement.className = "ToolbarButtonHover";
}

function de_ToolbarButtonMouseout(buttonElement)
{
	if (buttonElement.className == "ToolbarButtonHover")
		buttonElement.className = null;
}

function de_ToolbarImageMouseover(imgElement)
{
	var buttonElement = imgElement.parentNode;
	if (!buttonElement.className)
		buttonElement.className = "ToolbarButtonHover";
}

function de_ToolbarImageMouseout(imgElement)
{
	var buttonElement = imgElement.parentNode;
	if (buttonElement.className == "ToolbarButtonHover")
		buttonElement.className = null;
}

function de_SetResizeActiveTool()
{
	var elem = null;
	for (var i = 0; i < de_ToolbarButtons.length; i++)
	{
		if (de_GetToolbarCommandName(de_ToolbarButtons[i]) == "Resize")
		{
			elem = de_ToolbarButtons[i];
			break;
		}
	}
	if (elem)
		de_SetActiveTool(elem);
}

function de_SetActiveTool(buttonElement)
{	
	switch (de_GetToolbarCommandName(buttonElement))
	{
		case "Reset" :
			buttonElement.className = "ToolbarButtonDown";
			de_ResetImageEditor();
			buttonElement.className = null;
			break;
		case "Resize" :
			de_ClearSelectedToolbarButton();
			buttonElement.className = "ToolbarButtonDown";
			de_CurrMode = de_EditorModes.Resize;
			de_ImageToEdit.style.cursor = "se-resize";
			break;
		case "Crop" :
			de_ClearSelectedToolbarButton();
			buttonElement.className = "ToolbarButtonDown";
			de_CurrMode = de_EditorModes.Crop;
			de_ImageToEdit.style.cursor = "";
			break;
		default :
			de_ClearSelectedToolbarButton();
			de_CurrMode = de_EditorModes.NotSet;
			de_ImageToEdit.style.cursor = "";			
			break;
	}
}

function de_ClearSelectedToolbarButton()
{
	for (var i = 0; i < de_ToolbarButtons.length; i++)
		de_ToolbarButtons[i].className = null;
}

function de_SetToolbarDimensionDisplay(width, height)
{
	var widthLabel = document.getElementById('widthLabel');
	widthLabel.innerHTML = width + "px";
	
	var heightLabel = document.getElementById('heightLabel');
	heightLabel.innerHTML = height + "px";
}

/******************************************************************************
 * Resize Functions
 ******************************************************************************/
var de_InitResizeCoords;
var de_InResize = false;
var de_InitResizeWidth;

function de_BeginResizeImage(evt)
{
	de_InitResizeCoords = de_GetEventScreenCoordinates(evt);
	de_InResize = true;
	de_InitResizeWidth = de_ImageToEdit.offsetWidth;
	//de_ClearCropBox();
}

function de_FinishResizeImage(evt)
{
	de_InResize = false;
	
	if (de_CropBox && de_CropBoxVisible)
	{
		// Save changed crop values
		de_PersistCropValues();
		
		// Reset crop boundaries to reflect new image size
		de_CropXMin = 0;
		de_CropXMax = de_CropXMin + de_ImageToEdit.offsetWidth;
		de_CropYMin = 0;
		de_CropYMax = de_CropYMin + de_ImageToEdit.offsetHeight;
	}
}

function de_PerformIncrementalResize(evt)
{
	if (de_InResize)
	{
		var currCoords = de_GetEventScreenCoordinates(evt);
		de_SetImageSize(de_InitResizeWidth + (currCoords.x - de_InitResizeCoords.x));
	}
}

function de_SetImageSize(width)
{
	var max = de_MaxResizeWidth;
	var min = de_MinResultWidth;
	
	if (de_CropBox && de_CropBoxVisible)
	{
		if (min < de_CropBox.offsetWidth)
			min = de_CropBox.offsetWidth; // Ensures that the image can't be resized smaller than the crop box
			
		var testWidth = de_CropBox.offsetHeight * de_ImageToEdit.offsetWidth / de_ImageToEdit.offsetHeight;
		if (min < testWidth)
			min = testWidth;
	}
	
	if (max > 0 && width > max)
		width = max;
	
	if (width >= min)
		de_ImageToEdit.style.width = width + "px";
	else
		de_ImageToEdit.style.width = min + "px";
	de_ImageToEdit.style.height = "";
	
	if (!de_CropBox || !de_CropBoxVisible)
		de_SetToolbarDimensionDisplay(de_ImageToEdit.offsetWidth, de_ImageToEdit.offsetHeight);
	
	if (de_ResizeWidthField)
		de_ResizeWidthField.setAttribute("value", de_ImageToEdit.offsetWidth);
	
	// Make sure crop box is not outside of image dimensions	
	if (de_CropBox && de_CropBoxVisible)
	{
		var deltaX = de_ImageToEdit.offsetWidth - de_CropBox.offsetWidth - de_CurrCropX;
		var deltaY = de_ImageToEdit.offsetHeight - de_CropBox.offsetHeight - de_CurrCropY;
		if (deltaX < 0 || deltaY < 0)
		{
			var left = de_CurrCropX + ((deltaX < 0) ? deltaX : 0);
			var top = de_CurrCropY + ((deltaY < 0) ? deltaY : 0);
			
			if (left < de_CropXMin)
				left = de_CropXMin;
			else if (left + de_CropBox.offsetWidth > de_CropXMax)
				left = de_CropXMax - de_CropBox.offsetWidth;

			if (top < de_CropYMin)
				top = de_CropYMin;
			else if (top + de_CropBox.offsetHeight > de_CropYMax)
				top = de_CropYMax - de_CropBox.offsetHeight;

			de_CurrCropX = left;
			de_CurrCropY = top;
			de_CropBox.style.left = left + "px";
			de_CropBox.style.top = top + "px";
		}
	}
}

/******************************************************************************
 * Crop Functions
 ******************************************************************************/
var de_CropBox = null;
var de_CropBoxVisible = false;
var de_InCrop = false;
var de_InitCropCoords;
var de_CropBoxBorderOffset = 2;
var de_CropXMin;
var de_CropXMax;
var de_CropYMin;
var de_CropYMax;
var de_CurrCropX;
var de_CurrCropY;

function de_EnsureCropBox()
{
	if (de_CropBox == null)
	{
		de_CropBox = document.createElement('div');
		de_CropBox.className = 'CropBox';
		de_ImageToEdit.offsetParent.appendChild(de_CropBox);
	}
} 

function de_BeginCropImage(evt)
{
	de_GetImageScrollOffsets();
	de_EnsureCropBox();
	de_InitCropCoords = de_GetEventScreenCoordinates(evt);
	de_InitCropCoords.x = de_InitCropCoords.x - de_ImageToEditLeft + de_GetOffsetX() + de_ScrollLeftOffset;
	de_InitCropCoords.y = de_InitCropCoords.y - de_ImageToEditTop + de_GetOffsetY() + de_ScrollTopOffset;
	
	de_CurrCropX = de_InitCropCoords.x;
	de_CurrCropY = de_InitCropCoords.y;

	de_CropBox.style.left = de_InitCropCoords.x + "px";
	de_CropBox.style.top = de_InitCropCoords.y + "px";
	de_CropBox.style.width = "1px";
	de_CropBox.style.height = "1px";
	de_CropBox.style.cursor = '';
	de_CropBox.style.display = '';
	de_CropBox.onmousedown = null;
	de_InCrop = true;
	de_CropBoxVisible = true;
	
	de_CropXMin = 0;
	de_CropXMax = de_CropXMin + de_ImageToEdit.offsetWidth;
	de_CropYMin = 0;
	de_CropYMax = de_CropYMin + de_ImageToEdit.offsetHeight;
}

function de_FinishCropImage(evt)
{
	de_InCrop = false;
	if (de_CropBox.offsetWidth <= 4 || de_CropBox.offsetHeight <= 4)
		de_ClearCropBox();
	else
	{
		de_CropBox.style.cursor = "move";
		de_CropBox.onmousedown = de_BeginCropMove;
		de_PersistCropValues();
	}
}

function de_PersistCropValues()
{
	if (de_CropXField)
		de_CropXField.setAttribute("value", de_CurrCropX);
	if (de_CropYField)
		de_CropYField.setAttribute("value", de_CurrCropY);
	if (de_CropWidthField)
		de_CropWidthField.setAttribute("value", de_CropBox.offsetWidth - de_CropBoxBorderOffset);
	if (de_CropHeightField)
		de_CropHeightField.setAttribute("value", de_CropBox.offsetHeight - de_CropBoxBorderOffset);
}

function de_PerformIncrementalCrop(evt)
{
	if (de_InCrop)
	{	
		var currCoords = de_GetEventScreenCoordinates(evt);
		currCoords.x = currCoords.x - de_ImageToEditLeft + de_GetOffsetX() + de_ScrollLeftOffset;
		currCoords.y = currCoords.y - de_ImageToEditTop + de_GetOffsetY() + de_ScrollTopOffset;
		
		var deltaX = currCoords.x - de_InitCropCoords.x;
		var deltaY = currCoords.y - de_InitCropCoords.y;
		var width = Math.abs(deltaX);
		var height = Math.abs(deltaY);
		var left = de_InitCropCoords.x;
		var top = de_InitCropCoords.y;
		
		if (deltaX < 0)
			left = currCoords.x;
		if (deltaY < 0)
			top = currCoords.y;
		
		de_CurrCropX = left;
		de_CurrCropY = top;
		
		if (de_CropAspectRatio.x && de_CropAspectRatio.y)
		{
			if (deltaX >= 0 && deltaY >= 0)
			{
				if (left + width > de_CropXMax - de_CropBoxBorderOffset)
					width = de_CropXMax - left - de_CropBoxBorderOffset;
				height = de_CropAspectRatio.y * width / de_CropAspectRatio.x;
				if (top + height > de_CropYMax - de_CropBoxBorderOffset)
				{
					height = de_CropYMax - top - de_CropBoxBorderOffset;
					width = de_CropAspectRatio.x * height / de_CropAspectRatio.y;
				}
				width = Math.floor(width);
				height = Math.floor(height);
				
				de_CropBox.style.left = left + "px";
				de_CropBox.style.width = width + "px";
				de_CropBox.style.top = top + "px";
				de_CropBox.style.height = height + "px";
				de_SetToolbarDimensionDisplay(width, height);
			}
		}
		else
		{	
			if (currCoords.x >= de_CropXMin && currCoords.x <= de_CropXMax - de_CropBoxBorderOffset)	
			{
				de_CropBox.style.left = left + "px";
				de_CropBox.style.width = width + "px";
			}
			else
				width = de_CropBox.offsetWidth;
			
			if (currCoords.y >= de_CropYMin && currCoords.y <= de_CropYMax - de_CropBoxBorderOffset)
			{
				de_CropBox.style.top = top + "px";
				de_CropBox.style.height = height + "px";
			}
			else
				height = de_CropBox.offsetHeight;
			de_SetToolbarDimensionDisplay(width, height);
		}
	}
}

function de_ClearCropBox()
{
	if (de_CropBox)
		de_CropBox.style.display = 'none';
	
	if (de_CropXField)
		de_CropXField.setAttribute("value", "0");
	if (de_CropYField)
		de_CropYField.setAttribute("value", "0");
	if (de_CropWidthField)
		de_CropWidthField.setAttribute("value", "0");
	if (de_CropHeightField)
		de_CropHeightField.setAttribute("value", "0");
		
	de_CropBoxVisible = false;
}

function de_InitCropBox()
{
	var left = de_CropXField.getAttribute("value");
	var top = de_CropYField.getAttribute("value");
	var width = de_CropWidthField.getAttribute("value");
	var height = de_CropHeightField.getAttribute("value");
	
	if (left && top && width && width != "0" && height && height != "0")
	{
		left = parseInt(left);
		top = parseInt(top);
		width = parseInt(width);
		height = parseInt(height);
		
		de_CurrCropX = left;
		de_CurrCropY = top;
		
		de_EnsureCropBox();
		
		de_CropXMin = 0;
		de_CropXMax = de_CropXMin + de_ImageToEdit.offsetWidth;
		de_CropYMin = 0;
		de_CropYMax = de_CropYMin + de_ImageToEdit.offsetHeight;
		
		de_CropBox.style.left = left + "px";
		de_CropBox.style.top = top + "px";
		de_CropBox.style.width = width + "px";
		de_CropBox.style.height = height + "px";
		de_CropBox.style.display = '';
		de_CropBox.style.cursor = "move";
		de_CropBox.onmousedown = de_BeginCropMove;
		
		de_SetToolbarDimensionDisplay(width, height);
	}
}

/******************************************************************************
 * Crop Move Functions
 ******************************************************************************/
var de_InitCropMoveCoords = null;
var de_InitCropMovePosition = null;
var de_InCropMove = false;
var de_CropMovePrevMode = null;
 
function de_BeginCropMove(evt)
{
	if (!evt && window.event)
		evt = window.event;
	
	de_CropMovePrevMode = de_CurrMode;
	de_CurrMode = de_EditorModes.CropMove;
	
	de_InitCropMoveCoords = de_GetEventScreenCoordinates(evt);
	de_InitCropMoveCoords.x -= de_ImageToEditLeft;
	de_InitCropMoveCoords.y -= de_ImageToEditTop;
	
	de_InitCropMovePosition = new Object();
	de_InitCropMovePosition.x = de_CurrCropX;
	de_InitCropMovePosition.y = de_CurrCropY;
	
	de_InCropMove = true;
}

function de_FinishCropMove(evt)
{
	de_CurrMode = de_CropMovePrevMode;
	de_InCropMove = false;
	de_PersistCropValues();
}

function de_PerformIncrementalCropMove(evt)
{
	if (de_InCropMove)
	{
		var currCoords = de_GetEventScreenCoordinates(evt);
		currCoords.x -= de_ImageToEditLeft;
		currCoords.y -= de_ImageToEditTop;
		
		var deltaX = currCoords.x - de_InitCropMoveCoords.x;
		var deltaY = currCoords.y - de_InitCropMoveCoords.y;
		
		var left = de_InitCropMovePosition.x + deltaX;
		var top = de_InitCropMovePosition.y + deltaY;
		
		if (left < de_CropXMin)
			left = de_CropXMin;
		else if (left + de_CropBox.offsetWidth > de_CropXMax)
			left = de_CropXMax - de_CropBox.offsetWidth;
			
		if (top < de_CropYMin)
			top = de_CropYMin;
		else if (top + de_CropBox.offsetHeight > de_CropYMax)
			top = de_CropYMax - de_CropBox.offsetHeight;
		
		de_CurrCropX = left;
		de_CurrCropY = top;
		de_CropBox.style.left = left + "px";
		de_CropBox.style.top = top + "px";
	}
}

/******************************************************************************
 * Document Event Handlers
 ******************************************************************************/
 function de_ImageEditorMouseMove(evt)
 {
	if (!evt && window.event)
		evt = window.event;
	
	switch (de_CurrMode)
	{
		case de_EditorModes.Resize :
			de_PerformIncrementalResize(evt);
			break;
		case de_EditorModes.Crop :
			de_PerformIncrementalCrop(evt);
			break;
		case de_EditorModes.CropMove :
			de_PerformIncrementalCropMove(evt);
			break;
	}
	
	if (de_UseIEBehavior)
		return de_CancelEventPropagation(evt, true);
	else
		return true;
 }
 document.onmousemove = de_ImageEditorMouseMove;
 
 function de_ImageEditorMouseUp(evt)
{
	if (!evt && window.event)
		evt = window.event;
	
	switch (de_CurrMode)
	{
		case de_EditorModes.Resize :
			de_FinishResizeImage(evt);
			break;
		case de_EditorModes.Crop :
			de_FinishCropImage(evt);
			break;
		case de_EditorModes.CropMove :
			de_FinishCropMove(evt);
			break;
	}
	
	return de_CancelEventPropagation(evt, true);
}
document.onmouseup = de_ImageEditorMouseUp;

function de_ImageEditorKeyDown(evt)
{
	if (!evt && window.event)
		evt = window.event;
		
	de_KeyHeld = (evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : null);
	
	if (de_KeyHeld == de_KeyCodes.Shift && !de_CropAspectRatio.x && !de_CropAspectRatio.y)
	{
		de_IsCropAspectRatioSetByShift = true;
		de_CropAspectRatio.x = 1;
		de_CropAspectRatio.y = 1;
	}
}
document.onkeydown = de_ImageEditorKeyDown;

function de_ImageEditorKeyUp(evt)
{
	if (de_IsCropAspectRatioSetByShift)
	{
		de_IsCropAspectRatioSetByShift = false;
		de_CropAspectRatio.x = 0;
		de_CropAspectRatio.y = 0;
	}
	de_KeyHeld = null;
}
document.onkeyup = de_ImageEditorKeyUp;

var de_IsLoaded = false;
function de_RegisterOnLoadHandler(handler)
{   
	if (de_IsLoaded)
		handler();
	else
	{
		var oldFunction = window.onload;
		if (typeof oldFunction != 'function')
		{
			window.onload = handler;
		}
		else
		{
			window.onload = function()
			{
				oldFunction();
				handler();
			};
		}
	}
}
de_RegisterOnLoadHandler(function() { de_IsLoaded = true; });