(function ($) {
	$.fn.extend({
		smartbrowseAjax: function (settings) {
			settings = $.extend({
				url: ''
			}, settings); 
			
			// variables
			var self = this;
			var fields = [];							// available smartbrowse fields
			var options = {};							// selected options
			
			// functions
			var cleaned = function (obj) {
				for (var item in obj) {
					obj[item] = transformations(obj[item] || '');
					if (!obj[item]) {
						delete obj[item];
					}
				}
				return obj;
			},
			transformations = function (str) {
				// handle special-case value transformations
				// replace spaces with nothing
				return str/*.replace(/ /g, '')*/;
			},
			clearSelect = function (select) {
				select.selectedIndex = 0;
				for (i = (select.length - 1); i >= 1; i--) {
					select.options[i] = null;
				}
			},
			updateSmartbrowse = function (data) {
				$.each(fields, function (i, field) {
					var select = $('[name=' + field + ']', self)[0];
					if (data[field]) {
						clearSelect(select);
						for (var val in data[field]) {
							var selected = ($.inArray(field, fields) !== -1) && (transformations(val) === options[field]);
							select.options[select.length] = new Option(data[field][val], transformations(val), selected, selected);
						};
					}
				});
				enableUi();
			},
			ajaxCall = function () {
				disableUi();
				if (!options.type) {
					options.type = '0';
				}
				$.getJSON(settings.url, cleaned(options), updateSmartbrowse);
			},
			disableUi = function () {
				$(self).addClass('loading');
				$('select', self).attr('disabled', 'disabled');
			},
			enableUi = function () {
				$(self).removeClass('loading');
				$('select', self).attr('disabled', '');
				if ($('select[name=make]').val()) {
					$('select[name=model]', self).attr('disabled', '');
				} else {
					$('select[name=model]', self).attr('disabled', 'disabled');
				}
			};
			
			
			// initialization procedure
			$('select', this).each(function () {
				var name = $(this).attr('name');
				// auto-discover smartbrowse fields from markup
				if ($.inArray(name, fields) === -1) {
					fields.push(name);
				}
				// attach events
				$(this).change(function () {
					options[name] = $(this).val();
					if ($(this).is('[name=make]') && (!!$('select[name=model]').val())) {
						$('select[name=model]').val('');
						options.model = ''
					}
					ajaxCall();
				});
			});
			// make initial ajax call
			ajaxCall();
			
			// always return this
			return $(this);
		}
	});
})(jQuery);