You are viewing a plain text version of this content. The canonical link for it is here.
Posted to site-commits@maven.apache.org by sj...@apache.org on 2024/04/09 21:19:39 UTC

svn commit: r1916889 [6/11] - in /maven/website/components/plugins-archives/maven-jar-plugin-LATEST: ./ apidocs/ apidocs/jquery/ apidocs/legal/ apidocs/org/apache/maven/plugins/jar/ apidocs/org/apache/maven/plugins/jar/class-use/ apidocs/org/apache/mav...

Added: maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search-page.js
==============================================================================
--- maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search-page.js (added)
+++ maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search-page.js Tue Apr  9 21:19:38 2024
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+"use strict";
+$(function() {
+    var copy = $("#page-search-copy");
+    var expand = $("#page-search-expand");
+    var searchLink = $("span#page-search-link");
+    var redirect = $("input#search-redirect");
+    function setSearchUrlTemplate() {
+        var href = document.location.href.split(/[#?]/)[0];
+        href += "?q=" + "%s";
+        if (redirect.is(":checked")) {
+            href += "&r=1";
+        }
+        searchLink.html(href);
+        copy[0].onmouseenter();
+    }
+    function copyLink(e) {
+        copyToClipboard(this.previousSibling.innerText);
+        switchCopyLabel(this, this.lastElementChild);
+    }
+    copy.click(copyLink);
+    copy[0].onmouseenter = function() {};
+    redirect.click(setSearchUrlTemplate);
+    setSearchUrlTemplate();
+    copy.prop("disabled", false);
+    redirect.prop("disabled", false);
+    expand.click(function (e) {
+        var searchInfo = $("div.page-search-info");
+        if(this.parentElement.hasAttribute("open")) {
+            searchInfo.attr("style", "border-width: 0;");
+        } else {
+            searchInfo.attr("style", "border-width: 1px;").height(searchInfo.prop("scrollHeight"));
+        }
+    });
+});
+$(window).on("load", function() {
+    var input = $("#page-search-input");
+    var reset = $("#page-search-reset");
+    var notify = $("#page-search-notify");
+    var resultSection = $("div#result-section");
+    var resultContainer = $("div#result-container");
+    var searchTerm = "";
+    var activeTab = "";
+    var fixedTab = false;
+    var visibleTabs = [];
+    var feelingLucky = false;
+    function renderResults(result) {
+        if (!result.length) {
+            notify.html(messages.noResult);
+        } else if (result.length === 1) {
+            notify.html(messages.oneResult);
+        } else {
+            notify.html(messages.manyResults.replace("{0}", result.length));
+        }
+        resultContainer.empty();
+        var r = {
+            "types": [],
+            "members": [],
+            "packages": [],
+            "modules": [],
+            "searchTags": []
+        };
+        for (var i in result) {
+            var item = result[i];
+            var arr = r[item.category];
+            arr.push(item);
+        }
+        if (!activeTab || r[activeTab].length === 0 || !fixedTab) {
+            Object.keys(r).reduce(function(prev, curr) {
+                if (r[curr].length > 0 && r[curr][0].score > prev) {
+                    activeTab = curr;
+                    return r[curr][0].score;
+                }
+                return prev;
+            }, 0);
+        }
+        if (feelingLucky && activeTab) {
+            notify.html(messages.redirecting)
+            var firstItem = r[activeTab][0];
+            window.location = getURL(firstItem.indexItem, firstItem.category);
+            return;
+        }
+        if (result.length > 20) {
+            if (searchTerm[searchTerm.length - 1] === ".") {
+                if (activeTab === "types" && r["members"].length > r["types"].length) {
+                    activeTab = "members";
+                } else if (activeTab === "packages" && r["types"].length > r["packages"].length) {
+                    activeTab = "types";
+                }
+            }
+        }
+        var categoryCount = Object.keys(r).reduce(function(prev, curr) {
+            return prev + (r[curr].length > 0 ? 1 : 0);
+        }, 0);
+        visibleTabs = [];
+        var tabContainer = $("<div class='table-tabs'></div>").appendTo(resultContainer);
+        for (var key in r) {
+            var id = "#result-tab-" + key.replace("searchTags", "search_tags");
+            if (r[key].length) {
+                var count = r[key].length >= 1000 ? "999+" : r[key].length;
+                if (result.length > 20 && categoryCount > 1) {
+                    var button = $("<button id='result-tab-" + key
+                        + "' class='page-search-header'><span>" + categories[key] + "</span>"
+                        + "<span style='font-weight: normal'> (" + count + ")</span></button>").appendTo(tabContainer);
+                    button.click(key, function(e) {
+                        fixedTab = true;
+                        renderResult(e.data, $(this));
+                    });
+                    visibleTabs.push(key);
+                } else {
+                    $("<span class='page-search-header active-table-tab'>" + categories[key]
+                        + "<span style='font-weight: normal'> (" + count + ")</span></span>").appendTo(tabContainer);
+                    renderTable(key, r[key]).appendTo(resultContainer);
+                    tabContainer = $("<div class='table-tabs'></div>").appendTo(resultContainer);
+
+                }
+            }
+        }
+        if (activeTab && result.length > 20 && categoryCount > 1) {
+            $("button#result-tab-" + activeTab).addClass("active-table-tab");
+            renderTable(activeTab, r[activeTab]).appendTo(resultContainer);
+        }
+        resultSection.show();
+        function renderResult(category, button) {
+            activeTab = category;
+            setSearchUrl();
+            resultContainer.find("div.summary-table").remove();
+            renderTable(activeTab, r[activeTab]).appendTo(resultContainer);
+            button.siblings().removeClass("active-table-tab");
+            button.addClass("active-table-tab");
+        }
+    }
+    function selectTab(category) {
+        $("button#result-tab-" + category).click();
+    }
+    function renderTable(category, items) {
+        var table = $("<div class='summary-table'>")
+            .addClass(category === "modules"
+                ? "one-column-search-results"
+                : "two-column-search-results");
+        var col1, col2;
+        if (category === "modules") {
+            col1 = "Module";
+        } else if (category === "packages") {
+            col1 = "Module";
+            col2 = "Package";
+        } else if (category === "types") {
+            col1 = "Package";
+            col2 = "Class"
+        } else if (category === "members") {
+            col1 = "Class";
+            col2 = "Member";
+        } else if (category === "searchTags") {
+            col1 = "Location";
+            col2 = "Name";
+        }
+        $("<div class='table-header col-plain'>" + col1 + "</div>").appendTo(table);
+        if (category !== "modules") {
+            $("<div class='table-header col-plain'>" + col2 + "</div>").appendTo(table);
+        }
+        $.each(items, function(index, item) {
+            var rowColor = index % 2 ? "odd-row-color" : "even-row-color";
+            renderItem(item, table, rowColor);
+        });
+        return table;
+    }
+    function renderItem(item, table, rowColor) {
+        var label = getHighlightedText(item.input, item.boundaries, item.prefix.length, item.input.length);
+        var link = $("<a/>")
+            .attr("href",  getURL(item.indexItem, item.category))
+            .attr("tabindex", "0")
+            .addClass("search-result-link")
+            .html(label);
+        var container = getHighlightedText(item.input, item.boundaries, 0, item.prefix.length - 1);
+        if (item.category === "searchTags") {
+            container = item.indexItem.h || "";
+        }
+        if (item.category !== "modules") {
+            $("<div/>").html(container).addClass("col-plain").addClass(rowColor).appendTo(table);
+        }
+        $("<div/>").html(link).addClass("col-last").addClass(rowColor).appendTo(table);
+    }
+    var timeout;
+    function schedulePageSearch() {
+        if (timeout) {
+            clearTimeout(timeout);
+        }
+        timeout = setTimeout(function () {
+            doPageSearch()
+        }, 100);
+    }
+    function doPageSearch() {
+        setSearchUrl();
+        var term = searchTerm = input.val().trim();
+        if (term === "") {
+            notify.html(messages.enterTerm);
+            activeTab = "";
+            fixedTab = false;
+            resultContainer.empty();
+            resultSection.hide();
+        } else {
+            notify.html(messages.searching);
+            doSearch({ term: term, maxResults: 1200 }, renderResults);
+        }
+    }
+    function setSearchUrl() {
+        var query = input.val().trim();
+        var url = document.location.pathname;
+        if (query) {
+            url += "?q=" + encodeURI(query);
+            if (activeTab && fixedTab) {
+                url += "&c=" + activeTab;
+            }
+        }
+        history.replaceState({query: query}, "", url);
+    }
+    input.on("input", function(e) {
+        feelingLucky = false;
+        schedulePageSearch();
+    });
+    $(document).keydown(function(e) {
+        if ((e.ctrlKey || e.metaKey) && (e.key === "ArrowLeft" || e.key === "ArrowRight")) {
+            if (activeTab && visibleTabs.length > 1) {
+                var idx = visibleTabs.indexOf(activeTab);
+                idx += e.key === "ArrowLeft" ? visibleTabs.length - 1 : 1;
+                selectTab(visibleTabs[idx % visibleTabs.length]);
+                return false;
+            }
+        }
+    });
+    reset.click(function() {
+        notify.html(messages.enterTerm);
+        resultSection.hide();
+        activeTab = "";
+        fixedTab = false;
+        resultContainer.empty();
+        input.val('').focus();
+        setSearchUrl();
+    });
+    input.prop("disabled", false);
+    reset.prop("disabled", false);
+
+    var urlParams = new URLSearchParams(window.location.search);
+    if (urlParams.has("q")) {
+        input.val(urlParams.get("q"))
+    }
+    if (urlParams.has("c")) {
+        activeTab = urlParams.get("c");
+        fixedTab = true;
+    }
+    if (urlParams.get("r")) {
+        feelingLucky = true;
+    }
+    if (input.val()) {
+        doPageSearch();
+    } else {
+        notify.html(messages.enterTerm);
+    }
+    input.select().focus();
+});
\ No newline at end of file

Propchange: maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search-page.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.html
==============================================================================
--- maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.html (added)
+++ maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.html Tue Apr  9 21:19:38 2024
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html lang="en">
+<head>
+<!-- Generated by javadoc (21) -->
+<title>Search (Apache Maven JAR Plugin 3.4.0 API)</title>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta name="description" content="search">
+<meta name="generator" content="javadoc/SearchWriter">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<link rel="stylesheet" type="text/css" href="script-dir/jquery-ui.min.css" title="Style">
+<script type="text/javascript" src="script.js"></script>
+<script type="text/javascript" src="script-dir/jquery-3.6.1.min.js"></script>
+<script type="text/javascript" src="script-dir/jquery-ui.min.js"></script>
+</head>
+<body class="search-page">
+<script type="text/javascript">var pathtoroot = "./";
+loadScripts(document, 'script');</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<div class="flex-box">
+<header role="banner" class="flex-header">
+<nav role="navigation">
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation links"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
+<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
+<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
+<li><a href="index.html">Overview</a></li>
+<li>Package</li>
+<li>Class</li>
+<li>Use</li>
+<li><a href="overview-tree.html">Tree</a></li>
+<li><a href="index-all.html">Index</a></li>
+<li><a href="help-doc.html#search">Help</a></li>
+</ul>
+</div>
+<div class="sub-nav">
+<div id="navbar-sub-list"></div>
+</div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<span class="skip-nav" id="skip-navbar-top"></span></nav>
+</header>
+<div class="flex-content">
+<main role="main">
+<h1 class="title">Search</h1>
+<div>
+<input type="text" id="page-search-input" disabled placeholder="Search">
+<input type="reset" id="page-search-reset" disabled value="Reset" style="margin: 6px;">
+<details class="page-search-details">
+<summary id="page-search-expand">Additional resources</summary>
+</details>
+</div>
+<div class="page-search-info">
+<p>The <a href="help-doc.html#search">help page</a> provides an introduction to the scope and syntax of JavaDoc search.</p>
+<p>You can use the &lt;ctrl&gt; or &lt;cmd&gt; keys in combination with the left and right arrow keys to switch between result tabs in this page.</p>
+<p>The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.</p>
+<span id="page-search-link">link</span><button class="copy" aria-label="Copy URL" id="page-search-copy"><img src="copy.svg" alt="Copy URL"><span data-copied="Copied!">Copy</span></button>
+<p>
+<input type="checkbox" id="search-redirect" disabled>
+<label for="search-redirect">Redirect to first result</label></p>
+</div>
+<p id="page-search-notify">Loading search index...</p>
+<div id="result-section" style="display: none;">
+<div id="result-container"></div>
+<script type="text/javascript" src="search-page.js"></script>
+</div>
+</main>
+<footer role="contentinfo">
+<hr>
+<p class="legal-copy"><small>Copyright &#169; 2002&#x2013;2024 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</footer>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file

Propchange: maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.html
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.js
==============================================================================
--- maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.js (original)
+++ maven/website/components/plugins-archives/maven-jar-plugin-LATEST/apidocs/search.js Tue Apr  9 21:19:38 2024
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,120 +22,356 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
-var noResult = {l: "No results found"};
-var catModules = "Modules";
-var catPackages = "Packages";
-var catTypes = "Types";
-var catMembers = "Members";
-var catSearchTags = "SearchTags";
-var highlight = "<span class=\"resultHighlight\">$&</span>";
-var camelCaseRegexp = "";
-var secondaryMatcher = "";
-function getHighlightedText(item) {
-    var ccMatcher = new RegExp(camelCaseRegexp);
-    var label = item.replace(ccMatcher, highlight);
-    if (label === item) {
-        label = item.replace(secondaryMatcher, highlight);
-    }
-    return label;
-}
-function getURLPrefix(ui) {
-    var urlPrefix="";
-    if (useModuleDirectories) {
-        var slash = "/";
-        if (ui.item.category === catModules) {
-            return ui.item.l + slash;
-        } else if (ui.item.category === catPackages && ui.item.m) {
-            return ui.item.m + slash;
-        } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
-            $.each(packageSearchIndex, function(index, item) {
-                if (item.m && ui.item.p == item.l) {
-                    urlPrefix = item.m + slash;
+"use strict";
+const messages = {
+    enterTerm: "Enter a search term",
+    noResult: "No results found",
+    oneResult: "Found one result",
+    manyResults: "Found {0} results",
+    loading: "Loading search index...",
+    searching: "Searching...",
+    redirecting: "Redirecting to first result...",
+    linkIcon: "Link icon",
+    linkToSection: "Link to this section"
+}
+const categories = {
+    modules: "Modules",
+    packages: "Packages",
+    types: "Types",
+    members: "Members",
+    searchTags: "Search Tags"
+};
+const highlight = "<span class='result-highlight'>$&</span>";
+const NO_MATCH = {};
+const MAX_RESULTS = 300;
+function checkUnnamed(name, separator) {
+    return name === "<Unnamed>" || !name ? "" : name + separator;
+}
+function escapeHtml(str) {
+    return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
+}
+function getHighlightedText(str, boundaries, from, to) {
+    var start = from;
+    var text = "";
+    for (var i = 0; i < boundaries.length; i += 2) {
+        var b0 = boundaries[i];
+        var b1 = boundaries[i + 1];
+        if (b0 >= to || b1 <= from) {
+            continue;
+        }
+        text += escapeHtml(str.slice(start, Math.max(start, b0)));
+        text += "<span class='result-highlight'>";
+        text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1)));
+        text += "</span>";
+        start = Math.min(to, b1);
+    }
+    text += escapeHtml(str.slice(start, to));
+    return text;
+}
+function getURLPrefix(item, category) {
+    var urlPrefix = "";
+    var slash = "/";
+    if (category === "modules") {
+        return item.l + slash;
+    } else if (category === "packages" && item.m) {
+        return item.m + slash;
+    } else if (category === "types" || category === "members") {
+        if (item.m) {
+            urlPrefix = item.m + slash;
+        } else {
+            $.each(packageSearchIndex, function(index, it) {
+                if (it.m && item.p === it.l) {
+                    urlPrefix = it.m + slash;
                 }
             });
-            return urlPrefix;
-        } else {
-            return urlPrefix;
         }
     }
     return urlPrefix;
 }
-var watermark = 'Search';
-$(function() {
-    $("#search").val('');
-    $("#search").prop("disabled", false);
-    $("#reset").prop("disabled", false);
-    $("#search").val(watermark).addClass('watermark');
-    $("#search").blur(function() {
-        if ($(this).val().length == 0) {
-            $(this).val(watermark).addClass('watermark');
+function getURL(item, category) {
+    if (item.url) {
+        return item.url;
+    }
+    var url = getURLPrefix(item, category);
+    if (category === "modules") {
+        url += "module-summary.html";
+    } else if (category === "packages") {
+        if (item.u) {
+            url = item.u;
+        } else {
+            url += item.l.replace(/\./g, '/') + "/package-summary.html";
         }
-    });
-    $("#search").on('click keydown', function() {
-        if ($(this).val() == watermark) {
-            $(this).val('').removeClass('watermark');
+    } else if (category === "types") {
+        if (item.u) {
+            url = item.u;
+        } else {
+            url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html";
+        }
+    } else if (category === "members") {
+        url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#";
+        if (item.u) {
+            url += item.u;
+        } else {
+            url += item.l;
+        }
+    } else if (category === "searchTags") {
+        url += item.u;
+    }
+    item.url = url;
+    return url;
+}
+function createMatcher(term, camelCase) {
+    if (camelCase && !isUpperCase(term)) {
+        return null;  // no need for camel-case matcher for lower case query
+    }
+    var pattern = "";
+    var upperCase = [];
+    term.trim().split(/\s+/).forEach(function(w, index, array) {
+        var tokens = w.split(/(?=[A-Z,.()<>?[\/])/);
+        for (var i = 0; i < tokens.length; i++) {
+            var s = tokens[i];
+            // ',' and '?' are the only delimiters commonly followed by space in java signatures
+            pattern += "(" + $.ui.autocomplete.escapeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")";
+            upperCase.push(false);
+            var isWordToken =  /\w$/.test(s);
+            if (isWordToken) {
+                if (i === tokens.length - 1 && index < array.length - 1) {
+                    // space in query string matches all delimiters
+                    pattern += "(.*?)";
+                    upperCase.push(isUpperCase(s[0]));
+                } else {
+                    if (!camelCase && isUpperCase(s) && s.length === 1) {
+                        pattern += "()";
+                    } else {
+                        pattern += "([a-z0-9$<>?[\\]]*?)";
+                    }
+                    upperCase.push(isUpperCase(s[0]));
+                }
+            } else {
+                pattern += "()";
+                upperCase.push(false);
+            }
         }
     });
-    $("#reset").click(function() {
-        $("#search").val('');
-        $("#search").focus();
-    });
-    $("#search").focus();
-    $("#search")[0].setSelectionRange(0, 0);
-});
+    var re = new RegExp(pattern, "gi");
+    re.upperCase = upperCase;
+    return re;
+}
+function findMatch(matcher, input, startOfName, endOfName) {
+    var from = startOfName;
+    matcher.lastIndex = from;
+    var match = matcher.exec(input);
+    // Expand search area until we get a valid result or reach the beginning of the string
+    while (!match || match.index + match[0].length < startOfName || endOfName < match.index) {
+        if (from === 0) {
+            return NO_MATCH;
+        }
+        from = input.lastIndexOf(".", from - 2) + 1;
+        matcher.lastIndex = from;
+        match = matcher.exec(input);
+    }
+    var boundaries = [];
+    var matchEnd = match.index + match[0].length;
+    var score = 5;
+    var start = match.index;
+    var prevEnd = -1;
+    for (var i = 1; i < match.length; i += 2) {
+        var isUpper = isUpperCase(input[start]);
+        var isMatcherUpper = matcher.upperCase[i];
+        // capturing groups come in pairs, match and non-match
+        boundaries.push(start, start + match[i].length);
+        // make sure groups are anchored on a left word boundary
+        var prevChar = input[start - 1] || "";
+        var nextChar = input[start + 1] || "";
+        if (start !== 0 && !/[\W_]/.test(prevChar) && !/[\W_]/.test(input[start])) {
+            if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) {
+                score -= 0.1;
+            } else if (isMatcherUpper && start === prevEnd) {
+                score -= isUpper ? 0.1 : 1.0;
+            } else {
+                return NO_MATCH;
+            }
+        }
+        prevEnd = start + match[i].length;
+        start += match[i].length + match[i + 1].length;
+
+        // lower score for parts of the name that are missing
+        if (match[i + 1] && prevEnd < endOfName) {
+            score -= rateNoise(match[i + 1]);
+        }
+    }
+    // lower score if a type name contains unmatched camel-case parts
+    if (input[matchEnd - 1] !== "." && endOfName > matchEnd)
+        score -= rateNoise(input.slice(matchEnd, endOfName));
+    score -= rateNoise(input.slice(0, Math.max(startOfName, match.index)));
+
+    if (score <= 0) {
+        return NO_MATCH;
+    }
+    return {
+        input: input,
+        score: score,
+        boundaries: boundaries
+    };
+}
+function isUpperCase(s) {
+    return s !== s.toLowerCase();
+}
+function isLowerCase(s) {
+    return s !== s.toUpperCase();
+}
+function rateNoise(str) {
+    return (str.match(/([.(])/g) || []).length / 5
+         + (str.match(/([A-Z]+)/g) || []).length / 10
+         +  str.length / 20;
+}
+function doSearch(request, response) {
+    var term = request.term.trim();
+    var maxResults = request.maxResults || MAX_RESULTS;
+    if (term.length === 0) {
+        return this.close();
+    }
+    var matcher = {
+        plainMatcher: createMatcher(term, false),
+        camelCaseMatcher: createMatcher(term, true)
+    }
+    var indexLoaded = indexFilesLoaded();
+
+    function getPrefix(item, category) {
+        switch (category) {
+            case "packages":
+                return checkUnnamed(item.m, "/");
+            case "types":
+                return checkUnnamed(item.p, ".");
+            case "members":
+                return checkUnnamed(item.p, ".") + item.c + ".";
+            default:
+                return "";
+        }
+    }
+    function useQualifiedName(category) {
+        switch (category) {
+            case "packages":
+                return /[\s/]/.test(term);
+            case "types":
+            case "members":
+                return /[\s.]/.test(term);
+            default:
+                return false;
+        }
+    }
+    function searchIndex(indexArray, category) {
+        var matches = [];
+        if (!indexArray) {
+            if (!indexLoaded) {
+                matches.push({ l: messages.loading, category: category });
+            }
+            return matches;
+        }
+        $.each(indexArray, function (i, item) {
+            var prefix = getPrefix(item, category);
+            var simpleName = item.l;
+            var qualifiedName = prefix + simpleName;
+            var useQualified = useQualifiedName(category);
+            var input = useQualified ? qualifiedName : simpleName;
+            var startOfName = useQualified ? prefix.length : 0;
+            var endOfName = category === "members" && input.indexOf("(", startOfName) > -1
+                ? input.indexOf("(", startOfName) : input.length;
+            var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName);
+            if (m === NO_MATCH && matcher.camelCaseMatcher) {
+                m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName);
+            }
+            if (m !== NO_MATCH) {
+                m.indexItem = item;
+                m.prefix = prefix;
+                m.category = category;
+                if (!useQualified) {
+                    m.input = qualifiedName;
+                    m.boundaries = m.boundaries.map(function(b) {
+                        return b + prefix.length;
+                    });
+                }
+                matches.push(m);
+            }
+            return true;
+        });
+        return matches.sort(function(e1, e2) {
+            return e2.score - e1.score;
+        }).slice(0, maxResults);
+    }
+
+    var result = searchIndex(moduleSearchIndex, "modules")
+         .concat(searchIndex(packageSearchIndex, "packages"))
+         .concat(searchIndex(typeSearchIndex, "types"))
+         .concat(searchIndex(memberSearchIndex, "members"))
+         .concat(searchIndex(tagSearchIndex, "searchTags"));
+
+    if (!indexLoaded) {
+        updateSearchResults = function() {
+            doSearch(request, response);
+        }
+    } else {
+        updateSearchResults = function() {};
+    }
+    response(result);
+}
+// JQuery search menu implementation
 $.widget("custom.catcomplete", $.ui.autocomplete, {
     _create: function() {
         this._super();
-        this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
+        this.widget().menu("option", "items", "> .result-item");
+        // workaround for search result scrolling
+        this.menu._scrollIntoView = function _scrollIntoView( item ) {
+            var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+            if ( this._hasScroll() ) {
+                borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
+                paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
+                offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+                scroll = this.activeMenu.scrollTop();
+                elementHeight = this.activeMenu.height() - 26;
+                itemHeight = item.outerHeight();
+
+                if ( offset < 0 ) {
+                    this.activeMenu.scrollTop( scroll + offset );
+                } else if ( offset + itemHeight > elementHeight ) {
+                    this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+                }
+            }
+        };
     },
     _renderMenu: function(ul, items) {
-        var rMenu = this,
-                currentCategory = "";
-        rMenu.menu.bindings = $();
+        var currentCategory = "";
+        var widget = this;
+        widget.menu.bindings = $();
         $.each(items, function(index, item) {
-            var li;
-            if (item.l !== noResult.l && item.category !== currentCategory) {
-                ul.append("<li class=\"ui-autocomplete-category\">" + item.category + "</li>");
+            if (item.category && item.category !== currentCategory) {
+                ul.append("<li class='ui-autocomplete-category'>" + categories[item.category] + "</li>");
                 currentCategory = item.category;
             }
-            li = rMenu._renderItemData(ul, item);
+            var li = widget._renderItemData(ul, item);
             if (item.category) {
-                li.attr("aria-label", item.category + " : " + item.l);
-                li.attr("class", "resultItem");
+                li.attr("aria-label", categories[item.category] + " : " + item.l);
             } else {
                 li.attr("aria-label", item.l);
-                li.attr("class", "resultItem");
             }
+            li.attr("class", "result-item");
         });
+        ul.append("<li class='ui-static-link'><a href='" + pathtoroot + "search.html?q="
+            + encodeURI(widget.term) + "'>Go to search page</a></li>");
     },
     _renderItem: function(ul, item) {
-        var label = "";
-        if (item.category === catModules) {
-            label = getHighlightedText(item.l);
-        } else if (item.category === catPackages) {
-            label = (item.m)
-                    ? getHighlightedText(item.m + "/" + item.l)
-                    : getHighlightedText(item.l);
-        } else if (item.category === catTypes) {
-            label = (item.p)
-                    ? getHighlightedText(item.p + "." + item.l)
-                    : getHighlightedText(item.l);
-        } else if (item.category === catMembers) {
-            label = getHighlightedText(item.p + "." + (item.c + "." + item.l));
-        } else if (item.category === catSearchTags) {
-            label = getHighlightedText(item.l);
-        } else {
-            label = item.l;
-        }
         var li = $("<li/>").appendTo(ul);
         var div = $("<div/>").appendTo(li);
-        if (item.category === catSearchTags) {
-            if (item.d) {
-                div.html(label + "<span class=\"searchTagHolderResult\"> (" + item.h + ")</span><br><span class=\"searchTagDescResult\">"
-                                + item.d + "</span><br>");
+        var label = item.l
+            ? item.l
+            : getHighlightedText(item.input, item.boundaries, 0, item.input.length);
+        var idx = item.indexItem;
+        if (item.category === "searchTags" && idx && idx.h) {
+            if (idx.d) {
+                div.html(label + "<span class='search-tag-holder-result'> (" + idx.h + ")</span><br><span class='search-tag-desc-result'>"
+                    + idx.d + "</span><br>");
             } else {
-                div.html(label + "<span class=\"searchTagHolderResult\"> (" + item.h + ")</span>");
+                div.html(label + "<span class='search-tag-holder-result'> (" + idx.h + ")</span>");
             }
         } else {
             div.html(label);
@@ -144,183 +380,79 @@ $.widget("custom.catcomplete", $.ui.auto
     }
 });
 $(function() {
-    $("#search").catcomplete({
+    var expanded = false;
+    var windowWidth;
+    function collapse() {
+        if (expanded) {
+            $("div#navbar-top").removeAttr("style");
+            $("button#navbar-toggle-button")
+                .removeClass("expanded")
+                .attr("aria-expanded", "false");
+            expanded = false;
+        }
+    }
+    $("button#navbar-toggle-button").click(function (e) {
+        if (expanded) {
+            collapse();
+        } else {
+            var navbar = $("div#navbar-top");
+            navbar.height(navbar.prop("scrollHeight"));
+            $("button#navbar-toggle-button")
+                .addClass("expanded")
+                .attr("aria-expanded", "true");
+            expanded = true;
+            windowWidth = window.innerWidth;
+        }
+    });
+    $("ul.sub-nav-list-small li a").click(collapse);
+    $("input#search-input").focus(collapse);
+    $("main").click(collapse);
+    $("section[id] > :header, :header[id], :header:has(a[id])").each(function(idx, el) {
+        // Create anchor links for headers with an associated id attribute
+        var hdr = $(el);
+        var id = hdr.attr("id") || hdr.parent("section").attr("id") || hdr.children("a").attr("id");
+        if (id) {
+            hdr.append(" <a href='#" + id + "' class='anchor-link' aria-label='" + messages.linkToSection
+                + "'><img src='" + pathtoroot + "link.svg' alt='" + messages.linkIcon +"' tabindex='0'"
+                + " width='16' height='16'></a>");
+        }
+    });
+    $(window).on("orientationchange", collapse).on("resize", function(e) {
+        if (expanded && windowWidth !== window.innerWidth) collapse();
+    });
+    var search = $("#search-input");
+    var reset = $("#reset-button");
+    search.catcomplete({
         minLength: 1,
-        delay: 100,
-        source: function(request, response) {
-            var result = new Array();
-            var presult = new Array();
-            var tresult = new Array();
-            var mresult = new Array();
-            var tgresult = new Array();
-            var secondaryresult = new Array();
-            var displayCount = 0;
-            var exactMatcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(request.term) + "$", "i");
-            camelCaseRegexp = ($.ui.autocomplete.escapeRegex(request.term)).split(/(?=[A-Z])/).join("([a-z0-9_$]*?)");
-            var camelCaseMatcher = new RegExp("^" + camelCaseRegexp);
-            secondaryMatcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
-
-            // Return the nested innermost name from the specified object
-            function nestedName(e) {
-                return e.l.substring(e.l.lastIndexOf(".") + 1);
-            }
-
-            function concatResults(a1, a2) {
-                a1 = a1.concat(a2);
-                a2.length = 0;
-                return a1;
-            }
-
-            if (moduleSearchIndex) {
-                var mdleCount = 0;
-                $.each(moduleSearchIndex, function(index, item) {
-                    item.category = catModules;
-                    if (exactMatcher.test(item.l)) {
-                        result.push(item);
-                        mdleCount++;
-                    } else if (camelCaseMatcher.test(item.l)) {
-                        result.push(item);
-                    } else if (secondaryMatcher.test(item.l)) {
-                        secondaryresult.push(item);
-                    }
-                });
-                displayCount = mdleCount;
-                result = concatResults(result, secondaryresult);
-            }
-            if (packageSearchIndex) {
-                var pCount = 0;
-                var pkg = "";
-                $.each(packageSearchIndex, function(index, item) {
-                    item.category = catPackages;
-                    pkg = (item.m)
-                            ? (item.m + "/" + item.l)
-                            : item.l;
-                    if (exactMatcher.test(item.l)) {
-                        presult.push(item);
-                        pCount++;
-                    } else if (camelCaseMatcher.test(pkg)) {
-                        presult.push(item);
-                    } else if (secondaryMatcher.test(pkg)) {
-                        secondaryresult.push(item);
-                    }
-                });
-                result = result.concat(concatResults(presult, secondaryresult));
-                displayCount = (pCount > displayCount) ? pCount : displayCount;
-            }
-            if (typeSearchIndex) {
-                var tCount = 0;
-                $.each(typeSearchIndex, function(index, item) {
-                    item.category = catTypes;
-                    var s = nestedName(item);
-                    if (exactMatcher.test(s)) {
-                        tresult.push(item);
-                        tCount++;
-                    } else if (camelCaseMatcher.test(s)) {
-                        tresult.push(item);
-                    } else if (secondaryMatcher.test(item.p + "." + item.l)) {
-                        secondaryresult.push(item);
-                    }
-                });
-                result = result.concat(concatResults(tresult, secondaryresult));
-                displayCount = (tCount > displayCount) ? tCount : displayCount;
-            }
-            if (memberSearchIndex) {
-                var mCount = 0;
-                $.each(memberSearchIndex, function(index, item) {
-                    item.category = catMembers;
-                    var s = nestedName(item);
-                    if (exactMatcher.test(s)) {
-                        mresult.push(item);
-                        mCount++;
-                    } else if (camelCaseMatcher.test(s)) {
-                        mresult.push(item);
-                    } else if (secondaryMatcher.test(item.c + "." + item.l)) {
-                        secondaryresult.push(item);
-                    }
-                });
-                result = result.concat(concatResults(mresult, secondaryresult));
-                displayCount = (mCount > displayCount) ? mCount : displayCount;
-            }
-            if (tagSearchIndex) {
-                var tgCount = 0;
-                $.each(tagSearchIndex, function(index, item) {
-                    item.category = catSearchTags;
-                    if (exactMatcher.test(item.l)) {
-                        tgresult.push(item);
-                        tgCount++;
-                    } else if (secondaryMatcher.test(item.l)) {
-                        secondaryresult.push(item);
-                    }
-                });
-                result = result.concat(concatResults(tgresult, secondaryresult));
-                displayCount = (tgCount > displayCount) ? tgCount : displayCount;
-            }
-            displayCount = (displayCount > 500) ? displayCount : 500;
-            var counter = function() {
-                var count = {Modules: 0, Packages: 0, Types: 0, Members: 0, SearchTags: 0};
-                var f = function(item) {
-                    count[item.category] += 1;
-                    return (count[item.category] <= displayCount);
-                };
-                return f;
-            }();
-            response(result.filter(counter));
-        },
+        delay: 200,
+        source: doSearch,
         response: function(event, ui) {
             if (!ui.content.length) {
-                ui.content.push(noResult);
+                ui.content.push({ l: messages.noResult });
             } else {
-                $("#search").empty();
+                $("#search-input").empty();
             }
         },
         autoFocus: true,
+        focus: function(event, ui) {
+            return false;
+        },
         position: {
             collision: "flip"
         },
         select: function(event, ui) {
-            if (ui.item.l !== noResult.l) {
-                var url = getURLPrefix(ui);
-                if (ui.item.category === catModules) {
-                    if (useModuleDirectories) {
-                        url += "module-summary.html";
-                    } else {
-                        url = ui.item.l + "-summary.html";
-                    }
-                } else if (ui.item.category === catPackages) {
-                    if (ui.item.url) {
-                        url = ui.item.url;
-                    } else {
-                    url += ui.item.l.replace(/\./g, '/') + "/package-summary.html";
-                    }
-                } else if (ui.item.category === catTypes) {
-                    if (ui.item.url) {
-                        url = ui.item.url;
-                    } else if (ui.item.p === "<Unnamed>") {
-                        url += ui.item.l + ".html";
-                    } else {
-                        url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html";
-                    }
-                } else if (ui.item.category === catMembers) {
-                    if (ui.item.p === "<Unnamed>") {
-                        url += ui.item.c + ".html" + "#";
-                    } else {
-                        url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#";
-                    }
-                    if (ui.item.url) {
-                        url += ui.item.url;
-                    } else {
-                        url += ui.item.l;
-                    }
-                } else if (ui.item.category === catSearchTags) {
-                    url += ui.item.u;
-                }
-                if (top !== window) {
-                    parent.classFrame.location = pathtoroot + url;
-                } else {
-                    window.location.href = pathtoroot + url;
-                }
-                $("#search").focus();
+            if (ui.item.indexItem) {
+                var url = getURL(ui.item.indexItem, ui.item.category);
+                window.location.href = pathtoroot + url;
+                $("#search-input").focus();
             }
         }
     });
+    search.val('');
+    search.prop("disabled", false);
+    reset.prop("disabled", false);
+    reset.click(function() {
+        search.val('').focus();
+    });
+    search.focus();
 });
\ No newline at end of file