function initializeFilter(){
	var fields = ["searchProp1","searchProp2","searchProp3"],
		l = fields.length,
		i = 0,
		searchProp;
	
	do {
		searchProp = document.getElementById(fields[i++]);
	} while (i < l && !searchProp);
		
	if(searchProp){
		populateFilter(searchProp);
	} 
}
/* populate a filter with values corresponding to the indexValue in the indexFilter 
 * hotels is Array of 
 *  {id: '999',
 *   searchProp1: "country",
 *   searchProp2: "state/provence",
 *   searchProp3: "city" 
 *  }
 *  filter is element to be populated (searchProp1, searchProp2 or searchProp3)
 *  indexValue is value of searchPropX (country or city) changed
 *  indexFilter is field name (searchProp1 or searchProp2) changed
 */
function populateFilter(filter, indexValue, indexFilter){
	if (typeof filter == 'string')
		filter = document.getElementById(filter);
	
	if (!filter) 
		return;
	
	resetFilter(filter);
	
	var list = hotels,
		l = list.length,
		optionArray = [],
		value, listObj, i,
		filterName = filter.id;
	
	if (indexValue == "No Preferences") indexValue = undefined;
	if (list[l - 1] == undefined)
		l--; //For IE < 9; somewhere a trailing comma is in the code that creates hotels.
	
	while (l--) {
		listObj = list[l];
		if (indexValue && listObj[indexFilter] != indexValue) continue;
			
		value = listObj[filterName];
		if (!value || value in optionArray) continue;
		
		optionArray.push(value);
		optionArray[value] = optionArray.length;
	}

	l = optionArray.length;
	i = 1;
	while (l--) {
		value = optionArray[l];
		filter.options[i++] = new Option(value, value, false, false);
	}
		
	filter.disabled = !(optionArray.length > 0);
	
	if (optionArray.length == 1) {
		switch (filterName) {
		case "searchProp3":
			filter.selectedIndex = 1;
			break;
		case "searchProp2":
			filter.selectedIndex = 1;
			populateFilter(document.getElementById("searchProp3"), indexValue, indexFilter);
			break;
		}
	}
}

function resetFilter(filter){
	if (typeof filter != "string")
		filter = filter.id;

	var fields =[null, "searchProp1","searchProp2","searchProp3"],
		idx = filter.slice(-1) * 1,
		elem;
	
	for (; idx < 4; idx++) { 
		elem = document.getElementById(fields[idx]);
		if (elem) { 
			elem.length = 1;
			if (elem.value == "N/A") elem.disabled = true;
		}
	}
}

function filterUpdated(indexValue, indexFilter, filter){
	if (typeof filter == "string")
		filter = document.getElementById(filter);
		
	populateFilter(filter, indexValue, indexFilter);
}

/* 
 * Check the values for each hotel against each of the 3 possible filters 
 */
function filter(form){
	var searches = [],
		field, 
		l, 
		fieldName, 
		num = 1,
		list = hotels;
	
	/* Determine what fields we have, some can be skipped */
	while( num < 4) {
		fieldName = 'searchProp' + num++;
		field = form[fieldName];
		if (field)
			searches.push({name: fieldName, value: field.value});
	}
	
	/* Hide currently displayed hotels */
	l = list.length;
	while (l--) {
		$("#" + list[l].id).hide();
	}
	
	for (var k = 0, data; data = list[k++];) {
		_show(0, data);
	}
	
	function _show(idx, data) {
		var searchValue = searches[idx].value,
			fieldName = searches[idx].name,
			id = data.id,
			value = data[fieldName];
		
		if (!searchValue) return;
		
		if (searchValue == "N/A") {
			jQuery("#" + id).show();			
		} else if (value == searchValue || searchValue == "No Preferences"){
			if (idx < searches.length -1) {
				_show(idx + 1, data);
			} else {
				jQuery("#" + id).show();
			}
		}
	}
}

/* Specific filter functionality */
function handleUpdated(elem) {
	var searchFields = ["searchProp1","searchProp2","searchProp3"],
		indexValue = elem.value,
		searchField = elem.id,
		index = searchField.slice(-1) * 1,
		next;
	
	if (index >= searchFields.length)
		return;
	
	next = document.getElementById(searchFields[index]) || document.getElementById(searchFields[index + 1]);
	
	if(indexValue == "N/A"){
		resetFilter(next);
	} else {
		filterUpdated(indexValue, searchField, next.id);		
	}
}
