--- /dev/null
+/*
+ * QuickSearch
+ */
+
+// Current search results preview table
+var currentTable = null;
+
+//Hightlighted index in search result preview table
+var currentIndex = -1;
+
+$(document).ready(function() {
+
+ // Insert search field
+ $("nav.main ul")
+ .append(
+ $(document.createElement("li"))
+ .append(
+ $(document.createElement("form"))
+ .append(
+ $(document.createElement("input"))
+ .attr({
+ id: "search",
+ type: "text",
+ autocomplete: "off",
+ value: "quick search..."
+ })
+ .addClass("notUsed")
+
+ // Key management
+ .keyup(function(e) {
+ switch(e.keyCode) {
+ // Up
+ case 38:
+ Nitdoc.QuickSearch.selectPrevResult();
+ break;
+
+ // Down
+ case 40:
+ Nitdoc.QuickSearch.selectNextResult();
+ break;
+ // Enter
+ case 13:
+ Nitdoc.QuickSearch.goToResult();
+ return false;
+ break;
+
+ // Escape
+ case 27:
+ $(this).blur();
+ Nitdoc.QuickSearch.close();
+ break;
+
+ // Other keys
+ default:
+ var query = $("#search").val();
+ if(!query) {
+ return false;
+ }
+ var results = Nitdoc.QuickSearch.search(query);
+ Nitdoc.QuickSearch.showResults(query, results);
+ break;
+ }
+ })
+ .focusout(function() {
+ if($(this).val() == "") {
+ $(this).addClass("notUsed");
+ $(this).val("quick search...");
+ }
+ })
+ .focusin(function() {
+ if($(this).val() == "quick search...") {
+ $(this).removeClass("notUsed");
+ $(this).val("");
+ }
+ })
+ )
+ .submit( function() {
+ return false;
+ })
+ )
+ );
+
+ // Close quicksearch list on click
+ $(document).click(function(e) {
+ Nitdoc.QuickSearch.close();
+ });
+});
+
+var Nitdoc = {};
+Nitdoc.QuickSearch = {};
+
+// Do search
+Nitdoc.QuickSearch.search = function(query) {
+ // Escape regexp related characters in query
+ query = query.replace(/\\/gi, "\\\\");
+ query = query.replace(/\[/gi, "\\[");
+ query = query.replace(/\|/gi, "\\|");
+ query = query.replace(/\*/gi, "\\*");
+ query = query.replace(/\+/gi, "\\+");
+ query = query.replace(/\?/gi, "\\?");
+ query = query.replace(/\(/gi, "\\(");
+ query = query.replace(/\)/gi, "\\)");
+ query = query.replace(/&/gi, "&&");
+ // Look for matches in JSON entries
+ var results = new Array();
+ var regexp = new RegExp("^" + query, "i");
+ for(var entry in entries) {
+ var match = entry.match(regexp);
+ if(match != null) {
+ for(var i in entries[entry]) {
+ var result = entries[entry][i];
+ result.entry = entry;
+ results[results.length] = result;
+ }
+ }
+ }
+ return results;
+}
+
+// Display resulsts in popup table
+Nitdoc.QuickSearch.showResults = function(query, results) {
+ // Remove previous table
+ if(currentTable != null) {
+ currentTable.remove();
+ }
+ // Build results table
+ currentIndex = -1;
+ currentTable = $(document.createElement("table"));
+ var overflow = 0;
+ for(var i in results) {
+ if(i > 10) {
+ overflow++;
+ break;
+ }
+ var result = results[i];
+ currentTable.append(
+ $(document.createElement("tr"))
+ .data("searchDetails", {name: result.entry, url: result.url})
+ .data("index", i)
+ .append($(document.createElement("td")).html(result.entry))
+ .append(
+ $(document.createElement("td"))
+ .addClass("entryInfo")
+ .html(result.txt + " »")
+ )
+ .mouseover( function() {
+ $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+ $(this).addClass("activeSearchResult");
+ currentIndex = $(this).data("index");
+ })
+ .mouseout( function() {
+ $(this).removeClass("activeSearchResult");
+ })
+ .click( function() {
+ window.location = $(this).data("searchDetails")["url"];
+ })
+ );
+ }
+ if(overflow > 0) {
+ currentTable.append(
+ $("<tr class='overflow'>")
+ .append(
+ $("<td colspan='2'>")
+ .append(
+ $("<a href='#' title='Show all results' data-query='"+ query +"'>" + overflow + " more results for '" + query + "'</a>")
+ .click(function() {
+ window.location = "search.html#q=" + $(this).attr("data-query");
+ if(window.location.href.indexOf("search.html") > -1) {
+ location.reload();
+ }
+ })
+ )
+ )
+ );
+ }
+ // Initialize table properties
+ currentTable.attr("id", "searchTable");
+ currentTable.css("position", "absolute");
+ currentTable.width($("#search").outerWidth());
+ $("body").append(currentTable);
+ currentTable.offset({left: $("#search").offset().left + ($("#search").outerWidth() - currentTable.outerWidth()), top: $("#search").offset().top + $("#search").outerHeight()});
+ // Preselect first entry
+ if(currentTable.find("tr").length > 0) {
+ currentIndex = 0;
+ $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+ $("#search").focus();
+ }
+}
+
+// Select the previous result
+Nitdoc.QuickSearch.selectPrevResult = function() {
+ // If already on first result, focus search input
+ if(currentIndex == 0) {
+ $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+ $("#search").focus();
+ // Else select previous result
+ } else if(currentIndex > 0) {
+ $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+ currentIndex--;
+ $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+ $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+ $("#search").focus();
+ }
+}
+
+// Select the next result
+Nitdoc.QuickSearch.selectNextResult = function() {
+ if(currentIndex < currentTable.find("tr").length - 1) {
+ if($(currentTable.find("tr")[currentIndex + 1]).hasClass("overflow")) {
+ return;
+ }
+ $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+ currentIndex++;
+ $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+ $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+ $("#search").focus();
+ }
+}
+
+// Load selected search result
+Nitdoc.QuickSearch.goToResult = function() {
+ if(currentIndex > -1) {
+ window.location = $(currentTable.find("tr")[currentIndex]).data("searchDetails").url;
+ return;
+ }
+
+ if($("#search").val().length == 0) { return; }
+
+ window.location = "search.html#q=" + $("#search").val();
+ if(window.location.href.indexOf("search.html") > -1) {
+ location.reload();
+ }
+}
+
+// Close the QuickSearch results
+Nitdoc.QuickSearch.close = function(target) {
+ if(target != $("#search")[0] && target != $("#searchTable")[0]) {
+ if(currentTable != null) {
+ currentTable.remove();
+ currentTable = null;
+ }
+ }
+}
+
$.expr[':'].icontains = function(obj, index, meta, stack){\r
return (obj.textContent.replace(/\[[0-9]+\]/g, "") || obj.innerText.replace(/\[[0-9]+\]/g, "") || jQuery(obj).text().replace(/\[[0-9]+\]/g, "") || '').toLowerCase().indexOf(meta[3].toLowerCase()) >= 0;\r
};\r
-/*\r
- * Quick Search global vars\r
- */\r
-\r
-// Current search results preview table\r
-var currentTable = null;\r
-\r
-//Hightlighted index in search result preview table\r
-var currentIndex = -1;\r
\r
/*\r
* Add folding and filtering facilities to class description page.\r
*/\r
$(document).ready(function() {\r
\r
- /*\r
- * Nav block folding\r
- */\r
-\r
// Menu nav folding\r
$(".menu nav h3")\r
.prepend(\r
$(this).nextAll().toggle();\r
})\r
\r
- // Insert search field\r
- $("nav.main ul")\r
- .append(\r
- $(document.createElement("li"))\r
- .append(\r
- $(document.createElement("form"))\r
- .append(\r
- $(document.createElement("input"))\r
- .attr({\r
- id: "search",\r
- type: "text",\r
- autocomplete: "off",\r
- value: "quick search..."\r
- })\r
- .addClass("notUsed")\r
-\r
- // Key management\r
- .keyup(function(e) {\r
- switch(e.keyCode) {\r
- // Select previous result on "Up"\r
- case 38:\r
- // If already on first result, focus search input\r
- if(currentIndex == 0) {\r
- $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
- $("#search").focus();\r
- // Else select previous result\r
- } else if(currentIndex > 0) {\r
- $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
- currentIndex--;\r
- $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
- $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
- $("#search").focus();\r
- }\r
- break;\r
-\r
- // Select next result on "Down"\r
- case 40:\r
- if(currentIndex < currentTable.find("tr").length - 1) {\r
- if($(currentTable.find("tr")[currentIndex + 1]).hasClass("overflow")) {\r
- break;\r
- }\r
- $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
- currentIndex++;\r
- $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
- $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
- $("#search").focus();\r
- }\r
- break;\r
- // Go to url on "Enter"\r
- case 13:\r
- if(currentIndex > -1) {\r
- window.location = $(currentTable.find("tr")[currentIndex]).data("searchDetails").url;\r
- return false;\r
- }\r
- if($("#search").val().length == 0)\r
- return false\r
-\r
- window.location = "search.html#q=" + $("#search").val();\r
- if(window.location.href.indexOf("search.html") > -1) {\r
- location.reload();\r
- }\r
- return false;\r
- break;\r
-\r
- // Hide results preview on "Escape"\r
- case 27:\r
- $(this).blur();\r
- if(currentTable != null) {\r
- currentTable.remove();\r
- currentTable = null;\r
- }\r
- break;\r
-\r
- default:\r
- if($("#search").val().length == 0) {\r
- return false;\r
- }\r
-\r
- // Remove previous table\r
- if(currentTable != null) {\r
- currentTable.remove();\r
- }\r
-\r
- // Build results table\r
- currentIndex = -1;\r
- currentTable = $(document.createElement("table"));\r
-\r
- // Escape regexp related characters in query\r
- var origQuery = $("#search").val();\r
- var query = origQuery;\r
- query = query.replace(/\\/gi, "\\\\");\r
- query = query.replace(/\[/gi, "\\[");\r
- query = query.replace(/\|/gi, "\\|");\r
- query = query.replace(/\*/gi, "\\*");\r
- query = query.replace(/\+/gi, "\\+");\r
- query = query.replace(/\?/gi, "\\?");\r
- query = query.replace(/\(/gi, "\\(");\r
- query = query.replace(/\)/gi, "\\)");\r
- query = query.replace(/&/gi, "&&");\r
-\r
- var index = 0;\r
- var regexp = new RegExp("^" + query);\r
- var overflow = 0;\r
- for(var entry in entries) {\r
- var result = entry.match(regexp);\r
- if(result != null) {\r
- for(var i = 0; i < entries[entry].length; i++) {\r
- if(index > 10) {\r
- overflow++;\r
- break;\r
- }\r
- currentTable.append(\r
- $(document.createElement("tr"))\r
- .data("searchDetails", {name: entry, url: entries[entry][i]["url"]})\r
- .data("index", index)\r
- .append($(document.createElement("td")).html(entry))\r
- .append(\r
- $(document.createElement("td"))\r
- .addClass("entryInfo")\r
- .html(entries[entry][i]["txt"] + " »"))\r
- .mouseover( function() {\r
- $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
- $(this).addClass("activeSearchResult");\r
- currentIndex = $(this).data("index");\r
- })\r
- .mouseout( function() {\r
- $(this).removeClass("activeSearchResult");\r
- })\r
- .click( function() {\r
- window.location = $(this).data("searchDetails")["url"];\r
- })\r
- );\r
- index++;\r
- }\r
- }\r
- }\r
- if(overflow > 0) {\r
- currentTable.append(\r
- $("<tr class='overflow'>")\r
- .append(\r
- $("<td colspan='2'>")\r
- .append(\r
- $("<a href='#' title='Show all results' data-query='"+ origQuery +"'>" + overflow + " more results for '" + origQuery + "'</a>")\r
- .click(function() {\r
- window.location = "search.html#q=" + $(this).attr("data-query");\r
- if(window.location.href.indexOf("search.html") > -1) {\r
- location.reload();\r
- }\r
- })\r
- )\r
- )\r
- );\r
- }\r
-\r
- // Initialize table properties\r
- currentTable.attr("id", "searchTable");\r
- currentTable.css("position", "absolute");\r
- currentTable.width($("#search").outerWidth());\r
- $("header").append(currentTable);\r
- currentTable.offset({left: $("#search").offset().left + ($("#search").outerWidth() - currentTable.outerWidth()), top: $("#search").offset().top + $("#search").outerHeight()});\r
-\r
- // Preselect first entry\r
- if(currentTable.find("tr").length > 0) {\r
- currentIndex = 0;\r
- $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
- $("#search").focus();\r
- }\r
- break;\r
- }\r
- })\r
- .focusout(function() {\r
- if($(this).val() == "") {\r
- $(this).addClass("notUsed");\r
- $(this).val("quick search...");\r
- }\r
- })\r
- .focusin(function() {\r
- if($(this).val() == "quick search...") {\r
- $(this).removeClass("notUsed");\r
- $(this).val("");\r
- }\r
- })\r
- )\r
- .submit( function() {\r
- return false;\r
- })\r
- )\r
- );\r
-\r
- // Close quicksearch list on click\r
- $(document).click(function(e) {\r
- if(e.target != $("#search")[0] && e.target != $("#searchTable")[0]) {\r
- if(currentTable != null) {\r
- currentTable.remove();\r
- currentTable = null;\r
- }\r
- }\r
- });\r
-\r
// Insert filter field\r
$("article.filterable h2, nav.filterable h3")\r
.after(\r
append("<script type='text/javascript' src='scripts/base64.js'></script>")
append("<script type='text/javascript' src='scripts/github.js'></script>")
append("<script type='text/javascript' src='scripts/js-facilities.js'></script>")
+ append("<script type='text/javascript' src='scripts/Nitdoc.QuickSearch.js'></script>")
append("<link rel='stylesheet' href='styles/main.css' type='text/css' media='screen'/>")
append("<link rel='stylesheet' href='styles/github.css' type='text/css' media='screen'/>")
var title = ""