docs/api-2.1/search/search.js

Sat, 06 Feb 2021 19:11:44 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 06 Feb 2021 19:11:44 +0100
changeset 390
d345541018fa
permissions
-rw-r--r--

starts ucx 3.0 development

universe@390 1 function convertToId(search)
universe@390 2 {
universe@390 3 var result = '';
universe@390 4 for (i=0;i<search.length;i++)
universe@390 5 {
universe@390 6 var c = search.charAt(i);
universe@390 7 var cn = c.charCodeAt(0);
universe@390 8 if (c.match(/[a-z0-9\u0080-\uFFFF]/))
universe@390 9 {
universe@390 10 result+=c;
universe@390 11 }
universe@390 12 else if (cn<16)
universe@390 13 {
universe@390 14 result+="_0"+cn.toString(16);
universe@390 15 }
universe@390 16 else
universe@390 17 {
universe@390 18 result+="_"+cn.toString(16);
universe@390 19 }
universe@390 20 }
universe@390 21 return result;
universe@390 22 }
universe@390 23
universe@390 24 function getXPos(item)
universe@390 25 {
universe@390 26 var x = 0;
universe@390 27 if (item.offsetWidth)
universe@390 28 {
universe@390 29 while (item && item!=document.body)
universe@390 30 {
universe@390 31 x += item.offsetLeft;
universe@390 32 item = item.offsetParent;
universe@390 33 }
universe@390 34 }
universe@390 35 return x;
universe@390 36 }
universe@390 37
universe@390 38 function getYPos(item)
universe@390 39 {
universe@390 40 var y = 0;
universe@390 41 if (item.offsetWidth)
universe@390 42 {
universe@390 43 while (item && item!=document.body)
universe@390 44 {
universe@390 45 y += item.offsetTop;
universe@390 46 item = item.offsetParent;
universe@390 47 }
universe@390 48 }
universe@390 49 return y;
universe@390 50 }
universe@390 51
universe@390 52 /* A class handling everything associated with the search panel.
universe@390 53
universe@390 54 Parameters:
universe@390 55 name - The name of the global variable that will be
universe@390 56 storing this instance. Is needed to be able to set timeouts.
universe@390 57 resultPath - path to use for external files
universe@390 58 */
universe@390 59 function SearchBox(name, resultsPath, inFrame, label)
universe@390 60 {
universe@390 61 if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
universe@390 62
universe@390 63 // ---------- Instance variables
universe@390 64 this.name = name;
universe@390 65 this.resultsPath = resultsPath;
universe@390 66 this.keyTimeout = 0;
universe@390 67 this.keyTimeoutLength = 500;
universe@390 68 this.closeSelectionTimeout = 300;
universe@390 69 this.lastSearchValue = "";
universe@390 70 this.lastResultsPage = "";
universe@390 71 this.hideTimeout = 0;
universe@390 72 this.searchIndex = 0;
universe@390 73 this.searchActive = false;
universe@390 74 this.insideFrame = inFrame;
universe@390 75 this.searchLabel = label;
universe@390 76
universe@390 77 // ----------- DOM Elements
universe@390 78
universe@390 79 this.DOMSearchField = function()
universe@390 80 { return document.getElementById("MSearchField"); }
universe@390 81
universe@390 82 this.DOMSearchSelect = function()
universe@390 83 { return document.getElementById("MSearchSelect"); }
universe@390 84
universe@390 85 this.DOMSearchSelectWindow = function()
universe@390 86 { return document.getElementById("MSearchSelectWindow"); }
universe@390 87
universe@390 88 this.DOMPopupSearchResults = function()
universe@390 89 { return document.getElementById("MSearchResults"); }
universe@390 90
universe@390 91 this.DOMPopupSearchResultsWindow = function()
universe@390 92 { return document.getElementById("MSearchResultsWindow"); }
universe@390 93
universe@390 94 this.DOMSearchClose = function()
universe@390 95 { return document.getElementById("MSearchClose"); }
universe@390 96
universe@390 97 this.DOMSearchBox = function()
universe@390 98 { return document.getElementById("MSearchBox"); }
universe@390 99
universe@390 100 // ------------ Event Handlers
universe@390 101
universe@390 102 // Called when focus is added or removed from the search field.
universe@390 103 this.OnSearchFieldFocus = function(isActive)
universe@390 104 {
universe@390 105 this.Activate(isActive);
universe@390 106 }
universe@390 107
universe@390 108 this.OnSearchSelectShow = function()
universe@390 109 {
universe@390 110 var searchSelectWindow = this.DOMSearchSelectWindow();
universe@390 111 var searchField = this.DOMSearchSelect();
universe@390 112
universe@390 113 if (this.insideFrame)
universe@390 114 {
universe@390 115 var left = getXPos(searchField);
universe@390 116 var top = getYPos(searchField);
universe@390 117 left += searchField.offsetWidth + 6;
universe@390 118 top += searchField.offsetHeight;
universe@390 119
universe@390 120 // show search selection popup
universe@390 121 searchSelectWindow.style.display='block';
universe@390 122 left -= searchSelectWindow.offsetWidth;
universe@390 123 searchSelectWindow.style.left = left + 'px';
universe@390 124 searchSelectWindow.style.top = top + 'px';
universe@390 125 }
universe@390 126 else
universe@390 127 {
universe@390 128 var left = getXPos(searchField);
universe@390 129 var top = getYPos(searchField);
universe@390 130 top += searchField.offsetHeight;
universe@390 131
universe@390 132 // show search selection popup
universe@390 133 searchSelectWindow.style.display='block';
universe@390 134 searchSelectWindow.style.left = left + 'px';
universe@390 135 searchSelectWindow.style.top = top + 'px';
universe@390 136 }
universe@390 137
universe@390 138 // stop selection hide timer
universe@390 139 if (this.hideTimeout)
universe@390 140 {
universe@390 141 clearTimeout(this.hideTimeout);
universe@390 142 this.hideTimeout=0;
universe@390 143 }
universe@390 144 return false; // to avoid "image drag" default event
universe@390 145 }
universe@390 146
universe@390 147 this.OnSearchSelectHide = function()
universe@390 148 {
universe@390 149 this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
universe@390 150 this.closeSelectionTimeout);
universe@390 151 }
universe@390 152
universe@390 153 // Called when the content of the search field is changed.
universe@390 154 this.OnSearchFieldChange = function(evt)
universe@390 155 {
universe@390 156 if (this.keyTimeout) // kill running timer
universe@390 157 {
universe@390 158 clearTimeout(this.keyTimeout);
universe@390 159 this.keyTimeout = 0;
universe@390 160 }
universe@390 161
universe@390 162 var e = (evt) ? evt : window.event; // for IE
universe@390 163 if (e.keyCode==40 || e.keyCode==13)
universe@390 164 {
universe@390 165 if (e.shiftKey==1)
universe@390 166 {
universe@390 167 this.OnSearchSelectShow();
universe@390 168 var win=this.DOMSearchSelectWindow();
universe@390 169 for (i=0;i<win.childNodes.length;i++)
universe@390 170 {
universe@390 171 var child = win.childNodes[i]; // get span within a
universe@390 172 if (child.className=='SelectItem')
universe@390 173 {
universe@390 174 child.focus();
universe@390 175 return;
universe@390 176 }
universe@390 177 }
universe@390 178 return;
universe@390 179 }
universe@390 180 else if (window.frames.MSearchResults.searchResults)
universe@390 181 {
universe@390 182 var elem = window.frames.MSearchResults.searchResults.NavNext(0);
universe@390 183 if (elem) elem.focus();
universe@390 184 }
universe@390 185 }
universe@390 186 else if (e.keyCode==27) // Escape out of the search field
universe@390 187 {
universe@390 188 this.DOMSearchField().blur();
universe@390 189 this.DOMPopupSearchResultsWindow().style.display = 'none';
universe@390 190 this.DOMSearchClose().style.display = 'none';
universe@390 191 this.lastSearchValue = '';
universe@390 192 this.Activate(false);
universe@390 193 return;
universe@390 194 }
universe@390 195
universe@390 196 // strip whitespaces
universe@390 197 var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
universe@390 198
universe@390 199 if (searchValue != this.lastSearchValue) // search value has changed
universe@390 200 {
universe@390 201 if (searchValue != "") // non-empty search
universe@390 202 {
universe@390 203 // set timer for search update
universe@390 204 this.keyTimeout = setTimeout(this.name + '.Search()',
universe@390 205 this.keyTimeoutLength);
universe@390 206 }
universe@390 207 else // empty search field
universe@390 208 {
universe@390 209 this.DOMPopupSearchResultsWindow().style.display = 'none';
universe@390 210 this.DOMSearchClose().style.display = 'none';
universe@390 211 this.lastSearchValue = '';
universe@390 212 }
universe@390 213 }
universe@390 214 }
universe@390 215
universe@390 216 this.SelectItemCount = function(id)
universe@390 217 {
universe@390 218 var count=0;
universe@390 219 var win=this.DOMSearchSelectWindow();
universe@390 220 for (i=0;i<win.childNodes.length;i++)
universe@390 221 {
universe@390 222 var child = win.childNodes[i]; // get span within a
universe@390 223 if (child.className=='SelectItem')
universe@390 224 {
universe@390 225 count++;
universe@390 226 }
universe@390 227 }
universe@390 228 return count;
universe@390 229 }
universe@390 230
universe@390 231 this.SelectItemSet = function(id)
universe@390 232 {
universe@390 233 var i,j=0;
universe@390 234 var win=this.DOMSearchSelectWindow();
universe@390 235 for (i=0;i<win.childNodes.length;i++)
universe@390 236 {
universe@390 237 var child = win.childNodes[i]; // get span within a
universe@390 238 if (child.className=='SelectItem')
universe@390 239 {
universe@390 240 var node = child.firstChild;
universe@390 241 if (j==id)
universe@390 242 {
universe@390 243 node.innerHTML='&#8226;';
universe@390 244 }
universe@390 245 else
universe@390 246 {
universe@390 247 node.innerHTML='&#160;';
universe@390 248 }
universe@390 249 j++;
universe@390 250 }
universe@390 251 }
universe@390 252 }
universe@390 253
universe@390 254 // Called when an search filter selection is made.
universe@390 255 // set item with index id as the active item
universe@390 256 this.OnSelectItem = function(id)
universe@390 257 {
universe@390 258 this.searchIndex = id;
universe@390 259 this.SelectItemSet(id);
universe@390 260 var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
universe@390 261 if (searchValue!="" && this.searchActive) // something was found -> do a search
universe@390 262 {
universe@390 263 this.Search();
universe@390 264 }
universe@390 265 }
universe@390 266
universe@390 267 this.OnSearchSelectKey = function(evt)
universe@390 268 {
universe@390 269 var e = (evt) ? evt : window.event; // for IE
universe@390 270 if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
universe@390 271 {
universe@390 272 this.searchIndex++;
universe@390 273 this.OnSelectItem(this.searchIndex);
universe@390 274 }
universe@390 275 else if (e.keyCode==38 && this.searchIndex>0) // Up
universe@390 276 {
universe@390 277 this.searchIndex--;
universe@390 278 this.OnSelectItem(this.searchIndex);
universe@390 279 }
universe@390 280 else if (e.keyCode==13 || e.keyCode==27)
universe@390 281 {
universe@390 282 this.OnSelectItem(this.searchIndex);
universe@390 283 this.CloseSelectionWindow();
universe@390 284 this.DOMSearchField().focus();
universe@390 285 }
universe@390 286 return false;
universe@390 287 }
universe@390 288
universe@390 289 // --------- Actions
universe@390 290
universe@390 291 // Closes the results window.
universe@390 292 this.CloseResultsWindow = function()
universe@390 293 {
universe@390 294 this.DOMPopupSearchResultsWindow().style.display = 'none';
universe@390 295 this.DOMSearchClose().style.display = 'none';
universe@390 296 this.Activate(false);
universe@390 297 }
universe@390 298
universe@390 299 this.CloseSelectionWindow = function()
universe@390 300 {
universe@390 301 this.DOMSearchSelectWindow().style.display = 'none';
universe@390 302 }
universe@390 303
universe@390 304 // Performs a search.
universe@390 305 this.Search = function()
universe@390 306 {
universe@390 307 this.keyTimeout = 0;
universe@390 308
universe@390 309 // strip leading whitespace
universe@390 310 var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
universe@390 311
universe@390 312 var code = searchValue.toLowerCase().charCodeAt(0);
universe@390 313 var idxChar = searchValue.substr(0, 1).toLowerCase();
universe@390 314 if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
universe@390 315 {
universe@390 316 idxChar = searchValue.substr(0, 2);
universe@390 317 }
universe@390 318
universe@390 319 var resultsPage;
universe@390 320 var resultsPageWithSearch;
universe@390 321 var hasResultsPage;
universe@390 322
universe@390 323 var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
universe@390 324 if (idx!=-1)
universe@390 325 {
universe@390 326 var hexCode=idx.toString(16);
universe@390 327 resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
universe@390 328 resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
universe@390 329 hasResultsPage = true;
universe@390 330 }
universe@390 331 else // nothing available for this search term
universe@390 332 {
universe@390 333 resultsPage = this.resultsPath + '/nomatches.html';
universe@390 334 resultsPageWithSearch = resultsPage;
universe@390 335 hasResultsPage = false;
universe@390 336 }
universe@390 337
universe@390 338 window.frames.MSearchResults.location = resultsPageWithSearch;
universe@390 339 var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
universe@390 340
universe@390 341 if (domPopupSearchResultsWindow.style.display!='block')
universe@390 342 {
universe@390 343 var domSearchBox = this.DOMSearchBox();
universe@390 344 this.DOMSearchClose().style.display = 'inline';
universe@390 345 if (this.insideFrame)
universe@390 346 {
universe@390 347 var domPopupSearchResults = this.DOMPopupSearchResults();
universe@390 348 domPopupSearchResultsWindow.style.position = 'relative';
universe@390 349 domPopupSearchResultsWindow.style.display = 'block';
universe@390 350 var width = document.body.clientWidth - 8; // the -8 is for IE :-(
universe@390 351 domPopupSearchResultsWindow.style.width = width + 'px';
universe@390 352 domPopupSearchResults.style.width = width + 'px';
universe@390 353 }
universe@390 354 else
universe@390 355 {
universe@390 356 var domPopupSearchResults = this.DOMPopupSearchResults();
universe@390 357 var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
universe@390 358 var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
universe@390 359 domPopupSearchResultsWindow.style.display = 'block';
universe@390 360 left -= domPopupSearchResults.offsetWidth;
universe@390 361 domPopupSearchResultsWindow.style.top = top + 'px';
universe@390 362 domPopupSearchResultsWindow.style.left = left + 'px';
universe@390 363 }
universe@390 364 }
universe@390 365
universe@390 366 this.lastSearchValue = searchValue;
universe@390 367 this.lastResultsPage = resultsPage;
universe@390 368 }
universe@390 369
universe@390 370 // -------- Activation Functions
universe@390 371
universe@390 372 // Activates or deactivates the search panel, resetting things to
universe@390 373 // their default values if necessary.
universe@390 374 this.Activate = function(isActive)
universe@390 375 {
universe@390 376 if (isActive || // open it
universe@390 377 this.DOMPopupSearchResultsWindow().style.display == 'block'
universe@390 378 )
universe@390 379 {
universe@390 380 this.DOMSearchBox().className = 'MSearchBoxActive';
universe@390 381
universe@390 382 var searchField = this.DOMSearchField();
universe@390 383
universe@390 384 if (searchField.value == this.searchLabel) // clear "Search" term upon entry
universe@390 385 {
universe@390 386 searchField.value = '';
universe@390 387 this.searchActive = true;
universe@390 388 }
universe@390 389 }
universe@390 390 else if (!isActive) // directly remove the panel
universe@390 391 {
universe@390 392 this.DOMSearchBox().className = 'MSearchBoxInactive';
universe@390 393 this.DOMSearchField().value = this.searchLabel;
universe@390 394 this.searchActive = false;
universe@390 395 this.lastSearchValue = ''
universe@390 396 this.lastResultsPage = '';
universe@390 397 }
universe@390 398 }
universe@390 399 }
universe@390 400
universe@390 401 // -----------------------------------------------------------------------
universe@390 402
universe@390 403 // The class that handles everything on the search results page.
universe@390 404 function SearchResults(name)
universe@390 405 {
universe@390 406 // The number of matches from the last run of <Search()>.
universe@390 407 this.lastMatchCount = 0;
universe@390 408 this.lastKey = 0;
universe@390 409 this.repeatOn = false;
universe@390 410
universe@390 411 // Toggles the visibility of the passed element ID.
universe@390 412 this.FindChildElement = function(id)
universe@390 413 {
universe@390 414 var parentElement = document.getElementById(id);
universe@390 415 var element = parentElement.firstChild;
universe@390 416
universe@390 417 while (element && element!=parentElement)
universe@390 418 {
universe@390 419 if (element.nodeName == 'DIV' && element.className == 'SRChildren')
universe@390 420 {
universe@390 421 return element;
universe@390 422 }
universe@390 423
universe@390 424 if (element.nodeName == 'DIV' && element.hasChildNodes())
universe@390 425 {
universe@390 426 element = element.firstChild;
universe@390 427 }
universe@390 428 else if (element.nextSibling)
universe@390 429 {
universe@390 430 element = element.nextSibling;
universe@390 431 }
universe@390 432 else
universe@390 433 {
universe@390 434 do
universe@390 435 {
universe@390 436 element = element.parentNode;
universe@390 437 }
universe@390 438 while (element && element!=parentElement && !element.nextSibling);
universe@390 439
universe@390 440 if (element && element!=parentElement)
universe@390 441 {
universe@390 442 element = element.nextSibling;
universe@390 443 }
universe@390 444 }
universe@390 445 }
universe@390 446 }
universe@390 447
universe@390 448 this.Toggle = function(id)
universe@390 449 {
universe@390 450 var element = this.FindChildElement(id);
universe@390 451 if (element)
universe@390 452 {
universe@390 453 if (element.style.display == 'block')
universe@390 454 {
universe@390 455 element.style.display = 'none';
universe@390 456 }
universe@390 457 else
universe@390 458 {
universe@390 459 element.style.display = 'block';
universe@390 460 }
universe@390 461 }
universe@390 462 }
universe@390 463
universe@390 464 // Searches for the passed string. If there is no parameter,
universe@390 465 // it takes it from the URL query.
universe@390 466 //
universe@390 467 // Always returns true, since other documents may try to call it
universe@390 468 // and that may or may not be possible.
universe@390 469 this.Search = function(search)
universe@390 470 {
universe@390 471 if (!search) // get search word from URL
universe@390 472 {
universe@390 473 search = window.location.search;
universe@390 474 search = search.substring(1); // Remove the leading '?'
universe@390 475 search = unescape(search);
universe@390 476 }
universe@390 477
universe@390 478 search = search.replace(/^ +/, ""); // strip leading spaces
universe@390 479 search = search.replace(/ +$/, ""); // strip trailing spaces
universe@390 480 search = search.toLowerCase();
universe@390 481 search = convertToId(search);
universe@390 482
universe@390 483 var resultRows = document.getElementsByTagName("div");
universe@390 484 var matches = 0;
universe@390 485
universe@390 486 var i = 0;
universe@390 487 while (i < resultRows.length)
universe@390 488 {
universe@390 489 var row = resultRows.item(i);
universe@390 490 if (row.className == "SRResult")
universe@390 491 {
universe@390 492 var rowMatchName = row.id.toLowerCase();
universe@390 493 rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
universe@390 494
universe@390 495 if (search.length<=rowMatchName.length &&
universe@390 496 rowMatchName.substr(0, search.length)==search)
universe@390 497 {
universe@390 498 row.style.display = 'block';
universe@390 499 matches++;
universe@390 500 }
universe@390 501 else
universe@390 502 {
universe@390 503 row.style.display = 'none';
universe@390 504 }
universe@390 505 }
universe@390 506 i++;
universe@390 507 }
universe@390 508 document.getElementById("Searching").style.display='none';
universe@390 509 if (matches == 0) // no results
universe@390 510 {
universe@390 511 document.getElementById("NoMatches").style.display='block';
universe@390 512 }
universe@390 513 else // at least one result
universe@390 514 {
universe@390 515 document.getElementById("NoMatches").style.display='none';
universe@390 516 }
universe@390 517 this.lastMatchCount = matches;
universe@390 518 return true;
universe@390 519 }
universe@390 520
universe@390 521 // return the first item with index index or higher that is visible
universe@390 522 this.NavNext = function(index)
universe@390 523 {
universe@390 524 var focusItem;
universe@390 525 while (1)
universe@390 526 {
universe@390 527 var focusName = 'Item'+index;
universe@390 528 focusItem = document.getElementById(focusName);
universe@390 529 if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
universe@390 530 {
universe@390 531 break;
universe@390 532 }
universe@390 533 else if (!focusItem) // last element
universe@390 534 {
universe@390 535 break;
universe@390 536 }
universe@390 537 focusItem=null;
universe@390 538 index++;
universe@390 539 }
universe@390 540 return focusItem;
universe@390 541 }
universe@390 542
universe@390 543 this.NavPrev = function(index)
universe@390 544 {
universe@390 545 var focusItem;
universe@390 546 while (1)
universe@390 547 {
universe@390 548 var focusName = 'Item'+index;
universe@390 549 focusItem = document.getElementById(focusName);
universe@390 550 if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
universe@390 551 {
universe@390 552 break;
universe@390 553 }
universe@390 554 else if (!focusItem) // last element
universe@390 555 {
universe@390 556 break;
universe@390 557 }
universe@390 558 focusItem=null;
universe@390 559 index--;
universe@390 560 }
universe@390 561 return focusItem;
universe@390 562 }
universe@390 563
universe@390 564 this.ProcessKeys = function(e)
universe@390 565 {
universe@390 566 if (e.type == "keydown")
universe@390 567 {
universe@390 568 this.repeatOn = false;
universe@390 569 this.lastKey = e.keyCode;
universe@390 570 }
universe@390 571 else if (e.type == "keypress")
universe@390 572 {
universe@390 573 if (!this.repeatOn)
universe@390 574 {
universe@390 575 if (this.lastKey) this.repeatOn = true;
universe@390 576 return false; // ignore first keypress after keydown
universe@390 577 }
universe@390 578 }
universe@390 579 else if (e.type == "keyup")
universe@390 580 {
universe@390 581 this.lastKey = 0;
universe@390 582 this.repeatOn = false;
universe@390 583 }
universe@390 584 return this.lastKey!=0;
universe@390 585 }
universe@390 586
universe@390 587 this.Nav = function(evt,itemIndex)
universe@390 588 {
universe@390 589 var e = (evt) ? evt : window.event; // for IE
universe@390 590 if (e.keyCode==13) return true;
universe@390 591 if (!this.ProcessKeys(e)) return false;
universe@390 592
universe@390 593 if (this.lastKey==38) // Up
universe@390 594 {
universe@390 595 var newIndex = itemIndex-1;
universe@390 596 var focusItem = this.NavPrev(newIndex);
universe@390 597 if (focusItem)
universe@390 598 {
universe@390 599 var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
universe@390 600 if (child && child.style.display == 'block') // children visible
universe@390 601 {
universe@390 602 var n=0;
universe@390 603 var tmpElem;
universe@390 604 while (1) // search for last child
universe@390 605 {
universe@390 606 tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
universe@390 607 if (tmpElem)
universe@390 608 {
universe@390 609 focusItem = tmpElem;
universe@390 610 }
universe@390 611 else // found it!
universe@390 612 {
universe@390 613 break;
universe@390 614 }
universe@390 615 n++;
universe@390 616 }
universe@390 617 }
universe@390 618 }
universe@390 619 if (focusItem)
universe@390 620 {
universe@390 621 focusItem.focus();
universe@390 622 }
universe@390 623 else // return focus to search field
universe@390 624 {
universe@390 625 parent.document.getElementById("MSearchField").focus();
universe@390 626 }
universe@390 627 }
universe@390 628 else if (this.lastKey==40) // Down
universe@390 629 {
universe@390 630 var newIndex = itemIndex+1;
universe@390 631 var focusItem;
universe@390 632 var item = document.getElementById('Item'+itemIndex);
universe@390 633 var elem = this.FindChildElement(item.parentNode.parentNode.id);
universe@390 634 if (elem && elem.style.display == 'block') // children visible
universe@390 635 {
universe@390 636 focusItem = document.getElementById('Item'+itemIndex+'_c0');
universe@390 637 }
universe@390 638 if (!focusItem) focusItem = this.NavNext(newIndex);
universe@390 639 if (focusItem) focusItem.focus();
universe@390 640 }
universe@390 641 else if (this.lastKey==39) // Right
universe@390 642 {
universe@390 643 var item = document.getElementById('Item'+itemIndex);
universe@390 644 var elem = this.FindChildElement(item.parentNode.parentNode.id);
universe@390 645 if (elem) elem.style.display = 'block';
universe@390 646 }
universe@390 647 else if (this.lastKey==37) // Left
universe@390 648 {
universe@390 649 var item = document.getElementById('Item'+itemIndex);
universe@390 650 var elem = this.FindChildElement(item.parentNode.parentNode.id);
universe@390 651 if (elem) elem.style.display = 'none';
universe@390 652 }
universe@390 653 else if (this.lastKey==27) // Escape
universe@390 654 {
universe@390 655 parent.searchBox.CloseResultsWindow();
universe@390 656 parent.document.getElementById("MSearchField").focus();
universe@390 657 }
universe@390 658 else if (this.lastKey==13) // Enter
universe@390 659 {
universe@390 660 return true;
universe@390 661 }
universe@390 662 return false;
universe@390 663 }
universe@390 664
universe@390 665 this.NavChild = function(evt,itemIndex,childIndex)
universe@390 666 {
universe@390 667 var e = (evt) ? evt : window.event; // for IE
universe@390 668 if (e.keyCode==13) return true;
universe@390 669 if (!this.ProcessKeys(e)) return false;
universe@390 670
universe@390 671 if (this.lastKey==38) // Up
universe@390 672 {
universe@390 673 if (childIndex>0)
universe@390 674 {
universe@390 675 var newIndex = childIndex-1;
universe@390 676 document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
universe@390 677 }
universe@390 678 else // already at first child, jump to parent
universe@390 679 {
universe@390 680 document.getElementById('Item'+itemIndex).focus();
universe@390 681 }
universe@390 682 }
universe@390 683 else if (this.lastKey==40) // Down
universe@390 684 {
universe@390 685 var newIndex = childIndex+1;
universe@390 686 var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
universe@390 687 if (!elem) // last child, jump to parent next parent
universe@390 688 {
universe@390 689 elem = this.NavNext(itemIndex+1);
universe@390 690 }
universe@390 691 if (elem)
universe@390 692 {
universe@390 693 elem.focus();
universe@390 694 }
universe@390 695 }
universe@390 696 else if (this.lastKey==27) // Escape
universe@390 697 {
universe@390 698 parent.searchBox.CloseResultsWindow();
universe@390 699 parent.document.getElementById("MSearchField").focus();
universe@390 700 }
universe@390 701 else if (this.lastKey==13) // Enter
universe@390 702 {
universe@390 703 return true;
universe@390 704 }
universe@390 705 return false;
universe@390 706 }
universe@390 707 }
universe@390 708
universe@390 709 function setKeyActions(elem,action)
universe@390 710 {
universe@390 711 elem.setAttribute('onkeydown',action);
universe@390 712 elem.setAttribute('onkeypress',action);
universe@390 713 elem.setAttribute('onkeyup',action);
universe@390 714 }
universe@390 715
universe@390 716 function setClassAttr(elem,attr)
universe@390 717 {
universe@390 718 elem.setAttribute('class',attr);
universe@390 719 elem.setAttribute('className',attr);
universe@390 720 }
universe@390 721
universe@390 722 function createResults()
universe@390 723 {
universe@390 724 var results = document.getElementById("SRResults");
universe@390 725 for (var e=0; e<searchData.length; e++)
universe@390 726 {
universe@390 727 var id = searchData[e][0];
universe@390 728 var srResult = document.createElement('div');
universe@390 729 srResult.setAttribute('id','SR_'+id);
universe@390 730 setClassAttr(srResult,'SRResult');
universe@390 731 var srEntry = document.createElement('div');
universe@390 732 setClassAttr(srEntry,'SREntry');
universe@390 733 var srLink = document.createElement('a');
universe@390 734 srLink.setAttribute('id','Item'+e);
universe@390 735 setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
universe@390 736 setClassAttr(srLink,'SRSymbol');
universe@390 737 srLink.innerHTML = searchData[e][1][0];
universe@390 738 srEntry.appendChild(srLink);
universe@390 739 if (searchData[e][1].length==2) // single result
universe@390 740 {
universe@390 741 srLink.setAttribute('href',searchData[e][1][1][0]);
universe@390 742 if (searchData[e][1][1][1])
universe@390 743 {
universe@390 744 srLink.setAttribute('target','_parent');
universe@390 745 }
universe@390 746 var srScope = document.createElement('span');
universe@390 747 setClassAttr(srScope,'SRScope');
universe@390 748 srScope.innerHTML = searchData[e][1][1][2];
universe@390 749 srEntry.appendChild(srScope);
universe@390 750 }
universe@390 751 else // multiple results
universe@390 752 {
universe@390 753 srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
universe@390 754 var srChildren = document.createElement('div');
universe@390 755 setClassAttr(srChildren,'SRChildren');
universe@390 756 for (var c=0; c<searchData[e][1].length-1; c++)
universe@390 757 {
universe@390 758 var srChild = document.createElement('a');
universe@390 759 srChild.setAttribute('id','Item'+e+'_c'+c);
universe@390 760 setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
universe@390 761 setClassAttr(srChild,'SRScope');
universe@390 762 srChild.setAttribute('href',searchData[e][1][c+1][0]);
universe@390 763 if (searchData[e][1][c+1][1])
universe@390 764 {
universe@390 765 srChild.setAttribute('target','_parent');
universe@390 766 }
universe@390 767 srChild.innerHTML = searchData[e][1][c+1][2];
universe@390 768 srChildren.appendChild(srChild);
universe@390 769 }
universe@390 770 srEntry.appendChild(srChildren);
universe@390 771 }
universe@390 772 srResult.appendChild(srEntry);
universe@390 773 results.appendChild(srResult);
universe@390 774 }
universe@390 775 }
universe@390 776
universe@390 777 function init_search()
universe@390 778 {
universe@390 779 var results = document.getElementById("MSearchSelectWindow");
universe@390 780 for (var key in indexSectionLabels)
universe@390 781 {
universe@390 782 var link = document.createElement('a');
universe@390 783 link.setAttribute('class','SelectItem');
universe@390 784 link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
universe@390 785 link.href='javascript:void(0)';
universe@390 786 link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
universe@390 787 results.appendChild(link);
universe@390 788 }
universe@390 789 searchBox.OnSelectItem(0);
universe@390 790 }
universe@390 791

mercurial