1b575bde4b3405bb538b2c58ac1f1c6c66ca6694
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;
19 * Add folding and filtering facilities to class description page.
21 $
(document
).ready(function() {
24 * Highlight the spoted element
26 highlightBlock(currentAnchor());
35 $
(document
.createElement("a"))
39 .css("cursor", "pointer")
41 if($
(this).find("a.fold").html() == "+") {
42 $
(this).find("a.fold").html("-");
44 $
(this).find("a.fold").html("+");
46 $
(this).nextAll().toggle();
49 // Insert search field
52 $
(document
.createElement("li"))
54 $
(document
.createElement("form"))
56 $
(document
.createElement("input"))
61 value
: "quick search..."
69 // Select previous result on "Up"
71 // If already on first result, focus search input
72 if(currentIndex
== 0) {
73 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
75 // Else select previous result
76 } else if(currentIndex
> 0) {
77 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
79 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
80 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
85 // Select next result on "Down"
87 if(currentIndex
< currentTable
.find("tr").length
- 1) {
88 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
90 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
91 $
("#search").val($
(currentTable
.find("tr")[currentIndex]).data("searchDetails").name
);
95 // Go to url on "Enter"
97 if(currentIndex
> -1) {
98 window
.location
= $
(currentTable
.find("tr")[currentIndex]).data("searchDetails").url
;
101 if($
("#search").val().length
== 0)
104 window
.location
= "full-index.html#q=" + $
("#search").val();
105 if(window
.location
.href
.indexOf("full-index.html") > -1) {
111 // Hide results preview on "Escape"
114 if(currentTable
!= null) {
115 currentTable
.remove();
121 if($
("#search").val().length
== 0) {
125 // Remove previous table
126 if(currentTable
!= null) {
127 currentTable
.remove();
130 // Build results table
132 currentTable
= $
(document
.createElement("table"));
134 // Escape regexp related characters in query
135 var query
= $
("#search").val();
136 query
= query
.replace(/\\/gi
, "\\\\");
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
, "&&");
145 query
= query
.replace(/>/gi
, ">");
146 query
= query
.replace(/</gi
, "<");
149 var regexp
= new RegExp("^" + query
, "i");
150 for(var entry
in entries
) {
154 var result
= entry
.match(regexp
);
156 for(var i
= 0; i
< entries
[entry].length
; i
++) {
161 $
(document
.createElement("tr"))
162 .data("searchDetails", {name
: entry
, url
: entries
[entry][i]["url"]})
163 .data("index", index
)
164 .append($
(document
.createElement("td")).html(entry
))
166 $
(document
.createElement("td"))
167 .addClass("entryInfo")
168 .html(entries
[entry][i]["txt"] + " »"))
169 .mouseover( function() {
170 $
(currentTable
.find("tr")[currentIndex]).removeClass("activeSearchResult");
171 $
(this).addClass("activeSearchResult");
172 currentIndex
= $
(this).data("index");
174 .mouseout( function() {
175 $
(this).removeClass("activeSearchResult");
178 window
.location
= $
(this).data("searchDetails")["url"];
186 // Initialize table properties
187 currentTable
.attr("id", "searchTable");
188 currentTable
.css("position", "absolute");
189 currentTable
.width($
("#search").outerWidth());
190 $
("header").append(currentTable
);
191 currentTable
.offset({left
: $
("#search").offset().left
+ ($
("#search").outerWidth() - currentTable
.outerWidth()), top
: $
("#search").offset().top
+ $
("#search").outerHeight()});
193 // Preselect first entry
194 if(currentTable
.find("tr").length
> 0) {
196 $
(currentTable
.find("tr")[currentIndex]).addClass("activeSearchResult");
197 $
("#search").focus();
202 .focusout(function() {
203 if($
(this).val() == "") {
204 $
(this).addClass("notUsed");
205 $
(this).val("quick search...");
208 .focusin(function() {
209 if($
(this).val() == "quick search...") {
210 $
(this).removeClass("notUsed");
215 .submit( function() {
221 // Close quicksearch list on click
222 $
(document
).click(function(e
) {
223 if(e
.target
!= $
("#search")[0] && e
.target
!= $
("#searchTable")[0]) {
224 if(currentTable
!= null) {
225 currentTable
.remove();
231 // Insert filter field
232 $
("article.filterable h2, nav.filterable h3")
234 $
(document
.createElement("div"))
237 $
(document
.createElement("input"))
244 $
(this).parent().parent().find("ul li:not(:icontains('" + $
(this).val() + "'))").addClass("hide");
245 $
(this).parent().parent().find("ul li:icontains('" + $
(this).val() + "')").removeClass("hide");
247 .focusout(function() {
248 if($
(this).val() == "") {
249 $
(this).addClass("notUsed");
250 $
(this).val("filter...");
253 .focusin(function() {
254 if($
(this).val() == "filter...") {
255 $
(this).removeClass("notUsed");
262 // Filter toggle between H I R in nav porperties list
263 $
("nav.properties.filterable .filter")
265 $
(document
.createElement("a"))
268 title
: "hide inherited properties"
271 if($
(this).hasClass("hidden")) {
272 $
(this).parent().parent().find("li.inherit").show();
274 $
(this).parent().parent().find("li.inherit").hide();
277 $
(this).toggleClass("hidden");
281 $
(document
.createElement("a"))
284 title
: "hide redefined properties"
287 if($
(this).hasClass("hidden")) {
288 $
(this).parent().parent().find("li.redef").show();
290 $
(this).parent().parent().find("li.redef").hide();
293 $
(this).toggleClass("hidden");
297 $
(document
.createElement("a"))
300 title
: "hide introduced properties"
303 if($
(this).hasClass("hidden")) {
304 $
(this).parent().parent().find("li.intro").show();
306 $
(this).parent().parent().find("li.intro").hide();
309 $
(this).toggleClass("hidden");
313 // Filter toggle between I R in
314 $
("article.properties.filterable .filter, article.classes.filterable .filter")
316 $
(document
.createElement("a"))
319 title
: "hide introduced properties"
322 if($
(this).hasClass("hidden")) {
323 $
(this).parent().parent().find("li.intro").show();
325 $
(this).parent().parent().find("li.intro").hide();
328 $
(this).toggleClass("hidden");
332 $
(document
.createElement("a"))
335 title
: "hide redefined properties"
338 if($
(this).hasClass("hidden")) {
339 $
(this).parent().parent().find("li.redef").show();
341 $
(this).parent().parent().find("li.redef").hide();
344 $
(this).toggleClass("hidden");
351 $
("a[href*='#']").click( function() {
352 highlightBlock($
(this).attr("href").split(/#
/)[1]);
355 //Preload filter fields with query string
359 /* Parse current URL and return anchor name */
360 function currentAnchor() {
361 var index
= document
.location
.hash
.indexOf("#");
363 return document
.location
.hash
.substring(index
+ 1);
368 /* Prealod filters field using search query */
369 function preloadFilters() {
370 // Parse URL and get query string
371 var search
= currentAnchor();
373 if(search
== null || search
.indexOf("q=") == -1)
376 search
= search
.substring(2, search
.length
);
378 if(search
== "" || search
== "undefined")
381 $
(":text").val(search
);
383 .removeClass("notUsed")
388 /* Hightlight the spoted block */
389 function highlightBlock(a
) {
394 $
(".highlighted").removeClass("highlighted");
396 var target
= $
("#" + a
);
398 if(target
.is("article")) {
399 target
.parent().addClass("highlighted");
402 target
.addClass("highlighted");