/***********************************************************************************

JQUERY TAGDRAGON
(v1.30, August 2009, by Ferdy Christant - ferdychristant.com)

jQuery TagDragon is a versatile jQuery 	plugin for autosuggest functionality of
input boxes and texareas. You can learn more about TagDragon at:

http://www.s3maphor3.org/tagdragon

LICENSE

Tagdragon is charityware. It is not free. You can make use of it after making
a required donation at :

http://www.s3maphor3.org/tagdragon/buy

100% of the revenue will be used for project JungleDragon, a charitable project!

***********************************************************************************/
(function($){$.fn.extend({tagdragon:function(options){return this.each(function(){new $.tagdragonz(this,options)})},tagdragon_configure:function(options){return this.trigger("tagdragon_configure",[options])},tagdragon_load:function(){return this.trigger("tagdragon_load")},tagdragon_clear:function(){return this.trigger("tagdragon_clear")}});$.tagdragonz=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},onSelectedItem: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 lkup=document.createElement("div");$(lkup).attr({id:"tagbox-lkup"});$(lkup,tagbox).show();input.after(lkup);var lkuplst=document.createElement("ol");$(lkup,tagbox).append(lkuplst);var cursor=-1;var length=0;var loading=false;var loaded=false;var cacheLst=null;var inserted=false;var preg_escape=function(str){return(str+"").replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g,"\\$1")};var hideLkup=function(){$(lkuplst,tagbox).empty();$(lkup,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("/"+preg_escape(filter)+"$/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");lkuplst.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("/("+preg_escape(filter)+")/gi"),"<em>$1</em>"));li.appendChild(aLink);$(aLink).click(function(e){options.onSelectItem(row);insertTag(filter,val);options.onSelectedItem(row);e.preventDefault();hideLkup();inserted=true;input.focus()})};var loadList=function(){inserted=false;var filter=parseFilter(input.val());options.onLoadList(filter);$(lkuplst,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){$(lkuplst,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){$(lkup,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{hideLkup()}}};$("*",input.form).focus(function(e){if(this.id==options.field){triggerLoad()}else{hideLkup()}});input.dblclick(function(e){if(options.dblClick&&!loading){triggerLoad()}});$(lkuplst,tagbox).blur(function(e){hideLkup()});var handleSpecials=function(e){var e=e||window.event;var key=e.charCode||e.keyCode;if(!loaded){return true}switch(key){case 9: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 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){var row=cacheLst[cursor];options.onSelectItem(row);insertTag(parseFilter(input.val()),$("li:eq("+(cursor)+")",tagbox).text());options.onSelectedItem(row);e.preventDefault();hideLkup()}break;case 27:hideLkup();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){$(lkup,tagbox).show()}};$(input).keyup(handleKey);$(input).keydown(handleSpecials);$(tagbox).bind("tadragon_configure",function(){$.extend(options,arguments[1])});$(tagbox).bind("tagdragon_load",function(){triggerLoad()});$(tagbox).bind("tagdragon_clear",function(){hideLkup()})}})(jQuery);
