var __aspxDragHelper = null;
ASPxClientDragHelper = _aspxCreateClass(null, {
 constructor: function(e, root, clone){
  if(__aspxDragHelper != null) __aspxDragHelper.cancelDrag();
  this.dragArea = 5;
  this.lastX = e.clientX + _aspxGetDocumentScrollLeft();
  this.lastY = e.clientY + _aspxGetDocumentScrollTop();
  this.canDrag = true; 
  if(typeof(root) == "string") 
   root = _aspxGetParentByTagName(_aspxGetEventSource(e), root);
  this.obj = root && root != null ? root : _aspxGetEventSource(e);
  this.clone = clone;
  this.dragObj = null; 
  this.additionalObj = null;
  this.onDoClick = new Function();
  this.onEndDrag = new Function();
  this.onCancelDrag = new Function();
  this.onDragDivCreating = new Function();
  this.onCloneCreating = null;
  this.onCloneCreated = new Function();
  this.dragDiv = null;
  __aspxDragHelper = this;
 }, 
 drag: function(e) {
  if(!this.canDrag) return;
  if(!this.isDragging()) {
   if(!this.isOutOfDragArea(e.clientX, e.clientY)) 
    return;
   this.startDragCore(e);
  }
  if(__aspxIE && !_aspxGetIsLeftButtonPressed(e)) {
   this.cancelDrag(e);
   return;
  }
  this.clearSelection();
  if(!__aspxIE)
   _aspxSetElementSelectionEnabled(document.body, false);
  this.dragCore(e);
 },
 clearSelection: function() {
  if(!window.getSelection) return;
  var sel = window.getSelection(); 
  if(sel && sel.removeAllRanges) {
   sel.removeAllRanges() ; 
  }
 },
 startDragCore: function(e) {  
  this.dragObj = this.clone != true ? this.obj : this.createClone();
 },
 dragCore: function(e) {    
  var x = e.clientX + _aspxGetDocumentScrollLeft();
  var y = e.clientY + _aspxGetDocumentScrollTop();  
  var nx = this.dragObj.offsetLeft + x - this.lastX;
  var ny = this.dragObj.offsetTop + y - this.lastY;
  this.dragObj.style.left = nx + "px";
  this.dragObj.style.top = ny + "px";
  this.lastX = x;
  this.lastY = y;
 },
 endDrag: function(e) { 
  if(!this.isDragging() && !this.isOutOfDragArea(e.clientX, e.clientY)) 
   this.onDoClick(this);
  else this.onEndDrag(this);
  this.cancelDrag();
 },
 cancelDrag: function() {
  if(this.dragDiv != null) {
   document.body.removeChild(this.dragDiv);
   this.dragDiv = null;
  }
  this.onCancelDrag(this);
  __aspxDragHelper = null;
  if(!__aspxIE)
   _aspxSetElementSelectionEnabled(document.body, true);
 },
 isDragging: function() {
  return this.dragObj != null;
 },
 createClone: function() {
  this.dragDiv = document.createElement("div");
  this.onDragDivCreating(this, this.dragDiv);
  this.dragDiv.style.position = "absolute";
  this.dragDiv.style.cursor = "move";
  this.dragDiv.style.left = _aspxGetAbsoluteX(this.obj) + "px";
  this.dragDiv.style.top = _aspxGetAbsoluteY(this.obj) + "px";
  this.dragDiv.style.width = this.obj.offsetWidth + "px";
  this.dragDiv.style.height = this.obj.offsetHeight + "px";
  this.dragDiv.select = DragHelper_onselectstart;
  this.dragDiv.style.zIndex = 20000; 
  this.dragDiv.style.padding = "0px";
  this.dragDiv.style.margin = "0px";
  this.dragDiv.style.borderStyle = "none";
  this.dragDiv.style.borderWidth = "0px";
  this.dragDiv.style.backgroundColor = "transparent";
  var clone = this.creatingClone();
  this.onCloneCreated(clone);
  this.dragDiv.appendChild(clone);
  document.body.appendChild(this.dragDiv);
  return this.dragDiv;
 },
 creatingClone: function() {
  var clone = this.obj.cloneNode(true);
  if(!_aspxIsExists(this.onCloneCreating)) return clone;
  return this.onCloneCreating(clone);
 },
 addElementToDragDiv: function(element) {
  if(this.dragDiv == null) return;
  this.additionalObj = element.cloneNode(true);
  this.additionalObj.style.visibility = "visible";
  this.additionalObj.style.display = "";
  this.additionalObj.style.top = "";
  this.dragDiv.appendChild(this.additionalObj);
 },
 removeElementFromDragDiv: function() {
  if(this.additionalObj == null || this.dragDiv == null) return;
  this.dragDiv.removeChild(this.additionalObj);
  this.additionalObj = null;
 },
 isOutOfDragArea: function(newX, newY) {
  return Math.max(
   Math.abs(newX + _aspxGetDocumentScrollLeft() - this.lastX), 
   Math.abs(newY + _aspxGetDocumentScrollTop() - this.lastY)) >= this.dragArea;
 }
});
function DragHelper_onmouseup(e) {
 if(__aspxDragHelper != null) {
  __aspxDragHelper.endDrag(e);
  return true;
 }
}
function DragHelper_onmousemove(e) {
 if(__aspxDragHelper != null) {
  __aspxDragHelper.drag(e);
  return true;
 }
}
function DragHelper_onkeydown(e) {
 if(__aspxDragHelper == null) return;
 if(e.keyCode == ASPxKey.Esc) {
  if(_aspxIsExists(__aspxDragHelper.onEscKeyDown))
   __aspxDragHelper.onEscKeyDown();
  else
   __aspxDragHelper.cancelDrag();
 }
 return true;
}
function DragHelper_onselectstart(e) {
 if(__aspxDragHelper != null) {
  if(!__aspxDragHelper.canDrag)
   return true;
  try {
   document.selection.empty();
  } catch(e) {
  }
  return false;
 }
}
_aspxAttachEventToDocument("mouseup", DragHelper_onmouseup);
_aspxAttachEventToDocument("mousemove", DragHelper_onmousemove);
_aspxAttachEventToDocument("keydown", DragHelper_onkeydown);
_aspxAttachEventToDocument("selectstart", DragHelper_onselectstart);
var __aspxCursorTargets = null;
ASPxClientCursorTargets = _aspxCreateClass(null, {
 constructor: function() {
  this.list = new Array();
  this.starttargetElement = null;
  this.starttargetTag = 0;
  this.oldtargetElement = null;
  this.oldtargetTag = 0;
  this.targetElement = null;
  this.targetTag = 0;
  this.x = 0;
  this.y = 0;
  this.removedX = 0;
  this.removedY = 0;
  this.removedWidth = 0;
  this.removedHeight = 0;
  this.onTargetChanging = new Function();
  this.onTargetChanged = new Function();
  this.onTargetAdding = null;
  __aspxCursorTargets = this;
 },
 addElement: function(element) {
  if(!this.canAddElement(element)) return null;
  var target = new ASPxClientCursorTarget(element);
  this.list.push(target);
  return target;
 },
 removeElement: function(element) {
  for(var i = 0; i < this.list.length; i++)
   if(this.list[i].element == element) {
    this.list.splice(i, 1);
    return;
   }
 },
 addParentElement: function(parent, child) {
  var target = this.addElement(parent);
  if(target != null) {
   target.targetElement = child;
  }
  return target;
 },
 RegisterTargets: function(element, idPrefixArray) {
  this.addFunc = this.addElement;
  this.RegisterTargetsCore(element, idPrefixArray);
 },
 UnregisterTargets: function(element, idPrefixArray) {
  this.addFunc = this.removeElement;
  this.RegisterTargetsCore(element, idPrefixArray);
 },
 RegisterTargetsCore: function(element, idPrefixArray) {
  if(element == null) return;  
  for(var i = 0; i < idPrefixArray.length; i++) 
   this.RegisterTargetCore(element, idPrefixArray[i]);
 },
 RegisterTargetCore: function(element, idPrefix) {
  if(!_aspxIsExists(element.id)) return;
  if(element.id.indexOf(idPrefix) > -1) 
   this.addFunc(element);
  for(var i = 0; i < element.childNodes.length; i ++) 
   this.RegisterTargetCore(element.childNodes[i], idPrefix);
 },
 canAddElement: function(element) {
  if(element == null || !_aspxGetElementDisplay(element))
   return false;
  for(var i = 0; i < this.list.length; i ++) {
   if(this.list[i].targetElement == element) return false;
  }
  if(this.onTargetAdding != null && !this.onTargetAdding(this, element)) return false;
  return element.style.visibility != "hidden";
 },
 removeInitialTarget: function(x, y) {
  var el = this.getTarget(x  + _aspxGetDocumentScrollLeft(), y  + _aspxGetDocumentScrollTop());
  if(el == null) return;
  this.removedX = _aspxGetAbsoluteX(el);
  this.removedY = _aspxGetAbsoluteY(el);
  this.removedWidth = el.offsetWidth;
  this.removedHeight = el.offsetHeight;
 },
 getTarget: function(x, y) {
  for(var i = 0; i < this.list.length; i ++) {
   if(this.list[i].contains(x, y))
    return this.list[i].targetElement;
  }
  return null;
 },
 targetChanged: function(element, tag) {
  this.targetElement = element;
  this.targetTag = tag; 
  this.onTargetChanging(this);
  if(this.oldtargetElement != this.targetElement || this.oldtargetTag != this.targetTag) {
   this.onTargetChanged(this);
   this.oldtargetElement = this.targetElement;
   this.oldtargetTag = this.targetTag;
  }
 },
 cancelChanging: function() {
  this.targetElement = this.oldtargetElement;
  this.targetTag = this.oldtargetTag;
 },
 isLeftPartOfElement: function() {
  if(this.targetElement == null) return true;
  var left = this.x - this.targetElementX();
  return left < this.targetElement.offsetWidth / 2; 
 },
 isTopPartOfElement: function() {
  if(this.targetElement == null) return true;
  var top = this.y - this.targetElementY();
  return top < this.targetElement.offsetHeight / 2; 
 },
 targetElementX: function() {
  return this.targetElement != null ? _aspxGetAbsoluteX(this.targetElement) : 0;
 },
 targetElementY: function() {
  return this.targetElement != null ? _aspxGetAbsoluteY(this.targetElement) : 0;
 },
 onmousemove: function(e) {
  this.doTargetChanged(e); 
 },
 onmouseup: function(e) { 
  this.doTargetChanged(e); 
  __aspxCursorTargets = null; 
 },
 doTargetChanged: function(e) {
  this.x = e.clientX + _aspxGetDocumentScrollLeft();
  this.y = e.clientY + _aspxGetDocumentScrollTop();
  if(this.inRemovedBounds(this.x, this.y)) return; 
  this.targetChanged(this.getTarget(this.x, this.y), 0); 
 },
 inRemovedBounds: function(x, y) {
  if(this.removedWidth == 0) return false;
  return x > this.removedX && x < (this.removedX + this.removedWidth) &&
   y > this.removedY && y < (this.removedY + this.removedHeight);
 }
});
ASPxClientCursorTarget = _aspxCreateClass(null, {
 constructor: function(element) {
  this.element = element;
  this.targetElement = element;
  this.absoluteX = _aspxGetAbsoluteX(element);
  this.absoluteY = _aspxGetAbsoluteY(element);
 },
 contains: function(x, y) {
  return x >= this.absoluteX && x <= this.absoluteX + this.element.offsetWidth &&
   y >= this.absoluteY && y <= this.absoluteY + this.element.offsetHeight;
 }
});
function CursorTarget_onmouseup(e) {
 if(__aspxCursorTargets != null) {
  __aspxCursorTargets.onmouseup(e);
  return true;
 }
}
function CursorTarget_onmousemove(e) {
 if(__aspxCursorTargets != null) {
  __aspxCursorTargets.onmousemove(e);
  return true;
 }
}
_aspxAttachEventToDocument("mouseup", CursorTarget_onmouseup);
_aspxAttachEventToDocument("mousemove", CursorTarget_onmousemove);

