
/******************************************************************************
 *
 * Purpose: main interaction with Mapserver specific requests 
 *          like zoom, pan, etc. 
 * Author:  Armin Burger
 *
 ******************************************************************************
 *
 * Copyright (c) 2003-2009 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
 *
 ******************************************************************************/

var cells=new Array()
cells[0]=0.665;
cells[1]=2;
$.extend(PM.Map,
{
    
    /**
     * FUNCTION IS CALLED BY ZOOMBOX -> FUNCTION chkMouseUp(e)
     * main function for zoom/pan interface
     * calls different zoom functions (see below)
     */
    zoombox_apply: function(minx, miny, maxx, maxy) {
        var imgbox = minx + "+" + miny + "+" + maxx + "+" + maxy;
        var imgxy  = minx + "+" + miny;
        // NORMAL MOUSE ACTIONS IN MAIN MAP //
		//alert("zoombox_apply");
        if (PM.ZoomBox.refmapClick == false) {

            // ZOOM/PAN ACTIONS
            var vmode = PM.Map.mode;

            if (vmode == 'map' || PM.ZoomBox.rightMouseButton) {
                // Only click
                if ((minx + this.zoomJitter) > maxx && (miny + this.zoomJitter) > maxy) {
                    if (PM.Map.zoom_type == 'zoomrect') {
                        if (PM.ZoomBox.rightMouseButton) {
                            zoom_factor = 1; 
                        } else {
                            zoom_factor = 2;
                        }
                        this.zoompoint(zoom_factor, imgxy);
                        
                    } else {
                       // Pan
                       var zoom_factor = PM.Map.zoom_factor;
                       this.zoompoint(zoom_factor, imgxy);
                    }
                
                // Zoombox 
                } else {
                    this.zoomin(imgbox);
                }

            // QUERY/IDENTIFY ACTIONS
            // query on all visible groups
			
            } else if (vmode == 'query') {
                PM.Query.showQueryResult('query', imgxy);
            // query only on selected group with multiselect
            } else if (vmode == 'queryInt') {
                PM.Query.showQueryResult('queryInt', imgxy);
			 } else if (vmode == 'querySeg') {
                PM.Query.showQueryResult('querySeg', imgxy);
			 } else if (vmode == 'queryPia') {
                PM.Query.showQueryResult('queryPia', 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 + this.zoomJitter) > maxx && (miny + this.zoomJitter) > maxy) {     // x/y point
                        PM.Query.showQueryResult('nquery', imgxy);
                    // with zoom box
                    } else {
                        PM.Query.showQueryResult('nquery', imgbox);                      // rectangle
                    }
                }
            } else if (vmode == 'poi') {
				//PM.Dlg.openPoi(imgxy);
				PM.Query.infoCom(imgxy,vmode);
            }  else if (vmode == 'poiP') {
				//PM.Dlg.openPoi(imgxy);
				PM.Query.infoCom(imgxy,vmode);
            } else {
                try {
                    eval('this.' + vmode + '_start(imgbox)');
                    return false;
                } catch(e) {
                
                }
            }

        // ACTIONS IN REF MAP //
        } else {
            this.zoomref(imgxy);
        }
    },


    /**
     * Zoom to point
     */
    zoompoint: function(zoomfactor, imgxy) {
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoompoint&zoom_factor='+zoomfactor+'&imgxy='+imgxy;
        //this.showloading();
        this.updateMap(mapurl);
    },

    /**
     * Zoom to rectangle
     */
    zoomin: function(extent) {
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomrect&imgbox='+extent  ;
        //alert(mapurl);
        this.updateMap(mapurl);
    },

    /**
     * Zoom to geo-extent (map units), applied from info page link
     */
    zoom2extent_OLD: function(layer,idx,geoextent,zoomfull) {
        //this.showloading();
        // Check if resultlayers shall be passed
        if (zoomfull == 1) {                            // 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;
        this.updateMap(mapurl);
    },
	
	zoom2extent: function(layer,idx,geoextent,zoomfull) {
      	var coord = geoextent.split('+');
		var o_minx,o_miny,o_maxx,o_maxy;
		o_minx=coord[0];
		o_miny=coord[1];
		o_maxx=coord[2];
		o_maxy=coord[3];
		/*alert(o_minx);
		alert(o_miny);
		alert(o_maxx);
		alert(o_maxy);*/
		var diffX,diffY;
		diffX=parseFloat(o_maxx)-parseFloat(o_minx);
		diffY=parseFloat(o_maxy)-parseFloat(o_miny);
		/*alert(diffX);*/
		var medX,medY;
		medX=parseFloat(o_minx)+parseFloat(diffX/2);
		medY=parseFloat(o_miny)+parseFloat(diffY/2);
		/*alert(medX);
		alert(medY);*/
		var cellsize_attuale= diffX/530;
		//alert(cellsize_attuale);
		var cellsize_vicino_index=this.calcola_cell(cellsize_attuale);
		//alert(cellsize_vicino_index);
		var cellsize_vicino=cells[cellsize_vicino_index]
		var n_minx,n_miny,n_maxx,n_maxy;
		n_minx=(medX-cellsize_vicino*255);
		n_miny=(medY-cellsize_vicino*188.5);
		n_maxx=(medX+cellsize_vicino*255);
		n_maxy=(medY+cellsize_vicino*188.5);
		var n_ext=n_minx + '+' + n_miny + '+' + n_maxx + '+' + n_maxy;
		this.zoom2extent_OLD(layer,idx,n_ext,zoomfull);
    },
	
	calcola_cell: function(cellsize) {
		var minimo=100000;
		var index_minimo=0;
		for(i=0; i<cells.length;i++){
			if(cells[i]-cellsize<minimo && cells[i]-cellsize>=0){
				index_minimo=i;
				minimo=cells[0]-cellsize;
			}
		}
		return index_minimo;
	},
	
	 zoom2coord: function(geoextent) {
			
			var coords= geoextent.split("+");
			var x=parseInt(coords[0]);
			var y=parseInt(coords[1]);
			
			
			var XMIN;
			var YMIN;
			var XMAX;
			var YMAX;
			XMAX=x+300;
			XMIN=x-300;
			YMAX=y+300;
			YMIN=y-300;
			
			geoextent=XMIN + "+" + YMIN + "+" + XMAX + "+" + YMAX;
			
			var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomextent&extent='+geoextent;
			//document.varform.zoomselected.value = '1';
			//alert(mapurl);
			this.updateMap(mapurl);
		},
    /**
     * Zoom to full extent
     */
    zoomfullext: function() {
        //this.showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomfull';
		//var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&me=1743907,4793496,1745199,4794599';
        this.updateMap(mapurl);
    },
	
	cerca: function() {
        //this.showloading();
        parent.GB_show("Ricerca geografica","segnalazione/ricerca.htm", 500, 700, null ,230,45)
    },

    /**
     * Go back to pevious extent
     */
    goback: function() {
        //this.showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomback';
        this.updateMap(mapurl);
    },

    /**
     * Go forward
     */
    gofwd: function() {
        //this.showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomfwd';
        this.updateMap(mapurl);
    },

    /**
     * Zoom to layer/group
     */
    zoom2group: function(gid) {
        //this.showloading();
        var groupname = gid.substr(6);
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomgroup&groupname=' + groupname;
        this.updateMap(mapurl);
    },

    /**
     * Zoom to selection
     */
    zoom2selected: function() {
        if (typeof(PM.extentSelectedFeatures)!='undefined') {
            if (PM.extentSelectedFeatures) {
                //this.showloading();
                var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomextent&extent='+PM.extentSelectedFeatures;
                this.updateMap(mapurl);
                //var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomselected';
                //updateMap(mapurl);
            }
        }
    },

    /**
     * Draw map with new layers/groups
     */
    changeLayersDraw: function() {
        //this.showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint';
        this.updateMap(mapurl);
    },

    /**
     * Stop loading on click
     */
    clickStopLoading: function() {
        this.stoploading();
        if (document.all) { 
            document.execCommand('Stop');
        } else {
            window.stop();
        }
    },

    /**
     * Pan via arrow buttons or keyboard
     */
    arrowpan: function(direction) {
        //this.showloading();
        var pansize = 0.1;   // defines how much to pan
        var px, py;
        if (direction == 'n') {
            px = (PM.mapW - 1) / 2;
            py = (0 + pansize) * PM.mapH;
        } else if (direction == 's') {
            px = (PM.mapW - 1) / 2;
            py = (1 - pansize) * PM.mapH;
        } else if (direction == 'e') {
            px = (1 - pansize) * PM.mapW;
            py = (PM.mapH - 1) / 2;
        } else if (direction == 'w') {
            px = (0 + pansize) * PM.mapW;
            py = (PM.mapH - 1) / 2;
        }
        
        this.zoompoint(1, px + "+" + py);
    },

    /**
     * Reference image zoom/pan
     */
    zoomref: function(imgxy) {
        //this.showloading();
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=ref&imgxy='+imgxy  ;
        this.updateMap(mapurl);
    },

    /**
     * Set overview image to new one
     */
    setRefImg: function(refimgsrc){
         var refimg = parent.refFrame.document.getElementById('refimg');
         refimg.src = refimgsrc;
    },

    /**
     * Zoom to scale
     */
    zoom2scale: function(scale) {
        //this.showloading();
		//alert(scale);
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&mode=map&zoom_type=zoomscale&scale='+scale;
        this.updateMap(mapurl);
    },

    /**
     * Write scale to input field after map refresh
     */
    writescale: function(scale) {   
        if (_$("scaleform")) _$("scaleform").scale.value = scale;
    },

    /**
     * Mouse click button functions (for toolbar)
     */
    domouseclick: function(button) {
        this.resetFrames();
                
        switch (button) {
            case 'home':
                this.zoomfullext();
                break;
            
             case 'null':
                PM.Map.mode = 'query';
                PM.Map.maction = 'click';
                PM.Map.tool = 'pan';
                break;
			case 'zoomin':
                PM.Map.mode = 'map';
                PM.Map.zoom_type = 'zoomrect';
                PM.Map.maction = 'box';
                PM.Map.tool = 'zoomin';
                break;
            case 'zoomout':
                PM.Map.mode = 'map';
                PM.Map.zoom_type = 'zoompoint';
                PM.Map.zoom_factor = -2;
                PM.Map.maction = 'click';
                PM.Map.tool = 'zoomout';
                break;
            case 'identify':
                PM.Map.mode = 'query';
                PM.Map.maction = 'click';
                PM.Map.tool = 'identify';
                break;
			case 'identifySeg':
                PM.Map.mode = 'querySeg';
                PM.Map.maction = 'click';
                PM.Map.tool = 'identifySeg';
                break;
			case 'identifyPia':
                PM.Map.mode = 'queryPia';
                PM.Map.maction = 'click';
                PM.Map.tool = 'identifyPia';
                break;
			case 'identifyInt':
                PM.Map.mode = 'queryInt';
                PM.Map.maction = 'click';
                PM.Map.tool = 'identifyInt';
                break;
            case 'pan':
                PM.Map.mode = 'map';
                PM.Map.zoom_type = 'zoompoint';
                PM.Map.zoom_factor = 1;
                PM.Map.maction = 'pan';
                PM.Map.tool = 'pan';
                break;
            case 'select':
                PM.Map.mode = 'nquery';
                PM.Map.maction = 'box';
                PM.Map.tool = 'select';
                var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+SID;
                PM.Map.updateSelectTool(selurl, '');
                //_$('loadFrame').src = selurl;
                break;
            case 'auto_identify':
                PM.Map.mode = 'iquery';
                PM.Map.maction = 'move';
                PM.Map.tool = 'auto_identify';
                var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+SID+'&autoidentify=1';
                PM.Map.updateSelectTool(selurl, '');
                break;
            case 'measure':
                PM.Map.maction = 'measure';
                PM.Map.mode = 'measure';
                PM.Map.tool = 'measure';
                PM.UI.createMeasureInput();
                break;
            case 'digitize':
                PM.Map.mode = 'digitize';
                PM.Map.maction = 'click';
                PM.Map.tool = 'digitize';
                break;
            case 'poi':   
                PM.Map.mode = 'poi';
                PM.Map.maction = 'click';
                PM.Map.tool = 'poi';
                break;
			
            default:
                // for anything else (new) apply function 'button_click()'
                try {
                    eval('PM.Map.' + button + '_click()');
                    return false;
                } catch(e) {} 
        }
        
        // Set cursor appropriate to slected tool 
        if (PM.useCustomCursor) {
            PM.setCursor(false, false);
        }
    },

    /**
     * custom sample script for extending tool functions
     */
    poi_click: function() {
        PM.Map.mode = 'poi';
        PM.Map.maction = 'click';
        PM.Map.tool = 'poi'; 
        
        if (PM.useCustomCursor) {
            PM.setCursor(false, 'crosshair');
        }
    },

    /**
     * Called by various activated tools to disable certain displayed features for measure and select
     */
    resetFrames: function() {
        this.hideHelpMessage();
        $('#mapToolArea').hide().html('');
        if (PM.Map.mode == 'nquery' || PM.Map.mode == 'iquery' || PM.Map.maction == 'measure' || PM.Map.maction == 'querySeg' || PM.Map.maction == 'queryInt' || PM.Map.maction == 'queryPia') {
            if (PM.Map.maction == 'measure') {
                PM.Draw.resetMeasure();
            }
            if (PM.Map.mode == 'iquery' || PM.Map.mode == 'nquery') hideObj(_$('iqueryContainer'));
            
        } else {
            $('#mapToolArea').hide().html('');
        }
    },

    /**
     * Reload application
     */
    reloadMap: function(remove) {
        var mapurl = PM_XAJAX_LOCATION + 'x_load.php?'+SID+'&zoom_type=zoompoint';
        if (remove) {
            mapurl += '&resultlayer=remove';
            PM.extentSelectedFeatures = null;
        }
        this.updateMap(mapurl);
    },

    /**
     * Show help message over map
     */
    showHelpMessage: function(hm) {
        $('#helpMessage').html(hm).show();
    },

    /**
     * Hide help message over map
     */
    hideHelpMessage: function() {
        $('#helpMessage').html('').hide();
    },

    /**
     * Close info win and unregister session var 'resultlayer'
     */
    clearInfo: function() {
        PM.Map.zoomselected = '0';
            this.reloadMap(true);
    },

    /**
     * Set slider image depending on scale
     * Values defined in 'config.ini'
     */
    setSlider: function(curscale) {
        if (myslider) {
            var sliderPos = getSliderPosition(curscale);
            myslider.setPosition(sliderPos);
            if (_$('refsliderbox')) hideObj(_$('refsliderbox'));
        }
        return false;
    },
    
    /**
     * For loading/updating the MAP
     */
    updateMap: function(murl) {
        $("#loading").showv();
        //alert(murl);
        $.ajax({
            url: murl,
            dataType: "json",
            success: function(response){
                
                // Reload application when PHP session expired
                var sessionerror = response.sessionerror;
                if (sessionerror == 'true') {
                   errormsg = _p('Session expired - Reloading application'); 
                   //alert(errormsg);
                   window.location.reload();
                   return false;
                }
                
                var rBxL = response.refBoxStr.split(',');
                PM.minx_geo = parseFloat(response.minx_geo);
                PM.maxy_geo = parseFloat(response.maxy_geo);
                PM.xdelta_geo = parseFloat(response.xdelta_geo);
                PM.ydelta_geo = parseFloat(response.ydelta_geo);
                var geo_scale = response.geo_scale;
                var urlPntStr = response.urlPntStr;
                
                // Load new map image
                PM.Map.swapMapImg(response.mapURL);
                
                
                // Check if TOC has to be updated
                var refreshLegend = eval(response.refreshLegend);
                var refreshToc = eval(response.refreshToc);
                if (PM.Map.forceRefreshToc) {
                    refreshToc = true;
                    PM.Map.forceRefreshToc = false;
                }
                if (refreshToc) {
                    var tocurl = PM_XAJAX_LOCATION + 'x_toc_update.php?' + SID;
                    PM.Toc.tocUpdateScale(tocurl, refreshLegend);
                }
                
                // Scale-related activities
                PM.Map.writescale(geo_scale);
                PM.Map.setSlider(geo_scale);
                PM.scale = geo_scale;
                $("#pmMapRefreshImg").src("images/pixel.gif");
                
                // Reference image: set DHTML objects
                PM.ZoomBox.setRefBox(rBxL[0], rBxL[1], rBxL[2], rBxL[3]);
                
                // Update SELECT tool OPTIONs in case of 'select' mode
                var vMode = PM.Map.mode;
                var autoidentify = '';
                if (vMode == 'nquery' || vMode == 'iquery') {
                    if (vMode == 'iquery'){
                        autoidentify = '&autoidentify=1';
                    }
                    var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+ SID + '&activegroup=' + PM.Query.getSelectLayer() + autoidentify;
                    PM.Map.updateSelectTool(selurl);
                }
                
                // If measure was active, delete all masure elements
                if (vMode == 'measure') {
                    PM.Draw.resetMeasure();
                }
            }
        });   
    },
    
    crossfadeMapImg: true,
    crossfadeMapImgSpeed: 500,
    _mapImgOpacity: false,
    _blendMapInt: false,
    
    swapMapImg: function(imgSrc) {
        if (this.crossfadeMapImg) {
            $('#fadeMapimgLayer').remove();
            var mapImgLayer = $('#mapimgLayer');
            var fadeMapImgLayer = mapImgLayer.clone().id('fadeMapimgLayer');
            fadeMapImgLayer.children('img').each(function (i) {
                $(this).id('fadeMapImg');
            });
            fadeMapImgLayer.appendTo($('#map'));
            
            mapImgLayer.css({opacity:0.0});
            $('#mapImg').src(imgSrc);
            this._mapImgOpacity = 0;
            this._blendMapInt = setInterval("PM.Map.blendMapImg()", 20);   
        } else {
            $('#mapImg').src(imgSrc);
        }
    },
    
    blendMapImg: function() {
        if (this._mapImgOpacity < 1) {
            var fop = 1 - this._mapImgOpacity;
            $('#fadeMapimgLayer').css({opacity: fop});
            $('#mapimgLayer').css({opacity: this._mapImgOpacity});
            this._mapImgOpacity += 50/this.crossfadeMapImgSpeed;
        } else {
            clearInterval(this._blendMapInt);
            $('#fadeMapimgLayer').remove();
        }
    },
    

    /** 
     * For SELECT tool 
     * called from 'updateMap()' and 'updateSelLayers()'
     */
    updateSelectTool: function(selurl) {
        $.ajax({
            url: selurl,
            dataType: "json",
            success: function(response){     
                var selStr = response.selStr;
                $('#mapToolArea').html(selStr)
                                 .show();
            }
        });   
    },

    /**
     * Update layer options list for selection/iquery
     */
    updateSelLayers: function(selurl) {
        $.ajax({
            url: selurl,
            dataType: "json",
            success: function(response){
                var sellayers = response.sellayers;
            
                // Update SELECT tool OPTIONs in case of 'select' mode
                var vMode = PM.Map.mode;
                if (vMode == 'nquery' || vMode == 'iquery') {
                    var selurl = PM_XAJAX_LOCATION + 'x_select.php?'+ SID + '&activegroup=' + PM.Query.getSelectLayer() ;
                    PM.Map.updateSelectTool(selurl);
                }
            }
        });
    },

    /**
     * Add point of interest to map
     */
    addPOI: function(digitizeurl) {
        $.ajax({
            type: "POST",
            url: digitizeurl,
            success: function(response){
                PM.Map.changeLayersDraw();
            }
        });
    }

});


