jQuery(function() {
	bxsAirportsAutocomplete.Init();
});


var bxsAirportsAutocomplete = {
	initialized: false,
	cache: {},
	lastXhr: "",
	nameFields: {},
	codeFields: {},
	customServiceURL: "",
	
	Init: function() {
		if (bxsAirportsAutocomplete.initialized) {
			return;
		}
		bxsAirportsAutocomplete.initialized = true;
		
		bxsAirportsAutocomplete.nameFields = {
			dep: jQuery("#depApName,#bxsDepApName"),
			des: jQuery("#desApName,#bxsDesApName"),
			dep2: jQuery("#desApName,#bxsDesApName"),
			des2: jQuery("#depApName,#bxsDepApName")
		};
		bxsAirportsAutocomplete.codeFields = {
			dep: jQuery("#departureAirport,#bxsDepApCode"),
			des: jQuery("#destinationAirport,#bxsDesApCode"),
			dep2: jQuery("#destinationAirport,#bxsDesApCode"),
			des2: jQuery("#departureAirport,#bxsDepApCode")
		};
		
		var fieldNames = ["dep", "des", "dep2", "des2"];
		
		for (var fieldNameIndex in fieldNames) {
			var fieldName = fieldNames[fieldNameIndex];
			bxsAirportsAutocomplete.nameFields[fieldName].data("fieldName", fieldName);
			bxsAirportsAutocomplete.InitField(fieldName);
		}
	},
	
	AddSecondaryField: function(fieldName, nameFieldId, codeFieldId) {
		bxsAirportsAutocomplete.nameFields[fieldName] = jQuery("#" + nameFieldId);
		bxsAirportsAutocomplete.codeFields[fieldName] = jQuery("#" + codeFieldId);
		
		bxsAirportsAutocomplete.nameFields[fieldName].data("fieldName", fieldName);
		
		bxsAirportsAutocomplete.InitField(fieldName);
	},
	
	RemoveSecondaryField: function(fieldName) {
		delete bxsAirportsAutocomplete.nameFields[fieldName];
		delete bxsAirportsAutocomplete.codeFields[fieldName];
	},
	
	InitField: function(fieldName) {
		bxsAirportsAutocomplete.nameFields[fieldName].keypress(function(event) {
			if (event.charCode > 0 || event.keyCode == 8 || event.keyCode == 46) {
				// pressed key is either no control key, a backspace or a delete
				bxsAirportsAutocomplete.codeFields[jQuery(this).data("fieldName")].val("");
			}
		});
			
		bxsAirportsAutocomplete.nameFields[fieldName].autocomplete({
			minLength: 3,
			source: function(request, response) {
				var term = request.term;
				
				if (term in bxsAirportsAutocomplete.cache) {
					response(bxsAirportsAutocomplete.cache[term]);
					return;
				}
				bxsAirportsAutocomplete.lastXhr = jQuery.getJSON(
					"/redirect.php", 
					request, 
					function(data, status, xhr) {
						bxsAirportsAutocomplete.cache[term] = data;
						if (xhr === bxsAirportsAutocomplete.lastXhr) {
							response(data);
						}
					}
				);
			},
			select: function(event, ui) {
				var fieldName = jQuery(event.target).data("fieldName");
				bxsAirportsAutocomplete.codeFields[fieldName].val(ui.item.id);
				
				if (bxsAirportsAutocomplete.nameFields.dep2.length > 0 &&
						bxsAirportsAutocomplete.codeFields.dep2.length > 0 &&
						bxsAirportsAutocomplete.nameFields.des2.length > 0 &&
						bxsAirportsAutocomplete.codeFields.des2.length > 0) {
					if (fieldName == "dep") {
						bxsAirportsAutocomplete.nameFields.des2.val(ui.item.value);
						bxsAirportsAutocomplete.codeFields.des2.val(ui.item.id);
					} else if (fieldName == "des") {
						bxsAirportsAutocomplete.nameFields.dep2.val(ui.item.value);
						bxsAirportsAutocomplete.codeFields.dep2.val(ui.item.id);
					} else {
						if (fieldName == "dep2") {
							bxsAirportsAutocomplete.codeFields.dep2.val(ui.item.id);
							if (bxsAirportsAutocomplete.nameFields.des.val() == "") {
								bxsAirportsAutocomplete.nameFields.des.val(ui.item.value);
								bxsAirportsAutocomplete.codeFields.des.val(ui.item.id);
							}
						}
						if (fieldName == "des2") {
							bxsAirportsAutocomplete.codeFields.des2.val(ui.item.id);
							if (bxsAirportsAutocomplete.nameFields.dep.val() == "") {
								bxsAirportsAutocomplete.nameFields.dep.val(ui.item.value);
								bxsAirportsAutocomplete.codeFields.dep.val(ui.item.id);
							}
						}
					}
				} else {
					bxsAirportsAutocomplete.nameFields.dep2.val("");
					bxsAirportsAutocomplete.codeFields.dep2.val("");
					bxsAirportsAutocomplete.nameFields.des2.val("");
					bxsAirportsAutocomplete.codeFields.des2.val("");
				}
			}
		});
	}
};
