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("Layer"+(l.options.name?" - "+l.options.name:"")+": Added To LayerManager");});
		});
		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("LayerManager Recieved Layers Metadata for "+data.layers.length+" items.");
				//mm_debug(data);
				me.layersMetaData=data;
				if(me.options.loadDefault)
					me.loadDefaultLayers();
			});
			metadata.execute();
			}else{
				if(me.options.loadDefault)
					me.loadDefaultLayers();
			}
		}

	},
	loadDefaultLayers:function(){
		var me=this;
		//mm_debug(me.layersMetaData.length+" - layers");
		
		if(me.layersMetaData)
		{
			$each(me.layersMetaData.layers, function(meta){
				var layerOptions={
						id:meta.id,
						name:meta.name,
						description:meta.description,
						type:meta.type,
						loadWhen:meta.loadWhen,
						loadHow:meta.loadHow,
						writeAccess:meta.writeAccess,
						readAccess:meta.readAccess,
						legend:meta.legend
				};
				if(meta.path)layerOptions.path=meta.path;				

				//mm_debug(layerOptions);
				var layer=new Layer(me,layerOptions);
				if(meta.tags){
					var tags=Json.evaluate(meta.tags);
					$each(tags,function(v,k){
						//mm_debug("Set "+meta.name+" tag:"+k+" - "+v);
						t={};
						t[k]=v;
						MapFactory.SetTag(layer,t);
					});
				}
				//if(!me.activeLayer)//make sure there is an active layer
				//	me.activeLayer=layer; 

				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);
			});

			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 moveHandler=GEvent.addListener(me.mediaMap.mainMap,"moveend",function(){
//
//			$each(me.layers,function(l){
//				l.redraw();
//			});
//		});
		
//		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);

	},
	setActiveLayer:function(layer){
		this.activeLayer=layer;
	},
	getActiveLayer:function(){
		return this.activeLayer;
	},
	reorderLayers:function(preferredOrder){
		mm_debug(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());