// JavaScript Document
// xmlhttp.js
// Funktionen zur Kommunikation mittels XMLHttpRequest (AJAX)

var msRequestMode;
var msRequestOverriding=false;
var dbRequestQueue = new Array();

// Request-Objekt erzeugen
function createRequestObject() {
    var requestObject;
    if (window.XMLHttpRequest) {
        requestObject = new XMLHttpRequest();
        /* Gab Javascript-Fehler, deshalb auskommentiert
        if (requestObject.overrideMimeType) {
        	requestObject.overrideMimeType('text/xml');
        }*/
    } else {
        requestObject = new ActiveXObject("Microsoft.XMLHTTP");
        //requestObject = new ActiveXObject("Msxml2.XMLHTTP")        
    }
    return requestObject;
}

var ms_xmlhttp = createRequestObject(); // Kommunikation mit Mapserver-CGI
var db_xmlhttp = createRequestObject(); // Kommunikation über PHP mit Datenbank (PostGIS/ADS: Queries, Identify, etc.) 

//Anfrage an Mapserver senden
function sendMSRequest(msRequest) {
	if (debug) alert('xmlhttp msRequest: ' + msRequest);
	if (debug==2) window.open(msRequest,'_blank');
	// alte Selektion löschen
	selection.gid=new Array();
	if ((ms_xmlhttp.readyState==0)||(ms_xmlhttp.readyState==4)) {
		showProcessBar('loadMap');	
		ms_xmlhttp.open('GET', msRequest, true);
	    	ms_xmlhttp.onreadystatechange = handleMSResponse;
		ms_xmlhttp.send(null);
		msRequestOverriding=false;
	} else if (msRequestOverriding) {
		//Request läuft, soll abgebrochen werden (WheelZoom)
		ms_xmlhttp.abort();	
		window.setTimeout("sendMSRequest('"+msRequest+"')", 50);
		//alert('Bitte warten... Ihre letzte Aktion wird noch bearbeitet.');
	}
}

//Mapserver-Antwort behandeln
function handleMSResponse() {
	//wenn Response geladen
	if(ms_xmlhttp.readyState == 4){
	    try{
	    	if(ms_xmlhttp.status == 200) { 	//kein Fehler	    	
		        var response = ms_xmlhttp.responseText;
		        if (debug) alert('xmlhttp msResponse: ' + response);
		        //response=response.replace("<!--", "/*");
		        //response=response.replace("-->", "*/");		        
		        eval(response);
		        refreshMap(mapImage.src);
				refreshReference(refImage.src);
				refreshLegend(legImage.src);
				hideProcessBar();
			    switch (msRequestMode) {
			    	case '_getMap':
			    		break;
			    	case '_search':
			    		//alert(selection.qLayer + '/' + selection.gid);
			    		//dbRequestMode='_identify';
						db_query(selection.qLayer,selection.gid,selection.dsnType);						
			    		//um Darstellung der Ergebnise ergänzen						
			    		break;
			    	default:
			    		break;
			    }
			} else if(ms_xmlhttp.status != 0) {
	                alert('Beim Bearbeiten des XMLHTTP-Requests ist Fehler ' + ms_xmlhttp.status + ' aufgetreten.');
	        }
	    	//hideProcessBar();
			//xMoveTo('elMap', 0, 0);	    	
		} catch(e){
  			console.info("Fehler beim Zugriff auf MS-XMLHttpObject",ms_xmlhttp);
		}		
	}
}

//DB-Anfrage in Queue einfügen
function queueDBRequest(dbRequest) {
	dbRequestQueue.push(dbRequest);
	sendDBRequest();
} 

//Anfrage an Postgres/PostGIS senden
function sendDBRequest(url, dbRequest) {
//function sendDBRequest() {
	if (debug) alert('xmlhttp dbRequest: ' + dbRequest);
	/*if ((db_xmlhttp.readyState==0)||(db_xmlhttp.readyState==4)) {
		showProcessBar('loadData');
		db_xmlhttp.open('POST', url, true);
	    db_xmlhttp.onreadystatechange = handleDBResponse;
		db_xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	    
		db_xmlhttp.send(dbRequest);
	} else {
		alert('Bitte warten... Ihre letzte Anfrage wird noch bearbeitet.');
	}*/
	if ((dbRequest.indexOf('_identify')!=-1)||(db_xmlhttp.readyState==4)||(db_xmlhttp.readyState==0)) {
		//ausführen
		/*
		if (dbRequest.indexOf('_identify')!=-1) {
			dbRequestMode='_identify';
		} else {
			dbRequestMode='_maptip';		
		}*/
		if ((db_xmlhttp.readyState>0)&&(db_xmlhttp.readyState<4)) {
			db_xmlhttp.abort();
		}
		if (dbRequest.indexOf('_maptip')==-1) showProcessBar('loadData');
		db_xmlhttp.open('POST', url, true);
    	db_xmlhttp.onreadystatechange = handleDBResponse;
		db_xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	    
		db_xmlhttp.send(dbRequest);
	}
}

//Postgres/PostGIS-Antwort behandeln
function handleDBResponse() {
	//wenn Response geladen
    if(db_xmlhttp.readyState == 4){
    	try{
	    	if (db_xmlhttp.status == 200) { 	//kein Fehler
	    		var dbResponseText=db_xmlhttp.responseText;
		        if (debug) alert('xmlhttp dbResponse="' + dbResponseText + '"');
		        if (db_xmlhttp.responseText.indexOf('ERROR')!=-1) alert('Fehler bei Datenbankabfrage:\n' + dbResponseText);
		        if (dbResponseText!="") {
		        	if (dbResponseText.indexOf('_identify')!=-1) {			    		
				    	showInfoHTML(dbResponseText);
				    } else if (dbResponseText.indexOf('_maptip')!=-1) {
						showMaptipHTML(dbResponseText);
				    } else if (dbResponseText.indexOf('info_mode')!=-1) {
				    	alert('Fehler bei Datenbankabfrage: info_mode unbekannt:\n"' + dbResponseText + '"');
				    } else {
				    	//Antwort leer
				    }
				}
		} else if(ms_xmlhttp.status != 0) {
	          	alert('Beim Bearbeiten des XMLHTTP-Requests ist Fehler ' + db_xmlhttp.status + ' aufgetreten.');
	       }
	    	hideProcessBar();
	    } catch(e){
	  		console.info("Fehler beim Zugriff auf DB-XMLHttpObject",db_xmlhttp);
		}
	}
	
}

//XML parsen
function getXMLFirstChildText(aParent, aTag) {
	var aChild = aParent.getElementsByTagName(aTag)[0];
	return (aChild.firstChild)&&(aChild.firstChild.nodeType==3) ? aChild.firstChild.data : "";
}

