/**
 * @classDescription 
 * 	PageManager controls which modules are loaded for each mapItem, based on the mapItems tags, and 
 *  the pageManager's registered module factories. factories can be registered at runtime.
 */

var PageManager=new Class({
	factories:{},
	editfactories:{},
	filters:{},
	editfilters:{},
	initialize:function(map, options, pageFactories)
	{
		//nothing to do.
	},
	registerPageFactory:function(tag, factory, filter){
		var me=this;
		if(!me.factories[tag]){
			me.factories[tag]=[];
		}
		me.factories[tag].push({'factory':factory, 'filter':filter});
	},
	registerEditPageFactory:function(tag, factory, filter){
		var me=this;
		if(!me.editfactories[tag]){
			me.editfactories[tag]=[];
		}
		me.editfactories[tag].push({'factory':factory, 'filter':filter});
	},
	addModulesFilter:function(name, filter){
		var me=this;
		me.filters[name]=filter;
	},
	addEditModulesFilter:function(name, filter){
		var me=this;
		me.editfilters[name]=filter;
	},
	getPageModules:function(mediaMap, obj, options){
		var modules=this.loadFactory(mediaMap, obj, options);
		$each(this.filters, function(filter){
			modules=filter(modules, mediaMap, obj, options);
		});
		return modules;
	},
	getEditPageModules:function(mediaMap, obj, options){
		var modules=this.loadEditFactory(mediaMap, obj, options);
		$each(this.editfilters, function(filter){
			modules=filter(modules, mediaMap, obj, options);
		});
		return modules;
	},
	loadFactory:function(mediaMap, obj, options){
		var me=this;	

		var tags=[];
		$each(me.factories, function(v,k){
			if(k!="default"){
				tags.push(k);
			}
		});
		var i=0;
		for(i;i<tags.length;i++){
			if(MapFactory.HasTag(obj, tags[i])){
				var j=0;
				for(j;j<me.factories[tags[i]].length;j++){
					if(me.factories[tags[i]][me.factories[tags[i]].length-1-j].filter(obj)){
						return me.factories[tags[i]][me.factories[tags[i]].length-1-j].factory(mediaMap, obj, options);
					}
				}
			}
		}
		if(me.factories['default']){
			var j=0;
			for(j;j<me.factories['default'].length;j++){
				if(me.factories['default'][me.factories['default'].length-1-j].filter(obj)){
					return me.factories['default'][me.factories['default'].length-1-j].factory(mediaMap, obj, options);
				}
			}
		}
		return false;
	},
	loadEditFactory:function(mediaMap, obj, options){
		var me=this;	

		var tags=[];
		$each(me.editfactories, function(v,k){
			if(k!="default"){
				tags.push(k);
			}
		});
		var i=0;
		for(i;i<tags.length;i++){
			if(MapFactory.HasTag(obj, tags[i])){
				var j=0;
				for(j;j<me.editfactories[tags[i]].length;j++){
					if(me.editfactories[tags[i]][j].filter(obj)){
						return me.editfactories[tags[i]][j].factory(mediaMap, obj, options);
					}
				}
			}
		}
		if(me.editfactories['default']){
			var j=0;
			for(j;j<me.editfactories['default'].length;j++){
				if(me.editfactories['default'][j].filter(obj)){
					return me.editfactories['default'][j].factory(mediaMap, obj, options);
				}
			}
		}
		return false;
	}
});
