var contentFiltersModel = function(options){
	options = options||{};
	this.isSavedSearch = options.isSavedSearch;
	this.INCLUDE = "include";
	this.EXCLUDE = "exclude";
	this._include = {};
	this._exclude = {};
	this.defaultState = {_include:{},_exclude:{}};
};

	contentFiltersModel.prototype = {
		reset : function(){
			this._include = {};
			this._exclude = {};
		},
		
		getFilter : function(){
			var filter ="";
			var addThis = "+OR+";
			for(var includeFilter in this._include){
				filter += addThis + includeFilter;
			}
			
			if(filter.length > 1)
				filter = filter.substring(addThis.length, filter.length);		//remove first addThis from filter 
			
			for(var excludeFilter in this._exclude){
				filter +=  "+-" + excludeFilter;
			}

			return filter;
		},
		readOnly : false,
		copy : function(origin, target){
			target = {};//reset
			for(prop in origin)
				target[prop] = origin[prop];
			return target;
		},
		updateDefaultState : function(){
			this.defaultState._exclude = this.copy(this._exclude, this.defaultState._exclude);
			this.defaultState._include = this.copy(this._include, this.defaultState._include);
		},
		rollback : function(){
			this._exclude = this.copy(this.defaultState._exclude, this._exclude);
			this._include = this.copy(this.defaultState._include, this._include);
		},
		include : function(filter){
			if(this._exclude[filter])
				delete this._exclude[filter];
			if(this._include[filter])
				delete this._include[filter];
			else
				this._include[filter] = filter;
  
	    	return this.getFilter();  	 
		},
		_clearFilter : function(filter){
			if(this._exclude[filter])
				delete this._exclude[filter];
			if(this._include[filter])
				delete this._include[filter];
		},
		exclude : function(filter){
			if(this._include[filter])
				delete this._include[filter];
			if(this._exclude[filter])
				delete this._exclude[filter];
			else
				this._exclude[filter] = filter;
			return this.getFilter();
		},
		setFilter : function(filter){
			if(this._include[filter])
				delete this._include[filter];
			else if(this._exclude[filter]){
				delete this._exclude[filter];
				this._include[filter] = filter;	
			}
			else
				this._include[filter] = filter;
			return this.getFilter();
		},
		filterStatus : function(filter){
			if(this._include[filter])
				return this.INCLUDE;
			if(this._exclude[filter])
				return this.EXCLUDE;
			else
				return null;
		}
};
	
	
	var contentFiltersView = function(model){
		this._model = model;
		this.modelChanged = FR.billboard.addEvent('model-has-changed');
		this.modelInitialized = FR.billboard.addEvent('model-initialized');
		this.modelReset = FR.billboard.addEvent('model-reset');
		this.runningSearch = FR.billboard.addEvent('running-search');
		this.ajaxInProgress = FR.billboard.addEvent('ajax-in-progress');
		this.ajaxReturned = FR.billboard.addEvent('ajax-returned');
		this.emptySearch = FR.billboard.addEvent('search-is-empty');
		
		FR.billboard.on('model-initialized', this.updateTextField, this);
		FR.billboard.on('model-initialized', this.updateStatusText, this);
		FR.billboard.on('model-reset', this.updateFiltersUI, this);
		FR.billboard.on('running-search', this.updateTextField, this);
		FR.billboard.on('running-search', this.isSearchBoxEmpty, this);
		FR.billboard.on('search-is-empty', this.updateStatusText, this);
		FR.billboard.on('search-is-empty', this.enableSearchBox, this);
		FR.billboard.on('search-is-empty', this.commitChangesToModel, this);
		FR.billboard.on('ajax-in-progress', this.displayWheel, this);
		FR.billboard.on('ajax-returned', this.hideWheel, this);

	};
	
	contentFiltersView.prototype = {
		commitChangesToModel : function(){
			this._model.updateDefaultState();
		},
		cancelClicked : function(){
			this.enableSearchBox();
			$('#topFiltersList').toggle();
		},
		isSearchBoxEmpty : function(){
			if(!checkEmptyTerm()){
				this.emptySearch.fire(this._model);
				$('#topFiltersList').toggle();
			}
		},
		disableElement : function(element){
			element.attr("disabled", "disabled");
		},
		enableElement: function(element){
			element.removeAttr("disabled");
		},
		disableSearchBox : function(){
			this.disableElement($("#terminput"));
			this.disableElement($("#buttonSearch"));
			$("#buttonSearch").css({'background-color':'#cecece'});
		},
		enableSearchBox : function(){
			this.enableElement($("#terminput"));
			this.enableElement($("#buttonSearch"));
			$("#buttonSearch").css({'background-color':'#ffffff'});
		},
		runDefaultClicked : function(e){
			this.stopEvent(e);
			this.setCFQToDefault();
			$("#buttonSearch").click();
		},
		changeClicked : function(e){
			$('#topFiltersList').toggle();
			//hidden
			if($("#topFiltersList:visible").length == 0)
				this.enableSearchBox();
			else if($("#topFiltersList:visible").length == 1)
				this.disableSearchBox();
		},
		cookieOptions : {_cookieName: "contentfilters", path: '/', expires: 365 },
		saveDefaultClicked : function(){
			//var encoded = $.toJSON({_include:this._model._include, _exclude:this._model._exclude});
			var includeCF = concat(this._model._include, " ", false);

			var excludeCF = concat(this._model._exclude, " ", false);

			var data =  {includeCF: includeCF, excludeCF: excludeCF, cb:"contentView.contentFiltersSaved"};
			$.ajax({url: 'action/user/updatePref', cache: false, data: data, dataType: 'json'});	
			this.ajaxInProgress.fire(this._model);	
		},
		contentFiltersSaved : function(data){
			 displayStatusMessage("success", "savedSearch-ok", "Saved as default");
			 this.ajaxReturned.fire(this._model);	
		},
		runClicked : function(){
			this.runningSearch.fire(this._model);
			$("#buttonSearch").click();
		},
		loadDefaultClicked : function(){
			$.ajax({url: 'action/user/getContentFilterPref', cache:false, data: {cb:"contentView.contentFiltersReturned"}, dataType: 'json'});	
			this.ajaxInProgress.fire(this._model);
		},
		displayWheel : function(){
			$("#bottomContentControls").hide();
			$("#topFiltersDiv div.loadingMessage").show();
		},
		makeFiltersListNormal : function(weirdBackendFormat){
			var updatedModel = {_include : {}, _exclude : {}};
			for(var i in weirdBackendFormat){
				if(weirdBackendFormat[i][3] == "in"){
					//TODO fix this BS, what is [i][3]? why can't i get {include :{filter:filer}  ?
					updatedModel._include[weirdBackendFormat[i][0]] = weirdBackendFormat[i][0]; // 0 == the magic index# for filter in array 
				} else if(weirdBackendFormat[i][3] == "ex"){
					updatedModel._exclude[weirdBackendFormat[i][0]] = weirdBackendFormat[i][0]; 
				}
			}
			return updatedModel;
		},
		contentFiltersReturned : function(data){
			if(data){
				try {
					var outOfBackend = eval(data.data);
					var model = this.makeFiltersListNormal(outOfBackend);
					this._model._include = model._include;
					this._model._exclude = model._exclude;
					this.modelReset.fire(this._model);
				} catch(exc) {
				    
				}
			}
			this.ajaxReturned.fire(this._model);
		},
		hideWheel : function(){
			$("#bottomContentControls").show();
			$("#topFiltersDiv div.loadingMessage").hide();
		},
		initModel : function(){
			this._model.reset();
			var _this = this;
			$("#topFiltersList UL.mentioned LI span.includeFilter.on A").each(function(){
				var filter = _this.getFilterAttrib($(this));
				_this._model._include[filter]= filter;
				_this._model.defaultState._include[filter] = filter;
			});
			$("#topFiltersList UL.mentioned LI span.excludeFilter.on A").each(function(){
				var filter = _this.getFilterAttrib($(this));
				_this._model._exclude[filter]= filter;
				_this._model.defaultState._exclude[filter] = filter;
			});
			//initialized
			this.modelInitialized.fire(this._model);	
		},
		initFromCookie : function(){
			try {
				var cookie = $.cookie(this.cookieOptions._cookieName);
				if(cookie == null || cookie == "" || cookie == "{}")
					return this.resetStatusText();
				var model = $.evalJSON(cookie);
				this._model._include = model._include;
				this._model._exclude = model._exclude;
				this.updateFiltersUI();
				this.modelChanged.fire(this._model);
				//this.updateStatusText();
			} catch(e){
				//alert("error de-serializing cookie:" + e);
			}
		},
		updateFiltersUI : function(){
			var _this = this;
			$("#topFiltersList UL.mentioned A.FilterLink").each(function(){
				var link = $(this);
				var filter = link.attr("filter");
				_this.selectFilter(filter, link);
			});
		},
		setCFQToDefault : function(){
			this.getHiddenCfqField().val("defaults");
		},
		getHiddenCfqField : function(){
			return $("#searchTextboxDiv  #topSearchForm Input[name='cfq']");
		},
		updateTextField : function(){
			this.getHiddenCfqField().val(this._model.getFilter().replace(/\+/g, " "));
		},
		persistThroughCookie : function(){
			var encoded = $.toJSON({_include:this._model._include, _exclude:this._model._exclude});
			$.cookie(this.cookieOptions._cookieName, encoded, this.cookieOptions);
		},
		resetAllClicked : function(event){
			this._model.reset();
			this.modelReset.fire(this._model);
		},
		restore : function(){
			this._model.rollback();
			this.modelReset.fire(this._model);
		},
		selectFilter : function(filter, link){
			var id = $(link).attr("filterId");
			var status = this._model.filterStatus(filter);
			if(status == this._model.INCLUDE) {
				$("#id" + id + "IncSpan").addClass("on");
				$("#id" + id + "FilterSpan").removeClass("exclude").addClass("on");
				$("#id" + id + "ExcSpan").removeClass("on");
			} 
			else if(status == this._model.EXCLUDE) {
				$("#id" + id + "IncSpan").removeClass("on");
				$("#id" + id + "FilterSpan").removeClass("on").addClass("exclude");
				$("#id" + id + "ExcSpan").addClass("on");
			}
			if(status == null) {
				$("#id" + id + "IncSpan").removeClass("on");
				$("#id" + id + "FilterSpan").removeClass("on").removeClass("exclude");
				$("#id" + id + "ExcSpan").removeClass("on");
			}
				
		},
		templateHTML : function(css, text, filters){
			return "<div class='" + css + "terms'>" + text + "  <span class='term'>" + filters +"</span></div>";
		},
		resetStatusText : function(){
			$("#topFiltersExpand").html("No Content Type filters set. " + this.change_apply);//reset
		},
		savedSearchMessage : function(){
			$("#topFiltersExpand").html("You're viewing a saved search. Press 'Run' to search again.");//saved search
		},
		updateStatusText : function(){
		try {
			var includes = {};
			$("#topFiltersList LI.numOfResults:has(span.includeFilter.on) A.FilterLink").each(function(){includes[$(this).text()] = $(this).text();});
			var excludes = {};
			$("#topFiltersList LI.numOfResults:has(span.excludeFilter.on) A.FilterLink").each(function(){excludes[$(this).text()] = $(this).text();});
			$("#topFiltersExpand").html("");//reset
			includes = concat(includes, ", ", false);
			excludes = concat(excludes, ", ", false);
			if(includes && includes != '')
				$("#topFiltersExpand").append(this.templateHTML("include", "Only:", includes));
			if(excludes && excludes != '')
				$("#topFiltersExpand").append(this.templateHTML("exclude", "Exclude:", excludes));
			$("#topFiltersExpand").append(this.change_apply);
			if((includes == null || includes == "") && (excludes == null || excludes == ""))
				this.resetStatusText();
			}catch(e){
				//IE 	alert(e.message);
			}
		},
		change_apply : "<u>change</u>",
		stopEvent : function(e){
			e.preventDefault();
			e.stopPropagation();
		},			
		filterClicked : function(e, func){
			this.stopEvent(e);
			var filterAttrib = this.getFilterAttrib(e.target);
			var filter = func.call(this._model, filterAttrib);
			this.selectFilter(filterAttrib, e.target);
//			this.updateStatusText();
//			this.modelChanged.fire(this._model);
		},
		getFilterAttrib : function(link){
			return $(link).attr("filter");
		}
			
	}

	var contentModel = null;
	var contentView = null;

	$(document).ready(function(){
		contentModel = new contentFiltersModel();
		contentView = new contentFiltersView(contentModel);
		contentView.initModel();
		
		//bind events if it's not saved search
		$("DIV#topFiltersDiv DIV.mentionedSet A.clearall").bind("click", function(event){contentView.resetAllClicked(event);});
		$("#topFiltersList a.FilterLink").bind("click", function(event){contentView.filterClicked(event, contentModel.setFilter);});
		$("#topFiltersList a.LeftInclude").bind("click", function(event){contentView.filterClicked(event, contentModel.include);});
		$("#topFiltersList a.LeftExclude").bind("click", function(event){contentView.filterClicked(event, contentModel.exclude);});
		$("#topFiltersList span.buttonCancel").bind("click", function(event){contentView.cancelClicked(event)});
		$("#topFiltersList span.buttonSave").bind("click", function(event){contentView.saveDefaultClicked(event);});
		$("#topFiltersList span.buttonRun").bind("click", function(event){contentView.runClicked(event);});
		$("#topFiltersList a.applydefault").bind("click", function(event){contentView.loadDefaultClicked(event);});
		//commenting out for now. 
		//$("#topFiltersExpand .apply").bind("click", function(event){contentView.runDefaultClicked(event);});
		$("#topFiltersExpand").bind("click", function(event){contentView.restore();});
		$("#topFiltersExpand").bind("click", function(event){contentView.changeClicked();});
		
		//$("#topFiltersExpand").bind("click", function(event){contentView.updateFiltersUI(event);});
		
	});