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();
229 // Insert filter field
230 $
("article.filterable h2, nav.filterable h3")
232 $
(document
.createElement("div"))
235 $
(document
.createElement("input"))
242 $
(this).parent().parent().find("ul li:not(:icontains('" + $
(this).val() + "'))").addClass("hide");
243 $
(this).parent().parent().find("ul li:icontains('" + $
(this).val() + "')").removeClass("hide");
245 .focusout(function() {
246 if($
(this).val() == "") {
247 $
(this).addClass("notUsed");
248 $
(this).val("filter...");
251 .focusin(function() {
252 if($
(this).val() == "filter...") {
253 $
(this).removeClass("notUsed");
260 // Filter toggle between H I R in nav porperties list
261 $
("nav.properties.filterable .filter")
263 $
(document
.createElement("a"))
266 title
: "hide inherited properties"
269 if($
(this).hasClass("hidden")) {
270 $
(this).parent().parent().find("li.inherit").show();
272 $
(this).parent().parent().find("li.inherit").hide();
275 $
(this).toggleClass("hidden");
279 $
(document
.createElement("a"))
282 title
: "hide redefined properties"
285 if($
(this).hasClass("hidden")) {
286 $
(this).parent().parent().find("li.redef").show();
288 $
(this).parent().parent().find("li.redef").hide();
291 $
(this).toggleClass("hidden");
295 $
(document
.createElement("a"))
298 title
: "hide introduced properties"
301 if($
(this).hasClass("hidden")) {
302 $
(this).parent().parent().find("li.intro").show();
304 $
(this).parent().parent().find("li.intro").hide();
307 $
(this).toggleClass("hidden");
311 // Filter toggle between I R in
312 $
("article.properties.filterable .filter, article.classes.filterable .filter")
314 $
(document
.createElement("a"))
317 title
: "hide introduced properties"
320 if($
(this).hasClass("hidden")) {
321 $
(this).parent().parent().find("li.intro").show();
323 $
(this).parent().parent().find("li.intro").hide();
326 $
(this).toggleClass("hidden");
330 $
(document
.createElement("a"))
333 title
: "hide redefined properties"
336 if($
(this).hasClass("hidden")) {
337 $
(this).parent().parent().find("li.redef").show();
339 $
(this).parent().parent().find("li.redef").hide();
342 $
(this).toggleClass("hidden");
349 $
("a[href*='#']").click( function() {
350 highlightBlock($
(this).attr("href").split(/#
/)[1]);
353 //Preload filter fields with query string
357 /* Parse current URL and return anchor name */
358 function currentAnchor() {
359 var index
= document
.location
.hash
.indexOf("#");
361 return document
.location
.hash
.substring(index
+ 1);
366 /* Prealod filters field using search query */
367 function preloadFilters() {
368 // Parse URL and get query string
369 var search
= currentAnchor();
371 if(search
== null || search
.indexOf("q=") == -1)
374 search
= search
.substring(2, search
.length
);
376 if(search
== "" || search
== "undefined")
379 $
(":text").val(search
);
381 .removeClass("notUsed")
386 /* Hightlight the spoted block */
387 function highlightBlock(a
) {
392 $
(".highlighted").removeClass("highlighted");
394 var target
= $
("#" + a
);
396 if(target
.is("article")) {
397 target
.parent().addClass("highlighted");
400 target
.addClass("highlighted");