/**
 * Autocomplete - jQuery Plugin
 * Creates autocomplete/autosuggest boxes, based on Ajax Autocomplete for jQuery (v1.1.3): http://www.devbridge.com/projects/autocomplete/jquery/
 *
 * Version: 1.0.0 (19/10/2010)
 * Requires: jQuery v1.3+
 *
 * @author    Peter Pettersson <peter@savea.se>
 * @copyright Copyright (c) 2009 - 2010 SAVEA NetPro Solutions AB
 * @license   http://www.opensource.org/licenses/mit-license.php  The MIT License
 */
(function(d){function o(b,a,c){a="("+c.replace(p,"\\$1")+")";return b.replace(RegExp(a,"i"),"<strong>$1</strong>")}function l(b,a){this.el=d(b);this.el.attr("autocomplete","off");this.suggestions=[];this.data=[];this.urls=[];this.badQueries=[];this.request=null;this.selectedIndex=-1;this.currentValue=this.el.val();this.intervalId=0;this.cachedResponse=[];this.onChangeInterval=null;this.ignoreValueChange=false;this.serviceUrl=a.serviceUrl;this.isLocal=false;this.options={autoSubmit:true,minChars:1,
maxHeight:300,deferRequestBy:300,width:0,highlight:true,params:{},fnFormatResult:o,delimiter:null,zIndex:9999};this.initialize();this.setOptions(a)}var p=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)","g");d.fn.autocomplete=function(b){return new l(this.get(0)||d("<input />"),b)};l.prototype={killerFn:null,initialize:function(){var b,a,c;b=this;a=Math.floor(Math.random()*1048576).toString(16);c="Autocomplete_"+a;this.killerFn=function(e){if(d(e.target).parents(".autocomplete").size()===
0){b.killSuggestions();b.disableKillerFn()}};if(!this.options.width)this.options.width=this.el.width();this.mainContainerId="AutocompleteContainter_"+a;d('<div id="'+this.mainContainerId+'" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="'+c+'" style="display:none; width:300px;"></div></div></div>').appendTo("body");this.container=d("#"+c);this.fixPosition();window.opera?this.el.keypress(function(e){b.onKeyPress(e)}):this.el.keydown(function(e){b.onKeyPress(e)});
this.el.keyup(function(e){b.onKeyUp(e)});this.el.blur(function(){b.enableKillerFn()});this.el.focus(function(){b.fixPosition()})},setOptions:function(b){var a=this.options;d.extend(a,b);if(a.lookup){this.isLocal=true;if(d.isArray(a.lookup))a.lookup={suggestions:a.lookup,data:[]}}d("#"+this.mainContainerId).css({zIndex:a.zIndex});this.container.css({width:a.width})},clearCache:function(){this.cachedResponse=[];this.badQueries=[]},disable:function(){this.disabled=true},enable:function(){this.disabled=
false},fixPosition:function(){var b=this.el.offset();d("#"+this.mainContainerId).css({top:b.top+this.el.innerHeight()+"px",left:b.left+"px"})},enableKillerFn:function(){d(document).bind("click",this.killerFn)},disableKillerFn:function(){d(document).unbind("click",this.killerFn)},killSuggestions:function(){var b=this;this.stopKillSuggestions();this.intervalId=window.setInterval(function(){b.hide();b.stopKillSuggestions()},300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},
onKeyPress:function(b){if(!(this.disabled||!this.enabled)){switch(b.keyCode){case 27:this.el.val(this.currentValue);this.hide();break;case 9:case 13:if(this.selectedIndex===-1){this.hide();return}this.select(this.selectedIndex);if(b.keyCode===9)return;break;case 38:this.moveUp();break;case 40:this.moveDown();break;default:return}b.stopImmediatePropagation();b.preventDefault()}},onKeyUp:function(b){if(!this.disabled){switch(b.keyCode){case 38:case 40:return}clearInterval(this.onChangeInterval);if(this.currentValue!==
this.el.val())if(this.options.deferRequestBy>0){var a=this;this.onChangeInterval=setInterval(function(){a.onValueChange()},this.options.deferRequestBy)}else this.onValueChange()}},onValueChange:function(){clearInterval(this.onChangeInterval);this.currentValue=this.el.val();var b=this.getQuery(this.currentValue);this.selectedIndex=-1;if(this.ignoreValueChange)this.ignoreValueChange=false;else b===""||b.length<this.options.minChars?this.hide():this.getSuggestions(b)},getQuery:function(b){var a;a=this.options.delimiter;
if(!a)return d.trim(b);b=b.split(a);return d.trim(b[b.length-1])},getSuggestionsLocal:function(b){var a,c,e,g,f;c=this.options.lookup;e=c.suggestions.length;a={suggestions:[],data:[]};b=b.toLowerCase();for(f=0;f<e;f++){g=c.suggestions[f];if(g.toLowerCase().indexOf(b)===0){a.suggestions.push(g);a.data.push(c.data[f])}}return a},getSuggestions:function(b){var a,c;if((a=this.isLocal?this.getSuggestionsLocal(b):this.cachedResponse[b])&&d.isArray(a.suggestions)){this.suggestions=a.suggestions;this.data=
a.data;this.urls=a.urls;this.suggest()}else if(!this.isBadQuery(b)){c=this;c.options.params.query=b;this.request=d.get(this.serviceUrl,c.options.params,function(e){c.processResponse(e)},"text")}},isBadQuery:function(b){for(var a=this.badQueries.length;a--;)if(b.indexOf(this.badQueries[a])===0)return true;return false},hide:function(){this.enabled=false;this.selectedIndex=-1;this.container.hide()},suggest:function(){if(this.suggestions.length===0)this.hide();else{var b,a,c,e,g,f,i,h,j,m,n;b=this;a=
this.suggestions.length;e=this.options.fnFormatResult;g=this.getQuery(this.currentValue);j="";m=function(k){return function(){b.activate(k)}};n=function(k){return function(){b.select(k)}};this.container.hide().empty();for(f=0;f<a;f++){i=this.suggestions[f];h=this.data[f];if(h!=j){c='<div class="category"><strong>'+h+"</strong></div>";this.container.append(c)}j=h;c=d((b.selectedIndex===f?'<div class="selected"':"<div")+' title="'+i+'">'+e(i,this.data[f],g)+"</div>");c.mouseover(m(f));c.click(n(f));
this.container.append(c)}this.enabled=true;this.container.show()}},processResponse:function(b){var a;try{a=eval("("+b+")")}catch(c){return}if(!d.isArray(a.data))a.data=[];if(!this.options.noCache){this.cachedResponse[a.query]=a;a.suggestions.length===0&&this.badQueries.push(a.query)}if(a.query===this.getQuery(this.currentValue)){this.suggestions=a.suggestions;this.data=a.data;this.urls=a.urls;this.suggest()}},activate:function(b){var a,c;a=this.container.children("div[class!=category]");this.selectedIndex!==
-1&&a.length>this.selectedIndex&&d(a.get(this.selectedIndex)).removeClass("selected");this.selectedIndex=b;if(this.selectedIndex!==-1&&a.length>this.selectedIndex){c=a.get(this.selectedIndex);d(c).addClass("selected")}return c},deactivate:function(b,a){b.className="";if(this.selectedIndex===a)this.selectedIndex=-1},select:function(b){var a;a=this.suggestions[b];selectedUrl=this.urls[b];if(a){this.el.val(a);if(this.options.autoSubmit)if(selectedUrl)window.location=selectedUrl;else{a=this.el.parents("form");
a.length>0&&a.get(0).submit()}this.ignoreValueChange=true;this.hide();this.onSelect(b)}},moveUp:function(){if(this.selectedIndex!==-1)if(this.selectedIndex===0){this.container.children("div[class!=category]").get(0).className="";this.selectedIndex=-1;this.el.val(this.currentValue)}else this.adjustScroll(this.selectedIndex-1)},moveDown:function(){this.selectedIndex!==this.suggestions.length-1&&this.adjustScroll(this.selectedIndex+1)},adjustScroll:function(b){var a,c,e;a=this.activate(b).offsetTop;
c=this.container.scrollTop();e=c+this.options.maxHeight-25;if(a<c)this.container.scrollTop(a);else a>e&&this.container.scrollTop(a-this.options.maxHeight+25);this.el.val(this.getValue(this.suggestions[b]))},onSelect:function(b){var a,c;a=this.options.onSelect;c=this.suggestions[b];b=this.data[b];this.el.val(this.getValue(c));d.isFunction(a)&&a(c,b,this.el)},getValue:function(b){var a,c;a=this.options.delimiter;if(!a)return b;c=this.currentValue;a=c.split(a);if(a.length===1)return b;return c.substr(0,
c.length-a[a.length-1].length)+b}}})(jQuery);

