var refinementValueContainer = Class.create({
	keyword   : null,
	priceMin  : null,
	priceMax  : null,
	category  : null,
	attributes: null,
	
	initialize: function() {
	},
	
	getRefinementURL: function(baseURL) {
		var urlHash = new Hash();
		var that = this;
		var prefcnt = 1;
		if (this.keyword != null) {
			urlHash.set('q', this.keyword);
		}

		if (this.priceMin) {
			urlHash.set('pmin', this.priceMin);
			if (!this.priceMax) {
				urlHash.set('pmax', '100000');
			}
		}
		if (this.priceMax) {
			urlHash.set('pmax', this.priceMax);
			if (!this.priceMin) {
				urlHash.set('pmin', '0');
			}
		}
		if (this.category) {
			urlHash.set('cgid', this.category);
		}
		if (this.attributes) {
			this.attributes.keys().each(function(name) {
				var value = that.attributes.get(name);
				
				if (value != null && !value.blank()) {
					urlHash.set('prefn' + prefcnt, name);
					urlHash.set('prefv' + prefcnt, value);
					++prefcnt;
				}
			});
		}
		var qs = urlHash.toQueryString();
		return qs.blank() ? baseURL : baseURL + (baseURL.indexOf('?') != -1 ? '&' : '?') + urlHash.toQueryString();
	}
});

var refinementFieldContainer = Class.create({
	
	keyword   : null,
	priceMin  : null,
	priceMax  : null,
	category  : null,
	attributes: null,
	
	initialize: function() {
	},
	
	addAttributeField: function(field) {
		if (this.attributes == null) {
			this.attributes = new Array();
		}
		this.attributes[this.attributes.length] = field;
	},
	
	getValueFromDropDown: function(field) {
		return field != null && !field.options[field.selectedIndex].value.blank() ? field.options[field.selectedIndex].value : null;
	},

	getSelectedValues: function() {
		var values = new refinementValueContainer();
		var that = this;
		values.keyword = this.keyword != null && !this.keyword.value.blank() ? this.keyword.value : null;
		values.priceMin = this.getValueFromDropDown(this.priceMin);
		values.priceMax = this.getValueFromDropDown(this.priceMax);
		values.category = this.getValueFromDropDown(this.category);
		if (this.attributes != null && this.attributes.length > 0) {
			values.attributes = new Hash();
			this.attributes.each(function(element) {
				values.attributes.set(element.name, that.getValueFromDropDown(element));
			});
		}
		return values;
	}
	
});

var refinementHandler = Class.create({

	form: null,

	initialize: function(element) {
		this.form = element;
		this.form.refinementHandler = this;
		this.form.onsubmit = this.submitHandler;
	},
	
	submitHandler: function() {
		var refinementHandler = this.refinementHandler;
		var selectedValues = refinementHandler.findFields().getSelectedValues();
		var baseURL = refinementHandler.findField('input.refineBaseURL').value;
		var url = selectedValues.getRefinementURL(baseURL);
		window.location.href = url;
		return false;
	},
	
	findField: function(selector) {
		var fields = this.form.select(selector);
		if (fields && fields.length > 0) {
			return fields[0];
		}
	},
	
	findFields: function() {
		var refinementFields = new refinementFieldContainer();

		refinementFields.keyword = this.findField('input.keywordField');
		refinementFields.priceMin = this.findField('select.priceMin');
		refinementFields.priceMax = this.findField('select.priceMax');
		refinementFields.category = this.findField('select.categoryField');
		var attributeFields = this.form.select('select.attributeRefinement');
		if (attributeFields && attributeFields.length > 0) {
			attributeFields.each(function(field) {
				refinementFields.addAttributeField(field);
			});
		}
		return refinementFields;
	}
	
});
