/**
 * Class: MW.Control.SetPoint
 * DragPan control.
 *
 * Inherits from:
 *  - <OpenLayers.Control>
 */
MW.Control.SetPoint = OpenLayers.Class(OpenLayers.Control, {

    /** 
     * Property: type
     * {OpenLayers.Control.TYPES}
     */
    type: OpenLayers.Control.TYPE_TOOL,

    /** 
     * Property: currentPosition
     * {OpenLayers.LonLat}
     */
    currentPosition: null,

    /** 
     * Property: urlSentieriWebBackend
     * {String}
     */
	url: null,
	
    /** 
     * Property: ele
     * {Object}
     */
    ele: null,

    /** 
     * Property: geomPointList
     * {Vector}
     */
    geomPointList: [],
    
    /** 
     * Property: searchValue
     * {String}
     */
    searchValue: null,
    
    /** 
     * Property: errorSetPointMessage
     * {String}
     */
    errorSetPointMessage : noLocalitaTrovata,
    
    /**
    * @private 
	* Property: events
	* {OpenLayers.Events}
	*/
    events: null,

    /**
    * @private 
	* Property: EVENT_TYPES
	* {Array}
	*/
    EVENT_TYPES: ["loadComplete","loadFailure"],
    
    /**
    * @private 
	* Property: fallThrough
	* {boolean}
    * Should Directions allow events on the map to fall through to other
    * elements on the page, or should it swallow them? (#457)
    * Default is to swallow them.
	*/
    fallThrough: false,

    /**
     * Constructor: MW.Control.SetPoint
     *
     * Parameters:
     * options - {Object}
     */
    initialize: function(options) {
        OpenLayers.Control.prototype.initialize.apply(this, arguments);
        this.events = new OpenLayers.Events(this, this, this.EVENT_TYPES, this.fallThrough);
    },

    /**
     * Method: draw
     * Creates a Point handler, 
     */    
    draw: function() {
        this.handler = new OpenLayers.Handler.Click(this, {
                "click": this.setPoint
            }
        );
    },

    /**
    * Method: setPoint 
    */
    setPoint: function(evt) {
    	var px = new OpenLayers.Pixel(evt.xy.x,evt.xy.y);
    	var currentPosition = this.map.getLonLatFromPixel(px);
    	
	  	var par = "?locale=" +language+"&command=TrovaNodo" + 
	  				"&pointGeom="+currentPosition.lon + "," + currentPosition.lat;
	  	var successFunction = this.successTrovaLocalitaPerGeomFunc.bind(this);
	  	var failureFunction = this.failureTrovaLocalitaPerGeomFunc.bind(this);
	    new OpenLayers.Ajax.Request(this.url + par,
	                     {   method: 'get',
	                         parameters: null,
	                         onComplete: successFunction,
	                         onFailure: failureFunction
	                      }
	                     );
    },
    
	successTrovaLocalitaPerGeomFunc: function (request) {
	    var xmlResponse = request.responseXML;
	    if (!xmlResponse || request.fileType!="XML") {
            xmlResponse = OpenLayers.parseXMLString(request.responseText);
        }
        var puntoNotevole = xmlResponse.getElementsByTagName('nodo')[0];
        if (puntoNotevole!=null)
        {
			var geometria = puntoNotevole.attributes.getNamedItem("geometria").value;  
			var lonLatPoint = new OpenLayers.LonLat(geometria.substring(0,geometria.indexOf(',')),geometria.substring(geometria.indexOf(',')+1,geometria.length));
		    //Aggiungo il punto in una struttura locale all'oggetto
			this.geomPointList[this.ele] = lonLatPoint;
			this.searchValue = puntoNotevole.attributes.getNamedItem("geometria").value; 			
	        this.events.triggerEvent("loadComplete");
        }
        else
       	{
	        this.events.triggerEvent("loadFailure");
       	}
    },

	failureTrovaLocalitaPerGeomFunc: function (request	) {
        this.events.triggerEvent("loadFailure");
		alert(this.errorSetPointMessage);
    },
    
    CLASS_NAME: "MW.Control.SetPoint"
});

