/doc/js/full_list.js

https://github.com/Wixel/TheKeyStone · JavaScript · 167 lines · 153 code · 13 blank · 1 comment · 31 complexity · b34a1441d6539a51411d482cbd120167 MD5 · raw file

  1. var inSearch = null;
  2. var searchIndex = 0;
  3. var searchCache = [];
  4. var searchString = '';
  5. var regexSearchString = '';
  6. var caseSensitiveMatch = false;
  7. RegExp.escape = function(text) {
  8. return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  9. }
  10. function fullListSearch() {
  11. // generate cache
  12. searchCache = [];
  13. $('#full_list li').each(function() {
  14. var link = $(this).find('.object_link a');
  15. var fullName = link.attr('title').split(' ')[0];
  16. searchCache.push({name:link.text(), fullName:fullName, node:$(this), link:link});
  17. });
  18. $('#search input').keyup(function() {
  19. searchString = this.value;
  20. caseSensitiveMatch = searchString.match(/[A-Z]/) != null;
  21. regexSearchString = RegExp.escape(searchString);
  22. if (caseSensitiveMatch) {
  23. regexSearchString += "|" +
  24. $.map(searchString.split(''), function(e) { return RegExp.escape(e); }).
  25. join('.+?');
  26. }
  27. if (searchString === "") {
  28. clearTimeout(inSearch);
  29. inSearch = null;
  30. $('ul .search_uncollapsed').removeClass('search_uncollapsed');
  31. $('#full_list, #content').removeClass('insearch');
  32. $('#full_list li').removeClass('found').each(function() {
  33. var link = $(this).find('.object_link a');
  34. link.text(link.text());
  35. });
  36. if (clicked) {
  37. clicked.parents('ul').each(function() {
  38. $(this).removeClass('collapsed').prev().removeClass('collapsed');
  39. });
  40. }
  41. highlight();
  42. }
  43. else {
  44. if (inSearch) clearTimeout(inSearch);
  45. searchIndex = 0;
  46. lastRowClass = '';
  47. $('#full_list, #content').addClass('insearch');
  48. $('#noresults').text('');
  49. searchItem();
  50. }
  51. });
  52. $('#search input').focus();
  53. $('#full_list').after("<div id='noresults'></div>");
  54. }
  55. var lastRowClass = '';
  56. function searchItem() {
  57. for (var i = 0; i < searchCache.length / 50; i++) {
  58. var item = searchCache[searchIndex];
  59. var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name);
  60. var matchString = regexSearchString;
  61. var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i");
  62. if (searchName.match(matchRegexp) == null) {
  63. item.node.removeClass('found');
  64. }
  65. else {
  66. item.node.css('padding-left', '10px').addClass('found');
  67. item.node.parents().addClass('search_uncollapsed');
  68. item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
  69. lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
  70. item.link.html(item.name.replace(matchRegexp, "<strong>$&</strong>"));
  71. }
  72. if (searchCache.length === searchIndex + 1) {
  73. searchDone();
  74. return;
  75. }
  76. else {
  77. searchIndex++;
  78. }
  79. }
  80. inSearch = setTimeout('searchItem()', 0);
  81. }
  82. function searchDone() {
  83. highlight(true);
  84. if ($('#full_list li:visible').size() === 0) {
  85. $('#noresults').text('No results were found.').hide().fadeIn();
  86. }
  87. else {
  88. $('#noresults').text('');
  89. }
  90. $('#content').removeClass('insearch');
  91. clearTimeout(inSearch);
  92. inSearch = null;
  93. }
  94. clicked = null;
  95. function linkList() {
  96. $('#full_list li, #full_list li a:last').click(function(evt) {
  97. if ($(this).hasClass('toggle')) return true;
  98. if (this.tagName.toLowerCase() == "li") {
  99. var toggle = $(this).children('a.toggle');
  100. if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
  101. toggle.click();
  102. return false;
  103. }
  104. }
  105. if (clicked) clicked.removeClass('clicked');
  106. var win = window.top.frames.main ? window.top.frames.main : window.parent;
  107. if (this.tagName.toLowerCase() == "a") {
  108. clicked = $(this).parent('li').addClass('clicked');
  109. win.location = this.href;
  110. }
  111. else {
  112. clicked = $(this).addClass('clicked');
  113. win.location = $(this).find('a:last').attr('href');
  114. }
  115. return false;
  116. });
  117. }
  118. function collapse() {
  119. if (!$('#full_list').hasClass('class')) return;
  120. $('#full_list.class a.toggle').click(function() {
  121. $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
  122. highlight();
  123. return false;
  124. });
  125. $('#full_list.class ul').each(function() {
  126. $(this).addClass('collapsed').prev().addClass('collapsed');
  127. });
  128. $('#full_list.class').children().removeClass('collapsed');
  129. highlight();
  130. }
  131. function highlight(no_padding) {
  132. var n = 1;
  133. $('#full_list li:visible').each(function() {
  134. var next = n == 1 ? 2 : 1;
  135. $(this).removeClass("r" + next).addClass("r" + n);
  136. if (!no_padding && $('#full_list').hasClass('class')) {
  137. $(this).css('padding-left', (10 + $(this).parents('ul').size() * 15) + 'px');
  138. }
  139. n = next;
  140. });
  141. }
  142. function escapeShortcut() {
  143. $(document).keydown(function(evt) {
  144. if (evt.which == 27) {
  145. $('#search_frame', window.top.document).slideUp(100);
  146. $('#search a', window.top.document).removeClass('active inactive');
  147. $(window.top).focus();
  148. }
  149. });
  150. }
  151. $(escapeShortcut);
  152. $(fullListSearch);
  153. $(linkList);
  154. $(collapse);