(function($){$.fn.extend({suggest:function(options){return this.each(
function(){new $.suggestion(this,options)})},configure:function(options){
return this.trigger("configure",[options])},load:function(){
return this.trigger("load")},clear:function(){
return this.trigger("clear")}});$.suggestion=function(input,options){
var tagbox=input;var defaults={
field:"tags",url:"jsontags.php",tagsep:",",enclose:"",max:10,cache:true,delay:500,charMin:1,dblClick:true,
postData:null,visible:true,dataType:"json",onRenderItem:function(row){return decodeURIComponent(row.tag)},
onSelectItem:function(val){return true},onLoadList:function(filter){return true},onLoadedList:function(results){return true}};
var options=$.extend(defaults,options);var input=$("#"+options.field);$(input).attr("autocomplete","off");
var lookup=document.createElement("div");$(lookup).attr({id:"tagbox-lookup"});$(lookup,tagbox).show();
input.after(lookup);var lookuplst=document.createElement("ol");$(lookup,tagbox).append(lookuplst);
var cursor=-1;var length=0;var loading=false;var loaded=false;var cacheLst=null;var inserted=false;
var hidelookup=function(){$(lookuplst,tagbox).empty();$(lookup,tagbox).hide();loaded=false;cacheLst=null;inserted=false};
var insertTag=function(filter,tag){var cur=input.val();var words=tag.split(" ").length;
var enclose=(words>1)?options.enclose.length>0?options.enclose:"":"";cur=cur.replace(eval("/"+filter.replace(/\//g, "\\\/")+"$/i"),enclose+tag+enclose);
input.val(cur);cursor=-1};var addItem=function(val,filter,index){if(!options.visible){return}var row=val;
var val=options.onRenderItem(val,index,length,filter);var li=document.createElement("li");lookuplst.appendChild(li);
var aLink=document.createElement("a");$(aLink).attr({href:"#"});$(aLink,tagbox).text(val);$(aLink,tagbox).addClass(index%2==0?"td-odd":"td-even");
$(aLink,tagbox).html($(aLink,tagbox).text().replace(eval("/("+filter.replace(/\//g, "\\\/")+")/gi"),"<em>$1</em>"));li.appendChild(aLink);
$(aLink).click(function(e){options.onSelectItem(row);insertTag(filter,val);e.preventDefault();hidelookup();inserted=true;input.focus()})};
var loadList=function(){inserted=false;var filter=parseFilter(input.val());options.onLoadList(filter);$(lookuplst,tagbox).empty();
$.ajax({type:"POST",url:options.url,data:$.extend({tag:encodeURIComponent(filter),max:options.max},options.postData),dataType:options.dataType,cache:options.cache,success:function(json){$(lookuplst,tagbox).empty();length=json.length;cacheLst=json;cursor=-1;
for(i=0;i<json.length&&i<options.max;i++){addItem(json[i],filter,i)}
if(options.visible){$(lookup,tagbox).show()}loading=false;loaded=true;
options.onLoadedList(json)},error:function(XMLHttpRequest,textStatus,errorThrown){length=0;
cacheLst=null;loading=false;loaded=false;options.onLoadedList(false)}})};
var parseFilter=function(val){if(options.tagsep.length==0){return val}if(val.indexOf(options.tagsep)>-1){
if(options.tagsep==" "){val=val.substring(val.lastIndexOf(options.tagsep)+1,val.length)}else{
val=jQuery.trim(val.substring(val.lastIndexOf(options.tagsep)+1,val.length))}}return val};
var triggerLoad=function(){if(inserted){return false}else{var filter=parseFilter(input.val());
if(filter.length>=options.charMin){loading=true;setTimeout(function(){loadList()},options.delay)}else{hidelookup()}}};
$("*",input.form).focus(function(e){if(this.id==options.field){triggerLoad()}else{hidelookup()}});
input.dblclick(function(e){if(options.dblClick&&!loading){triggerLoad()}});$(lookuplst,tagbox).blur(function(e){hidelookup()});
var handleSpecials=function(e){var e=e||window.event;var key=e.charCode||e.keyCode;if(!loaded){return true}switch(key){
case 40:cursor=((cursor+1)<length)?cursor+1:cursor;if(cursor<length){$("li:eq("+cursor+")",tagbox).addClass("hl");
if((cursor-1)>-1){$("li:eq("+(cursor-1)+")",tagbox).removeClass("hl")}e.preventDefault()}break;case 38:cursor=(cursor-1>=0)?cursor-1:cursor;
if(cursor>=0){$("li:eq("+cursor+")",tagbox).addClass("hl");$("li:eq("+(cursor+1)+")",tagbox).removeClass("hl");e.preventDefault()}break;
case 13:if(input[0].type!="textarea"){e.preventDefault()}if(cursor>=0&&cursor<length){options.onSelectItem(cacheLst[cursor]);
insertTag(parseFilter(input.val()),$("li:eq("+(cursor)+")",tagbox).text());e.preventDefault();hidelookup()}break;case 27:hidelookup();
e.preventDefault();break}};var handleKey=function(e){var e=e||window.event;var key=e.charCode||e.keyCode;
if(key==13){return true}if(key>8&&key<46&&key!=32){return false}if(loading==false){triggerLoad()}
if(options.visible){$(lookup,tagbox).show()}};$(input).keyup(handleKey);$(input).keydown(handleSpecials);
$(tagbox).bind("configure",function(){$.extend(options,arguments[1])});$(tagbox).bind("load",function(){triggerLoad()});
$(tagbox).bind("clear",function(){hidelookup()})}})(jQuery);