/*
 * jQuery Autocomplete plugin 1.2
 *
 * Copyright (c) 2009 Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
 * Revision: 2009-12-05 16:15 Tom Flídr fixed mishmash with very fast typing text - very internal functionality of this plugin
 */

(function($){$.fn.extend({autocomplete:function(b,c){var d=typeof(b)=="string";c=$.extend({},$.Autocompleter.defaults,{url:d?b:null,data:d?null:b,delay:d?$.Autocompleter.defaults.delay:10,max:c&&!c.scroll?10:150},c);c.highlight=c.highlight||function(a){return a};c.formatMatch=c.formatMatch||c.formatItem;return this.each(function(){new $.Autocompleter(this,c)})},result:function(a){return this.bind("result",a)},search:function(a){return this.trigger("search",[a])},flushCache:function(){return this.trigger("flushCache")},setOptions:function(a){return this.trigger("setOptions",[a])},unautocomplete:function(){return this.trigger("unautocomplete")}});$.Autocompleter=function(h,j){var k={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var l=$(h).attr("autocomplete","off").addClass(j.inputClass);var m;var n="";var o=$.Autocompleter.Cache(j);var p=0;var r;var s={mouseDownOnSelect:false};var t=$.Autocompleter.Select(j,h,selectCurrent,s);var u;var w=false;var x=[];$.browser.opera&&$(h.form).bind("submit.autocomplete",function(){if(u){u=false;return false}});l.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(a){p=1;r=a.keyCode;switch(a.keyCode){case k.UP:a.preventDefault();if(t.visible()){t.prev()}else{onChange(0,true)};break;case k.DOWN:a.preventDefault();if(t.visible()){t.next()}else{onChange(0,true)};break;case k.PAGEUP:a.preventDefault();if(t.visible()){t.pageUp()}else{onChange(0,true)};break;case k.PAGEDOWN:a.preventDefault();if(t.visible()){t.pageDown()}else{onChange(0,true)};break;case j.multiple&&$.trim(j.multipleSeparator)==","&&k.COMMA:case k.TAB:case k.RETURN:if(selectCurrent()){a.preventDefault();u=true;return false};break;case k.ESC:t.hide();break;default:clearTimeout(m);m=setTimeout(onChange,j.delay);break}}).focus(function(){p++}).blur(function(){p=0;if(!s.mouseDownOnSelect){hideResults()}}).click(function(){if(p++>1&&!t.visible()){onChange(0,true)}}).bind("search",function(){var c=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,a){var b;if(a&&a.length){for(var i=0;i<a.length;i++){if(a[i].result.toLowerCase()==q.toLowerCase()){b=a[i];break}}};if(typeof(c)=="function"){c(b)}else{l.trigger("result",b&&[b.data,b.value])}};$.each(trimWords(l.val()),function(i,a){request(a,findValueCallback,findValueCallback)})}).bind("flushCache",function(){o.flush()}).bind("setOptions",function(){$.extend(j,arguments[1]);if("data"in arguments[1]){o.populate()}}).bind("unautocomplete",function(){t.unbind();l.unbind();$(h.form).unbind(".autocomplete")});function selectCurrent(){var b=t.selected();if(!b){return false};var v=b.result;n=v;if(j.multiple){var c=trimWords(l.val());if(c.length>1){var d=j.multipleSeparator.length;var e=$(h).selection().start;var f,progress=0;$.each(c,function(i,a){progress+=a.length;if(e<=progress){f=i;return false};progress+=d});c[f]=v;v=c.join(j.multipleSeparator)}v+=j.multipleSeparator};l.val(v);hideResultsNow();l.trigger("result",[b.data,b.value]);return true};function onChange(a,b){if(r==k.DEL){t.hide();return};var c=l.val();if(!b&&c==n){return};n=c;c=lastWord(c);if(c.length>=j.minChars){l.addClass(j.loadingClass);if(!j.matchCase){c=c.toLowerCase()};request(c,receiveData,hideResultsNow)}else{stopLoading();t.hide()}};function trimWords(b){if(!b){return[""]};if(!j.multiple){return[$.trim(b)]};return $.map(b.split(j.multipleSeparator),function(a){return $.trim(b).length?$.trim(a):null})};function lastWord(a){if(!j.multiple){return a};var b=trimWords(a);if(b.length==1){return b[0]};var c=$(h).selection().start;if(c==a.length){b=trimWords(a)}else{b=trimWords(a.replace(a.substring(c),""))};return b[b.length-1]};function autoFill(q,a){if(j.autoFill&&(lastWord(l.val()).toLowerCase()==q.toLowerCase())&&r!=k.BACKSPACE){l.val(l.val()+a.substring(lastWord(n).length));$(h).selection(n.length,n.length+a.length)}};function hideResults(){clearTimeout(m);m=setTimeout(hideResultsNow,200)};function hideResultsNow(){var c=t.visible();t.hide();clearTimeout(m);stopLoading();if(j.mustMatch){l.search(function(a){if(!a){if(j.multiple){var b=trimWords(l.val()).slice(0,-1);l.val(b.join(j.multipleSeparator)+(b.length?j.multipleSeparator:""))}else{l.val("");l.trigger("result",null)}}})}};function receiveData(q,a){if(a&&a.length&&p){stopLoading();t.display(a,q);autoFill(q,a[0].value);t.show()}else{hideResultsNow()}};function callRequestFromRequestCache(){w=false;if(x.length>0){var a=x.shift();request(a[0],a[1],a[2])}};function request(c,d,e){if(w){x.push([c,d,e])}else{w=true;if(!j.matchCase){c=c.toLowerCase()};var f=o.load(c);if(f&&f.length){d(c,f);callRequestFromRequestCache()}else if((typeof(j.url)=="string")&&(j.url.length>0)){var g={timestamp:+new Date()};$.each(j.extraParams,function(a,b){g[a]=(typeof(b)=="function")?b():b});$.ajax({mode:"abort",port:"autocomplete"+h.name,dataType:j.dataType,url:j.url,data:$.extend({q:lastWord(c),limit:j.max},g),success:function(a){var b=j.parse&&j.parse(a)||parse(a);o.add(c,b);d(c,b);callRequestFromRequestCache()}})}else{t.emptyList();e(c);callRequestFromRequestCache()}}};function parse(a){var b=[];var c=a.split("\n");for(var i=0;i<c.length;i++){var d=$.trim(c[i]);if(d){d=d.split("|");b[b.length]={data:d,value:d[0],result:j.formatResult&&j.formatResult(d,d[0])||d[0]}}};return b};function stopLoading(){l.removeClass(j.loadingClass)}};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(a){return a[0]},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(a,b){return a.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>")},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(h){var j={};var l=0;function matchSubset(s,a){if(!h.matchCase){s=s.toLowerCase()};var i=s.indexOf(a);if(h.matchContains=="word"){i=s.toLowerCase().search("\\b"+a.toLowerCase())};if(i==-1){return false};return i==0||h.matchContains};function add(q,a){if(l>h.cacheLength){flush()};if(!j[q]){l++};j[q]=a};function populate(){if(!h.data){return false};var b={};var c=0;if(!h.url){h.cacheLength=1};b[""]=[];for(var i=0,ol=h.data.length;i<ol;i++){var d=h.data[i];d=(typeof(d)=="string")?[d]:d;var e=h.formatMatch(d,i+1,h.data.length);if(e===false){continue};var f=e.charAt(0).toLowerCase();if(!b[f]){b[f]=[]};var g={value:e,data:d,result:h.formatResult&&h.formatResult(d)||e};b[f].push(g);if(c++<h.max){b[""].push(g)}};$.each(b,function(i,a){h.cacheLength++;add(i,a)})};setTimeout(populate,25);function flush(){j={};l=0};return{flush:flush,add:add,populate:populate,load:function(q){if(!h.cacheLength||!l){return null};if(!h.url&&h.matchContains){var a=[];for(var k in j){if(k.length>0){var c=j[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){a.push(x)}})}};return a}else if(j[q]){return j[q]}else if(h.matchSubset){for(var i=q.length-1;i>=h.minChars;i--){var c=j[q.substr(0,i)];if(c){var a=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){a[a.length]=x}});return a}}};return null}}};$.Autocompleter.Select=function(e,f,g,h){var j={ACTIVE:"ac_over"};var k;var l=-1;var m;var n="";var o=true;var p;var r;function init(){if(!o){return};p=$("<div/>").hide().addClass(e.resultsClass).css("position","absolute").appendTo(document.body);r=$("<ul/>").appendTo(p).mouseover(function(a){if(target(a).nodeName&&target(a).nodeName.toUpperCase()=='LI'){l=$("li",r).removeClass(j.ACTIVE).index(target(a));$(target(a)).addClass(j.ACTIVE)}}).click(function(a){$(target(a)).addClass(j.ACTIVE);g();f.focus();return false}).mousedown(function(){h.mouseDownOnSelect=true}).mouseup(function(){h.mouseDownOnSelect=false});if(e.width>0){p.css("width",e.width)};o=false};function target(a){var b=a.target;while(b&&b.tagName!="LI"){b=b.parentNode};if(!b){return[]};return b};function moveSelect(a){k.slice(l,l+1).removeClass(j.ACTIVE);movePosition(a);var b=k.slice(l,l+1).addClass(j.ACTIVE);if(e.scroll){var c=0;k.slice(0,l).each(function(){c+=this.offsetHeight});if((c+b[0].offsetHeight-r.scrollTop())>r[0].clientHeight){r.scrollTop(c+b[0].offsetHeight-r.innerHeight())}else if(c<r.scrollTop()){r.scrollTop(c)}}};function movePosition(a){l+=a;if(l<0){l=k.size()-1}else if(l>=k.size()){l=0}};function limitNumberOfItems(a){return(e.max&&e.max<a)?e.max:a};function fillList(){r.empty();var a=limitNumberOfItems(m.length);for(var i=0;i<a;i++){if(!m[i]){continue};var b=e.formatItem(m[i].data,i+1,a,m[i].value,n);if(b===false){continue};var c=$("<li/>").html(e.highlight(b,n)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(r)[0];$.data(c,"ac_data",m[i])};k=r.find("li");if(e.selectFirst){k.slice(0,1).addClass(j.ACTIVE);l=0};if($.fn.bgiframe){r.bgiframe()}};return{display:function(d,q){init();m=d;n=q;fillList()},next:function(){moveSelect(1)},prev:function(){moveSelect(-1)},pageUp:function(){if(l!=0&&l-8<0){moveSelect(-l)}else{moveSelect(-8)}},pageDown:function(){if(l!=k.size()-1&&l+8>k.size()){moveSelect(k.size()-1-l)}else{moveSelect(8)}},hide:function(){p&&p.hide();k&&k.removeClass(j.ACTIVE);l=-1},visible:function(){return p&&p.is(":visible")},current:function(){return this.visible()&&(k.filter("."+j.ACTIVE)[0]||e.selectFirst&&k[0])},show:function(){var a=$(f).offset();p.css({width:typeof(e.width)=="string"||e.width>0?e.width:$(f).width()+13,top:a.top+f.offsetHeight,left:a.left}).show();if(e.scroll){r.scrollTop(0);r.css({maxHeight:e.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof(document.body.style.maxHeight)==="undefined"){var b=0;k.each(function(){b+=this.offsetHeight});var c=b>e.scrollHeight;r.css('height',c?e.scrollHeight:b);if(!c){k.width(r.width()-parseInt(k.css("padding-left"))-parseInt(k.css("padding-right")))}}}},selected:function(){var a=k&&k.filter("."+j.ACTIVE).removeClass(j.ACTIVE);return a&&a.length&&$.data(a[0],"ac_data")},emptyList:function(){r&&r.empty()},unbind:function(){p&&p.remove()}}};$.fn.selection=function(b,c){if(b!==undefined){return this.each(function(){if(this.createTextRange){var a=this.createTextRange();if(c===undefined||b==c){a.move("character",b);a.select()}else{a.collapse(true);a.moveStart("character",b);a.moveEnd("character",c);a.select()}}else if(this.setSelectionRange){this.setSelectionRange(b,c)}else if(this.selectionStart){this.selectionStart=b;this.selectionEnd=c}})};var d=this[0];if(d.createTextRange){var e=document.selection.createRange(),orig=d.value,teststring="<->",textLength=e.text.length;e.text=teststring;var f=d.value.indexOf(teststring);d.value=orig;this.selection(f,f+textLength);return{start:f,end:f+textLength}}else if(d.selectionStart!==undefined){return{start:d.selectionStart,end:d.selectionEnd}}}})(jQuery);
