blob: 873d63fadd8fc1e5fed27f1951693939833508c8 [file] [log] [blame]
dojo.provide("dojo.dnd.HtmlDragAndDrop");
dojo.require("dojo.dnd.HtmlDragManager");
dojo.require("dojo.dnd.DragAndDrop");
dojo.require("dojo.html.*");
dojo.require("dojo.html.display");
dojo.require("dojo.html.util");
dojo.require("dojo.html.selection");
dojo.require("dojo.html.iframe");
dojo.require("dojo.lang.extras");
dojo.require("dojo.lfx.*");
dojo.require("dojo.event.*");
dojo.declare("dojo.dnd.HtmlDragSource",dojo.dnd.DragSource,{dragClass:"",onDragStart:function(){
var _1=new dojo.dnd.HtmlDragObject(this.dragObject,this.type);
if(this.dragClass){
_1.dragClass=this.dragClass;
}
if(this.constrainToContainer){
_1.constrainTo(this.constrainingContainer||this.domNode.parentNode);
}
return _1;
},setDragHandle:function(_2){
_2=dojo.byId(_2);
dojo.dnd.dragManager.unregisterDragSource(this);
this.domNode=_2;
dojo.dnd.dragManager.registerDragSource(this);
},setDragTarget:function(_3){
this.dragObject=_3;
},constrainTo:function(_4){
this.constrainToContainer=true;
if(_4){
this.constrainingContainer=_4;
}
},onSelected:function(){
for(var i=0;i<this.dragObjects.length;i++){
dojo.dnd.dragManager.selectedSources.push(new dojo.dnd.HtmlDragSource(this.dragObjects[i]));
}
},addDragObjects:function(el){
for(var i=0;i<arguments.length;i++){
this.dragObjects.push(dojo.byId(arguments[i]));
}
}},function(_8,_9){
_8=dojo.byId(_8);
this.dragObjects=[];
this.constrainToContainer=false;
if(_8){
this.domNode=_8;
this.dragObject=_8;
this.type=(_9)||(this.domNode.nodeName.toLowerCase());
dojo.dnd.DragSource.prototype.reregister.call(this);
}
});
dojo.declare("dojo.dnd.HtmlDragObject",dojo.dnd.DragObject,{dragClass:"",opacity:0.5,createIframe:true,disableX:false,disableY:false,createDragNode:function(){
var _a=this.domNode.cloneNode(true);
if(this.dragClass){
dojo.html.addClass(_a,this.dragClass);
}
if(this.opacity<1){
dojo.html.setOpacity(_a,this.opacity);
}
var _b=_a.tagName.toLowerCase();
var _c=(_b=="tr");
if((_c)||(_b=="tbody")){
var _d=this.domNode.ownerDocument;
var _e=_d.createElement("table");
if(_c){
var _f=_d.createElement("tbody");
_e.appendChild(_f);
_f.appendChild(_a);
}else{
_e.appendChild(_a);
}
var _10=((_c)?this.domNode:this.domNode.firstChild);
var _11=((_c)?_a:_a.firstChild);
var _12=_10.childNodes;
var _13=_11.childNodes;
for(var i=0;i<_12.length;i++){
if((_13[i])&&(_13[i].style)){
_13[i].style.width=dojo.html.getContentBox(_12[i]).width+"px";
}
}
_a=_e;
}
if((dojo.render.html.ie55||dojo.render.html.ie60)&&this.createIframe){
with(_a.style){
top="0px";
left="0px";
}
var _15=document.createElement("div");
_15.appendChild(_a);
this.bgIframe=new dojo.html.BackgroundIframe(_15);
_15.appendChild(this.bgIframe.iframe);
_a=_15;
}
_a.style.zIndex=999;
return _a;
},onDragStart:function(e){
dojo.html.clearSelection();
this.scrollOffset=dojo.html.getScroll().offset;
this.dragStartPosition=dojo.html.getAbsolutePosition(this.domNode,true);
this.dragOffset={y:this.dragStartPosition.y-e.pageY,x:this.dragStartPosition.x-e.pageX};
this.dragClone=this.createDragNode();
this.containingBlockPosition=this.domNode.offsetParent?dojo.html.getAbsolutePosition(this.domNode.offsetParent,true):{x:0,y:0};
if(this.constrainToContainer){
this.constraints=this.getConstraints();
}
with(this.dragClone.style){
position="absolute";
top=this.dragOffset.y+e.pageY+"px";
left=this.dragOffset.x+e.pageX+"px";
}
dojo.body().appendChild(this.dragClone);
dojo.event.topic.publish("dragStart",{source:this});
},getConstraints:function(){
if(this.constrainingContainer.nodeName.toLowerCase()=="body"){
var _17=dojo.html.getViewport();
var _18=_17.width;
var _19=_17.height;
var _1a=dojo.html.getScroll().offset;
var x=_1a.x;
var y=_1a.y;
}else{
var _1d=dojo.html.getContentBox(this.constrainingContainer);
_18=_1d.width;
_19=_1d.height;
x=this.containingBlockPosition.x+dojo.html.getPixelValue(this.constrainingContainer,"padding-left",true)+dojo.html.getBorderExtent(this.constrainingContainer,"left");
y=this.containingBlockPosition.y+dojo.html.getPixelValue(this.constrainingContainer,"padding-top",true)+dojo.html.getBorderExtent(this.constrainingContainer,"top");
}
var mb=dojo.html.getMarginBox(this.domNode);
return {minX:x,minY:y,maxX:x+_18-mb.width,maxY:y+_19-mb.height};
},updateDragOffset:function(){
var _1f=dojo.html.getScroll().offset;
if(_1f.y!=this.scrollOffset.y){
var _20=_1f.y-this.scrollOffset.y;
this.dragOffset.y+=_20;
this.scrollOffset.y=_1f.y;
}
if(_1f.x!=this.scrollOffset.x){
var _20=_1f.x-this.scrollOffset.x;
this.dragOffset.x+=_20;
this.scrollOffset.x=_1f.x;
}
},onDragMove:function(e){
this.updateDragOffset();
var x=this.dragOffset.x+e.pageX;
var y=this.dragOffset.y+e.pageY;
if(this.constrainToContainer){
if(x<this.constraints.minX){
x=this.constraints.minX;
}
if(y<this.constraints.minY){
y=this.constraints.minY;
}
if(x>this.constraints.maxX){
x=this.constraints.maxX;
}
if(y>this.constraints.maxY){
y=this.constraints.maxY;
}
}
this.setAbsolutePosition(x,y);
dojo.event.topic.publish("dragMove",{source:this});
},setAbsolutePosition:function(x,y){
if(!this.disableY){
this.dragClone.style.top=y+"px";
}
if(!this.disableX){
this.dragClone.style.left=x+"px";
}
},onDragEnd:function(e){
switch(e.dragStatus){
case "dropSuccess":
dojo.html.removeNode(this.dragClone);
this.dragClone=null;
break;
case "dropFailure":
var _27=dojo.html.getAbsolutePosition(this.dragClone,true);
var _28={left:this.dragStartPosition.x+1,top:this.dragStartPosition.y+1};
var _29=dojo.lfx.slideTo(this.dragClone,_28,300);
var _2a=this;
dojo.event.connect(_29,"onEnd",function(e){
dojo.html.removeNode(_2a.dragClone);
_2a.dragClone=null;
});
_29.play();
break;
}
dojo.event.topic.publish("dragEnd",{source:this});
},constrainTo:function(_2c){
this.constrainToContainer=true;
if(_2c){
this.constrainingContainer=_2c;
}else{
this.constrainingContainer=this.domNode.parentNode;
}
}},function(_2d,_2e){
this.domNode=dojo.byId(_2d);
this.type=_2e;
this.constrainToContainer=false;
this.dragSource=null;
dojo.dnd.DragObject.prototype.register.call(this);
});
dojo.declare("dojo.dnd.HtmlDropTarget",dojo.dnd.DropTarget,{vertical:false,onDragOver:function(e){
if(!this.accepts(e.dragObjects)){
return false;
}
this.childBoxes=[];
for(var i=0,_31;i<this.domNode.childNodes.length;i++){
_31=this.domNode.childNodes[i];
if(_31.nodeType!=dojo.html.ELEMENT_NODE){
continue;
}
var pos=dojo.html.getAbsolutePosition(_31,true);
var _33=dojo.html.getBorderBox(_31);
this.childBoxes.push({top:pos.y,bottom:pos.y+_33.height,left:pos.x,right:pos.x+_33.width,height:_33.height,width:_33.width,node:_31});
}
return true;
},_getNodeUnderMouse:function(e){
for(var i=0,_36;i<this.childBoxes.length;i++){
with(this.childBoxes[i]){
if(e.pageX>=left&&e.pageX<=right&&e.pageY>=top&&e.pageY<=bottom){
return i;
}
}
}
return -1;
},createDropIndicator:function(){
this.dropIndicator=document.createElement("div");
with(this.dropIndicator.style){
position="absolute";
zIndex=999;
if(this.vertical){
borderLeftWidth="1px";
borderLeftColor="black";
borderLeftStyle="solid";
height=dojo.html.getBorderBox(this.domNode).height+"px";
top=dojo.html.getAbsolutePosition(this.domNode,true).y+"px";
}else{
borderTopWidth="1px";
borderTopColor="black";
borderTopStyle="solid";
width=dojo.html.getBorderBox(this.domNode).width+"px";
left=dojo.html.getAbsolutePosition(this.domNode,true).x+"px";
}
}
},onDragMove:function(e,_38){
var i=this._getNodeUnderMouse(e);
if(!this.dropIndicator){
this.createDropIndicator();
}
var _3a=this.vertical?dojo.html.gravity.WEST:dojo.html.gravity.NORTH;
var _3b=false;
if(i<0){
if(this.childBoxes.length){
var _3c=(dojo.html.gravity(this.childBoxes[0].node,e)&_3a);
if(_3c){
_3b=true;
}
}else{
var _3c=true;
}
}else{
var _3d=this.childBoxes[i];
var _3c=(dojo.html.gravity(_3d.node,e)&_3a);
if(_3d.node===_38[0].dragSource.domNode){
_3b=true;
}else{
var _3e=_3c?(i>0?this.childBoxes[i-1]:_3d):(i<this.childBoxes.length-1?this.childBoxes[i+1]:_3d);
if(_3e.node===_38[0].dragSource.domNode){
_3b=true;
}
}
}
if(_3b){
this.dropIndicator.style.display="none";
return;
}else{
this.dropIndicator.style.display="";
}
this.placeIndicator(e,_38,i,_3c);
if(!dojo.html.hasParent(this.dropIndicator)){
dojo.body().appendChild(this.dropIndicator);
}
},placeIndicator:function(e,_40,_41,_42){
var _43=this.vertical?"left":"top";
var _44;
if(_41<0){
if(this.childBoxes.length){
_44=_42?this.childBoxes[0]:this.childBoxes[this.childBoxes.length-1];
}else{
this.dropIndicator.style[_43]=dojo.html.getAbsolutePosition(this.domNode,true)[this.vertical?"x":"y"]+"px";
}
}else{
_44=this.childBoxes[_41];
}
if(_44){
this.dropIndicator.style[_43]=(_42?_44[_43]:_44[this.vertical?"right":"bottom"])+"px";
if(this.vertical){
this.dropIndicator.style.height=_44.height+"px";
this.dropIndicator.style.top=_44.top+"px";
}else{
this.dropIndicator.style.width=_44.width+"px";
this.dropIndicator.style.left=_44.left+"px";
}
}
},onDragOut:function(e){
if(this.dropIndicator){
dojo.html.removeNode(this.dropIndicator);
delete this.dropIndicator;
}
},onDrop:function(e){
this.onDragOut(e);
var i=this._getNodeUnderMouse(e);
var _48=this.vertical?dojo.html.gravity.WEST:dojo.html.gravity.NORTH;
if(i<0){
if(this.childBoxes.length){
if(dojo.html.gravity(this.childBoxes[0].node,e)&_48){
return this.insert(e,this.childBoxes[0].node,"before");
}else{
return this.insert(e,this.childBoxes[this.childBoxes.length-1].node,"after");
}
}
return this.insert(e,this.domNode,"append");
}
var _49=this.childBoxes[i];
if(dojo.html.gravity(_49.node,e)&_48){
return this.insert(e,_49.node,"before");
}else{
return this.insert(e,_49.node,"after");
}
},insert:function(e,_4b,_4c){
var _4d=e.dragObject.domNode;
if(_4c=="before"){
return dojo.html.insertBefore(_4d,_4b);
}else{
if(_4c=="after"){
return dojo.html.insertAfter(_4d,_4b);
}else{
if(_4c=="append"){
_4b.appendChild(_4d);
return true;
}
}
}
return false;
}},function(_4e,_4f){
if(arguments.length==0){
return;
}
this.domNode=dojo.byId(_4e);
dojo.dnd.DropTarget.call(this);
if(_4f&&dojo.lang.isString(_4f)){
_4f=[_4f];
}
this.acceptedTypes=_4f||[];
dojo.dnd.dragManager.registerDropTarget(this);
});