/**********************************************************
 Adapted from the sortable lists example by Tim Taylor
 http://tool-man.org/examples/sorting.html
 Modified by Tom Westcott : http://www.cyberdummy.co.uk 
 Modified by Liferay: http://www.liferay.com
 **********************************************************/
var DropZone = {
layerArray : new Array(),
dropList : new Array(),
initialized : false,
checkInit : function() {
if (!DropZone.initialized) {
DropZone.init();
DropZone.initialized = true;
};
},
add : function(itemId, dropOptions) {
/* Optiions
 * accept: array of class names that are allowed
 * inheritParent: inherit dimensions of the parent element
 * onDrop: executes when dropped
 * onHoverOver: continuously executes as item drags over container.
 * onHoverOut: executes when drag item leaves container
 */
DropZone.checkInit();
var item = $(itemId);
if (item) {
item.dropOptions = dropOptions || new Object();
item.dropOptions.dropItem = item;
            if (typeof(dropOptions.accept) == "string") {
                dropOptions.accept = dropOptions.accept.split(" ");
            }
DropZone.dropList.push(item);
}
},
init : function() {
this.layerArray[0] = new Array(); // body layer
this.layerArray[1] = new Array(); // Light box layer
this.dropList = this.layerArray[0];
},
switchLayer : function(layer) {
DropZone.checkInit();
if (layer == 0 || layer == 1) {
this.dropList = this.layerArray[layer];
}
}
}
var DragDrop = {
clone : null,
currentContainer : null,
insertIndex : -1,
instance : 0,
lastContainer : null,
track : null,
lastOnDrop : null,
lastSelected : null,
accepts : function(item, dropItem) {
var dropOptions = dropItem.dropOptions;
var rt = false;
if (dropOptions.accept) {
var accepts = dropOptions.accept;
for (var i = 0; i < accepts.length; i++) {
var re = new RegExp("\\b" + accepts[i] + "\\b");
if (Element.hasClassName(item, accepts[i])) {
rt = true;
break;
}
}
}
else {
// if accept is not specified, accept everything
rt = true;
}
return rt;
},
create : function(itemId, dragOptions) {
/* Options
 * container: (Object) container which may have scroll bars. Needed to correct offset.
 * forceDrop: (Object) force onDrop of most recent dropZone, starting with this
 * ghost: (boolean) make the dragging element transparent?
 * handle: (Object) handle for drag obj
 * highlightDropzones: (boolean) highlight dropzones
 * keepClone: (boolean) keep clone after drop?
 * revert: (boolean) return to original position after drop?
 * showClone: (boolean) show a cloned element?
 */
var item;
if(typeof(itemId) == "string") { item = document.getElementById(itemId); }
else if(typeof(itemId) == "object") { item = itemId; }
else { return; }
item.dragOptions = dragOptions ? dragOptions : new Object();
item.dragOptions.scrollOffset = new Coordinate(0,0);
Drag.makeDraggable(item, item.dragOptions.handle);
item.onDragStart = DragDrop.onDragStart;
item.onDrag = DragDrop.onDrag;
item.onDragEnd = DragDrop.onDragEnd;
item.threshold = 3;
},
onDragStart : function(nwPosition, sePosition, nwOffset, seOffset) {
var item = this;
},
onDrag : function(nwPosition, sePosition, nwOffset, seOffset) {
var item = this;
var opts = item.dragOptions;
/*================================================================================*
 * Initialize on first drag
 *================================================================================*/
if (!item.initialized) {
/* Clone the media item so that a place holder appears */
var body = document.getElementsByTagName("body")[0];
var itemContainer = item.parentNode;
var clone = DragDrop.clone;
//var itemNw = Coordinates.northwestOffset(item, true);
if (is_ie) {
setSelectVisibility("hidden");
}
opts.origWidth = item.style.width;
opts.origHeight = item.style.height;
opts.origPosition = item.style.position;
opts.origRevert = opts.revert;
opts.scrollOffset = new Coordinate(0,0);
if (opts.container) {
var container = $(opts.container);
opts.scrollOffset.x = container.scrollLeft;
opts.scrollOffset.y = container.scrollTop;
}
clone = DragDrop.clone = item.cloneNode(opts.showClone ? true : false);
if (!opts.showClone) {
clone.style.backgroundColor = "transparent";
}
clone.dragOptions = new cloneObject(opts);
clone.style.left = "";
clone.style.top = "";
clone.style.zIndex = 0;
if (!opts.showClone) {
clone.style.height = item.offsetHeight + "px";
clone.style.width = item.offsetWidth + "px";
}
item.dragOptions.clone = clone;
item.style.width = item.offsetWidth + "px";
item.style.height = item.offsetHeight + "px";
itemContainer.insertBefore(clone, item);
itemContainer.removeChild(item);
if (opts.showClone || opts.ghosting) {
Element.changeOpacity(item, 75);
}
item.style.position = "absolute";
item.style.zIndex = ZINDEX.DRAG_ITEM;
item.style.left = (nwOffset.x - opts.scrollOffset.x) + "px";
item.style.top = (nwOffset.y - opts.scrollOffset.y) + "px";
body.appendChild(item);
var dropList = DropZone.dropList;
dropList.each(function(item) {
if (item.dropOptions.inheritParent) {
item.style.height = item.parentNode.offsetHeight;
}
});
DragDrop.lastOnDrop = null;
item.initialized = true;
/*================================================================================
 * Initialization done
 *================================================================================*/
}
else {
item.style.left = (parseInt(item.style.left) - opts.scrollOffset.x) + "px";
item.style.top = (parseInt(item.style.top) - opts.scrollOffset.y) + "px";
 
/*
 * Find current DropZone container
 */
var dropList = DropZone.dropList;
DragDrop.currentContainer = null;
for (var i = 0; i < dropList.length; i++) {
var dropContainer = dropList[i];
// make sure container is still part of document
if (!dropContainer.parentNode || typeof(dropContainer) == "undefined") {
dropList.splice(i, 1);
i--;
continue;
}
var isInsideContainer = mousePos.insideObject(dropContainer, true);
if (DragDrop.accepts(item, dropContainer)) {
if (opts.highlightDropzones) {
dropContainer.style.backgroundColor = opts.highlightDropzones;
}
if (isInsideContainer) {
DragDrop.currentContainer = dropContainer;
DragDrop.lastOnDrop = dropContainer.dropOptions.onDrop;
}
}
}
var cur = DragDrop.currentContainer;
var last = DragDrop.lastContainer;
if (cur) {
if (typeof(cur.dropOptions.onHoverOver) != "undefined") {
cur.dropOptions.onHoverOver(item);
}
}
if (cur != last) {
if (last) {
Element.removeClassName(last, last.dropOptions.hoverclass);
if (typeof(last.dropOptions.onHoverOut) != "undefined") {
last.dropOptions.onHoverOut(item);
}
}
if (cur) {
if (cur.dropOptions.hoverclass && cur != item &&
DragDrop.accepts(item, cur)) {
Element.addClassName(cur, cur.dropOptions.hoverclass);
}
}
}
DragDrop.lastContainer = DragDrop.currentContainer;
}
},
onDragEnd : function(nwPosition, sePosition, nwOffset, seOffset) {
var item = this;
var opts = item.dragOptions;
if (item.initialized) {
/* Execute onDrop for container */
var dropItem = DragDrop.currentContainer;
if (dropItem && typeof(dropItem.dropOptions.onDrop) != "undefined") {
var dropOptions = dropItem.dropOptions;
if (DragDrop.accepts(item, dropItem)) {
dropOptions.onDrop(item, nwPosition, sePosition, nwOffset, seOffset);
dropItem.className = dropOptions.origClassName;
Element.removeClassName(dropItem, dropItem.dropOptions.hoverclass);
}
}
else if (opts.forceDrop && DragDrop.lastOnDrop) {
DragDrop.lastOnDrop();
}
var clone = DragDrop.clone;
var container = clone.parentNode;
if (opts.keepClone) {
DragDrop.create(clone, clone.dragOptions);
item.style.zIndex = "";
}
else {
if (opts.revert) {
/* Snap back to original position
 */
item.parentNode.removeChild(item);
item.style.width = opts.origWidth;
item.style.height = opts.origHeight;
item.style.position = opts.origPosition;
item.style.left = "";
item.style.top = "";
clone.style.display = "none";
container.insertBefore(item, clone);
}
container.removeChild(clone);
}
Element.changeOpacity(item, 100);
item.style.zIndex = "";
opts.scrollOffset = new Coordinate(0,0);
if (is_ie) {
setSelectVisibility("visible");
}
// restore original options (if changed)
DropZone.dropList.each(function(item) {
item.style.backgroundColor = "transparent";
if (item.dropOptions.inheritParent) {
item.style.height = "";
}
});
opts.revert = opts.origRevert;
item.initialized = false;
item.wasClicked = false;
}
else {
/* Item was not dragged.  Treat as onClick event */
item.wasClicked = true;
}
}
}
