/**********************************************************
 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 D.A.Dokter http://www.gw20e.com/
 - enable nodrag items.
 - create dummy element to show new position of dragged li.
 - removed ondragout/ondragover/ondrag for lists

 **********************************************************/

var DragDrop = {

  // List containers
  //
  containers : new Array(),
  dummy : null,

  makeListContainer : function(list) {

    this.containers[this.containers.length] = list;

    var items = list.getElementsByTagName( "li" );

    for (var i = 0; i < items.length; i++) {
      className = items[i].className;
      if (className != 'nodrag' && className == 'mlango-viewlet') {
        DragDrop.makeItemDragable(items[i]);
      }
    }
  },

  // Make one single item dragable
  //
  makeItemDragable : function(item) {

    Drag.makeDraggable(item);

    draghandle = document.getElementById(item.id.substring(3) + "_title");
    item.setDragHandle(draghandle);

    item.setDragThreshold(5);

    // tracks if the item is currently outside all containers
    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

    for (var i= 0; i < DragDrop.containers.length; i++) {
      DragDrop.containers[i].northwest = Coordinates.northwestOffset(DragDrop.containers[i], true);
      DragDrop.containers[i].southeast = Coordinates.southeastOffset(DragDrop.containers[i], true);
    }

    DragUtils.updateDummySize(this);

    // Update self
    this.style.top = this.offsetTop + "px";
    this.style.left = this.offsetLeft + "px";
    this.style.position="absolute";

    this.parentNode.replaceChild(DragDrop.dummy, this);

    // Add to end.
    DragDrop.dummy.parentNode.appendChild(this);
  },

  // Main drag function
  onDrag : function(nwPosition, sePosition, nwOffset, seOffset) {

    nwOffset.x = nwOffset.x + parseInt(this.offsetWidth / 2);
    var parent = DragDrop.dummy.parentNode;

    for (var i= 0; i < DragDrop.containers.length; i++) {
      if (nwOffset.inside(DragDrop.containers[i].northwest, DragDrop.containers[i].southeast)
        && DragDrop.containers[i].id != DragDrop.dummy.parentNode.id) {

        // Need to move dummy to the new container

        DragDrop.dummy.parentNode.removeChild(DragDrop.dummy);
        parent = DragDrop.containers[i];

        break;
      }
    }

    var listItems = parent.getElementsByTagName("li");

    for (var j = 0; j < listItems.length; j++) {

      if (listItems[j].className == 'mlango-viewlet' && this.offsetTop < listItems[j].offsetTop) {
        parent.insertBefore(DragDrop.dummy, listItems[j]);
        return;
      }
	  }

	  parent.appendChild(DragDrop.dummy);
  },

  onDragEnd : function(nwPosition, sePosition, nwOffset, seOffset) {

    this.style["top"] = "0px";
    this.style["left"] = "0px";

    this.style.position = "relative";

    DragDrop.dummy.parentNode.replaceChild(this, DragDrop.dummy);
  }
};

var DragUtils = {

  updateDummySize : function(base) {
    DragDrop.dummy.style.height = base.offsetHeight + "px";
    DragDrop.dummy.style.width = base.offsetWidth + "px";
  },

  // Log into 'log' element
  //
  log : function(msg) {
    logger = document.getElementById("log");
    txt = document.createTextNode(msg);
    br = document.createElement("br");
    logger.appendChild(txt);
    logger.appendChild(br);
  }
};
