/* 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.ckMsgbar = OpenLayers.Class.create();
OpenLayers.Control.ckMsgbar.prototype = 
  OpenLayers.Class.inherit( OpenLayers.Control, {
    /**
     * Propery: msgTopLeft
     * {<OpenLayers.Pixel>} Position top left
     */
	msgTopLeft: null,

    /**
     * Propery: notLoaded
     * {<Integer>} Anzahl der noch nicht geladenen Karten
     */
	notLoaded: 0,

    /**
     * Propery: layersList
     * wird i.d.R. nicht benoetigt
     * {<Array>} Array mit den anzuzeigenden Karten
     */
	layersList: null,

	/**
     * Propery: layersArray
     * {<Array>} Array mit den noch nicht geladenen Karten
     */
	layersArray: null,
	
    /**
     * Propery: visible
     * {<Boolean>} Ist Meldung sichtbar?
     */
	visible: false,
	
    /**
     * Create an msgbar. 
     * @param Object options
     */
    initialize: function(layersList, options) {
        OpenLayers.Control.prototype.initialize.apply(this, [options]);
        
        this.layersArray = new Array();
        this.layersList = (!layersList) ? null : layersList;  
     },
        
    /**
     * APIMethod: destroy 
     */    
    destroy: function() {
        
        OpenLayers.Event.stopObservingElement(this.div);
        OpenLayers.Event.stopObservingElement(window);
        this.map.events.unregister("addlayer", this, this.addLayer);        
        OpenLayers.Control.prototype.destroy.apply(this, arguments);
    },

    /**
     * Method: registerLayers
     * Attach initial event handlers
     */
	registerLayers: function() { 
		//alert('MsgBar - addlayer event');
        this.map.events.register('addlayer', this, this.addLayer);
        var ckMsgControl = this;
        if (!this.layersList) {
        	for (var i = 0; i < this.map.layers.length; i++) {
        		var layer = this.map.layers[i];
        		layer.events.register('loadstart', layer, function(e) {
															ckMsgControl.loadStart(this, e);
															});
        		layer.events.register('loadend', layer, function(layer, e) {
															ckMsgControl.loadEnd(this, e);
															});
        	}
        } else {
        	for (var i=0; i < this.layersList.length; i++) {
        		var layer = this.layersList[i];
        		layer.events.register('loadstart', layer, function(e) {
															ckMsgControl.loadStart(this, e);
															});
        		layer.events.register('loadend', layer, function(e) {
															ckMsgControl.loadEnd(this, e);
															});        		
        		}
        }
	},	

	/**
     * Method: addLayer
     * Attach event handlers when new layer gets added to the map
     */
	addLayer: function(evt) { 
		//alert('MsgBar - addlayer event');
		var ckMsgControl = this;
		var layer = this.map.layers[this.map.layers.length-1];
   		layer.events.register('loadstart', layer, function(e) {
												ckMsgControl.loadStart(this, e);
												});
   		layer.events.register('loadend', layer, function(e) {
												ckMsgControl.loadEnd(this, e);
											});									
	},	
		
	 /**
     * Method: draw
     * Berechnet die Position fuer MsgBar
     * Returns:
     * {<HTML>} HTML Code fuer MsgBar
     */
    draw: function() {
    	if (this.div == null) {
	    	//this.calculatePos();
	        this.div = OpenLayers.Util.createDiv(this.id + "_systemWorking", 
	                                                            this.topLeft, 
	                                                            null,
	                                                            null,
	                                                            'absolute',
	                                                            null,
	                                                            "auto");
			this.div.className = this.displayClass;
			// Title
	        var msgTitle = OpenLayers.Util.createDiv(this.id + "_msgTitle", 
	                                                            null, 
	                                                            null,
	                                                            null,
	                                                            'relative',
	                                                            null,
	                                                            "auto");
			msgTitle.innerHTML = "Ihre Anfrage wird bearbeitet...";
			msgTitle.className = "msgTitle";
			this.div.appendChild(msgTitle);
			
			// Img
			var msgContent = OpenLayers.Util.createDiv(this.id + "_msgContent", 
	                                                            null, 
	                                                            null,
	                                                            null,
	                                                            'relative',
	                                                            null,
	                                                            "auto");
			msgContent.className = "msgContent";	                                                            
			var msgImg = OpenLayers.Util.createImage(this.id + "_progress",
																null,
																null,
																OpenLayers.ImgPath + "progress_bar.gif",
																null,
																null,
																null,
																true);
			msgImg.className = "msgImage";
			msgContent.appendChild(msgImg);
			this.div.appendChild(msgContent);
			// Message
	        var msgText = OpenLayers.Util.createDiv(this.id + "_msgText", 
	                                                            null, 
	                                                            null,
	                                                            null,
	                                                            'relative',
	                                                            null,
	                                                            "auto");
			msgText.innerHTML = "";
			msgText.className = "msgText";
			this.div.appendChild(msgText);
			this.div.style.display = 'none';
			
			this.registerLayers();
			
			OpenLayers.Event.observe(this.div, "click", 
                    OpenLayers.Function.bindAsEventListener(this.interrupt, this));

            OpenLayers.Event.observe(window, 'resize',
                            OpenLayers.Function.bind(this.updatePos, this));		
		}
		this.updatePos();
        return this.div;
    },
        
    /**
     * Method: calculatePos
     * Berechnet die Position fuer MsgBar
     */
    calculatePos: function() {
        var viewSize = this.map.getCurrentSize();
        var msgSize = OpenLayers.Util.getRenderedDimensions(this.div.innerHTML, new OpenLayers.Size(250,0));
        var eleLeft = viewSize.w/2 - msgSize.w/2;
        var eleTop = viewSize.h/2 - msgSize.h;
        this.topLeft = new OpenLayers.Pixel(eleLeft, eleTop);  
    },

    /**
     * Method: calculatePos
     * Berechnet die Position fuer MsgBar
     */
    updatePos: function() {
		this.calculatePos();
		OpenLayers.Util.modifyDOMElement(this.div, null, this.topLeft, null, null, null, null, null);
    },

    /**
     * Method: maximizeControl
     * MsgBar wird angezeigt, wenn mind. eine Karte geladen wird
     *
     * Params:
     * layer - aktueller Layer
     * event
     */
    maximizeControl: function(evt) {
		this.calculatePos();
		OpenLayers.Util.modifyDOMElement(this.div, null, this.topLeft, null, null, null, null, null);
       	this.div.style.display = '';
       	this.visible = true;

        if (evt != null) {
            OpenLayers.Event.stop(evt);                                            
        } 
	},

    /**
     * Method: minimizeControl
     * MsgBar wird deaktiviert, wenn alle Karte geladen wurden
     *
     * Params:
     * layer - aktueller Layer
     * event
     */
    minimizeControl: function(evt) {
    	this.div.style.display = 'none';
   		this.visible = false;
   		this.layersArray.length = 0;

       	if (evt != null) {
           	OpenLayers.Event.stop(evt);                                            
       	}
    },
    
    /**
     * Method: loadStart
     *
     * Params:
     * layer - aktueller Layer
     */
    loadStart: function(aLayer, evt) {
    	this.layersArray.push(aLayer);
    	this.notLoaded = this.layersArray.length;
    	this.msgLoading();
    	//this.msgDebug(aLayer, 'loadstart');
    	if (this.notLoaded > 0) {
    		if (!this.visible) {
    			this.maximizeControl(evt);
    		}	
    	}
    },

    /**
     * Method: loadEnd
     *
     * Params:
     * layer - aktueller Layer
     */
    loadEnd: function(aLayer, evt) {
    	OpenLayers.Util.removeItem(this.layersArray, aLayer);
    	this.notLoaded = this.layersArray.length;
    	this.msgLoading();
    	//this.msgDebug(aLayer, 'loadend');
    	if (this.notLoaded == 0) {
    		if (this.visible) {
    			this.minimizeControl(evt);
    		}	
    	}
    },
    
    /**
     * Method: msgLoading
     * Meldungstext wird generiert
     */
    msgLoading: function() {
    	
    	var text = OpenLayers.Util.getElement((this.id + "_msgText"));
    	if (!text) {
			return;
		}
    	if (this.notLoaded > 1) {
    		text.innerHTML = "noch "+ this.notLoaded +" Karten werden geladen.";
    	} else if (this.notLoaded == 1) {
    		text.innerHTML = "noch "+ this.notLoaded +" Karte wird geladen.";
    	} else {
    		text.innerHTML = "";
    	}
    },
    
    /**
     * Method: msgLoading
     * Meldungstext wird generiert
     */
    msgDebug: function(aLayer, action) {
		//* DEBUG START
		var debug = OpenLayers.Util.getElement('menueContentDebug');
		if (debug) {
            var date = new Date();
            var timeParts = [
                date.getHours(),
                date.getMinutes(),
                date.getSeconds()
            ];
            var timeStamp = timeParts.join(":");
            action = (action == "loadstart") ? ("<span style='color:blue'>"+action+"</span>") : ("<span style='color:red'>"+action+"</span>");
            
			var msgtxt = debug.innerHTML;
			msgtxt += "<div style='font-size:1em; line-height: 1em;'>"+timeStamp+" --> "+aLayer.name+": "+action+"</div>";
	    	debug.innerHTML = msgtxt;
	    }
    	//*/// DEBUG END
    },

    interrupt: function(evt) {
    	this.div.style.display = 'none';
   		this.visible = false;
       	if (evt != null) {
           	OpenLayers.Event.stop(evt);                                            
       	}
    },
    
    CLASS_NAME: "OpenLayers.Control.ckMsgbar"
});    

