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