1var QuickSearch = { 2 minimum_length: 3, 3 search_delay: 125, 4 cache: new Object(), 5 init: function() 6 { 7 $('#search_query').bind("keydown", QuickSearch.on_keydown); 8 $('#search_query').bind("keyup", QuickSearch.on_keyup); 9 $('#search_query').bind("change", QuickSearch.on_change); 10 $('#search_query').blur(QuickSearch.on_blur); 11 $('#search_query').attr('autocomplete', 'off'); 12 13 var scripts = document.getElementsByTagName('SCRIPT'); 14 for(var i = 0; i < scripts.length; i++) 15 { 16 s = scripts[i]; 17 if(s.src && s.src.indexOf('quicksearch.js') > -1) 18 { 19 QuickSearch.path = s.src.replace(/quicksearch\.js$/, '../'); 20 break; 21 } 22 } 23 24 }, 25 26 on_blur: function(event) 27 { 28 if(!QuickSearch.item_selected && !QuickSearch.over_all) 29 { 30 QuickSearch.hide_popup(); 31 } 32 }, 33 34 on_keydown: function(event) 35 { 36 if(event.keyCode == 13 && !event.altKey) 37 { 38 if(QuickSearch.selected) 39 { 40 try { 41 event.preventDefault(); 42 event.stopPropagation(); 43 } catch(e) { } 44 window.location = QuickSearch.selected.url; 45 return false; 46 } 47 else 48 { 49 QuickSearch.hide_popup(); 50 } 51 } 52 else if(event.keyCode == 27) 53 { 54 if(document.getElementById('QuickSearch')) 55 { 56 try { 57 event.preventDefault(); 58 event.stopPropagation(); 59 } catch(e) { } 60 } 61 QuickSearch.hide_popup(); 62 } 63 }, 64 65 on_keyup: function(event) 66 { 67 if(QuickSearch.timeout) 68 { 69 clearTimeout(QuickSearch.timeout); 70 } 71 72 // Down key was pressed 73 if(event.keyCode == 40 && QuickSearch.results) 74 { 75 if(QuickSearch.selected && QuickSearch.results.length >= QuickSearch.selected.index+1) 76 { 77 QuickSearch.highlight_item(QuickSearch.selected.index+1, true); 78 } 79 if(!QuickSearch.selected && QuickSearch.results.length > 0) 80 { 81 QuickSearch.highlight_item(0, true); 82 } 83 try { 84 event.preventDefault(); 85 event.stopPropagation(); 86 } catch(e) { } 87 return false; 88 } 89 else if(event.keyCode == 38 && QuickSearch.results) 90 { 91 if(QuickSearch.selected && QuickSearch.selected.index > 0) 92 { 93 QuickSearch.highlight_item(QuickSearch.selected.index-1, true); 94 } 95 try { 96 event.preventDefault(); 97 event.stopPropagation(); 98 } catch(e) { } 99 } 100 else if(event.keyCode == 27) 101 { 102 QuickSearch.hide_popup(); 103 } 104 else 105 { 106 if($('#search_query').val() == QuickSearch.last_query) 107 { 108 return false; 109 } 110 QuickSearch.selected = false; 111 if($('#search_query').val().replace(/^\s+|\s+$/g, '').length >= QuickSearch.minimum_length) 112 { 113 QuickSearch.last_query = $('#search_query').val().replace(/^\s+|\s+$/g, ''); 114 if(QuickSearch.timeout) 115 { 116 window.clearTimeout(QuickSearch.timeout); 117 } 118 QuickSearch.timeout = window.setTimeout(QuickSearch.do_search, QuickSearch.search_delay); 119 } 120 else { 121 if(document.getElementById('QuickSearch')) 122 { 123 $('#QuickSearch').remove(); 124 } 125 } 126 } 127 }, 128 129 on_change: function(event) 130 { 131 return (QuickSearch.on_keydown(event) && QuickSearch.on_keyup(event)); 132 }, 133 134 do_search: function() 135 { 136 var cache_name = $('#search_query').val().length+$('#search_query').val(); 137 if(QuickSearch.cache[cache_name]) 138 { 139 QuickSearch.search_done(QuickSearch.cache[cache_name]); 140 } 141 else 142 { 143 $.ajax({ 144 type: 'GET', 145 dataType: 'xml', 146 url: QuickSearch.path+'search.php?action=AjaxSearch&search_query='+encodeURIComponent($('#search_query').val()), 147 success: function(response) { QuickSearch.search_done(response); } 148 }); 149 } 150 }, 151 152 search_done: function(response) 153 { 154 // Cache results 155 var cache_name = $('#search_query').val().length+$('#search_query').val(); 156 QuickSearch.cache[cache_name] = response; 157 158 if(document.getElementById('QuickSearch')) { 159 $('#QuickSearch').remove(); 160 } 161 162 if ($('result', response).length > 0) { 163 var popup_container = document.createElement('TABLE'); 164 popup_container.className = 'QuickSearch'; 165 popup_container.id = 'QuickSearch'; 166 popup_container.cellPadding = "0"; 167 popup_container.cellSpacing = "0"; 168 popup_container.border = "0"; 169 170 var popup = document.createElement('TBODY'); 171 popup_container.appendChild(popup); 172 173 var counter = 0; 174 175 $('result', response).each( 176 function() 177 { 178 var tr = $($(this).text()); 179 var url = $('.QuickSearchResultName a', tr).attr('href'); 180 var tmpCounter = counter; 181 182 $(tr).attr('id', 'QuickSearchResult' + tmpCounter); 183 $(tr).bind('mouseover', function() { QuickSearch.item_selected = true; QuickSearch.highlight_item(tmpCounter, false); }); 184 $(tr).bind('mouseup', function() { window.location = url; }); 185 $(tr).bind('mouseout', function() { QuickSearch.item_selected = false; QuickSearch.unhighlight_item(tmpCounter) }); 186 $(popup).append(tr); 187 188 counter++; 189 } 190 ); 191 192 // More results than we're showing? 193 var all_results_count = $('viewmoreurl', response).size(); 194 195 if(all_results_count) 196 { 197 var tr = document.createElement('TR'); 198 var td = document.createElement('TD'); 199 tr.className = "QuickSearchAllResults"; 200 tr.onmouseover = function() { QuickSearch.over_all = true; }; 201 tr.onmouseout = function() { QuickSearch.over_all = false; }; 202 td.colSpan = 2; 203 td.innerHTML = $('viewmoreurl', response).text(); 204 tr.appendChild(td); 205 popup.appendChild(tr); 206 } 207 208 var clone = popup.cloneNode(true); 209 document.body.appendChild(clone); 210 clone.style.top = "10px"; 211 clone.style.left = "10px"; 212 offset_height = clone.offsetHeight; 213 offset_width = clone.offsetWidth; 214 clone.parentNode.removeChild(clone); 215 216 var offset_top = offset_left = 0; 217 var element = document.getElementById('search_query'); 218 if(typeof(QuickSearchAlignment) != 'undefined' && QuickSearchAlignment == 'left') { 219 offset_left = 0; 220 } 221 else { 222 offset_left += element.offsetWidth - $('#SearchForm').width(); 223 } 224 225 //offset_top = -3; 226 offset_top = 0; 227 offset_left = -51; 228 do 229 { 230 offset_top += element.offsetTop || 0; 231 offset_left += element.offsetLeft || 0; 232 element = element.offsetParent; 233 } while(element); 234 235 popup_container.style.position = "absolute"; 236 popup_container.style.left = offset_left + 1 + "px"; 237 popup_container.style.left = offset_left + 20 + "px"; 238 popup_container.style.top = offset_top + document.getElementById('search_query').offsetHeight + "px"; 239 if(typeof(QuickSearchWidth) != 'undefined') { 240 popup_container.style.width = QuickSearchWidth; 241 } 242 else { 243 popup_container.style.width = document.getElementById('SearchForm').offsetWidth - 2 + "px"; 244 } 245 if($('#QuickSearch')) 246 { 247 $('#QuickSearch').remove(); 248 }
249 document.body.appendChild(popup_container); 250 popup_container.style.display = ''; 251 } 252 else 253 { 254 if(document.getElementById('QuickSearch')) 255 { 256 $('#QuickSearch').remove(); 257 } 258 } 259 }, 260 261 262 hide_popup: function() 263 { 264 $('#QuickSearch').remove(); 265 QuickSearch.selected = null; 266 }, 267 268 highlight_item: function(index, keystroke) 269 { 270 element = $('#QuickSearchResult'+index); 271 if(keystroke == true) 272 { 273 if(QuickSearch.selected) QuickSearch.selected.className = 'QuickSearchResult'; 274 QuickSearch.selected = document.getElementById('QuickSearchResult'+index); 275 } 276 element.addClass("QuickSearchHover"); 277 }, 278 279 unhighlight_item: function(index) 280 { 281 element = $('#QuickSearchResult'+index); 282 element.removeClass('QuickSearchHover'); 283 } 284}; 285 286$(document).ready(function() 287{ 288 QuickSearch.init(); 289});
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.