/* CREDITS
 * ----------------------------------------------------------
 * Title:		Handle specific search form
 * Author:		Dirk Bonhomme <dirk@inventis.be>
 * Date:		08/12/2009
 * Last Edit:	08/12/2009 [Dirk Bonhomme]
 * ----------------------------------------------------------
 * Inventis - Web Architects - We design the Web!
 * www.inventis.be
*/
window.addEvent('domready', function(){

	// Show correct selectbox on click of radiobutton
	$$('div.search_module input[name=type]').addEvent('click', function(e){
		$('belgium_selectfields').setStyle('display', 'none');
		$('europe_selectfields').setStyle('display', 'none');
		$('world_selectfields').setStyle('display', 'none');
		$(e.target.value + '_selectfields').setStyle('display', 'block');
	});
	
	// Show/hide default text in input fields
	$$('div.search_module .empty').addEvent('focus', function(e){
		if(e.target.hasClass('empty')){
			e.target.removeClass('empty');
			e.target.value = '';
		}	
	});
	
	// Add or remove empty style to selectboxes
	$$('div.search_module select').addEvent('change', function(e){
		if(e.target.value){
			e.target.removeClass('empty');
		}else{
			e.target.addClass('empty');
		}
	});
	
	// Clear default values and disable unused fields on form submit
	$$('div.search_module form').pop().addEvent('submit', function(e){
	
		// Clear default values
		$$('div.search_module input.empty').each(function(field){
			field.value = '';
		});
		
		// Disable unused select boxes
		var selectedType = $$('div.search_module input[name=type][checked]').pop().value;
		$$('div.search_module select').each(function(field){
			field.disabled = true;
		});
		$$('#' + selectedType + '_selectfields select').each(function(field){
			field.disabled = false;
		});
		
	});
	
	// Add listeners for selectbox selections
	$$('div.search_module select[name=belgium_region]').pop().addEvent('change', function(e){
		var selectedValue = e.target.value.split('_');
		if(selectedValue[0] == 'province'){
			requestSearchModuleData(e.target, $$('div.search_module select[name=belgium_city]').pop(), 'province_to_city');
		}else{
			requestSearchModuleData(e.target, $$('div.search_module select[name=belgium_city]').pop(), 'region_to_city');
		}
	});
	
	$$('div.search_module select[name=europe_country]').pop().addEvent('change', function(e){
		requestSearchModuleData(e.target, $$('div.search_module select[name=europe_region]').pop(), 'country_to_region');
		requestSearchModuleData(e.target, $$('div.search_module select[name=europe_city]').pop(), 'country_to_city');
	});
	
	$$('div.search_module select[name=europe_region]').pop().addEvent('change', function(e){
		requestSearchModuleData(e.target, $$('div.search_module select[name=europe_city]').pop(), 'region_to_city');
	});
	
	$$('div.search_module select[name=world_country]').pop().addEvent('change', function(e){
		requestSearchModuleData(e.target, $$('div.search_module select[name=world_region]').pop(), 'country_to_region');
		requestSearchModuleData(e.target, $$('div.search_module select[name=world_city]').pop(), 'country_to_city');
	});
	
	$$('div.search_module select[name=world_region]').pop().addEvent('change', function(e){
		requestSearchModuleData(e.target, $$('div.search_module select[name=world_city]').pop(), 'region_to_city');
	});

});

var searchModuleCache = {};

function requestSearchModuleData(selectedField, targetField, type){
	
	// Clear and disable target field
	while(targetField.firstChild){
		targetField.removeChild(targetField.firstChild);
	}
	targetField.disabled = true;
	targetField.addClass('empty');

	// Determine post data
	switch(type){
		case 'country_to_region':
			var url = 'jsonbyparent';
			var emptyText = '(kies een regio)';
			var params = {
				parent_id: selectedField.value,
				order: 'sequence'
			};
			break;
		
		case 'province_to_city':
			var url = 'jsonbyprovince';
			var emptyText = '(kies een stad)';
			var params = {
				province_id: selectedField.value.replace('province_', ''),
				order: 'title'
			};
			break;
			
		case 'country_to_city':
			var url = 'jsonbyparentparent';
			var emptyText = '(kies een stad)';
			var params = {
				parentparent_id: selectedField.value,
				order: 'title'
			};
			break;
			
		case 'region_to_city':
			var url = 'jsonbyparent';
			var emptyText = '(kies een stad)';
			var params = {
				parent_id: selectedField.value.replace('region_', ''),
				order: 'title'
			};
			break;
		
		default:
			return false;
			break;
	}
	
	// Quit if selected field has no value
	if(!selectedField.value){
		targetField.options[0] = new Option(emptyText, '', true);
		return false;
	}
	
	// Request or fetch from cache
	var cacheKey = url + params.parent_id + params.province_id + params.parentparent_id + params.order; // doesn't matter if things are undefined
	if(data = searchModuleCache[cacheKey]){
		fillSearchModuleSelect(targetField, data, emptyText);
	}else{
		targetField.options[0] = new Option('laden...');
		new Request.JSON({
			url: '/locations/' + url,
			data: params,
			onSuccess: function(result){
				searchModuleCache[cacheKey] = result;
				fillSearchModuleSelect(targetField, result, emptyText);
			}
		}).post();
	}
}

function fillSearchModuleSelect(field, result, emptyText){
	if(result.data.length > 0){
		
		// Add first item
		field.options[0] = new Option(emptyText, '', true);
		
		// Fill selectbox
		if(result.grouped){
			for(g = 0; g < result.data.length; g++){
				var groupData = result.data[g];
				var optGroup = new Element('optgroup', {
					label: groupData.title
				})
				for(i = 0; i < groupData.data.length; i++){
					optGroup.appendChild(new Element('option', {
						html: groupData.data[i].title,
						value: groupData.data[i].id
					}));
				}
				field.appendChild(optGroup);
			}
		}else{
			for(i = 0; i < result.data.length; i++){
				field.appendChild(new Element('option', {
					html: result.data[i].title,
					value: result.data[i].id
				}));
			}
		}
	
		// Enable selectbox
		field.disabled = false;
		field.removeClass('empty');
	}else{
		field.options[0] = new Option('geen gegevens...');
	}	
	
}
