/*
bodyStyle (three-letter codes: SDN, CPE, SUV, CAB, GST, RDS, WGN)
fromPrice (numeric)
toPrice (numeric)
seats (numeric)
fromCargo (numeric)
toCargo (numeric)
fromMPG (numeric)
toMPG (numeric)
features (strings: DIESEL, FOURMATIC, AMG)
 */

if (typeof (window.mb) == "undefined") {
	mb = {};
}

/**
 * 
 */
mb.assistMe = new (function($) {
	var me = this;

	mb.broadcaster.addListener(mb.events.INITED, function() {
		mb.assistMe.init();
	});

	/**
	 * must be call by application
	 */
	me.init = function() {
		mb.logger.info("assistMe.init()");
		mb.broadcaster.addListener(mb.events.PAGE_LOADED, function(e, args) {
			mb.assistMe.onPageLoaded(e);
		});
	}

	/**
	 * handles the page load event to complete initializing/setup
	 */
	me.onPageLoaded = function(d) {
		mb.logger.info("assistMe.onPageLoaded(" + typeof (d) + ")");
		initPageStyles(d);
	}

	/**
	 * 
	 */
	var initPageStyles = function(d) {
		mb.logger.info("assistMe.initPageStyles()");

		$('#open-assist-me').click(function(e) {
			e.preventDefault();
			$('#assist-me').show();
			mb.filterVehicles();
		});
		$('#close-assist').click(function(e) {
			e.preventDefault();
			$('#assist-me').hide();
			$(touts).removeClass('filtered').removeClass('whiteout');
		});

		var panes = $('.accordion-pane');
		$('.accordion-title').click(function() {
				var p = $(this).parent();
				$(panes).not(p).removeClass('open').find('.accordion-content').slideUp();
		});

		$('#view-results').click(function(e) {
			e.preventDefault();
			$('#assist-me').submit();
		});

		$('#reset-selections').click(function(e) {
			e.preventDefault();
			$('#assist-me')[0].reset();
			$(touts).removeClass('filtered').removeClass('whiteout');
		});

		$('#assist-me input').change(function() {
			mb.filterVehicles()
		});
		$('#assist-me select').change(function() {
			mb.filterVehicles()
		});
		touts = $.makeArray($('.vehicle-tout'));

		// force onChange to fire in IE
		if ($.browser.msie) {
			$('input:checkbox').click(function() {
				this.blur();
				this.focus();
			});
		}
	}

	var touts, numMatches = 0;

	mb.intersect = function(arr1, arr2) {
		var temp = [];
		for ( var i = 0; i < arr1.length; i++) {
			for ( var k = 0; k < arr2.length; k++) {
				if (arr1[i] == arr2[k]) {
					temp[temp.length] = arr1[i];
				}
			}
		}
		return temp;
	}

	mb.filterVehicles = function() {
		$(touts).removeClass('filtered').removeClass('whiteout');
		var serialize = $('#assist-me').serialize();
		var filtered = [];
		var results = [];
		var tmp, found;
		var key, chain = -1;
		serialize = serialize.split('&');
		for (i = 0; i < serialize.length; i++) {
			var obj = serialize[i].split('=');
			if (obj[1] != '') {
				if (key == obj[0]) {
					tmp.push(obj[1]);
				} else {
					chain++;
					key = obj[0];
					tmp = [ obj[1] ];
				}
				filtered[chain] = [];
				filtered[chain][0] = key;
				filtered[chain][1] = tmp;
			}
		}
		for (j = 0; j < filtered.length; j++) {
			found = mb.filterVehicleSearch(filtered[j]);
			if (results.length > 0) {
				results = mb.intersect(results, found);
			} else {
				results = found;
			}
		}
		numMatches = $(results).find('.details').size();
		$('#assist-match').text(numMatches);
		$(results).addClass('filtered');
		$(touts).not('.filtered').addClass('whiteout');
	}

	mb.filterVehicleSearch = function(arr) {
		var found = [];
		var key = arr[0];
		var obj = arr[1];

		switch (key) {
		case 'bodystyle':
		case 'seats':
			for (i = 0; i < obj.length; i++) {
				var matches = $('.filters').find("." + key + ":contains('" + obj[i] + "')").parents('.vehicle-tout');
				found = $.merge(found, matches);
			}
			break;
		case 'fromPrice':
		case 'fromCargo':
		case 'fromMPG':
			key = key.substr(4, (key.length));
			var min = $('[name=from' + key + ']').val();
			min = parseFloat(min);
			min = (isNaN(min)) ? 0 : min;
			key = key.toLowerCase();
			found = $('.filters').find("." + key).filter(function(index) {
				var ismatch = false;
				var txt = $(this).text().split(',');
				for (i = 0; i < txt.length; i++) {
					var x = parseFloat(txt[i]);
					if (x >= min || isNaN(x)) {
						ismatch = true;
					}
				}
				return ismatch;
			}).parents('.vehicle-tout');
			break;
		case 'toPrice':
		case 'toCargo':
		case 'toMPG':
			key = key.substr(2, (key.length));
			var max = $('[name=to' + key + ']').val();
			max = parseFloat(max);
			max = (isNaN(max)) ? 1000000 : max;
			key = key.toLowerCase();
			found = $('.filters').find("." + key).filter(function(index) {
				var ismatch = false;
				var txt = $(this).text().split(',');
				for (i = 0; i < txt.length; i++) {
					var x = parseFloat(txt[i]);
					if (x <= max || isNaN(x)) {
						ismatch = true;
					}
				}
				return ismatch;
			}).parents('.vehicle-tout');
			break;
		case 'features':
			for (i = 0; i < obj.length; i++) {
				var matches = $('.filters').find("." + key + ":contains('" + obj[i] + "')").parents('.vehicle-tout');
				found = (found.length > 0) ? intersect(found, matches) : matches;
			}
			break;
		}
		return $.makeArray(found);
	}

})(jQuery);
