matched = new Object();

function updatePage () {
	var myForm = document.makemodelForm;
	if (STATE['bodystyle'] && STATE['bodystyle'].length > 1) {
		STATE['bodystyle'] = '';
	}

	var old_match = matched;
	var Yi = '';
	var Mi = '';
	for (i = 0; i < Y.length; i++) {
		if (Y[i] == STATE['year']) {
			Yi = i;
		}
	}
	for (i = 0; i < M.length; i++) {
		if (M[i] == STATE['make']) {
			Mi = i;
		}
	}
	if (STATE['page'] != 'carsearch' && STATE['year'] && old_match['year'] && !old_match['year'][Yi]) {
		if (myForm.make) {
			STATE['make'] = '';
		}
		STATE['model'] = '';
		STATE['bodystyle'] = '';
		STATE['pricerange'] = '';
	}
	if (STATE['page'] != 'carsearch' && STATE['make'] && old_match['make'] && !old_match['make'][Mi]) {
		STATE['year'] = '';
		STATE['model'] = '';
		STATE['bodystyle'] = '';
		STATE['pricerange'] = '';
	}

	matched = runFilter();

	if (myForm.year) {
		var hard_year = new Object();
		for (i=0; i < Y.length; i++) {
			if (PREF['makes']) {
				for (j=0; j < M.length; j++) {
					if (PREF['makes'][M[j]]) {
						for (k=0; k < L.length; k++) {
							if (L[k].indexOf(i+"\t"+j, 0) == 0) {
								hard_year[i] = 1;
								break;
							}
						}
					}
				}
			} else {
				hard_year[i] = 1;
			}
		}
		refresh_list(myForm.year, STATE['year'], Y, hard_year, matched['year'], null);
	}
	if (myForm.make) {
		var hard_make = new Object();
		if (PREF['makes']) {
			for (var ma in PREF['makes']) {
				for (i=0; i < M.length; i++) {
					if (M[i] == ma) {
						hard_make[i] = 1;
						break;
					}
				}
			}
		} else {
			for (i=0; i < M.length; i++) {
				hard_make[i] = 1;
			}
		}
		refresh_list(myForm.make, STATE['make'], M, hard_make, matched['make'], null);
	}
	if (STATE['make'] && myForm.year) {
		refresh_list(myForm.year, STATE['year'], Y, matched['year'], matched['year'], null);
	}
	if (myForm.model) {
		refresh_list(myForm.model, STATE['model'], C, matched['model'], matched['model'], null);
	}
	if (myForm.bodystyle) {
		refresh_list(myForm.bodystyle, STATE['bodystyle'], null, matched['body'], matched['body'], B);
	}
	if (myForm.pricerange) {
		refresh_list(myForm.pricerange, STATE['pricerange'], null, matched['price'], matched['price'], P);
	}
	if (myForm.zipcode) {
		if (STATE['zipcode']) {
			myForm.zipcode.value = STATE['zipcode'];
		} else {
			myForm.zipcode.value = "";
		}
	}
	saveState();
}

function refresh_list (optlist, value, lookup, full, matched, display) {
	var list_default = optlist.options[0].text;
	optlist.length = 0;
	optlist.options[0] = new Option(list_default, '');

	var preselect = "";
	var list = new Array();
	for (var key in full) {
		if (lookup) {
			list[list.length] = lookup[key];
		} else {
			list[list.length] = key;
		}
	}
	var mlist = new Array();
	for (var key in matched) {
		if (lookup) {
			mlist[mlist.length] = lookup[key];
		} else {
			mlist[mlist.length] = key;
		}
	}
	if (mlist.length == 1) {
		preselect = mlist[0];
	}
	list.sort();
	if (value) {
		preselect = value;
	}
	var si = 0;
	for (var index in list) {
		var val = list[index];
		var disp = val;
		var len = optlist.options.length;
		if (display) {
			disp = display[disp];
		}
		optlist.options[len] = new Option(disp, val);
		if (preselect == val) {
			si = len;
		}
	}
	optlist.options[si].selected = true;
}

function runFilter () {
	var DMakes = new Object();
	var d_length = 0;
	if (PREF['makes']) {
		for (var make in PREF['makes']) {
			DMakes[make.toUpperCase()] = 1;
			d_length++;
		}
	}
	var matched = new Object();
	matched['year'] = new Object();
	matched['make'] = new Object();
	matched['model'] = new Object();
	matched['body'] = new Object();
	matched['price'] = new Object();
	for (var i = 0; i < L.length; i++) {
		var flag = 11111;
		var car = mySplit(L[i], "\t");
		if (PREF['years'] && !PREF['years'][Y[car[0]]]) {
			flag -= 11111;
		} else {
			if (STATE['year'] && STATE['year'] != Y[car[0]]) {
				flag -= 10000 ;
			}
		}
		if (d_length > 0 && !DMakes[M[car[1]].toUpperCase()]) {
			flag -= 11111;
		} else {
			if (STATE['make'] && STATE['make'].toUpperCase() != M[car[1]].toUpperCase()) {
				flag -= 1000;
			}
		}
		if (PREF['models'] && !PREF['models'][C[car[2]]]) {
			flag -= 11111;
		} else {
			if (STATE['model'] && STATE['model'].toUpperCase() != C[car[2]].toUpperCase()) {
				flag -= 100;
			}
		}
		if (STATE['bodystyle'] && car[3].indexOf(STATE['bodystyle']) == -1) {
			flag -= 10;
		}
		if (STATE['pricerange'] && car[4].indexOf(STATE['pricerange']) == -1) {
			flag -= 1;
		}
		if (flag == 11111 || flag == 1111) {
			matched['year'][car[0]] = 1;
		}
		if (flag == 11111 || flag == 10111) {
			matched['make'][car[1]] = 1;
		}
		if (flag == 11111 || flag == 11011) {
			matched['model'][car[2]] = 1;
		}
		if (flag == 11111 || flag == 11101 || STATE['page'] == "carsearch") {
                	for (var j = 0; j < car[3].length; j++) {
                        	matched['body'][car[3].charAt(j)] = 1;
                	}
		}
		if (flag == 11111 || flag == 11110 || STATE['page'] == "carsearch") {
                	for (var j = 0; j < car[4].length; j++) {
                        	matched['price'][car[4].charAt(j)] = 1;
                	}
		}
	}
	return matched;
}

function optionSelected (name, list) {
	if (PREF['for_idiots']) {
		if (name == 'year') {
			STATE['make'] = '';
			STATE['model'] = '';
			STATE['bodystyle'] = '';
			STATE['pricerange'] = '';
		} else if (name == 'make') {
			STATE['model'] = '';
			STATE['bodystyle'] = '';
			STATE['pricerange'] = '';
		}
	}
	var value = "";
	for (var i = 0; i < list.options.length; i++) {
		if (list.options[i].selected) {
			value = list.options[i].value;
		}
	}
	STATE[name] = value;
	if (STATE['page'] == "carsearch") {
		if (STATE['bodystyle'] && STATE['pricerange']) {
			saveState();
			document.location.reload();
		}
	} else {
		updatePage();
	}
}

function saveZip (zip) {
	STATE['zipcode'] = zip.value;
	saveState();
}

function clearAll () {
	STATE['year'] = "";
	if (document.makemodelForm.make) {
		STATE['make'] = "";
	}
	STATE['model'] = "";
	STATE['bodystyle'] = "";
	STATE['pricerange'] = "";
	STATE['car_id'] = "";
	updatePage();
}

