Activsoft.Manager.register("activsoft.dragdrop");

activsoft.dragdrop.DragDropElement = function(
  graphicElement, 
  dataElement, 
  createDraggerMethod,
  isAuthorizedMethod
) {
  this._graphicElement = graphicElement;
  this._dataElement = dataElement;
  this._createDragger = createDraggerMethod;
  this._isAuthorized = isAuthorizedMethod;
  this.elementMoved = new YAHOO.util.CustomEvent("elementMoved" + graphicElement.getAttribute("id"), this);
  this.elementDropped = new YAHOO.util.CustomEvent("elementDropped" + graphicElement.getAttribute("id"), this);
}

activsoft.dragdrop.DragDropElement.prototype.getGraphicElement = function() {
  return this._graphicElement;
}

activsoft.dragdrop.DragDropElement.prototype.getDataElement = function() {
  return this._dataElement;
}

activsoft.dragdrop.DragDropManager = function() {
  this._dragger = null;
  this._isDragCopy = false;
  this._clicked = false;
  this._dragging = false;
  this._lastClicked = false;
  this._draggables = new Array();
  
  var monMan = this;
  YAHOO.util.Event.onDOMReady(function() {
    monMan.initBody();
  });
}

activsoft.dragdrop.DragDropManager.prototype.getDraggedElement = function() {
  return this._currentDraggedElement;
}

activsoft.dragdrop.DragDropManager.prototype.isDragging = function() {
  return this._dragging;
}

activsoft.dragdrop.DragDropManager.prototype.bodyMouseUp = function(evt) {
  var elTarget = YAHOO.util.Event.getTarget(evt);
  if (this._dragger) {
    this.endDrag(evt, elTarget);
  }
  this.deleteDragger();
  this.resetCursor();
  this._clicked = false;
}

activsoft.dragdrop.DragDropManager.prototype.initBody = function() {
  var monMan = this;
  YAHOO.util.Event.addListener(document.body, "mousemove", this.drag, this, true);
  YAHOO.util.Event.addListener(document.body, "mouseup", this.bodyMouseUp, this, true);
}

activsoft.dragdrop.DragDropManager.prototype.dragDrop = function(event, elem) {
  document.onselectstart = function() {return false;}
  document.ondragstart = function() {return false;}
  this._clicked = true;
  this._lastClicked = elem;
}

activsoft.dragdrop.DragDropManager.prototype.addElement = function(elem) {
  // ajout des évènements
  var monDiv = this;
  YAHOO.util.Event.addListener(elem._graphicElement.getAttribute("id"), "mousedown", function(evt, elem) {monDiv.dragDrop(evt, elem);}, elem);
  YAHOO.util.Event.addListener(elem._graphicElement.getAttribute("id"), "dragstart", function() {return false;});
  YAHOO.util.Event.addListener(elem._graphicElement.getAttribute("id"), "selectstart", function() {return false;});
  elem._graphicElement.onselectstart = function() {return false};
  elem._graphicElement.ondragstart = function() {return false};
  this._draggables[elem._graphicElement.getAttribute("id")] = elem;
}

activsoft.dragdrop.DragDropManager.prototype.deleteDragger = function(){
  if(this._dragger) {
    this._dragger.parentNode.removeChild(this._dragger);
    this._dragger = null;
    this._currentDraggedElement = null;
  }
  this._dragging = false;
  this._clicked = false;
}

activsoft.dragdrop.DragDropManager.prototype.drag = function(evt) {
  if(this._dragger) {
    var yy = evt.pageY;
    if(window.ActiveXObject) {
      yy = evt.clientY + document.documentElement.scrollTop;
    }
    this._dragger.style.left = (evt.clientX+2)+ 'px';
    this._dragger.style.top = (yy+2)+ 'px';
    this._currentDraggedElement.elementMoved.fire(YAHOO.util.Event.getTarget(evt));
    return false;
  }
  else {
    if(this._clicked) {
      this.beginDrag(this._lastClicked,evt);
    }
  }
}

activsoft.dragdrop.DragDropManager.prototype.resetCursor = function(){
  document.body.style.cursor = 'default';
}

activsoft.dragdrop.DragDropManager.prototype.copyElement = function(element,evt) {
  var el = document.createElement("div");
  var yy = evt.pageY;
  var xx = evt.clientX;
  if(window.ActiveXObject) {
    yy = evt.clientY + document.documentElement.scrollTop;
  }
  el.style.left = (xx+2)+ 'px';
  el.style.top = (yy+2)+ 'px';
  el.style.position = 'absolute';
  el.style.zIndex = 100000;
  var toDragger = element._createDragger(element._graphicElement, element._dataElement);
  if (toDragger) {
    this._currentDraggedElement = element;
    el.appendChild(toDragger);
    this._dragger = el;
    if (document.getElementById("divToAdd")) {
      document.getElementById("divToAdd").appendChild(this._dragger);
    }
    else {
      document.body.appendChild(this._dragger);
    }
    return true;
  } 
  else {
    return false;
  }
}

activsoft.dragdrop.DragDropManager.prototype.beginDrag = function(lastClicked,evt) {
  if (this.copyElement(lastClicked,evt)) {
    this._dragging = true;
    document.body.style.cursor = 'move';
  }
}



activsoft.dragdrop.DragDropManager.prototype.endDrag = function(evt, objDest) {
  var hasDragged = false;
  
  if(this._dragger && this._currentDraggedElement._isAuthorized(objDest)) {
  
    this._currentDraggedElement.elementDropped.fire(objDest, this._currentDraggedElement._graphicElement, this._currentDraggedElement._dataElement);
    this.resetAuthorizedDest = null;
    this.resetCursor();
    hasDragged = true;
  }
  this._dragging = false;
  this._clicked = false;
  return hasDragged;
}
