/* Copyright Schools on the Net 2006. */

var DragDropGallery = {
	initElements : function() {
		forEachElementOfClass("dragdrop_gallery", function(gallery) {
			children = gallery.childNodes;

			for(var childIx = 0; childIx < children.length; childIx ++) {
				child = children[childIx];

				if(child.nodeType != 1) { // != ELEMENT
					continue;
				}

				// Add begin drag events.
				child.onmousedown = DragDropGallery._beginDrag;
				child.style.cursor = "move";
			}
		});
	},

	_beginDrag : function(e) {
		return DragDropBase._beginDrag(e, this, DragDropGallery._drag, DragDropGallery._endDrag, function(element) {
			DragDropGallery._elementIndex = indexOfElement(element, element.parentNode);
		});
	},

	_drag : function(e) {
		return DragDropBase._updateDrag(e, true, function(draggedElement, mousePosition) {
			// Locate the float closest to the cursor.
			var referenceElement = findClosestSiblingTo(draggedElement, mousePosition);

			if(referenceElement == null) {
				return;
			}

			if(referenceElement.element == draggedElement) {
				return;
			}

			var draggedElementParent = draggedElement.parentNode;

			// Find which side of the reference element the point is on.
			if(DragDropGallery._whichSideOfElement(referenceElement.element, mousePosition) < 0) {
				if(referenceElement.ix == DragDropGallery._elementIndex) {
					return;
				}

				// Move the dragged element to before the reference element.
				draggedElementParent.removeChild(draggedElement);
				draggedElementParent.insertBefore(draggedElement, referenceElement.element);
				DragDropGallery._elementIndex = referenceElement.ix;
			} else {
				if((referenceElement.ix + 1) == DragDropGallery._elementIndex) {
					return;
				}

				// Move the dragged element to after the reference element.
				draggedElementParent.removeChild(draggedElement);
				draggedElementParent.insertBefore(draggedElement, referenceElement.element.nextSibling);
				DragDropGallery._elementIndex = referenceElement.ix + 1;
			}
		});
	},

	_endDrag : function(e) {
		return DragDropBase._finishDrag(e, function(element) {
			var imageId = element.id.match(/[0-9]+/);
			if(imageId != null) {
				var elementIx = indexOfElement(element, element.parentNode);

				// Save new position.
				new Ajax.Request('/gallery/move/' + imageId,
					{
						parameters: "position=" + elementIx.toString(),
						asynchronous: true,
						onLoading: function() { document.getElementById('please_wait_'+imageId).style.display = 'block'; },
						onComplete: function() { document.getElementById('please_wait_'+imageId).style.display = 'none'; },
						onException : DragDropGallery._makeInsertAjaxError(element.parentNode)
					});
			}
		});
	},

	_makeInsertAjaxError : function(gallery) {
		return function(r, err) {
			var ajaxError = document.getElementById('ajax_error');
			var errMsg = "An error occured trying to save the new position!<br />If you're using Internet Explorer, you need to enable <strong>safe</strong> ActiveX controls and reload the page.";
			if(ajaxError != null) {
				ajaxError.parentNode.removeChild(ajaxError);
			}
			ajaxError = document.createElement("div");
			ajaxError.className = "errors";
			ajaxError.id = "ajax_error";
			ajaxError.innerHTML = errMsg;
			gallery.parentNode.insertBefore(ajaxError, gallery);
		};
	},

	_whichSideOfElement : function(elem, point) {
		var elemPosition = getElementsOverallPositionX(elem);
		if(point.x < (elemPosition + elem.offsetWidth / 2)) {
			return -1;
		} else {
			return 1;
		}
	},

	_elementIndex : 0
};

addOnLoad(DragDropGallery.initElements);
