
var dragObject = {
	selectedObject : null,
	offsetX : 0,
	offsetY : 0,

	init : function() {
		var elems = [];
		elems = document.body.getElementsByTagName("*");
		for (var i = 0; i < elems.length; i++) {
			if ((elems[i].className).indexOf('draggable') != -1) {
				addEvent(elems[i], "mousedown", dragObject.startDrag, false);
			}
		}
	},

	startDrag : function(e) {
		if (isIE) e = dragObject.fixEvent(e);
		var t = dragObject.selectedObject = e.target;

		// in case event target is nested in draggable container
		while ((t.className != "draggable") && (t.parentNode))
			t = dragObject.selectedObject = t.parentNode;

		// Make dragged smiley show above other smileys
		t.style.zIndex = 10;

		// Get cursor position relative to the element (to adjust for later)
		dragObject.cursorOffsetX = e.layerX;
		dragObject.cursorOffsetY = e.layerY;

		if (window.event) {
			e.cancelBubble = true;
			e.returnValue = false;
		} else {
			e.stopPropagation();
			e.preventDefault();
		}

		addEvent(document, "mousemove", dragObject.dragMe, false);
		addEvent(document, "mouseup", dragObject.dropMe, false);

		return false;
	},

	dragMe : function(e) {
		var e = e || window.event;

		dragObject.selectedObject.style.left = dragObject.getX(e) - dragObject.cursorOffsetX + 'px';
		dragObject.selectedObject.style.top = dragObject.getY(e) - dragObject.cursorOffsetY + 'px';

		if (window.event) {
			e.cancelBubble = true;
			e.returnValue = false;
		} else {
			e.stopPropagation();
			e.preventDefault();
		}

		return false;
	},

	dropMe : function(e) {
		var e = e || window.event;

		if (dragObject.selectedObject.id != 'js')
			checkSmileyDrop(dragObject, dragObject.getX(e), dragObject.getY(e));

		// Restore original zIndex to prevent piece from disappear below solved pieces
		dragObject.selectedObject.style.zIndex = 1;

		removeEvent(document, "mousemove", dragObject.dragMe, false);
		removeEvent(document, "mouseup", dragObject.dropMe, false);

		dragObject.selectedObject = null;
	},

	// Local Helpers

	getX : function(e) {
		// Check for W3C position, then the IE position
		return e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
	},

	getY : function(e) {
		// Check for W3C position, then the IE position
		return e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
	},

	fixEvent : function(e)  {
		// Make all the IE-centric parameters be W3C-like
		e = window.event;
		e.target = e.srcElement;
		e.layerX = e.offsetX; // Cursor position relative to the element; W3C/IE
		e.layerY = e.offsetY; // Cursor position relative to the element; W3C/IE
		return e;
	}
};


