/**
 * [c]Copyright: newmagic datensysteme gmbH[/c]
 * [a]Autor: Matthias Eipeldauer[/a]
 * [cre]Datum: 25.09.2008[/cre]
 * [desc]
 * Diese Kernel-Datei beinhaltet die Funktionen für Drag & Drop
 * [/desc]
 **/

include("coreInteractionHelper.js");

var oPreDrag = null;
var oDragTree = null;
var oDrag = null;
var oDragTree = null;
var oHover = null;


var timDragDropStyleSetter = null;
var xDragDOMNode = null;

// Prepare draglayer element
if (!document.getElementById("draglayer") && !mm8IsMSIE) document.write("<div id='draglayer' style='z-index:1000;'></div>");


function StartDrag(element)
{
  DisableSelection();
  if (oDrag || oPreDrag) return;
  if (!element.innerHTML) element = document.getElementById(element);
  oPreDrag = element.cloneNode(true);
//  console.log("StartDrag->" + oPreDrag.id);
  iDX = iPX;// - element.offsetLeft;
  iDY = iPY;// - element.offsetTop;
/*
  timDragDropStyleSetter = window.setTimeout("StartTriggeredDrag()", 150);
}

function StartTriggeredDrag()
{
  if (!oPreDrag) return;
*/  oDrag = oPreDrag;
  oPreDrag = null;
  xDragLayer = document.getElementById("draglayer");
  oDrag.style.position = "absolute";
  oDrag.style.left = iDX + "px";
  oDrag.style.top  = iDY + "px";
  xDragLayer.appendChild(oDrag);

  window.clearTimeout(timDragDropStyleSetter);
}

// Wird aufgerufen wenn die Maus bewegt wird  - und bewegt dadurch das oDrag-Objekt (wenn != null)
function DoDrag(EventArgs)
{
  if (!oDrag) return;
  if (!mm8MouseLeftDown) return;
  iPX = document.all ? window.event.clientX : EventArgs.pageX;
  iPY = document.all ? window.event.clientY : EventArgs.pageY;

  oDrag.style.left = iPX + "px";
  oDrag.style.top = iPY + "px";
  log(oDrag.style.left + "; " + oDrag.style.top);
//  oTemp = GetElementAt(iPX-iDX, iPY-iDY);
  oTemp = GetElementAt(iPX, iPY);
  if (oHover != oTemp)
  {
    if (oHover) ResetHover(oHover);
    oHover = oTemp;
  }
  if (oHover)
  {
    SetHover(oHover);
  }
}

function ResetHover(obj)
{
  obj.className = obj.className.replace(" " + sDragDropClassHover, "");
}

function SetHover(obj)
{
  if (obj.className.indexOf(sDragDropClassHover) < 0)
    obj.className += " " + sDragDropClassHover;
}

//Wird aufgerufen, wenn das mouseup Ereignis eintritt - das Objekt wird nicht weiter bewegt.
function StopDrag(EventArgs)
{
  window.clearTimeout(timDragDropStyleSetter);
  RestoreSelection();
  SetLastUserInteraction();

  document.getElementById("draglayer").innerHTML = "";  
  if (!oDrag) return;
  elem = oHover;
  if (elem)
  {
    ResetHover(oHover);
    try
    {
      sVal = elem.attributes["ondrop"].value.replace("elem", "oDrag").replace("this", "oHover").replace("tree", "oDragTree");
      eval(sVal);
    }
    catch(ex)
    {
      alert("DROP-ERROR: " + ex);
    }
  }
  oDrag.className = oDrag.className.replace(" moving", "");
  oDrag.style.left = "";
  oDrag.style.top = "";
  oDrag = null;
  oHover = null;
  oDragTree = null;
}

// mm8_kernel::RegísterEventHandler
RegisterEventHandler("mousemove", DoDrag);
RegisterEventHandler("mouseup",   StopDrag);

mm8Callback("coreDragDrop.js");
