/** Klasse ContentManager
 *
 * Der ContentManager ist die Schaltzentrale f?r die Verwaltung 
 * der im Browser enthaltenen HTML-Elemente. Content wird vom
 * ContentManager gesetzt, indem AFM-Messages entsprechend interpretiert
 * und ausgewertet werden.
 *
 * Diese Klasse ben?tigt eine Instanz ajaxRequest und erbt von XPlatform.
 *
 * Anwendungsweit wird nur eine Instanz des ContentManagers ben?tigt.
 * Diese ist ?ber oCM ansprechbar (siehe ajax.js).
 */
function ContentManager(){
	XPlatform.call(this);
	this.ajaxRequest = null;
	this._javascripts = new Array();
	// immer wenn die Maus gedrückt wird, wird die aktuelle Koordinate 
	// hier gespeichert. Diese Information dient zur Positionierung 
	// von contextmenu und context Inhalten.
	this._mouseDownX = 0; 
	this._mouseDownY = 0;
	// Die Liste aller window-Objekte, die f?r die Realisation von Popup-
    // Fenstern notwendig ist.
	this._windowList = new ObjectList(); 
	this._windowList.add('main', window);
	this._popupInit = false;
	this._XML = null;
	
	// Variablen für die Anzeige einer Sanduhr
	this._waitState = false;
	this._waitSlot  = "";
	this._waitFarme = null;	
	
	// Code nur einmal ausführen
	//	
	if( typeof ContentManager._initialized == "undefined" ){


		ContentManager.prototype.hasScript = function(name){
			for(var i=0; i<this._javascripts.length; i++){
				if(name == this._javascripts[i])
					return true;
			}
			return false;
		}	
		
		/**
		  * Methode zum hinzuf?gen einer neuen JavaScrip-
		  * komponente.
		  * 
		  * ToDo: Entfernen bzw. check auf bereits vorhandene
		  *       scripts implementieren. 
		  */	
		ContentManager.prototype.appendScript = function(name){
			if(!this.hasScript(name)){
				scriptNode = document.createElement("script");
				scriptNode.setAttribute('type', 'text/javascript');
				scriptNode.setAttribute('src', "javascript/"+name);
				headNode = document.getElementsByTagName("head")[0];
				headNode.appendChild(scriptNode);	
				this._javascripts[this._javascripts.length] = name;
			}
		}
		
		/**
		  * Methode: setContent(content, id)
		  * 
		  * Einf?gen eines Content-Fragments in den Dokument-Baum.
		  * @param content - String mit HTML-Template Inhalt
		  * @param inId    - Die ID des Tags, in das der Content 
		  *                  eingef?gt werden soll.  
		  */
		ContentManager.prototype.setContent = function(content, inId){
			id = inId || "content";
			var nodes = this.getElementsById(inId);
			for(var i=0; i < nodes.length; i++){
				nodes[i].innerHTML = content;
			}
			
		}
		
		ContentManager.prototype.addContent = function(text, inId){
			id = inId || "content";
			node = document.getElementById(id);
			div = document.createElement("div");
			div_text = document.createTextNode(text);
			div.appendChild(div_text);
			node.appendChild(div);
		}		
	
		/** 
		  * Ausgabe eines XML-Objektes
		  */
		ContentManager.prototype.dumpXML = function(xml){
			alert(xml);
		}
		
		/**
		  * Ausgabe einer DEBUG-Meldung
		  *
		  * ACHTUNG! debug ID muss vorhanden sein
		  */
		ContentManager.prototype.setDebugMsg = function(text){
			document.getElementById('debug').innerHTML = text;
		}

		ContentManager.prototype.loadData = function(param){
			ajaxRequest.setUrl('./ajax');
			ajaxRequest.setHeader("Content-Type", "application/x-www-form-urlencoded;");
			ajaxRequest.setBody("act="+param);
			ajaxRequest.startRequest();
		}

		/**
		  * Methode: handleXMLResponse
		  *
		  * Diese Methode wertet die XML-Server-Antworten aus
		  * und best?ckt die Seite mit entsprechenden Inhalten. 
		  *
		  * @param xml - XML Objekt der Server-Antwort
		  */
		ContentManager.prototype.handleXMLResponse = function(xml){
			// Nur afm-Messages interessieren uns hier
			var msgType = null;
			var afmNodes = null;
			// IE Hack, da der IE als erste Node den "<?xml ...>"-Tag
			// sieht, während Mozilla die "echte" Wurzel des XML-Baumes
			// sieht.
			if(xml.firstChild.nodeName == "xml"){
				msgType = xml.firstChild.nextSibling.nodeName;
				try{
					afmNodes = xml.firstChild.nextSibling.childNodes;
				}catch(e){
				}
			}else{
				msgType = xml.firstChild.nodeName;
				try{
					afmNodes = xml.firstChild.childNodes;				
				}catch(e){
				}
			}
			if(msgType == "afm"){
				for(var n=0; n<afmNodes.length; n++){
				
					var afmNodeXML = afmNodes[n];
					// popup Message
					//
					if(afmNodeXML.nodeName == "popup"){
						this.handlePopupMessage(afmNodeXML);
					}
					// frame Message
					//
					else if(afmNodeXML.nodeName == "frame"){
						this.handleFrameMessage(afmNodeXML);
					}
					// data Message
					//
					else if(afmNodeXML.nodeName == "data"){
						this.handleDataResponse(afmNodeXML);
					}
					// layer Message
					//
					else if(afmNodeXML.nodeName == "layer"){
						this.handleLayerMessage(afmNodeXML);
					}
					
					// error Message
					//
					else if(afmNodeXML.nodeName == "error"){
						this.handleErrorMessage(afmNodeXML);
					}
					// contextmenu Message
					//
					else if(afmNodeXML.nodeName == "contextmenu"){
						this.handleContextmenuMessage(afmNodeXML);
					}
					// context Message
					//
					else if(afmNodeXML.nodeName == "context"){
						this.handleContextMessage(afmNodeXML);
					}
					// error Message
					//
					else if(afmNodeXML.nodeName == "start"){
						this.handleStartMessage(afmNodeXML);
					}
					// focus Message
					//
					else if(afmNodeXML.nodeName == "focus"){
						this.handleFocusMessage(afmNodeXML);
					}
					// showimage Message
					else if(afmNodeXML.nodeName == "showimage"){
						this.handleShowImageMessage(afmNodeXML);
					}
					
				}//END afm Loop
			} else{
				alert("NO afm Message!!");
			}
		}

		/** Methode handlePopupMessage
		 *
		 * Diese Methode dient zur Behandlung von Popup-Messages
		 * und erzeugt ein Popup-Fenster. Anschlie?end wird das 
		 * neue Window-Objekt in die this._windowList - Objektliste
		 * aufgenommen. 
		 * Der in xml transportierte HTML-Inhalt wird im Fenster 
		 * plaziert. Ab dann werden auch die IDs der Popup-Fenster
		 * elemente in der getElementsById(x) zur?ckgeliefert, wenn 
		 * ein Popup-Fenster ein HTML-Tag mit der Id x hat.
		 * 
		 * <popup id="s" width="w" height="h" title="t">
		 *    <html> ... </html>
		 * </popup>
		 * Mit 
		 *     s = Slot Id des im Popup darzustellenden Rahmens (frame)
		 *     w = Weite in Pixel
		 *     h = h?he in Pixel
		 *     t = Titeltext des neuen Fensters
		 */
		ContentManager.prototype.handlePopupMessage = function(xml){
		    // TODO: Ausprogrammieren !!!
			var sCtrlId = xml.getAttribute('ctrlid');
		    var sSlotId = xml.getAttribute('slotid');
		    var sWidth  = xml.getAttribute('width');
		    var sHeight = xml.getAttribute('height');
		    var sTitle  = xml.getAttribute('title');
			var popupId  = "popup" + sCtrlId;
			var popupObj = this._windowList.getObject(popupId);
			if(popupObj == null){
				var sURL = "Popup.html?slotid="+sSlotId + "&ctrlid=" + sCtrlId + "&title=" + encodeURI(sTitle);
				var popupObj = window.open(sURL, popupId, "width="+sWidth+",height="+sHeight+",status=no,resizable=yes");
	    	    this._windowList.add(popupId, popupObj);
	    	}
        	popupObj.focus();	
		}
			
		ContentManager.prototype.initPopup = function(popupId, slotId, content){
		    try{
			var popwnd = this._windowList.getObject(popupId);
			n = popwnd.document.getElementById('popupContent');
			n.setAttribute("id", slotId);
			}catch(e){
				nop();
			}
			//n.id = slotId;
			this.setContent(content,slotId);
        	this._popupInit = false;			
		}			
				
		/**
		 * Wenn der Benutzer das Popupfenster schlie?t, dann 
		 * l?st er ein removePopup aus, damit unsere Liste 
		 * auf den aktuellen Stand gebracht werden kann.
		 */
		ContentManager.prototype.removePopup = function(popupId){		
			//alert("Popup: "+popupId+" wird entfernt!");		
			this._windowList.remove(popupId);
		}
			
		/**
		 * Diese Methode liefert eine Liste mit allen HTML-Elementen
		 * der Anwendung (also Hauptfenster und s?mtliche Popups), die
		 * die Id id haben zur?ck.
		 */
		ContentManager.prototype.getElementsById = function(id){
			var elemList = new Array();
			var list = this._windowList.getObjectList();
			for(var i=0; i<list.length; i++){
				var node = list[i].obj.document.getElementById(id);
				if(node != null){
					elemList[elemList.length] = node;
				}
			}
			return elemList;
		}
				
		/** Methode handleFrameMessage
		  *
		  * Verarbeitung der frame Packete, um frames und html 
		  * inhalte im Dokument zu plazieren.
		  */
		ContentManager.prototype.handleFrameMessage = function(xml){
			// Durchlaufen aller content Elemente
			var content = xml.getElementsByTagName("content");
			for(var i=0; i<content.length; i++){
				var id = content[i].getAttribute('id');
				var htmlNode = content[i].getElementsByTagName("html")[0];
				var html = htmlNode.firstChild.nodeValue;
				this.setContent(html, id);					
						
				// evtl. Einfuegen benoetigter JavaScripts
				var scripts = xml.getElementsByTagName("script");
				if(scripts){
					for(var i=0; i< scripts.length;i++){
						this.appendScript(scripts[i].firstChild.nodeValue);
					}
				}
			} 
					
			// Check, ob evtl. init-Anfragen gestellt werden muessen
			var init = xml.getElementsByTagName("init");
			for(var i=0; i < init.length; i++){
				this.loadData(init[i].firstChild.nodeValue);
			}
			// 		
		}
	
		/** Methode handleLayerMessage
		  *
		  * Methode zum einschieben eines Layer ?ber die restliche
		  * Seite, damit HTML-Elemente im Vordergrund plaziert werden
		  * k?nnen. Alle Layer-Elemente werden im div-Tag mit der Id
		  * "layer_content_slot" untergrbracht (auch Error-Messages).
		  * Jedes HTML-Layerelement muss von einem HTML-Element mit 
		  * der Id "layer_content" umschlossen sein, damit es plaziert
		  * werden kann. Auch muss das Beenden der Layer-Ansich durch 
		  * dass Layer-Element gew?hrleistet werden. Hierzu ist die
		  * JS-Methode 
		  *
		  */
		ContentManager.prototype.handleLayerMessage = function(xml){
			// Durchlaufen aller content Elemente
			var content = xml.getElementsByTagName("content");
			for(var i=0; i<content.length; i++){
				var id = "layer_content_slot";
				var htmlNode = content[i].getElementsByTagName("html")[0];
				var html = htmlNode.firstChild.nodeValue;
				this.setContent(html, id);
			}
			
			this.application2Background();
        	if(!this._iex){
 	        	this.centerElement("layer_content");
			    anim = new ObjectAnimation("layer_content");
			    anim.fadeIn(0,10,1);
			}else{
				this.getElementById("layer_content").style.visibility = "visible";
				this.centerElement("layer_content");				
			}
		}
	
		/** Methode handleDataResponse
		  *
		  * Verarbeitung der data Packete, um reine Daten im Dokument
		  * zu plazieren. (Beinhaltet den Austausch von texten input
		  * und textarea Feldern.
		  */				
		ContentManager.prototype.handleDataResponse = function(xml){
			var id = xml.getAttribute("id");
			var nodes = xml.childNodes;
			for(var i=0; i< nodes.length;i++){
				var name =  nodes[i].nodeName;
				var nodeId = id + "." + name;
				var documentNodes = this.getElementsById(nodeId);
				for(var k=0; k<documentNodes.length; k++){
					//var dn = document.getElementById(nodeId);
					var dn = documentNodes[k];
					if(dn && nodes[i].firstChild){
						this.insertResponseData(nodes[i], dn);				
					}
				}
			}
		}
	
		/** Methode indertResponseData
		 *
		 * Diese Methode f?gt den durch die XML-Node respNode gegebenen Inhalt
		 * in das zugeh?rige HTML-Element documentNode ein. Hierbei werden verschiedene
		 * HTML-Typen unterschieden. Das Einf?gen neuer Daten h?ngt somit vom
		 * Typ des jeweiligen HTML-Elements ab.
		 */	
		ContentManager.prototype.insertResponseData = function(respNode, documentNode){
			var inhalt = '';
			if(respNode.childNodes.length > 0){
				inhalt = respNode.firstChild.nodeValue;
				if(inhalt == ' ') inhalt = '';
			}
			// Die documentNode ist ein INPUT-Element vom Typ text
			if(documentNode.nodeName == "INPUT" && documentNode.type == "text"){
				documentNode.value = inhalt;
				documentNode.setAttribute("value", inhalt);
			// Die documentNode ist ein INPUT-Element vom Typ checkbox
			}else if (documentNode.nodeName == "INPUT" && documentNode.type == "checkbox"){
				documentNode.checked = (inhalt == 'true') ? true : false;
			// Die documentNode ist ein TEXTAREA-Element
			}else if (documentNode.nodeName == "TEXTAREA"){
				documentNode.value = inhalt;
			// Die documentNode ist ein IMG-Element. Es wird die respNode als
			// neue source des Bildes interpretiert.
			}else if (documentNode.nodeName == "IMG"){
				documentNode.src = inhalt;
			// Die documentNode ist ein A-Element
			}else if (documentNode.nodeName == "A"){
				documentNode.setAttribute("value", inhalt);
			// Die documentNode ist ein Formular-Button	
			}else if (documentNode.nodeName == "INPUT" && documentNode.type== "button"){
				if(inhalt == "disabled")
					documentNode.setAttribute("disabled", inhalt); 
				else
					documentNode.removeAttribute("disabled");
			// Die documentNode ist eine Selectbox
			}else if (documentNode.nodeName == "SELECT"){
				// ACHTUNG: Baustelle nur IE und Moz
				var optXML = respNode.childNodes;
				var sel = parseInt(respNode.getAttribute("selected"));
				if(optXML){ // Es wurden options versendet
					// Optionen loeschen
					for(var k=(documentNode.length-1); k>=0; k--){
						documentNode.remove(documentNode.options[k]);
					}							
					var selIndex = 0;
					// Optionen einfuegen							
					for(var j=0; j<optXML.length; j++){
						var wert = optXML[j].firstChild.nodeValue;
						var val  = parseInt(optXML[j].getAttribute('value'));
						var newOpt = document.createElement("option");
						newOpt.text = wert;
						newOpt.value = val;
						if(this._iex)
							documentNode.add(newOpt);
						else
							documentNode.add(newOpt,null);
						if(val==sel){
							selIndex = j;
						}
					}
					documentNode.selectedIndex = selIndex;
				}else{       // Es wurde nur eine Option gesendet
					alert("Nur eine Option: Baustelle ContentManager.js 187ff");
				}
			}else{
				documentNode.innerHTML = inhalt;
			}
		}
		
		/** Methode handleErrorMessage
		  * 
		  * TODO: ausbauen und richtig benennen.
		  */
		ContentManager.prototype.handleErrorMessage = function(xml){
        	this.application2Background();
        	if(!this._iex){
 	        	this.centerElement("infobox");
			    anim = new ObjectAnimation("infobox");
			    anim.fadeIn(0,10,1);
			}else{
				this.getElementById("infobox").style.visibility = "visible";
				this.centerElement("infobox");				
			}
		}
		
		ContentManager.prototype.handleContextmenuMessage = function(xml){
			var inhalt = xml.firstChild.nodeValue;
			var node = this.getElementById('ContextMenuContainer');
			node.innerHTML = inhalt;
			menu.extendContextmenu('ContextMenuContent');
		}
		
		ContentManager.prototype.handleContextMessage = function(xml){
			var inhalt = xml.firstChild.nodeValue;
			var sId = xml.getAttribute('id');
			var aNodes = this.getElementsById(sId);
			for(var i=0; i<aNodes.length; i++){
				aNodes[i].innerHTML = inhalt;
			}
			this.extendContext('ContextContent');
		}
		
		ContentManager.prototype.extendContext = function(id){
			// Positionierung des Elements
			var aNodes = this.getElementsById(id);
			
			var node = aNodes[0];
			t = (this._mouseDownY - 20)>0 ? this._mouseDownY - 20 : 10;
			l = (this._mouseDownX - 50)>0 ? this._mouseDownX - 50 : 10;
			node.style.top = t + "px";
			node.style.left = l + "px";
			node.style.display = 'block';
			obj = new ObjectAnimation(id, node);
	        obj.fadeIn(0,10,1);
		}	
		
		ContentManager.prototype.closeContext = function(id){
			var aNodes = this.getElementsById(id);
			for(var i=0; i<aNodes.length; i++){
				var node = aNodes[i];
		    	node.style.visibility = "hidden";
		    }
		}

		ContentManager.prototype.handleFocusMessage = function(xml){
			var id = xml.firstChild.nodeValue;
			this.focusElement(id);
		}
		
		ContentManager.prototype.hide = function(id){
			anim = new ObjectAnimation(id);
			anim.fadeOut(100,20,5);
			this.application2Foreground();
		}
		
		ContentManager.prototype.closeLayer = function(){
			anim = new ObjectAnimation("layer_content");
			anim.fadeOut(100,20,5);
			this.application2Foreground();
			var node = this.getElementById("layer_content_slot");
			node.innerHTML="&nbsp;";
		}		
		
		ContentManager.prototype.application2Background = function(){
			var o = this.getElementById("layer_10");
		    this.hideAllSelectboxes();			
			o.style.visibility = "visible";			
			o.style.width = this.getInnerWidth() + "px";
			o.style.height = this.getInnerHeight() + "px";
			//o.style.height = window.innerHeight + "px";
			this.setObjectOpacity(o, 90);
		}
		
		ContentManager.prototype.application2Foreground = function(){
			var o = this.getElementById("layer_10");
		    this.showAllSelectboxes();			
			o.style.width = "1px";
			o.style.height = "1px";
			o.style.visibility = "hidden";
		}		
		
		ContentManager.prototype.handleStartMessage = function(xml){
			sendMessage("MenuControle", "start");
		}
		
		ContentManager.prototype.centerElement = function(id){
			var node = document.getElementById(id);
			if(node == null){
				alert("Node not found in document: "+ id);
			}
			var elem_width = 320;
			var elem_height = 400;
			// Falls die Attribute nicht vorhanden, soll ein 
			// guter Mittelwert genommen werden.
			try{
	        	elem_width = this.getWidth(node);
		    }catch(e){}
		    try{
   	        	elem_height = this.getHeight(node);
		    }catch(e){}
        	var wind_width  = this.getInnerWidth();
        	var wind_height = this.getInnerHeight();
        	var xpos = wind_width/2 - elem_width/2;
        	var ypos = wind_height/2 - elem_height/2;
        	node.style.left = xpos + "px";
        	node.style.top  = ypos + "px";
		}
		
		
		
		/** Methode getElementsByName
		  *
		  * liefert ein Array mit den Elementen, deren Name auf 
		  * den regulaeren Ausdruck c passen zurueck.
		  */
		ContentManager.prototype.getElementsByName = function(c){
			var array = [];
			var list = this._windowList.getObjectList();
			for(var j=0; j<list.length; j++){
				var tags = list[j].obj.document.getElementsByTagName("*");
				//var tags = document.getElementsByTagName("*");
	    		for (var i=0, len = tags.length; i < len; i++){
					if( c.test(tags[i].name) ) {
						array[array.length] = tags[i];
					}
				}
			}
	    	return array;
		}
			
		/** Methode hideAllSelectboxes
		  *
		  * Methode versteckt alle <select> Elemente der aktuellen
		  * Seite. Diese Methode ist speziell f?r den Fehler des IE,
		  * der eine Selectbox vom z-Index her ?ber alles stellt und
		  * somit absolut unbrauchbar ist f?r eine Anwendung, die 
		  * "Layer" benutzt. 
		  * 
		  */
		ContentManager.prototype.hideAllSelectboxes = function(){
			var tags = document.getElementsByTagName("select");
    		for (var i=0, len = tags.length; i < len; i++){
    			tags[i].style.visibility = "hidden";
			}
		}
			
		ContentManager.prototype.showAllSelectboxes = function(){
			var tags = document.getElementsByTagName("select");
    		for (var i=0, len = tags.length; i < len; i++){
    			tags[i].style.visibility = "visible";
			}
		}
		
		
		ContentManager.prototype.valueOf = function(id){
			
			var node = document.getElementById(id);
			if(node){
				if(node.value!="")
					return node.value;
				else
					return " ";
			}else{
				return " ";
			}
		}
		
		ContentManager.prototype.selectBoxGetSelectedValue = function(obj){
			var val = null;
			for(var k=0; k<obj.options.length; k++){
	            if(obj.options[k].selected == true){
	                //txt = obj.options[k].text;
	                val = obj.options[k].value;
	            }
        	}
        	return val;
		}		
		
		ContentManager.prototype.setBackgroundImage = function(id, img){
			node = document.getElementById(id);
			node.style.backgroundImage = "url(" + img +")";
		}

		ContentManager.prototype.focusElement = function(id){
			var node = this.getElementById(id);
			node.focus();
		}
		
		
		ContentManager.prototype.getFormElementValue = function(elem){
			var value = "";
			if(elem.nodeName == "INPUT"){
	    		var type = elem.getAttribute('type');
	    		if(type == 'checkbox'){
    				value = elem.checked;
	    		}else{
		    		value = encodeURI(elem.value);
	    		}
			}else if(elem.nodeName == "TEXTAREA"){
				value = encodeURI(elem.value);
			}else if(elem.nodeName == "SELECT"){
				value = encodeURI(this.selectBoxGetSelectedValue(elem));
			}
			return value;
		}
		
		
	ContentManager._initialized = true;
	}
}
ContentManager.prototype = new XPlatform();


/**
 * <showimage src="SRC" widht="WIDTH" height="height" />
 */
ContentManager.prototype.handleShowImageMessage = function(xml){
    var src    = xml.getAttribute('src');
    var width  = xml.getAttribute('width');
    var height = xml.getAttribute('height');
    var content = xml.firstChild.firstChild.nodeValue;
    //alert("src=" + src+ " width="+ width + " height=" + height);
    
    imgNode = document.createElement("div");
	//    imgNode.src = src;
    imgNode.width = width+20;
    imgNode.height = height+20;
    imgNode.className="showImage";
    imgNode.style.left = this.getInnerWidth()/2-width/2;
    imgNode.style.top = this.getInnerHeight()/2-height/2;
    imgNode.style.visible = 'hidden';
    imgNode.id = "showimage";
	this.application2Background();
    /*
    imgNode.onmouseup = function(){
    	o = document.getElementById("showimage");
    	o.parentNode.removeChild(o);
    	//document.body.removeChild();
    }
    */
    document.body.appendChild(imgNode);
    imgNode.innerHTML = content;
    if(!this._iex){
	    anim = new ObjectAnimation("showimage");
    	anim.fadeIn(0,10,1);
    }else{
    	imgNode.style.visible="visible";
    }
}

ContentManager.prototype.CloseImageLayer = function(){
    	o = document.getElementById("showimage");
    	o.parentNode.removeChild(o);
    	this.application2Foreground();
}

ContentManager.prototype.showWaitAnimation = function(slotID){
	this._waitSlot = slotID;
	var node = this.getElementById(this._waitSlot);
	this._waitFarme = node.cloneNode(true);
	node.innerHTML = "<div class=\"wait\"><table width=\"98%\" height=\"98%\"><tbody><tr><td valign=\"middle\" align=\"center\"><img src=\"imgs/wait.gif\" /></td></tr></tbody></table></div>";
	this._waitState = true;
}

ContentManager.prototype.stopWaitAnimation = function(){
	var dstNode = this.getElementById(this._waitSlot);
	var srcNode = this._waitFarme;
	for(var i=0; i<dstNode.childNodes.length; i++){
    	dstNode.removeChild(dstNode.childNodes[i]);
    }
    for(var i=0; i<srcNode.childNodes.length; i++){
	    dstNode.appendChild(srcNode.childNodes[i]);    	
    }

	this._waitState = false;
}

