
/******************************************************************************
 *
 * 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(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 = _$("varform");
        var vmode = varform.mode.value;
        
        if (vmode == '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 (vmode == 'query') {
            showqueryresult('query', imgxy);
        // query only on selected group with multiselect
        } else if (vmode == 'nquery') {
        	var selform = _$("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('nquery', imgxy);
                // with zoom box
                } else {
                    showqueryresult('nquery', imgbox);                      // rectangle
                }
            }
        } else if (vmode == 'poi') {
            openPoiDlg(imgxy);
        } else {
            try {
                eval(vmode + '_start(imgbox)');
                return false;
            } catch(e) {
            
            }
        }

    // ACTIONS IN REF MAP //
    } else {
        zoomref(imgxy);
    }
}


/**
 * Sample script foir custom actions/modes
 */
function digitize_start(imgxy) {
    openDigitizeDlg(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;
}




/*****************************************************************************
 * MOUSE CLICK BUTTON FUNCTIONS (FOR TOOLBAR)
 **********************************************/
function domouseclick(button) {
	var varform = _$("varform");
    resetFrames();
    switch (button) {
    case 'zoomin':
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoomrect';
        varform.maction.value = 'box';
        varform.tool.value = 'zoomin';
        break;
    case 'zoomout':
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoompoint';
        varform.zoom_factor.value = '-2';
        varform.maction.value = 'click';
        varform.tool.value = 'zoomout';
        break;
    case 'identify':
        varform.mode.value = 'query';
        varform.maction.value = 'click';
        varform.tool.value = 'identify';
        break;
    case 'pan':
        varform.mode.value = 'map';
        varform.zoom_type.value = 'zoompoint';
        varform.zoom_factor.value = '1';
        varform.maction.value = 'pan';
        varform.tool.value = 'pan';
        break;
    case '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';
        break;
    case 'auto_identify':
        varform.mode.value = 'iquery';
        varform.maction.value = 'move';
        varform.tool.value = 'auto_identify';
        var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+SID+'&autoidentify=1';
        updateSelectTool(selurl, '');
        break;
    case 'measure':
        varform.maction.value = 'measure';
        varform.mode.value = 'measure';
        varform.tool.value = 'measure';
        createMeasureInput();
        break;
    case 'digitize':
        varform.mode.value = 'digitize';
        varform.maction.value = 'click';
        varform.tool.value = 'digitize';
        break;
    case 'poi':
        varform.mode.value = 'poi';
        varform.maction.value = 'click';
        varform.tool.value = 'poi';    
        break;
    default:
        // for anything else (new) apply function 'button_mclick()'
        try {
            eval(button + '_click()');
            return false;
        } catch(e) {
        
        }
    }
    
    // Set cursor appropriate to slected tool 
    if (useCustomCursor) {
        setCursor(false, false);
    }
}

/**
 * custom sample script for extending tool functions
 */
function poi_mclick() {
    var varform = _$("varform");
    varform.mode.value = 'poi';
    varform.maction.value = 'click';
    varform.tool.value = 'poi'; 
    
    if (useCustomCursor) {
        setCursor(false, 'crosshair');
    }
}



function resetFrames() {
	hideHelpMessage();
    var varform = _$("varform");
    if (varform.mode.value == 'nquery' || varform.mode.value == 'iquery' || varform.maction.value == 'measure') {
        if (varform.maction.value == 'measure') {
            resetMeasure();
        }
        if (varform.mode.value == 'iquery' || varform.mode.value == 'nquery') hideObj(_$('iqueryLayer'));
        
    } else {
        $('#mapToolArea').html('');
    }
}



function createMeasureInput() {
	
    var mStr =  '<form name="measureForm"><table><tr><td class="medir" NOWRAP>' + localeList['Total'] + '</td><td><input type=text name="sumLen"></td>';
    mStr += '<td id="mSegTxt" class="medir" value="' + localeList['Segment'] + '" NOWRAP>' + localeList['Segment'] + '</td><td><input class="search_textinput" type=text name="segLen"></td>';
    mStr += '<td width=50 class="TDAR"><input class="search_textinput" type="button" id="cbut_measure" value="' + localeList['Clear'];
    //mStr += '"  class="button_off"  onClick="javascript:clearMeasure()" onmouseover="changeButtonClr(this, \'over\')" onmouseout="changeButtonClr (this, \'out\')" >';
    mStr += '"  class="button_off"  name="custombutton" onClick="javascript:volverdeMeasure()" >';
    mStr += '</td></tr></table></form>';
  
    
    //$('#mapToolArea').html(mStr);
    $('#medidas').html(mStr);
    
    pmCButton_init('cbut_measure');
    showHelpMessage(localeList['digitize_help']);
}

function volverdeMeasure() {
$('#medidas').html('');
}

/*****************************************************************************
 * 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 showHelpMessage(hm) {
    $('#helpMessage').html(hm).showv();
}


function hideHelpMessage() {
    $('#helpMessage').html('').hidev();
}


/*****************************************************************************
 * 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;
}



