$.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
* Highlight the spoted element\r
*/\r
- highlightBlock(currentAnchor());
- \r
+ highlightBlock(currentAnchor());\r
+\r
/*\r
* Nav block folding\r
*/\r
$(this).find("a.fold").html("+");\r
}\r
$(this).nextAll().toggle();\r
- })
-
- // Instert search field
- $("nav.main ul")
- .append(
- $(document.createElement("li"))
- .append(
- $(document.createElement("form"))
- .append(
- $(document.createElement("input"))\r
- .attr({
- id: "search",\r
- type: "text",\r
- value: "quick search..."\r
- })\r
- .addClass("notUsed")\r
- .keyup(function() {\r
- $(this).parent().parent().find("ul li:not(:icontains('" + $(this).val() + "'))").addClass("hide");\r
- $(this).parent().parent().find("ul li:icontains('" + $(this).val() + "')").removeClass("hide");\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
- })
- )
- .submit( function() {
- if($("#search").val().length == 0)
- return false
-
- window.location = "full-index.html#q=" + $("#search").val();
- if(window.location.href.indexOf("full-index.html") > -1) {
- location.reload();
- }
- return false;
- })
- )
- );\r
+ })\r
\r
- /*\r
- * Anchors jumps\r
- */\r
- $("a[href^='#']").click( function() {\r
- var a = $(this).attr("href").replace(/#/, "");\r
- highlightBlock(a);\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
+\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
+ $(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 = "full-index.html#q=" + $("#search").val();\r
+ if(window.location.href.indexOf("full-index.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 query = $("#search").val();\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
+ query = query.replace(/>/gi, ">");\r
+ query = query.replace(/</gi, "<");\r
+\r
+ var index = 0;\r
+ var regexp = new RegExp("^" + query, "i");\r
+ for(var entry in entries) {\r
+ if(index > 10) {\r
+ break;\r
+ }\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
+ 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
+ \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
})\r
)\r
);\r
-
+ \r
// Filter toggle between H I R in nav porperties list\r
$("nav.properties.filterable .filter")\r
.append(\r
\r
$(this).toggleClass("hidden");\r
})\r
- );
-
- // Filter toggle between I R in
+ );\r
+ \r
+ // Filter toggle between I R in \r
$("article.properties.filterable .filter, article.classes.filterable .filter")\r
.append(\r
$(document.createElement("a"))\r
\r
$(this).toggleClass("hidden");\r
})\r
- );
-
- //Preload filter fields with query string
+ );\r
+\r
+ /*\r
+ * Anchors jumps\r
+ */\r
+ $("a[href*='#']").click( function() {\r
+ highlightBlock($(this).attr("href").split(/#/)[1]);\r
+ });\r
+\r
+ //Preload filter fields with query string\r
preloadFilters();\r
+\r
+ //Copy to clipboard utility on signatures\r
+ $(".signature").each(function(){\r
+ $(this).append(\r
+ $("<button class='copyButton' data-clipboard-text='" + $(this).attr("data-untyped-signature") + "'></button>")\r
+ .append($("<img src='./resources/icons/copy.png' />"))\r
+ )\r
+ });\r
+\r
+ var clip = new ZeroClipboard($(".copyButton"), {\r
+ moviePath: "./ZeroClipboard.swf"\r
+ } );\r
});\r
\r
/* Parse current URL and return anchor name */\r
return null;\r
}\r
\r
-/* Prealod filters field using search query */
-function preloadFilters() {
- // Parse URL and get query string
- var search = currentAnchor();
-
- if(search == null || search.indexOf("q=") == -1)
- return;
-
+/* Prealod filters field using search query */\r
+function preloadFilters() {\r
+ // Parse URL and get query string\r
+ var search = currentAnchor();\r
+ \r
+ if(search == null || search.indexOf("q=") == -1)\r
+ return;\r
+ \r
search = search.substring(2, search.length); \r
-
- if(search == "" || search == "undefined")
- return;
\r
- $(":text").val(search);
- $(".filter :text")
- .removeClass("notUsed")
- .trigger("keyup");
-
+ if(search == "" || search == "undefined")\r
+ return;\r
+ \r
+ $(":text").val(search);\r
+ $(".filter :text")\r
+ .removeClass("notUsed")\r
+ .trigger("keyup");\r
+\r
}\r
\r
/* Hightlight the spoted block */\r
\r
target.addClass("highlighted");\r
target.show();\r
-}
\ No newline at end of file
+}\r