
/******************************************************************************
 *
 * Purpose: AJAX (XMLHTTP) requests
 * Author:  Armin Burger
 *
 ******************************************************************************
 *
 * Copyright (c) 2003-2006 Armin Burger
 *
 * This file is part of p.mapper.
 *
 * p.mapper is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version. See the COPYING file.
 *
 * p.mapper is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with p.mapper; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ******************************************************************************/
 
/*******************************************************************************
 Examples for XMLHTTP taken from DREW MCLELLAN on
 http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
 with additional ideas/concepts from 
 Chirp Internet: www.chirp.com.au
 
*******************************************************************************/

var xn = 0;
var maploading = false;



/**
 * GENERIC XMLHTTP FUNCTIONS
 */
function AjaxRequest()
{
    var req;
		var processReqChange;
   
    //var method = "GET";
    //var nocache = true;
    
    this.loadXMLDoc = function(url) 
    {
				// branch for native XMLHttpRequest object
        if (window.XMLHttpRequest) {
            try {
                req = new XMLHttpRequest();
            } catch(e) {
                req = false;
            }
        // branch for IE/Windows ActiveX version
        } else if (window.ActiveXObject) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    req = false;
                }
            }
        }
        if (req) {
            req.onreadystatechange = processReqChange;
            // avoid caching by adding arbitrary values
            //url += '&zxyq=' + (new Date()).getTime();
            req.open("GET", url, true);
            req.send(null);
        }
    }
    
    
    var processReqChange = function()
    {
        // only if req shows "complete"
        if (req.readyState == 4) {// only if "OK"
						//alert(req.responseText);
            //if (req.status == 0 || req.status == 200) {
            if (req.status == 200 || req.status == 404) {
                // processing statements go here
								//alert(mapW);
								//alert(mapH);
								//console.log(req.responseText+ ' req.responseText xmlhttp.js');
                eval('response = ' + req.responseText);
                
                if (response.method){
                    method = response.method;
                    eval(method + '(\'\',' + req.responseText + ')');
                } else {
                    eval(req.responseText);
                }
                
            } else {
                
            }
        }
    }
}



/*==================================================================================================*/


/******************************************
 * P.MAPPER-RELATED XMLHTTP FUNCTIONS
 ******************************************/

/**
 * For loading/updating the MAP
 * Wird nach jeder Aktion in der Karte ausgeführt
 */
function updateMap(url, response) {
    var mode = '';
		mode = $("varform");
		 //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
		// Deshalb muss hier der opener ergänzt werden
		// Ladebalken
		//alert(mapW);
	  //alert(mapH);
		if (mode==null) {
		var loadObj = opener.document.getElementById("loading");
		}
		else {
    var loadObj = document.getElementById("loading");
		}
		//var loadObj = opener.document.getElementById("loading");
    if (response != '') { 
        // Response mode
        // Reload application when PHP session expired
        var sessionerror = response.sessionerror;
        if (sessionerror == 'true') {
           errormsg = localeList['sessionExpired']; 
           //alert(errormsg);
           window.location.reload();
           return false;
        }
        
        var rBxL = response.refBoxStr.split(',');
        //var refW = response.refW;
        //var refH = response.refH;
				// *** übergabe des Extents des neuen Kartenausschnitts
				 //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
				 //Ansonsten werden die Koordinaten nicht richtig übergeben
				 //Speicherung der aktuellen Mauskoordinaten
				if (mode==null){
        opener.minx_geo = parseFloat(response.minx_geo);
        opener.maxy_geo = parseFloat(response.maxy_geo);
				opener.xdelta_geo = parseFloat(response.xdelta_geo);
        opener.ydelta_geo = parseFloat(response.ydelta_geo);
				}
				else {
				minx_geo = parseFloat(response.minx_geo);
        maxy_geo = parseFloat(response.maxy_geo);
				xdelta_geo = parseFloat(response.xdelta_geo);
        ydelta_geo = parseFloat(response.ydelta_geo);
				}
        
        var geo_scale = response.geo_scale;
        var urlPntStr = response.urlPntStr;
        
        // Load new map image
        loadMapImg(response.mapURL);
        
        // Check if TOC has to be updated
        var tocStyle = response.tocStyle;
        var refreshToc = eval(response.refreshToc);
        refreshToc = true;
				
				//alert(mode+' "tocstyle zeile 214 xmlhttp.js');
        if (refreshToc) {
				     //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
						//Ansonsten wird der TOC nicht upgedatet
						//Update der Legende
						if (mode==null) {
            var tocurl = opener.PM_XAJAX_LOCATION + 'x_toc_update.php?' + opener.SID;
            updateTocScale(tocurl, '');
						}
						else {
						var tocurl = PM_XAJAX_LOCATION + 'x_toc_update.php?' + SID;
            updateTocScale(tocurl, '');
						}
        }
        
        
        // Scale-related activities
				// Schreiben des Massstab in Textbox
        writescale(geo_scale);
				//Aktualisierung des slider
        setSlider(geo_scale);
        pMap_setMapScale(geo_scale);
        
        
        // Reference image: set DHTML objects
        setRefBox(rBxL[0], rBxL[1], rBxL[2], rBxL[3]);
        
        // reset cursor
        //setCursor(false);
        
        // Update SELECT tool OPTIONs in case of 'select' mode
				//alert($("varform")+' Zeile 246 xmlhttp.js');
				if ($("varform")==null) {
				var varformMode = response.mode;
				}
				else {
        var varformMode = $("varform").mode.value;
				}
        //alert(varformMode+' Zeile 246 xmlhttp.js');
        if (varformMode == 'nquery' || varformMode == 'iquery') {
            var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+ SID + '&activegroup=' + getSelectLayer() ;
            updateSelectTool(selurl, '');
        }
        
        // If measure was active, delete all emasure elements
        if (varformMode == 'measure') {
            resetMeasure();
        }
				
        //Update map link
        var dg = getLayers();
        
				 //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
				//Wieder für richtige Anzeige der Koordinaten
				//Übergabe der Koordinaten
				if (mode==null) {
				//alert(maxx_geo+' '+opener.xdelta_geo+' '+opener.minx_geo);
				var maxx_geo = opener.xdelta_geo + opener.minx_geo;
        var miny_geo = opener.maxy_geo - opener.ydelta_geo;
        var me = opener.minx_geo + ',' + miny_geo + ',' + maxx_geo + ',' + opener.maxy_geo;
        var confpar = opener.config.length > 0 ? '&config=' + opener.config : '';
        var urlPntStrPar = urlPntStr.length > 1 ? '&up=' + urlPntStr : '';
        var loc = window.location;
        var linkhref = loc.protocol + '//' + loc.hostname + loc.port + loc.pathname + '?dg=' + dg + '&me=' + me + '&language=' + opener.gLanguage + confpar + urlPntStrPar; 
				//opener.$('current_maplink').href = linkhref;
				}
				else {
				var maxx_geo = xdelta_geo + minx_geo;
        var miny_geo = maxy_geo - ydelta_geo;
        var me = minx_geo + ',' + miny_geo + ',' + maxx_geo + ',' + maxy_geo;
				var confpar = config.length > 0 ? '&config=' + config : '';
        var urlPntStrPar = urlPntStr.length > 1 ? '&up=' + urlPntStr : '';
        var loc = window.location;
        var linkhref = loc.protocol + '//' + loc.hostname + loc.port + loc.pathname + '?dg=' + dg + '&me=' + me + '&language=' + gLanguage + confpar + urlPntStrPar;
				//$('current_maplink').href = linkhref;
				}
				
        
         
    } else {
        // Input mode
        //if (maploading == false) {
				    var mode = '';
				    mode = $("varform");
						 //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
						if (mode==null) {
						//alert(opener.document.getElementById("loading")+' loadObj xmlhttp.js');
						var loadObj = opener.document.getElementById("loading");
            maploading = true;
            loadObj.style.visibility = "visible";
            var req = new AjaxRequest(); 
						//alert(url +' mode null'); 
            req.loadXMLDoc(url);
						}
						else {
						//alert(document.getElementById("loading")+' loadObj xmlhttp.js');
				    var loadObj = document.getElementById("loading");
						//alert(url);
            maploading = true;
            loadObj.style.visibility = "visible";
            var req = new AjaxRequest();   
            req.loadXMLDoc(url);
						}
        //}
    }   
}

/**
 * Substitution for .innerHTML = ...
 */
function setInnerHTML(elementId , html){
	var el = $('toc');
	el.innerHTML = html; 
    evalInnerJS(el);
}

function evalInnerJS(element) {
	var scripts = element.getElementsByTagName('script');
	var code;
	for (var i = 0; i < scripts.length; i++) {
		code =	scripts[i].innerHTML ? scripts[i].innerHTML : 
			scripts[i].text ? scripts[i].text : 
			scripts[i].textContent;
		try {
			eval(code);
		} catch(e) {
			alert(e);
		}
	}
}


/**
 * Update the TOC 
 */
function updateToc(tocurl, response) {
    if (response != ''){     
        // Response mode
        var tocHTML = response.tocHTML;        
                        
        setInnerHTML('toc',tocHTML);        
        legendContainer.legTxt = tocHTML;
        
        var tocurl = PM_XAJAX_LOCATION + 'x_toc_update.php?' + SID;
        //window.setTimeout("updateTocScale(tocurl, ''))", 300);
        updateTocScale(tocurl, '');
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(tocurl);
    }   
}


/**
 * Update toc applying different styles to visible/not-visible layers
 */
function updateTocScale(tocurl, response) {
    // Response mode
		var mode = '';
	  mode = $("varform");
    if (response != '') {
        var layers = response.layers;
        
        for (var l in layers) {
				     //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden
						 //Sonst keine Aktualisierung TOC
				    if (mode==null) {
            var spanList = opener.document.getElementsByTagName('span');
						}
						else {
						var spanList = document.getElementsByTagName('span');
						}
            var sl = spanList.length;
            for (var s=0; s<sl; s++) {
                var spanObj = spanList[s];                 
                if (spanObj.id.indexOf( 'spxg_' + l) != -1) {
                    spanObj.className = layers[l];
                }
            }
        }
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(tocurl);
    }   
}



/**
 * Show legend over MAP
 */
function showMapLegend(tocurl, response) {
    if (response != ''){     
        // Response mode
        var tocHTML = response.tocHTML;
       // alert(tocHTML);       
        var legDiv = $('maplegend');                
        //alert("legDiv = "+legDiv);
        setInnerHTML('maplegend',tocHTML);
        legDiv.style.visibility = 'visible';
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(tocurl);
    }   
}


/**
 * Swap from TOC to LEGEND view
 */
function swapLegend(tocurl, response) {
    //alert(tocurl);
    if (response != ''){     
        // Response mode
        var tocHTML = response.tocHTML;
        var legDiv = $('toclegend');
        var tocDiv = $('toc');        
        setInnerHTML('toc',tocHTML);
        //legDiv.style.visibility = 'visible';
        //tocDiv.style.visibility = 'hidden';
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(tocurl);
    }   
}



/** 
 * For SELECT tool 
 */
function updateSelectTool(selurl, response) {
    if (response != ''){     
        // Response mode
        var selStr = response.selStr;
        $('bottomMapFrame').innerHTML = selStr;
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(selurl);
    }   
}


/**
 * Update layer options list for selection/iquery
 */
function updateSelLayers(mapurl, response) {
    if (response != ''){     
        // Response mode
        var sellayers = response.sellayers;
        
        // Update SELECT tool OPTIONs in case of 'select' mode
        var vMode = $("varform").mode.value;
        if (vMode == 'nquery' || vMode == 'iquery') {
            var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+ SID + '&activegroup=' + getSelectLayer() ;
            updateSelectTool(selurl, '');
        }
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(mapurl);
    }
}


/**
 * Add point of interest to map
 */
function addPOI(digitizeurl, response) {
    if (response != ''){     
        // Response mode
        var txt = response.retvalue;
        changeLayersDraw();
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(digitizeurl);
    }
}


/**
 * Get query results and display them by parsing the JSON result string 
 */
function getQueryResult(qurl, response) {
    if (response != ''){     
        // Response mode
        var mode = response.mode;
        var queryResult = response.queryResult;
        //Bei der Suche müssen die JavaScript "Pfade" angepasst werden, da die Attributeaus einem Popup-Window aufgerufen werden 
				if (mode == 'search') {
				    //var infoWin = 'window';
						//var SID = '';
						//alert(opener.infoWin+' infowin xmlhttp.js search');
						//alert(opener.SID+' sid xmlhttp.js search');
						//if (infoWin == 'window') {
            if (opener.infoWin == 'window') {
						    //openResultwin('info.phtml?'+SID);
								var zp = queryResult[1];
								var allextent=zp.allextent;
								//Zoom zum Suchergebnis
                opener.zoom2extent(0,0,allextent);
								//alert (openResultwin);
            } else {
                $('infoFrame').innerHTML = parseJSON(queryResult, opener.infoWin);
            }
        }
				
				
				else if (mode == 'query' || mode == 'nquery') {
				    //var infoWin = 'window';
						//var SID = '';
						//alert(infoWin+' infowin xmlhttp.js query');
						//alert(SID+' sid xmlhttp.js query');
						if (infoWin == 'window') {
            //if (opener.infoWin == 'window') {
						    openResultwin('info.phtml?'+SID);
                //openResultwin('../info.phtml?'+opener.SID);
								//alert (openResultwin);
            } else {
                $('infoFrame').innerHTML = parseJSON(queryResult, infoWin);
            }
        } else if (mode == 'iquery') {
            // Display result in DIV and postion it correctly
            showIQueryResults(queryResult);
        }

    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(qurl);
    }   
}


/**
 * Export query result 
 */
function exportQueryResults(url, response) {
    if (response != ''){     
        // Response mode
        //var mode = response.mode;

    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(url);
    }   
}



/**
 * Export query result 
 */
function addWMS(url, response) {
    if (response != ''){     
        // Response mode
        //var mode = response.mode;
        
        initToc();
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(url);
    }   
}

