function PageFilters() {}

PageFilters.groups = {};

PageFilters.addFilterGroup = function(id, item_changed_script, action_script, filter_sets) {
	PageFilters.groups[id] = new PageFilterGroup(id, item_changed_script, action_script, filter_sets);
}



function PageFilterGroup(id, item_changed_script, action_script, supersets) {
	this.id = id;

	this.supersets = {};
	
	this.search_enabled = true;
	this.item_changed_script = item_changed_script;
	this.action_script = action_script;
	
	this.update_timer = null;

	for (var i in supersets) {
		var superset = supersets[i];
		this.supersets[superset.id] = new PageFilterSuperset(this, superset);
	}
	
	setTimeout("PageFilters.groups['"+id+"'].initialize();", 500);
}

PageFilterGroup.prototype.initialize = function() {
	for (var i in this.supersets) {
		this.supersets[i].initialize();
	}
}

PageFilterGroup.prototype.getSupersetByLabel = function(superset_label) {
	for (var i in this.supersets) {
		if (this.supersets[i].label == superset_label) {
			return this.supersets[i];
			break;
		}
	}
}

PageFilterGroup.prototype.getSupersetVisByLabel = function(superset_label) {
	return this.getSupersetByLabel(superset_label).visible;
}

PageFilterGroup.prototype.getItemByLabels = function(superset_label, set_label, item_label) {
	var superset = this.getSupersetByLabel(superset_label);
	var filter_set = superset.getSetByLabel(set_label);
	var filter_item = filter_set.getItemByLabel(item_label);
	return filter_item;
}

PageFilterGroup.prototype.getItemIdByLabels = function(superset_label, set_label, item_label) {
	return this.getItemByLabels(superset_label, set_label, item_label).id;
}

PageFilterGroup.prototype.getSelectedItemsFromSet = function(superset_label, set_label, set_label) {
	var superset = this.getSupersetByLabel(superset_label);
	var filter_set = superset.getSetByLabel(set_label);
	var selected_arr = [];
	for (var i in filter_set.items) {
		if (filter_set.items[i].selected) selected_arr.push(filter_set.items[i].value);
	}
	return selected_arr.join(",");
}

PageFilterGroup.prototype.getSelectedValueFromMenu = function(superset_label, set_label, item_label) {
	var superset = this.getSupersetByLabel(superset_label);
	var filter_set = superset.getSetByLabel(set_label);
	var filter_item = filter_set.getItemByLabel(item_label);
	var value = Utils.getPullDownMenuValue("m_"+filter_item.id);
	return value;
}

PageFilterGroup.prototype.getTextFromTextField = function(superset_label, set_label, item_label) {
	var superset = this.getSupersetByLabel(superset_label);
	var filter_set = superset.getSetByLabel(set_label);
	var filter_item = filter_set.getItemByLabel(item_label);
	var value = Utils.getValue("f_"+filter_item.id);
	return value;
}

PageFilterGroup.prototype.setSupersetView = function(view) {
	var button_id = "filter_set_toggle_"+this.id;
	if (view == "basic") {
		this.getSupersetByLabel("advanced").hide();
		Buttons.list[button_id].setLabelAndAction("More Search Options", "PageFilters.groups."+this.id+".setSupersetView(\"advanced\")");
	} else if (view == "advanced") {
		this.getSupersetByLabel("advanced").show();
		Buttons.list[button_id].setLabelAndAction("Fewer Search Options", "PageFilters.groups."+this.id+".setSupersetView(\"basic\")");
	}
	this.filterItemChanged();
}

PageFilterGroup.prototype.disableSearchButton = function() {
	this.search_enabled = false;
	Buttons.list["btn_search_"+this.id].setDisabled();
}

PageFilterGroup.prototype.enableSearchButton = function() {
	this.search_enabled = true;
	Buttons.list["btn_search_"+this.id].setEnabled("PageFilters.groups."+this.id+".executeActionScript()");
}

PageFilterGroup.prototype.filterItemChanged = function() {
	if (this.item_changed_script) this.item_changed_script();
	this.enableSearchButton();
}

PageFilterGroup.prototype.executeActionScript = function() {
	if (this.search_enabled) this.action_script();
}

/*
PageFilterGroup.prototype.startUpdatetimer = function() {
	this.cancelUpdateTimer();
	this.update_timer = setTimeout("PageFilters.groups['"+this.id+"'].executeActionScript();", 2000);
}

PageFilterGroup.prototype.cancelUpdateTimer = function() {
	clearTimeout(this.update_timer);
	this.update_timer = null;
}
*/



function PageFilterSuperset(parent_group, params) {
	this.parent_group = parent_group;
	
	this.id = params.id;
	this.label = params.label;
	this.sets = {};
	
	this.visible = params.visible;
	this.div_height = 0;

	for (var i in params.sets) {
		var filter_set = params.sets[i];
		this.sets[filter_set.id] = new PageFilterSet(this, filter_set);
	}
}

PageFilterSuperset.prototype.initialize = function() {
	this.div_height = Utils.getObjHeight("div_superset_"+this.id);
	if (Utils.getStyleHeight("div_superset_container_"+this.id) != 0) Utils.setStyleHeight("div_superset_container_"+this.id, this.div_height);
	Utils.setStylePosition("div_superset_"+this.id, "absolute");
}

PageFilterSuperset.prototype.getSetByLabel = function(set_label) {
	for (var i in this.sets) {
		if (this.sets[i].label == set_label) {
			return this.sets[i];
			break;
		}
	}
}

PageFilterSuperset.prototype.show = function() {
	this.visible = true;
	
	var params = {
		obj_id: "div_superset_container_"+this.id,
		position: null,
		size: {start: {width: null, height: 0}, end: {width: null, height: this.div_height}},
		opacity: null,
		ease_timing: {start_secs: 0, end_secs: 0.25},
		anim_secs: 0.5,
		fps: 30,
		exec_on_finish: null	
	};
	
	Transform.animateTransform(params);
}

PageFilterSuperset.prototype.hide = function() {
	this.visible = false;
	
	var params = {
		obj_id: "div_superset_container_"+this.id,
		position: null,
		size: {start: {width: null, height: this.div_height}, end: {width: null, height: 0}},
		opacity: null,
		ease_timing: {start_secs: 0.25, end_secs: 0},
		anim_secs: 0.5,
		fps: 30,
		exec_on_finish: null	
	};
	
	Transform.animateTransform(params);
}



function PageFilterSet(parent_superset, params) {
	this.parent_superset = parent_superset;
	
	this.id = params.id;
	this.label = params.label;
	this.items = {};
	this.default_item = null;
	
	for (var i in params.items) {
		var item = params.items[i];
		if (item.type == "option_single" || item.type == "option_multi") {
			this.items[item.id] = new PageFilterItemOption(this, item);
		} else if (item.type == "list") {
		//if (item.type == "list") {
			this.items[item.id] = new PageFilterItemList(this, item);
		} else if (item.type == "field") {
			this.items[item.id] = new PageFilterItemField(this, item);
		}
		if (i == 0) this.default_item = this.items[item.id];
	}
}

PageFilterSet.prototype.getItemByLabel = function(item_label) {
	for (var i in this.items) {
		if (this.items[i].label == item_label) {
			return this.items[i];
			break;
		}
	}
}

PageFilterSet.prototype.getItemIdByLabel = function(item_label) {
	for (var i in this.items) {
		if (this.items[i].label == item_label) {
			return this.items[i].id;
			break;
		}
	}
}

PageFilterSet.prototype.deselectAll = function() {
	for (var i in this.items) {
		this.items[i].deselect();
	}
}

PageFilterSet.prototype.deselectSingles = function() {
	for (var i in this.items) {
		if (this.items[i].type == "option_single") this.items[i].deselect();
	}
}

PageFilterSet.prototype.checkEmptySelectDefault = function() {
	var num_items = 0;
	var num_deselected = 0;
	for (var i in this.items) {
		num_items++;
		if (!this.items[i].selected) num_deselected++;
	}
	if (num_deselected == num_items) this.default_item.select();
}



function PageFilterItemOption(parent_set, params) {
	this.parent_set = parent_set;
	
	this.id = params.id;
	this.label = params.label;
	this.value = params.value;
	this.type = params.type;
	
	this.selected = params.selected;
}

PageFilterItemOption.prototype.select = function() {
	Utils.setClassName("a_"+this.id, "pageFilterItemActive");
	this.selected = true;
}

PageFilterItemOption.prototype.deselect = function() {
	Utils.setClassName("a_"+this.id, "pageFilterItem");
	this.selected = false;
}

PageFilterItemOption.prototype.click = function() {
	if (this.selected && this.type == "option_multi") {
		this.deselect();
		this.parent_set.checkEmptySelectDefault();
	} else {
		if (this.type == "option_single") {
			this.parent_set.deselectAll();
		} else {
			this.parent_set.deselectSingles();
		}
		this.select();
	}
	//this.parent_set.parent_group.startUpdatetimer();
	this.parent_set.parent_superset.parent_group.filterItemChanged();
}



function PageFilterItemList(parent_set, params) {
	this.parent_set = parent_set;
	
	this.id = params.id;
	this.label = params.label;
	this.value = params.value;
	this.type = params.type;
	
	this.selected_value = params.selected;
}

PageFilterItemList.prototype.changed = function() {
	//this.parent_set.parent_superset.parent_group.startUpdatetimer();
	this.parent_set.parent_superset.parent_group.filterItemChanged();
}

PageFilterItemList.prototype.selectItem = function(item_value) {

}

PageFilterItemList.prototype.unselectAll = function() {

}



function PageFilterItemField(parent_set, params) {
	this.parent_set = parent_set;

	this.id = params.id;
	this.label = params.label;
	this.value = params.value;
	this.type = params.type;
	
	this.text = params.text;
}

PageFilterItemField.prototype.changed = function() {}

PageFilterItemField.prototype.clear = function() {}

PageFilterItemField.prototype.keyDown = function(e) {
	//this.parent_set.parent_superset.parent_group.cancelUpdateTimer();
}

PageFilterItemField.prototype.keyUp = function(e) {
	var enter_key_pressed = false;
	
	if (Browser.is_ie_compatible) {
		if (e.keyCode == 13) {
			enter_key_pressed = true;
		}
	} else {
		if (e.which == 13) {
			enter_key_pressed = true;
		}
	}
	
	if (enter_key_pressed) {
		if (this.parent_set.parent_superset.parent_group.search_enabled) this.parent_set.parent_superset.parent_group.executeActionScript();
	} else {
		//this.parent_set.parent_group.startUpdatetimer();
		this.parent_set.parent_superset.parent_group.filterItemChanged();
	}
	
	return false;
}

