var isMSIE = document.attachEvent != null;
var isGecko = !document.attachEvent && document.addEventListener;

var draggingItem = new Object();
var drags = new Array();
var shift = 5;

function startDrag (event, _this, _afteraction, minX, maxX, minY, maxY, item, shadow) {
	var x,y;
	_this.style.zIndex = 10;
	draggingItem.This = _this;
	draggingItem.AfterAction = _afteraction;
	draggingItem.minX = minX;
	draggingItem.minY = minY;
	draggingItem.maxX = maxX;
	draggingItem.maxY = maxY;
	draggingItem.who = item;
	draggingItem.shadow =	shadow;
	
	drags[item] = _this;
	if (shadow != null) {
		shadow.className = "shadow-up";
		_this.style.top = parseInt(_this.style.top) - shift + "px";
		_this.style.left = parseInt(_this.style.left) - shift + "px";
	}

	var position = new Object();
	if (isMSIE) {
		x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	if (isGecko) {
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}

	draggingItem.cursorStartX = x;
	draggingItem.cursorStartY = y;

	draggingItem.StartLeft = parseInt (draggingItem.This.style.left);
	draggingItem.StartTop = parseInt (draggingItem.This.style.top);

	if (isNaN (draggingItem.StartLeft)) draggingItem.StartLeft = 0;
	if (isNaN (draggingItem.StartTop)) draggingItem.StartTop = 0;

	if (isMSIE) {
		document.attachEvent ("onmousemove", proceedDrag);
		document.attachEvent ("onmouseup", stopDrag);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (isGecko) {
		document.addEventListener ("mousemove", proceedDrag, true);
		document.addEventListener ("mouseup", stopDrag, true);
		event.preventDefault();
	}
}

function proceedDrag (event) {
	var x,y = 0;

	if (isMSIE) {
		x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	if (isGecko) {
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}	

	var nextX = draggingItem.StartLeft + x - draggingItem.cursorStartX;
	if (nextX < draggingItem.minX) nextX = draggingItem.minX;
	if (nextX > draggingItem.maxX) nextX = draggingItem.maxX;
	draggingItem.This.style.left = nextX + "px";

	var nextY = draggingItem.StartTop + y - draggingItem.cursorStartY;
	if (nextY > draggingItem.maxY) nextY = draggingItem.maxY;
	if (nextY < draggingItem.minY) nextY = draggingItem.minY;
	draggingItem.This.style.top = nextY + "px";

	if (isMSIE) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (isGecko) event.preventDefault();
}

function stopDrag (event) {	
	if (isMSIE) {
		document.detachEvent ("onmousemove", proceedDrag);
		document.detachEvent ("onmouseup", stopDrag);
	}
	if (isGecko) {
		document.removeEventListener ("mousemove", proceedDrag, true);
		document.removeEventListener ("mouseup", stopDrag, true);
	}

	if (draggingItem.AfterAction) draggingItem.AfterAction (draggingItem.This);
	saveDesktop(draggingItem.This);
	if (draggingItem.shadow != null) {
		draggingItem.shadow.className = "shadow";
		with (draggingItem.This.style) {
			top = parseInt(top) + shift + "px";
			left = parseInt(left) + shift + "px";
		}
	}
}

function setCookie (name, value, expire, path) {
	document.cookie = name + '=' + escape (value)
		+ ((expire == null)? '' : ('; expires=' + expire.toGMTString()))
		+ ((path == null)? '' : ('; path=' + path));
}

function saveDesktop(item) {
	var desktopLayout = '';
	for (var i in drags) {
		desktopLayout += i + '(' + parseInt (drags[i].style.left) + ',' + parseInt (drags[i].style.top) + ');';
	}
	
	var expires = new Date();
	expires = new Date (expires.getYear() + 1901, expires.getMonth(), 1);
	
	setCookie ('desktop', desktopLayout, expires, '/');
}

function putBack (item) {
	item.style.zIndex = 2;
}
