var DealerWebsite = DealerWebsite || {};
DealerWebsite.Component = DealerWebsite.Component || {};
DealerWebsite.Component.Search = DealerWebsite.Component.Search || {};

DealerWebsite.Component.Search.filter = function(dimensionName, selectElement,
        parentSearchView) {

	var fixedValueDiv = selectElement.parent().find(".selected-box");
	var external = {};
	var init = function() {
		bindEvents();
		setInitialState();
	};

	var setInitialState = function() {
		if (external.hasValue()) {
			external.showOptionList(false);
			external.setFixedValueLabel(selectElement.find(":selected").text());
		}
	};

	var bindEvents = function() {
		fixedValueDiv.bind('click', function() {
			if (!fixedValueDiv.hasClass('disabled')) {
				external.reset();
				parentSearchView.onFilterReset(dimensionName);
			}
		});

		selectElement.bind('change', function() {
			parentSearchView.onFilterChanged(dimensionName);
		});
	};

	external = {
	    reset : function() {
		    fixedValueDiv.find(".label").text('');
		    selectElement.val('');
		    return external;
	    },

	    setEnabled : function(enable) {
		    external.showOptionList(enable);
		    external.setAutoSelected(!enable);
		    return external;
	    },

	    setAutoSelected : function(autoSelected) {
		    if (autoSelected) {
			    fixedValueDiv.find('.close').hide();
			    fixedValueDiv.addClass('disabled');
			    selectElement.empty();
		    } else {
			    fixedValueDiv.find('.close').show();
			    fixedValueDiv.removeClass('disabled');
		    }
	    },

	    showOptionList : function(showOptionList) {
		    if (showOptionList) {
			    fixedValueDiv.hide();
			    selectElement.show();
		    } else {
			    selectElement.hide();
			    fixedValueDiv.show();
		    }
	    },

	    createLabel : function(valueItem) {
		    if (valueItem.count) {
			    return valueItem.label + " (" + valueItem.count + ")";
		    } else {
			    return valueItem.label;
		    }
	    },

	    update : function(myData) {
		    var i;
		    if (myData) {

			    var values = myData.values;
			    var autoSelected = myData.autoSelected;
			    var userSelected = myData.userSelected;

			    if (userSelected || autoSelected || values.length === 1) {
				    fixedValueDiv.find(".label").text(values[0].label);
				    external.setAutoSelected(!userSelected);
				    external.showOptionList(false);
			    } else {
				    external.showOptionList(true);
				    selectElement.empty();
				    for (i = 0; i < values.length; i++) {
					    if (i === 0) {
						    selectElement.append("<option value='"
						            + values[i].value + "'>" + values[i].label
						            + "</option>");
					    } else {
						    selectElement.append("<option value='"
						            + values[i].value + "'>"
						            + external.createLabel(values[i])
						            + "</option>");
					    }
				    }
			    }
		    } else {
			    external.setEnabled(false);
			    fixedValueDiv.find(".label").text(dimensionName);
		    }
	    },

	    getName : function() {
		    return dimensionName;
	    },

	    hasValue : function() {
		    return selectElement.val() !== '';
	    },

	    isPopulated : function() {
		    return selectElement.children().length > 1;
	    },

	    setFixedValueLabel : function(labelText) {
		    fixedValueDiv.find(".label").text(labelText);
	    }
	};

	init();

	return external;
};

DealerWebsite.Component.Search.init = function(initialState) {
	var view = DealerWebsite.Component.Search.view();
	var controller = DealerWebsite.Component.Search.controller(view);
	view.update(initialState);
};

DealerWebsite.Component.Search.view = function() {
	var selectOptions = $(".rzc-advanced-search select");
	var filters = [];

	var init = function() {
		findSearchFields();

		var modelFilter = external.getFilter('Model');
		if (!(modelFilter === null || modelFilter === undefined)
		        && !modelFilter.isPopulated()) {
			modelFilter.setEnabled(false);
		}
		jQuery("a.close-button").click(function() {
			external.hideErrorMessage();
			return false;
		});
	};

	var findSearchFields = function() {
		selectOptions.each(function(index) {
			var filter = DealerWebsite.Component.Search.filter($(this).attr(
			        'id'), $(this), external);
			filters.push(filter);
		});
	};

	var external = {
	    onFilterChanged : function(name) {
	    },
	    onFilterReset : function(name) {
	    },

	    update : function(filterData) {
		    var i;
		    for (i = 0, len = filters.length; i < len; i++) {
			    var filter = filters[i];
			    filter.update(filterData[filter.getName()]);
		    }
	    },

	    getFilter : function(name) {
		    var i;
		    for (i = 0, len = filters.length; i < len; i++) {
			    var filter = filters[i];
			    if (filter.getName() === name) {
				    return filter;
			    }
		    }
	    },

	    showErrorMessage : function() {
		    jQuery.fn.colorbox({
		        width : "300px",
		        height : "230px",
		        inline : true,
		        href : ".error-message"
		    });
		    jQuery('#cboxClose').css('display', 'none');
		    jQuery('#cboxLoadedContent').css('height', '190px');
	    },

	    hideErrorMessage : function() {
		    jQuery.fn.colorbox.close();
	    }

	};

	init();

	return external;
};

DealerWebsite.Component.Search.controller = function(view) {
	var form = $(".rzc-advanced-search form");

	var successEvent = function(data) {
		var filterData = eval("(" + data + ")");
		view.update(filterData);
	};

	var failEvent = function(data) {
		view.showErrorMessage();
	};

	view.onFilterReset = function(name) {
		if (name === 'Make') {
			view.getFilter('Model').reset();
		}
		var params = {
		    url : "/search-filter",
		    successHandler : successEvent,
		    failHandler : failEvent,
		    data : form.serialize()
		};
		Razsor.Network.post(params);
	};

	view.onFilterChanged = function(name) {

		var params = {
		    url : "/search-filter",
		    successHandler : successEvent,
		    failHandler : failEvent,
		    data : form.serialize()
		};
		Razsor.Network.post(params);
	};

};
