1 | <dtml-comment> |
---|
2 | CPS JavaScript functions |
---|
3 | $Id: functions.js.dtml 32288 2006-01-26 17:36:06Z tziade $ |
---|
4 | </dtml-comment> |
---|
5 | |
---|
6 | <dtml-let last_modified="_.DateTime()-14" expires="_.DateTime()+1" > |
---|
7 | <dtml-call "REQUEST.RESPONSE.setHeader( 'Content-Type', 'text/javascript' )"> |
---|
8 | <dtml-call "REQUEST.RESPONSE.setHeader( 'Last-Modified', last_modified.toZone('GMT').rfc822() )"> |
---|
9 | <dtml-call "REQUEST.RESPONSE.setHeader( 'Cache-Control', 'max-age=36000, must-revalidate' )"> |
---|
10 | <dtml-call "REQUEST.RESPONSE.setHeader( 'Expires', expires.toZone('GMT').rfc822() )" > |
---|
11 | </dtml-let> |
---|
12 | |
---|
13 | var msie5 = (navigator.userAgent.indexOf('MSIE 5') != -1); |
---|
14 | |
---|
15 | //************************************************************ |
---|
16 | // Folder content |
---|
17 | var isSelected = false; |
---|
18 | |
---|
19 | function toggleSelect(toggleSelectButton, selectAllText, deselectAllText) { |
---|
20 | formElements = toggleSelectButton.form.elements; |
---|
21 | |
---|
22 | if (isSelected) { |
---|
23 | for (i = 0; i < formElements.length; i++) { |
---|
24 | formElements[i].checked = false; |
---|
25 | } |
---|
26 | isSelected = false; |
---|
27 | toggleSelectButton.value = selectAllText; |
---|
28 | } else { |
---|
29 | for (i = 0; i < formElements.length; i++) { |
---|
30 | formElements[i].checked = true; |
---|
31 | } |
---|
32 | isSelected = true; |
---|
33 | toggleSelectButton.value = deselectAllText; |
---|
34 | } |
---|
35 | } |
---|
36 | |
---|
37 | //************************************************************ |
---|
38 | /** |
---|
39 | * Toggles an element's visibility. |
---|
40 | * Function to show tooltips. |
---|
41 | * If your element is a span, you must use inline display instead of block |
---|
42 | * XXX recognize div and span then automaticly choose the best display rule |
---|
43 | */ |
---|
44 | function toggleElementVisibility(id) { |
---|
45 | element = document.getElementById(id); |
---|
46 | if (element) { |
---|
47 | //window.alert(element.tagName) |
---|
48 | if (element.style.visibility == 'hidden') { |
---|
49 | element.style.visibility = 'visible'; |
---|
50 | if (element.tagName == 'DIV') { |
---|
51 | element.style.display = 'block'; |
---|
52 | } else if (element.tagName == 'SPAN') { |
---|
53 | element.style.display = 'inline'; |
---|
54 | } else { |
---|
55 | element.style.display = 'block'; |
---|
56 | } |
---|
57 | } else { |
---|
58 | element.style.visibility = 'hidden'; |
---|
59 | element.style.display = 'none'; |
---|
60 | } |
---|
61 | } |
---|
62 | } |
---|
63 | |
---|
64 | function showElement(show, id) { |
---|
65 | element = document.getElementById(id); |
---|
66 | if (element) { |
---|
67 | //window.alert(element.tagName) |
---|
68 | if (show) { |
---|
69 | element.style.visibility = 'visible'; |
---|
70 | if (element.tagName in ['DIV', 'P']) { |
---|
71 | element.style.display = 'block'; |
---|
72 | } else { |
---|
73 | element.style.display = 'inline'; |
---|
74 | } |
---|
75 | } else { |
---|
76 | element.style.visibility = 'hidden'; |
---|
77 | element.style.display = 'none'; |
---|
78 | } |
---|
79 | } |
---|
80 | } |
---|
81 | |
---|
82 | //************************************************************ |
---|
83 | function trim(s) { |
---|
84 | if (s) { |
---|
85 | return s.replace(/^\s*|\s*$/g, ""); |
---|
86 | } |
---|
87 | return ""; |
---|
88 | } |
---|
89 | |
---|
90 | //************************************************************ |
---|
91 | function checkEmptySearch(formElem) { |
---|
92 | var query = trim(formElem.SearchableText.value); |
---|
93 | if (query != '') { |
---|
94 | formElem.SearchableText.value = query; |
---|
95 | return true; |
---|
96 | } |
---|
97 | formElem.SearchableText.value = query; |
---|
98 | formElem.SearchableText.focus(); |
---|
99 | return false; |
---|
100 | } |
---|
101 | |
---|
102 | //************************************************************ |
---|
103 | /** |
---|
104 | * Sets focus on <input> elements that have a class attribute |
---|
105 | * containing the class 'focus'. |
---|
106 | * Examples: |
---|
107 | * <input type="text" id="username" name="__ac_name" class="focus"/> |
---|
108 | * <input type="text" id="searchableText" class="standalone giant focus"/> |
---|
109 | * |
---|
110 | * This function does not work on crappy MSIE5.0 and MSIE5.5. |
---|
111 | */ |
---|
112 | function setFocus() { |
---|
113 | if (msie5) { |
---|
114 | return false; |
---|
115 | } |
---|
116 | var elements = document.getElementsByTagName('input'); |
---|
117 | for (var i = 0; i < elements.length; i++) { |
---|
118 | var nodeClass = elements[i].getAttributeNode('class'); |
---|
119 | //alert("nodeClass = " + nodeClass); |
---|
120 | if (nodeClass) { |
---|
121 | var classes = nodeClass.value.split(' '); |
---|
122 | for (var j = 0; j < classes.length; j++) { |
---|
123 | if (classes[j] == 'focus') { |
---|
124 | elements[i].focus(); |
---|
125 | return true; |
---|
126 | } |
---|
127 | } |
---|
128 | } |
---|
129 | } |
---|
130 | } |
---|
131 | |
---|
132 | /** |
---|
133 | * Validates that the input fields designated by the given ids are not empty. |
---|
134 | * It returns true if all the input fields are not empty, it returns false |
---|
135 | * otherwise. |
---|
136 | * Example: |
---|
137 | * <form onsubmit="return validateRequiredFields(['field1', 'field2'], |
---|
138 | * ['Title', 'Comments'], 'are empty while they are required fields.')"> |
---|
139 | */ |
---|
140 | function validateRequiredFields(fieldIds, fieldLabels, informationText) { |
---|
141 | for (i = 0; i < fieldIds.length; i++) { |
---|
142 | element = document.getElementById(fieldIds[i]); |
---|
143 | if (element && !element.value) { |
---|
144 | window.alert("'" + fieldLabels[i] + "' " + informationText); |
---|
145 | return false; |
---|
146 | } |
---|
147 | } |
---|
148 | return true; |
---|
149 | } |
---|
150 | |
---|
151 | //************************************************************ |
---|
152 | function getSelectedRadio(buttonGroup) { |
---|
153 | if (buttonGroup[0]) { |
---|
154 | for (var i=0; i<buttonGroup.length; i++) { |
---|
155 | if (buttonGroup[i].checked) { |
---|
156 | return i |
---|
157 | } |
---|
158 | } |
---|
159 | } else { |
---|
160 | if (buttonGroup.checked) { return 0; } |
---|
161 | } |
---|
162 | return -1; |
---|
163 | } |
---|
164 | |
---|
165 | function getSelectedRadioValue(buttonGroup) { |
---|
166 | var i = getSelectedRadio(buttonGroup); |
---|
167 | if (i == -1) { |
---|
168 | return ""; |
---|
169 | } else { |
---|
170 | if (buttonGroup[i]) { |
---|
171 | return buttonGroup[i].value; |
---|
172 | } else { |
---|
173 | return buttonGroup.value; |
---|
174 | } |
---|
175 | } |
---|
176 | } |
---|
177 | |
---|
178 | function getSelectedRadioId(buttonGroup) { |
---|
179 | var i = getSelectedRadio(buttonGroup); |
---|
180 | if (i == -1) { |
---|
181 | return ""; |
---|
182 | } else { |
---|
183 | if (buttonGroup[i]) { |
---|
184 | return buttonGroup[i].id; |
---|
185 | } else { |
---|
186 | return buttonGroup.id; |
---|
187 | } |
---|
188 | } |
---|
189 | } |
---|
190 | |
---|
191 | /** |
---|
192 | * Return the label content corresponding to a radio selection |
---|
193 | */ |
---|
194 | function getSelectedRadioLabel(buttonGroup) { |
---|
195 | var id = getSelectedRadioId(buttonGroup); |
---|
196 | if (id == "") { |
---|
197 | return ""; |
---|
198 | } else { |
---|
199 | for (var i=0; i<document.getElementsByTagName("label").length; i++) { |
---|
200 | var element_label = document.getElementsByTagName("label")[i]; |
---|
201 | if (element_label.htmlFor == id) { |
---|
202 | return element_label.firstChild.nodeValue; |
---|
203 | } |
---|
204 | } |
---|
205 | } |
---|
206 | } |
---|
207 | |
---|
208 | |
---|
209 | //************************************************************ |
---|
210 | /* |
---|
211 | Used to highlight search terms |
---|
212 | from Geir Bækholt, adapted for CPS |
---|
213 | |
---|
214 | */ |
---|
215 | function highlightSearchTerm() { |
---|
216 | var query_elem = document.getElementById('searchGadget') |
---|
217 | if (! query_elem){ |
---|
218 | return false |
---|
219 | } |
---|
220 | var query = query_elem.value |
---|
221 | // _robert_ ie 5 does not have decodeURI |
---|
222 | if (typeof decodeURI != 'undefined'){ |
---|
223 | query = unescape(decodeURI(query)) // thanks, Casper |
---|
224 | } |
---|
225 | else { |
---|
226 | return false |
---|
227 | } |
---|
228 | if (query){ |
---|
229 | queries = query.replace(/\+/g,' ').split(/\s+/) |
---|
230 | // make sure we start the right place and not higlight menuitems or breadcrumb |
---|
231 | searchresultnode = document.getElementById('searchResults') |
---|
232 | if (searchresultnode) { |
---|
233 | for (q=0;q<queries.length;q++) { |
---|
234 | // don't highlight reserved catalog search terms |
---|
235 | if (queries[q].toLowerCase() != 'not' |
---|
236 | && queries[q].toLowerCase() != 'and' |
---|
237 | && queries[q].toLowerCase() != 'or') { |
---|
238 | climb(searchresultnode,queries[q]); |
---|
239 | } |
---|
240 | } |
---|
241 | } |
---|
242 | } |
---|
243 | } |
---|
244 | |
---|
245 | function climb(node, word){ |
---|
246 | // traverse childnodes |
---|
247 | if (! node){ |
---|
248 | return false |
---|
249 | } |
---|
250 | if (node.hasChildNodes) { |
---|
251 | var i; |
---|
252 | for (i=0;i<node.childNodes.length;i++) { |
---|
253 | climb(node.childNodes[i],word); |
---|
254 | } |
---|
255 | if (node.nodeType == 3) { |
---|
256 | checkforhighlight(node, word); |
---|
257 | // check all textnodes. Feels inefficient, but works |
---|
258 | } |
---|
259 | } |
---|
260 | } |
---|
261 | |
---|
262 | function checkforhighlight(node,word) { |
---|
263 | ind = node.nodeValue.toLowerCase().indexOf(word.toLowerCase()) |
---|
264 | if (ind != -1) { |
---|
265 | if (node.parentNode.className != "highlightedSearchTerm"){ |
---|
266 | par = node.parentNode; |
---|
267 | contents = node.nodeValue; |
---|
268 | // make 3 shiny new nodes |
---|
269 | hiword = document.createElement("span"); |
---|
270 | hiword.className = "highlightedSearchTerm"; |
---|
271 | hiword.appendChild(document.createTextNode(contents.substr(ind,word.length))); |
---|
272 | par.insertBefore(document.createTextNode(contents.substr(0,ind)),node); |
---|
273 | par.insertBefore(hiword,node); |
---|
274 | par.insertBefore(document.createTextNode( contents.substr(ind+word.length)),node); |
---|
275 | par.removeChild(node); |
---|
276 | } |
---|
277 | } |
---|
278 | } |
---|
279 | |
---|
280 | /************************************************************ |
---|
281 | /** |
---|
282 | * searchLanguage widget functions |
---|
283 | * used to auto select languages checkbox/radio |
---|
284 | * cf CPSSchemas/skins/cps_schemas/widget_searchlanguage_render.pt |
---|
285 | */ |
---|
286 | function searchLanguageCheckSelected(languages, no_language, language) { |
---|
287 | var count=0; |
---|
288 | for (var i=0; i<languages.length; i++) { |
---|
289 | if (languages[i].checked) { |
---|
290 | count++; |
---|
291 | } |
---|
292 | } |
---|
293 | no_language.checked = (count <= 0); |
---|
294 | language.checked = (count > 0); |
---|
295 | } |
---|
296 | |
---|
297 | function searchLanguageClearSelected(languages) { |
---|
298 | for (i=0; i<languages.length; i++) { |
---|
299 | languages[i].checked = 0; |
---|
300 | } |
---|
301 | } |
---|
302 | |
---|
303 | function toggleLayers(more_block, more_items) { |
---|
304 | var objMoreBlock = document.getElementById(more_block).style; |
---|
305 | var objMoreItems = document.getElementById(more_items).style; |
---|
306 | if(objMoreBlock.display == "block") |
---|
307 | objMoreBlock.display = "none"; |
---|
308 | if(objMoreItems.display == "none") |
---|
309 | objMoreItems.display = "block"; |
---|
310 | } |
---|
311 | |
---|
312 | /************************************************************ |
---|
313 | /** |
---|
314 | * waeup specific functions |
---|
315 | */ |
---|
316 | |
---|
317 | /** |
---|
318 | * submit_once(): Avoid multiple sendings of forms... |
---|
319 | */ |
---|
320 | |
---|
321 | submitted = false; |
---|
322 | function submit_once() { |
---|
323 | if (submitted) { |
---|
324 | alert("Your request is being processed.\nPlease be patient."); |
---|
325 | event.returnValue = 0; // work-around for IE |
---|
326 | return 0; |
---|
327 | } |
---|
328 | submitted = true; |
---|
329 | return 1; |
---|
330 | } |
---|