var MediaGLayersVersion = 1;
/**
 * LayerManager Class
 * Responsible for loading all geolive map layers. queries server for metadata related to each layer and 
 * loads the layers using those settings. 
 */
var LayerManager=new Class({
	options:
	{
	queryForMetadata:true,
	loadDefault:true,
	enableWrite:true,		/*only posible if the file is located on the server...*/
	enableInsert:true,		/*anticipated flags, although so far unused*/
	enableDelete:true, 
	layersMetaData:null
	},
	initialize:function(mediaMap, options)
	{
		this.setOptions(options);
		this.mediaMap=mediaMap;
		//this.styleManager=new StyleManager();


		this.defaultLayers=[];
		this.optionalLayers=[];
		this.layers=[];
		this.originallyOrderedLayers=[];
		this.activeLayer=null;
		var me=this;
		mm_execute(function(){
			me.addEvent('onAddLayer',function(l){mm_debug(["Geolive LayerManager. Added Layer - "+(l.options.name?" - "+l.options.name:""),{layer:l}]);});
		});
		if(me.options.layersMetaData){
			me.layersMetaData=me.options.layersMetaData;
			if(me.options.loadDefault)
				me.loadDefaultLayers();
		}else{
			var metadata=new LayersMetaDataRequest(me);
			if(me.options.queryForMetaData){
			metadata.addEvent('onSuccess',function(data){
				mm_debug(["Geolive LayerManager. Recieved Layer Metadata for "+data.layers.length+" items.",{me:me, serverQuery:this, layersMetadata:data}]);
				me.layersMetaData=data;
				if(me.options.loadDefault)
					me.loadDefaultLayers();
			});
			metadata.execute();
			}else{
				if(me.options.loadDefault)
					me.loadDefaultLayers();
			}
		}

	},
	getLayer:function(id){
		var me=this;
		var i;
		for(i=0;i<me.layers.length;i++){
			if(me.layers[i].options.id=id){
				return me.layers[i];
			}
		
			
		}
		return false;
		
	},
	/**
	 * returns newly created layer or just adds it if it is already created.
	 */
	addLayer:function(item){
		var me=this
		var layer=false;
		
		if($type(item)=="object"){
			var meta=item;
			var layerOptions={
					id:meta.id,
					name:meta.name,
					description:meta.description,
					type:(meta.type||"kml"),
					loadWhen:(meta.loadWhen||"later"),
					loadHow:(meta.loadHow||"parse"),
					writeAccess:(meta.writeAccess||"private"),
					readAccess:(meta.readAccess||"public"),
					legend:meta.legend,
					style:(meta.style||""),
					icon:(meta.icon||""),
					showPopups:(meta.popups||"show"),
					parseBehavior:(meta.parseBehavior||"manage"),
			};
			if(meta.path)layerOptions.path=meta.path;				

			var layer=new Layer(me,layerOptions);
			if(meta.tags){
				var tags=Json.evaluate(meta.tags);
				$each(tags,function(v,k){
					t={};
					t[k]=v;
					MapFactory.SetTag(layer,t);
				});
			}
		}
		
		if($type(item)=="Layer"||layer){
		if(!layer)layer=item;
		var usr=MapFactory.GetMM(me).options.user;
		if((!me.activeLayer||me.activeLayer.options.loadHow=="geoload")&&layer.options.loadHow=="parse"&&layer.options.type=="kml")//override active layer if path has default in it.
			me.activeLayer=layer;


		if(layer.options.loadWhen=="now"){
			me.defaultLayers.push(layer);
		}
		layer.addEvent('onUpdate',function(){
			me.fireEvent('onLayersChange');
		});
		layer.addEvent('onShow',function(){
			me.fireEvent('onLayersChange');
		});
		layer.addEvent('onHide',function(){
			me.fireEvent('onLayersChange');
		});
		me.layers.push(layer);
		me.fireEvent('onAddLayer', layer);
		}
		
		return layer;
		
	},
	removeLayer:function(layer){},
	loadDefaultLayers:function(){
		var me=this;
		if(me.layersMetaData)
		{
			$each(me.layersMetaData.layers, function(meta){
				me.addLayer(meta);
			});

			if(me.activeLayer&&me.activeLayer.options.loadWhen=="later")
				me.activeLayer.load();

			me.fireEvent('onAddedLayers');
			me.isLoaded=true;
			me.originallyOrderedLayers = me.layers;
		}
		else
			mm_debug("LayersManager - !No Metadata!");		
//		var wikipedia=new GMediaLayer(me,{
//			id:-1,
//			name:"External Content",
//			description:"Geo-Tagged Community Content",
//			type:"kmz",
//			loadWhen:"later",
//			loadHow:"geoload",
//			writeAccess:"private",
//			readAccess:"public"
//		});
//		me.layers.push(wikipedia);
//
//		var traffic=new GTrafficLayer(me,{
//			id:-1,
//			name:"Traffic",
//			description:"Geo-Tagged Traffic Information",
//			type:"kmz",
//			loadWhen:"later",
//			loadHow:"geoload",
//			writeAccess:"private",
//			readAccess:"public"
//		});
//		me.layers.push(traffic);
//		var tilelayer = new GTileLayer(new GCopyrightCollection(), 0, 17);
//		 tilelayer.getTileUrl = function(tile, zoom) {
//		   return 'http://api.tixik.com/scripts/tile.php?x='+tile.x+'&y='+tile.y+'&zoom='+zoom+'&csv=CSV_URL';
//		 };
//		 tilelayer.getOpacity = function() {return 0.7;}
//		 map.addOverlay(new GTileLayerOverlay(tilelayer));

	},
	setActiveLayer:function(layer){
		this.activeLayer=layer;
		this.fireEvent('onActivateLayer',layer);
	},
	getActiveLayer:function(){
		return this.activeLayer;
	},
	reorderLayers:function(preferredOrder){
		mm_debug(["Geolive LayerManager. Reordering Layers",{requestedOrder:preferredOrder}]);
		this.layers = preferredOrder;
		var i;
		for(i = this.layers.length - 1; i >= 0; i--) { // Last element because layers should be loaded from the "bottom up"
			if(this.layers[i].isLoaded) {
				this.layers[i].unload();
				this.layers[i].load();
			}
		}
	}


});
LayerManager.implement(new Options(), new Events());
