0
|
1 |
|
2 /* contains all the data about the pictures (set after the page is |
|
3 loaded) */ |
|
4 var search_data; |
|
5 |
|
6 function get_query_variable(variable) { |
|
7 var query = window.location.search.substring(1); |
|
8 var vars = query.split("&"); |
|
9 for (var i=0;i<vars.length;i++) { |
|
10 var pair = vars[i].split("="); |
|
11 if (pair[0] == variable) { |
|
12 return pair[1]; |
|
13 } |
|
14 } |
|
15 return ''; |
|
16 } |
|
17 |
|
18 /* Remove the loading message and get the search data |
|
19 */ |
|
20 function page_loaded() { |
|
21 search_data = sd; |
|
22 |
|
23 if (document.getElementById){ |
|
24 document.getElementById('loading').style.visibility='hidden'; |
|
25 } else { |
|
26 if (document.layers){ //NS4 |
|
27 document.loading.visibility = 'hidden'; |
|
28 } else { //IE4 |
|
29 document.all.loading.style.visibility = 'hidden'; |
|
30 } |
|
31 } |
|
32 search_string = decodeURIComponent(get_query_variable('q')); |
|
33 set_search_string(search_string); |
|
34 var word_search = get_query_variable('w'); |
|
35 if (word_search=='1') { |
|
36 word_search = true; |
|
37 } else { |
|
38 word_search = false; |
|
39 } |
|
40 document.getElementById('search_word').checked = word_search; |
|
41 perform_search(search_string, word_search); |
|
42 |
|
43 if (document.layers) { |
|
44 document.captureEvents(Event.KEYPRESS); |
|
45 } |
|
46 } |
|
47 |
|
48 /* Return a copy of str, translating all occurrences of each character |
|
49 in from to the corresponding character in to |
|
50 */ |
|
51 String.prototype.strtr = function(from, to) |
|
52 { |
|
53 var s, p, c1, c2, c3; |
|
54 if(! this.length || from.length != to.length) return; |
|
55 |
|
56 s = this; |
|
57 for(var i=0; i < this.length; i++) { |
|
58 c1 = this.substr(i,1); |
|
59 for(var j=0; j<from.length; j++) { |
|
60 c2 = from.substr(j,1); |
|
61 c3 = to.substr(j,1); |
|
62 if(c1 == c2) { |
|
63 p = new RegExp(c2,'gi'); |
|
64 s = s.replace(p,c3); |
|
65 } |
|
66 } |
|
67 } |
|
68 return s; |
|
69 }; |
|
70 |
|
71 /* Return a copy of str, removing all accents in it |
|
72 */ |
|
73 function remove_accents(string) { |
|
74 return string.strtr( |
|
75 "?????????????????????????????????????????????????????????", |
|
76 "AAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy"); |
|
77 } |
|
78 |
|
79 |
|
80 /* set the string in the query input |
|
81 */ |
|
82 function set_search_string(search_string) { |
|
83 var input = document.getElementById('search_string'); |
|
84 input.value = search_string; |
|
85 } |
|
86 |
|
87 /* return the string entered by the user, normalized |
|
88 */ |
|
89 function get_search_string() { |
|
90 var input = document.getElementById('search_string'); |
|
91 var search_string = remove_accents(input.value.toLowerCase()); |
|
92 |
|
93 return search_string; |
|
94 } |
|
95 |
|
96 /* return a list of keywords from the string entered by user |
|
97 */ |
|
98 function get_keywords(search_string, word_search) { |
|
99 if (! search_string ) { |
|
100 return new Array; |
|
101 } |
|
102 keywords = search_string.split(/[^a-z0-9]+/i); |
|
103 |
|
104 var result = new Array; |
|
105 for (var i=0; i<keywords.length; i++) { |
|
106 if (keywords[i]) { |
|
107 if (word_search) { |
|
108 result[result.length] = " " + keywords[i] + " "; |
|
109 } else { |
|
110 result[result.length] = keywords[i]; |
|
111 } |
|
112 } |
|
113 } |
|
114 return result; |
|
115 } |
|
116 |
|
117 /* replace a %parameter% in the template by its value |
|
118 */ |
|
119 function set_value(template, parameter, value) { |
|
120 re = new RegExp("%"+parameter+"%", "g"); |
|
121 return template.replace(re, value) |
|
122 } |
|
123 |
|
124 /* display one found result in the page |
|
125 */ |
|
126 function display_result(results, image) { |
|
127 result = result_html; |
|
128 result = set_value(result, 'url', image.url); |
|
129 result = set_value(result, 'thumb_url', image.thumb_url); |
|
130 result = set_value(result, 'album_url', image.album_url); |
|
131 result = set_value(result, 'album_title', image.album_title); |
|
132 result = set_value(result, 'title', image.title); |
|
133 result = set_value(result, 'thumb_width', image.width); |
|
134 result = set_value(result, 'thumb_height', image.height); |
|
135 |
|
136 results.innerHTML += result; |
|
137 } |
|
138 |
|
139 /* update the status string on the page |
|
140 */ |
|
141 function update_status(status, found) { |
|
142 status.firstChild.nodeValue = "Search in progress: " + found.toString() +" found"; |
|
143 } |
|
144 |
|
145 /* return true if all keywords (array of string) match the string s |
|
146 */ |
|
147 function match(keywords, s){ |
|
148 for (var i=0 ; i<keywords.length ; i++) { |
|
149 if (keywords[i] && s.indexOf(keywords[i]) == -1) { |
|
150 return false; |
|
151 } |
|
152 } |
|
153 return true; |
|
154 } |
|
155 /* perform the search when the page is loaded |
|
156 */ |
|
157 function perform_search(search_string, word_search) { |
|
158 |
|
159 if (! (document.getElementById || document.createElement)){ |
|
160 alert("<TMPL_VAR NAME=STRING_NODOM>"); |
|
161 return; |
|
162 } |
|
163 |
|
164 var limit = <TMPL_VAR NAME=SEARCH_LIMIT>; |
|
165 var found = 0; |
|
166 var keywords = get_keywords(search_string, word_search); |
|
167 if (keywords.length == 0) { |
|
168 return; |
|
169 } |
|
170 var results = document.getElementById('results'); |
|
171 results.innerHTML = ""; |
|
172 var status = document.getElementById('status'); |
|
173 |
|
174 update_status(status, found); |
|
175 |
|
176 for (var i=0 ; i<search_data.length; i++) { |
|
177 image = search_data[i]; |
|
178 if (match(keywords, image.search_string)) { |
|
179 if (found >= limit) { |
|
180 var status_string = "<TMPL_VAR NAME=STRING_TOOMANYRESULTS>"; |
|
181 // WTF ? Not sprintf in javascript ? OK, so I code dirty |
|
182 status_string = status_string.replace(/%d/, found.toString()); |
|
183 status.firstChild.nodeValue = status_string; |
|
184 return; |
|
185 } |
|
186 |
|
187 update_status(status, found++); |
|
188 display_result(results, image) |
|
189 } |
|
190 } |
|
191 var status_string = "<TMPL_VAR NAME=STRING_SEARCHCOMPLETED>"; |
|
192 // For dirty hacking remark, see above comment |
|
193 status_string = status_string.replace(/%d/, found.toString()); |
|
194 status.firstChild.nodeValue = status_string; |
|
195 return; |
|
196 } |
|
197 |
|
198 /* if user has pressed return in the input field, validate the search |
|
199 */ |
|
200 function process_key(e) { |
|
201 if (window.event) { |
|
202 if (window.event.type == "keypress" & window.event.keyCode == 13) |
|
203 reload_page(); |
|
204 } |
|
205 if (e) { |
|
206 if (e.type == "keypress" & e.keyCode == 13) { |
|
207 reload_page(); |
|
208 } |
|
209 } |
|
210 } |
|
211 |
|
212 /* Reload the page when the user click the search button |
|
213 */ |
|
214 function reload_page() { |
|
215 var search_string = get_search_string(); |
|
216 var word_search = document.getElementById('search_word').checked; |
|
217 if (search_string) { |
|
218 search_string = encodeURIComponent(search_string) |
|
219 if (word_search) { |
|
220 search_string += "&w=1"; |
|
221 } |
|
222 location.href = location.pathname + "?q=" + search_string; |
|
223 } |
|
224 } |