function Trigger() { 
  try {
    var args = arguments;
    var handler = args[0]+"Handler";
    // status = handler;
    return eval(handler+"(args);");
  }
  catch (e) {
    // trigger probably doesn't exist;  
    //alert(e.message);
  }
  return true;
}
  
var InternalHorizontalPositionWithinParentBlock , InternalVerticalPositionWithinParentBlock;
var dragMe = null;
var dragMePrev = null;
var prevzIndex = 4;
// Set this before the DragDropInit, but after this declaration
var dragThese;

function DragDropInit()
{
  if (document.addEventListener)
	{
    for (var i = 0; i < dragThese.length; i++)
    {
      var elt = document.getElementById(dragThese[i]);
      if (elt != null) elt.addEventListener("mousedown" , Activate , false);
    }
	}
  else if (document.getElementById)
	{
    for (var i = 0; i < dragThese.length; i++)
    {
      var elt = document.getElementById(dragThese[i]);
      if (elt != null) elt.onmousedown = Activate;
    }
	}
  Trigger("OnInit");
}

function DragSetObj(obj)
{
  if (dragMe != null)
    dragMePrev = dragMe;
  dragMe = obj;  
}

function Drop (evt)
{
  if (document.removeEventListener)
	{
    document.removeEventListener("mousemove" , Drag , false);
    document.removeEventListener("mousedown" , Activate , false);
	}
	else
	{
    document.onmousemove = null;
	}
  if (dragging)
    Trigger("OnDropped", dragMe);
  
  dragging = false;
  //dragMe = null;
}


function Drag (evt)
{
  if (!evt) event.returnValue = false ;
  if (dragMe)
  {
    var left  = (evt && evt.clientX ? evt.clientX : event.clientX ? event.clientX : null) + (window.pageXOffset ? window.pageXOffset : document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft ? document.documentElement.scrollLeft : null) - InternalHorizontalPositionWithinParentBlock;
    var top = (evt && evt.clientY ? evt.clientY : event.clientY ? event.clientY : null) + (window.pageYOffset ? window.pageYOffset : document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop ? document.documentElement.scrollTop : null) - InternalVerticalPositionWithinParentBlock;
    Trigger("OnBeforeDrag", dragMe, left, top);
	  dragMe.style.left =  left + "px";
	  dragMe.style.top =  top + "px";
    status = document.documentElement.scrollTop;
    Trigger("OnAfterDrag", dragMe, left, top);
  }
}

var dragging = false;
function Activate (evt)
{
  Trigger("OnBeforeActivate", dragMe, dragMePrev);
	var ParentBorderWidth = !window.opera && document.all && document.compatMode ? 2 : 0 ;
	var ParentBorderHeight = !window.opera && document.all && document.compatMode ? 2 : 0 ;
	InternalHorizontalPositionWithinParentBlock = (evt && evt.layerX ? evt.layerX : window.event ? event.offsetX : null) + ParentBorderWidth;
	InternalVerticalPositionWithinParentBlock   = (evt && evt.layerY ? evt.layerY : window.event ? event.offsetY : null) + ParentBorderHeight;
  if (evt)
	{
  	evt.preventDefault();

// evt.preventDefault is more accurate than return false; it prevents selecting (reverse video) text-nodes

	  document.addEventListener("mousemove" , Drag , false);
	  document.addEventListener("mouseup" , Drop , false);
	}
	else if(window.event)
	{
	  document.onmouseup = Drop;
	  document.onmousemove = Drag;
	} 
  if (dragMePrev != null) 
    dragMePrev.style.zIndex = prevzIndex;
  prevzIndex = getZ(dragMe);
  dragMe.style.zIndex = 1000;
  dragging = true;
  Trigger("OnAfterActivate", dragMe);
}

function getZ(elt)
{
  var cStyle = null;
  if (elt.currentStyle) 
    cStyle = elt.currentStyle;
  else if (document.defaultView && document.defaultView.getComputedStyle)
    cStyle = document.defaultView.getComputedStyle(elt,"");
  var sNum;
  if (cStyle) 
    sNum = Number(cStyle.zIndex);
  else 
    sNum = Number(elt.style.zIndex);

  return sNum;
}



