OpenLayers.Control.KeyboardDefaults.prototype.defaultKeyPress= 
function(evt) {
	 switch(evt.keyCode) {
        // PAN KEYS (UP, DOWN, LEFT, RIGHT ARROWS / PAGE UP, PAGE DOWN, HOME, END)
        case OpenLayers.Event.KEY_LEFT:
            this.map.pan(-this.slideFactor, 0);
            break;
        case OpenLayers.Event.KEY_RIGHT: 
            this.map.pan(this.slideFactor, 0);
            break;
        case OpenLayers.Event.KEY_UP:
            this.map.pan(0, -this.slideFactor);
            break;
        case OpenLayers.Event.KEY_DOWN:
            this.map.pan(0, this.slideFactor);
            break;
        case 33: // Page Up  
            var size = this.map.getSize();
            this.map.pan(0, -0.75*size.h);
            break;
        case 34: // Page Down  
            var size = this.map.getSize();
            this.map.pan(0, 0.75*size.h);
            break; 
        case 35: // End  
            var size = this.map.getSize();
            this.map.pan(0.75*size.w, 0);
            break; 
        case 36: // Pos1  
            var size = this.map.getSize();
            this.map.pan(-0.75*size.w, 0);
            break; 

        // ZOOM KEYS (+, -, T, t)
        case 43: // + 
            this.map.zoomIn();
            break; 
        case 45: // - 
            this.map.zoomOut();
            break; 
        case 107: // + (IE only)
            this.map.zoomIn();
            break;
        case 109: // - (IE only)
            this.map.zoomOut();
            break;
       case 84: // T = Zoom Tutto
	        this.map.setCenter(new OpenLayers.LonLat(1496530,4433776),2);
	        break;         
	   case 116: // t = Zoom Tutto
	        this.map.setCenter(new OpenLayers.LonLat(1496530,4433776),2);
	        break;      
	        
	        
        // TOGGLE ELEMENTS KEYS (O, o, S, s, L, l, R, r, m, M, e, E, c, C)
        case 79: // O = Overview
            overview.toggleChild();
            break;
        case 111: // o = Overview 
            overview.toggleChild();
            break;
        case 83: // S = Sidebar
            toggleSideBar();
            break;
        case 115: // s = Sidebar
            toggleSideBar();
            break;
        case 76: // L = Ricerca Localit�
            reset_init('address');
            dirs.reset();
            addr.reset();
            clearObjectMarkers();
            objects = null;
	        addr.geocodedAddr=null;		        
            break;
        case 108: // l = Ricerca Localit�
            reset_init('address');
            dirs.reset();
            addr.reset();
            clearObjectMarkers();
            objects = null;
	        addr.geocodedAddr=null;	
            break;
        case 82: // R = Ricerca Percorsi
            reset_init('route');
            dirs.reset();
            addr.reset();
            clearObjectMarkers();
            objects = null;
	        addr.geocodedAddr=null;	
            break;
        case 114: // r = Ricerca Percorsi
            reset_init('route');
            dirs.reset();
            addr.reset();
            clearObjectMarkers();
            objects = null;
	        addr.geocodedAddr=null;	
            break;            
        case 77: // m M = misure e distanze
            toggleSideBar('open');
            toggleSideBarOutput('contenutidisponibili');            
            break;    
        case 69: // e E = Elenco risultati della ricerca
            toggleSideBar('open');
            toggleSideBarOutput('risultatiricerca');            
            break;              
        case 67: // c C= chiudi finestra email e finestra link
            showHideDiv('containerEmail',false);      
            showHideDiv('containerLink',false);  
            break;          
      

        // INPUT FIELDS KEYS (A, a, P, p, D, D,  I, i)
        case 65: // A = focus on Address
            document.getElementById('indicazioni').className='outscreen';
            document.getElementById('cerca').className='todo_bar pos';
            document.getElementById('searchInput').focus();
            document.getElementById('searchInput').select();
            break;
        case 97: // a = focus on Address
            document.getElementById('indicazioni').className='outscreen';
            document.getElementById('cerca').className='todo_bar pos';
            document.getElementById('searchInput').focus();
            document.getElementById('searchInput').select();
            break;
        case 80: // P = focus on Partenza
            document.getElementById('indicazioni').className='todo_bar pos';
            document.getElementById('cerca').className='outscreen';
            document.getElementById('start').focus();
            document.getElementById('start').select();
            break;
        case 112: // p = focus on Partenza
            document.getElementById('indicazioni').className='todo_bar pos';
            document.getElementById('cerca').className='outscreen';
            document.getElementById('start').focus();
            document.getElementById('start').select();
            break;
        case 68: // D = focus on Destinazione
            document.getElementById('indicazioni').className='todo_bar pos';
            document.getElementById('cerca').className='outscreen';
            document.getElementById('end').focus();
            document.getElementById('end').select();
            break;
        case 100: // d = focus on Destinazione
            document.getElementById('indicazioni').className='todo_bar pos';
            document.getElementById('cerca').className='outscreen';
            document.getElementById('end').focus();
            document.getElementById('end').select();
            break;      
      
        case 73: // I = Inverti
            reverseDirection();
            break;
        case 105: // i = Inverti
            reverseDirection();
            break;
     
        // SWITCH LAYER (1, 2, 3)
        case 49: // 1 = Mappa Stradale
            SwitchLayer('Stradale');
            break;
        case 50: // 2 = Mappa Aerea
            SwitchLayer('Aerea');
            break;
        case 51: // 3 = Mappa Ibrida
            SwitchLayer('Ibrida');
            break;    
     
    }
}



Roja.Control.FloatingPanel.Overview.prototype.draw = function() {
		
		if (this.div!=null) {
	        this.external = true;
	        var width = null;
	        var height = null;
	        if (this.div.style.width) {width = this.div.style.width;}
	        else if (this.size != null) {width = this.size.w;} else {width = '250px';}
	        if (this.div.style.height) {height = this.div.style.height;this.div.style.height = "";}
	        else if (this.size != null) {height = this.size.h;} else {height = '400px';}
	        this.size = new OpenLayers.Size(width,height);
	    }
	    Roja.Control.prototype.draw.apply(this, arguments);       
	    // assign a class to the floating panel object
	    this.div.className='RojaControlFloatingPanel';
	
	    // creates the div for the title of the floating panel
	    this.titlePanel = document.createElement('div');
	    this.titlePanel.className = 'titlePanel';
	
	    this.titlePanel.style.width = this.size.w + 'px';
	    this.titlePanel.style.cursor = "default";
	
	    this.spanTitle = document.createElement('span');
	    this.spanTitle.className = 'titleSpan';
	
	    this.divtext = document.createElement('div');
	    this.divtext.className = 'titleText';
	    this.divtext.innerHTML = this.title;
	    this.spanTitle.appendChild(this.divtext);
	
	    // creates a div for the controls of the floating panel
	    this.statusbarimg = document.createElement('div');
	    this.statusbarimg.className = 'statusBarImg';
	
	    this.spanTitle.appendChild(this.statusbarimg);
	
	    this.imgNascondi = document.createElement('img');
	    this.imgNascondi.id = 'sbImgNascondi' + this.idname;
	    this.imgNascondi.src = OpenLayers.ImgPath + 'floating/nascondi.gif';
	    this.imgNascondi.style.cursor='pointer';
	
	    this.statusbarimg.appendChild(this.imgNascondi);
	
	    this.floatingEvents = new OpenLayers.Events(this, this.imgNascondi,null, true);
	    this.floatingEvents.register('click', this, this.toggleChild);
	
	    this.titlePanel.appendChild(this.spanTitle);
	    this.div.appendChild(this.titlePanel);
	
	    // container for childs floating panels
	    this.childElement = document.createElement('div');
	
	    this.childElement.id=this.idname+'Child';
	    this.childElement.style.top='0px';
	    this.childElement.style.left='0px';
	
	    this.childElement.style.width = this.size.w + 'px';
	    this.childElement.style.height = this.size.h + 'px';
	    this.childElement.className= 'child';
	
	    this.div.appendChild(this.childElement);
	
	    //block mousewheel events
	    OpenLayers.Event.observe(this.div, "DOMMouseScroll", this.stopLocalEvent);
	    OpenLayers.Event.observe(this.div, "mousewheel", this.stopLocalEvent);
	
	    this.overflowEvents = new OpenLayers.Events(this, this.div, null, true);
	    this.overflowEvents.register('mousedown', this, this.mouseDownEvent);
	    this.overflowEvents.register('mouseup', this, this.mouseUpEvent);
	
	    this.events = new OpenLayers.Events(this, this.childElement, null);
	    this.events.register('click', this.childElement, this.stopevent);
	
	    var context = {div: this.div,zIndex:this.zIndex}
	    this.events.register('mousedown', this.childElement, OpenLayers.Function.bindAsEventListener(this.mouseDownEventOnChild,context));
	
	    this.events.register('dblclick', this.childElement, this.stopevent);
	
	    this.events = new OpenLayers.Events(this, this.titlePanel, null);
	    this.events.register('click', this.titlePanel, this.stopevent);
	    this.events.register('dblclick', this.titlePanel, this.stopevent);
	
	    this.map.events.unregister('moveend', this, this.update);
	
	    this.map.floatingDivList.push(this);
		
		this.div.style.height = "";
		//Add standard layer if custom is absent
		if (this.layers.length == 0) {
            //Add graphiclayer to map
            this.graphicLayer = new Roja.Layer.Image(
                            'Overview',
                            this.imageUrl,
                            this.layerBounds,
                            this.size);
            this.graphicLayer.setIsBaseLayer(false);
            this.graphicLayer.setVisibility(false);
            this.graphicLayer.displayInLayerSwitcher = false;
            this.map.addLayer(this.graphicLayer);
            
            var layeroverview = this.graphicLayer.clone();
            layeroverview.setIsBaseLayer(true);
                    
		    this.layers = [layeroverview];
		}
			
		this.mapDiv = document.createElement('div');
		this.mapDiv.id = OpenLayers.Util.createUniqueID(this.idname);
		this.mapDiv.className = 'mapDiv';
		this.childElement.appendChild(this.mapDiv);
				
		this.map.events.register('moveend', this, this.update);
	
		// reassign event after moving overview map
		if (!this.external)
        {   
			this.map.events.register('mouseup', this, this.moveStartOverview);
			this.map.events.register('mousemove', this, this.moveStartOverview);
        }
		this.rectEvents = new OpenLayers.Events(this, this.mapDiv, null, true, {includeXY: true});
		this.rectEvents.register('mouseout', this, this.rectMouseOut);
		this.rectEvents.register('mousedown', this, this.rectMouseDown);
		this.rectEvents.register('mousemove', this, this.rectMouseMove);
		this.rectEvents.register('mouseup', this, this.rectMouseUp);
		this.rectEvents.register('click', this, function(e) {
			OpenLayers.Event.stop(e);
		});
	
		if(this.map.getExtent()) {
			this.update();
		}
			  
		return this.div;

	},

  /** 
     * APIMethod: getArea
     * Calculated by subtracting the areas of the internal holes from the 
     *   area of the outer hole.
     * 
     * Returns:
     * {float} The area of the geometry
     */
OpenLayers.Geometry.Point.prototype.getArea= function() {
        var area = 0.0;
        var pigreco = 3.14;
        
        var control = measureControls['point'];
        var layer = control.handler.layer;
        if (layer!=null && layer.features.length>0) {
        	var feature = layer.features[0];
        	 var style = feature.style;
        	 var raggio = style.pointRadius;
        	 var x =this.x;
			 var y = this.y;
			 var pixel = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(x,y));
        	 x = pixel.x + raggio;
        	 y = pixel.y;
        	 var point = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(x,y))
        	 raggio = point.lon-this.x;
        	 area = pigreco*raggio*raggio;        	
        }   
     
        return area;
 }


  /** 
     * APIMethod: getPerimeter
     * Calculated by subtracting the areas of the internal holes from the 
     *   area of the outer hole.
     * 
     * Returns:
     * {float} The area of the geometry
     */
OpenLayers.Geometry.Point.prototype.getPerimeter= function() {
        var perimeter = 0.0;
        var pigreco = 3.14;
        
        var control = measureControls['point'];
        var layer = control.handler.layer;
        if (layer!=null && layer.features.length>0) {
        	var feature = layer.features[0];
        	 var style = feature.style;
        	 var raggio = style.pointRadius;
        	 var x =this.x;
			 var y = this.y;
			 var pixel = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(x,y));
        	 x = pixel.x + raggio;
        	 y = pixel.y;
        	 var point = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(x,y))
        	 raggio = point.lon-this.x;
        	 perimeter =  2*pigreco*raggio;        	
        }   
     
        return perimeter;
 }
 
  /**
     * APIMethod: getPerimeter
     * Note - The perimeter
     * 
     * Returns:
     * {Float} The perimeter .
     */
OpenLayers.Geometry.LinearRing.prototype.getPerimeter= function() {
        var perimeter = 0.0;
        if ( this.components && (this.components.length > 2)) {
            for (var i=1, len=this.components.length; i<len; i++) {               
                perimeter += this.components[i-1].distanceTo(this.components[i]);               
            }            
        }
        return perimeter;
}
    
  
    /** 
     * APIMethod: getPerimeter
     * Calculated by subtracting the areas of the internal holes from the 
     *   area of the outer hole.
     * 
     * Returns:
     * {float} The Perimeter of the geometry
     */
OpenLayers.Geometry.Polygon.prototype.getPerimeter= function() {
        var perimeter = 0.0;
        if ( this.components && (this.components.length > 0)) {
            perimeter += Math.abs(this.components[0].getPerimeter());
            for (var i=1, len=this.components.length; i<len; i++) {
               perimeter += Math.abs(this.components[i].getPerimeter());
            }
        }
        return perimeter;
}

  /**
     * Method: measure
     *
     * Parameters:
     * geometry - {<OpenLayers.Geometry>}
     * eventType - {String}
     */
OpenLayers.Control.Measure.prototype.measure= function(geometry, eventType) {
        var stat, order, perimeter;
        if(geometry.CLASS_NAME.indexOf('LineString') > -1) {
            stat = this.getBestLength(geometry);
            order = 1;
            this.events.triggerEvent(eventType, {
	            measure: stat[0],
	            units: stat[1],
	            order: order,
	            geometry: geometry
	        });
        } else {
            stat = this.getBestArea(geometry);
            perimeter = this.getBestPerimeter(geometry);
            order = 2;
            this.events.triggerEvent(eventType, {
            measure: stat[0],
            perimeter:perimeter[0],
            units: stat[1],
            order: order,
            geometry: geometry
        });
        }
       
}
 /**
     * Method: getBestPerimeter
     * Based on the <displaySystem> returns the perimeter of a geometry.
     *
     * Parameters:
     * geometry - {<OpenLayers.Geometry>}
     *
     * Returns:
     * {Array([Float, String])}  Returns a two item array containing the
     *     area and the units abbreviation.
     */
OpenLayers.Control.Measure.prototype.getBestPerimeter= function(geometry) {
        var units = this.displaySystemUnits[this.displaySystem];
        var unit, perimeter;
        for(var i=0, len=units.length; i<len; ++i) {
            unit = units[i];
            perimeter = this.getPerimeter(geometry, unit);
            if(perimeter > 1) {
                break;
            }
        }
        return [perimeter, unit];
}
    
    /**
     * Method: getPerimeter
     *
     * Parameters:
     * geometry - {<OpenLayers.Geometry>}
     * units - {String} Unit abbreviation
     *
     * Returns:
     * {Float} The geometry perimeter in the given units.
     */
OpenLayers.Control.Measure.prototype.getPerimeter= function(geometry, units) {
        var perimeter = geometry.getPerimeter();
        var inPerDisplayUnit = OpenLayers.INCHES_PER_UNIT[units];
        if(inPerDisplayUnit) {
            var inPerMapUnit = OpenLayers.INCHES_PER_UNIT[this.map.getUnits()];
            perimeter *= Math.pow((inPerMapUnit / inPerDisplayUnit), 2);
        }
        return perimeter;
}

 Roja.Directions.prototype.successRoute= function (request) {
	    var xmlResponse = request.responseXML;
	    if (!xmlResponse || request.fileType!="XML") {
            xmlResponse = OpenLayers.parseXMLString(request.responseText);
        }
		if (this.map!=null)
		{
			this.drawOnMap(xmlResponse);
		}
		var xml = request.responseText;
                
        var pos = xml.indexOf('&lt;![CDATA['); 
        while (pos!=-1) {
            xml = xml.substring(0,pos)+ xml.substring(pos+12);
            pos = xml.indexOf('&lt;![CDATA[');
        }
        pos = xml.indexOf(']]&gt;'); 
        while (pos!=-1) {
            xml = xml.substring(0,pos)+xml.substring(pos+6);
            pos = xml.indexOf(']]&gt;');
        }
                
        var html = Roja.transformXml(xml,this.xsl);
		html=html.replace(/&lt;/g , "<");
		html=html.replace(/&gt;/g , ">");
		if (this.routepanel != null)
		{
			document.getElementById(this.routepanel).innerHTML = html;
		}

		this.loadData(xmlResponse);
}    
     
function decodeParameters(text) {		
    text=text.replace(/&lt;/g , "<");
    text=text.replace(/&gt;/g , ">");    
	return text;
	
}
