var skok = 1;
function Drag( dragEnvoker, dragParent, dir /* local vars declaration */,d,E,b,t,v ) {
	d=document;E=d.documentElement;b=d.body;t=this;t.ie=d.all?true:false;
	if(!E||!(dragEnvoker=$(dragEnvoker)))return!1;
	dragEnvoker.onmousedown=function(e){if(gTarget(e)!=this)return;if( t._onDragStart ) t._onDragStart();t.startDrag(e);}
	t.innerX=gP(dragEnvoker);
	t.innerY=gP(dragEnvoker,1)
	if(dragParent)while((dragEnvoker=dragEnvoker.parentNode)&&!new RegExp(dragParent).test(dragEnvoker.id));
	if( typeof (t.dir=dir) == 'function' ) {
		t.dir=null;
		t._onDragDrop = function(){dir(t);}
	}
	t.innerX-=gP(dragEnvoker)-this.getInnerP(dragEnvoker,'left')
	t.innerY-=gP(dragEnvoker,1)-this.getInnerP(dragEnvoker,'top')
	t.innerX=t.ie?Math.abs(t.innerX):0;
	t.innerY=t.ie?Math.abs(t.innerY):0;
	if(/st/i.test((t.relative=dragEnvoker.getCssProperty('position')))) {
		dragEnvoker.style.position='relative';t.relative=1;
	} else t.relative=/rel/i.test(t.relative);
	t.dragObj=dragEnvoker;
	t.setInitPos();
}
//border direction the same as margin css attribute
Drag.prototype.setBorder=function( relative,t,r,b,l ) {
	this.border=relative?{t:this.initPos.t-t,r:this.initPos.r+r,b:this.initPos.b+b,l:this.initPos.l-l}:{t:t,r:r,b:b,l:l};
}

Drag.prototype.getInnerP=function(o,pos) {
	d=document;E=d.documentElement;b=d.body;
	if(_isIE)b=__IE.inherits(b,'HTMLElement')
	arr=[
		o.getCssIntProperty(pos),
		b.getCssIntProperty('margin-'+pos),
		b[pos+'Margin'],
		0
	];
	
	for(i=0;(x=arr[i++])==-1;);
	return x;
}

Drag.prototype.startDrag=function(e,x,y,d,b,E,t){
  d=document;E=d.documentElement;b=d.body;if(!E)return!1;
  t=this;
  //t.dragObj.style.zIndex=this.dragZIndex;
  e=e||event
  x=-~~(t.relative?-t.dragObj.offsetLeft+e.clientX:(e.layerX||e.offsetX)+t.innerX);
  y=-~~(t.relative?-t.dragObj.offsetTop+e.clientY:(e.layerY||e.offsetY)+t.innerY);
  d.onmousemove=function(e,oX,oY){
    e=e||event;oX=0;oY=0;
  	if( !t.dir||/^h/.test(t.dir) )
  		oX=x+e.clientX+(E.scrollLeft||b.scrollLeft)
  	if( (!t.dir||/^v/.test(t.dir)))
  		oY=y+e.clientY+(E.scrollTop||b.scrollTop)
    with(t.dragObj.style){
    	if( oX+(t.relative?t.initPos.l:0) > 0 )
    	if( !t.border||((t.relative&&(t.border.l<t.initPos.l+oX&&t.border.r>t.initPos.r+oX))||(!t.relative&&t.border.l<oX&&t.border.r>oX+t.dragObj.offsetWidth)))
    		left=oX-(oX%skok)+'px';
    	if( oY+(t.relative?t.initPos.t:0) > 0 )
    	if( !t.border||((t.relative&&(t.border.t<t.initPos.t+oY&&t.border.b>t.initPos.b+oY))||(!t.relative&&t.border.t<oY&&t.border.b>oY+t.dragObj.offsetHeight)))
    		top=oY-(oY%skok)+'px';
    }
    if( t._onDragDrop ) t._onDragDrop();
    return!1;
  }
  d.onmouseup=function(){
    this.onmousemove=null
    if( t._onDragFinished ) t._onDragFinished();
  }
}
Drag.prototype.setInitPos=function(t){
	t=this.dragObj;
	this.initPos={};with( this ) {
		initPos.t=gP(t,1);
		initPos.l=gP(t);
		initPos.r=t.offsetWidth+initPos.l;
		initPos.b=t.offsetHeight+initPos.t;
	}

}
Drag.prototype.dragZIndex=100;

function gP(o,t){return o['offset'+(t?'Top':'Left')]}