(function($) { $.fn.dadasuggest = function(options) { var defaults = { "suggestURL": "suggest.php", "searchSelectURL": "search.php", "searchEnterURL": "search.php", "suggestURLParams": {}, "startSearchUrlQueryString": "?q=", "goSearchOnSelect": true, "autoHideSuggestions": true, "loopArrowKeys": true, "autocompleteArrowKeys": true, "autocompletePointerHover": false, "autocompleteRevert": false, "minLength": 3, "maxLength": 30, "ajaxInterval": 1000, "useAjaxInterval": true, "responseType": "json", "requestType": "POST", "suggestionsContainer": "suggestionsWrapper", "ulID": "suggestionsULDefaultDadaSuggest", "liClass": "suggestionLIDefaultDadaSuggest", "liHoverClass": "suggestionLIDefaultDadaSuggestHover", "buttonID": "searchGO", "liIdSuffixUnique": "" }; var options = $.extend(defaults, options); var keys = new Array(); var vals = new Array(); var liText = new Array(); var tmp = new Array(); var start = "<ul id='" + options.ulID + "'>"; var end = "</ul>"; var middle = ""; var aux = ""; var currli = -1; var prevli = 0; var lisize = 0; var saved = ""; var firstAjax = true; var firstAjaxLength = 0; var previousAjax = (new Date().getTime()) - 1000; var currentAjax; var searchBox; $("#" + options.suggestionsContainer).html(""); function addToCache(key, val) { var pos = $.inArray(key, keys); if (pos == -1) { keys.push(key); vals.push(val) } else { vals[pos] = val } } function getFromCache(key) { var pos = $.inArray(key, keys); return ((pos != -1) ? vals[pos] : "") } function isOnTrack(item) { var ret = false; var str = ""; if (liText.length != 0) { $.each(liText[liText.length - 1], function(key, val) { if (val.toLowerCase().indexOf(item.toLowerCase()) != -1) { ret = true; str += val } }); if (str != "") { $("#" + options.suggestionsContainer).html(start + str + end) } bindEvents(searchBox) } return ret } function bindEvents(elem) { $("." + options.liClass).bind("click", function(me) { elem.val($(this).html()); if (options.goSearchOnSelect) { 

window.open (options.searchSelectURL + $(this).attr("id"))

 } }).hover(function() { if (options.autocompletePointerHover) { elem.val($(this).html()) } if (currli != -1) { $($("#" + options.ulID).children().get(currli)).addClass(options.liClass); $($("#" + options.ulID).children().get(currli)).removeClass(options.liHoverClass) } currli = $("#" + options.ulID).children().index(this); $(this).addClass(options.liHoverClass); $(this).removeClass(options.liClass) }, function() { $(this).addClass(options.liClass); $(this).removeClass(options.liHoverClass) }) } return this.each(function() { var obj = $(this); searchBox = obj; var query = ""; if ($("#" + options.buttonID)) { $("#" + options.buttonID).bind("click", function(t) { var qry = $.trim(obj.val()); if (qry) { var selectExistsBtn = false; var paramsBtn = ""; var locSelectBtn = options.searchSelectURL; var locEnterBtn = options.searchEnterURL + options.startSearchUrlQueryString + qry; $.each($("#" + options.ulID).children(), function(i, li) { if ($(li).html().toLowerCase() == qry.toLowerCase()) { if (!selectExistsBtn) { locSelectBtn += $(li).attr("id") } selectExistsBtn = true } }); location.href = selectExistsBtn ? locSelectBtn : locEnterBtn } }) } if (options.autoHideSuggestions) { $("*").bind("click", function(t) { if ($(this).attr("id") != options.buttonID) { $("#" + options.suggestionsContainer).html("") } }) } obj.bind("keyup", function(e) { query = $.trim(obj.val()); lisize = $("#" + options.ulID).children().length; if (query.length >= options.minLength) { if ((e.which >= 37) && (e.which <= 40)) { if (lisize > 0) { prevli = (currli == -1) ? 0 : currli; if ((e.which == 39) || (e.which == 40)) { if (options.loopArrowKeys) { currli = (currli == (lisize - 1)) ? 0 : (currli + 1) } else { currli = (currli == (lisize - 1)) ? (lisize - 1) : (currli + 1) } } else { if (options.loopArrowKeys) { currli = (currli <= 0) ? (lisize - 1) : (currli - 1) } else { currli = (currli <= 0) ? 0 : (currli - 1) } } $($("#" + options.ulID).children().get(prevli)).addClass(options.liClass); $($("#" + options.ulID).children().get(prevli)).removeClass(options.liHoverClass); $($("#" + options.ulID).children().get(currli)).addClass(options.liHoverClass); $($("#" + options.ulID).children().get(currli)).removeClass(options.liClass); if (options.autocompleteArrowKeys) { obj.val($($("#" + options.ulID).children().get(currli)).html()) } } } else { saved = query; if (e.which != 13) { if (false) { $("#" + options.suggestionsContainer).html(start + getFromCache(query) + end); bindEvents(obj) } else if (true) { currentAjax = new Date().getTime(); if ((query.length <= options.maxLength) && (!options.useAjaxInterval || (options.useAjaxInterval && (currentAjax - previousAjax >= options.ajaxInterval)))) { if (true) { previousAjax = currentAjax; options.suggestURLParams.q = query; options.suggestURLParams.timestamp = new Date().getTime().toString(); $.ajax({ url: options.suggestURL, dataType: options.responseType.toLowerCase(), type: options.requestType.toUpperCase(), data: options.suggestURLParams, error: function(response) { $("#" + options.suggestionsContainer).html("") }, success: function(response) { middle = ""; aux = ""; tmp.length = 0; switch (options.responseType.toLowerCase()) { case 'json': $.each(response, function(n, record) { aux = "<li class='" + options.liClass + "' id='" + record.urlParams + options.liIdSuffixUnique + "'>" + record.text + "</li>"; middle += aux; tmp.push(aux) }); break; case 'xml': break; case 'html': break; case 'text': break; case 'script': break; default: break } liText.push(tmp); addToCache(query, middle); if (middle != "") { $("#" + options.suggestionsContainer).html(start + middle + end); bindEvents(obj) } else if ($("#" + options.suggestionsContainer).html() != "") { $("#" + options.suggestionsContainer).html("") } } }); firstAjax = true; firstAjaxLength = query.length } } } } else { obj.val($.trim(obj.val())); if (obj.val()) { var selectExists = false; var params = ""; var locSelect = options.searchSelectURL; var locEnter = options.searchEnterURL + options.startSearchUrlQueryString + obj.val(); $.each($("#" + options.ulID).children(), function(i, li) { if ($(li).html().toLowerCase() == obj.val().toLowerCase()) { if (!selectExists) { locSelect += $(li).attr("id") } selectExists = true } }); location.href = selectExists ? locSelect : locEnter } } } } else { firstAjax = false; $("#" + options.suggestionsContainer).html("") } }).bind("click", function(e) { if (options.autocompleteRevert && (obj.val().length >= options.minLength)) { obj.val(saved) } }) }) } })(jQuery);