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($('#live-search_sb').length == 0){ 38 $('body').append('<div id="live-search_sb" class="live-search_sb" style="position:absolute;display:none;width:'+ options.width + 'px;z-index:9999">'+ 39 '<div class="live-search_sb_cont">' + 40 '<div class="live-search_sb_top"></div>' + 41 '<div id="live-search_results" style="width:100%">' + 42 '<div id="live-search_val" ></div>' + 43 '<div id="live-search_more"></div>' + 44 '</div>' + 45 '<div class="live-search_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("live-search_results", null); 58 var loading = "<li class=\"live-search_lnk live-search_more live-search_selected\">"+ 59 "<a id=\"live-search_loading\" href=\"" + options.searchUrl.replace('%s', encodeURI(jQuery(elem).val())) + "\"><i class=\"fa fa-spinner fa-spin\"></i>"+ 60 "</a>"+ 61 "</li>"; 62 jQuery("#live-search_val").html("<ul>"+loading+"</ul>"); 63 var pos = this.bounds(elem, options); 64 var containerPos = this.bounds('.top-nav .container' , options); 65 if(!pos) { 66 jQuery("#live-search_sb").hide(); 67 return false; 68 } 69 if(Math.ceil(containerPos.left) + parseInt(options.width, 10) > jQuery(window).width()) { 70 jQuery("#live-search_sb").css('width', jQuery(window).width() - containerPos.left - 20); 71 } 72 if( jQuery( 'body' ).hasClass( "rtl" ) ) { 73 jQuery("#live-search_sb").css({top:pos.bottom, right:containerPos.right}); 74 }else{ 75 jQuery("#live-search_sb").css({top:pos.bottom, right:containerPos.left}); 76 } 77 jQuery("#live-search_sb").show(); 78 79 var data = { action: "ajaxy_sf", sf_value: jQuery(elem).val(), search:options.search}; 80 if(options.ajaxData){ 81 data = window[options.ajaxData](data); 82 } 83 if(options.search) { 84 var mresults = options.search.split(','); 85 var results = []; 86 var m = ""; 87 var s = 0; 88 89 var c = []; 90 for(var kindex in mresults){ 91 var dm = mresults[kindex].split(":"); 92 if(dm.length == 2) { 93 if(dm[1].indexOf(jQuery(elem).val()) == 0) { 94 results[results.length] = mresults[kindex]; 95 } 96 }else if(dm.length == 1){ 97 if(mresults[kindex].indexOf(jQuery(elem).val()) == 0) { 98 results[results.length] = mresults[kindex]; 99 } 100 } 101 } 102 103 c = $.ajaxyLiveSearch.htmlArrayResults(results); 104 m += c[0]; 105 s += c[1]; 106 107 var sf_selected = ""; 108 if(s == 0) 109 { 110 sf_selected = " live-search_selected"; 111 } 112 m += "<li class=\"live-search_lnk live-search_more" + sf_selected + "\">{total} "+ tie.lang_results_found +"</li>"; 113 114 m = m.replace(/{search_value_escaped}/g, jQuery(elem).val()); 115 m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val()))); 116 m = m.replace(/{search_value}/g, jQuery(elem).val()); 117 m = m.replace(/{total}/g, s); 118 119 jQuery("body").data("live-search_results", results); 120 121 if(s > 0) 122 { 123 jQuery("#live-search_val").html("<ul>"+m+"</ul>"); 124 } 125 else 126 { 127 jQuery("#live-search_val").html("<ul>"+m+"</ul>"); 128 } 129 $.ajaxyLiveSearch.loadLiveEvents(object); 130 jQuery("#live-search_sb").show(); 131 }else{ 132 jQuery.post(options.ajaxUrl, data, function(resp) { 133 var results = eval("("+ resp + ")"); 134 var m = ""; 135 var s = 0; 136 for(var mindex in results) 137 { 138 var c = []; 139 for(var kindex in results[mindex]){ 140 c = $.ajaxyLiveSearch.htmlResults(results[mindex][kindex], mindex, kindex); 141 m += c[0]; 142 s += c[1]; 143 } 144 } 145 146 147 148 var sf_selected = ""; 149 if(s == 0) 150 { 151 sf_selected = " live-search_selected"; 152 m += "<li class=\"live-search_lnk live-search_more\">"+ tie.lang_no_results +"</li>"; 153 154 }else{ 155 if(!options.callback) { 156 m += "<li class=\"live-search_lnk live-search_more\">" + sf_templates + "</li>"; 157 } 158 m = m.replace(/{search_value_escaped}/g, jQuery(elem).val()); 159 m = m.replace(/{search_url_escaped}/g, options.searchUrl.replace('%s', encodeURI(jQuery(elem).val()))); 160 //m = m.replace(/{search_value}/g, jQuery(elem).val()); 161 //m = m.replace(/{total}/g, s); 162 } 163 jQuery("body").data("live-search_results", results); 164 165 if(s > 0) 166 { 167 jQuery("#live-search_val").html('<ul class="live-search_main">'+m+'</ul>'); 168 } 169 else 170 { 171 jQuery("#live-search_val").html('<ul class="live-search_main">'+m+'</ul>'); 172 } 173 $.ajaxyLiveSearch.loadLiveEvents(object); 174 jQuery("#live-search_sb").show(); 175 });
176 } 177 } 178 else 179 { 180 jQuery("#live-search_sb").hide(); 181 } 182 }, 183 bounds: function (elem, options) { 184 var offset = jQuery(elem).offset(); 185 if(offset) { 186 return {top: offset.top, left: offset.left + options.leftOffset, bottom: offset.top + jQuery(elem).innerHeight() + options.topOffset, right: offset.left - jQuery('#live-search_sb').innerWidth() + jQuery(elem).innerWidth()}; 187 } 188 }, 189 htmlResults: function (results, type, array_index){ 190 var m = ""; 191 var s = 0; 192 if(typeof(results) != "undefined") 193 { 194 if(results.all.length > 0) 195 { 196 m += "<li class=\"live-search_header\">" + results.title + "</li><li><div class=\"live-search_result_container\"><ul>"; 197 for(var i = 0; i < results.all.length; i ++) 198 { 199 s ++; 200 m += "<li result-type='object' index-type='" + type + "' index-array='" + array_index + "' index='" + i + "' class=\"live-search_lnk "+results.class_name +"\">"+ $.ajaxyLiveSearch.replaceResults(results.all[i], results.template) + "</li>"; 201 } 202 m += "</ul></div></li>"; 203 } 204 } 205 return new Array(m, s); 206 }, 207 htmlArrayResults: function (results){ 208 var m = ""; 209 var s = 0; 210 if(typeof(results) != "undefined") 211 { 212 if(results.length > 0) 213 { 214 m += "<li><div class=\"live-search_result_container\"><ul>"; 215 for(var i = 0; i < results.length; i ++) 216 { 217 var md = results[i].split(':'); 218 var title = ""; 219 if(md.length == 2) { 220 title = md[1]; 221 }else{ 222 title = results[i]; 223 } 224 s ++; 225 m += "<li result-type='array' index='" + i + "' class=\"live-search_lnk live-search_category\"><a href='javascript:;'>" + title + "</a></li>"; 226 } 227 m += "</ul></div></li>"; 228 } 229 } 230 return new Array(m, s); 231 }, 232 replaceResults: function (results, template){ 233 for(var s in results) 234 { 235 template = template.replace(new RegExp("{"+s+"}", "g"), results[s]); 236 } 237 return template; 238 }, 239 loadLiveEvents: function(object){ 240 var d = {object: object}; 241 jQuery("#live-search_val li.live-search_lnk").mouseover(function(){ 242 jQuery(".live-search_lnk").each(function() { jQuery(this).attr("class",jQuery(this).attr("class").replace(" live-search_selected" , "")); }); 243 jQuery(this).attr("class", jQuery(this).attr("class") + " live-search_selected"); 244 }); 245 if(d.object.options.callback) 246 { 247 jQuery("#live-search_val li.live-search_lnk").click(function(event){ 248 try{ 249 window[d.object.options.callback](d.object, this); 250 }catch(e){ 251 alert(e); 252 } 253 return false; 254 }); 255 } 256 }, 257 loadEvents: function(object){ 258 var d = {object: object}; 259 jQuery(document).click(function(){ jQuery("#live-search_sb").hide(); }); 260 jQuery(window).resize(function(){ 261 var pos = $.ajaxyLiveSearch.bounds(window.sf_lastElement, d.object.options); 262 if(pos) { 263 jQuery("#live-search_sb").css({top:pos.bottom, left:pos.left}); 264 } 265 }); 266 267 268 jQuery(object.element).keyup(function(event){ 269 if(event.keyCode != "38" && event.keyCode != "40" && event.keyCode != "13" && event.keyCode != "27" && event.keyCode != "39" && event.keyCode != "37") 270 { 271 var ajaxyObject = d.object; 272 if(ajaxyObject.timeout != null) 273 { 274 clearTimeout(ajaxyObject.timeout); 275 } 276 jQuery(ajaxyObject.element).attr("class", jQuery(ajaxyObject.element).attr("class").replace(" live-search_focused", "") + " live-search_focused"); 277 //$.ajaxyLiveSearch.loadResults(d.object.element, d.object.options); 278 var l = {object:d.object}; 279 ajaxyObject.timeout = setTimeout(function() { jQuery.ajaxyLiveSearch.loadResults(l.object); }, d.object.options.delay); 280 } 281 }); 282 jQuery(window).keydown(function(event){ 283 if(jQuery("#live-search_sb").css("display") != "none" && jQuery("#live-search_sb").css("display") != "undefined" && jQuery("#live-search_sb").length > 0) 284 { 285 if(event.keyCode == "38" || event.keyCode == "40") 286 { 287 if(jQuery.browser.webkit) 288 { 289 jQuery("#live-search_sb").focus(); 290 } 291 var s_item = null; 292 var after_s_item = null; 293 var s_sel = false; 294 var all_items = jQuery("#live-search_val li.live-search_lnk"); 295 var s_found = false; 296 event.stopPropagation(); 297 event.preventDefault(); 298 for(var i = 0; i < all_items.length; i++) 299 { 300 if(jQuery(all_items[i]).attr("class").indexOf("live-search_selected") >= 0 && s_found == false) 301 { 302 s_sel = true; 303 if(i < all_items.length - 1 && event.keyCode == "40") 304 { 305 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" live-search_selected", "")); 306 jQuery(all_items[i+1]).attr("class", jQuery(all_items[i+1]).attr("class")+ " live-search_selected"); 307 i = i+1; 308 s_found = true; 309 } 310 else if(i > 0 && event.keyCode == "38") 311 { 312 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" live-search_selected", "")); 313 jQuery(all_items[i-1]).attr("class", jQuery(all_items[i-1]).attr("class")+ " live-search_selected"); 314 i = i+1; 315 s_found = true; 316 } 317 } 318 else 319 { 320 jQuery(all_items[i]).attr("class",jQuery(all_items[i]).attr("class").replace(" live-search_selected", "")); 321 } 322 } 323 if(s_sel == false) 324 { 325 if(all_items.length > 0) 326 { 327 jQuery(all_items[0]).attr("class", jQuery(all_items[0]).attr("class")+ " live-search_selected"); 328 } 329 }
330 //jQuery(window).unbind("keypress"); 331 332 } 333 else if(event.keyCode == 27) 334 { 335 jQuery("#live-search_sb").hide(); 336 } 337 else if(event.keyCode == 13) 338 { 339 var b = jQuery("#live-search_val li.live-search_selected a").attr("href"); 340 if(typeof(b) != 'undefined' && b != '') 341 { 342 if(d.object.options.callback){ 343 d.object.options.callback(this); 344 }else{ 345 window.location.href = b; 346 } 347 return false; 348 } 349 else 350 { 351 if(d.object.options.callback){ 352 d.object.options.callback(this); 353 } 354 else if(d.object.element != null){ 355 window.location.href = sf_url.replace('%s', encodeURI(jQuery(d.object).val())); 356 } 357 return false; 358 } 359 } 360 } 361 }); 362 jQuery(object.element).focus(function (){ 363 if(jQuery(this).val() == d.object.options.text){ 364 jQuery(this).val(''); 365 jQuery(this).attr('class', jQuery(this).attr('class') + ' live-search_focused'); 366 } 367 if(d.object.options.expand > 0){ 368 jQuery(d.object.element).animate({width:d.object.options.iwidth}); 369 } 370 }); 371 jQuery(object.element).blur(function () { 372 if(jQuery(this).val() == ''){ 373 jQuery(this).val(d.object.options.text); 374 jQuery(this).attr('class', jQuery(this).attr('class').replace(/ sf_focused/g, '')); 375 } 376 if(d.object.options.expand > 0){ 377 jQuery(d.object.element).animate({width:d.object.options.expand}); 378 } 379 }); 380 } 381 }; 382 $.ajaxyLiveSearch.defaults = { 383 delay:500, 384 leftOffset: 0, 385 topOffset: 5, 386 text: "Search For", 387 iwidth: 180, 388 width: 315, 389 ajaxUrl: "", 390 ajaxData: false, //function to extend data sent to server 391 searchUrl: "", 392 expand: false, 393 callback: false, 394 search: false 395 }; 396 397})(jQuery); 398 399 400function sf_addItem(search, title, name, name_type, value) { 401 var items = jQuery(search).find('.live-search_ajaxy-selective-item'); 402 var exists = false; 403 404 var key = ""; 405 var md = value.split(':'); 406 if(md.length == 2) { 407 key = md[0]; 408 }else{ 409 key = value; 410 } 411 if(items.length > 0) { 412 for(var i = 0; i < items.length; i ++) { 413 if(jQuery(items[i]).find('input.live-search_ajaxy-selective-close-hidden').val() == key){ 414 exists = true; 415 break; 416 } 417 } 418 } 419 if(exists) { 420 jQuery(search).find(".live-search_ajaxy-selective-input").val(""); 421 jQuery('#live-search_sb').hide(); 422 return; 423 } 424 var mds = title.split(':'); 425 if(mds.length == 2) { 426 title = md[1]; 427 } 428 var added_item = jQuery('<span class="live-search_ajaxy-selective-item">' + title + '<a class="live-search_ajaxy-selective-close">X</a><input class="live-search_ajaxy-selective-close-hidden" type="hidden" name="' + name + '" value="' + key + '" /></span>'); 429 if(items.length <= 0){ 430 jQuery(search).prepend(added_item); 431 }else{ 432 added_item.insertAfter(items[items.length - 1]); 433 } 434 added_item.click(function() { 435 jQuery(this).remove(); 436 }); 437 var input = jQuery(search).find(".live-search_ajaxy-selective-input"); 438 if(input) { 439 input.val(""); 440 if(name_type != 'array') { 441 input.css('visibility', 'hidden'); 442 }else{ 443 input.focus(); 444 } 445 } 446 jQuery('#live-search_sb').hide(); 447}
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.