/********************************************************** 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 DragDrop = {firstContainer : null,lastContainer : null,    parent_id : null,    parent_group : null,portletClassName: "portlet-boundary",makeListContainer : function(list, group) {// each container becomes a linked list nodeif (this.firstContainer == null) {this.firstContainer = this.lastContainer = list;list.previousContainer = null;list.nextContainer = null;} else {list.previousContainer = this.lastContainer;list.nextContainer = null;this.lastContainer.nextContainer = list;this.lastContainer = list;}// these functions are called when an item is draged over// a container or out of a container bounds.  onDragOut// is also called when the drag ends with an item having// been added to the container        list.group = group;list.defaultClassName = "layout-column-default";list.highlightClassName = "layout-column-highlight";    	var items = list.childNodes;    	var items2;var curItem = null;var foundHandle = false;var j = 0;    	for (var i = 0; i < items.length; i++) {curItem = items[i];// Make all children relative, even if not draggableif (curItem.nodeName == "DIV" && curItem.style.position != "relative")curItem.style.position = "relative";if (curItem.className == DragDrop.portletClassName) {if (!curItem.isStatic && !portletDraggingDisabled) {// if it's not static, make it moveableitems2 = curItem.getElementsByTagName( "DIV" );foundHandle = false;for (j = 0; j < items2.length; j++) {if (items2[j].className == "portlet-title") {items2[j].style.cursor= "move";foundHandle = true;break;}}if (foundHandle)DragDrop.makeItemDragable(curItem, items2[j]);}else if (curItem.isStatic) {// otherwise, keep track of the static onesif (curItem.isStaticStart) {list.startPlaceholder = curItem;}else if (!list.endPlaceholder && curItem.isStaticEnd) {list.endPlaceholder = curItem;}}}else if (curItem.className && curItem.className.search("layout-blank") >= 0) {curItem.isStatic = true;curItem.isStaticEnd = true;curItem.isStaticStart = false;// count the bottom blank portlet as the end placeholderif (!list.endPlaceholder) {list.endPlaceholder = curItem;}}}},        serData : function ( group, theid ) {var container = DragDrop.firstContainer;var j = 0;var string = "";var className = "";while (container != null) {if(theid != null && container.id != theid){  container = container.nextContainer;  continue;}if(group != null && container.group != group){  container = container.nextContainer;  continue;}j ++;if(j > 1){  string += ":";}string += container.id;var items = container.getElementsByTagName( "DIV" );// Assume the 1st DIV is the dragable elementstring += "(";for (var i = 0; i < items.length; i++) {if (items[i].className == DragDrop.portletClassName) {if(i > 0){string += ",";}string += items[i].id;}}string += ")";container = container.nextContainer;}return string;       },makeItemDragable : function(item, handle) {Drag.makeDraggable(item, handle);item.setDragThreshold(5);// tracks if the item is currently outside all containersitem.isOutside = false;item.onDragStart = DragDrop.onDragStart;item.onDrag = DragDrop.onDrag;item.onDragEnd = DragDrop.onDragEnd;},onDragStart : function(nwPosition, sePosition, nwOffset, seOffset) {// update all container bounds, since they may have changed// on a previous drag// could be more smart about when to do thisvar container = DragDrop.firstContainer;while (container != null) {container.northwest = Coordinates.northwestOffset( container, true );container.southeast = Coordinates.southeastOffset( container, true );container = container.nextContainer;}// item starts out over current parentthis.parentNode.className = this.parentNode.highlightClassName;        parent_id = this.parentNode.id;        parent_group = this.parentNode.group;// Keep track of original neighbor, so it can "snap" back laterstart_next = DragUtils.nextItem(this);},onDrag : function(nwPosition, sePosition, nwOffset, seOffset) {// check if we were nowhereif (this.isOutside) {// check each container to see if in its boundsvar container = DragDrop.firstContainer;while (container != null) {if (nwOffset.inside( container.northwest, container.southeast )  && container.group == parent_group) {// we're inside this onecontainer.className = container.highlightClassName;this.isOutside = false;// since isOutside was true, the current parent is a// temporary clone of some previous container node and// it needs to be removed from the documentvar tempParent = this.parentNode;tempParent.removeChild( this );container.appendChild( this );tempParent.parentNode.removeChild( tempParent );// Update boundariescontainer.southeast = Coordinates.southeastOffset( container, true );break;}container = container.nextContainer;}// we're still not inside the bounds of any containerif (this.isOutside)return;// check if we're outside our parent's bounds}else if (!nwOffset.inside( this.parentNode.northwest, this.parentNode.southeast )) {this.parentNode.className = this.parentNode.defaultClassName;this.isOutside = true;// check if we're inside a new container's boundsvar container = DragDrop.firstContainer;while (container != null) {if (nwOffset.inside( container.northwest, container.southeast ) && container.group == parent_group) {// we're inside this onecontainer.className = container.highlightClassName;this.isOutside = false;this.parentNode.removeChild( this );container.appendChild( this );// Update boundariescontainer.southeast = Coordinates.southeastOffset( container, true );break;}container = container.nextContainer;}// if we're not in any container now, make a temporary clone of// the previous container node and add it to the documentif (this.isOutside) {var tempParent = this.parentNode.cloneNode( false );this.parentNode.removeChild( this );tempParent.appendChild( this );// body puts a border or item at bottom of page if do// not have this                tempParent.style.border = 0;document.getElementsByTagName( "body" ).item(0).appendChild( tempParent );return;}}// if we get here, we're inside some container bounds, so we do// everything the original dragsort script did to swap us into the// correct positionvar parent = this.parentNode;var item = this;var next = DragUtils.nextItem(item);while (next != null && this.offsetTop >= next.offsetTop - 2) {var item = next;var next = DragUtils.nextItem(item);}if (this != item && !item.isStatic) {DragUtils.swap(this, next);return;}var item = this;var previous = DragUtils.previousItem(item);if (next == null) {while (previous != null && previous.isStatic && previous.isStaticEnd) {item = previous;previous = DragUtils.previousItem(item);DragUtils.swap(this, item);}}while (previous != null && this.offsetTop <= previous.offsetTop + 2) {item = previous;previous = DragUtils.previousItem(item);}if (this != item && !item.isStatic) {DragUtils.swap(this, item);return;}},onDragEnd : function(nwPosition, sePosition, nwOffset, seOffset) {// if the drag ends and we're still outside all containers// it's time to remove ourselves from the document or add         // to the trash binif (this.isOutside) {var container = DragDrop.firstContainer;while (container != null) {   if(container.id == parent_id)   { break;   }   container = container.nextContainer;}this.isOutside = false;this.parentNode.removeChild( this );container.insertBefore( this, start_next );            this.style["top"] = "0px";    this.style["left"] = "0px";return;}var position = 0;var positionFound = false;var container = DragDrop.firstContainer;var items = null;// Find the new position of the portletwhile (container != null) {items = container.childNodes;position = 0;for (var i=0; i<items.length; i++) {if (items[i].className == DragDrop.portletClassName) {if (items[i].portletId == this.portletId) {positionFound = true;break;}if (!items[i].isStatic)position++;}}if (positionFound)break;container = container.nextContainer;}movePortlet(container.layoutId, this.portletId, container.columnOrder, position);this.parentNode.className = this.parentNode.defaultClassName;      	this.style["top"] = "0px";this.style["left"] = "0px";}};var DragUtils = {swap : function(item1, item2) {var parent = item1.parentNode;parent.removeChild(item1);parent.insertBefore(item1, item2);item1.style["top"] = "0px";item1.style["left"] = "0px";},nextItem : function(item) {var sibling = item.nextSibling;while (sibling != null) {if (sibling.nodeName == item.nodeName) return sibling;sibling = sibling.nextSibling;}return null;},previousItem : function(item) {var sibling = item.previousSibling;while (sibling != null) {if (sibling.nodeName == item.nodeName) return sibling;sibling = sibling.previousSibling;}return null;}		};