(function($){var SearchLight=function(input,url,options){settings=$.extend({minimumCharacters:3,searchDelay:500,limitPerCategory:5,actionFunction:null,align:"left",width:"auto",showIcons:true,showEffect:"fade",hideEffect:"fade"},options);this._settings=settings;this._hide=0;var input=$(input);var container=$(document.createElement("div"));container.attr("class","searchlight-balloon");container.css({position:"fixed",top:200,zIndex:20,display:"none"});if(settings.width=="auto")container.css("width", input.outerWidth());if(settings.align=="left")container.css("left",input.offset().left);else if(settings.align=="right")container.css("right",$(document.body).innerWidth()-(input.offset().left+input.outerWidth()));var results=$(document.createElement("div"));results.attr("class","searchlight-results-wrapper");results.css({});if($.browser.msie&&parseFloat($.browser.version)<=7)results.css({width:"1%"});container.append(results);$("body").append(container);this._input=input;this._container=container; this._searchURL=url;this._resultsContainer=results;input.bind("focus.searchlight",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;if(this.value.length>=settings.minimumCharacters)searchlight.search(this.value)});$(document.body).bind("mousedown.searchlight",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;var node=evt.target;var c=0;while(node){if(node==searchlight._input[0]||node==searchlight._container[0])return;node=node.parentNode}searchlight.hide()}); input.bind("keydown.searchlight",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;if(evt.which==38&&searchlight._selectedRow>0)searchlight.selectRow(searchlight._selectedRow-1);else if(evt.which==40&&searchlight._selectedRow-1)searchlight.activateRow(searchlight._selectedRow);if(evt.which==13||evt.which==38||evt.which==40)evt.preventDefault()});input.bind("keyup.searchlight", {searchlight:this},function(evt){var searchlight=evt.data.searchlight;if(searchlight._searchDelayTimer)clearTimeout(searchlight._searchDelayTimer);searchlight._searchDelayTimer=setTimeout(function(){var input=searchlight._input[0];if(input.value==searchlight._previousQuery);else if(input.value.length>=settings.minimumCharacters)searchlight.search(input.value);else searchlight.hide()},settings.searchDelay)});input.bind("keypress.searchlight",{searchlight:this},function(evt){var searchlight=evt.data.searchlight}); this._container.bind("mouseleave.searchlight",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;searchlight.selectRow(-1)});this.resultAction=settings.actionFunction?settings.actionFunction:this.defaultResultAction};SearchLight.prototype.show=function(){if(!this._container.is(":visible"))this._container.fadeIn("fast");var bodyHeight=$("body").css("height");var bodyNoPx=bodyHeight.split("p");var searchHeight=$(this._resultsContainer).css("height");var searchNoPx=searchHeight.split("p"); var topPos=bodyNoPx[0]-searchNoPx[0]-24;$(this._container).css("width",$(this._resultsContainer).css("width"));$(this._container).css("top",topPos)};SearchLight.prototype.hide=function(){this._hide--;if(this._hide>=0)return;if(this._disableHide)return;this._container.fadeOut("fast")};SearchLight.prototype.search=function(query){var searchlight=this;this._previousQuery=query;if(this._previousXHR)this._previousXHR.abort();this._previousXHR=$.getJSON(this._searchURL,{q:query},function(results){searchlight.clearResults(); for(var i=0;i0)searchlight.addResultCategory(r.title,r.results)}searchlight.show()})};SearchLight.prototype.clearResults=function(){this._categoryCount=0;this._rowCount=0;this._selectedRow=-1;this._resultsContainer.html('
')};SearchLight.prototype.addResultCategory=function(name,results){var first=true;var lastTr=0;for(var i=0;i');$(td).html('');var th_d=th.firstChild;var td_d=td.firstChild;if(first){$(th_d).text(name);first=false}if(this._settings.showIcons){var img=document.createElement("img");img.className="searchlight-result-icon";img.style.width="16px";img.style.height="16px";img.src=r[2]?r[2]:"icons/blank.gif"; $(td_d).append(img)}$(td_d).append(r[1]);$(tr).append(th);$(tr).append(td);$(tr).bind("mousemove",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;searchlight.selectRow(this._rowId)});$(tr).bind("click",{searchlight:this},function(evt){var searchlight=evt.data.searchlight;searchlight.activateRow(this._rowId)});if(r[3])$(tr).attr("rel",r[3]);tr._rowId=this._rowCount;lastTr=this._rowCount;tr._actionValue=r[0];this._resultsContainer.children("table").append(tr);this._rowCount++}var tr= document.createElement("tr");var th=document.createElement("th");var td=document.createElement("td");tr.className="searchlight-spacer-row";this.selectRow(lastTr);$(tr).append(th);$(tr).append(td);this._resultsContainer.children("table").append(tr);this._categoryCount++;var bodyHeight=$("body").css("height");var bodyNoPx=bodyHeight.split("p");var searchHeight=this._resultsContainer.css("height");var searchNoPx=searchHeight.split("p");var topPos=bodyNoPx[0]-searchNoPx[0]-24;this._container.css("top", topPos);this._container.css("width",this._resultsContainer.children("table").innerWidth())};SearchLight.prototype.selectRow=function(id){this._selectedRow=id;this._resultsContainer.find("tr:not(.searchlight-spacer-row)").each(function(i){if(this._rowId==id){if(!$(this).hasClass("searchlight-selected")){$(this).removeClass("searchlight-not-selected");$(this).addClass("searchlight-selected")}}else if(!$(this).hasClass("searchlight-not-selected")){$(this).removeClass("searchlight-selected");$(this).addClass("searchlight-not-selected")}})}; SearchLight.prototype.activateRow=function(id){var elm=this._resultsContainer.find("tr:not(.searchlight-spacer-row):eq("+id+")");this.resultAction(elm[0]._actionValue,elm.attr("rel"))};SearchLight.prototype.defaultResultAction=function(val,rel){if(rel=="fancybox"){this._hide=1;$.fancybox(val,{type:"image",titleShow:false,transitionIn:"elastic",transitionOut:"elastic"})}else window.location.href=val};$.fn.searchlight=function(url,options){this.each(function(){new SearchLight(this,url,options)})}})(jQuery);