2 * JQuery Case Insensitive :icontains selector
4 $
.expr
[':'].icontains
= function(obj
, index
, meta
, stack
){
5 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;
9 * Quick Search global vars
12 // Current search results preview table
13 var currentTable
= null;
15 //Hightlighted index in search result preview table
16 var currentIndex
= -1;
20 * Add folding and filtering facilities to class description page.
22 $
(document
).ready(function() {
25 * Highlight the spoted element
27 highlightBlock(currentAnchor());
36 $
(document
.createElement("a"))
40 .css("cursor", "pointer")
42 if($
(this).find("a.fold").html() == "+") {
43 $
(this).find("a.fold").html("-");
45 $
(this).find("a.fold").html("+");
47 $
(this).nextAll().toggle();
50 // Insert search field
53 $
(document
.createElement("li"))
55 $
(document
.createElement("form"))
57 $
(document
.createElement("input"))
62 value
: "quick search..."
70 // Select previous result on "Up"
72 // If already on first result, focus search input
73 if(currentIndex
== 0) {
74 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
76 // Else select previous result
77 } else if(currentIndex
> 0) {
78 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
80 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
81 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
86 // Select next result on "Down"
88 if(currentIndex
< currentTable
.find("tr").length
- 1) {
89 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
91 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
92 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
96 // Go to url on "Enter"
98 if(currentIndex
> -1) {
99 window
.location
= $
(currentTable
.find("tr")[currentIndex]).data("searchDetails").url
;
102 if($
("#search").val().length
== 0)
105 window
.location
= "full-index.html#q=" + $
("#search").val();
106 if(window
.location
.href
.indexOf("full-index.html") > -1) {
112 // Hide results preview on "Escape"
115 if(currentTable
!= null) {
116 currentTable
.remove();
122 if($
("#search").val().length
== 0) {
126 // Remove previous table
127 if(currentTable
!= null) {
128 currentTable
.remove();
131 // Build results table
133 currentTable
= $
(document
.createElement("table"));
135 // Escape regexp related characters in query
136 var query
= $
("#search").val();
137 query
= query
.replace(/\
[/gi
, "\\[");
138 query
= query
.replace(/\|
/gi
, "\\|");
139 query
= query
.replace(/\*/gi
, "\\*");
140 query
= query
.replace(/\
+/gi
, "\\+");
141 query
= query
.replace(/\\/gi
, "\\\\");
142 query
= query
.replace(/\?/gi
, "\\?");
143 query
= query
.replace(/\
(/gi
, "\\(");
144 query
= query
.replace(/\
)/gi
, "\\)");
147 var regexp
= new RegExp("^" + query
, "i");
148 for(var entry
in entries
) {
152 var result
= entry
.match(regexp
);
153 if(result
!= null && result
.toString().toUpperCase() == $
("#search").val().toUpperCase()) {
154 for(var i
= 0; i
< entries
[entry].length
; i
++) {
159 $
(document
.createElement("tr"))
160 .data("searchDetails", {name
: entry
, url
: entries
[entry][i]["url"]})
161 .data("index", index
)
162 .append($
(document
.createElement("td")).html(entry
))
164 $
(document
.createElement("td"))
165 .addClass("entryInfo")
166 .html(entries
[entry][i]["txt"] + " »"))
167 .mouseover( function() {
168 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
169 $
(this).addClass("activeSearchResult");
170 currentIndex
= $
(this).data("index");
172 .mouseout( function() {
173 $
(this).removeClass("activeSearchResult");
176 window
.location
= $
(this).data("searchDetails")["url"];
184 // Initialize table properties
185 currentTable
.attr("id", "searchTable");
186 currentTable
.css("position", "absolute");
187 currentTable
.width($
("#search").outerWidth());
188 $
("header").append(currentTable
);
189 currentTable
.offset({left
: $
("#search").offset().left
+ ($
("#search").outerWidth() - currentTable
.outerWidth()), top
: $
("#search").offset().top
+ $
("#search").outerHeight()});
191 // Preselect first entry
192 if(currentTable
.find("tr").length
> 0) {
194 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
195 $
("#search").focus();
200 .focusout(function() {
201 if($
(this).val() == "") {
202 $
(this).addClass("notUsed");
203 $
(this).val("quick search...");
206 .focusin(function() {
207 if($
(this).val() == "quick search...") {
208 $
(this).removeClass("notUsed");
213 .submit( function() {
219 // Close quicksearch list on click
220 $
(document
).click(function(e
) {
221 if(e
.target
!= $
("#search")[0] && e
.target
!= $
("#searchTable")[0]) {
222 if(currentTable
!= null) {
223 currentTable
.remove();
232 $
("a[href^='#']").click( function() {
233 var a
= $
(this).attr("href").replace(/#
/, "");
237 // Insert filter field
238 $
("article.filterable h2, nav.filterable h3")
240 $
(document
.createElement("div"))
243 $
(document
.createElement("input"))
250 $
(this).parent().parent().find("ul li:not(:icontains('" + $
(this).val() + "'))").addClass("hide");
251 $
(this).parent().parent().find("ul li:icontains('" + $
(this).val() + "')").removeClass("hide");
253 .focusout(function() {
254 if($
(this).val() == "") {
255 $
(this).addClass("notUsed");
256 $
(this).val("filter...");
259 .focusin(function() {
260 if($
(this).val() == "filter...") {
261 $
(this).removeClass("notUsed");
268 // Filter toggle between H I R in nav porperties list
269 $
("nav.properties.filterable .filter")
271 $
(document
.createElement("a"))
274 title
: "hide inherited properties"
277 if($
(this).hasClass("hidden")) {
278 $
(this).parent().parent().find("li.inherit").show();
280 $
(this).parent().parent().find("li.inherit").hide();
283 $
(this).toggleClass("hidden");
287 $
(document
.createElement("a"))
290 title
: "hide redefined properties"
293 if($
(this).hasClass("hidden")) {
294 $
(this).parent().parent().find("li.redef").show();
296 $
(this).parent().parent().find("li.redef").hide();
299 $
(this).toggleClass("hidden");
303 $
(document
.createElement("a"))
306 title
: "hide introduced properties"
309 if($
(this).hasClass("hidden")) {
310 $
(this).parent().parent().find("li.intro").show();
312 $
(this).parent().parent().find("li.intro").hide();
315 $
(this).toggleClass("hidden");
319 // Filter toggle between I R in
320 $
("article.properties.filterable .filter, article.classes.filterable .filter")
322 $
(document
.createElement("a"))
325 title
: "hide introduced properties"
328 if($
(this).hasClass("hidden")) {
329 $
(this).parent().parent().find("li.intro").show();
331 $
(this).parent().parent().find("li.intro").hide();
334 $
(this).toggleClass("hidden");
338 $
(document
.createElement("a"))
341 title
: "hide redefined properties"
344 if($
(this).hasClass("hidden")) {
345 $
(this).parent().parent().find("li.redef").show();
347 $
(this).parent().parent().find("li.redef").hide();
350 $
(this).toggleClass("hidden");
354 //Preload filter fields with query string
358 /* Parse current URL and return anchor name */
359 function currentAnchor() {
360 var index
= document
.location
.hash
.indexOf("#");
362 return document
.location
.hash
.substring(index
+ 1);
367 /* Prealod filters field using search query */
368 function preloadFilters() {
369 // Parse URL and get query string
370 var search
= currentAnchor();
372 if(search
== null || search
.indexOf("q=") == -1)
375 search
= search
.substring(2, search
.length
);
377 if(search
== "" || search
== "undefined")
380 $
(":text").val(search
);
382 .removeClass("notUsed")
387 /* Hightlight the spoted block */
388 function highlightBlock(a
) {
393 $
(".highlighted").removeClass("highlighted");
395 var target
= $
("#" + a
);
397 if(target
.is("article")) {
398 target
.parent().addClass("highlighted");
401 target
.addClass("highlighted");