gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
docs/api/search/search.js
1 /*
2 @licstart The following is the entire license notice for the JavaScript code in this file.
3
4 The MIT License (MIT)
5
6 Copyright (C) 1997-2020 by Dimitri van Heesch
7
8 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
9 and associated documentation files (the "Software"), to deal in the Software without restriction,
10 including without limitation the rights to use, copy, modify, merge, publish, distribute,
11 sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be included in all copies or
15 substantial portions of the Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
18 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23 @licend The above is the entire license notice for the JavaScript code in this file
24 */
25 function convertToId(search)
26 {
27 var result = '';
28 for (i=0;i<search.length;i++)
29 {
30 var c = search.charAt(i);
31 var cn = c.charCodeAt(0);
32 if (c.match(/[a-z0-9\u0080-\uFFFF]/))
33 {
34 result+=c;
35 }
36 else if (cn<16)
37 {
38 result+="_0"+cn.toString(16);
39 }
40 else
41 {
42 result+="_"+cn.toString(16);
43 }
44 }
45 return result;
46 }
47
48 function getXPos(item)
49 {
50 var x = 0;
51 if (item.offsetWidth)
52 {
53 while (item && item!=document.body)
54 {
55 x += item.offsetLeft;
56 item = item.offsetParent;
57 }
58 }
59 return x;
60 }
61
62 function getYPos(item)
63 {
64 var y = 0;
65 if (item.offsetWidth)
66 {
67 while (item && item!=document.body)
68 {
69 y += item.offsetTop;
70 item = item.offsetParent;
71 }
72 }
73 return y;
74 }
75
76 /* A class handling everything associated with the search panel.
77
78 Parameters:
79 name - The name of the global variable that will be
80 storing this instance. Is needed to be able to set timeouts.
81 resultPath - path to use for external files
82 */
83 function SearchBox(name, resultsPath, label, extension)
84 {
85 if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
86 if (!extension || extension == "") { extension = ".html"; }
87
88 // ---------- Instance variables
89 this.name = name;
90 this.resultsPath = resultsPath;
91 this.keyTimeout = 0;
92 this.keyTimeoutLength = 500;
93 this.closeSelectionTimeout = 300;
94 this.lastSearchValue = "";
95 this.lastResultsPage = "";
96 this.hideTimeout = 0;
97 this.searchIndex = 0;
98 this.searchActive = false;
99 this.searchLabel = label;
100 this.extension = extension;
101
102 // ----------- DOM Elements
103
104 this.DOMSearchField = function()
105 { return document.getElementById("MSearchField"); }
106
107 this.DOMSearchSelect = function()
108 { return document.getElementById("MSearchSelect"); }
109
110 this.DOMSearchSelectWindow = function()
111 { return document.getElementById("MSearchSelectWindow"); }
112
113 this.DOMPopupSearchResults = function()
114 { return document.getElementById("MSearchResults"); }
115
116 this.DOMPopupSearchResultsWindow = function()
117 { return document.getElementById("MSearchResultsWindow"); }
118
119 this.DOMSearchClose = function()
120 { return document.getElementById("MSearchClose"); }
121
122 this.DOMSearchBox = function()
123 { return document.getElementById("MSearchBox"); }
124
125 // ------------ Event Handlers
126
127 // Called when focus is added or removed from the search field.
128 this.OnSearchFieldFocus = function(isActive)
129 {
130 this.Activate(isActive);
131 }
132
133 this.OnSearchSelectShow = function()
134 {
135 var searchSelectWindow = this.DOMSearchSelectWindow();
136 var searchField = this.DOMSearchSelect();
137
138 var left = getXPos(searchField);
139 var top = getYPos(searchField);
140 top += searchField.offsetHeight;
141
142 // show search selection popup
143 searchSelectWindow.style.display='block';
144 searchSelectWindow.style.left = left + 'px';
145 searchSelectWindow.style.top = top + 'px';
146
147 // stop selection hide timer
148 if (this.hideTimeout)
149 {
150 clearTimeout(this.hideTimeout);
151 this.hideTimeout=0;
152 }
153 return false; // to avoid "image drag" default event
154 }
155
156 this.OnSearchSelectHide = function()
157 {
158 this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
159 this.closeSelectionTimeout);
160 }
161
162 // Called when the content of the search field is changed.
163 this.OnSearchFieldChange = function(evt)
164 {
165 if (this.keyTimeout) // kill running timer
166 {
167 clearTimeout(this.keyTimeout);
168 this.keyTimeout = 0;
169 }
170
171 var e = (evt) ? evt : window.event; // for IE
172 if (e.keyCode==40 || e.keyCode==13)
173 {
174 if (e.shiftKey==1)
175 {
176 this.OnSearchSelectShow();
177 var win=this.DOMSearchSelectWindow();
178 for (i=0;i<win.childNodes.length;i++)
179 {
180 var child = win.childNodes[i]; // get span within a
181 if (child.className=='SelectItem')
182 {
183 child.focus();
184 return;
185 }
186 }
187 return;
188 }
189 else
190 {
191 window.frames.MSearchResults.postMessage("take_focus", "*");
192 }
193 }
194 else if (e.keyCode==27) // Escape out of the search field
195 {
196 this.DOMSearchField().blur();
197 this.DOMPopupSearchResultsWindow().style.display = 'none';
198 this.DOMSearchClose().style.display = 'none';
199 this.lastSearchValue = '';
200 this.Activate(false);
201 return;
202 }
203
204 // strip whitespaces
205 var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
206
207 if (searchValue != this.lastSearchValue) // search value has changed
208 {
209 if (searchValue != "") // non-empty search
210 {
211 // set timer for search update
212 this.keyTimeout = setTimeout(this.name + '.Search()',
213 this.keyTimeoutLength);
214 }
215 else // empty search field
216 {
217 this.DOMPopupSearchResultsWindow().style.display = 'none';
218 this.DOMSearchClose().style.display = 'none';
219 this.lastSearchValue = '';
220 }
221 }
222 }
223
224 this.SelectItemCount = function(id)
225 {
226 var count=0;
227 var win=this.DOMSearchSelectWindow();
228 for (i=0;i<win.childNodes.length;i++)
229 {
230 var child = win.childNodes[i]; // get span within a
231 if (child.className=='SelectItem')
232 {
233 count++;
234 }
235 }
236 return count;
237 }
238
239 this.SelectItemSet = function(id)
240 {
241 var i,j=0;
242 var win=this.DOMSearchSelectWindow();
243 for (i=0;i<win.childNodes.length;i++)
244 {
245 var child = win.childNodes[i]; // get span within a
246 if (child.className=='SelectItem')
247 {
248 var node = child.firstChild;
249 if (j==id)
250 {
251 node.innerHTML='•';
252 }
253 else
254 {
255 node.innerHTML=' ';
256 }
257 j++;
258 }
259 }
260 }
261
262 // Called when an search filter selection is made.
263 // set item with index id as the active item
264 this.OnSelectItem = function(id)
265 {
266 this.searchIndex = id;
267 this.SelectItemSet(id);
268 var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
269 if (searchValue!="" && this.searchActive) // something was found -> do a search
270 {
271 this.Search();
272 }
273 }
274
275 this.OnSearchSelectKey = function(evt)
276 {
277 var e = (evt) ? evt : window.event; // for IE
278 if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
279 {
280 this.searchIndex++;
281 this.OnSelectItem(this.searchIndex);
282 }
283 else if (e.keyCode==38 && this.searchIndex>0) // Up
284 {
285 this.searchIndex--;
286 this.OnSelectItem(this.searchIndex);
287 }
288 else if (e.keyCode==13 || e.keyCode==27)
289 {
290 this.OnSelectItem(this.searchIndex);
291 this.CloseSelectionWindow();
292 this.DOMSearchField().focus();
293 }
294 return false;
295 }
296
297 // --------- Actions
298
299 // Closes the results window.
300 this.CloseResultsWindow = function()
301 {
302 this.DOMPopupSearchResultsWindow().style.display = 'none';
303 this.DOMSearchClose().style.display = 'none';
304 this.Activate(false);
305 }
306
307 this.CloseSelectionWindow = function()
308 {
309 this.DOMSearchSelectWindow().style.display = 'none';
310 }
311
312 // Performs a search.
313 this.Search = function()
314 {
315 this.keyTimeout = 0;
316
317 // strip leading whitespace
318 var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
319
320 var code = searchValue.toLowerCase().charCodeAt(0);
321 var idxChar = searchValue.substr(0, 1).toLowerCase();
322 if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
323 {
324 idxChar = searchValue.substr(0, 2);
325 }
326
327 var resultsPage;
328 var resultsPageWithSearch;
329 var hasResultsPage;
330
331 var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
332 if (idx!=-1)
333 {
334 var hexCode=idx.toString(16);
335 resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
336 resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
337 hasResultsPage = true;
338 }
339 else // nothing available for this search term
340 {
341 resultsPage = this.resultsPath + '/nomatches' + this.extension;
342 resultsPageWithSearch = resultsPage;
343 hasResultsPage = false;
344 }
345
346 window.frames.MSearchResults.location = resultsPageWithSearch;
347 var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
348
349 if (domPopupSearchResultsWindow.style.display!='block')
350 {
351 var domSearchBox = this.DOMSearchBox();
352 this.DOMSearchClose().style.display = 'inline-block';
353 var domPopupSearchResults = this.DOMPopupSearchResults();
354 var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
355 var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
356 domPopupSearchResultsWindow.style.display = 'block';
357 left -= domPopupSearchResults.offsetWidth;
358 var maxWidth = document.body.clientWidth;
359 var width = 400;
360 if (left<10) left=10;
361 if (width+left+8>maxWidth) width=maxWidth-left-8;
362 domPopupSearchResultsWindow.style.top = top + 'px';
363 domPopupSearchResultsWindow.style.left = left + 'px';
364 domPopupSearchResultsWindow.style.width = width + 'px';
365 }
366
367 this.lastSearchValue = searchValue;
368 this.lastResultsPage = resultsPage;
369 }
370
371 // -------- Activation Functions
372
373 // Activates or deactivates the search panel, resetting things to
374 // their default values if necessary.
375 this.Activate = function(isActive)
376 {
377 if (isActive || // open it
378 this.DOMPopupSearchResultsWindow().style.display == 'block'
379 )
380 {
381 this.DOMSearchBox().className = 'MSearchBoxActive';
382
383 var searchField = this.DOMSearchField();
384
385 if (searchField.value == this.searchLabel) // clear "Search" term upon entry
386 {
387 searchField.value = '';
388 this.searchActive = true;
389 }
390 }
391 else if (!isActive) // directly remove the panel
392 {
393 this.DOMSearchBox().className = 'MSearchBoxInactive';
394 this.DOMSearchField().value = this.searchLabel;
395 this.searchActive = false;
396 this.lastSearchValue = ''
397 this.lastResultsPage = '';
398 }
399 }
400 }
401
402 // -----------------------------------------------------------------------
403
404 // The class that handles everything on the search results page.
405 function SearchResults(name)
406 {
407 // The number of matches from the last run of <Search()>.
408 this.lastMatchCount = 0;
409 this.lastKey = 0;
410 this.repeatOn = false;
411
412 // Toggles the visibility of the passed element ID.
413 this.FindChildElement = function(id)
414 {
415 var parentElement = document.getElementById(id);
416 var element = parentElement.firstChild;
417
418 while (element && element!=parentElement)
419 {
420 if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
421 {
422 return element;
423 }
424
425 if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
426 {
427 element = element.firstChild;
428 }
429 else if (element.nextSibling)
430 {
431 element = element.nextSibling;
432 }
433 else
434 {
435 do
436 {
437 element = element.parentNode;
438 }
439 while (element && element!=parentElement && !element.nextSibling);
440
441 if (element && element!=parentElement)
442 {
443 element = element.nextSibling;
444 }
445 }
446 }
447 }
448
449 this.Toggle = function(id)
450 {
451 var element = this.FindChildElement(id);
452 if (element)
453 {
454 if (element.style.display == 'block')
455 {
456 element.style.display = 'none';
457 }
458 else
459 {
460 element.style.display = 'block';
461 }
462 }
463 }
464
465 // Searches for the passed string. If there is no parameter,
466 // it takes it from the URL query.
467 //
468 // Always returns true, since other documents may try to call it
469 // and that may or may not be possible.
470 this.Search = function(search)
471 {
472 if (!search) // get search word from URL
473 {
474 search = window.location.search;
475 search = search.substring(1); // Remove the leading '?'
476 search = unescape(search);
477 }
478
479 search = search.replace(/^ +/, ""); // strip leading spaces
480 search = search.replace(/ +$/, ""); // strip trailing spaces
481 search = search.toLowerCase();
482 search = convertToId(search);
483
484 var resultRows = document.getElementsByTagName("div");
485 var matches = 0;
486
487 var i = 0;
488 while (i < resultRows.length)
489 {
490 var row = resultRows.item(i);
491 if (row.className == "SRResult")
492 {
493 var rowMatchName = row.id.toLowerCase();
494 rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
495
496 if (search.length<=rowMatchName.length &&
497 rowMatchName.substr(0, search.length)==search)
498 {
499 row.style.display = 'block';
500 matches++;
501 }
502 else
503 {
504 row.style.display = 'none';
505 }
506 }
507 i++;
508 }
509 document.getElementById("Searching").style.display='none';
510 if (matches == 0) // no results
511 {
512 document.getElementById("NoMatches").style.display='block';
513 }
514 else // at least one result
515 {
516 document.getElementById("NoMatches").style.display='none';
517 }
518 this.lastMatchCount = matches;
519 return true;
520 }
521
522 // return the first item with index index or higher that is visible
523 this.NavNext = function(index)
524 {
525 var focusItem;
526 while (1)
527 {
528 var focusName = 'Item'+index;
529 focusItem = document.getElementById(focusName);
530 if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
531 {
532 break;
533 }
534 else if (!focusItem) // last element
535 {
536 break;
537 }
538 focusItem=null;
539 index++;
540 }
541 return focusItem;
542 }
543
544 this.NavPrev = function(index)
545 {
546 var focusItem;
547 while (1)
548 {
549 var focusName = 'Item'+index;
550 focusItem = document.getElementById(focusName);
551 if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
552 {
553 break;
554 }
555 else if (!focusItem) // last element
556 {
557 break;
558 }
559 focusItem=null;
560 index--;
561 }
562 return focusItem;
563 }
564
565 this.ProcessKeys = function(e)
566 {
567 if (e.type == "keydown")
568 {
569 this.repeatOn = false;
570 this.lastKey = e.keyCode;
571 }
572 else if (e.type == "keypress")
573 {
574 if (!this.repeatOn)
575 {
576 if (this.lastKey) this.repeatOn = true;
577 return false; // ignore first keypress after keydown
578 }
579 }
580 else if (e.type == "keyup")
581 {
582 this.lastKey = 0;
583 this.repeatOn = false;
584 }
585 return this.lastKey!=0;
586 }
587
588 this.Nav = function(evt,itemIndex)
589 {
590 var e = (evt) ? evt : window.event; // for IE
591 if (e.keyCode==13) return true;
592 if (!this.ProcessKeys(e)) return false;
593
594 if (this.lastKey==38) // Up
595 {
596 var newIndex = itemIndex-1;
597 var focusItem = this.NavPrev(newIndex);
598 if (focusItem)
599 {
600 var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
601 if (child && child.style.display == 'block') // children visible
602 {
603 var n=0;
604 var tmpElem;
605 while (1) // search for last child
606 {
607 tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
608 if (tmpElem)
609 {
610 focusItem = tmpElem;
611 }
612 else // found it!
613 {
614 break;
615 }
616 n++;
617 }
618 }
619 }
620 if (focusItem)
621 {
622 focusItem.focus();
623 }
624 else // return focus to search field
625 {
626 parent.document.getElementById("MSearchField").focus();
627 }
628 }
629 else if (this.lastKey==40) // Down
630 {
631 var newIndex = itemIndex+1;
632 var focusItem;
633 var item = document.getElementById('Item'+itemIndex);
634 var elem = this.FindChildElement(item.parentNode.parentNode.id);
635 if (elem && elem.style.display == 'block') // children visible
636 {
637 focusItem = document.getElementById('Item'+itemIndex+'_c0');
638 }
639 if (!focusItem) focusItem = this.NavNext(newIndex);
640 if (focusItem) focusItem.focus();
641 }
642 else if (this.lastKey==39) // Right
643 {
644 var item = document.getElementById('Item'+itemIndex);
645 var elem = this.FindChildElement(item.parentNode.parentNode.id);
646 if (elem) elem.style.display = 'block';
647 }
648 else if (this.lastKey==37) // Left
649 {
650 var item = document.getElementById('Item'+itemIndex);
651 var elem = this.FindChildElement(item.parentNode.parentNode.id);
652 if (elem) elem.style.display = 'none';
653 }
654 else if (this.lastKey==27) // Escape
655 {
656 parent.searchBox.CloseResultsWindow();
657 parent.document.getElementById("MSearchField").focus();
658 }
659 else if (this.lastKey==13) // Enter
660 {
661 return true;
662 }
663 return false;
664 }
665
666 this.NavChild = function(evt,itemIndex,childIndex)
667 {
668 var e = (evt) ? evt : window.event; // for IE
669 if (e.keyCode==13) return true;
670 if (!this.ProcessKeys(e)) return false;
671
672 if (this.lastKey==38) // Up
673 {
674 if (childIndex>0)
675 {
676 var newIndex = childIndex-1;
677 document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
678 }
679 else // already at first child, jump to parent
680 {
681 document.getElementById('Item'+itemIndex).focus();
682 }
683 }
684 else if (this.lastKey==40) // Down
685 {
686 var newIndex = childIndex+1;
687 var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
688 if (!elem) // last child, jump to parent next parent
689 {
690 elem = this.NavNext(itemIndex+1);
691 }
692 if (elem)
693 {
694 elem.focus();
695 }
696 }
697 else if (this.lastKey==27) // Escape
698 {
699 parent.searchBox.CloseResultsWindow();
700 parent.document.getElementById("MSearchField").focus();
701 }
702 else if (this.lastKey==13) // Enter
703 {
704 return true;
705 }
706 return false;
707 }
708 }
709
710 function setKeyActions(elem,action)
711 {
712 elem.setAttribute('onkeydown',action);
713 elem.setAttribute('onkeypress',action);
714 elem.setAttribute('onkeyup',action);
715 }
716
717 function setClassAttr(elem,attr)
718 {
719 elem.setAttribute('class',attr);
720 elem.setAttribute('className',attr);
721 }
722
723 function createResults()
724 {
725 var results = document.getElementById("SRResults");
726 for (var e=0; e<searchData.length; e++)
727 {
728 var id = searchData[e][0];
729 var srResult = document.createElement('div');
730 srResult.setAttribute('id','SR_'+id);
731 setClassAttr(srResult,'SRResult');
732 var srEntry = document.createElement('div');
733 setClassAttr(srEntry,'SREntry');
734 var srLink = document.createElement('a');
735 srLink.setAttribute('id','Item'+e);
736 setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
737 setClassAttr(srLink,'SRSymbol');
738 srLink.innerHTML = searchData[e][1][0];
739 srEntry.appendChild(srLink);
740 if (searchData[e][1].length==2) // single result
741 {
742 srLink.setAttribute('href',searchData[e][1][1][0]);
743 srLink.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
744 if (searchData[e][1][1][1])
745 {
746 srLink.setAttribute('target','_parent');
747 }
748 var srScope = document.createElement('span');
749 setClassAttr(srScope,'SRScope');
750 srScope.innerHTML = searchData[e][1][1][2];
751 srEntry.appendChild(srScope);
752 }
753 else // multiple results
754 {
755 srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
756 var srChildren = document.createElement('div');
757 setClassAttr(srChildren,'SRChildren');
758 for (var c=0; c<searchData[e][1].length-1; c++)
759 {
760 var srChild = document.createElement('a');
761 srChild.setAttribute('id','Item'+e+'_c'+c);
762 setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
763 setClassAttr(srChild,'SRScope');
764 srChild.setAttribute('href',searchData[e][1][c+1][0]);
765 srChild.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
766 if (searchData[e][1][c+1][1])
767 {
768 srChild.setAttribute('target','_parent');
769 }
770 srChild.innerHTML = searchData[e][1][c+1][2];
771 srChildren.appendChild(srChild);
772 }
773 srEntry.appendChild(srChildren);
774 }
775 srResult.appendChild(srEntry);
776 results.appendChild(srResult);
777 }
778 }
779
780 function init_search()
781 {
782 var results = document.getElementById("MSearchSelectWindow");
783 for (var key in indexSectionLabels)
784 {
785 var link = document.createElement('a');
786 link.setAttribute('class','SelectItem');
787 link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
788 link.href='javascript:void(0)';
789 link.innerHTML='<span class="SelectionMark"> </span>'+indexSectionLabels[key];
790 results.appendChild(link);
791 }
792 searchBox.OnSelectItem(0);
793 }
794 /* @license-end */
795
796
797 // This file gets appended to the doxygen search.js to override and improve the search functions
798
799
800 // //////////////////
801
802 // Replacing a function in an existing object (function)
803
804 // var oldClass = mynamespace.myclass; // Copy original before overwriting
805 // mynamespace.myclass = function () {
806 // // Apply the original constructor on this object
807 // oldClass.apply(this, arguments);
808 // // Now overwrite the target function after construction
809 // this.myfunction = function () { alert("Overwritten"); };
810 // };
811 // mynamespace.prototype = oldClass.prototype; // Same prototype
812
813 // //////////////////
814
815
816 var oldSearchBox = SearchBox; // Copy original before overwriting
817 SearchBox = function () {
818 // Apply the original constructor on this object
819 oldSearchBox.apply(this, arguments);
820
821 this.Search = function()
822 {
823 this.keyTimeout = 0;
824
825 // strip leading whitespace
826 var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
827
828 // var code = searchValue.toLowerCase().charCodeAt(0);
829 // var idxChar = searchValue.substr(0, 1).toLowerCase();
830 // if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
831 // {
832 // idxChar = searchValue.substr(0, 2);
833 // }
834
835 // var resultsPage;
836 // var resultsPageWithSearch;
837 // var hasResultsPage;
838
839 // var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
840 // if (idx!=-1)
841 // {
842 // var hexCode=idx.toString(16);
843 // resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
844 // resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
845 // hasResultsPage = true;
846 // }
847 // else // nothing available for this search term
848 // {
849 // resultsPage = this.resultsPath + '/nomatches' + this.extension;
850 // resultsPageWithSearch = resultsPage;
851 // hasResultsPage = false;
852 // }
853 // CHANGED START
854 var resultsPage;
855 var resultsPageWithSearch;
856 var hasResultsPage;
857
858 resultsPage = this.resultsPath + '/' + 'combined.html';
859 resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
860 hasResultsPage = true;
861 // CHANGED END
862
863 window.frames.MSearchResults.location = resultsPageWithSearch;
864 var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
865
866 if (domPopupSearchResultsWindow.style.display!='block')
867 {
868 var domSearchBox = this.DOMSearchBox();
869 this.DOMSearchClose().style.display = 'inline-block';
870 if (this.insideFrame)
871 {
872 var domPopupSearchResults = this.DOMPopupSearchResults();
873 domPopupSearchResultsWindow.style.position = 'relative';
874 domPopupSearchResultsWindow.style.display = 'block';
875 var width = document.body.clientWidth - 8; // the -8 is for IE :-(
876 domPopupSearchResultsWindow.style.width = width + 'px';
877 domPopupSearchResults.style.width = width + 'px';
878 }
879 else
880 {
881 var domPopupSearchResults = this.DOMPopupSearchResults();
882 var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
883 var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
884 domPopupSearchResultsWindow.style.display = 'block';
885 left -= domPopupSearchResults.offsetWidth;
886 domPopupSearchResultsWindow.style.top = top + 'px';
887 domPopupSearchResultsWindow.style.left = left + 'px';
888 }
889 }
890
891 this.lastSearchValue = searchValue;
892 this.lastResultsPage = resultsPage;
893 }
894 };
895 SearchBox.prototype = oldSearchBox.prototype; // Same prototype
896
897
898
899 var oldSearchResults = SearchResults; // Copy original before overwriting
900 SearchResults = function () {
901 // Apply the original constructor on this object
902 oldSearchResults.apply(this, arguments);
903
904
905 this.Search = function(search)
906 {
907 if (!search) // get search word from URL
908 {
909 search = window.location.search;
910 search = search.substring(1); // Remove the leading '?'
911 search = unescape(search);
912 }
913
914 search = search.replace(/^ +/, ""); // strip leading spaces
915 search = search.replace(/ +$/, ""); // strip trailing spaces
916 search = search.toLowerCase();
917 // search = convertToId(search);
918 // Commented out above (CHANGED START & END)
919
920 var resultRows = document.getElementsByTagName("div");
921 var matches = 0;
922
923 var i = 0;
924 while (i < resultRows.length)
925 {
926 var row = resultRows.item(i);
927 if (row.className == "SRResult")
928 {
929 var rowMatchName = row.id.toLowerCase();
930 // rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
931
932 // if (search.length<=rowMatchName.length &&
933 // rowMatchName.substr(0, search.length)==search)
934 // {
935 // CHANGED START
936 rowMatchName = rowMatchName.replace(/^[sr\d_]*5f_/, ''); // strip 'sr123_5f'
937 rowMatchName = rowMatchName.replace(/5f/g, ''); // strip '5f' chars
938 // rowMatchName = rowMatchName.replace(/_/, ' '); // underscores to spaces
939
940 if (rowMatchName.includes(search))
941 {
942 // CHANGED END
943 row.style.display = 'block';
944 matches++;
945 }
946 else
947 {
948 row.style.display = 'none';
949 }
950 }
951 i++;
952 }
953 document.getElementById("Searching").style.display='none';
954 if (matches == 0) // no results
955 {
956 document.getElementById("NoMatches").style.display='block';
957 }
958 else // at least one result
959 {
960 document.getElementById("NoMatches").style.display='none';
961 }
962 this.lastMatchCount = matches;
963 return true;
964 }
965 };
966 SearchResults.prototype = oldSearchResults.prototype; // Same prototype
967
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.