var MapState=new Class({
	options:
	{
	startImediatly:false
	},
	layersMetadata:{},
	mapMetadata:{},
	editsMetadata:{},
	mapId:-1,
	initialize:function(mediaMap,options)
	{
		var me=this;
		me.mediaMap=mediaMap;
		me.mapId=me.mediaMap.options.mapId;
		me.setOptions(options||{});
		if(me.options.startImediatly){me.startTracking();}
	},
	startTracking:function(){
		var me=this;
//		me.mediaMap.layerManager.addEvent('onLayersChange',function(){
//			me.layersMetadata=MapBookmark.ReadCurrentLayerState(me.mediaMap.layerManager.layers);
//			me.saveState();
//		});

		var moveHandler=google.maps.event.addListener(me.mediaMap.mainMap,"dragend",function(){
			me.mapMetadata=MapBookmark.ReadCurrentMapState(me.mediaMap.mainMap);
			me.saveState();
		});
		me.editTracker=new EditTracker(me.mediaMap);
		me.editTracker.startTracking();
	},
	saveState:function(){
		var me=this;	
		me.saveRequest=new SessionSaveQuery({state:$merge( {mapId:me.mapId},me.mapMetadata, me.editsMetadata/*,me.layersMetadata*/)},{options:{server:me.mediaMap.options.contentServer}});	
		me.saveRequest.execute();		
		//TODO: commented out above for now.
	},
	loadState:function(callback){
		var me=this;
		var r=new SessionLoadQuery({mapId:me.mapId}, {options:{server:me.mediaMap.options.contentServer}});
		r.addEvent('onSuccess',function(stateMetadata){
			if(!stateMetadata){
				callback(null);
			}else{
				if(stateMetadata.map){
					me.mapMetadata={map:stateMetadata.map};
				}
//				if(stateMetadata.layers){
//					me.layersMetadata={layers:stateMetadata.layers};
//					mm_debug(me.layersMetadata);
//				}
				if(stateMetadata.edits){
					me.editsMetadata={edits:stateMetadata.edits};
				}
				callback(stateMetadata);
			}
		});
		r.addEvent('onFailure',function(){
			callback(null);
		});
		r.execute();
		//callback(null); //TODO: commented out above for this for now!
	}
});
MapState.implement(new Options());


var SessionSaveQuery=JsonQuery.extend({
	task:"save_state",
	identify:function(data,json){
	$extend(json,data);	
}

});

var SessionLoadQuery=JsonQuery.extend({
	task:"load_state",
	identify:function(data,json){
	$extend(json,data);	
}
});


var EditTracker=new Class({
	edits:[],
	options:
	{

	},
	initialize:function(mediaMap,options){
		var me=this;
		me.mediaMap=mediaMap;
	},
	startTracking:function(){
		var me=this;
		$each(me.mediaMap.layerManager.layers,function(l){
//			l.addEvent('onItemChange',function(changes,item){
//			var isIn=false;
//			$each(me.edits,function(i){
//				if(i===item)isIn=true;
//			});
//
//			if(!isIn){
//				if(item.change="edit"||item.change=="new")
//					me.edits.push(item);
//			}	
//			else if(isIn){
//				if(!item.change||item.change=="")
//				{
//					var index=me.edits.indexOf(item);
//					if(index>=0)
//						me.edits=index.slice(0, index).concat(index.slice(index+1, index.length));
//				}
//			}
//			mm_debug(me.edits);
//		});
		});
	}
});

var MapBookmark=new Class({


});
MapBookmark.CreateBookmark=function(metaData, map){
	var q=new BookmarksQuery(metaData);
	q.addEvent('onSuccess',function(result){
		result.id;
		result.key;
		var i=0;
		while(Cookie.get('geolive_bookmark_'+map+'_'+i)){
			i++;
		}
		var myCookie = Cookie.write('geolive_bookmarks_'+map+'_'+i, id+'_'+key);
	});
};
MapBookmark.ReadCurrentLayerState=function(layers){
	var layersMetadata=[];
	$each(layers,function(layer){
		var meta=layer.options;
		layersMetadata.push({
			id:meta.id,
			name:meta.name,
			description:meta.description,
			type:meta.type,
			loadWhen:(layer.isLoaded?(layer.isHidden?"later":"now"):"later"),
			loadHow:meta.loadHow,
			writeAccess:meta.writeAccess,
			readAccess:meta.readAccess
		});
	});
	return {layers:layersMetadata};
};
MapBookmark.ReadCurrentMapState=function(map){
	var mapMetadata={
			type:map.getMapTypeId(),
			center:[map.getCenter().lat(),map.getCenter().lng()],
			zoom:map.getZoom()
	};
	return {map:mapMetadata};
};

MapBookmark.RetrieveBookmarks=function(map, url, callback){
	var bookmarks=[];
	var queries=[];
	var i=0;
	while(Cookie.get('geolive_bookmark_'+map+'_'+i)){
		var q=new BookmarkQuery(url);
		q.addEvent('onSuccess',function(metaData){
			bookmarks.push(new MapBookmark(metaData));
		});
		queries.push(q);
	}
	var g=new Group(queries);
	g.addEvent('onComplete', function(){
		callback(bookmarks);
	});
	$each(queries,function(q){q.execute();});


};

//TODO: move to Query area
var BookmarksQuery=JsonQuery.extend({
	task:"get_bookmark",
	initialize:function(serverUrl)
	{
	var me=this;
	me.parent(null,{server:serverUrl});
	}
});
