
/******************************************************************************
 *
 * 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 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();
			url=encodeURI(url); 
            req.open("GET", url, true);
            req.send(null);
        }
    }
    
    
    var processReqChange = function()
    {
        // only if req shows "complete"
        if (req.readyState == 4) {
            // only if "OK"
            //if (req.status == 0 || req.status == 200) {
            if (req.status == 200) {
                // processing statements go here
                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
 */
function updateMap(url, response) {
    var loadObj = 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;
        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 refreshToc = eval(response.refreshToc);
        refreshToc = true;
        if (refreshToc) {
            var tocurl = PM_XAJAX_LOCATION + 'x_toc_update.php?' + SID;
            updateTocScale(tocurl, '');
        }
        
        
        // Scale-related activities
        writescale(geo_scale);
        setSlider(geo_scale);
        PMap.scale = 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
        var vMode = _$("varform").mode.value;
        var autoidentify = '';
        //alert(varformMode);
        if (vMode == 'nquery' || vMode == 'iquery') {
            if (vMode == 'iquery'){
                autoidentify = '&autoidentify=1';
            }
            var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+ SID + '&activegroup=' + getSelectLayer() + autoidentify;
            //alert(selurl);
            updateSelectTool(selurl, '');
        }
        
        // If measure was active, delete all masure elements
        if (vMode == 'measure') {
            resetMeasure();
        }

        
        
        //Update map link
        var dg = getLayers();
        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 = PMap.config.length > 0 ? '&config=' + PMap.config : '';
        var urlPntStrPar = urlPntStr.length > 1 ? '&up=' + urlPntStr : '';
        var loc = window.location;
        var port = loc.port > 0 ? ':' + loc.port : '';
        var linkhref = loc.protocol + '/' + '/' + loc.hostname + port + loc.pathname + '?dg=' + dg + '&me=' + me + '&language=' + PMap.gLanguage + confpar + urlPntStrPar; 

        if (_$('current_maplink')) _$('current_maplink').href = linkhref;
         
    } else {
        // Input mode
        //if (maploading == false) {
            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);
        
        var tocButtons = response.tocButtons;  
        if (tocButtons.length > 0) {
            $('#autoRefreshButton').html(tocButtons);
        }                    
                  
        var tocurl = PM_XAJAX_LOCATION + 'x_toc_update.php?' + SID;
        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
    if (response != '') {
        var legStyle = response.legStyle;
        var layers = response.layers;
        
        if (legStyle == "swap" && $('#toclegend').css('display') == 'block') {
            swapToLegendView();
        } 
        
        for (var l in layers) {
            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');                
        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) {
    if (response != ''){     
        // Response mode
        var tocHTML = response.tocHTML;
        $('#toclegend').html(tocHTML);
        $('#toc').hide();
        $('#toclegend').show(); //fadeIn('normal');
    } 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;
        $('#mapToolArea').html(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;
        
        if (mode != 'iquery') {
            if (PMap.infoWin == 'window') {
                openResultwin('info.phtml?'+SID);
            } else {
                $('#infoZone').html(parseJSON(queryResult, PMap.infoWin));
                sortables_init();
                ts_alignTables();
                if(Layout.InfoZoneStyle == 4) {
                  $('#infoZone').showv();  				
				  $('#infoZone').fadeIn("slow"); 
				  $('#infoZone').fadeTo("fast", 1);
				  $('#south').hidev(); 
				  $('div.LAYERHEADER').prepend('<a href="javascript:void(0); "onclick="$(\'#infoZone\').fadeOut(); $(\'#south\').showv(); "> <img src="images/close.gif" border=0> </a> '); 
				}
            }
        } else {
            // 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;
        
        pmToc_init();
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(url);
    }   
}


/**
 * Attribute search: create items for search definitions 
 */
function createSearchItems(url, response) {
    //alert(url);
    if (response != ''){     
        // Response mode
        var searchJson = response.searchJson;
        var action = response.action;
        var divelem = response.divelem; 
        //alert(divelem);
        
        if (action == 'searchitem') {
            var searchHtml = createSearchInput(searchJson);
            //alert(searchHtml);
            $('#searchitems').html(searchHtml);
        } else {
            var searchHtml = json2Select(searchJson);
            $('#searchoptions').html(searchHtml);
        }
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(url);
    }
}


function getSuggest(suggesturl, response) {
    if (response != ''){     
        // Response mode
        var searchGet   = response.searchGet;
        var suggestList = response.retvalue;
        var fldname     = response.fldname;
        
        // add result to suggest cache
        pmSuggest.suggestCache[searchGet] = suggestList;
        
        // write out suggest options
        writeSuggestList(suggestList, fldname);
        
    } else {
        // Input mode
        var req = new AjaxRequest();   
        req.loadXMLDoc(suggesturl);
    }
}
