(function($){
    $.Suburbs = function(selector, settings){
		var config = {
			'ddlSuburb' : false,
			'ddlSuburbId' : 0,
			'ddlSuburbText' : '-- Select a suburb',
			'ddlSuburb_url' : 'ajax/suburbs'
		};
		if (settings) { $.extend(config, settings); }
		
		if(!config.ddlSuburb){
			return;	
		}
		
		var txtPostcode = $(selector);		
		var ajaxRequest;
		var txtPostcode_last;

		txtPostcode.attr('autocomplete','off');
		
		prependTxt = '<option value=""';
		if(!config.ddlSuburbId){
			prependTxt += ' selected="selected"';
		}
		prependTxt += '>' + config.ddlSuburbText + '</option>';
		config.ddlSuburb.prepend(prependTxt);
		
		txtPostcode_last = txtPostcode.val();
				
		$(txtPostcode).keyup(function(){
			postcode = $(this).val();
			if(postcode.length == 4 && postcode !== txtPostcode_last){
				txtPostcode_last = postcode;

				config.ddlSuburb.attr('readonly',true).html('<option value="" selected="selected">Loading suburbs...</option>');
				
				if(config.ajax_request){
					config.ajax_request.abort();	
				}
				
				config.ajax_request = $.ajax({
					type: "POST",
					url: config.ddlSuburb_url,
					data:{'postcode' : postcode},
					dataType:"json",
					error: function(){
						alert('An unexpected error occurred.');
					},
					success: function(response){
						if(response.length > 0){
							html = '<option value=""';
							if(!config.ddlSuburbId){
								html += ' selected="selected"';	
							}
							html += '>' + config.ddlSuburbText + '</option>';
							for(i in response){
								html += '<option value="' + response[i]['Id'] + '"';
								if(response[i]['Id'] == config.ddlSuburbId){
									html += ' selected="selected"';	
								}
								html += '>' + response[i]['Suburb'] + ', ' + response[i]['State'] + '</option>';
							}
							config.ddlSuburb.html(html).removeAttr('readonly','readonly');
						}
						else {
							config.ddlSuburb.html('<option value="" selected="selected">Invalid postcode</option>').removeAttr('readonly',false);
						}
					}
				});	
			}
		});
	};
})(jQuery);
