/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
 * See http://svn.openlayers.org/trunk/openlayers/release-license.txt 
 * for the full text of the license. */


/**
 * @class
 * 
 * @requires OpenLayers/Control.js
 */
OpenLayers.Control.Permalink = OpenLayers.Class.create();
OpenLayers.Control.Permalink.prototype = 
  OpenLayers.Class.inherit( OpenLayers.Control, {

    /** @type DOMElement */
    element: null,
    
    /** @type String */
    base: '',

    /**
     * @constructor
     * 
     * @param {DOMElement} element
     * @param {String} base
     */
    initialize: function(element, base) {
        OpenLayers.Control.prototype.initialize.apply(this, arguments);
        this.element = OpenLayers.Util.getElement(element);        
        if (base) {
            this.base = base;
        }
    },

    /**
     * 
     */
    destroy: function()  {
        if (this.element.parentNode == this.div) {
            this.div.removeChild(this.element);
        }
        this.element = null;

        this.map.events.unregister('moveend', this, this.updateLink);

        OpenLayers.Control.prototype.destroy.apply(this, arguments); 
    },

    /** Set the map property for the control. 
     * 
     * @param {OpenLayers.Map} map
     */
    setMap: function(map) {
        OpenLayers.Control.prototype.setMap.apply(this, arguments);

        //make sure we have an arg parser attached
        for(var i=0; i< this.map.controls.length; i++) {
            var control = this.map.controls[i];
            if (control.CLASS_NAME == "OpenLayers.Control.ArgParser") {
                break;
            }
        }
        if (i == this.map.controls.length) {
            this.map.addControl(new OpenLayers.Control.ArgParser());       
        }

    },

    /**
     * @type DOMElement
     */    
    draw: function() {
        OpenLayers.Control.prototype.draw.apply(this, arguments);
          
        if (!this.element) {
            this.div.className = this.displayClass;
            this.element = document.createElement("a");
            this.element.style.fontSize="smaller";
            this.element.innerHTML = "Permalink";
            this.element.href="";
            this.div.appendChild(this.element);
        }
        this.map.events.register('moveend', this, this.updateLink);
		this.map.events.register('changelayer', this, this.updateLink);

        return this.div;
    },
   
    /**
     * 
     */
    updateLink: function() {
		
        var center = this.map.getCenter();
		
		if(center)
		{

			var scale = "scale=" + Math.round(this.map.getScale()); 		
			//var scale = "scale=" + (parseInt(this.map.getScale()) - 1); 
	
    	    var lat = "y=" + Math.round((center.lat*100000) / 100000);
        	var lon = "x=" + Math.round((center.lon*100000) / 100000);

	        var layers = "overlays=";
			var base_layers = "base=";
		
			var first_base_layer = true;
			var first_layer = true;
			
        	for(var i=0; i< this.map.layers.length; i++) 
			{
    	        var layer = this.map.layers[i];

            	if (!layer.isBaseLayer) 
				{
					//Is the layer visible 
					if(layer.visibility)
					{
						if(first_layer)
						{
							layers += layer.name;
							first_layer = false; 
						}
						else
						{
							layers += "," + layer.name;
						}
					}
	
    	        }
				else
				{
					//Is the layer visible
					if(layer.visibility)
					{
						if(first_base_layer)
						{
							base_layers += layer.name;
							first_base_layer = false; 
						}
						else
						{
							base_layers += "," + layer.name;
						}
					}

				}
        	}
		
	        var href = this.base + "?" + lon + "&" + lat + "&" + scale + "&" + base_layers + "&" + layers; 

    	    this.element.href = href;

		}
    }, 

    /** @final @type String */
    CLASS_NAME: "OpenLayers.Control.Permalink"
});
