	function findObj(n, d) {
	
	var p,i,x;
	if(!d) d=document;
	
	if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
		}
  	
	if(!(x=d[n])&&d.all) x=d.all[n];
	for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findObj(n,d.layers[i].document);
	return x;
	
	}

function dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL,cR,targL,targT,tol,dropJS,et,dragJS) {
	
	var i,j,aLayer,retVal,curDrag=null,NS=(navigator.appName=='Netscape'), curLeft, curTop;
	if (!document.all && !document.layers) return false;
	retVal = true;
	if(!NS && event) event.returnValue = true;
	if (dragLayer.arguments.length > 1) {
    	curDrag = findObj(objName);
		if (!curDrag) return false;
    	if (!document.allLayers) {
			document.allLayers = new Array();
      		with (document) 
				if (NS) {
					for (i=0; i<layers.length; i++) allLayers[i]=layers[i];
					for (i=0; i<allLayers.length;i++)
					if (allLayers[i].document && allLayers[i].document.layers)
	          		with (allLayers[i].document) for (j=0; j<layers.length;j++) allLayers[allLayers.length]=layers[j];
      				}
				else for (i=0;i<all.length;i++) if (all[i].style&&all[i].style.position) allLayers[allLayers.length]=all[i];
				}
    		curDrag.dragOk=true;
			curDrag.targL=targL;
			curDrag.targT=targT;
    		curDrag.tol=Math.pow(tol,2);
			curDrag.hLeft=hL;
			curDrag.hTop=hT;
    		curDrag.hWidth=hW;
			curDrag.hHeight=hH;
			curDrag.toFront=toFront;
    		curDrag.dropBack=dropBack;
			curDrag.dropJS=dropJS;
    		curDrag.everyTime=et;
			curDrag.dragJS=dragJS;
    		curDrag.oldZ = (NS)?curDrag.zIndex:curDrag.style.zIndex;
    		curLeft= (NS)?curDrag.left:curDrag.style.pixelLeft;
			curDrag.startL = curLeft;
    		curTop = (NS)?curDrag.top:curDrag.style.pixelTop;
			curDrag.startT = curTop;
    		curDrag.bL=(cL<0)?null:curLeft-cL;
			curDrag.bT=(cU<0)?null:curTop -cU;
    		curDrag.bR=(cR<0)?null:curLeft+cR;
			curDrag.bB=(cD<0)?null:curTop +cD;
    		curDrag.LEFTRIGHT=0;
			curDrag.UPDOWN=0;
			curDrag.SNAPPED=false; //use in your JS!
    		document.onmousedown = dragLayer;
			document.onmouseup = dragLayer;
    	
		if (NS) document.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);
  		}
	else {
    	var theEvent = ((NS)?objName.type:event.type);
    	if (theEvent == 'mousedown') {
      		var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;
      		var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;
      		var maxDragZ=null;
			document.maxZ = 0;
		
      	for (i=0; i<document.allLayers.length; i++) {
			aLayer = document.allLayers[i];
        	var aLayerZ = (NS)?aLayer.zIndex:aLayer.style.zIndex;
        	if (aLayerZ > document.maxZ) document.maxZ = aLayerZ;
        	var isVisible = (((NS)?aLayer.visibility:aLayer.style.visibility).indexOf('hid') == -1);
        	if (aLayer.dragOk != null && isVisible) with (aLayer) {
          		var parentL=0; var parentT=0;
          		if (!NS) { 
					parentLayer = aLayer.parentElement;
            	while (parentLayer != null && parentLayer.style.position) {
              		parentL += parentLayer.offsetLeft; parentT += parentLayer.offsetTop;
              		parentLayer = parentLayer.parentElement;
					}
				}
          	var tmpX=mouseX-(((NS)?pageX:style.pixelLeft+parentL)+hLeft);
	        var tmpY=mouseY-(((NS)?pageY:style.pixelTop +parentT)+hTop);
    	    var tmpW = hWidth;  if (tmpW <= 0) tmpW += ((NS)?clip.width :offsetWidth);
        	var tmpH = hHeight; if (tmpH <= 0) tmpH += ((NS)?clip.height:offsetHeight);
          	if ((0 <= tmpX && tmpX < tmpW && 0 <= tmpY && tmpY < tmpH) && (maxDragZ == null || maxDragZ <= aLayerZ)) { 
				curDrag = aLayer; maxDragZ = aLayerZ;
				}
			}
		}
      	if (curDrag) {
        	document.onmousemove = dragLayer;
			if (NS) document.captureEvents(Event.MOUSEMOVE);
        	curLeft = (NS)?curDrag.left:curDrag.style.pixelLeft;
        	curTop = (NS)?curDrag.top:curDrag.style.pixelTop;
        	oldX = mouseX - curLeft; oldY = mouseY - curTop;
        	document.curDrag = curDrag;  curDrag.SNAPPED=false;
        	if(curDrag.toFront) {
          		eval('curDrag.'+((NS)?'':'style.')+'zIndex=document.maxZ+1');
          		if (!curDrag.dropBack) document.maxZ++;
				}
        	retVal = false; if(!NS) event.returnValue = false;
    		}
		}
		else if (theEvent == 'mousemove') {
      		if (document.curDrag) with (document.curDrag) {
        	var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;
        	var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;
        	newLeft = mouseX-oldX; newTop  = mouseY-oldY;
        	if (bL!=null) newLeft = Math.max(newLeft,bL);
        	if (bR!=null) newLeft = Math.min(newLeft,bR);
        	if (bT!=null) newTop  = Math.max(newTop ,bT);
        	if (bB!=null) newTop  = Math.min(newTop ,bB);
        	LEFTRIGHT = newLeft-startL;
			UPDOWN = newTop-startT;
        	if (NS) {
				left = newLeft;
				top = newTop;
				}
        	else {
				style.pixelLeft = newLeft;
				style.pixelTop = newTop;
				}
        	if (dragJS) eval(dragJS);
        	retVal = false;
			if(!NS) event.returnValue = false;
    		}
		} else if (theEvent == 'mouseup') {
      		document.onmousemove = null;
      		if (NS) document.releaseEvents(Event.MOUSEMOVE);
      		if (NS) document.captureEvents(Event.MOUSEDOWN); //for mac NS
      		if (document.curDrag) with (document.curDrag) {
        		if (typeof targL =='number' && typeof targT == 'number' && (Math.pow(targL-((NS)?left:style.pixelLeft),2)+Math.pow(targT-((NS)?top:style.pixelTop),2))<=tol) {
			        if (NS) {
						left = targL;
						top = targT;
						}
          			else {
						style.pixelLeft = targL;
						style.pixelTop = targT;
						}
          			SNAPPED = true;
					LEFTRIGHT = startL-targL;
					UPDOWN = startT-targT;
					}
        		if (everyTime || SNAPPED) eval(dropJS);
        		if(dropBack) {
					if (NS) zIndex = oldZ;
					else style.zIndex = oldZ;
					}
        		retVal = false;
				if(!NS) event.returnValue = false;
				}
      		document.curDrag = null;
    		}
    	if (NS) document.routeEvent(objName);
  		}
	return retVal;
	}