1 /*
2 * This code is part of GOsa (http://www.gosa-project.org)
3 * Copyright (C) 2003-2010 GONICUS GmbH
4 *
5 * ID: $$Id: index.php 15301 2010-01-26 09:40:08Z cajus $$
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
22 /* Install event handlers */
23 Event.observe(window, 'resize', resizeHandler);
24 Event.observe(window, 'load', resizeHandler);
25 Event.observe(window, 'keypress', keyHandler);
28 /* Ask before switching a plugin with this function */
29 function question(text, url)
30 {
31 if(document.mainform.ignore){
32 location.href= url;
33 return true;
34 }
35 if(confirm(text)){
36 location.href= url;
37 return true;
38 }
39 return false;
40 }
43 /* Toggle checkbox that matches regex */
44 function chk_set_all(regex,value)
45 {
46 for (var i = 0; i < document.mainform.elements.length; i++) {
47 var _id=document.mainform.elements[i].id;
48 if(_id.match(regex)) {
49 document.getElementById(_id).checked= value;
50 }
51 }
52 }
55 function toggle_all_(regex,state_object)
56 {
57 state = document.getElementById(state_object).checked;
58 chk_set_all(regex, state);
59 }
62 /* Scroll down the body frame */
63 function scrollDown2()
64 {
65 document.body.scrollTop = document.body.scrollHeight - document.body.clientHeight;
66 }
69 /* Toggle checkbox that matches regex */
70 function acl_set_all(regex,value)
71 {
72 for (var i = 0; i < document.mainform.elements.length; i++) {
73 var _id=document.mainform.elements[i].id;
74 if(_id.match(regex)) {
75 document.getElementById(_id).checked= value;
76 }
77 }
78 }
80 /* Toggle checkbox that matches regex */
81 function acl_toggle_all(regex)
82 {
83 for (var i = 0; i < document.mainform.elements.length; i++) {
84 var _id=document.mainform.elements[i].id;
85 if(_id.match(regex)) {
86 if (document.getElementById(_id).checked == true){
87 document.getElementById(_id).checked= false;
88 } else {
89 document.getElementById(_id).checked= true;
90 }
91 }
92 }
93 }
96 /* Global key handler to estimate which element gets the next focus if enter is pressed */
97 function keyHandler(DnEvents) {
99 var element = Event.element(DnEvents);
101 // determines whether Netscape or Internet Explorer
102 k = (Prototype.Browser.Gecko) ? DnEvents.keyCode : window.event.keyCode;
103 if (k == 13) { // enter key pressed
105 // Stop 'Enter' key-press from beeing processed internally
106 Event.stop(DnEvents);
108 // No nextfield explicitly specified
109 var next_element = null;
110 if(typeof(nextfield)!='undefined') {
111 next_element = $(nextfield);
112 }
114 // nextfield not given or invalid
115 if(!next_element || typeof(nextfield)=='undefined'){
116 next_element = getNextInputElement(element);
117 }
119 // If next element is of type submit, then submit the button else set focus
120 if(next_element!=null && next_element.type == 'submit'){
121 next_element.click();
122 return(false);
123 }else if(next_element){
124 next_element.focus();
125 return;
126 }
128 } else if (k==9 && element.type=='textarea') {
129 Event.stop(DnEvents);
130 element.value += "\t";
131 return false;
132 }
133 }
135 function getNextInputElement(element)
136 {
137 var found = false;
138 for (var e=0;e< document.forms.length; e++){
139 for (var i = 0; i < document.forms[e].elements.length; i++) {
140 if(found && !document.forms[e].elements[i].disabled){
141 return(document.forms[e].elements[i]);
142 }
143 if(document.forms[e].elements[i].id==element.id || document.forms[e].elements[i].name==element.name){
144 found =true;
145 }
146 }
147 }
148 }
150 function changeState() {
151 for (var i = 0; i < arguments.length; i++) {
152 var element = $(arguments[i]);
153 if (element.hasAttribute('disabled')) {
154 element.removeAttribute('disabled');
155 } else {
156 element.setAttribute('disabled', 'disabled');
157 }
158 }
159 }
161 function changeSelectState(triggerField, myField) {
162 if (document.getElementById(triggerField).value != 2){
163 document.getElementById(myField).disabled= true;
164 } else {
165 document.getElementById(myField).disabled= false;
166 }
167 }
169 function changeSubselectState(triggerField, myField) {
170 if (document.getElementById(triggerField).checked == true){
171 document.getElementById(myField).disabled= false;
172 } else {
173 document.getElementById(myField).disabled= true;
174 }
175 }
177 function changeTripleSelectState(firstTriggerField, secondTriggerField, myField) {
178 if (
179 document.getElementById(firstTriggerField).checked == true &&
180 document.getElementById(secondTriggerField).checked == true){
181 document.getElementById(myField).disabled= false;
182 } else {
183 document.getElementById(myField).disabled= true;
184 }
185 }
187 <!-- Second field must be non-checked -->
188 function changeTripleSelectState_2nd_neg(firstTriggerField, secondTriggerField, myField) {
189 if (
190 document.getElementById(firstTriggerField).checked == true &&
191 document.getElementById(secondTriggerField).checked == false){
192 document.getElementById(myField).disabled= false;
193 } else {
194 document.getElementById(myField).disabled= true;
195 }
196 }
199 function popup(target, name) {
200 var mypopup=
201 window.open(
202 target,
203 name,
204 "width=600,height=700,location=no,toolbar=no,directories=no,menubar=no,status=no,scrollbars=yes"
205 );
206 mypopup.focus();
207 return false;
208 }
210 function js_check(form) {
211 form.javascript.value = 'true';
212 }
214 function divGOsa_toggle(element) {
215 var cell;
216 var cellname="tr_"+(element);
218 if (Prototype.Browser.Gecko) {
219 document.poppedLayer = document.getElementById(element);
220 cell= document.getElementById(cellname);
222 if (document.poppedLayer.style.visibility == "visible") {
223 $(element).hide();
224 cell.style.height="0px";
225 document.poppedLayer.style.height="0px";
226 } else {
227 $(element).show();
228 document.poppedLayer.style.height="";
229 if(document.defaultView) {
230 cell.style.height=document.defaultView.getComputedStyle(document.poppedLayer,"").getPropertyValue('height');
231 }
232 }
233 } else if (Prototype.Browser.IE) {
234 document.poppedLayer = document.getElementById(element);
235 cell= document.getElementById(cellname);
236 if (document.poppedLayer.style.visibility == "visible") {
237 $(element).hide();
238 cell.style.height="0px";
239 document.poppedLayer.style.height="0px";
240 document.poppedLayer.style.position="absolute";
241 } else {
242 $(element).show();
243 cell.style.height="";
244 document.poppedLayer.style.height="";
245 document.poppedLayer.style.position="relative";
246 }
247 }
248 }
250 function resizeHandler (e) {
251 if (!e) e=window.event;
252 if ($("d_scrollbody") && $("t_nscrollbody")) {
254 var contentHeight= document.viewport.getHeight() - 216;
255 if ($$('div.plugin-actions').length != 0) {
256 var height= 0;
257 $$('div.plugin-actions').each(function(s) {
258 height+= s.getHeight();
259 });
260 contentHeight-= height + 5;
261 }
263 document.getElementById('d_scrollbody').style.height = contentHeight+23+'px';
264 document.getElementById('t_nscrollbody').style.height = contentHeight+'px';
265 }
266 return true;
267 }
269 function absTop(e) {
270 return (e.offsetParent)?e.offsetTop+absTop(e.offsetParent) : e.offsetTop;
271 }
273 /* Set focus to first valid input field
274 avoid IExplorer warning about hidding or disabled fields
275 */
276 function focus_field()
277 {
278 var i = 0;
279 var e = 0;
280 var found = false;
281 var element_name = "";
282 var element =null;
284 while(focus_field.arguments[i] && !found){
286 var tmp = document.getElementsByName(focus_field.arguments[i]);
287 for(e = 0 ; e < tmp.length ; e ++ ){
289 if(isVisible(tmp[e])){
290 found = true;
291 element = tmp[e];
292 break;
293 }
294 }
295 i++;
296 }
298 if(element && found){
299 element.blur();
300 element.focus();
301 }
302 }
305 /* This function pops up messages from message queue
306 All messages are hidden in html output (style='display:none;').
307 This function makes single messages visible till there are no more dialogs queued.
309 hidden inputs:
310 current_msg_dialogs - Currently visible dialog
311 closed_msg_dialogs - IDs of already closed dialogs
312 pending_msg_dialogs - Queued dialog IDs.
313 */
314 function next_msg_dialog()
315 {
316 var s_pending = "";
317 var a_pending = new Array();
318 var i_id = 0;
319 var i = 0;
320 var tmp = "";
321 var ele = null;
322 var ele2 = null;
323 var cur_id = "";
325 if(document.getElementById('current_msg_dialogs')){
326 cur_id = document.getElementById('current_msg_dialogs').value;
327 if(cur_id != ""){
328 ele = document.getElementById('e_layer' + cur_id);
329 ele.onmousemove = "";
330 $('e_layer' + cur_id).hide();
331 document.getElementById('closed_msg_dialogs').value += "," + cur_id;
332 document.getElementById('current_msg_dialogs').value= "";
333 }
334 }
336 if(document.getElementById('pending_msg_dialogs')){
337 s_pending = document.getElementById('pending_msg_dialogs').value;
338 a_pending = s_pending.split(",");
339 if(a_pending.length){
340 i_id = a_pending.pop();
341 for (i = 0 ; i < a_pending.length; ++i){
342 tmp = tmp + a_pending[i] + ',';
343 }
344 tmp = tmp.replace(/,$/g,"");
345 if(i_id != ""){
346 ele = document.getElementById('e_layer' + i_id);
347 ele3 = document.getElementById('e_layerTitle' + i_id);
348 ele.style.display= 'block' ;
349 document.getElementById('pending_msg_dialogs').value= tmp;
350 document.getElementById('current_msg_dialogs').value= i_id;
351 ele2 = document.getElementById('e_layer2') ;
352 ele3.onmousedown = start_move_div_by_cursor;
353 ele2.onmouseup = stop_move_div_by_cursor;
354 ele2.onmousemove = move_div_by_cursor;
355 }else{
356 ele2 = document.getElementById('e_layer2') ;
357 ele2.style.display ="none";
358 }
359 }
360 }
361 }
364 /* Drag & drop for message dialogs */
365 var enable_move_div_by_cursor = false; // Indicates wheter the div movement is enabled or not
366 var mouse_x_on_div = 0; //
367 var mouse_y_on_div = 0;
368 var div_offset_x = 0;
369 var div_offset_y = 0;
371 /* Activates msg_dialog drag & drop
372 * This function is called when clicking on a displayed msg_dialog
373 */
374 function start_move_div_by_cursor(e)
375 {
376 var x = 0;
377 var y = 0;
378 var cur_id = 0;
379 var dialog = null;
380 var event = null;
382 /* Get current msg_dialog position
383 */
384 cur_id = document.getElementById('current_msg_dialogs').value;
385 if(cur_id != ""){
386 dialog = document.getElementById('e_layer' + cur_id);
387 x = dialog.style.left;
388 y = dialog.style.top;
389 x = x.replace(/[^0-9]/g,"");
390 y = y.replace(/[^0-9]/g,"");
391 if(!y) y = 1;
392 if(!x) x = 1;
393 }
395 /* Get mouse position within msg_dialog
396 */
397 if(window.event){
398 event = window.event;
399 if(event.offsetX){
400 div_offset_x = event.clientX -x;
401 div_offset_y = event.clientY -y;
402 enable_move_div_by_cursor = true;
403 }
404 }else if(e){
405 event = e;
406 if(event.layerX){
407 div_offset_x = event.screenX -x;
408 div_offset_y = event.screenY -y;
409 enable_move_div_by_cursor = true;
410 }
411 }
412 }
415 /* Deactivate msg_dialog movement
416 */
417 function stop_move_div_by_cursor()
418 {
419 mouse_x_on_div = 0;
420 mouse_y_on_div = 0;
421 div_offset_x = 0;
422 div_offset_y = 0;
423 enable_move_div_by_cursor = false;
424 }
427 /* Move msg_dialog with cursor */
428 function move_div_by_cursor(e)
429 {
430 var event = false;
431 var mouse_pos_x = 0;
432 var mouse_pos_y = 0;
433 var cur_div_x = 0;
434 var cur_div_y = 0;
435 var cur_id = 0;
436 var dialog = null;
439 if(undefined !== enable_move_div_by_cursor && enable_move_div_by_cursor == true){
441 if(document.getElementById('current_msg_dialogs')){
443 /* Get mouse position on screen
444 */
445 if(window.event){
446 event = window.event;
447 mouse_pos_x =event.clientX;
448 mouse_pos_y =event.clientY;
449 }else if (e){
450 event = e;
451 mouse_pos_x =event.screenX;
452 mouse_pos_y =event.screenY;
453 }else{
454 return;
455 }
457 /* Get id of current msg_dialog */
458 cur_id = document.getElementById('current_msg_dialogs').value;
459 if(cur_id != ""){
460 dialog = document.getElementById('e_layer' + cur_id);
462 /* Calculate new position */
463 cur_div_x = mouse_pos_x - div_offset_x;
464 cur_div_y = mouse_pos_y - div_offset_y;
466 /* Ensure that dialog can't be moved out of screen */
467 if(cur_div_x < 0 ) cur_div_x = 0
468 if(cur_div_y < 0 ) cur_div_y = 0
470 /* Assign new values */
471 dialog.style.left = (cur_div_x ) + "px";
472 dialog.style.top = (cur_div_y ) + "px";
473 }
474 }
475 }
476 }
479 function isVisible(obj)
480 {
481 if (obj == document) return true
483 if (!obj) return false
484 if (!obj.parentNode) return false
485 if (obj.style) {
486 if (obj.style.display == 'none') return false
487 if (obj.style.visibility == 'hidden') return false
488 }
490 //Try the computed style in a standard way
491 if (window.getComputedStyle) {
492 var style = window.getComputedStyle(obj, "")
493 if (style.display == 'none') return false
494 if (style.visibility == 'hidden') return false
495 }
497 //Or get the computed style using IE's silly proprietary way
498 var style = obj.currentStyle
499 if (style) {
500 if (style['display'] == 'none') return false
501 if (style['visibility'] == 'hidden') return false
502 }
504 return isVisible(obj.parentNode)
505 }
508 /* Check if capslock is enabled */
509 function capslock(e) {
510 e = (e) ? e : window.event;
512 var charCode = false;
513 if (e.which) {
514 charCode = e.which;
515 } else if (e.keyCode) {
516 charCode = e.keyCode;
517 }
519 var shifton = false;
520 if (e.shiftKey) {
521 shifton = e.shiftKey;
522 } else if (e.modifiers) {
523 shifton = !!(e.modifiers & 4);
524 }
526 if (charCode >= 97 && charCode <= 122 && shifton) {
527 return true;
528 }
530 if (charCode >= 65 && charCode <= 90 && !shifton) {
531 return true;
532 }
534 return false;
535 }
539 /* Scroll down the body frame */
540 function scrollDown2()
541 {
542 document.body.scrollTop = document.body.scrollHeight - document.body.clientHeight;
543 }
546 // Global storage for baseSelector timer
547 var rtimer;
549 // vim:ts=2:syntax