(function($){$.fn.jsonSuggest=function(searchData,onSelect){var defaults={minCharacters:1,maxResults:undefined,maxHeight:180,highlightMatches:true,onSelect:undefined,width:undefined};settings=$.extend(defaults,null);return this.each(function(){function regexEscape(txt,omit){var specials=["/",".","*","+","?","|","(",")","[","]","{","}","\\"];if(omit){for(var i=0;i<specials.length;i++){if(specials[i]===omit){specials.splice(i,1);}}}var escapePatt=new RegExp("(\\"+specials.join("|\\")+")","g");return txt.replace(escapePatt,"\\$1");}var obj=$(this),results=$("<div />"),currentSelection,pageX,pageY;function setHoverClass(el){$("div.resultItem",results).removeClass("hover");$(el).addClass("hover");currentSelection=el;}function buildResults(resultObjects,sFilterTxt){sFilterTxt="("+sFilterTxt+")";var bOddRow=true,i,iFound=0,filterPatt=new RegExp(sFilterTxt,"ig");$(results).html("").hide();for(i=0;i<resultObjects.length;i++){var item=$("<div />"),text=resultObjects[i].Name;if(settings.highlightMatches===true){text=text.replace(filterPatt,"<strong>$1</strong>");}$(item).append('<p class="text">'+text+"</p>");if(typeof resultObjects[i].Email==="string"){$(item).append('<p class="extra">'+resultObjects[i].Email+"</p>");}if(typeof resultObjects[i].image==="string"){$(item).prepend('<img src="'+resultObjects[i].image+'" />').append('<br style="clear:both;" />');}$(item).addClass("resultItem").addClass((bOddRow)?"odd":"even").click(function(n){return function(){$(results).html("").hide();onSelect(obj,resultObjects[n]);};}(i)).mouseover(function(el){return function(){setHoverClass(el);};}(item));$(results).append(item);bOddRow=!bOddRow;iFound+=1;if(typeof settings.maxResults==="number"&&iFound>=settings.maxResults){break;}}if($("div",results).length>0){currentSelection=undefined;$(results).show().css("height","auto");if($(results).height()>settings.maxHeight){$(results).css({overflow:"auto",height:settings.maxHeight+"px"});}}}function runSuggest(e){if(this.value.length<settings.minCharacters){$(results).html("").hide();return false;}var resultObjects=[],sFilterTxt=regexEscape(this.value),bMatch=true,filterPatt,i;sFilterTxt=sFilterTxt||".*";filterPatt=new RegExp(sFilterTxt,"i");for(i=0;i<searchData.length;i+=1){if(filterPatt.test(searchData[i].Name)===bMatch||filterPatt.test(searchData[i].Email)===bMatch){resultObjects.push(searchData[i]);}}buildResults(resultObjects,sFilterTxt);}function keyListener(e){switch(e.keyCode){case 13:$(currentSelection).trigger("click");return false;case 40:if(typeof currentSelection==="undefined"){currentSelection=$("div.resultItem:first",results).get(0);}else{currentSelection=$(currentSelection).next().get(0);}setHoverClass(currentSelection);if(currentSelection){$(results).scrollTop(currentSelection.offsetTop);}return false;case 38:if(typeof currentSelection==="undefined"){currentSelection=$("div.resultItem:last",results).get(0);}else{currentSelection=$(currentSelection).prev().get(0);}setHoverClass(currentSelection);if(currentSelection){$(results).scrollTop(currentSelection.offsetTop);}return false;default:runSuggest.apply(this,[e]);}}$(results).addClass("jsonSuggestResults").css({top:(obj.position().top+obj.height()+5)+"px",left:obj.position().left+"px"}).hide();obj.after(results).keyup(keyListener).blur(function(e){var resPos=$(results).offset();resPos.bottom=resPos.top+$(results).height();resPos.right=resPos.left+$(results).width();if(pageY<resPos.top||pageY>resPos.bottom||pageX<resPos.left||pageX>resPos.right){$(results).hide();}}).focus(function(e){$(results).css({top:(obj.position().top+obj.height()+5)+"px",left:obj.position().left+"px"});if($("div",results).length>0){$(results).show();}else{if($.trim($(this).val())==""){buildResults(searchData,"");}}}).attr("autocomplete","off");$().mousemove(function(e){pageX=e.pageX;pageY=e.pageY;});if($.browser.opera){obj.keydown(function(e){if(e.keyCode===40){return keyListener(e);}});}if(typeof searchData==="string"){searchData=JSON.parse(searchData);}});};})(jQuery);
