function zwDragDrop()
{
	this.dragObj=null;

	this.idDrag=0;
	this.isDrag=false;
	this.offset={x: 0, y: 0};
	this.relPoint={x: 0, y: 0};
	this.dragSize={width: 0, height: 0}
	this.startRect={x: 0, y: 0};
	this.maxSize={width: 600, height: 400}
	this.cancel=false;

	this.dummyDrg=null;
	this.dummyDrp=null;
	this.dropTarget=null;
	this.dropBefore=null;
	this.pageOffset=null;
	this.dropTargets;
	this.dropIsLast=false;
	this.forceChange=false;

	this.parentId=''; // Id de la zona contenedora del objeto drag.
	this.dropZone=''; // Id del contenedor de drop.
	this.lock=''; // Bloqueo de movimiento
	this.transparency=7;
	this.targetClass=''; // Clase de los objetos sobre los que se podra hacer drop.
	this.dropMode=0; // 0 Normal drop, 1 Drop crea espacio, 2 Drop Objeto.
	this.minMoveDrag=10;
	this.maxX=undefined;
	this.maxY=undefined;
	this.minX=undefined;
	this.minY=undefined;
	this.desX=0;
	this.desY=0;
	this.scrollTimer=false;
	this.scrollDir=0;
	this.scrollEvent=false;

	this.cancelTimer=false;

	// Callbacks
	this.dropCallBack=null;
	this.endCallBack=null;
	this.draggingCallback=null;

	// Handlers
	this.mouseMove=null;
	this.mouseUp=null;
	this.keyDown=null;
}

zwDragDrop.prototype = {

	startDrag:function(oDrg, iId, oEvt)
	{
		var oParent;
		var oTarjet;
		var tmpThis;
		var oObj;
		var oParent;
		var iDifX=0;
		var iDifY=0;

		oEvt=(oEvt?oEvt:window.event);
		this.dragObj=oDrg;
		this.iId=iId;
		this.isDrag=true;
		this.cancel=false;
		this.unsetTarget();

		this.dummyDrg=null;
		this.dummyDrp=null;
		this.dropTarget=null;
		this.dropBefore=null;
		this.pageOffset=null;
		this.dropIsLast=false;
		this.forceChange=false;

		this.dropTargets=new Array();
		oParent=document.getElementById(this.dropZone);
		if(!oParent) oParent=document.body;

		zw.stopEventPropagation(oEvt);
		//window.status=this.dropTargets.length+' targets.';

		this.startRect=_getObjRectangle(this.dragObj);

		if(this.dropMode!=2)
		{
			this.getDropTargets(oParent);
			if(window.event)
			{
				this.relPoint.x=oEvt.clientX;
				this.relPoint.y=oEvt.clientY;
			} else {
				this.relPoint.x=oEvt.pageX;
				this.relPoint.y=oEvt.pageY;
			}

			this.pageOffset=_getClientScrollOffset();
			this.offset.x=this.relPoint.x-this.startRect.x;
			this.offset.y=this.relPoint.y-this.startRect.y;
		} else {
			oParent=document.getElementById(this.parentId);

			oObj=(oEvt.srcElement?oEvt.srcElement:oEvt.target);
			while(oObj && oObj!=oParent)
			{
				value=parseInt(oObj.style.top);
				iDifY+=(isNaN(value)?0:value);

				value=parseInt(oObj.style.left);
				iDifX+=(isNaN(value)?0:value);

				oObj=oObj.parentNode;//(oObj.parentElement?oObj.parentElement:oObj.parentNode);
			}

			if(window.event)
			{
				if(this.lock=='' || this.lock=='H') this.dragObj.style.left=(oEvt.offsetX+this.desX+iDifX)+'px';
				if(this.lock=='' || this.lock=='V') this.dragObj.style.top=(oEvt.offsetY+this.desY+iDifY)+'px';
			} else {
				if(this.lock=='' || this.lock=='H') this.dragObj.style.left=(oEvt.layerX+this.desX+iDifX)+'px';
				if(this.lock=='' || this.lock=='V') this.dragObj.style.top=(oEvt.layerY+this.desY+iDifY)+'px';
			}

			this.relPoint.x=parseInt(this.dragObj.style.left)+this.desX;
			this.relPoint.y=parseInt(this.dragObj.style.top)+this.desY;
			this.offset.x=oEvt.screenX;
			this.offset.y=oEvt.screenY;

			if(this.draggingCallback)
				this.draggingCallback.call(this);
		}

		tmpThis=this;
		this.mouseMove=function (e) {_zwDragSetDrgDummyLocation(tmpThis, e)};
		this.mouseUp=function (e) {_zwDragEndDrag(tmpThis, e)};
		this.keyDown=function (e) {_zwDragKeyDown(tmpThis, e)};

		zw.addEventHandler(document.body, 'onmousemove', this.mouseMove);
		zw.addEventHandler(document.body, 'onmouseup', this.mouseUp);
		zw.addEventHandler(document.body, 'onkeydown', this.keyDown);
	},

	getDropTargets:function(p)
	{
		var i, o, t, s, e;

		if(this.targetClass!='')
		{
			for(i=0;i<p.childNodes.length;i++)
			{
				o=p.childNodes[i];
				eval('e=/\\b'+this.targetClass+'/;');
				if(o.className && e.test(o.className))
				{
					t={o: false, r:false};
					t.o=o;
					t.r=_getObjRectangle(o);
					this.dropTargets.push(t);
				} else {
					this.getDropTargets(o);
				}
			}
		}
	},

	getDropTargetFromPoint:function(x, y)
	{
		var t=null;
		var i, o, or, sr;
		var l=false;
		var h, w;

		oPageOfs=_getClientScrollOffset();

		//Quitamos offset página.
		x+=oPageOfs.x;
		y+=oPageOfs.y;

		for(i=0;i<this.dropTargets.length;i++)
		{
			o=this.dropTargets[i].o;
			or=this.dropTargets[i].r;
//window.status='x: '+x+' - l: '+or.left+' - r: '+or.right;
			switch(this.dropMode)
			{
				case 0:
					if(x>=or.left && y>=or.top && x<=or.right && y<=or.bottom)
						t=o;
					break;
				case 1:
					sr=_getObjRectangle(this.dummyDrg);
					h=sr.bottom;
					w=sr.right;
					x=sr.x;
					y=sr.y;

					// Açò Falla quan l'objecte és més petit
					//y>or.top &&
					//window.status='x: '+x+' - l: '+or.left+' - r: '+or.right;
					if(x>=or.left && x<=or.right)
					{
						if((y>=or.top && y<=or.bottom))
						{
							t=o;
							//y>or.top &&
							if(y>or.top+(or.height/2))//|| (y+h)>or.top+(or.height/2))
							{
								if(i<this.dropTargets.length-2)
								{
									t=this.dropTargets[i+1].o;
									if(t.parentNode!=o.parentNode)
									{
										l=true;
										t=o;
									}
								} else {
									l=true;
								}
							}
						} else if(y<or.top && (y+h)>(or.top+or.height)) {
							if(i<this.dropTargets.length-1)
							{
								t=this.dropTargets[i+1].o;
								if(t.parentNode!=o.parentNode)
								{
									l=true;
									t=o;
								}
							} else {
								l=true;
								t=o;
							}
						}
					}
					break;
			}
			if(t) break; // Eliminado activar para modo=0
		}

		if(l!=this.dropIsLast)
		{
			this.dropIsLast=l;
			this.forceChange=true;
		}

		return t;
	},

	removeDropDummy:function()
	{
		if(this.dummyDrp && this.dummyDrp.parentNode)
			this.dummyDrp.parentNode.removeChild(this.dummyDrp);
	},

	setParentId:function(sId)
	{
		var oDrop=document.getElementById(sId);

		this.parentId=sId;
		if(oDrop)
		{
			zw.addEventHandler(oDrop, 'ondragstart', this.stopPropagation);
			zw.addEventHandler(oDrop, 'onmousedown', this.stopPropagation);
			zw.addEventHandler(oDrop, 'onselectstart', this.stopPropagation);
		}
	},

	stopPropagation:function(e)
	{
		zw.stopEventPropagation(e);
		return false;
	},

	setTarget:function(oObj)
	{
		if(oObj!=this.dropTarget || this.forceChange)
		{
			this.forceChange=false;
			this.unsetTarget();
			switch(this.dropMode)
			{
				case 0:
					this.dropTarget=oObj;
					if(this.dropTarget.className!='cmsdrop')
						this.targetClass=this.dropTarget.className;
					this.dropTarget.className='cmsdrop';
					break;
				case 1:
					this.removeDropDummy();
					this.dropTarget=oObj;

					var sr=_getObjRectangle(this.dropTarget);
					this.dummyDrg.style.width=(sr.width>0?sr.width:this.startRect.width);

					this.dropBefore=this.dropTarget;
					if(this.dropIsLast) this.dropBefore=null;
					this.dropTarget.parentNode.insertBefore(this.dummyDrp, this.dropBefore);

					break;
				case 2:

					break;
			}
		}
	},

	unsetTarget:function()
	{
		if(this.dropTarget)
		{
			switch(this.dropMode)
			{
				case 0:
					this.dropTarget.className=this.targetClass;
					this.dropTarget=null;
					break;
				case 1:
					this.dummyDrg.style.width=(this.startRect.width>this.maxSize.width?this.maxSize.width:this.startRect.width);
					break;
			}
		}
	},

	startScrollWnd:function()
	{
		if(this.scrollTimer==false)
		{
			var tmpThis=this;
			this.scrollTimer=setInterval(function() { tmpThis.doScrollWnd(); }, 10);
		}
	},

	stopScrollWnd:function()
	{
		if(this.scrollTimer!=false)
		{
			clearInterval(this.scrollTimer);
			this.scrollTimer=false;
		}
	},

	doScrollWnd:function ()
	{
		oPageOfs=_getClientScrollOffset();

		switch(this.scrollDir)
		{
			case 1:
				document.body.scrollTop-=5;
				break;
			case 2:
				document.body.scrollLeft+=5;
				break;
			case 3:
				document.body.scrollTop+=5;
				break;
			case 4:
				document.body.scrollLeft-=5;
				break;
		}

		zw.objFireEvent(document.body, 'onmousemove');

		//_zwDragSetDrgDummyLocation(this, this.scrollEvent);
/*		if(oEvt.clientY<=30 && oPageOfs.y>0) { ws=true; oSelf.scrollDir=1; } //document.body.scrollTop-=(oPageOfs.y<15?oPageOfs.y:15);
		if(oEvt.clientX<=30 && oPageOfs.x>0) { ws=true; oSelf.scrollDir=4; } //document.body.scrollLeft-=(oPageOfs.x<15?oPageOfs.x:15);
		if(oEvt.clientY+oSelf.dragSize.height>=document.body.clientHeight && oEvt.clientY+15<document.body.scrollHeight) { ws=true; oSelf.scrollDir=3; } //document.body.scrollTop+=(oEvt.clientY+15>document.body.scrollHeight?document.body.scrollHeight-(oEvt.clientY+15):15);
		if(oEvt.clientX+oSelf.dragSize.width>=document.body.clientWidth && oEvt.clientX+15<document.body.scrollWidth) { ws=true; oSelf.scrollDir=2; } //document.body.scrollLeft+=(oEvt.clientX+15>document.body.scrollWidth?document.body.scrollWidth-(oEvt.clientX+15):15);*/
	},

	startScrollEndDrag:function()
	{
		if(this.cancelTimer==false)
		{
			var tmpThis=this;
			this.cancelTimer=setInterval(function() { tmpThis.doScrollEndDrag(); }, 10);
		}
	},

	stopScrollEndDrag:function()
	{
		if(this.cancelTimer!=false)
		{
			clearInterval(this.cancelTimer);
			this.cancelTimer=false;
		}

		if(this.dummyDrg)
		{
			this.dummyDrg.parentNode.removeChild(this.dummyDrg);
			this.dummyDrg=null;
		}
	},

	doScrollEndDrag:function ()
	{
		var x, y, w, h, sr;

		if(this.dummyDrg)
		{
			sr=_getObjRectangle(this.dummyDrg);
			x=(this.startRect.x-sr.left)/2;
			y=(this.startRect.y-sr.top)/2;
			w=(this.startRect.width-sr.width)/2;
			h=(this.startRect.height-sr.height)/2;

			if(Math.abs(x)<1 && Math.abs(y)<1)
			{
				this.stopScrollEndDrag();
			} else {
				this.dummyDrg.style.left=(this.startRect.x-x)+'px';
				this.dummyDrg.style.top=(this.startRect.y-y)+'px';
				this.dummyDrg.style.width=(this.startRect.width-w)+'px';
				this.dummyDrg.style.height=(this.startRect.height-h)+'px';
			}
		} else {
			this.stopScrollEndDrag();
		}
	}
}

function _zwDragEndDrag(oSelf, oEvt)
{
	var oParent;

	if(oSelf.isDrag)
	{
		oEvt=(oEvt?oEvt:window.event);
		oSelf.idDrag=0;
		oSelf.isDrag=false;
		oSelf.stopScrollWnd();

		zw.removeEventHandler(document.body, 'onmousemove', oSelf.mouseMove);
		zw.removeEventHandler(document.body, 'onmouseup', oSelf.mouseUp);
		zw.removeEventHandler(document.body, 'onkeydown', oSelf.keyDown);

		//oSelf.dropTarget && oSelf.dropTarget!=oSelf.dragObj && !oSelf.cancel
		if(oSelf.dummyDrg && oSelf.dropMode!=2)
		{
			if(oSelf.dropTarget && oSelf.dropTarget!=oSelf.dragObj && !oSelf.cancel)
				oSelf.startRect=_getObjRectangle((oSelf.dropMode==1?oSelf.dummyDrp:oSelf.dropTarget));

			//if(oSelf.cancel || !oSelf.dropTarget || oSelf.dropTarget==oSelf.dragObj)
			//{
			//	oSelf.isDrag=true;
				oSelf.startScrollEndDrag();
			//} else {
			//	if(oSelf.parentId=='')
			//		oParent=document.body;
			//	else
			//		oParent=document.getElementById(oSelf.parentId);
			//	oParent.removeChild(oSelf.dummyDrg);
			//	oSelf.dummyDrg=null;
			//}
		}

		if(oSelf.dropCallBack && oSelf.dropTarget && oSelf.dropTarget!=oSelf.dragObj && !oSelf.cancel)
			oSelf.dropCallBack.call(oSelf);

		if(oSelf.endCallBack)
			oSelf.endCallBack.call(oSelf);

		switch(oSelf.dropMode)
		{
			case 0:
				break;
			case 1:
				oSelf.dragObj.style.display='block';
				oSelf.removeDropDummy();
				break;
			case 2:
				break;
		}

		oSelf.dummyDrp=null;
		oSelf.dragObj=null;
		oSelf.unsetTarget();
		oSelf.dropTarget=null;
	}
}

function _zwDragKeyDown(oSelf, oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	if(oEvt.keyCode==27 && oSelf.isDrag)
	{
		oSelf.unsetTarget();
		oSelf.cancel=true;
		_zwDragEndDrag(oSelf, oEvt);
	}
}

function _zwGetMousePosition()
{
	var f,c;
	f=function() { c=_zwMousePositionFromEvent(arguments[0]); };
	zw.addEventHandler(document, 'onmousemove', f);
	zw.objFireEvent(document, 'onmousemove');
	zw.removeEventHandler(document, 'onmousemove', f);
	return c;
}

function _zwMousePositionFromEvent(e)
{
	var de,b,c={x:0, y:0};
	e=e||window.event;
	if (e.pageX||e.pageY)
	{
		c.x=e.pageX;
		c.y=e.pageY;
	} else {
		de=document.documentElement;
		b=document.body;
		c.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
		c.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
    }
    return c;
}

function _zwDragRemoveFlash(o)
{
	var c, i, n;

	for(i=0;i<o.childNodes.length;i++)
	{
		c=o.childNodes[i];
		if(c.tagName=='OBJECT')
		{
			n=document.createElement('DIV');
			try { n.style.height=c.height; } catch(e) {}
			try { n.style.width=c.width; } catch(e) {}
			n.className='flashdummy';
			n.innerHTML='&nbsp;';
			o.replaceChild(n, c);
		} else {
			_zwDragRemoveFlash(c);
		}
	}

}

function _zwDragSetDrgDummyLocation(oSelf, oEvt)
{
	var oObj;
	var iDifX;
	var iDifY;
	var iVal;
	var oOver=null;
	var oPageOfs;
	var oRect;
	var ws=false;

	oEvt=(oEvt?oEvt:window.event);
	if(oSelf.dummyDrg)
	{
		//oSelf.unsetTarget();
		if(oSelf.dropMode==2)
		{
			iDifX=parseInt(oSelf.dummyDrg.style.left);
			iDifY=parseInt(oSelf.dummyDrg.style.top);

	  		if(oSelf.lock=='' || oSelf.lock=='H') iDifX=oSelf.relPoint.x+(oEvt.screenX-oSelf.offset.x)-oSelf.desX;
			if(oSelf.lock=='' || oSelf.lock=='V') iDifY=oSelf.relPoint.y+(oEvt.screenY-oSelf.offset.y)-oSelf.desY;

	  		//window.status=oSelf.relPoint.y+' + '+(oEvt.screenY-oSelf.offset.y)+' = '+iDifY;

			if(oSelf.maxY!=undefined && iDifY>oSelf.maxY+oSelf.desY-1) iDifY=oSelf.maxY+oSelf.desY-1;
			if(oSelf.minY!=undefined && iDifY<oSelf.minY+oSelf.desY) iDifY=oSelf.minY+oSelf.desY;

			if(oSelf.maxX!=undefined && iDifX>oSelf.maxX+oSelf.desX-1) iDifX=oSelf.maxX+oSelf.desX-1;
			if(oSelf.minX!=undefined && iDifX<oSelf.minX+oSelf.desX) iDifX=oSelf.minX+oSelf.desX;

			oSelf.dummyDrg.style.left=iDifX+'px';
			oSelf.dummyDrg.style.top=iDifY+'px';

		} else {
			oPageOfs=_getClientScrollOffset();
		  	if(window.event)
		  	{
		  		if(oSelf.lock=='' || oSelf.lock=='H') oSelf.dummyDrg.style.left=(oEvt.clientX-oSelf.offset.x+(oSelf.dropMode!=2?(oPageOfs.x-oSelf.pageOffset.x):0))+'px';
				if(oSelf.lock=='' || oSelf.lock=='V') oSelf.dummyDrg.style.top=(oEvt.clientY-oSelf.offset.y+(oSelf.dropMode!=2?(oPageOfs.y-oSelf.pageOffset.y):0))+'px';
			} else {
				if(oSelf.lock=='' || oSelf.lock=='H') oSelf.dummyDrg.style.left=(oEvt.pageX-oSelf.offset.x)+'px';
				if(oSelf.lock=='' || oSelf.lock=='V') oSelf.dummyDrg.style.top=(oEvt.pageY-oSelf.offset.y)+'px';
			}

			oOver=oSelf.getDropTargetFromPoint(oEvt.clientX, oEvt.clientY);

			if(oOver) // && oOver.className==oSelf.targetClass
			{
				oSelf.setTarget(oOver);
				//window.status=oOver.id;
			} else {
				oSelf.unsetTarget();
			}

			if(window.event)
			{
				if(!ws && oEvt.clientY<=30 && oPageOfs.y>0) { ws=true; oSelf.scrollDir=1; } //document.body.scrollTop-=(oPageOfs.y<15?oPageOfs.y:15);
				if(!ws && oEvt.clientX<=30 && oPageOfs.x>0) { ws=true; oSelf.scrollDir=4; } //document.body.scrollLeft-=(oPageOfs.x<15?oPageOfs.x:15);
				if(!ws && oEvt.clientY+oSelf.dragSize.height>=document.body.clientHeight && oEvt.clientY+15<document.body.scrollHeight) { ws=true; oSelf.scrollDir=3; } //document.body.scrollTop+=(oEvt.clientY+15>document.body.scrollHeight?document.body.scrollHeight-(oEvt.clientY+15):15);
				if(!ws && oEvt.clientX+oSelf.dragSize.width>=document.body.clientWidth && oEvt.clientX+15<document.body.scrollWidth) { ws=true; oSelf.scrollDir=2; } //document.body.scrollLeft+=(oEvt.clientX+15>document.body.scrollWidth?document.body.scrollWidth-(oEvt.clientX+15):15);
			} else {
				iDifY=oEvt.pageY-oPageOfs.y;
				iDifX=oEvt.pageX-oPageOfs.x;

				if(!ws && iDifY<=30 && oPageOfs.y>0) { ws=true; oSelf.scrollDir=1; } //window.scrollBy(0, oPageOfs.y<15?-oPageOfs.y:-15);
				if(!ws && iDifX<=30 && oPageOfs.x>0) { ws=true; oSelf.scrollDir=4; } //window.scrollBy(oPageOfs.x<15?-oPageOfs.x:-15, 0);
				if(!ws && iDifY+oSelf.dragSize.height>=window.innerHeight) { ws=true; oSelf.scrollDir=3; } //window.scrollBy(0, 15);
				if(!ws && iDifX+oSelf.dragSize.height>=window.innerWidth) { ws=true; oSelf.scrollDir=2; } //window.scrollBy(15, 0);

			}

			if(ws)
			{
				oSelf.scrollEvent=oEvt;
				oSelf.startScrollWnd();
			} else {
				oSelf.stopScrollWnd();
			}
		}

		if(oSelf.draggingCallback)
			oSelf.draggingCallback.call(oSelf);

	} else {
		if(oSelf.dragObj)
		{
			if(window.event)
			{
				iDifX=oEvt.clientX-oSelf.relPoint.x;
				iDifY=oEvt.clientY-oSelf.relPoint.y;
			} else {
				iDifX=oEvt.pageX-oSelf.relPoint.x;
				iDifY=oEvt.pageY-oSelf.relPoint.y;
			}

			if(oSelf.dropMode==2 || ((oSelf.lock=='' || oSelf.lock=='H') && Math.abs(iDifX)>oSelf.minMoveDrag) || ((oSelf.lock=='' || oSelf.lock=='V') && Math.abs(iDifY)>oSelf.minMoveDrag))
			{
				if(oSelf.dropMode==2)
				{
					oSelf.dummyDrg=oSelf.dragObj;
					//oSelf.dummyDrg.style.left=iDifX;
					//oSelf.dummyDrg.style.top=iDifY;
				} else {
					var o=oSelf.dragObj.cloneNode(true);
					_zwDragRemoveFlash(o);
					oRect=_getObjRectangle(oSelf.dragObj);
					oSelf.dragSize.width=(oRect.width>oSelf.maxSize.width?oSelf.maxSize.width:oRect.width)+'px';
					oSelf.dragSize.height=(oRect.height>oSelf.maxSize.height?oSelf.maxSize.height:oRect.height)+'px';

					o.style.width=oRect.width+'px';
					o.style.height=oRect.height+'px';

					oSelf.dummyDrg=document.createElement('DIV');
					oSelf.dummyDrg.style.width=oSelf.dragSize.width;
					oSelf.dummyDrg.style.height=oSelf.dragSize.height;
					oSelf.dummyDrg.style.left=oRect.left+'px';
					oSelf.dummyDrg.style.top=oRect.top+'px';
					oSelf.dummyDrg.style.zIndex=2000;
					oSelf.dummyDrg.style.backgroundColor='#FFFFFF';
					oSelf.dummyDrg.style.position='absolute';
					oSelf.dummyDrg.style.overflow='hidden';
					oSelf.dummyDrg.appendChild(o);

					//oSelf.dummyDrg.style.border='1px solid red';

					if(window.event)
						oSelf.dummyDrg.style.filter='progid:DXImageTransform.Microsoft.Alpha( Style=0, Opacity='+oSelf.transparency+'0);';
					else
						oSelf.dummyDrg.style.opacity='.'+oSelf.transparency;
				}

				if(oSelf.dropMode==1)
				{
					oSelf.dummyDrp=document.createElement('DIV');
					//oSelf.dummyDrp.style.width=oRect.width;
					oSelf.dummyDrp.style.height=oRect.height+'px';
					oSelf.dummyDrp.style.border='1px dotted #888888';
					oSelf.dummyDrp.style.margin=oSelf.dragObj.style.margin;
					//oSelf.dummyDrp.style.display='block';
					//oSelf.dummyDrp.className='cmsthumb';
					oSelf.dragObj.style.display='none';
				}

				_zwDragSetDrgDummyLocation(oSelf, oEvt)
				oParent=document.getElementById(oSelf.parentId);
				oParent.appendChild(oSelf.dummyDrg);
				if(oSelf.dropMode==1) oSelf.setTarget(oSelf.dragObj);
			}
		}
	}
}

function _getObjectPagePos(o)
{
	var ps={x: 0, y: 0, s: ''};
	var p;

// TO DO: Hay un problema con esta funcion en IE cuando se calcula para
// un objecto el cual su primer hijo que renderiza tiene ubicación float
// offset devuelve la posición de ese objeto:
// <div id='o.id'><p><img style='float:right;' src='dummy.jpg' /></p></div>
// Si o.id tiene una posicion 0, offsetleft devuelve la posicion x de dummy.jpg

	if(o)
	{
		do {
			ps.y+=o.offsetTop  || 0;
			ps.x+=o.offsetLeft || 0;
		      //ps.s+='Pos: '+ps.x+' - '+ps.y+': '+o.style.position+' - '+o.clientLeft+' - '+o.style.left+'\n';
		      o=o.offsetParent;
		      if(o)
		      {
				if(o.tagName=='BODY') break;
				p=o.style.position;
				if(p=='relative' || p=='absolute') break;
			}
		} while (o);
	}

	return ps;

	/*var coords = {x: 0, y: 0};
	var sPos='';
	var lastX=0;
	var lastY=0;
	var s;//, f;

	//f=true;
	if(document.layers)
	{
		coords.x=o.x;
		coords.y=o.y;
	} else {
		while (o)
		{
			s=o.style.position;
			// Cambiado para el editor... se se cambia el editor no funciona!
			//if((s!='static' && s!='') || f)
			//{
				coords.x+=o.offsetLeft;
				coords.y+=o.offsetTop;
				//sPos+=o.tagName+' - >'+s+'<: ('+o.offsetLeft+', '+o.offsetTop+')\n';
			//}
			//f=false;
			try { o = o.offsetParent;}
				catch(e) { o=false; }
		}
	}

	//sPos+='\n\nLast: '+lastX+', '+lastY+'\n';
	//alert(sPos);
	return coords;*/
}

function _getObjectSize(o)
{
	var sz={width: 0, height: 0};
	var v, p, d, s;

	if(o)
	{
		s=o.style;

		//if (s.d!='none' && s.d!= null) // Safari bug
	      //	return {width: o.offsetWidth, height: o.offsetHeight};

		/*v=s.visibility;
		p=s.position;
		d=s.display;

		s.visibility='hidden';
		s.position='absolute';
		s.display='block';*/

		sz.width=o.offsetWidth;
		sz.height=o.offsetHeight;

		/*s.visibility=v;
		s.position=p;
		s.display=d;*/
	}

	return sz;
}

function _getEventOffsets(evt)
{
  	var target = evt.target;

	if(window.event)
	{
		var offsets={
	    		offsetX: evt.offsetX,
	    		offsetY: evt.offsetY
	  	};
	} else {
	  	if(target.nodeType!=target.ELEMENT_NODE) target=target.parentNode;

		var pageCoords=_getObjectPagePos(target);
	  	var eventCoords={
	    		x: window.pageXOffset + evt.clientX,
	    		y: window.pageYOffset + evt.clientY
	  	};

		var offsets={
	    		offsetX: eventCoords.x - pageCoords.x,
	    		offsetY: eventCoords.y - pageCoords.y
	  	};
	}
	return offsets;
}

function _getObjRectangle(o)
{
  	var r, b;

  	s=_getObjectSize(o);
  	c=_getObjectPagePos(o);

 	r=c.x+s.width;
 	b=c.y+s.height;

  	return {x: c.x, y: c.y, top: c.y, left: c.x, width: s.width, height: s.height, right: r, bottom: b};
}

function _getClientScrollOffset()
{
	var x,y;

	if(window['pageYOffset']!=undefined)
	{
		// all but Explorer
		x = window.pageXOffset;
		y = window.pageYOffset;
	} else if (document.body) {
		// all other Explorers
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	}
	return {x: x, y: y};
}

function zwGetViewportSize()
{
	var w, h;

	if (typeof window.innerWidth!='undefined')
	{
		w=window.innerWidth;
		h=window.innerHeight;
	} else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth !='undefined' && document.documentElement.clientWidth != 0) {
		w=document.documentElement.clientWidth;
		h=document.documentElement.clientHeight;
 	} else {
		w=document.getElementsByTagName('body')[0].clientWidth;
		h=document.getElementsByTagName('body')[0].clientHeight;
	}
	return {w:w, h:h};
}