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()});
193 .focusout(function() {
194 if($
(this).val() == "") {
195 $
(this).addClass("notUsed");
196 $
(this).val("quick search...");
199 .focusin(function() {
200 if($
(this).val() == "quick search...") {
201 $
(this).removeClass("notUsed");
206 .submit( function() {
215 $
("a[href^='#']").click( function() {
216 var a
= $
(this).attr("href").replace(/#
/, "");
220 // Insert filter field
221 $
("article.filterable h2, nav.filterable h3")
223 $
(document
.createElement("div"))
226 $
(document
.createElement("input"))
233 $
(this).parent().parent().find("ul li:not(:icontains('" + $
(this).val() + "'))").addClass("hide");
234 $
(this).parent().parent().find("ul li:icontains('" + $
(this).val() + "')").removeClass("hide");
236 .focusout(function() {
237 if($
(this).val() == "") {
238 $
(this).addClass("notUsed");
239 $
(this).val("filter...");
242 .focusin(function() {
243 if($
(this).val() == "filter...") {
244 $
(this).removeClass("notUsed");
251 // Filter toggle between H I R in nav porperties list
252 $
("nav.properties.filterable .filter")
254 $
(document
.createElement("a"))
257 title
: "hide inherited properties"
260 if($
(this).hasClass("hidden")) {
261 $
(this).parent().parent().find("li.inherit").show();
263 $
(this).parent().parent().find("li.inherit").hide();
266 $
(this).toggleClass("hidden");
270 $
(document
.createElement("a"))
273 title
: "hide redefined properties"
276 if($
(this).hasClass("hidden")) {
277 $
(this).parent().parent().find("li.redef").show();
279 $
(this).parent().parent().find("li.redef").hide();
282 $
(this).toggleClass("hidden");
286 $
(document
.createElement("a"))
289 title
: "hide introduced properties"
292 if($
(this).hasClass("hidden")) {
293 $
(this).parent().parent().find("li.intro").show();
295 $
(this).parent().parent().find("li.intro").hide();
298 $
(this).toggleClass("hidden");
302 // Filter toggle between I R in
303 $
("article.properties.filterable .filter, article.classes.filterable .filter")
305 $
(document
.createElement("a"))
308 title
: "hide introduced properties"
311 if($
(this).hasClass("hidden")) {
312 $
(this).parent().parent().find("li.intro").show();
314 $
(this).parent().parent().find("li.intro").hide();
317 $
(this).toggleClass("hidden");
321 $
(document
.createElement("a"))
324 title
: "hide redefined properties"
327 if($
(this).hasClass("hidden")) {
328 $
(this).parent().parent().find("li.redef").show();
330 $
(this).parent().parent().find("li.redef").hide();
333 $
(this).toggleClass("hidden");
337 //Preload filter fields with query string
341 /* Parse current URL and return anchor name */
342 function currentAnchor() {
343 var index
= document
.location
.hash
.indexOf("#");
345 return document
.location
.hash
.substring(index
+ 1);
350 /* Prealod filters field using search query */
351 function preloadFilters() {
352 // Parse URL and get query string
353 var search
= currentAnchor();
355 if(search
== null || search
.indexOf("q=") == -1)
358 search
= search
.substring(2, search
.length
);
360 if(search
== "" || search
== "undefined")
363 $
(":text").val(search
);
365 .removeClass("notUsed")
370 /* Hightlight the spoted block */
371 function highlightBlock(a
) {
376 $
(".highlighted").removeClass("highlighted");
378 var target
= $
("#" + a
);
380 if(target
.is("article")) {
381 target
.parent().addClass("highlighted");
384 target
.addClass("highlighted");