Automatic installer.php lang files by installer_builder (20061228)
[moodle.git] / lib / javascript-static.js
CommitLineData
47aa42e2 1// Miscellaneous core Javascript functions for Moodle
2
b48fd7b5 3function popupchecker(msg) {
4 var testwindow = window.open('itestwin.html', '', 'width=1,height=1,left=0,top=0,scrollbars=no');
5 if (testwindow == null)
6 {alert(msg);}
7 else {
8 testwindow.close();
9 }
10}
11
63d28811 12function popUpProperties(inobj) {
13 op = window.open();
14 op.document.open('text/plain');
15 for (objprop in inobj) {
16 op.document.write(objprop + ' => ' + inobj[objprop] + '\n');
17 }
18 op.document.close();
19}
20
21function fillmessagebox(text) {
22 document.form.message.value = text;
23}
24
25function copyrichtext(textname) {
26/// Legacy stub for old editor - to be removed soon
27 return true;
28}
29
30function checkall() {
31 void(d=document);
32 void(el=d.getElementsByTagName('INPUT'));
33 for(i=0;i<el.length;i++)
34 void(el[i].checked=1)
35}
36
03f9425f 37function checknone() {
38 void(d=document);
39 void(el=d.getElementsByTagName('INPUT'));
40 for(i=0;i<el.length;i++)
41 void(el[i].checked=0)
42}
43
63d28811 44function lockoptions(form, master, subitems) {
027d0485 45 // Subitems is an array of names of sub items.
46 // Optionally, each item in subitems may have a
63d28811 47 // companion hidden item in the form with the
027d0485 48 // same name but prefixed by "h".
63d28811 49 if (eval("document."+form+"."+master+".checked")) {
50 for (i=0; i<subitems.length; i++) {
51 unlockoption(form, subitems[i]);
52 }
53 } else {
54 for (i=0; i<subitems.length; i++) {
55 lockoption(form, subitems[i]);
56 }
57 }
58 return(true);
59}
60
50ef8eb9 61function lockoptionsall(formid) {
62 var lock=new Object();
63 var items=eval(formid+'items');
64 var form=document.forms[formid];
65 for (var master in items){
66 var subitems=items[master].dependents;
67 var thislock;
9c03bbaa 68 if (items[master].condition=='notchecked'){
50ef8eb9 69 thislock=!form.elements[master].checked;
9c03bbaa 70 } else if (items[master].condition=='checked'){
71 thislock=form.elements[master].checked;
a23f0aaf 72 } else if (items[master].condition=='noitemselected'){
73 thislock=(form.elements[master].selectedIndex==-1);
e24b7f85 74 } else if (items[master].condition=='eq'){
75 thislock=(form.elements[master].value==items[master].value);
9c03bbaa 76 } else {
e24b7f85 77 thislock=(form.elements[master].value!=items[master].value);
78
50ef8eb9 79 }
80
81 for (var i=0; i<subitems.length; i++) {
82 if (lock[subitems[i]]!=null){
83 lock[subitems[i]] = thislock || lock[subitems[i]];
84 }else{
85 lock[subitems[i]] = thislock;
86 }
87 }
88
89 for (var item in lock) {
90 form.elements[item].disabled=lock[item];
91 }
92 }
93 return(true);
94}
95
d01a38cb 96function lockoptionsallsetup(formid) {
97 var items=eval(formid+'items');
98 var form=document.forms[formid];
19110c57 99 for (var i = 0; i < form.elements.length; i++){
100 var found=false;
101 var formelement = form.elements[i];
102 if (formelement.type=='reset'){
103 formelement.onclick = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
104 formelement.onblur = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
105 formelement.onchange = function(){this.form.reset();return lockoptionsall(this.form.getAttribute('id'));};
106 } else {
107 for (var master in items){
108 if (master==formelement.name){
109 formelement.onclick = function(){return lockoptionsall(this.form.getAttribute('id'));};
110 formelement.onblur = function(){return lockoptionsall(this.form.getAttribute('id'));};
111 formelement.onchange = function(){return lockoptionsall(this.form.getAttribute('id'));};
112 break;
113 }
114 }
115 }
116 if (found){
117 }
d01a38cb 118 }
19110c57 119
d01a38cb 120 return lockoptionsall(formid);
121}
50ef8eb9 122
63d28811 123function lockoption(form,item) {
124 eval("document."+form+"."+item+".disabled=true");/* IE thing */
027d0485 125 if(document.forms[form].elements['h'+item]) {
126 eval("document."+form+".h"+item+".value=1");
127 }
63d28811 128}
129
130function unlockoption(form,item) {
131 eval("document."+form+"."+item+".disabled=false");/* IE thing */
027d0485 132 if(document.forms[form].elements['h'+item]) {
133 eval("document."+form+".h"+item+".value=0");
134 }
63d28811 135}
7678e65c 136
137function submitFormById(id) {
138 var theform = document.getElementById(id);
139 if(!theform) {
140 return false;
141 }
142 if(theform.tagName != 'FORM') {
143 return false;
144 }
145 if(!theform.onsubmit || theform.onsubmit()) {
146 return theform.submit();
147 }
148}
363cb62c 149
8ceb09e0 150function select_all_in(elTagName, elClass, elId) {
363cb62c 151 var inputs = document.getElementsByTagName('INPUT');
8ceb09e0 152 inputs = filterByParent(inputs, function(el) {return findParentNode(el, elTagName, elClass, elId);});
363cb62c 153 for(var i = 0; i < inputs.length; ++i) {
bee40515 154 if(inputs[i].type == 'checkbox' || inputs[i].type == 'radio') {
363cb62c 155 inputs[i].checked = 'checked';
156 }
157 }
158}
159
8ceb09e0 160function deselect_all_in(elTagName, elClass, elId) {
363cb62c 161 var inputs = document.getElementsByTagName('INPUT');
8ceb09e0 162 inputs = filterByParent(inputs, function(el) {return findParentNode(el, elTagName, elClass, elId);});
363cb62c 163 for(var i = 0; i < inputs.length; ++i) {
bee40515 164 if(inputs[i].type == 'checkbox' || inputs[i].type == 'radio') {
363cb62c 165 inputs[i].checked = '';
166 }
167 }
168}
169
170function confirm_if(expr, message) {
171 if(!expr) {
172 return true;
173 }
174 return confirm(message);
175}
47aa42e2 176
177
178/*
179 findParentNode (start, elementName, elementClass, elementID)
50ef8eb9 180
47aa42e2 181 Travels up the DOM hierarchy to find a parent element with the
182 specified tag name, class, and id. All conditions must be met,
183 but any can be ommitted. Returns the BODY element if no match
184 found.
185*/
186function findParentNode(el, elName, elClass, elId) {
187 while(el.nodeName != 'BODY') {
188 if(
189 (!elName || el.nodeName == elName) &&
190 (!elClass || el.className.indexOf(elClass) != -1) &&
191 (!elId || el.id == elId))
192 {
193 break;
194 }
195 el = el.parentNode;
196 }
197 return el;
198}
19194f82 199/*
200 findChildNode (start, elementName, elementClass, elementID)
201
202 Travels down the DOM hierarchy to find all child elements with the
203 specified tag name, class, and id. All conditions must be met,
204 but any can be ommitted.
a23f0aaf 205 Doesn't examine children of matches.
19194f82 206*/
207function findChildNodes(start, tagName, elementClass, elementID, elementName) {
208 var children = new Array();
209 for (var childIndex in start.childNodes) {
a23f0aaf 210 var classfound = false;
19194f82 211 var child = start.childNodes[childIndex];
a23f0aaf 212 if((child.nodeType == 1) &&//element node type
213 (elementClass && (typeof(child.className)=='string'))){
214 var childClasses = child.className.split(/\s+/);
215 for (var childClassIndex in childClasses){
216 if (childClasses[childClassIndex]==elementClass){
217 classfound = true;
218 break;
219 }
220 }
221 }
222 if( (child.nodeType == 1) &&//element node type
19194f82 223 (!tagName || child.nodeName == tagName) &&
a23f0aaf 224 (!elementClass || classfound)&&
19194f82 225 (!elementID || child.id == elementID) &&
226 (!elementName || child.name == elementName))
227 {
228 children = children.concat(child);
a23f0aaf 229 } else {
230 children = children.concat(findChildNodes(child, tagName, elementClass, elementID, elementName));
19194f82 231 }
19194f82 232 }
233 return children;
234}
235/*
236 elementSetHide (elements, hide)
237
238 Adds or removes the "hide" class for the specified elements depending on boolean hide.
239*/
240function elementShowAdvanced(elements, show) {
241 for (var elementIndex in elements){
242 element = elements[elementIndex];
243 element.className = element.className.replace(new RegExp(' ?hide'), '')
244 if(!show) {
245 element.className += ' hide';
246 }
247 }
248}
249
250function showAdvancedOnClick(button, hidetext, showtext){
251 var toSet=findChildNodes(button.form, null, 'advanced');
252 var buttontext = '';
253 if (button.form.elements['mform_showadvanced_last'].value == '0') {
254 elementShowAdvanced(toSet, true);
255 buttontext = hidetext;
256 button.form.elements['mform_showadvanced_last'].value = '1';
257 } else {
258 elementShowAdvanced(toSet, false);
259 buttontext = showtext;
260 button.form.elements['mform_showadvanced_last'].value = '0';
261 }
262 var formelements = button.form.elements;
263 for (var i in formelements){
264 if (formelements[i].name=='mform_showadvanced'){
265 formelements[i].value = buttontext;
266 }
267 }
268 //never submit the form if js is enabled.
269 return false;
270}
47aa42e2 271
272/*
273 elementToggleHide (element, elementFinder)
274
275 If elementFinder is not provided, toggles the "hidden" class for the specified element.
276 If elementFinder is provided, then the "hidden" class will be toggled for the object
277 returned by the function call elementFinder(element).
278
279 If persistent == true, also sets a cookie for this.
280*/
19194f82 281function elementToggleHide(el, persistent, elementFinder) {
47aa42e2 282 if(!elementFinder) {
283 var obj = el;
284 }
285 else {
286 var obj = elementFinder(el);
287 }
288 if(obj.className.indexOf('hidden') == -1) {
289 obj.className += ' hidden';
19194f82 290 var shown = 0;
47aa42e2 291 }
292 else {
19194f82 293 obj.className = obj.className.replace(new RegExp(' ?hidden'), '')
294 var shown = 1;
47aa42e2 295 }
19194f82 296
47aa42e2 297 if(persistent == true) {
298 new cookie('hide:' + obj.id, 1, (shown ? -1 : 356), '/').set();
299 }
300}
301
302
303function elementCookieHide(id) {
304 var obj = document.getElementById(id);
305 var cook = new cookie('hide:' + id).read();
306 if(cook != null) {
307 elementToggleHide(obj, false);
308 }
309}
310
311function filterByParent(elCollection, parentFinder) {
312 var filteredCollection = [];
313 for(var i = 0; i < elCollection.length; ++i) {
314 var findParent = parentFinder(elCollection[i]);
315 if(findParent.nodeName != 'BODY') {
316 filteredCollection.push(elCollection[i]);
317 }
318 }
319 return filteredCollection;
320}
321
7979105c 322/*
323 All this is here just so that IE gets to handle oversized blocks
324 in a visually pleasing manner. It does a browser detect. So sue me.
325*/
326
327function fix_column_widths() {
328 var agt = navigator.userAgent.toLowerCase();
329 if ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)) {
330 fix_column_width('left-column');
331 fix_column_width('right-column');
332 }
333}
334
335function fix_column_width(colName) {
336 if(column = document.getElementById(colName)) {
337 if(!column.offsetWidth) {
338 setTimeout("fix_column_width('" + colName + "')", 20);
339 return;
340 }
341
342 var width = 0;
343 var nodes = column.childNodes;
344
345 for(i = 0; i < nodes.length; ++i) {
346 if(nodes[i].className.indexOf("sideblock") != -1 ) {
347 if(width < nodes[i].offsetWidth) {
348 width = nodes[i].offsetWidth;
349 }
350 }
351 }
352
353 for(i = 0; i < nodes.length; ++i) {
354 if(nodes[i].className.indexOf("sideblock") != -1 ) {
355 nodes[i].style.width = width + 'px';
356 }
357 }
358 }
359}
d13c5938 360
361
362/*
363 Insert myValue at current cursor position
364*/
365function insertAtCursor(myField, myValue) {
366 // IE support
367 if (document.selection) {
368 myField.focus();
369 sel = document.selection.createRange();
370 sel.text = myValue;
371 }
372 // Mozilla/Netscape support
373 else if (myField.selectionStart || myField.selectionStart == '0') {
374 var startPos = myField.selectionStart;
375 var endPos = myField.selectionEnd;
376 myField.value = myField.value.substring(0, startPos)
377 + myValue + myField.value.substring(endPos, myField.value.length);
378 } else {
379 myField.value += myValue;
380 }
381}