
(function($){var self=null;$.fn.autoComplete=function(o){o=jQuery.extend({valueSep:undefined,minChars:1,meth:"get",varName:"input",className:"autocomplete",timeout:3000,delay:500,offsetY:0,showNoResults:true,noResults:"No results were found.",showMoreResults:false,moreResults:"More results were found",cache:true,maxEntries:25,maxResults:25,onAjaxError:null,maxHeight:0,setWidth:false,minWidth:100,maxWidth:200,useNotifier:true,showAnimProperties:{height:'100%'},showAnimSpeed:'slow',showAnimEasing:'swing',hideAnimProperties:{height:'0'},hideAnimSpeed:'slow',hideAnimEasing:'swing'},o);return this.each(function(){new $.autoComplete(this,o);});};$.autoComplete=function(e,o){this.field=$(e);this.options=jQuery.extend(o,this.options);this.KEY_UP=38;this.KEY_DOWN=40;this.KEY_ESC=27;this.KEY_RETURN=13;this.KEY_TAB=9;this.KEY_HOME=36;this.KEY_END=35;this.KEY_PAGEUP=33;this.KEY_PAGEDOWN=34;this.init();};$.autoComplete.prototype={init:function(){var self=this;this.sInp="";this.nInpC=0;this.aSug=[];this.iHigh=0;this.lastHeight=0;this.lastKey=0;this.lastEvent='';$(document).click(function(){if($('#'+self.acID).length){self.clearSuggestions();}});this.field.click(function(e){e.stopPropagation();});if(this.options.useNotifier)this.field.addClass('ac_field');this.field.keydown(function(e){return self.handleKeyEvent(e);});this.field.keypress(function(e){return self.handleKeyEvent(e);});this.field.keyup(function(e){if(!e)e=window.event;var key=e.keyCode||e.which;self.lastKey=0;self.lastEvent='';if(key!=self.KEY_RETURN&&key!=self.KEY_TAB&&key!=self.KEY_ESC&&key!=self.KEY_UP&&key!=self.KEY_DOWN&&key!=self.KEY_PAGEDOWN&&key!=self.KEY_PAGEUP){self.resetTimeout();self.getSuggestions(self.field.val());}
return true;});this.field.blur(function(){self.resetTimeout();return true;});this.field.attr('Autocomplete','off');},handleKeyEvent:function(e){if(!e)e=window.event;var key=e.keyCode||e.which;var returnVal=true;var self=this;var changeCount=1;if($('#'+self.acID).length){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey){switch(key)
{case self.KEY_RETURN:self.setHighlightedValue();e.stopPropagation();returnVal=false;break;case self.KEY_TAB:self.setHighlightedValue();returnVal=false;break;case self.KEY_ESC:self.clearSuggestions();e.stopPropagation();returnVal=false;break;case self.KEY_HOME:case self.KEY_END:self.changeHighlight(key,$('#ac_ul').children().length);e.stopPropagation();returnVal=false;break;case self.KEY_PAGEUP:case self.KEY_PAGEDOWN:if(this.options.maxHeight>0){changeCount=($("#ac_ul").height()-($(".ac_highlight").outerHeight()/2))/$(".ac_highlight").outerHeight();changeCount=Math.floor(changeCount-0.5);}else{changeCount=10;}
case self.KEY_UP:case self.KEY_DOWN:if(e.type=='keydown'||(self.lastEvent!='keydown'&&self.lastKey==key)||self.lastKey!=key){if($('#'+self.acID).length){self.changeHighlight(key,changeCount);}}
returnVal=false;break;}}}
self.lastKey=key;self.lastEvent=e.type;return returnVal;},getSuggestions:function(val){var lastInput=this.getLastInput(val);var self=this;if(val==this.sInp)return false;this.lastHeight=$('#'+this.acID).height();if(this.lastHeight==null){this.lastHeight=0;}
this.sInp=val;if(lastInput.length<this.options.minChars)
{this.aSug=[];this.nInpC=val.length;self.clearSuggestions();return false;}
var ol=this.nInpC;this.nInpC=val.length?val.length:0;var l=this.aSug.length;if(this.options.cache&&(this.nInpC>ol)&&l&&(l<this.options.maxEntries))
{var arr=new Array();var oldval='';$(this.aSug).each(function(i){if(oldval==this.value)return true;oldval=this.value;if(this.value.toLowerCase().indexOf(lastInput.toLowerCase())!=-1)
arr.push(this);});this.aSug=arr;this.createList(this.aSug);}
else
{clearTimeout(this.ajID);this.ajID=setTimeout(function(){self.doAjaxRequest(self.sInp);},this.options.delay);}
document.helper=this;return false;},getLastInput:function(str){var ret=str;if(undefined!=this.options.valueSep){var idx=ret.lastIndexOf(this.options.valueSep);ret=idx==-1?ret:ret.substring(idx+1,ret.length);}
return ret;},doAjaxRequest:function(input){this.sInp=this.getLastInput(this.sInp);if(typeof this.options.script=='undefined')
throw('You have to specify a server script to make ajax calls!');else if(typeof this.options.script=='function')
var url=this.options.script(encodeURIComponent(this.sInp));else
var url=this.options.script+this.options.varName+'='+encodeURIComponent(this.sInp);if(!url||$.trim(input)==''||$.trim(this.sInp)==''){self.clearSuggestions();return false;}else if(input!=this.field.val()){return false;}
var self=this;if(this.options.useNotifier)this.field.removeClass('ac_field').addClass('ac_field_busy');var options={url:url,type:self.options.meth,success:function(req)
{$('#'+this.acID).remove();self.setSuggestions(req,input);},error:(typeof self.options.onAjaxError=='function')?function(status){$('#'+this.acID).remove();self.options.onAjaxError(status);}:function(status){$('#'+this.acID).remove();},complete:function(){if(self.options.useNotifier)
{self.field.removeClass('ac_field_busy').addClass('ac_field');}}};$.ajax(options);},setSuggestions:function(req,input)
{if(input!=this.field.val())
return false;if(this.options.json){this.aSug=req.results;if(!this.aSug){var jsondata=eval('('+req+')');this.aSug=jsondata.results;}}else{var results=req.getElementsByTagName('results')[0].childNodes;this.aSug=[];for(var i=0;i<results.length;i++)
{if(results[i].hasChildNodes())
this.aSug.push({'id':results[i].getAttribute('id'),'value':results[i].childNodes[0].nodeValue,'info':results[i].getAttribute('info')});}}
this.acID='ac_'+this.field.attr('id');this.createList(this.aSug);},createList:function(arr)
{var self=this;$('#'+this.acID).remove();this.killTimeout();if(arr.length==0&&!this.options.showNoResults)return false;var div=$('<div></div>').addClass(this.options.className).attr('id',this.acID);var hcorner=$('<div></div>').addClass('ac_corner');var header=$('<div></div>').addClass('ac_header');header.append(hcorner);div.append($('<div></div>').addClass(this.options.className+'_inner1').append($('<div></div>').addClass(this.options.className+'_inner2')));div.append(header);var ul=$('<ul></ul>').attr('id','ac_ul');if(arr.length==0&&this.options.showNoResults)
{var li=$('<li></li>').addClass('ac_warning').html(this.options.noResults);ul.append(li);}
else
{var lastInput=this.getLastInput(this.sInp);for(var i=0;i<arr.length&&i<self.options.maxResults;i++){var val=arr[i].value;var st=val.toLowerCase().lastIndexOf(lastInput.toLowerCase());var output=(st===-1)?val:val.substring(0,st)+'<em>'+val.substring(st,st+lastInput.length)+'</em>'+val.substring(st+lastInput.length);var span=$('<span></span>').html(output);if(this.info!='')
{var br=$('<br/>');span.append(br);var small=$('<small></small>').html(arr[i].info);span.append(small);}
var a=$('<a></a>').attr('href','#');var tl=$('<span></span>').addClass('tl').html('&nbsp;');var tr=$('<span></span>').addClass('tr').html('&nbsp;');a.append(tl);a.append(tr);a.append(span).attr('rel',i);a.click(function(e){self.setHighlightedValue();return false;});a.mouseover(function(e){self.setHighlight($(this).attr('rel'));});var li=$('<li></li>').html(a);ul.append(li);}
if(arr.length>self.options.maxResults&&this.options.showMoreResults){var li=$('<li></li>').addClass('ac_message').html(this.options.moreResults);ul.append(li);}}
div.append(ul);ul.scroll(function(){$("#ac_ul").addClass("ac_tmpClass").removeClass("ac_tmpClass");});var fcorner=$('<div></div>').addClass('ac_corner');var footer=$('<div></div>').addClass('ac_footer');footer.append(fcorner);div.append(footer);var pos=this.field.offset();var w=(this.options.setWidth&&this.field.outerWidth()<this.options.minWidth)?this.options.minWidth:(this.options.setWidth&&this.field.outerWidth()>this.options.maxWidth)?this.options.maxWidth:this.field.outerWidth();div.css('left',pos.left).css('top',pos.top+this.field.outerHeight()+this.options.offsetY).width(w).css('min-height',this.options.maxHeight>0?'20px':'').css('max-height',this.options.maxHeight>0?this.options.maxHeight+'px':'').mouseover(function(){self.killTimeout();}).mouseout(function(){self.resetTimeout();});$(document.body).append(div);if(this.options.maxHeight>0){if($.browser.msie){var tmpDiv=$('<div style="width:100px; height:100px; overflow:hidden; position:absolute; top:-1000px; left:-1000px;"></div>');var tmpInnerDiv=$('<div style="height:200px;">');$(document.body).append(tmpDiv.append(tmpInnerDiv));var width1=tmpInnerDiv.innerWidth();tmpDiv.css('overflow-y','scroll');var width2=tmpInnerDiv.innerWidth();tmpDiv.remove();var scrollbarWidth=width1-width2;if($.browser.version<7){ul.height("100%");if(div.outerHeight()>this.options.maxHeight-((header.outerHeight(true)+footer.outerHeight(true))*2)){div.css('height',this.options.maxHeight-((header.outerHeight(true)+footer.outerHeight(true))*2)+'px');ul.css({'padding-right':scrollbarWidth,'overflow-x':'hidden'});ul.width(ul.width()-scrollbarWidth);}}else if($.browser.version<8){ul.height(div.height()-(header.outerHeight(true)+footer.outerHeight(true)));if(ul[0].scrollHeight>ul[0].offsetHeight){ul.css({'padding-right':scrollbarWidth+'px','overflow-x':'hidden'});}}else{ul.height(div.height()-(header.outerHeight(true)+footer.outerHeight(true)));}}else{ul.height(div.height()-(header.outerHeight(true)+footer.outerHeight(true)));if(div.height()<this.options.maxHeight){ul.css('overflow','hidden');ul.scrollTop(0);}}}else{ul.css('overflow','hidden');}
var divHeight=div.height();var divDisplay=div.css('display');if(this.options.showAnimProperties.width){this.options.showAnimProperties.width=w+'px';}
var startHeight=this.options.showAnimProperties.height?(this.lastHeight?this.lastHeight:0):divHeight;this.options.showAnimProperties.height=divHeight;div.height(startHeight).addClass("ac_tmpClass").removeClass("ac_tmpClass").width(this.options.showAnimProperties.width&&!this.lastHeight?0:w).css('opacity',this.options.showAnimProperties.opacity&&!this.lastHeight?0:div.css('opacity')).css('display',divDisplay).animate(this.options.showAnimProperties,{easing:this.options.showAnimEasing,duration:this.options.showAnimSpeed});this.setHighlight(0);if(this.options.timeout>0){this.toID=setTimeout(function(){self.clearSuggestions();},this.options.timeout);}
div.click(function(e){e.stopPropagation();});},changeHighlight:function(key,count){var list=$('#ac_ul');if(!list.length)return false;var n=(key==this.KEY_DOWN||key==this.KEY_PAGEDOWN||key==this.KEY_END)?this.iHigh+count:this.iHigh-count;n=(n>=list.children().length)?list.children().length-1:((n<0)?0:n);this.setHighlight(n);var totalTop=$(".ac_highlight").position().top-$("#ac_ul").position().top+$(".ac_header").outerHeight(true)+$(".ac_header").position().top;if(totalTop+$(".ac_highlight").outerHeight()>$("#ac_ul").height()){$("#ac_ul").scrollTop($("#ac_ul").scrollTop()+((totalTop+$(".ac_highlight").outerHeight())-$("#ac_ul").height()));}else if(totalTop<0){$("#ac_ul").scrollTop($("#ac_ul").scrollTop()+totalTop);}},setHighlight:function(n){var list=$('#ac_ul');if(!list.length)return false;this.iHigh=Number(n);list.children().removeClass('ac_highlight').eq(this.iHigh).addClass('ac_highlight');this.killTimeout();},clearHighlight:function(){var list=$('#ac_ul');if(!list.length)return false;list.children().removeClass('ac_highlight');this.iHigh=0;},setHighlightedValue:function(){if(this.iHigh>=0)
{if(!this.aSug[this.iHigh])return;if(null!=this.options.valueSep)
{var str=this.getLastInput(this.field.val());var idx=this.field.val().lastIndexOf(str);str=this.aSug[this.iHigh].value+this.options.valueSep;this.sInp=idx==-1?str:this.field.val().substring(0,idx)+str;this.field.val(this.sInp);}
else
{var str=this.getLastInput(this.field.val());var idx=this.field.val().lastIndexOf(str);str=this.aSug[this.iHigh].value;this.sInp=idx==-1?str:this.field.val().substring(0,idx)+str;this.field.val(this.sInp);}
this.field.focus();if(this.field.selectionStart)
{this.field.setSelectionRange(this.sInp.length,this.sInp.length);}
this.clearSuggestions();if(typeof this.options.callback=='function')
this.options.callback(this.aSug[this.iHigh]);}
this.aSug=[];},killTimeout:function(){clearTimeout(this.toID);},resetTimeout:function(){this.killTimeout();var self=this;if(self.options.timeout>0){this.toID=setTimeout(function(){self.clearSuggestions();},self.options.timeout);}},clearSuggestions:function(){this.killTimeout();$('#'+this.acID).animate(this.options.hideAnimProperties,{easing:this.options.hideAnimEasing,duration:this.options.hideAnimSpeed,complete:function(){$(this).remove();}});}}})(jQuery);
