
/******************************************************************************
 *
 * Purpose: main interaction with Mapserver specific requests 
 *          like zoom, pan, etc. 
 * 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
 *
 ******************************************************************************/


//********************************************************
// CONFIGURATION
//********************************************************/


// SET TO TRUE IF CURSOR SHALL CHANGE ACCORDING TO ACTIVE TOOL
var useCustomCursor = true;



//******************************************************* //
//         JAVASCRIPT FUNCTIONS FOR ZOOM, QUERY,          //
//******************************************************* //

/* Specifies how far (in pixels) a user needs to drag the mouse
 * to enable zoom to rectangle, otherwise zoom to point.
 * Should be set to >3
 ****************************************************************/
var jitter = 10;


/*****************************************************************************
 * FUNCTION IS CALLED BY ZOOMBOX -> FUNCTION chkMouseUp(e)
 * main function for zoom/pan interface
 * calls different zoom functions (see below)
 *****************************************************************************/
function zoombox_apply(e,minx, miny, maxx, maxy) {
    var imgbox = minx + "+" + miny + "+" + maxx + "+" + maxy;
    var imgxy  = minx + "+" + miny;

    // NORMAL MOUSE ACTIONS IN MAIN MAP //
    if (refmapClick == false) {

        // ZOOM/PAN ACTIONS
        var varform = document.getElementById("varform");
        if (varform.mode.value == 'map' || rightMouseButton) {
            showloading();
            // Only click
            if ((minx + jitter) > maxx && (miny + jitter) > maxy) {
                if (varform.zoom_type.value == 'zoomrect') {
                    if (rightMouseButton) {
                        zoom_factor = 1; 
                    } else {
                        zoom_factor = 2;
                    }
                    zoompoint(zoom_factor, imgxy);
                    
                } else {
                   // Pan
                   var zoom_factor = varform.zoom_factor.value;
                   zoompoint(zoom_factor, imgxy);
                }
            
            // Zoombox 
            } else {
                zoomin(imgbox);
            }

        // QUERY/IDENTIFY ACTIONS
        // query on all visible groups
        } else if (varform.mode.value == 'query') {
            showqueryresult(e,'query', imgxy);
        // query only on selected group with multiselect
        } else if (varform.mode.value == 'nquery') {
        	var selform = document.getElementById("selform");
            if (!selform.selgroup) return false;
            if (selform.selgroup.selectedIndex != -1) {
                // only with single click
                if ((minx + jitter) > maxx && (miny + jitter) > maxy) {     // x/y point
                    showqueryresult(e,'nquery', imgxy);
                // with zoom box
                } else {
                    showqueryresult(e,'nquery', imgbox);                      // rectangle
                }
            }
            
        } else if (varform.mode.value == 'digitize') {
            openDigitizeDlg(imgxy);
        } else if (varform.mode.value == 'poi') {
            openPoiDlg(imgxy);
        } else if (varform.mode.value == 'coords') {
            showCoords(imgxy);
        }

    // ACTIONS IN REF MAP //
    } else {
        zoomref(imgxy);
    }
}



/*****************************************************************************
 * ZOOM FUNCTIONS
 *******************/


/*
 * ZOOM TO POINT
 *****************/
function zoompoint(zoomfactor, imgxy) {
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoompoint&zoom_factor='+zoomfactor+'&imgxy='+imgxy;
    showloading();
    updateMap(mapurl, '');
}

/*
 * ZOOM TO RECTANGLE
 ********************/
function zoomin(extent) {
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomrect&imgbox='+extent  ;
    //alert(mapurl);
    updateMap(mapurl, '');
}

/*
 * ZOOM TO GEO-EXTENT (MAP UNITS), APPLIED FROM INFO PAGE LINK
 ***************************************************************/
function zoom2extent(layer,idx,geoextent) {
    showloading();
    // Check if resultlayers shall be passed
    if (layer == 0 && idx == 0) {                            // no
        var layerstring = '';
    } else {
        var layerstring = '&resultlayer='+layer+'+'+idx;     // yes
    }
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomextent&extent='+geoextent+layerstring;
    //document.varform.zoomselected.value = '1';
    updateMap(mapurl, '');
}

/*
 * ZOOM TO FULL EXTENT
 **********************/
function zoomfullext() {
    showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomfull';
    updateMap(mapurl, '');
}

/*
 * GO BACK TO PEVIOUS EXTENT
 ******************************/
function goback() {
    showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomback';
    updateMap(mapurl, '');
}

/*
 * GO FORWARD
 ******************************/
function gofwd() {
    showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomfwd';
    updateMap(mapurl, '');
}


// DRAW MAP WITH NEW LAYERS/GROUPS
function changeLayersDraw() {
   	showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint';
    updateMap(mapurl, '');
}



function clickStopLoading() {
    stoploading();
    if (document.all) { 
        document.execCommand('Stop')
    } else {
        window.stop();
    }
}




/*
 * PAN VIA ARROW BUTTONS OR KEYBOARD
 **************************************/
function arrowpan(direction) {
    showloading();
    var pansize = 0.1;   // defines how much to pan
    var px, py;
    if (direction == 'n') {
        px = (mapW - 1) / 2;
        py = (0 + pansize) * mapH;
    } else if (direction == 's') {
        px = (mapW - 1) / 2;
        py = (1 - pansize) * mapH;
    } else if (direction == 'e') {
        px = (1 - pansize) * mapW;
        py = (mapH - 1) / 2;
    } else if (direction == 'w') {
        px = (0 + pansize) * mapW;
        py = (mapH - 1) / 2;
    }
    
    zoompoint(1, px + "+" + py);
}


/*
 * REFERENCE IMAGE ZOOM/PAN
 ****************************/
function zoomref(imgxy) {
    showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=ref&imgxy='+imgxy  ;
    updateMap(mapurl, '');
}

// SET OVERVIEW IMAGE TO NEW ONE
function setRefImg(refimgsrc){
     var refimg = parent.refFrame.document.getElementById('refimg');
     refimg.src = refimgsrc;
}


/*
 * ZOOM TO SCALE
 *****************/
function zoom2scale(scale) {
    showloading();
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomscale&scale='+scale;
    updateMap(mapurl, '');
}

/*
 * WRITE SCALE TO INPUT FIELD AFTER MAP REFRESH
 *************************************************/
function writescale(scale) {   
    if (_$("scaleform")) _$("scaleform").scale.value = scale;
}


/****************************************************************************
 * CHANGE LAYERS
 *****************/
function setlayers(selelem) {
    // Check if layers should be mutually disabled     
    if (mutualDisableList) {
        if (mutualDisableList.inArray(selelem)) {
            for (var i=0; i<mutualDisableList.length; i++) {
                if (mutualDisableList[i] != selelem) {
                    document.getElementById('ginput_' + mutualDisableList[i]).checked = false;
                }
            }
        }
    }

    //var layerstring = '&groups=' + Base64.encode(getLayers()); 
	var layerstring = '&groups=' + getLayers();    	
    
    if (layerAutoRefresh == '1') {    	
        showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint'+ layerstring;
        updateMap(mapurl, '');
    } else {
        var passurl = PM_XAJAX_LOCATION + 'x_layer_update.php?'+SID+layerstring;
        //alert(passurl);
        updateSelLayers(passurl, '');
    }
}

function setAllLayers(){
	//var layerstring = '&groups=' + Base64.encode(getLayers());    
	var layerstring = '&groups=' + getLayers();    
    if (layerAutoRefresh == '1') {    	
        showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint'+ layerstring;
        updateMap(mapurl, '');
    } else {
        var passurl = PM_XAJAX_LOCATION + 'x_layer_update.php?'+SID+layerstring;
        //alert(passurl);
        updateSelLayers(passurl, '');
    }
}

/*
 * RETURN LAYERS/GROUPS
 ************************/
function getLayers() {
    var layerstring = '';   
    var layerForm = document.getElementById("layerform");
    if (layerForm.groupscbx) {
        for (var i=0; i<layerForm.groupscbx.length; i++) {
               if (layerForm.groupscbx[i].checked == true && layerForm.groupscbx[i].value != "on") {
                      layerstring += layerForm.groupscbx[i].value+',';
            }
        }
        layerstring = layerstring.substr(0, layerstring.length - 1);
        return layerstring;
    } else {
        return false; 
    }
}




/*****************************************************************************
 * QUERY RESULT
 ***************/
/**
 * Start identify (query) or select (nquery) 
 */
function showqueryresult(e,type, xy) {
	var varform = document.getElementById("varform");
	if (type == 'query') {
        var queryurl = PM_XAJAX_LOCATION + 'x_info.php?' +SID+ '&mode='+type + '&imgxy='+xy; // + layerstring;
    } else {
        var queryurl = PM_XAJAX_LOCATION + 'x_info.php?' +SID+ '&mode='+type + '&imgxy='+xy + '&groups=' + getSelectLayer();
        varform.zoomselected.value = '1';
    }

    if (infoWin == 'window') {
        openResultwin('blank.html');
		
    }else{
		var cookies = new Cookies();
		//alert(cookies.getCookie("mapAccess"));
		if (cookies.getCookie("mapAccess") != ""){
			if (cookies.getCookie("mapAccess") != "public")
				showProcDialog('Identify Information of Map',"MIPRIdentifyPanel","infoZone");
		}	
    }
    getQueryResult(queryurl, '');
}





/**
 * Start auto-identify (iquery)
 */
var iquery_timer;

function applyIquery(mx, my) {
    var imgxy  = mx + "+" + my;
    var queryurl = PM_XAJAX_LOCATION + 'x_info.php?' +SID+ '&mode=iquery' + '&imgxy='+imgxy + '&groups=' + getSelectLayer();
    getQueryResult(queryurl, '');
}

/**
 * Display result in DIV and postion it correctly
 */
function showIQueryResults(queryResult) {
    var iQL = _$('iqueryLayer');
    //iQL.style.left = (rawL('toolBar') - objW(iQL) - 4) + 'px';
    iQL.style.right = '4px'; //_$('mapZone').right  + 'px';
    iQL.style.top  = objT(_$('mapZone')) - objH(_$('mapNorth')) + 5 + 'px';
    
    var IQueryResult = parseJSON_IQuery(queryResult);
    
    if (IQueryResult) {
        iQL.innerHTML = IQueryResult;
        showObj(iQL);
    } else {
        iQL.innerHTML = '';
        hideObj(iQL);
    }
}

function hideIQL() {
    clearTimeout(iquery_timer);
    hideObj(_$('iqueryLayer'));
}

/**
 * Start attribute search
 */
function submitSearch() {
    var searchForm = _$('searchForm');
    var skvp = getFormKVP('searchForm');
    //alert(skvp);
    var queryurl = PM_XAJAX_LOCATION + 'x_info.php?' + skvp + '&mode=search';
    if (infoWin == 'frame') {
        //searchForm.target=false; //'infoZone';
		var cookies = new Cookies();
		if (cookies.getCookie("mapAccess") != "public")
			showProcDialog('Search Result Map',"MIPRIdentifyPanel","infoZone");
    } else {
        var resultwin = openResultwin('blank.html');
        searchForm.target='resultwin';
    }
    
    //alert(queryurl);
    getQueryResult(queryurl, '')

}




/*
 * RETURN LAYER/GROUP FOR SELECTION
 *************************************/
function getSelectLayer() {
	var selform = _$("selform");
    if (selform) {
        if (selform.selgroup) {
            var sellayer = selform.selgroup.options[selform.selgroup.selectedIndex].value;
            var layerstring = "&groups=" + sellayer;
            //alert(sellayer);
            return sellayer;
        } else {
            return false;
        }
    } else {
        return false;
    }
}




/*****************************************************************************
 * MOUSE CLICK BUTTON FUNCTIONS (FOR TOOLBAR)
 **********************************************/
function domouseclick(button) {
	//alert('level 0');
	var varform = _$("varform");
    resetFrames();
    if (button == 'zoomin') {
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoomrect';
        varform.maction.value = 'box';
        varform.tool.value = 'zoomin';
    } else if (button == 'zoomout') {
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoompoint';
        varform.zoom_factor.value = '-2';
        varform.maction.value = 'click';
        varform.tool.value = 'zoomout';
    } else if (button == 'identify') {
        varform.mode.value = 'query';
        varform.maction.value = 'click';
        varform.tool.value = 'identify';
    } else if (button == 'pan') {
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoompoint';
        varform.zoom_factor.value = '1';
        varform.maction.value = 'pan';
        varform.tool.value = 'pan';
    } else if (button == 'select') {
        varform.mode.value = 'nquery';
        varform.maction.value = 'box';
        var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+SID;
        updateSelectTool(selurl, '');
        //_$('loadFrame').src = selurl;
        varform.tool.value = 'select';
    } else if (button == 'auto_identify') {
        varform.mode.value = 'iquery';
        varform.maction.value = 'move';
        varform.tool.value = 'auto_identify';
        var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+SID;
        updateSelectTool(selurl, '');
    } else if (button == 'measure') {
        varform.maction.value = 'measure';
        varform.mode.value = 'measure';
        varform.tool.value = 'measure';
        createMeasureInput();
		activeMeasure();
    } else if (button == 'ruler'){
		varform.maction.value = 'ruler';
		varform.mode.value = 'ruler';	
		varform.tool.value = 'ruler';
		createRulerInput();
		activeDistance();
	} else if (button == 'digitize') {
        varform.mode.value = 'digitize';
        varform.maction.value = 'click';
        varform.tool.value = 'digitize';
    } else if (button == 'poi') {
        varform.mode.value = 'poi';
        varform.maction.value = 'click';
        varform.tool.value = 'poi';    
    } else if (button == 'coords') {
        varform.mode.value = 'coords';
        varform.maction.value = 'click';
        varform.tool.value = 'coords';
    }
    
    // Set cursor appropritae to slected tool 
    if (useCustomCursor) {
        setCursor(false);
    }
}




function resetFrames() {
	hideHelpMessage();
	resetActiveToolMap();
    var varform = _$("varform");
    if (varform.mode.value == 'nquery' || varform.mode.value == 'iquery' || varform.maction.value == 'measure' || varform.maction.value == 'ruler') {
        if (varform.maction.value == 'measure' || varform.maction.value == 'ruler') { clearMeasure();}
        if (varform.mode.value == 'iquery' || varform.mode.value == 'nquery') hideObj(_$('iqueryLayer'));
        
    } else {
        //$('#bottomMapFrame').html('');
    }
	initRuler();
	initMeasure();
}


/*
function createMeasureInput() {
	
    var mStr =  '<form name="measureForm"><table class="TOOLFRAME"><tr><td NOWRAP>' + localeList['Total'] + '</td><td><input type=text size=9 name="sumLen"></td>';
    mStr += '<td id="mSegTxt" value="&nbsp;&nbsp;' + localeList['Segment'] + '" NOWRAP>&nbsp;&nbsp;' + localeList['Segment'] + '</td><td><input type=text size=9 name="segLen"></td>';
    mStr += '<td width=130 class="TDAR"><input type="button" value="' + localeList['Clear'];
    mStr += '"  class="button_off"  onClick="javascript:clearMeasure()" onmouseover="changeButtonClr(this, \'over\')" onmouseout="changeButtonClr (this, \'out\')" >';
    //# Uncomment for DEL button
    //mStr += '<input type="button" value="Del Last"';
    //mStr += ' class="button_off" title="Del" onClick="javascript:delLastPoint()" onmouseover="changeButtonClr(this, \'over\')" onmouseout="changeButtonClr (this, \'out\')" >';
    mStr += '</td></tr></table></form>';
    var divBottom = document.getElementById('MIPRFloatPanel');
	divBottom.style.visibility = 'visible';
	divBottom.style.display = "block";
    $('#bottomMapFrame').html(mStr);
    showHelpMessage(localeList['digitize_help']);
}
*/
function resetActiveToolMap(){
	$("#MIPRMeasureTitle").html("Measure Area");
	$("#MIPRDistanceTitle").html("Distance");
}

function activeMeasure(){
	$("#MIPRMeasureTitle").html("Measure Area <img src=\"images/active.gif\">");
}

function activeDistance(){
	$("#MIPRDistanceTitle").html("Distance <img src=\"images/active.gif\">");
}

function initMeasure(){
	var shtml = "<table class=\"MIPRTableRuler\"><tr><td>Sides</td><td>:</td><td><div id=\"divMeasureSegment\">-</div></td></tr>";
		shtml += "<tr><td>Perimeter</td><td>:</td><td><div id=\"divMeasurePerimeter\">-</div></td></tr>";
		shtml += "<tr><td>Measure Area</td><td>:</td><td><div id=\"divMeasureResult\"></div></td></tr>"
	$('#measureFrame').html(shtml);
}

function createMeasureInput(){
	initMeasure();
	showHelpMessage(localeList['digitize_help']);
} 

function initRuler(){
	var shtml = "<table class=\"MIPRTableRuler\"><tr><td>Start Position</td><td>:</td><td><div id=\"divRulerStartPos\">-</div></td></tr>";
		shtml += "<tr><td>End Position</td><td>:</td><td><div id=\"divRulerEndPos\">-</div></td></tr>";
		shtml += "<tr><td>Distance</td><td>:</td><td><div id=\"divRulerResult\"></div></td></tr>"
	$('#rulerFrame').html(shtml);
}

function createRulerInput(){
	initRuler();
	showHelpMessage(localeList['ruler_help']);
}


/*****************************************************************************
 * RELOAD APPLICATION
 **********************/
function reloadMap(remove) {
    var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint';
    if (remove) mapurl += '&resultlayer=remove';
    updateMap(mapurl, '');
}

function loadMapFromSearch(param){
	var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint&lmode=search&'+param;
	updateMap(mapurl,'');	
}



function showHelpMessage(hm) {
    $('#helpMessage').html(hm);
	$('#helpMessageContainer').showv();
	$('#helpMessage').showv();
	$('#helpMessageControlButton').showv();
	_$('helpMessageContainer').style.padding = "15px";
	_$('helpMessageControlButton').style.background = "url(images/GISHelpButtonCollapse.gif) right bottom no-repeat";
}

function showAllHelpMessage(){
	$('#helpMessageContainer').showv();
	$('#helpMessage').showv();
	$('#helpMessageControlButton').showv();
	_$('helpMessageContainer').style.padding = "15px";
	_$('helpMessageControlButton').style.background = "url(images/GISHelpButtonCollapse.gif) right bottom no-repeat";
}
function hideHelpMessage() {
    $('#helpMessage').html('');
	$('#helpMessageContainer').hidev();
	$('#helpMessage').hidev();
	$('#helpMessageControlButton').hidev();
}

function hideAllHelpMessage(){
	$('#helpMessage').hidev();
}

function collapseExpandHelpContainer(ev){
	if (_$('helpMessage').style.visibility == "hidden"){
		showAllHelpMessage();
		_$('helpMessageControlButton').style.background = "url(images/GISHelpButtonCollapse.gif) right bottom no-repeat";
		_$('helpMessageContainer').style.padding = "15px";
	}	
	else{
		hideAllHelpMessage();
		_$('helpMessageControlButton').style.background = "url(images/GISHelpButtonExpand.gif) right bottom no-repeat";
		_$('helpMessageContainer').style.padding = "5px";
	}	
}

/*****************************************************************************
 * CLOSE INFO WIN AND UNREGISTER SESSION VAR 'resultlayer'
 **********************************************************/
function clearInfo() {
	var varform = _$("varform");
    //if (infoWin == "frame") frames.infoFrame.location.href = "blank.html";
    //this.location = "blank.html";
    //if (varform.zoomselected.value == '1') {
        varform.zoomselected.value = '0';
        reloadMap(true);
    //}
}




/*****************************************************************************
 * SHOW/HIDE LOADING SPLASH IMAGE
 *********************************/
function showloading(){    // waiting/working gif-animation
    var loadLayer = _$("loading")
    if (!loadLayer) {
        loadLayer = window.parent.document.getElementById("loading");
    } 
    loadLayer.style.visibility = "visible";
}

function stoploading(){
    var loadLayer = document.getElementById("loading")
    if (!loadLayer) {
        loadLayer = window.parent.document.getElementById("loading");
    } 
    loadLayer.style.visibility = "hidden";
}




/******************************************************************************
 * SET SLIDER IMAGE DEPENDING ON SCALE
 * Values defined in 'config.ini'
 *************************************/
function setSlider(curscale) {
    if (myslider) {
        var sliderPos = getSliderPosition(curscale);
        myslider.setPosition(sliderPos);
        if (_$('refsliderbox')) hideObj(_$('refsliderbox'));
    }
    return false;
}


function getListMenu(){
	var menuurl = PM_XAJAX_LOCATION + 'x_menu.php?'+SID+'&list=menu';
	updateMenu(menuurl,'');
}

function changeMapPart(id,cmap,nmap){
	//$('#MIPRMapLegendTitle').html(nmap+' Featured Maps');
	$('#MIPRMapLegendTitle').html('Featured Maps');
	var chparturl = PM_XAJAX_LOCATION + 'x_partmap.php?'+SID+'&op=chpart&id='+id+'&chmap='+cmap;
	
	updateMapPart(chparturl,'');
}



