1(function($) { 2 3 $.fn.extend({ 4 ajaxyLiveSearch: function(options, arg) { 5 if (options && typeof(options) == 'object') { 6 options = $.extend( {}, $.ajaxyLiveSearch.defaults, options ); 7 } 8 else { 9 options = $.ajaxyLiveSearch.defaults; 10 } 11 // this creates a plugin for each element in 12 // the selector or runs the function once per 13 // selector. To have it do so for just the 14 // first element (once), return false after 15 // creating the plugin to stop the each iteration 16 if(this.is("input")){ 17 this.each(function() { 18 new $.ajaxyLiveSearch.load(this, options, arg ); 19 }); 20 return; 21 } 22 } 23 }); 24 25 $.ajaxyLiveSearch = { 26 element: null, 27 timeout: null, 28 options: null, 29 load: function( elem, options, arg ) { 30 this.element = elem; 31 this.timeout = null; 32 this.options = options; 33 if($(elem).val() == "") { 34 $(elem).val(options.text); 35 } 36 $(elem).attr('autocomplete', 'off'); 37 38 if($('#sf_sb').length == 0){ 39 $('body').append('<div id="sf_sb" class="sf_sb" style="position:absolute;display:none;width:'+ options.width + 'px;z-index:9999">'+ 40 '<div class="sf_sb_cont">' + 41 '<div class="sf_sb_top"></div>' + 42 '<div id="sf_results" style="width:100%">' + 43 '<div id="sf_val" ></div>' + 44 '<div id="sf_more"></div>' + 45 '</div>' + 46 '<div class="sf_sb_bottom"></div>' + 47 '</div>' + 48 '</div>'); 49 } 50 $.ajaxyLiveSearch.loadEvents(this); 51 }, 52 loadResults: function(object) { 53 options = object.options; 54 elem = object.element; 55 window.sf_lastElement = elem; 56 if(jQuery(elem).val() != "") 57 { 58 jQuery("body").data("sf_results", null); 59 var loading = "<li class=\"sf_lnk sf_more sf_selected\">"+ 60 "<a id=\"sf_loading\" href=\"" + options.searchUrl.replace('%s', encodeURI(jQuery(elem).val())) + "\">"+ 61 "</a>"+ 62 "</li>"; 63 jQuery("#sf_val").html("<ul>"+loading+"</ul>"); 64 var pos = this.bounds(elem, options); 65 if(!pos) { 66 jQuery("#sf_sb").hide(); 67 return false; 68 } 69 if(Math.ceil(pos.left) + parseInt(options.width, 10) > jQuery(window).width()) { 70 jQuery("#sf_sb").css('width', jQuery(window).width() - pos.left - 20); 71 } 72 if(options.rtl == 1) { 73 74 jQuery("#sf_sb").css({top:pos.bottom, left:pos.right}); 75 }else{ 76 jQuery("#sf_sb").css({top:pos.bottom, left:pos.left}); 77 } 78 jQuery("#sf_sb").show(); 79 80 var data = { action: "ajaxy_sf", sf_value: jQuery(elem).val(), search:options.search}; 81 if(options.ajaxData){ 82 data = window[options.ajaxData](data); 83 } 84 if(options.search) { 85 var mresults = options.search.split(','); 86 var results = []; 87 var m = ""; 88 var s = 0; 89 90 var c = []; 91 for(var kindex in mresults){ 92 var dm = mresults[kindex].split(":"); 93 if(dm.length == 2) { 94 if(dm[1].indexOf(jQuery(elem).val()) == 0) { 95 results[results.length] = mresults[kindex]; 96 } 97 }else if(dm.length == 1){ 98 if(mresults[kindex].indexOf(jQuery(elem).val()) == 0) { 99 results[results.length] = mresults[kindex]; 100 } 101 } 102 } 103 104 c = $.ajaxyLiveSearch.htmlArrayResults(results); 105 m += c[0]; 106 s += c[1]; 107 108 var sf_selected = ""; 109 if(s == 0) 110 { 111 sf_selected = " sf_selected"; 112 } 113 m += "<li class=\"sf_lnk sf_more" + sf_selected + "\">{total} Results Found</li>"; 114 115 m = m.replace(/{search_value_escaped}/g, jQuery(elem).val()); 116 m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val()))); 117 m = m.replace(/{search_value}/g, jQuery(elem).val()); 118 m = m.replace(/{total}/g, s); 119 120 jQuery("body").data("sf_results", results); 121 122 if(s > 0) 123 { 124 jQuery("#sf_val").html("<ul>"+m+"</ul>"); 125 } 126 else 127 { 128 jQuery("#sf_val").html("<ul>"+m+"</ul>"); 129 } 130 $.ajaxyLiveSearch.loadLiveEvents(object); 131 jQuery("#sf_sb").show(); 132 }else{ 133 jQuery.post(options.ajaxUrl, data, function(resp) { 134 var results = eval("("+ resp + ")"); 135 var m = ""; 136 var s = 0; 137 for(var mindex in results) 138 { 139 var c = []; 140 for(var kindex in results[mindex]){ 141 c = $.ajaxyLiveSearch.htmlResults(results[mindex][kindex], mindex, kindex); 142 m += c[0]; 143 s += c[1]; 144 } 145 } 146 147 148 149 var sf_selected = ""; 150 if(s == 0) 151 { 152 sf_selected = " sf_selected"; 153 } 154 155 156 157 if(!options.callback) { 158 m += "<li class=\"sf_lnk sf_more" + sf_selected + "\">" + sf_templates + "</li>"; 159 } 160 161 m = m.replace(/{search_value_escaped}/g, jQuery(elem).val()); 162 m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val()))); 163 m = m.replace(/{search_value}/g, jQuery(elem).val()); 164 m = m.replace(/{total}/g, s); 165 166 167 jQuery("body").data("sf_results", results); 168 169 if(s > 0) 170 { 171 jQuery("#sf_val").html('<ul class="sf_main">'+m+'</ul>'); 172 } 173 else 174 { 175 jQuery("#sf_val").html('<ul class="sf_main">'+m+'</ul>'); 176 } 177 $.ajaxyLiveSearch.loadLiveEvents(object); 178 jQuery("#sf_sb").show(); 179 });
180 } 181 } 182 else 183 { 184 jQuery("#sf_sb").hide(); 185 } 186 }, 187 bounds: function (elem, options) { 188 var offset = jQuery(elem).offset(); 189 if(offset) { 190 return {top: offset.top, left: offset.left + options.leftOffset, bottom: offset.top + jQuery(elem).innerHeight() + options.topOffset, right: offset.left - jQuery('#sf_sb').innerWidth() + jQuery(elem).innerWidth()}; 191 } 192 }, 193 htmlResults: function (results, type, array_index){ 194 var m = ""; 195 var s = 0; 196 if(typeof(results) != "undefined") 197 { 198 if(results.all.length > 0) 199 { 200 m += "<li class=\"sf_header\">" + results.title + "</li><li><div class=\"sf_result_container\"><ul>"; 201 for(var i = 0; i < results.all.length; i ++) 202 { 203 s ++; 204 m += "<li result-type='object' index-type='" + type + "' index-array='" + array_index + "' index='" + i + "' class=\"sf_lnk "+results.class_name +"\">"+ $.ajaxyLiveSearch.replaceResults(results.all[i], results.template) + "</li>"; 205 } 206 m += "</ul></div></li>"; 207 } 208 } 209 return new Array(m, s); 210 }, 211 htmlArrayResults: function (results){ 212 var m = ""; 213 var s = 0; 214 if(typeof(results) != "undefined") 215 { 216 if(results.length > 0) 217 { 218 m += "<li><div class=\"sf_result_container\"><ul>"; 219 for(var i = 0; i < results.length; i ++) 220 { 221 var md = results[i].split(':'); 222 var title = ""; 223 if(md.length == 2) { 224 title = md[1]; 225 }else{ 226 title = results[i]; 227 } 228 s ++; 229 m += "<li result-type='array' index='" + i + "' class=\"sf_lnk sf_category\"><a href='javascript:;'>" + title + "</a></li>"; 230 } 231 m += "</ul></div></li>"; 232 } 233 } 234 return new Array(m, s); 235 }, 236 replaceResults: function (results, template){ 237 for(var s in results) 238 { 239 template = template.replace(new RegExp("{"+s+"}", "g"), results[s]); 240 } 241 return template; 242 }, 243 loadLiveEvents: function(object){ 244 var d = {object: object}; 245 jQuery("#sf_val li.sf_lnk").mouseover(function(){ 246 jQuery(".sf_lnk").each(function() { jQuery(this).attr("class",jQuery(this).attr("class").replace(" sf_selected" , "")); }); 247 jQuery(this).attr("class", jQuery(this).attr("class") + " sf_selected"); 248 }); 249 if(d.object.options.callback) 250 { 251 jQuery("#sf_val li.sf_lnk").click(function(event){ 252 try{ 253 window[d.object.options.callback](d.object, this); 254 }catch(e){ 255 alert(e); 256 } 257 return false; 258 }); 259 } 260 }, 261 loadEvents: function(object){ 262 var d = {object: object}; 263 jQuery(document).click(function(){ jQuery("#sf_sb").hide(); }); 264 jQuery(window).resize(function(){ 265 var pos = $.ajaxyLiveSearch.bounds(window.sf_lastElement, d.object.options); 266 if(pos) { 267 jQuery("#sf_sb").css({top:pos.bottom, left:pos.left}); 268 } 269 }); 270 271 272 jQuery(object.element).keyup(function(event){ 273 if(event.keyCode != "38" && event.keyCode != "40" && event.keyCode != "13" && event.keyCode != "27" && event.keyCode != "39" && event.keyCode != "37") 274 { 275 var ajaxyObject = d.object; 276 if(ajaxyObject.timeout != null) 277 { 278 clearTimeout(ajaxyObject.timeout); 279 } 280 jQuery(ajaxyObject.element).attr("class", jQuery(ajaxyObject.element).attr("class").replace(" sf_focused", "") + " sf_focused"); 281 //$.ajaxyLiveSearch.loadResults(d.object.element, d.object.options); 282 var l = {object:d.object}; 283 ajaxyObject.timeout = setTimeout(function() { jQuery.ajaxyLiveSearch.loadResults(l.object); }, d.object.options.delay); 284 } 285 }); 286 jQuery(window).keydown(function(event){ 287 if(jQuery("#sf_sb").css("display") != "none" && jQuery("#sf_sb").css("display") != "undefined" && jQuery("#sf_sb").length > 0) 288 { 289 if(event.keyCode == "38" || event.keyCode == "40") 290 { 291 if(jQuery.browser.webkit) 292 { 293 jQuery("#sf_sb").focus(); 294 } 295 var s_item = null; 296 var after_s_item = null; 297 var s_sel = false; 298 var all_items = jQuery("#sf_val li.sf_lnk"); 299 var s_found = false; 300 event.stopPropagation(); 301 event.preventDefault(); 302 for(var i = 0; i < all_items.length; i++) 303 { 304 if(jQuery(all_items[i]).attr("class").indexOf("sf_selected") >= 0 && s_found == false) 305 { 306 s_sel = true; 307 if(i < all_items.length - 1 && event.keyCode == "40") 308 { 309 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", "")); 310 jQuery(all_items[i+1]).attr("class", jQuery(all_items[i+1]).attr("class")+ " sf_selected"); 311 i = i+1; 312 s_found = true; 313 } 314 else if(i > 0 && event.keyCode == "38") 315 { 316 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", "")); 317 jQuery(all_items[i-1]).attr("class", jQuery(all_items[i-1]).attr("class")+ " sf_selected"); 318 i = i+1; 319 s_found = true; 320 } 321 } 322 else 323 { 324 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" sf_selected", "")); 325 } 326 } 327 if(s_sel == false) 328 { 329 if(all_items.length > 0) 330 { 331 jQuery(all_items[0]).attr("class", jQuery(all_items[0]).attr("class")+ " sf_selected"); 332 } 333 }
334 //jQuery(window).unbind("keypress"); 335 336 } 337 else if(event.keyCode == 27) 338 { 339 jQuery("#sf_sb").hide(); 340 } 341 else if(event.keyCode == 13) 342 { 343 var b = jQuery("#sf_val li.sf_selected a").attr("href"); 344 if(typeof(b) != 'undefined' && b != '') 345 { 346 if(d.object.options.callback){ 347 d.object.options.callback(this); 348 }else{ 349 window.location.href = b; 350 } 351 return false; 352 } 353 else 354 { 355 if(d.object.options.callback){ 356 d.object.options.callback(this); 357 } 358 else if(d.object.element != null){ 359 window.location.href = sf_url.replace('%s', encodeURI(jQuery(d.object).val())); 360 } 361 return false; 362 } 363 } 364 } 365 }); 366 jQuery(object.element).focus(function (){ 367 if(jQuery(this).val() == d.object.options.text){ 368 jQuery(this).val(''); 369 jQuery(this).attr('class', jQuery(this).attr('class') + ' sf_focused'); 370 } 371 if(d.object.options.expand > 0){ 372 jQuery(d.object.element).animate({width:d.object.options.iwidth}); 373 } 374 }); 375 jQuery(object.element).blur(function () { 376 if(jQuery(this).val() == ''){ 377 jQuery(this).val(d.object.options.text); 378 jQuery(this).attr('class', jQuery(this).attr('class').replace(/ sf_focused/g, '')); 379 } 380 if(d.object.options.expand > 0){ 381 jQuery(d.object.element).animate({width:d.object.options.expand}); 382 } 383 }); 384 } 385 }; 386 $.ajaxyLiveSearch.defaults = { 387 delay:500, 388 leftOffset: 0, 389 topOffset: 5, 390 text: "Search For", 391 iwidth: 180, 392 width: 315, 393 ajaxUrl: "", 394 ajaxData: false, //function to extend data sent to server 395 searchUrl: "", 396 expand: false, 397 callback: false, 398 rtl: true, 399 search: false 400 }; 401 402})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.