/*
	Powerslave Eventhandler:Komunikation zwischen Client und Server
	Klasse darf nur einmal instantiert werden. Der Name muß immer 'eventHandler' sein
	(C) 2001,2002 flying dog software (Nicolay Mausz)

*/

/*
	Konstruktor
		Übergabe:
			- Optional: 0/1 Debug-Modus, Default: 0
			- Optional: Form-Action
*/
function eventHandler(debug,action,iFrameName) {

	this.eventlist=[];
	if (!action) this.action="/ps/tools/client_eventhandler.php";
	else this.action=action;	
	this.debug=debug;
	if (iFrameName) this.iFrameName=iFrameName;
}
/*
	Ein Event zum Server schicken
	Übergabe: - Eventname
	          - beliebige Javascipt Datenstruktur (z.B. Variable, Objekt, Array)
	          - Optional: Debug-Modus (0/1), Default: 0
	          - Optional: IFrame-Name, in dem das Event ausgegeben werden soll
*/
eventHandler.prototype.sendToServer=function(event,object,debug,iFrameName) {
		//if (!wsize) wsize=this.wsize;
		var iFrameName=eventHandler.getIFRAME(debug,iFrameName);
		
		var tunnel=document.getElementById("event_tunnel");
		var tunnelhtml=
		           '<form name=event_tunnel_form target='+iFrameName+' method=post action="'+this.action+'">' +
		               '<input type=hidden name=eventname>' +
		               '<input type=hidden name=eventvalue>' +
		           '</form>';
		if (!tunnel) {
			tunnel = document.createElement("div");
			tunnel.id = "event_tunnel";
			tunnel.innerHTML =tunnelhtml;
	    	document.body.appendChild(tunnel);
	     } else {
			tunnel.innerHTML =tunnelhtml;
		}

   		var f = document.getElementsByName("event_tunnel_form")[0];
		f.eventname.value=event;
		var s=new serializeToPHP(this.utf8);
		f.eventvalue.value=s.serialize(object);
		
		f.submit();

		//alert("send to server");

}
/*
	Ein IFRAME für die AJAX Kommunikation bereitstellen
	Übergabe: - Debugmodus an (Fenster zeigen)
			  - Name des IFrames (optional)
*/
eventHandler.prototype.getIFRAME=function (debug,iFrameName) {
	var event_window;
	if (!iFrameName && this.iFrameName) iFrameName=this.iFrameName;
	if (iFrameName) event_window=document.getElementsByName(iFrameName)[0];
	else event_window=document.getElementById("ps_eventwindow");
	if (!event_window) {
		event_window=document.createElement("div");
		event_window.id="ps_eventwindow";
		document.body.appendChild(event_window);
	}

	var hide=false;
	try { if (global_hide_iframe) hide=true } catch (e) { }			// << GLOBAL var!
	if (!hide && (this.debug || debug)) { var   size='width:100px;height:100px'; } else {  var size='width="1" height="1"';}
	if (!iFrameName) {
			// var node=document.getElementsByName("ps_eventwindow")[0];
			// if (!node) {
				event_window.innerHTML='<iframe src="/ps/defaultskins/editor/empty.html" name="ps_eventwindow" id="ps_eventwindow_frame" noborder  style="border:0px;position:absolute;"></iframe>';
			// }
			iFrameName="ps_eventwindow";
	}
	return iFrameName;		
}
/*
	Ein Event vom Server lesen
		Übergabe: - Eventobjekt mit
						- eventname: Names des Events
						- eventvalue: Wert des Events (bel. Javascript Datenstruktur)
						- function:   Optional: Funktion, welche aufgreufen werden soll

*/
eventHandler.prototype.receiveFromServer=function(e) {
	// alert("on client - Event:"+event.eventname+" Value:"+event.eventvalue.test);
	var fobject=this.eventlist[e.eventname];
	
	if (!fobject) return;
	if (!fobject.flist) return;
	for(i=0;i<fobject.flist.length;i++) {
		var f=fobject.flist[i];
		var str=f+"(e.eventvalue);";
		eval(str);
	}

}
/*
	ein Link/Button in einem AJAX Objekt eines Formulars ausführen
	Übergabe: - Node-Id vom Button
		      - SPAN-ID des Objekts
		      - IFRAME Ansichts Event
*/
eventHandler.prototype.AJAXObjectFormLink=function(node,render_iframe_id,wf_viewevent) {

	var form=crossBrowserLib.findParentElementByTagName(node,"FORM"); 
	if (!form) {
		alert("ERROR: FORM is missing for AJAX Button")
		return;
	}
//	alert(form.innerHTML);
	this.displayWaitImage(render_iframe_id);
	
	var name=node.getAttribute("submitName");
	var submit=crossBrowserLib.addFormElement(form,document,"hidden",name,"true");	
	var field_render_iframe_id=crossBrowserLib.addFormElement(form,document,"hidden","render_iframe_id",render_iframe_id);	
	var field_wf_viewevent=crossBrowserLib.addFormElement(form,document,"hidden","wf_viewevent",wf_viewevent);	


	if (form.onsubmit)	form.onsubmit();
	try { var ret=global_hide_iframe; } catch (e) { ret=false; }
	global_hide_iframe=true;
	var iFrameName=this.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="+wf_viewevent;
	form.submit();
	form.target=oldtarget;
	form.action=oldaction;
	submit.parentNode.removeChild(submit);
	
	field_render_iframe_id.parentNode.removeChild(field_render_iframe_id);
	field_wf_viewevent.parentNode.removeChild(field_wf_viewevent);
	
//	alert(submit);
}
/*
	Wartebild in der Mitte des Objekt-DIVs anzeigen
	Übergabe: - ID des Objekt DIVs mit waitImage Attribut (none, nicht gesetzt oder URL des Bildes)

*/
eventHandler.prototype.displayWaitImage=function(render_iframe_id) {

	var div=document.getElementById(render_iframe_id);
	var w=div.offsetWidth;
	var h=div.offsetHeight;
	
	if (!div) {
		alert("ERROR: DIV with ID "+render_iframe_id+" not found!")
		return;
	}	
	var src=div.getAttribute("waitImage");
	if (!src) src="/ps/gfx/waitdog.gif";
	if (src=="none") return;
	var coords=crossBrowserLib.getPageCoords(div);	
	var back = document.createElement("div");
	document.body.appendChild(back);
	back.id="waitImage_back";
	back.style.position="absolute";
	back.style.left=coords.x+"px";
	back.style.top=coords.y+"px";
	back.style.width=div.offsetWidth+"px";
	back.style.height=div.offsetHeight+"px";
	back.style.background="black";
	back.style.MozOpacity="0.1";
	back.style.opacity="0.1";
	back.style.filter="Alpha(opacity=10)";
	back.style.cursor="wait";
	back.style.zIndex=100000;
	var img = document.createElement("img");
	img.setAttribute("src",src);
	img.setAttribute("id","ajaxwait");	
	document.body.appendChild(img);	
	img.style.position="absolute";
	var x=div.offsetWidth/2+coords.x-40;
	var y=div.offsetHeight/2+coords.y-40;	
	img.style.left=x+"px";
	img.style.top=y+"px";
	img.style.zIndex=100000;
	img.id="waitImage_img";
}
/*
	Eine Funktion einem Event zuordnen

	Übergabe: - Event
	          - Funktionsname
*/
eventHandler.prototype.registerFunction=function(eventname,fname) {
	var fobject=this.eventlist[eventname];
	if (fobject) return;
	if (!fobject) fobject={};
	if (!fobject.flist) fobject.flist=[];
	fobject.flist[fobject.flist.length]=fname;
	this.eventlist[eventname]=fobject;
}
// alle Portlets suchen, welche nach diesem Event refreshed werden muessen
eventHandler.prototype.refreshPortlets=function(event,instance_id) {
	if (this.refreshCounter) {	// naechstes Portlet aktualisieren
		this.refreshCounter--;
		var node=this.refreshlist[this.refreshCounter];

		var eobj={wf_instance_id:node.instance_id,wf_viewevent:node.view_event,
		render_iframe_id:"wfinst_"+node.instance_id,module_id:node.module_id,wf_desktop:node.wf_desktop};	         
		this.sendToServer("refresh_extern",eobj);	
		return;
	}
//	alert(event);
	 var nodes=document.getElementsByTagName("portlet_onrefresh");
	 this.refreshlist=[];this.refreshlist.length=0;
	 for(var i=0;i<nodes.length;i++) {
	 	var node=nodes[i];

	 	var eventlist=node.getAttribute("eventlist").split(",");
	 	for(var k=0;k<eventlist.length;k++) {
	 		if (eventlist[k]==event) {	 			
		 		var obj={instance_id:node.getAttribute("instance_id"),view_event:node.getAttribute("view_event"),
			 		module_id:node.getAttribute("module_id"),wf_desktop:node.getAttribute("wf_desktop")};
		 		if (obj.instance_id!=instance_id) {			 		
			 		//alert(obj.view_event+" event: "+event+" inst_id:"+obj.instance_id);		 		
	 				this.refreshlist[this.refreshlist.length]=obj;
	 			}
	 		}
	 	}
	 }
	// 
	 this.refreshCounter=this.refreshlist.length;
	// alert(this.refreshCounter);
	 if ( this.refreshCounter==0) return;
	 this.refreshPortlets(event,instance_id);

}


/*
                method  : POST/GET
                url             : Call url
                func    : custom function which is used to process returned data,
                                take only one parameter
*/
eventHandler.prototype.downloadURL= function(method, url, func) {
        var httpObj;
        var browser = navigator.appName;
        if(browser.indexOf("Microsoft")>-1)
                httpObj=new ActiveXObject("Microsoft.XMLHTTP");
        else
                httpObj = new XMLHttpRequest();
        httpObj.open(method,url,true);

        httpObj.onreadystatechange=function() {
                if(httpObj.readyState==4){
                        if (httpObj.status==200) {
                                var contenttype=httpObj.getResponseHeader('Content-Type');
                                if (contenttype.indexOf('xml')>-1) {
                                        func(httpObj.responseXML);
                                } else {
                                        func(httpObj.responseText);
                                }
                        } else {
                                func('Error: '+httpObj.status);
                        }
                }
        };
        httpObj.send(null);
}

