/*******************************************************************************
*
* JQUERY TAGDRAGON (v1.33, June 2010, 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!
*
******************************************************************************/

"use strict";(function($){$.fn.extend({tagdragon:function(options){return this.each(function(){$.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 row.tag},onSelectItem:function(val){return true},onSelectedItem:function(val){return true},onLoadList:function(filter){return true},onLoadedList:function(results){return true}};options=$.extend(defaults,options);input=$(tagbox).find("#"+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={lastSearch:"",data:[]};var inserted=false;var preg_escape=function(str){return(str+"").replace(/([\/\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g,"\\$1")};var hideLkup=function(){$(lkuplst,tagbox).empty();$(lkup,tagbox).hide();loaded=false;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 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=$.trim(val.substring(val.lastIndexOf(options.tagsep)+1,val.length))}}return val};var addItem=function(val,filter,index){if(!options.visible){return}var row=val;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();cacheLst={lastSearch:parseFilter(input.val())};hideLkup();input.focus()})};var clearCache=function(){cacheLst={lastSearch:"",data:[]}};var loadShowList=function(filter,data){$(lkuplst,tagbox).empty();if(data){length=data?data.length:0;cacheLst={lastSearch:filter,data:data};cursor=-1;for(var i=0;i<data.length&&i<options.max;i++){addItem(data[i],filter,i)}if(options.visible){$(lkup,tagbox).show()}}loading=false;loaded=true;options.onLoadedList(data)};var loadList=function(){inserted=false;var filter=parseFilter(input.val());if(cacheLst.lastSearch==filter){loadShowList(filter,cacheLst.data);return}options.onLoadList(filter);$(lkuplst,tagbox).empty();$.ajax({type:"POST",url:options.url,data:$.extend({tag:filter,max:options.max},options.postData),dataType:options.dataType,cache:options.cache,success:function(json){if(filter!=parseFilter(input.val())){loadList()}else{loadShowList(filter,json)}},error:function(XMLHttpRequest,textStatus,errorThrown){length=0;cacheLst={lastSearch:"",data:[]};loading=false;loaded=false;options.onLoadedList(false)}})};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).focus(function(e){if(cacheLst.lastSearch!=parseFilter(input.val())){triggerLoad()}});$(input).blur(function(e){setTimeout(function(e){hideLkup()},250)});input.dblclick(function(e){if(options.dblClick&&!loading){triggerLoad()}});$(lkuplst,tagbox).blur(function(e){hideLkup()});var handleSpecials=function(e){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.data[cursor];options.onSelectItem(row);insertTag(parseFilter(input.val()),$("li:eq("+(cursor)+")",tagbox).text());options.onSelectedItem(row);e.preventDefault();cacheLst={lastSearch:parseFilter(input.val())};hideLkup()}break;case 27:hideLkup();e.preventDefault();break}};var handleKey=function(e){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("tagdragon_configure",function(){$.extend(options,arguments[1])});$(tagbox).bind("tagdragon_load",function(){triggerLoad()});$(tagbox).bind("tagdragon_clear",function(){hideLkup()})}})(jQuery);
