        function psDragDrop() {
	}
	
	
	/*
		Drag starten,
	        Aufruf mit onmousedown="psDragDrop.drag_start(this)"   
		Übergabe: 	- Eventobjekt
				- Drag-Knoten
				- Zieltagname (default:ps_drop)
	*/        
        psDragDrop.prototype.drag_start=function(evt,node,dragid,dest) {
        	psDragDrop.inDrag=true;
 	        if (!isIE) { event=evt; }
		var doc=document;
		if (top.document) doc=top.document; 	        
		var c=crossBrowserLib.getPageCoords(node,doc);
		this.deltaX=event.clientX+top.crossBrowserLib.scrollLeft()-c.x;
		this.deltaY=event.clientY+top.crossBrowserLib.scrollTop()-c.y;
		var dragHTML=doc.getElementById("dragHTML");
		if (!dragHTML)
		{			
			dragHTML = doc.createElement("div");
			dragHTML.id = "dragHTML"; 
			doc.body.appendChild(dragHTML);
		}
		dragHTML.style.display="none";
		dragHTML.innerHTML = node.innerHTML;
		node.setAttribute("save_className",node.className);
		node.className=node.className+"_on";		
		dragHTML.className =node.className;
		dragHTML.style.position="absolute";		
		this.drag_node=node;
         	this.drag_value=node.getAttribute("ps_dragvalue");
		if (!dest) dest="ps_drop";
         	this.drop_nodes=crossBrowserLib.getElementsByName(dest,doc);
		this.dragHTML=dragHTML;
		//  Mousemove und Drop-Objekte fuer alle Iframes registrieren
		var iframes=doc.getElementsByTagName("IFRAME");
		this.save_onmousemove_iframes=[];
		this.iframe_drop_nodes=[];
		this.iframes=iframes;	
		crossBrowserLib.registerEventhandler("mousemove",psDragDrop.mousemove,iframes);
		crossBrowserLib.registerEventhandler("mouseup",psDragDrop.drop,iframes);
		
		
		
		
		
		// Drop Objekte		
		if (iframes) for(var i=0;i<iframes.length;i++) {
			var iframe=iframes[i];
			
			
			
			doc=iframe.contentWindow.document;
	         	var drop_nodes=crossBrowserLib.getElementsByName(dest,doc.body);
	         	this.iframe_drop_nodes[i]=drop_nodes;         					
		}




        	return false;    	
        }
         /*
        	Mausbewegung beim Ziehen => Objektpos ändern
        */       
        psDragDrop.prototype.mousemove=function(evt) {
        	var event=crossBrowserLib.getEvent(evt,psDragDrop.iframes);
        	
                if (!event) return;
                var iframepos=event.iframePos;
         	var x=event.clientX+top.crossBrowserLib.scrollLeft()+iframepos.x;
         	var y=event.clientY+top.crossBrowserLib.scrollTop()+iframepos.y;        
         	window.status= 	event.clientY;
		var dragHTML=psDragDrop.dragHTML;
		dragHTML.style.display="block";		
         	dragHTML.style.left=x-psDragDrop.deltaX+"px";
         	dragHTML.style.top=y-psDragDrop.deltaY+"px";
                var iframepos={x:0,y:0};
                var drop_nodes=psDragDrop.drop_nodes;
                	

		psDragDrop.drop_iframe=null;
                var iframepos={x:0,y:0};
                
                // wenn man sich im Iframe befindet -> andere Drop-Nodes und X-Pos
         	if (psDragDrop.iframes) for(var i=0;i<psDragDrop.iframes.length;i++) {
  			var iframe=psDragDrop.iframes[i];
  			if (psDragDrop.isPosInObject(x,y,iframe)) {
  				iframepos=crossBrowserLib.getPageCoords(iframe);	
  				var drop_nodes=psDragDrop.iframe_drop_nodes[i];
  				psDragDrop.drop_iframe=iframe;
  			}
  			for(var k=0;k<psDragDrop.drop_nodes.length;k++) { // Iframe ist selber innerhalb einer Drop-Node ?
  				var n=psDragDrop.drop_nodes[k];
  				var c=crossBrowserLib.getPageCoords(iframe);
	   			var w = iframe.offsetWidth;
	   			var h = iframe.offsetHeight;  				
  				if (psDragDrop.isPosInObject(c.x,c.y,n) && psDragDrop.isPosInObject(c.x+w,c.y+h,n) && psDragDrop.isPosInObject(x,y,n))  {
  					if (psDragDrop.drop_node && psDragDrop.drop_node!=n) psDragDrop.deactivateDropNode();
  					found=true;
  					if (psDragDrop.drop_node && psDragDrop.drop_node==n) return;
  					psDragDrop.activateDropNode(n);
  					return;
  				}
  					
  			}
        	}
  
        	x=x-iframepos.x;
        	y=y-iframepos.y;
        	if (!drop_nodes) return;
         	var found=false;        	
        	// Drop-Node suchen und ggf. farbig machen        	
         	for(var i=0;i<drop_nodes.length;i++) {
			var n=drop_nodes[i];
//			if (n.tagName=="INPUT") alert(n.className);

         		if (psDragDrop.isPosInObject(x,y,n)) {
         			if (psDragDrop.drop_node && psDragDrop.drop_node!=n) {
         				psDragDrop.deactivateDropNode();
         			}
         			found=true;
         			if (psDragDrop.drop_node && psDragDrop.drop_node==n) break;
         			psDragDrop.activateDropNode(n);
         		}
         	}
         	if (psDragDrop.drop_node && !found) psDragDrop.deactivateDropNode();
         	
	}  
	psDragDrop.prototype.isPosInObject=function(xPos,yPos,node) {
		if (!node) return false;	
		var c=crossBrowserLib.getPageCoords(node);
	   	var w = node.offsetWidth;
	   	var h = node.offsetHeight;
	   	return (xPos>=c.x && xPos<=c.x+w && yPos>=c.y && yPos<=c.y+h);	
	} 	
        /*
        	Drop auf einem Drop Punkt (document.onmouseup)
        */
   psDragDrop.prototype.drop=function() {
        psDragDrop.inDrag=false;
		crossBrowserLib.unregisterEventhandler("mousemove",psDragDrop.mousemove,psDragDrop.iframes);
		crossBrowserLib.unregisterEventhandler("mouseup",psDragDrop.drop,psDragDrop.iframes);
		var dragHTML=psDragDrop.dragHTML;
		dragHTML.innerHTML="";
		dragHTML.style.left="-1000px";
		node=psDragDrop.drag_node;
		drop=psDragDrop.drop_node;
		node.className=node.getAttribute("save_className");
		var win=window;
		var doc=top.document;
		if (psDragDrop.drop_iframe) {
			win=psDragDrop.drop_iframe.contentWindow;
			doc=psDragDrop.drop_iframe.contentWindow.document;
		}
		if (!drop) return;

		
		drop.className=drop.getAttribute("save_className");
		var drop_url_id=drop.getAttribute("drop_url_id");
		var dropfunc=drop.getAttribute("jsfunction");	// eine JS Funktion ggf. direkt aufrufen
		if (dropfunc) {
			// jsfunction(event,drag_value); 
			eval(dropfunc+"('"+drop.getAttribute("event")+"','"+psDragDrop.drag_value+"');");
			return;
		}	
		
		var form=crossBrowserLib.findParentElementByTagName(drop,"FORM");
		if (form && drop.getAttribute("event")) {					// Formular abschicken
			try{		// onsubmit ausfuehren, wenn vorhanden
					var res=form.onsubmit(form);
				if (!res) return;
			} catch(e) { };
			var ajax= drop.getAttribute("ajax");
			var render_iframe_id= drop.getAttribute("render_iframe_id");
		//	alert("ajax:"+ajax+",render_iframe_id:"+render_iframe_id);
			// event ausführen im Formular steht dann noch die Drag-ID (z.B. image:mediadb:122)
			var name="formsubmit_"+drop.getAttribute("event")+'_md5_'+drop.getAttribute("mdhash");
			var submit=crossBrowserLib.addFormElement(form,doc,"hidden",name,"true");
			var dragvalue=crossBrowserLib.addFormElement(form,doc,"hidden","drag_value",psDragDrop.drag_value);
			if (ajax=="true") {			// AJAX -> Formular umleiten, siehe eventHandler.AJAXObjectFormLink
				try { var ret=global_hide_iframe; } catch (e) { ret=false; }
				global_hide_iframe=true;
				var iFrameName=eventHandler.getIFRAME(0);
				global_hide_iframe=ret;
				var oldtarget=form.target;
				var oldaction=form.action;
				form.target=iFrameName;
				form.action+="&render_iframe_id="+render_iframe_id+"&wf_viewevent=render_iframe";
				eventHandler.displayWaitImage(render_iframe_id);
			}			
			if (form.onsubmit) form.onsubmit();
			psDragDrop.drag_node=null;
			psDragDrop.drop_node=null;	
			form.submit();
			if (ajax=="true") {			// aufräumen bei AJAX
				form.target=oldtarget;
				form.action=oldaction;
				submit.parentNode.removeChild(submit);
				dragvalue.parentNode.removeChild(dragvalue);
			}
			return;
		}
		
		if (drop_url_id) {	// 
			var drop_url=doc.getElementById(drop_url_id);
			var drop_value=drop.getAttribute("drop_value");			
			var url=drop_url+"&eobj_drag_value="+psDragDrop.drag_value+"&eobj_drop_value="+drop_value+"&gotourl="+escape(win.location);
			win.location=url;
		} else {
			var anode=crossBrowserLib.getElementsByName("ps_dropurl",drop)[0];
			if (anode) {
				win.location=anode+"&eobj_drag_value="+psDragDrop.drag_value+"&gotourl="+escape(win.location);;
			}
		}
		psDragDrop.drag_node=null;
		psDragDrop.drop_node=null;

 	}
 	
         psDragDrop.prototype.activateDropNode=function(node) {
	       if (!this.drag_node) return;
	       this.drop_node=node;
	       node.setAttribute("save_className",node.className);
	       node.className=node.className+"_on";
	 }
         psDragDrop.prototype.deactivateDropNode=function() {
	        if (!this.drag_node) return;
	        this.drop_node.className= this.drop_node.getAttribute("save_className");
       	        this.drop_node=null;
	 }
