; (function($) {
	var searchElement = null;
	var searchOptions = null;
	var searchBusy = false;
	var searchInitialized = false;
	
	/* Extend jQuery */
	$.fn.JsonServerSideSearch = function(o) {
		searchElement = $(this);
		var settings = $.extend({}, $.fn.JsonServerSideSearch.defaults, o);
		var filters = [];
		var keyFilters = [];
		var keyFilterProperties = [];
		var comboWidth = null;
		var IE6 = $.browser.msie && $.browser.version.substr(0, 1) == 6 && !window.XMLHttpRequest, oldIE = IE6 || ($.browser.msie && $.browser.version.substr(0, 1) == 7);

		/* Get the values to use in Filtering */
		function _getFilterValues(inValues) {
			if ($.isFunction(inValues)) {
				return (inValues());
			}
			else if (inValues instanceof Array) {
				return (inValues);
			}
			else {
				keyFilterValues = [];
				$.ajax({ url: keyFilters[i].Values, async: false, dataType: 'json', success: function(data) { keyFilterValues = data; } });
				return (keyFilterValues);
			}
			return ([]);
		}

		/* Generate Filters User Interface */
		function _generateFiltersUi(inFilter, onChange) {
			return (_generateFiltersUiWithValues(inFilter, inFilter.DefaultValue, inFilter.Values, onChange));
		}

		/* Generate Filters User Interface */
		function _generateFiltersUiWithValues(inFilter, inDefaultValue, inValues, onChange) {
			var liContainer = $('<li/>');
			liContainer.attr('id', inFilter.Property + 'Container');
			var label = $('<label/>').text(inFilter.DisplayText).attr('for', inFilter.Property);
			if (inFilter.Type == 'Boolean') {
				var hasTrue = false;
				for (var i = 0; i < inValues.length; i++) {
					if (inValues[i] != null) {
						if (inValues[i])
							hasTrue = true;
					}
				}
				var input = $('<input/>').attr('id', inFilter.Property).attr('Property', inFilter.Property).attr('type', 'checkbox');
				if (!hasTrue)
					input.attr('disabled', 'disabled');
				input.click(onChange);
				input.appendTo(liContainer);
				label.appendTo(liContainer);
			}
			else {
				label.appendTo(liContainer);
				$('<br/>').appendTo(liContainer);
				var propertySelect = $('<select/>').attr('id', inFilter.Property).css('width', '100%').css('min-width', '100%').css('padding', '0').attr('Property', inFilter.Property);
				propertySelect.change(onChange);
				$('<option/>').val('').text('').appendTo(propertySelect);
				$.each(inValues, function(j, item) {
					var optionContainer = $('<option/>').val(item).text(item);
					if (item == inDefaultValue)
						optionContainer.attr('selected', 'selected');
					optionContainer.appendTo(propertySelect);
				});
				propertySelect.appendTo(liContainer);
			}
			if ((inFilter.Type == 'Boolean') && (inDefaultValue != null)) {
				$.each(liContainer.children('input'), function(i, item) {
					if ($(item).attr('Property') == inFilter.Property) {
						item.checked = inDefaultValue;
					}
				});
			}
			return (liContainer);
		}

		/* Clear Results from the Users Screen */
		function _clearResults() {
			$(searchOptions.resultsContainer).empty();
		}

		/* Clear Filters from the Users Screen */
		function _clearFilters() {
			$(searchOptions.filtersContainer).empty();
		}

		/* Set the Search Term */
		function _setTerm(value) {
			searchElement.val(value);
		}

		/* Put Focus on the Term Text Box */
		function _focusTerm() {
			if (searchInitialized) {
				searchElement.focus();
			}
		}

		/* Get the Search Term */
		function _getTerm() {
			var value = $.trim(searchElement.val());
			if ((value == '') || (value == searchOptions.defaultText))
				return ('');
			return (value);
		}

		/* Based on the Property, pull the filter (if any) */
		function _pullfilter(property) {
			for (var i = 0; i < searchOptions.filterOnProperties.length; i++) {
				if (searchOptions.filterOnProperties[i].Property != property)
					continue;
				return (searchOptions.filterOnProperties[i]);
			}
			return (null);
		}

		/* Iterate through the data set and pull the unique values for the given property */
		function _pulluniquevaluesbykey(keys, property) {
			var values = [];
			for (var i = 0; i < searchOptions.searchItems.length; i++) {
				var hasMatchingData = true;
				var currentItem = searchOptions.searchItems[i];
				for (var k = 0; k < keys.length; k++) {
					var currentKey = keys[k];
					if (currentItem[currentKey.Property] != undefined) {
						if (currentItem[currentKey.Property] instanceof Array) {
							var hasValueInArray = false;
							for (var j = 0; j < currentItem[currentKey.Property].length; j++) {
								if (currentItem[currentKey.Property][j] == currentKey.Value)
									hasValueInArray = true;
							}
							hasMatchingData = hasValueInArray;
						}
						else {
							if (currentItem[currentKey.Property] != currentKey.Value)
								hasMatchingData = false;
						}
					}
					else {
						hasMatchingData = false;
					}
				}
				if (!hasMatchingData)
					continue;
				if (currentItem[property] != undefined) {
					if (currentItem[property] instanceof Array) {
						for (var j = 0; j < currentItem[property].length; j++) {
							values.push(currentItem[property][j]);
						}
					}
					else
						values.push(currentItem[property]);
					continue;
				}
			}
			return (values.unique().sort());
		}

		/* Get the filters for the Key fields */
		function _getKeyFilters() {
			var currentKeyFilters = [];
			$(searchOptions.keyFiltersContainer).children('ul').children('li').children('select').children('option:selected').each(function(i) {
				if ($.trim($(this).val()) != '')
					currentKeyFilters.push({ Property: $(this).parent().attr('Property'), Value: $(this).val() });
			});
			$(searchOptions.keyFiltersContainer).children('ul').children('li').children('input').each(function(i) {
				if (this.checked)
					currentFilters.push({ Property: $(this).attr('Property'), Value: this.checked });
			});
			return (currentKeyFilters);
		}

		/* Set the filter value for a Key field */
		function _setKeyFilter(property, value) {
			if ((value == true) || (value == 'true'))
				document.getElementById(property).checked = value;
			else {
				$('#' + property).children('option').each(function(i) {
					if ($.trim($(this).val()) == value)
						$(this).attr('selected', 'selected');
				});
			}
		}

		/* Get the filters for the all non-Key fields */
		function _getFilters() {
			var currentFilters = [];
			$(searchOptions.filtersContainer).children('ul').children('li').children('select').children('option:selected').each(function(i) {
				if ($.trim($(this).val()) != '')
					currentFilters.push({ Property: $(this).parent().attr('Property'), Value: $(this).val() });
			});
			$(searchOptions.filtersContainer).children('ul').children('li').children('input').each(function(i) {
				if (this.checked)
					currentFilters.push({ Property: $(this).attr('Property'), Value: this.checked });
			});
			return (currentFilters);
		}

		/* Set the filter value for a non-Key field */
		function _setFilter(property, value) {
			if ((value == true) || (value == 'true'))
				document.getElementById(property).checked = value;
			else {
				$('#' + property).children('option').each(function(i) {
					if ($.trim($(this).val()) == value)
						$(this).attr('selected', 'selected');
				});
			}
		}

		/* Gets all of the filters */
		function _getAllFilters() {
			return ($.merge(_getKeyFilters(), _getFilters()));
		}

		/* Gets all of the filters, excluding the the specific field */
		function _getAllFiltersExcept(allFilters, except) {
			var result = [];
			for (var i = 0; i < allFilters.length; i++) {
				var currentFilter = allFilters[i];
				if (currentFilter.Property == except)
					continue;
				result.push(currentFilter);
			}
			return (result);
		}

		/* Fired when a Key field has changed */
		function _keyFilterChanged(property, value) {
			_clearFilters();
			_clearResults();
			_setTerm('');
			_generateFiltersFromKeyFilters();
			_focusTerm();
		}

		var booleanFunction = function() { setTimeout(_filterChanged, 1, $(this).attr('Property'), this.checked); };
		var optionFunction = function() { setTimeout(_filterChanged, 1, $(this).attr('Property'), $(this).children('option:selected').val()); };

		/* Generate non-Key filters based on Key filter */
		function _generateFiltersFromKeyFilters() {
			var currentKeyFilters = _getKeyFilters();
			var currentFilters = _getFilters();
			var allCurrentFilters = $.merge(currentKeyFilters, currentFilters);
			searchOptions.searchItems = searchOptions.callbackOnQueryChange(allCurrentFilters, _getTerm());
			if (searchOptions.keyProperties.length > 0) {
				$(searchOptions.keyProperties).each(function(i, item) {
					$(currentKeyFilters).each(function(b, item2) {
						if ((item.Property == item2.Property) && (item.Value == item2.Value)) {
							keyFilterProperties = item.FilterOnProperties;
							if (keyFilterProperties.length > 0) {
								var ulContainer = $('<ul/>');
								$(keyFilterProperties).each(function(j, item3) {
									var filter = _pullfilter(item3);
									if (filter == null)
										return;
									var changeFunction = null;
									if (filter.Type == 'Boolean')
										changeFunction = booleanFunction;
									else
										changeFunction = optionFunction;
									var filterUi = _generateFiltersUiWithValues(filter, filter.DefaultValue, _pulluniquevaluesbykey(allCurrentFilters, filter.Property), changeFunction);
									filterUi.appendTo(ulContainer);
								});
								ulContainer.appendTo(searchOptions.filtersContainer);
							}
						}
					});
				});
			}
		}

		var updatingFilters = false;
		var lastRunFilters = [];

		/* Fired when a non Key field is changed */
		function _filterChanged(property, value) {
			if (updatingFilters)
				return;
			for (var i = 0; i < lastRunFilters.length; i++) {
				var currentFilter = lastRunFilters[i];
				if ((currentFilter.Property == property) && (currentFilter.Value == value)) {
					return;
				}
			}
			_setTerm('');
			var currentFilters = _getFilters();
			if (currentFilters.length == 0) {
				_clearResults();
				_clearFilters();
				_generateFiltersFromKeyFilters();
				_focusTerm();
				lastRunFilters = currentFilters;
				updatingFilters = false;
				return;
			}
			if (searchOptions.showLoadingResults)
				_showLoadingResults();
			searchOptions.searchItems = searchOptions.callbackOnQueryChange(_getAllFilters(), _getTerm());
			_setCookie(_getTerm(), _getFilters(), _getKeyFilters());
			_renderResults(searchOptions.searchItems);
			setTimeout(_updateFiltersBasedOnUniqueProperties, 1);
			_focusTerm();
			lastRunFilters = currentFilters;
		}

		/* Show loading results while the results are loading */
		function _showLoadingResults() {
			if (IE6) {
				$("#jsonsssearch_overlay").css('height', $(document).height());
			}
			$("#jsonsssearch_overlay").css({ 'background-color': searchOptions.overlayColor, 'opacity': searchOptions.overlayOpacity }).show();
			var w = getViewport();
			$("#jsonsssearch_loading").css({ 'left': ((w[0] - 32) * 0.5 + w[2]), 'top': ((w[1] - 32) * 0.5 + w[3]) }).show();
		}

		/* Gets the viewport */
		function getViewport() {
			return [$(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop()];
		};

		/* Results have loaded, hide loading results */
		function _hideLoadingResults() {
			$("#jsonsssearch_overlay").hide();
			$("#jsonsssearch_loading").hide();
		}

		function _updateFiltersBasedOnUniqueProperties() {
			updatingFilters = true;
			var currentKeyFilters = _getKeyFilters();
			var currentFilters = _getFilters();
			var allCurrentFilters = $.merge(currentKeyFilters, currentFilters);
			_clearFilters();
			if (searchOptions.keyProperties.length > 0) {
				$(searchOptions.keyProperties).each(function(i, item) {
					$(currentKeyFilters).each(function(b, item2) {
						if ((item.Property == item2.Property) && (item.Value == item2.Value)) {
							keyFilterProperties = item.FilterOnProperties;
							if (keyFilterProperties.length > 0) {
								var ulContainer = $('<ul/>');
								$(keyFilterProperties).each(function(j, item3) {
									var filter = _pullfilter(item3);
									if (filter == null)
										return;
									var changeFunction = null;
									if (filter.Type == 'Boolean')
										changeFunction = booleanFunction;
									else
										changeFunction = optionFunction;
									var defaultValue = filter.DefaultValue;
									for (var whatever = 0; whatever < currentFilters.length; whatever++) {
										if (currentFilters[whatever].Property == filter.Property)
											defaultValue = currentFilters[whatever].Value;
									}
									var filtersToGenerateOn = [];
									filtersToGenerateOn = _getAllFiltersExcept(allCurrentFilters, filter.Property);
									searchOptions.searchItems = searchOptions.callbackOnQueryChange(filtersToGenerateOn, _getTerm());
									var filterUi = _generateFiltersUiWithValues(filter, defaultValue, _pulluniquevaluesbykey(filtersToGenerateOn, filter.Property), changeFunction);
									filterUi.appendTo(ulContainer);
								});
								ulContainer.appendTo(searchOptions.filtersContainer);
							}
						}
					});
				});
			}
			updatingFilters = false;
		}

		/* Initate values, UI, etc */
		function _initialize() {
			searchOptions = $.extend({}, settings);
			if ((searchOptions.filterOnProperties != null) && (searchOptions.filterOnProperties instanceof Array)) {
				for (var i = 0; i < searchOptions.filterOnProperties.length; i++) {
					if (searchOptions.filterOnProperties[i].Key)
						keyFilters.push(searchOptions.filterOnProperties[i]);
					else
						filters.push(searchOptions.filterOnProperties[i]);
				}
				if (keyFilters.length > 0) {
					var ulContainer = $('<ul/>');
					for (var i = 0; i < keyFilters.length; i++) {
						keyFilters[i].Values = _getFilterValues(keyFilters[i].Values);
						var changeFunction = null;
						if (keyFilters[i].Type == 'Boolean')
							changeFunction = booleanFunction;
						else
							changeFunction = optionFunction;
						var filterUi = _generateFiltersUi(keyFilters[i], changeFunction);
						filterUi.appendTo(ulContainer);
					}
					ulContainer.appendTo(searchOptions.keyFiltersContainer);
				}
				else {
					if (filters.length > 0) {
						var ulContainer = $('<ul/>');
						for (var i = 0; i < filters.length; i++) {
							filters[i].Values = _getFilterValues(filters[i].Values);
							var changeFunction = null;
							if (filters[i].Type == 'Boolean')
								changeFunction = booleanFunction;
							else
								changeFunction = optionFunction;
							var filterUi = _generateFiltersUi(filters[i], changeFunction);
							filterUi.appendTo(ulContainer);
							filterUi.change();
						}
						ulContainer.appendTo(searchOptions.filtersContainer);
					}
				}
			}
			if (searchOptions.clearResultsButton != null) {
				$(searchOptions.clearResultsButton).click(function() {
					searchElement.val('');
					_clearResults();
					_clearFilters();
					_generateFiltersFromKeyFilters();
					$(searchOptions.loadPreviousResultsButton).hide();
					_clearCookies();
					return (false);
				});
			}
			if (searchOptions.showLoadingResults) {
				var html = '';
				html += '<div id="jsonsssearch_overlay" style="position: fixed;top: 0;left: 0;width: 100%;height: 100%;display: none;z-index: 30;"></div>';
				html += '<div id="jsonsssearch_loading" style="position: absolute;height: 32px;width: 32px;cursor: pointer;display: none;overflow: hidden;background: transparent;z-index: 100;">';
				html += '<div style="position: absolute;top: 0;left: 0;width: 32px;height: 480px;background: transparent url(\'/_layouts/JS-loading.gif\') no-repeat;"></div>';
				html += '</div>';
				$(html).appendTo("body");
				if (IE6) {
					$("div#jsonsssearch_overlay").css("position", "absolute");
				}
			}

			if (searchOptions.loadPreviousResultsButton != null) {
				var term = $.cookie('jsonsssearchTerm');
				var currentFilters = $.cookie('jsonsssearchFilters');
				var currentKeyFilters = $.cookie('jsonsssearchKeyFilters');
				var hasValues = false;
				if ((term != null) && (term != ''))
					hasValues = true;
				if ((currentFilters != null) && (currentFilters != ''))
					hasValues = true;
				showLoadPreviousResults = hasValues;
				$(searchOptions.loadPreviousResultsButton).click(function() {
					_loadPreviousSearch();
					$(this).hide();
					return (false);
				});
			}

			if ($.isFunction(searchOptions.callbackOnInitialize))
				searchOptions.callbackOnInitialize();
		};

		var showLoadPreviousResults = false;
		var loadingPreviousResults = false;

		/* Clears cookies used to track information */
		function _clearCookies() {
			$.cookie('jsonsssearchTerm', null);
			$.cookie('jsonsssearchFilters', null);
			$.cookie('jsonsssearchKeyFilters', null);
		}

		/* Based on the cookies, load the previous search results */
		function _loadPreviousSearch() {
			loadingPreviousResults = true;
			var term = $.cookie('jsonsssearchTerm');
			var currentFilters = $.cookie('jsonsssearchFilters');
			var currentKeyFilters = $.cookie('jsonsssearchKeyFilters');
			var hasValues = false;
			var hasTerm = false;
			if (currentKeyFilters != null) {
				var currentKeyFiltersArray = currentKeyFilters.split(',');
				for (var i = 0; i != currentKeyFiltersArray.length; i++) {
					hasValues = true;
					var property = currentKeyFiltersArray[i];
					var value = $.cookie('jsonsssearchKeyFilter:' + currentKeyFiltersArray[i]);
					_setKeyFilter(property, value);
					_keyFilterChanged(property, value);
				}
			}
			if (currentFilters != null) {
				var currentFiltersArray = currentFilters.split(',');
				for (var i = 0; i != currentFiltersArray.length; i++) {
					hasValues = true;
					var property = currentFiltersArray[i];
					var value = $.cookie('jsonsssearchFilter:' + currentFiltersArray[i]);
					_setFilter(property, value);
					_filterChanged(property, value);
				}
			}
			if (term != null) {
				if (term != '') {
					hasTerm = true;
					_setTerm(term);
					hasValues = true;
				}
			}
			if (hasValues) {
				if (hasTerm) {
					_doSearch();
				}
			}
			loadingPreviousResults = false;
		}

		/* Term box has focus */
		function _focus() {
			if (!searchInitialized) {
				if (searchOptions.initialClass != null)
					searchElement.removeClass(searchOptions.initialClass);
				if ($.isFunction(searchOptions.callbackOnFocus))
					searchOptions.callbackOnFocus();
				searchInitialized = true;
				if (showLoadPreviousResults)
					$(searchOptions.loadPreviousResultsButton).show();
			}
			return (false);
		}

		/* Search related controls lost focus */
		function _blur() {
			if ($.isFunction(searchOptions.callbackOnBlur))
				searchOptions.callbackOnBlur();
			return (false);
		}

		var timeout;

		/* Perform text based search */
		function _search(e) {
			_clearCookies();
			$(searchOptions.loadPreviousResultsButton).hide();
			setTimeout(_doSearch, 1);
			if ((e.keyCode == 13) || (e.keyCode == 10)) {
				return (false);
			}
		}

		/* Set cookies based on current information */
		function _setCookie(term, currentFilters, currentKeyFilters) {
			$.cookie('jsonsssearchTerm', term);
			var jsonsssearchFilters = '';
			for (var i = 0; i != currentFilters.length; i++) {
				if (jsonsssearchFilters == '') {
					jsonsssearchFilters = currentFilters[i].Property;
				}
				else {
					jsonsssearchFilters += ',' + currentFilters[i].Property;
				}
				$.cookie('jsonsssearchFilter:' + currentFilters[i].Property, currentFilters[i].Value);
			}
			$.cookie('jsonsssearchFilters', jsonsssearchFilters);
			var jsonsssearchKeyFilters = '';
			for (var i = 0; i != currentKeyFilters.length; i++) {
				if (jsonsssearchKeyFilters == '') {
					jsonsssearchKeyFilters = currentKeyFilters[i].Property;
				}
				else {
					jsonsssearchKeyFilters += ',' + currentKeyFilters[i].Property;
				}
				$.cookie('jsonsssearchKeyFilter:' + currentKeyFilters[i].Property, currentKeyFilters[i].Value);
			}
			$.cookie('jsonsssearchKeyFilters', jsonsssearchKeyFilters);
		}

		/* Setup text based search */
		function _doSearch() {
			var term = _getTerm();
			var currentFilters = _getFilters();
			var currentKeyFilters = _getKeyFilters();
			_setCookie(term, currentFilters, currentKeyFilters);
			if ((currentKeyFilters.length == 0) && (keyFilters.length > 0)) {
				return;
			}
			if ((term == '') && (currentFilters.length == 0)) {
				return;
			}
			if (timeout) {
				clearTimeout(timeout);
				timeout = null;
			}
			timeout = setTimeout(_performTermSearch, searchOptions.searchKeyPressTimeout);
		}

		/* Perform text based search */
		function _performTermSearch() {
			var term = _getTerm();
			var currentFilters = _getFilters();
			if ((term == '') && (currentFilters.length == 0))
				return;
			searchOptions.searchItems = searchOptions.callbackOnQueryChange(_getAllFilters(), _getTerm());
			_renderResults(searchOptions.searchItems);
		}

		/* Setup render results */
		function _renderResults(results) {
			itemsToRender = results;
			setTimeout(_doRender, 1);
		}

		var itemsToRender = null;

		/* Render results */
		function _doRender() {
			_clearResults();
			var results = itemsToRender;
			if (results.length > 0) {
				$('<h3/>').text('Search Results').appendTo(searchOptions.resultsContainer);
				var renderColumns = searchOptions.columns;
				if (renderColumns > results.length)
					renderColumns = results.length;
				if (renderColumns > 1) {
					var columnWidth = parseInt(100 / renderColumns);
					var columnContainers = [];
					for (var i = 0; i < renderColumns; i++) {
						var container = $('<ul/>').css('float', 'left').css('padding', '0').css('margin', '0').css('width', columnWidth + '%');
						columnContainers.push(container);
					}
					for (var i = 0; i < results.length; i++) {
						if (results[i].Rendered == null)
							results[i].Render();
						results[i].Rendered.appendTo(columnContainers[(i % renderColumns)]);
					}
					var divContainer = $('<div/>').css('width', '100%').css('padding', '0').css('margin', '0');
					for (var i = 0; i < columnContainers.length; i++) {
						columnContainers[i].appendTo(divContainer);
					}
					divContainer.appendTo(searchOptions.resultsContainer);
					$('<div/>').css('width', '100%').css('clear', 'both').appendTo(searchOptions.resultsContainer);
				}
				else {
					var ulContainer = $('<ul/>');
					for (var i = 0; i < results.length; i++) {
						if (results[i].Rendered == null)
							results[i].Render();
						results[i].Rendered.appendTo(ulContainer);
					}
					ulContainer.appendTo(searchOptions.resultsContainer);
				}
			}
			else {
				$('<h4/>').css('font-size', 'larger').text('Search Yields No Results').appendTo(searchOptions.resultsContainer);
			}
			$('<br/>').appendTo(searchOptions.resultsContainer);
			if (searchOptions.showLoadingResults)
				_hideLoadingResults();
		}

		_initialize();

		if (searchOptions.initialClass != null)
			searchElement.addClass(searchOptions.initialClass);
		searchElement.val(searchOptions.defaultText);

		return (this.unbind('focus.jsonsssearch').bind('focus.jsonsssearch', _focus).unbind('keypress.jsonsssearch').bind('keypress.jsonsssearch', _search).unbind('keydown.jsonsssearch').bind('keydown.jsonsssearch', _search));
	}

	/* Default configuration */
	$.fn.JsonServerSideSearch.defaults = {
		defaultText: 'Search',
		searchItems: null,
		filterOnProperties: [], /* Used to determine what properties the user can filter on. Type can be 'Text' or 'Boolean'. Array of objects in this format: [{Property:'FirstName',DisplayText:'First Name',Type:'Text',DefaultValue:'Shawn',Key:true}] */
		keyProperties: [], /* Used to determine what filters can be applied to the individual keys. Array of objects in this format: [{Property:'NameOfPropertyWhereKeyIsTrue',FilterOnProperties: ['MiddleName','LastName']}] */
		keyFiltersContainer: '#JsonServerSideSearchKeyFilters',
		filtersContainer: '#JsonServerSideSearchFilters',
		resultsContainer: '#JsonServerSideSearchResults',
		loadPreviousResultsButton: null,
		clearResultsButton: null,
		initialClass: null,
		callbackOnInitialize: null,
		callbackOnSearch: null,
		callbackOnComplete: null,
		callbackOnUpdateKeyFilters: null,
		callbackOnUpdateFilters: null,
		callbackOnUpdateKeyFiltersCompleted: null,
		callbackOnUpdateFiltersCompleted: null,
		callbackOnRenderResults: null,
		callbackOnRenderResultsCompleted: null,
		callbackOnFocus: null,
		callbackOnBlur: null,
		overlayOpacity: 0.3,
		overlayColor: '#666',
		showLoadingResults: true,
		searchKeyPressTimeout: 500,
		columns: 1
	};
})(jQuery);
