document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;
document.onmousedown = mouseDown;

var mouseOffset = null;
var iMouseDown  = false;
var lMouseState = false;

// Mondo variables
var currentSort = 0;
var targetSort  = 0;
var dragObject  = null;
var dropTargets = [];
var initialized = false;
var numPhotos = 0;

var m_profileid = 0;
var m_photoid = 0;
var m_sortorder = 0;


// Define the ajax
var registryPhotoAjaxObj;

function defineAjaxModule() {
   var registryPhotoAjaxObj=null;
   try {
      registryPhotoAjaxObj=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
   } catch (e) { // Internet Explorer
      try {
         registryPhotoAjaxObj=new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         registryPhotoAjaxObj=new ActiveXObject("Microsoft.XMLHTTP");
      }
   }
   return registryPhotoAjaxObj;
}


Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

// Mouse down
function mouseDown(){
   iMouseDown = true;
}

// Tools
function mouseCoords(ev){
   if(ev.pageX || ev.pageY){
      return {x:ev.pageX, y:ev.pageY};
   }
   return {
      x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
      y:ev.clientY + document.body.scrollTop  - document.body.clientTop
   };
}

function getMouseOffset(target, ev){
   ev = ev || window.event;

   var docPos    = getPosition(target);
   var mousePos  = mouseCoords(ev);
   return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
   var left = 0;
   var top  = 0;
   var count = 0;
   while (e.offsetParent){
      left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
      top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
      e     = e.offsetParent;
   }


   left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
   top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

   return {x:left, y:top}


}

function addDropTarget(dropTarget){
   dropTargets.push(dropTarget);
}

// Mouse move
function mouseMove(ev){
   ev           = ev || window.event;
   var mousePos = mouseCoords(ev);
   var hoveringOver = false;
   var hoveringOverId = '';
   var id_num = 0;

   if(dragObject){
      dragObject.style.position = 'absolute';
      dragObject.style.top      = (mousePos.y - mouseOffset.y) + 'px';
      dragObject.style.left     = (mousePos.x - mouseOffset.x) + 'px';

      for(var i=0; i<dropTargets.length; i++){
         var curTarget  = dropTargets[i];
         var targPos    = getPosition(curTarget);
         var targWidth  = parseInt(curTarget.offsetWidth);
         var targHeight = parseInt(curTarget.offsetHeight);
         var xPos = mousePos.x - mouseOffset.x;

         // Fix for offset
         var yPos = mousePos.y - mouseOffset.y + 12;


         if(
            (xPos > targPos.x)                &&
            (xPos < (targPos.x + targWidth))  &&
            (yPos > targPos.y)                &&
            (yPos < (targPos.y + targHeight))){

            // dragObject was dropped onto curTarget!
            hoveringOver = true;
            hoveringOverId = curTarget.id;

            // Deactivate all
            deactivateAll();

            // Obtain the ID
            id_num = getTargetID(curTarget.id);

            // MONDO
            if (id_num > currentSort)
               targetSort = id_num - 1;
            else
               targetSort = id_num;

            // Now display the dropzone
            document.getElementById("registry_dd_drop_" + id_num).style.display = 'inline';

            break;
         }
      }

      return false;
   }
}

function deactivateDrop(id) {
   document.getElementById('registry_dd_drop_' + id).style.display = 'none';
}

function activateDrop(id) {
   document.getElementById('registry_dd_drop_' + id).style.display = 'inline';
}

function deactivateAll() {
   // It is +1 because we have a div at the end
   for(var i=1; i<=numPhotos+1; i++)
      document.getElementById("registry_dd_drop_" + i).style.display = 'none';
}

function getTargetID(id) {
   var targetId = 0;

   if (id.indexOf('pre') >= 0) {
      targetId = parseInt(id.substr(23));
   } else if (id.indexOf('post') >= 0) {
      targetId = parseInt(id.substr(24));

      targetId++;
   }

   return targetId;
}


function getPictureID(id) {
   var tmpIndex = id.indexOf("container");

   // Obtain the profileid
   var tmp_m_profileid = id.indexOf("_", tmpIndex) + 1;
   var tmp_m_photoid = id.indexOf("_", tmp_m_profileid) + 1;
   var tmp_m_sortorder = id.indexOf("_", tmp_m_photoid) + 1;
   m_sortorder = id.substr(tmp_m_sortorder);

   return m_sortorder;

}

function definePictureID(id) {
   var tmpIndex = id.indexOf("container");

   // Obtain the profileid
   var tmp_m_profileid = id.indexOf("_", tmpIndex) + 1;
   var tmp_m_photoid = id.indexOf("_", tmp_m_profileid) + 1;
   var tmp_m_sortorder = id.indexOf("_", tmp_m_photoid) + 1;

   var l_profileid = tmp_m_photoid - tmp_m_profileid - 1;
   var l_photoid = tmp_m_sortorder - tmp_m_photoid - 1;

   m_profileid = id.substr(tmp_m_profileid, l_profileid);
   m_photoid = id.substr(tmp_m_photoid, l_photoid);
   m_sortorder = id.substr(tmp_m_sortorder);

}

function debugMsg(text) {
   var curText = document.getElementById("debug").value;

   curText = curText + "\n" + text;
   document.getElementById("debug").value = curText;

}

// Mouse up
function mouseUp(ev){
   ev           = ev || window.event;
   var mousePos = mouseCoords(ev);
   if (dragObject) {
      registry_photo_insertSortOrder(m_profileid, m_photoid, targetSort); 
      mouseOffset = null;
      iMouseDown  = false;
      lMouseState = false;

      // Mondo variables
      currentSort = 0;
      targetSort  = 0;
      dropTargets = [];
      initialized = false;
      numPhotos = 0;

      m_profileid = 0;
      m_photoid = 0;
      m_sortorder = 0;

      dragObject   = null;
   }

}

function CreateDragContainer(cObj){
   for(var j=0; j<cObj.childNodes.length; j++){
      var nodeName = cObj.childNodes[j].id;
      // Firefox puts in lots of #text nodes...skip these
      if (cObj.childNodes[j].nodeName == '#text')
         continue;

      if (nodeName.indexOf('registry_dd_photo_container') >= 0) {

         numPhotos++;

         var id_num = getPictureID(nodeName);

         // Set the pre and post targets
         var targetPre = document.getElementById('registry_dd_target_pre_' + id_num);
         var targetPost = document.getElementById('registry_dd_target_post_' + id_num);

         // Now push them as dropTarget
         dropTargets.push(targetPre);
         dropTargets.push(targetPost);

         // Now set the draggable
         var pstring = nodeName.indexOf('container');
         pstring = nodeName.substr(pstring);

         var drag = document.getElementById('registry_dd_grab_' + pstring);
         makeDraggable(drag);
      }
   }
}

function makeDraggable(item){
   if(!item) return;

   item.onmousedown = function(ev){
      // extract the vital information, then make entire container draggable
      var pstring = this.id.indexOf('container');
      pstring = this.id.substr(pstring);

      var dragObjectS = 'registry_dd_photo_' + pstring;


      //debugMsg("Set dragObject to: " + dragObjectS);

      dragObject = document.getElementById(dragObjectS);

      //dragObject  = this;
      //mouseOffset = getMouseOffset(this, ev);
      mouseOffset = getMouseOffset(dragObject, ev);

      // Set the variables
      definePictureID(dragObject.id);

      // Apply MONDO variables
      targetSort = m_sortorder;
      currentSort = m_sortorder;
      activateDrop(targetSort);

      if (ev) {
         mouseOffset.x = 11;
         mouseOffset.y = 11;
      } else {
         var scrollY = document.documentElement.scrollTop;
         var scrollX = document.documentElement.scrollLeft;
         mouseOffset.x = -scrollX + 11;
         mouseOffset.y = -scrollY + 11;
      }


      var evx = ev || window.event;
      var mousePos = mouseCoords(evx);
      dragObject.style.position = 'absolute';
      dragObject.style.top      = (mousePos.y - mouseOffset.y) + 'px';
      dragObject.style.left     = (mousePos.x - mouseOffset.x) + 'px';

      dragObject.style.opacity = '.6';
      if (navigator.appName.indexOf("Microsoft")!=-1&&parseInt(navigator.appVersion)>=4)
         dragObject.filters.alpha.opacity = '60';

      dragObject.style.MozOpacity = '0.6';

      return false;
   }
}

// Ajax
function registry_photo_insertSortOrder(profileid, photoid, targetsort) {
   registryPhotoAjaxObj = defineAjaxModule();

   if (registryPhotoAjaxObj == null) {
      return;
   }

   var salt = Math.floor(Math.random()*1000);
   salt = 'mma' + salt;

   var url = '/insertSortOrder/' + profileid + '/' + photoid + '/' + targetsort + '/' + salt + '/';

   registryPhotoAjaxObj.onreadystatechange=registry_photo_updateInfo;
   registryPhotoAjaxObj.open("GET", url);

   registryPhotoAjaxObj.send(null);
}


function registry_photo_updateInfo() {
   if (registryPhotoAjaxObj.readyState == 4) {
      document.getElementById('registry_photo_block').innerHTML = registryPhotoAjaxObj.responseText;
      CreateDragContainer( document.getElementById('registry_photo_block') );
   }
}

// On load
window.onload = function(){
   CreateDragContainer( document.getElementById('registry_photo_block') );
}

