(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=false;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){location.href=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(getFromCache(query)!=""){$("#"+options.suggestionsContainer).html(start+getFromCache(query)+end);bindEvents(obj)}else if(!isOnTrack(query)){currentAjax=new Date().getTime();if((query.length<=options.maxLength)&&(!options.useAjaxInterval||(options.useAjaxInterval&&(currentAjax-previousAjax>=options.ajaxInterval)))){if(!firstAjax&&(e.which!=8)){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);