
var mapPanel,popup,lonlat,win;
var lon = 1453010.5797277;
var lat = 5417856.5640991;
var geocoder = new GClientGeocoder();
var source = new Proj4js.Proj('EPSG:4326');
var dest = new Proj4js.Proj('EPSG:900913');

Proj4js.defs["EPSG:3004"] = "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +units=m +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 +no_def";
var roma40 =new Proj4js.Proj('EPSG:3004');
var markers2;
var urlArray = ["http://montagneaperte.gfosservices.it/cgi-bin/tc/tilecache.cgi?","http://demo.gfosservices.it/cgi-bin/tc/tilecache.cgi?","http://www.gfosservices.it/cgi-bin/tc/tilecache.cgi?"];
var singleUrl = "http://montagneaperte.gfosservices.it/geoserver/wms?";
var options = {
                projection: new OpenLayers.Projection("EPSG:900913"),
                units: "m",
                maxResolution: 76.43702827148438,
		minResolution: 0.5971642833709717,
		maxExtent: new OpenLayers.Bounds(1384267,5250703,1435744,5345039.5),
		restrictedExtent: new OpenLayers.Bounds(1384267,5250703,1435744,5345039.5)
            };

var selectionLayerOptions ={
                             displayInLayerSwitcher: false
                           };

Ext.onReady(function() {
        	OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
        OpenLayers.Util.onImageLoadErrorColor = "transparent";

	var map = new OpenLayers.Map(options);

        mapPanel = new GeoExt.MapPanel({
        border: true,
        region: "center",
        map: map,
        center: [lon, lat],
        zoom: 0,
        layers: [
	    new OpenLayers.Layer.Google('Google Satellite',
		{type: G_HYBRID_MAP, sphericalMercator:true,MAX_ZOOM_LEVEL:18,MIN_ZOOM_LEVEL:10}
		),
	    new OpenLayers.Layer.WMS('Limiti Comunit&agrave; Montana',
		//urlArray,
		singleUrl,
		{'layers':'montagneAperte:limiti','format':'image/png','transparent':true},
		{'isBaseLayer': false,'visibility':true,'singleTile':true}
		),
	    new OpenLayers.Layer.WMS("Ortofoto 2006", 
		urlArray,
		{'layers': 'ortofoto2006Montagne','format': 'image/jpeg'},
    		{'isBaseLayer': true}),
	    new OpenLayers.Layer.Markers("Selection",selectionLayerOptions),
	    new OpenLayers.Layer.WMS("Ortofoto 2008",
		urlArray,
                {'layers': 'ortofoto2008Montagne','format': 'image/jpeg'},
                {'isBaseLayer': true,'transitionEffect': 'resize'}),
	    new OpenLayers.Layer.WMS("IGM 25000",
		urlArray,
                {'layers': 'igmMontagne','format': 'image/png'},
                {'isBaseLayer': true}),
	    new OpenLayers.Layer.WMS("CTR Regione Umbria",
                'http://demo.gfosservices.it/cgi-bin/tc/tilecache.cgi',
                {'layers': 'ctrMontagne','format': 'image/png'},
                {'isBaseLayer': false,'visibility':false,'maxResolution':3})

      ]
    });
	markers2 = new OpenLayers.Layer.Markers("Selection",selectionLayerOptions);
        map.addLayer(markers2);
    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 (e) {
	    geocoder = new GClientGeocoder();
            lonlat = map.getLonLatFromViewPortPx(e.xy);
	    var p = new Proj4js.Point(lonlat.lon, lonlat.lat);
	    Proj4js.transform(dest, source, p);
            latlng = new GLatLng(p.y,p.x);
	    geocoder.getLocations(latlng, renderPopup);
 
	}
    });    
    var click = new OpenLayers.Control.Click();
    map.addControl(click);
    click.activate();  
    
    function renderPopup(response) {
				var p;
				var place;
    			        if (!response || response.Status.code != 200) {
					    alert("Status Code:" + response.Status.code);
  				} else {
    				place = response.Placemark[0];
    				point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
				p = new Proj4js.Point(place.Point.coordinates[0],place.Point.coordinates[1]); 
				Proj4js.transform(source, roma40, p); 
   				clickedPoint=	'<span class="popup"><b><u>RISULTATI:</u></b><br><b>Coordinate GPS (lat,long): </b>' + response.name + '<br/>' +'<b>Coordinate GB Roma40 Fuso 2: </b>'+p.x.toFixed(2)+','+p.y.toFixed(2)+'<br/><b>Indirizzo: </b>' + place.address + '<br>' +
        					'<b>Precisione: </b>' + place.AddressDetails.Accuracy + ' (<a href=\'http://code.google.com/apis/maps/documentation/reference.html#GGeoAddressAccuracy\' target=\'_blank\'>Informazioni)</a><br> <br><span style="font-size: .67em;"><b>Note sulle coordinate GB:</b>La conversione da WGS84 a GB Roma 40 Fuso 2<br/> viene svolta utilizzando i parametri towgs84 che permettono di ottenere<br/> un errore inferiore ai 10m.</span></span>';
   				}


				if (popup != null) {
                                                   popup.destroy();
                                                   popup = null;
                                }

		                popup = new OpenLayers.Popup.FramedCloud("SDVegetationInfo",
									lonlat,
                                                                        new OpenLayers.Size(250,180),
                                                                        clickedPoint,
                                                                        null,
                                                                        true);
            		     popup.setBackgroundColor("#bcd2ee");
            		     map.addPopup(popup);
    }

    var tree = new Ext.tree.TreePanel({
        border: true,
        region: "west",
        title: "Layers",
        width: 220,
        split: true,
        collapsible: true,
        collapseMode: "mini",
        autoScroll: true,
        loader: new Ext.tree.TreeLoader({
            //clearOnLoad: true
            applyLoader: false
        }),
	root: new Ext.tree.AsyncTreeNode({    
		  //expanded: false,
		  title: "Tematismi disponibili",
		  children: [{
		      text: 'Overlay',
		      itemId: 'overlay',
		      nodeType: 'gx_overlaylayercontainer',
		      expanded: true
		  }, {
		      text: 'Cartografia di base',
		      itemId: 'base',
		      nodeType: 'gx_baselayercontainer',
		      expanded: true 
                   }],
     rootVisible:true,
     autoScroll: true,
     expanded: true
     }),
     rootVisible: false,
     lines: false
    });
   
new Ext.Viewport({
        layout: "fit",
        hideBorders: true,
        items: {
            layout: "border",
            deferredRender: false,
            items: [

		mapPanel, tree, {
                contentEl: "desc",
                region: "east",
                bodyStyle: {"padding": "5px"},
                collapsible: true,
                collapseMode: "mini",
                split: true,
                width: 250,
                title: "Ricerca"
            }]
        }

    });

function showLocation() {
    var address = document.getElementById('indirizzo').value;
    geocoder.setBaseCountryCode('it');
    geocoder.getLocations(address, getAddress);
    }

function getAddress(response) {
    html = '<ul>';
    if (!response || response.Status.code != 200) {
        html = 'Nessun risultato individuato';
    } else {
        for (i = 0; i < response.Placemark.length; i++) {
	    		place = response.Placemark[i];
                        lat = place.Point.coordinates[1];
                        lng = place.Point.coordinates[0];
			if (lat < 42.5930 || lat > 43.2199 || lng > 12.91499 || lng < 12.42099)
			{
			html='<b>Il dato ricade fuori dal territorio della Comunit&agrave; Montana </b>';
			} else {
            		indiriz = place.address; 
            		html = html + '<a href=\"javascript:center(' + lat + ',' + lng + ');\">'+indiriz+'</a><br />';
			}
        }
    }
	html=html+'</ul>';
	if (html=='') {
	document.getElementById('risultatiGoogle').innerHTML = '<b>Nessun risultato trovato nel territorio della Comunit&agrave; Montana</b>';
	} else {
        document.getElementById('risultatiGoogle').innerHTML = html;
	}
}



Ext.get('Invia').on('click', showLocation);
            win = new Ext.Window({
                applyTo:'hello-win',
                layout:'fit',
                width:500,
                height:300,
                closeAction:'hide',
                plain: true,

                items: new Ext.TabPanel({
                    applyTo: 'hello-tabs',
                    autoTabs:true,
                    activeTab:0,
                    deferredRender:false,
                    border:false,
		    resizeTabs:true, // turn on tab resizing
	            minTabWidth: 160,
        	    tabWidth:160

//			tabWidth:500,
                }),
                buttons: [{
                    text: 'Close',
                    handler: function(){
                    win.hide();
                    }
                }]
            });



win.show();

});

function center(lat, lng) {
    var p = new Proj4js.Point(lng, lat);
    Proj4js.transform(source, dest, p);
    mapPanel.map.setCenter(new OpenLayers.LonLat(p.x, p.y), 6);
    markers2.clearMarkers();
    var marker = new OpenLayers.Marker(new OpenLayers.LonLat(p.x, p.y), new OpenLayers.Icon("down.png", new OpenLayers.Size(40,40)));
    markers2.addMarker(marker);
}

