(function($) {
	var SmartBrowse = function(settings) {
		settings = $.extend({
			sbForm : 'sbForm',
			sbdata : {}
		}, settings);
		settings.removalPattern = settings.removalPattern || /(?:)/;
		
		var id = '#' + settings.sbForm,
			sbdata = settings.sbdata,
			get_invtype = function() {
				var radioButton = $(':input[name=invtype]:checked', id).attr('value'),
					selectBox = $(':input[name=invtype] option:selected', id).attr('value');
				
				return (radioButton === undefined ) ? selectBox : radioButton;
			},
			clearoptionlist = function(formelm) {
				var numopt = formelm.options.length,
					i;
				
				for (i = (numopt - 1); i >= 1; i--) {
					formelm.options[i] = null;
				}
			},
			lastInvType = get_invtype(),
			sb_ajaxCount = 0,
			sb_ajax = function(selRef) {
				var formRef = document.forms[settings.sbForm],
					invtype = get_invtype(),
					resetParam = ((lastInvType !== get_invtype()) || !sb_ajaxCount) ? 'reset=InventoryListing' : '',
					url = settings.ajaxpaths[invtype] + '?' + ((selRef) ? resetParam + (!!resetParam ? '&' : '') + selRef.name + '=' + escape(selRef.value) : resetParam),
					criteria;
				
				formRef.action = settings.invpaths[invtype];
				for (criteria in settings.showsettings) {
					url = (typeof settings.showsettings[criteria] === 'string') ? url += '&' + criteria + '=' + settings.showsettings[criteria] : url;
				}
				url += '&detect=false';
				doLoad(url);
				lastInvType = get_invtype();
				sb_ajaxCount++;
			},
			doLoad = function(url) {
				$.ajax({
					url: url,
					dataType: 'json',
					beforeSend: function() {
						$('#sbSubmitBtn').hide();
						$('#sb_loading').show();
					},
					success: function(req) {
						sbdata = req;
						$('#sb_loading').hide();
						$('#sbSubmitBtn').show();
						sb_load();
					}
				});
			},
			display_check = function(invtype) {
				var exceptions = settings.showsettings.exceptions,
					input,
					type,
					i;
				
				$(':input', id).each(function() {
					input = $.trim($(this).attr('name').replace('SB', '').toLowerCase());
					$(this).show();
					if (exceptions[input]) {
						type = exceptions[input].split(',');
						for (i = 0; i < type.length; i++) {
							if (type[i] === invtype) {
								$(this).hide();
							}
						}
					}
				});
			},
			sb_load = function() {
				var dataset, optRef, key, i;
				
				for (dataset in sbdata) {
					if ((dataset != 'SBdefaults') && (typeof document.forms[settings.sbForm].elements[dataset] != 'undefined')) {
						optRef = document.forms[settings.sbForm].elements[dataset];
						clearoptionlist(optRef);
						i = 1;
						for (key in sbdata[dataset]) {
							optRef.options[i++] = new Option(sbdata[dataset][key].replace(/GMC Pontiac Buick/, 'GMC').replace(settings.removalPattern, ''), key);
						}
						optRef.disabled = (i == 1) ? true : false;
						optRef.value = (sbdata.SBdefaults[dataset] === '') ? 'clear' : sbdata.SBdefaults[dataset];
					}
				}
				
				if ($("#SBstockNumber", id).length > 0) {
					if ($("#SBstockNumber", id).get(0).value == "clear") {
						$("#SBstockNumber", id).get(0).value = "Search By Stock Number";
					}
				}
			},
			sb_submit = function () {
				if ($("#SBstockNumber", id).length > 0) {
					if ($("#SBstockNumber", id).get(0).value == "Search By Stock Number") {
						$("#SBstockNumber", id).get(0).value = "clear";
					} else {
						$("#SBstockNumber", id).get(0).value = $.trim($("#SBstockNumber", id).get(0).value);
					}
				}
				document.forms[settings.sbForm].submit();
			},
			init = function(id) {
				sb_ajax();
				display_check(get_invtype());
				// ie6 doesn't fire the change event on radio buttons immediately, so it must be forced
				if ($.browser.msie && ($.browser.version === '6.0' || $.browser.version === '7.0')) {
					$('input[name=invtype]').click(function() {
						$(this).focus().blur().change();
					});
				}
				$(':input', id).focus(function() {
					if ($(this).attr('name') == 'SBstockNumber') {
						$("#SBstockNumber", id).val("");
					}
				});
				$(':input', id).change(function() {
					if ($(this).attr('name') !== 'SBstockNumber') {
						sb_ajax(this);
						display_check(get_invtype());
						if ($("#SBstockNumber", id).length > 0) {
							$("#SBstockNumber", id).get(0).value = "clear";
						}
					} else {
						$('select', id).each(function() {//revert all selections back to default
							this.selectedIndex = 0;
						});
					}
				});
				$('#sbSubmitBtn', id).click(function() {
					sb_submit();
					return false;
				});
			};
		
		init(id);
		return this;
	};
	
	window.DDC.SmartBrowse = SmartBrowse;
})(jQuery);
