
var map;
var baselr = {};
var changeBaseLayerAction = false;
var layer2index=new Array();
var current_base_layer = null;
var strategy,cluster_select,clusters;
var load_popup_lock = false;
var legend_info = new Array();
var controls = new Array();
var layer_switcher_control;
var mp_control;
var wms_layer = new Array();
var base_layer = Array();
var wms_tileservers;
var wms;
//var meteolayer;
var popupClass = OpenLayers.Popup.FramedCloud;
var popupContent = 'caricamento ...';
var vlayer = null;
var tmplayer = null;
var _layers = Array();
var llabels = Array();
var editor_current_feature;
var current_selected_feature;
var editor_current_marker;
var info_popup = null;
var info_popup_over = false;
var label_popup = null;
var vlabel_popup = null;
var measure_popup = null;
user_map_action_time = 0;

function closeFeaturePane(p) {
    if (p=='move') {
        try {
            _layers[jQuery('#movepane-layer').val()].refresh({"force":true});
        }
        catch(e) {}
        
        jQuery('#movepane-layer').val(-1);
        toggleControl(jQuery('#pan')[0]);
        jQuery("#move_feature_pane").hide();
    }
    else if (p=='edit') {
        var component_layer = _layers[jQuery("#obj-madeof-component-layer").val()];
        select_ctrl.unselectAll();
        map.removeControl([select_ctrl]);
        component_layer.setVisibility(false);
        component_layer.init=false;

        for (var layer in _layer_visibility) {
            _layers[layer].setVisibility(_layer_visibility[layer]);
        }
        toggleControl(jQuery('#pan')[0]);
        jQuery("#edit_feature_pane").hide();
    }
}

//plugins js section
var _layer_visibility = new Array();
var select_ctrl;


function triggerActionForPlugin(plugin_name) {

    if (plugin_name == 'edit_feature') {
        reloadObjectList();
        jQuery("#obj-madeof-name-container").show();
        jQuery("#obj-madeof-group-container").show();
        for (var layer in _layers) {
            _layer_visibility[layer]=_layers[layer].visibility;
            _layers[layer].setVisibility(false);
        }
        var component_layer = jQuery("#obj-madeof-component-layer").val();
        _layers[component_layer].setVisibility(true);
        _layers[component_layer].init=true;

        jQuery("#obj-madeof-group").autocomplete("2.0/users/ajax/glist.php", {
                            delay: 150,
                            width: 260,
                            formatResult:formatResult,
                            formatItem:formatItem,
                            cacheLength: 1
                  });

        select_ctrl = new OpenLayers.Control.SelectFeature(
                    _layers[component_layer],
                    {
                        clickout: false, toggle: true,
                        multiple: true, hover: false,
                        onSelect: function(f) {
                            objmadeofUpdateFeatureList(_layers[component_layer]);
                        },
                        onUnselect: function(f) {
                            objmadeofUpdateFeatureList(_layers[component_layer]);
                        }
                    });
        map.addControl(select_ctrl);
        select_ctrl.activate();
    }
}


//for pink tiles
//OpenLayers.Util.onImageLoadErrorColor = "transparent";
OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
Proj4js.defs["EPSG:3003"] = "+title=Gauss Boaga EPSG:3003 +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs";
Proj4js.defs["EPSG:26191"] = "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs";

var edit = false;var tmp = {'bounds':'-20037508,-20037508,20037508,20037508.34','projection':'900913','resolution':156543.03390000001};baselr.googlesat = tmp;layer2index['googlesat']=0;var tmp = {'bounds':'-20037508,-20037508,20037508,20037508.34','projection':'900913','resolution':156543.03390000001};baselr.googlehyb = tmp;layer2index['googlehyb']=1;var tmp = {'bounds':'-20037508,-20037508,20037508,20037508.34','projection':'900913','resolution':156543.03390000001};baselr.googlemap = tmp;layer2index['googlemap']=2;var tmp = {'bounds':'500000,3889405.41,3500000,5389405.41','projection':'900913','resolution':11718.75};baselr.smit = tmp;layer2index['smit']=3;
sketchSymbolizers = {
                "Point": {
                    pointRadius: 4,
                    graphicName: "square",
                    fillColor: "white",
                    fillOpacity: 1,
                    label:'o',
                    strokeWidth: 1,
                    strokeOpacity: 1,
                    strokeColor: "#333333"
                },
                "Line": {
                    label:'o',
                    strokeWidth: 3,
                    strokeOpacity: 1,
                    strokeColor: "blue",
                    strokeDashstyle: "dash"
                },
                "Polygon": {
                    label:'',
                    strokeWidth: 2,
                    strokeOpacity: 1,
                    strokeColor: "#666666",
                    fillColor: "white",
                    fillOpacity: 0.3
                }
            };


var symbolizer = OpenLayers.Util.extend(
                      OpenLayers.Feature.Vector.style["default"],
                      {
                        fillOpacity: 1,
                        strokeColor: "black",
                        label:"${getLabel}",
                        labelAlign: "lc",
                        labelYOffset:10,
                        labelXOffset:0,
                        fontColor:'red',
                        fontSize:"0.8em",
                        fontWeight:"bold",
                        fontFamily: "Courier New, monospace"
                      }
                );

var cluster_style = new OpenLayers.Style({
                    pointRadius: "${radius}",
                    fillColor: "red",
                    fillOpacity: 0.4,
                    strokeColor: "#cc6633",
                    strokeWidth: "${width}",
                    strokeOpacity: 0.8
                }, {
                    context: {
                        width: function(feature) {
                            return (feature.cluster) ? 2 : 1;
                        },
                        radius: function(feature) {
                            var pix = 2;
                            if(feature.cluster) {
                                pix = Math.min(feature.attributes.count, 7) + 2;
                            }
                            return pix;
                        }
                    }
                });

var wms_server = "http://map1.comaitorino.it/cgi-bin/mapserv?";
var pegasus_fcgi = '/tilecache/tilecache.py?';
var smit_fcgi = '/cgi-bin/tile/tilecache.fcgi?';
var wms_tileservers = ["http://map1.comaitorino.it/"+pegasus_fcgi];

function removeLabelPopup() {
    if (label_popup != null) {
      map.removePopup(label_popup);
      label_popup.destroy();
      label_popup = null;
    }
}

function pb_setLayerStatus() {

    removeLabelPopup();

    for (id in _layers) {
      if (_layers[id].hidden == true) {
            setLayerStatus(_layers[id], (_layers[id].inRange && _layers[id].init));
      }
    }

    var lyrInRange = 0;


    jQuery(".cb").each(function() {
        var layer = jQuery(this).attr("id").replace("cb_","");
        try {jQuery(this).attr("checked",_layers[layer].visibility)} catch(e) {};
        var layerInRange=false;

        if (_layers[layer] != undefined)
            layerInRange = _layers[layer].inRange;

        if (!layerInRange) jQuery('#lvoice_'+layer).css('color','#666666');
        else {
            jQuery('#lvoice_'+layer).css('color','#000000');
            lyrInRange++;
        }

        jQuery(this).click(function() {
            setLayerStatus(_layers[layer],jQuery(this).attr("checked"));
        });
    });

    if (lyrInRange>0) clusters.setVisibility(false);
    else clusters.setVisibility(true);

    //if (meteolayer!=null) meteolayer.setVisibility(true);

}

//Calcolo distanze
function calcVincenty(geometry) {
    var dist = 0;
    for (var i = 1; i < geometry.components.length; i++) {
        var first = geometry.components[i-1];
        var second = geometry.components[i];
        dist += OpenLayers.Util.distVincenty(
            {lon: first.x, lat: first.y},
            {lon: second.x, lat: second.y}
        );
    }
    return dist;
}

function handleMeasurements(event) {
    var geometry = event.geometry;
    var units = event.units;
    var order = event.order;
    var measure = event.measure;
    //var element = jQuery('#measure_pane');
    var out = "";
    if(order == 1) {
        out += "Distanza: " + measure.toFixed(1) + " " + units;
    } else {
        out += "Area: " + measure.toFixed(1) + " " + units + "<sup>2</sup>";
    }

    var ll = geometry.getBounds().getCenterLonLat();
    if (measure_popup != null) measure_popup.destroy();
    measure_popup = new OpenLayers.Popup("label_popup",
                  ll,
                  new OpenLayers.Size(150,25),
                  out,
                  null,
                  false
                  );
    measure_popup.setBorder('2px solid blue');
    map.addPopup(measure_popup);
}

OpenLayers.Popup.FramedCloud.prototype.autoSize = false;
AutoSizeFramedCloud = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
    'autoSize': true
});


function addMapControl(control_type,layer) {

    if (control_type == 'move_feature') {
        if (controls['move_feature'] != null) {
            map.removeControl(controls['move_feature']);
            controls['move_feature'] = null;
        }

        controls['move_feature'] = new OpenLayers.Control.DragFeature(
                _layers[layer],
                {
                    onComplete: function(feature,px) {
                          updPdiPosition(feature);
                    }
                });
        map.addControl(controls['move_feature']);
        controls['move_feature'].activate();
    }
    else alert('addMapControl: invalid control type');
}

function makeInfoPopup(gid,lon,lat,content) {

                if (info_popup != null) map.removePopup(info_popup);

                info_popup = new AutoSizeFramedCloud("info_popup",
                new OpenLayers.LonLat(lon,lat),
                new OpenLayers.Size(200,200),
                content,
                null,
                true,
                function(e) {
                      jQuery("#tooltip").remove(); //destroy tooltip flot chart (bug)
                      info_popup_over = false;
                      if (info_popup != null) {
                        info_popup.destroy();
                        info_popup = null;
                      }
                      OpenLayers.Event.stop(e);
                  }
                );

                info_popup.events.register('mouseover',map,function() {
                  info_popup_over = true;
                  removeLabelPopup();
                });
                
                info_popup.events.register('mouseout',map,function() {info_popup_over = false;});
                info_popup.gid = gid;
                info_popup.minSize = new OpenLayers.Size(300,200);
                info_popup.backgroundColor = '#5dc8c7';
                
                removeLabelPopup();
                load_popup_lock = false;
                return info_popup;
}

function loadPdiInfoPopup(feature) {
      if (load_popup_lock) return;
      load_popup_lock = true;
      editor_current_marker = feature;

      var lon = feature.attributes.center.x;
      var lat = feature.attributes.center.y;
      var ico = feature.icon;
      var name = feature.name;
      var gid = feature.gid;
      var lid = feature.lid;

      map.addPopup(makeInfoPopup(gid,lon,lat,"attendere ..."));
      info_popup.show();
      
      jQuery.post("2.0/gis/poi/pdiInfo.php",{
            poi_id:feature.gid},
            function (r) {
                var _cnt = '';
                var zoomto = '';
                var edit_tools = '';
                var fb = feature.geometry.getBounds();
                var bounds = fb.left+","+fb.bottom+","+fb.right+","+fb.top;

                if (r == 'err-notfound') {
                    _cnt = '<span style="font-weight:bold">- <span style="background-color:red">Not found error</span> - <br/>The gis object has been removed by another user</span>';
                }
                else {
                    if (map.getZoom() < 15) zoomto = "<td><span style='cursor:hand;cursor:pointer' onclick=info_popup.destroy();info_popup=null;gotoView(';"+bounds+";"+gid+"',false)><img alt='zoom' title='zoom' src='2.0/img/schede/views.png'/></span></td>";

                    if (edit && feature.writable=='1')
                        edit_tools += "<table><tr><td><span class='anchor' onclick='removePDI(\""+lid+"\",editor_current_marker,\""+gid+"\")'><img alt='remove object' title='remove object' src='2.0/img/editor/remove.jpg'/></span></td>";
                    if (edit && feature.writable=='1')
                        edit_tools += "<td><span class='anchor' onclick='_openEditor("+gid+",\""+name+"\")'><img alt='Edit description' title='Edit description' src='2.0/img/editor/edit.png'/></span></td>";
                    if (edit && feature.writable=='1')
                        edit_tools += "<td><span class='popuplink' style='cursor:hand;cursor:pointer' href='2.0/editor/updPDI.php' params='gid="+gid+"&name="+name+"&fid="+feature.id+"'><img title='Properties' alt='Properties' src='2.0/img/editor/setup.png'/></span></td>";
                    

                    edit_tools += zoomto+"</tr></table>";

                    _cnt = "<table style='white-space:pre'><tr><td>"+legend_info[lid]['c'+feature.attributes.type]+"</td><td>"+name+"</td><td align=right>"+edit_tools+"</td></tr></table>"+
                    "<div id='info_popup_content' style='background-color:#dbdeed;'>"+r+"</div>";
                }

                info_popup.setContentHTML(_cnt);
                applyTabs("tabs");
                
                jQuery('.popuplink').click( function() {
                  jQuery.post(jQuery(this).attr("href"),jQuery(this).attr("params"),function(html) {
                          //set properties popup content
                          info_popup.setContentHTML(html);
                          execjs('updpdi');
                          info_popup.panIntoView();
                  });
                });
                execjs('pdiinfo');
                info_popup.updateSize();
                info_popup.panIntoView();
                
            });
}

function updateLPopupPos(xy) {
    if (label_popup != null) {
        label_popup.lonlat = map.getLonLatFromPixel(new OpenLayers.Pixel(xy.clientX,xy.clientY-20));
        label_popup.updatePosition();
    }
}

function ll(update,centerToDefaultView,updatePdiBrowser) {

    if (centerToDefaultView==undefined) centerToDefaultView=true;
    if (update==undefined) update=false;
    if (updatePdiBrowser==undefined) updatePdiBrowser=true;
    
    for (layer in _layers) {
        try {
            map.removeLayer(_layers[layer]);
        }
        catch(e) {}
    }

    _layers = new Array();

    jQuery.post("2.0/gis/layer/axGetLayerList.php",null,function(r) {
        var _r = eval('('+r+')');
        var llist = _r.layers;
        var nlayer = llist.length;
        var lyrs = new Array();

        for (var k = 0; k < nlayer; k++) {
            var l = llist[k];
            var mins = 50000000;
            var maxs = 0;
            var visibility = (l.hidden != 't');
            if (l.minscale != '') maxs = parseInt(l.minscale);
            if (l.maxscale != '') mins = parseInt(l.maxscale);

            styleMap = new OpenLayers.StyleMap(symbolizer);
            var lookup = {};
            var fill_color = l.cfill_color.split(",");
            var stroke_color = l.cstroke_color.split(",");
            var opacity = l.opacity.split(",");
            var icons = l.icon.split(",");
            var iconsdim = l.icondim.split(",");
            var _tmp = l.classes.split(",");
            var nclasses = _tmp.length;

            for (var c = 0; c < nclasses; c++) {
                if (opacity[c] == '' || opacity == undefined) opacity[c] = 0;

                if (l.type != 'POINT') {
                    lookup[c+1]={fillOpacity:opacity[c],strokeColor:stroke_color[c],fillColor:fill_color[c]};
                }
                else {
                    var icod = new Array(16,16);
                    var tmp = iconsdim[c];
                    if (tmp != undefined) {
                        icod = tmp.split("x");
                        if (icod[0] == '') icod[0] = 16;
                        if (icod[1] == undefined) icod[1] = 16;
                    }
                    lookup[c+1]={externalGraphic:'/smit/2.0/img/icons/'+icons[c],graphicWidth: parseInt(icod[0]),graphicHeight: parseInt(icod[1]),hoverPointRadius:32};
                }

                //styleMap.addUniqueValueRules("default", "type", lookup); //prima era qui mod666
            }

            styleMap.addUniqueValueRules("default", "type", lookup);

            llabels[l.real_name] = false;
            _layers[l.real_name] = new OpenLayers.Layer.Vector(
                l.legend_name,
                {
                 styleMap: styleMap,
                 minScale:mins,
                 maxScale:maxs,
                 displayInLayerSwitcher:visibility});

            _layers[l.real_name]._id = l.real_name;
            _layers[l.real_name].feature_type = l.type;
            _layers[l.real_name].hidden = (l.hidden == 't');
            _layers[l.real_name].init = (l.init == 't');

            legend_info[l.real_name] = new Array();
            var _ico = l.icon.split(",");

            for (var c = 0; c < nclasses; c++) {
                if (l.type == "MULTIPOLYGON") {
                    legend_info[l.real_name][_tmp[c]] = "<span style='background-color:"+fill_color[c]+"'>&nbsp;&nbsp;&nbsp;</span>";
                }
                else if (l.type == "MULTILINESTRING")
                    legend_info[l.real_name][_tmp[c]] = "<span style='background-color:"+stroke_color[c]+"'>&nbsp;</span>";
                else {
                    legend_info[l.real_name][_tmp[c]] = "<img width='16' height='16' src='./2.0/img/icons/"+_ico[c]+"'/>";
                    }
            }

            lyrs.push(_layers[l.real_name]);

            map.addLayer(_layers[l.real_name]);

            if (update) setLayerStatus(_layers[l.real_name]);
        }

        lyrs.push(clusters);

        controls['select_feature'] = new OpenLayers.Control.SelectFeature (
            lyrs,
            {
                clickout: true,
                onSelect: function(feature) {
                        if (feature.lid == undefined || _layers[feature.lid].inRange) {
                            if (feature.lid == undefined) {
                                var b = feature.geometry.getBounds();
                                for (var k = 0; k < feature.cluster.length; k++) {
                                    b.extend(feature.cluster[k].geometry.getBounds());
                                }
                                map.zoomToExtent(b);
                            }
                            else {
                                controls['select_feature'].unselect(feature);
                                loadPdiInfoPopup(feature);
                            }
                        }
                    }
            });

            controls['highlight_feature'] = new OpenLayers.Control.SelectFeature(lyrs, {
                hover: true,
                highlightOnly: true,
                renderIntent: "temporary",
                eventListeners: {
                    featurehighlighted: function(e) {

                          var feature = e.feature;
                          
                          if ((info_popup != null && info_popup_over) || (feature.lid != undefined && !_layers[feature.lid].inRange)) {
                            return;
                          }

                          var lonlat = null;
                          var fgeom = feature.geometry.toString();
                          if (fgeom.indexOf("LINESTRING") != -1) {
                              lonlat = map.getLonLatFromPixel(mp_control.lastXy);
                          }
                          else {
                              var c = feature.geometry.getCentroid();
                              lonlat = new OpenLayers.LonLat(c.x,c.y);

                              var xy = map.getPixelFromLonLat(lonlat);
                              xy.x = xy.x + 8;
                              xy.y = xy.y + 8;
                              lonlat = map.getLonLatFromPixel(xy);
                          }

                          if (feature.lid != undefined)
                            img = legend_info[feature.lid]['c'+feature.attributes.type];
                          else {
                            feature.name = 'Clicca per zoomare';
                            img = '';
                          }

                          removeLabelPopup();

                          var len = (feature.name.length*4);

                          label_popup = new OpenLayers.Popup("label_popup",
                          lonlat,
                          new OpenLayers.Size(100+len,35),
                          "<div id='label_popup_content' style='background-color:5db8c8;overflow:hidden'><table style='white-space:pre'><tr><td valign=top>"+img+"</td><td>"+feature.name+"</td></tr></table></div>",
                          null,
                          false
                          );
                          label_popup.backgroundColor = '#5dc8c7';
                          map.addPopup(label_popup);
                          jQuery("#label_popup").click(function() {
                              loadPdiInfoPopup(feature);
                          });
                          label_popup.show();
                          user_map_action_time = (new Date()).getTime();
                    },
                    featureunhighlighted: function(e) {
                        if (e.feature.lid == undefined || _layers[e.feature.lid].inRange) {
                          removeLabelPopup();
                        }
                    }
                }
            });

        map.addLayer(tmplayer);
        map.addLayer(vlayer);

        if (centerToDefaultView) gotoView(default_view);

        map.addControl(controls['select_feature']);
        map.addControl(controls['highlight_feature']);
        
        controls['highlight_feature'].activate();
        controls['select_feature'].activate();
        
        toggleControl();

        if (updatePdiBrowser) loadPdiBrowser();

        jQuery.post('2.0/gis/lloader.php','',loader);
    });
    
}


function addMapPDI(id) {
    jQuery.post('2.0/gis/lloader.php','pdi='+id,loader);
}

function setLayerStatus(l,stat) {

  if (stat != undefined && l._id != undefined) {
      l.setVisibility(stat);
      jQuery.cookie('lstat_'+l._id,stat);
  }
  else {
      var s = (jQuery.cookie('lstat_'+l._id) == 'true');
      l.setVisibility(s);
  }
}

function execjs(id) {
  if (id != undefined && id != '') id += '_';
  else id = '';
  
  jQuery('.'+id+'javascript').each(function() {
    eval(jQuery(this).text());
  });
}

function loader(r) {

        clusters.removeFeatures(clusters.features);

        var wkt = new OpenLayers.Format.WKT();
        var flist = null;
        var nof = null;

        if (r != '') {
            flist = eval('('+r+')');
            nof = flist.feature.length;
        }

        var cluster_features = new Array();

        for (var k = 0; k < nof; k++) {
                var o = flist.feature[k];
                var f = wkt.read(o.gm);
                f.attributes.type = o.t;

                f.attributes.getLabel=function(feature) {
                    if (llabels[feature.lid]) return feature.name;
                    return '';
                };
                f.attributes.alarm = false;
                
                f.lid = o.l;
                f.gid = o.g;
                f.strokecolor = o.sc;
                f.icon = o.i;
                f.name = o.n;
                f.attributes.name = o.n;
                f.writable = o.w;
                f.go = o.go;
                f.attributes.center = new OpenLayers.Geometry.Point(o.x,o.y);

                if (smitprj.getCode() != destprj.getCode()) {
                    f.attributes.center = f.attributes.center.transform(smitprj,map.getProjectionObject());
                    f.geometry = f.geometry.transform(smitprj,map.getProjectionObject());
                }

                                _layers[f.lid].addFeatures(f);
                cluster_features.push(f);
        }

        clusters.addFeatures(cluster_features);

        pb_setLayerStatus();

        ping();

 }


            OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
                defaultHandlerOptions: {
                    'single': true,
                    'double': false,
                    'pixelTolerance': 0,
                    'stopSingle': false,
                    'stopDouble': false
                },

                initialize: function(options) {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    );
                    this.handler = new OpenLayers.Handler.Click(
                        this, {
                            'click': this.trigger
                        }, this.handlerOptions
                    );
                },

                trigger: function(evt) {
                    map.panTo(map.getLonLatFromPixel(evt.xy));
                }

            });

            function gotoView(llext,reproject) {
                    if (llext == 'default') return;
                    if (reproject == undefined) reproject=true;
                    if (llext.trim() != '') {
                        var _tmp = llext.split(";");
                        var layers = _tmp[0].split(" ");
                        var elayers = _tmp[3].split("|");
                        var ext = _tmp[1].split(",");
                        var bound = new OpenLayers.Bounds(ext[0],ext[1],ext[2],ext[3]);

                        if (smitprj.getCode() != destprj.getCode() && reproject)
                            bound = bound.transform(smitprj,map.getProjectionObject());

                        var layer = map.layers;
                          //set ext layers
                          jQuery(".extralayers").each(function() {jQuery(this).attr("checked",false);});
                          
                          for (var k = 0; k < elayers.length; k++) {
                                if (elayers[k]!='') {
                                    var id = elayers[k].replace(' ','_');
                                    jQuery("#"+id).attr("checked",true);
                                    toggleWMS(jQuery("#"+id),elayers[k]);
                                }
                          }
                          //set overlays
                          for (var k = 0; k < layer.length; k++) {
                              if (!layer[k].isBaseLayer && layer[k].name != 'Editable' && layer[k].name != 'tmplayer' && layer[k]._id != undefined) {
                                  if (_layers[layer[k]._id].hidden && _layers[layer[k]._id].init) {
                                    setLayerStatus(layer[k],true);
                                    continue;
                                  }

                                  setLayerStatus(layer[k],false);
                                  for (var j = 0; j < layers.length; j++) {
                                      if (layer[k]._id == layers[j]) {
                                          setLayerStatus(layer[k],true);
                                          break;
                                      }
                                  }
                              }
                          }
                        try {
                            map.zoomToExtent(bound);
                        }
                        catch(e) {}
                    }
                    else
                        map.zoomToMaxExtent();

                    jQuery("#views").selectOptions("default",true);
                }

                function formatResult(row) {
                    return row[1];
                }
                function formatItem(row) {
                    return row[1];
                }
                function findPlace(event, data, formatted) {
                    zoomtoplace(data[0],data[1]);
                }

                function zoomtoplace(info,name,loading,z) {
                    var tmp = info.split(":");
                    var place_id = tmp[0];
                    var layer = tmp[1];
                    var load_img = '';

                    if (loading != undefined && loading)
                          load_img = "<br/><center><img src='2.0/img/loading.gif'/></center>";

                    if (layer != '') {
                        var zoom = map.getZoom();
                        var ll = tmp[2].split(",");
//666
                        if (layer!='yahoosearch') {
                            var lonlat = new OpenLayers.LonLat(ll[0],ll[1]).transform(smitprj,map.getProjectionObject());
                            if (z != undefined && z && zoom < 15) map.zoomTo(15);

                            map.panTo(lonlat);

                            var nf = _layers[layer].features.length;
                            for (var k = 0; k < nf; k++) {
                              var f = _layers[layer].features[k];
                              if (f.gid == place_id) {
                                  var mlayer = map.getLayer(_layers[layer].id);
                                  if (!mlayer.getVisibility()) {
                                      setLayerStatus(mlayer,true);
                                  }
                                  if (label_popup != null) {
                                      label_popup.destroy();
                                      label_popup = null;
                                  }
                                  
                                  loadPdiInfoPopup(f);
                                  break;
                              }
                          }
                       }
                       else {
                            var lonlat = new OpenLayers.LonLat(ll[0],ll[1]).transform(wgs84prj,map.getProjectionObject());
                            map.zoomTo(15);
                            map.panTo(lonlat);
                       }
                    }
                    else {
                        var ext = tmp[2];
                        var bounds = new OpenLayers.Bounds();

                        tmp = (ext.substring(4,ext.length-1)).split(",");
                        ll1 = tmp[0].split(" ");
                        ll2 = tmp[1].split(" ");
                        bounds.extend(new OpenLayers.LonLat(ll1[0],ll1[1]));
                        bounds.extend(new OpenLayers.LonLat(ll2[0],ll2[1]));
                        map.zoomToExtent(bounds);
                    }
                }

                function openSelectLayerPopup(feature) {
                    var bounds = feature.geometry.getBounds();

                    if (smitprj.getCode() != destprj.getCode())
                        feature.geometry.transform(map.getProjectionObject(),smitprj);

                    var geometry = feature.geometry.toString();
                    var tmp,pc,pos,popup_info;
                    var i = geometry.indexOf('(');
                    var geoType = geometry.substring(0,i);

                    current_selected_feature = feature;

                    if (geoType == "POINT")
                        tmp = geometry.substring(i+1,geometry.indexOf(")"));
                    else if (geoType == "LINESTRING")
                        tmp = geometry.substring(i+1,geometry.indexOf(","));
                    else
                        tmp = geometry.substring(i+2,geometry.indexOf(","));

                    pc = tmp.split(" ");

                    var pp = {href: "2.0/editor/addPDI.php",width:500,height:400,name: (new Date()).getTime(),params: "geom="+geometry};

                    jQuery.post("2.0/editor/addPDI.php","geom="+geometry,function(html) {
                        info_popup = new AutoSizeFramedCloud("edit_popup",
                          new OpenLayers.LonLat(bounds.left,bounds.bottom),
                          new OpenLayers.Size(200,200),
                          html,
                          null,
                          true,function() {
                              vlayer.removeFeatures(feature);
                              map.removePopup(info_popup);
                              editor_current_feature = null;
                          });
                          map.addPopup(info_popup);
                          //exec js popup code
                          execjs();
                    });

                }

function togglelbls(l) {
    var tmp = l.attr('id').split('-');
    var lid=tmp[1];
    var new_status;
    if (l.attr('status')=='true' || (l.attr('status')!='false' && l.attr('status'))) new_status = 'false';
    else new_status = 'true';
    
    l.attr('status',new_status)
    l.attr('checked',(new_status=='true'));
    llabels[lid] = (new_status=='true');
    
    _layers[lid].redraw();
}

function toggleWMS(ck,lyr) {
    if (wms_layer[lyr] != null) wms_layer[lyr].setVisibility(ck.attr('checked'));
}

function switchBaseLayer(l) {
    makeMap(l);
}

function makeMap(base,zoomToDefaultView) {

    var mOptions = null;
    var mapZoom = null;
    var mapExtent = null;
    var mapProj = null;
    if (zoomToDefaultView==undefined) zoomToDefaultView = true;
    if (base == undefined) base = 'googlesat';

    current_base_layer = base;

    if (map != null) {
        mapProj = map.getProjectionObject();
        mapZoom = map.getZoom();
        //mapCenter = map.getCenter();
        mapExtent = map.getExtent().transform(map.getProjectionObject(),wgs84prj);
        map.destroy();

        destprj = new OpenLayers.Projection('EPSG:'+baselr[current_base_layer]['projection']);
    }

    vlayer = new OpenLayers.Layer.Vector("vlayer",{displayInLayerSwitcher: false});
    tmplayer = new OpenLayers.Layer.Vector("tmplayer",{displayInLayerSwitcher: false});

    //controls definition ...

    var style = new OpenLayers.Style();
    style.addRules([
          new OpenLayers.Rule({symbolizer: this.sketchSymbolizers})
    ]);
    var styleMap = new OpenLayers.StyleMap({"default": style});

        mp_control = new OpenLayers.Control.MousePosition({element: jQuery("#mousepos")[0],numDigits: 4,prefix: ""});
        controls = {
            draw_line:  new OpenLayers.Control.DrawFeature(vlayer, OpenLayers.Handler.Path, {handlerOptions: {'freehand': false},'displayClass': 'olControlDrawFeaturePath'}),
            draw_point: new OpenLayers.Control.DrawFeature(vlayer, OpenLayers.Handler.Point, {handlerOptions: {'freehand': false},'displayClass': 'olControlDrawFeaturePoint'}),
            draw_polygon:  new OpenLayers.Control.DrawFeature(vlayer, OpenLayers.Handler.Polygon, {handlerOptions: {'freehand': false},'displayClass': 'olControlDrawFeaturePolygon'})
        }

        controls['measure_path'] = new OpenLayers.Control.Measure(
            OpenLayers.Handler.Path, {
            handlerOptions: {
                style: "default", // this forces default render intent
                layerOptions: {styleMap: styleMap},
                persist: true
              }
            });
        controls['measure_area'] = new OpenLayers.Control.Measure(
            OpenLayers.Handler.Polygon, {
              handlerOptions: {
                style: "default", // this forces default render intent
                layerOptions: {styleMap: styleMap},
                persist: true
              }
            }
          );

        controls['measure_path'].events.on({
            "measure": handleMeasurements,
            "measurepartial": handleMeasurements
        });
        controls['measure_area'].events.on({
            "measure": handleMeasurements,
            "measurepartial": handleMeasurements
        });

        if (edit) {
            
            controls['draw_line'].featureAdded = function(feature) {
              feature.state = OpenLayers.State.INSERT;
              if (editor_current_feature == null) {
                editor_current_feature = feature;
                try {
                  feature.layer.drawFeature(feature);
                } catch(e) {}
                openSelectLayerPopup(feature);
              }
              else vlayer.removeFeatures(feature);
            }

            controls['draw_point'].featureAdded = function(feature) {
              feature.state = OpenLayers.State.INSERT;
              if (editor_current_feature == null) {
                editor_current_feature = feature;

                try {
                  feature.layer.drawFeature(feature);
                } catch(e) {}

                openSelectLayerPopup(feature);
              }
              else vlayer.removeFeatures(feature);
            }

            controls['draw_polygon'].featureAdded = function(feature) {
              feature.state = OpenLayers.State.INSERT;
              if (editor_current_feature == null) {
                editor_current_feature = feature;
                try {
                  feature.layer.drawFeature(feature);
                } catch(e) {}
                openSelectLayerPopup(feature);
              }
              else vlayer.removeFeatures(feature);
            }
        }

        controls['pan'] = new OpenLayers.Control.Navigation({handleRightClicks:true,zoomBoxKeyMask:OpenLayers.Handler.MOD_CTRL});

        strategy = new OpenLayers.Strategy.Cluster();
        strategy.distance = 50;
        strategy.threshold = null;

        clusters = new OpenLayers.Layer.Vector("Clusters", {
            strategies: [strategy],
            styleMap: new OpenLayers.StyleMap({
                "default": cluster_style,
                "select": {
                    fillColor: "#8aeeef",
                    strokeColor: "#32a8a9"
                }
            })
        });


        //base layer definition
    base_layer[0] = new OpenLayers.Layer.Google('Google Hybrid',
                    {type: google.maps.MapTypeId.SATELLITE,'sphericalMercator': true,
                     displayInLayerSwitcher: true}
                    );base_layer[1] = new OpenLayers.Layer.Google('Google Hybrid',
                    {type: google.maps.MapTypeId.HYBRID,'sphericalMercator': true,
                     displayInLayerSwitcher: true}
                    );base_layer[2] = new OpenLayers.Layer.Google('Google Hybrid',
                    {type: google.maps.MapTypeId.ROADMAP,'sphericalMercator': true,
                     displayInLayerSwitcher: true}
                    );base_layer[3] = new OpenLayers.Layer.WMS('Mappa',
                 wms_tileservers,
                 {layers: 'demo_strade',
                  displayInLayerSwitcher: true},
                  {transitionEffect: 'resize',buffer:0});
    //init

    var mapctrl = new Array();
    var click = new OpenLayers.Control.Click();
    mapctrl.push(click);
    mapctrl.push(controls['pan']);
    mapctrl.push(new OpenLayers.Control.PanZoomBar({displayClass:"olPanZoomBar"}));
    mapctrl.push(mp_control);
    mapctrl.push(new OpenLayers.Control.ScaleLine({element: jQuery("#mapscale")[0]}));
    if (edit) mapctrl.push(controls['draw_line']);
    if (edit) mapctrl.push(controls['draw_point']);
    if (edit) mapctrl.push(controls['draw_polygon']);
    mapctrl.push(controls['measure_path']);
    mapctrl.push(controls['measure_area']);

    var b = baselr[current_base_layer]['bounds'].split(",");

    mOptions = {
                   panMethod: null,
                   maxExtent: new OpenLayers.Bounds(b[0],b[1],b[2],b[3]),
                   units: 'm',
                   projection: new OpenLayers.Projection('EPSG:'+baselr[current_base_layer]['projection']),
                   displayProjection: new OpenLayers.Projection("EPSG:4326"),
                   maxResolution: baselr[current_base_layer]['resolution'],
                   controls:mapctrl,
                   numZoomLevels:20
                }
    var oOptions = {
                   maxExtent: new OpenLayers.Bounds(b[0],b[1],b[2],b[3]),
                   units: 'm',
                   projection: new OpenLayers.Projection('EPSG:'+baselr[current_base_layer]['projection']),
                   maxResolution: baselr[current_base_layer]['resolution'],
                   numZoomLevels:20
                }

    map = new OpenLayers.Map('map',mOptions);


    map.addLayer(base_layer[0]);map.addLayer(base_layer[1]);map.addLayer(base_layer[2]);map.addLayer(base_layer[3]);    map.addLayer(clusters);
    map.setBaseLayer(base_layer[layer2index[current_base_layer]]);

    map.events.register("moveend", map, updateMapInfo);
    map.events.register("zoomend", map, pb_setLayerStatus);
    map.events.register("mousemove", map, updateLPopupPos);
    click.activate();

    if (mapProj != null) {
        ll(true,zoomToDefaultView,false);
        map.zoomToExtent(mapExtent.transform(wgs84prj,destprj),true);
    }
    else ll();

    if (base != 'googlesat' && base != 'googlehyb' && base != 'googlemap') {
        var overview1 = new OpenLayers.Control.OverviewMap({mapOptions:oOptions});
        map.addControl(overview1);
    }
 
    updateMapInfo();
    jQuery.unblockUI();
}

