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) {
98 // determines whether Netscape or Internet Explorer
99 k = (Prototype.Browser.Gecko) ? DnEvents.keyCode : window.event.keyCode;
100 if (k == 13) { // enter key pressed
101 if(typeof(nextfield)!='undefined') {
102 if(nextfield == 'login') {
103 return true; // submit, we finished all fields
104 } else { // we are not done yet, send focus to next box
105 eval('document.mainform.' + nextfield + '.focus()');
106 return false;
107 }
108 } else {
109 if(Prototype.Browser.Gecko) {
110 if(DnEvents.target.type == 'textarea') {
111 return true;
112 } else if (DnEvents.target.type != 'submit') {
113 // TAB
114 var thisfield = document.getElementById(DnEvents.target.id);
115 for (i = 0; i < document.forms[0].elements.length; i++) {
116 if(document.forms[0].elements[i].id==thisfield.id) {
117 // Last form element on page?
118 if(i!=document.forms[0].elements.length-1) {
119 document.forms[0].elements[i+1].focus();
120 }
121 }
122 }
123 return false;
124 } else {
125 return true;
126 }
127 // Check for konqueror
128 } else if(document.clientWidth) {
129 // do nothing ATM
130 } else {
131 if(window.event.srcElement.type == 'textarea') {
132 return true;
133 } else if (window.event.srcElement.type != 'submit') {
134 // TAB
135 var thisfield = document.getElementById(window.event.srcElement.id);
136 for (i = 0; i < document.forms[0].elements.length; i++) {
137 if(document.forms[0].elements[i].id==thisfield.id) {
138 // Last form element on page?
139 if(i!=document.forms[0].elements.length-1) {
140 document.forms[0].elements[i+1].focus();
141 }
142 }
143 }
144 return false;
145 } else {
146 return true;
147 }
148 }
149 }
150 } else if (k==9) {
151 // Tab key pressed
152 if(Prototype.Browser.Gecko) {
153 if(DnEvents.target.type == 'textarea') {
154 document.getElementById(DnEvents.target.id).value+="\t";
155 return false;
156 }
157 // Check for konqueror
158 } else if(document.clientWidth) {
159 // do nothing ATM
160 } else {
161 if(window.event.srcElement.type == 'textarea') {
162 document.getElementById(window.event.srcElement.id).value+="\t";
163 return false;
164 }
165 }
166 }
167 }
169 function changeState() {
170 for (var i = 0; i < arguments.length; i++) {
171 var element = $(arguments[i]);
172 if (element.hasAttribute('disabled')) {
173 element.removeAttribute('disabled');
174 } else {
175 element.setAttribute('disabled', 'disabled');
176 }
177 }
178 }
180 function changeSelectState(triggerField, myField) {
181 if (document.getElementById(triggerField).value != 2){
182 document.getElementById(myField).disabled= true;
183 } else {
184 document.getElementById(myField).disabled= false;
185 }
186 }
188 function changeSubselectState(triggerField, myField) {
189 if (document.getElementById(triggerField).checked == true){
190 document.getElementById(myField).disabled= false;
191 } else {
192 document.getElementById(myField).disabled= true;
193 }
194 }
196 function changeTripleSelectState(firstTriggerField, secondTriggerField, myField) {
197 if (
198 document.getElementById(firstTriggerField).checked == true &&
199 document.getElementById(secondTriggerField).checked == true){
200 document.getElementById(myField).disabled= false;
201 } else {
202 document.getElementById(myField).disabled= true;
203 }
204 }
206 <!-- Second field must be non-checked -->
207 function changeTripleSelectState_2nd_neg(firstTriggerField, secondTriggerField, myField) {
208 if (
209 document.getElementById(firstTriggerField).checked == true &&
210 document.getElementById(secondTriggerField).checked == false){
211 document.getElementById(myField).disabled= false;
212 } else {
213 document.getElementById(myField).disabled= true;
214 }
215 }
217 // work together to analyze keystrokes
218 if (Prototype.Browser.Gecko){
219 window.onkeypress= keyHandler;
220 } else {
221 document.onkeydown= keyHandler;
222 }
225 function popup(target, name) {
226 var mypopup=
227 window.open(
228 target,
229 name,
230 "width=600,height=700,location=no,toolbar=no,directories=no,menubar=no,status=no,scrollbars=yes"
231 );
232 mypopup.focus();
233 return false;
234 }
236 function js_check(form) {
237 form.javascript.value = 'true';
238 }
240 function divGOsa_toggle(element) {
241 var cell;
242 var cellname="tr_"+(element);
244 if (Prototype.Browser.Gecko) {
245 document.poppedLayer = document.getElementById(element);
246 cell= document.getElementById(cellname);
248 if (document.poppedLayer.style.visibility == "visible") {
249 $(element).hide();
250 cell.style.height="0px";
251 document.poppedLayer.style.height="0px";
252 } else {
253 $(element).show();
254 document.poppedLayer.style.height="";
255 if(document.defaultView) {
256 cell.style.height=document.defaultView.getComputedStyle(document.poppedLayer,"").getPropertyValue('height');
257 }
258 }
259 } else if (Prototype.Browser.IE) {
260 document.poppedLayer = document.getElementById(element);
261 cell= document.getElementById(cellname);
262 if (document.poppedLayer.style.visibility == "visible") {
263 $(element).hide();
264 cell.style.height="0px";
265 document.poppedLayer.style.height="0px";
266 document.poppedLayer.style.position="absolute";
267 } else {
268 $(element).show();
269 cell.style.height="";
270 document.poppedLayer.style.height="";
271 document.poppedLayer.style.position="relative";
272 }
273 }
274 }
276 function resizeHandler (e) {
277 if (!e) e=window.event;
278 if (document.getElementById("menucell") && document.getElementById("d_scrollbody")) {
279 var inner_height= window.innerHeight;
280 var min_height= 450;
281 var px_height= min_height;
282 var suggested= px_height;
284 // document.defaultView allows access to the rendered size of elements and should be supported by modern browsers
285 if(document.defaultView) {
286 var menu_height= 0;
287 if (document.getElementById("d_height")){
288 suggested= parseInt(document.getElementById("d_height").value);
289 } else {
290 menu_height=parseInt(document.defaultView.getComputedStyle(document.getElementById("menucell"),"").getPropertyValue('height'));
291 // Minimum height for divlist should be the bottom edge of the menu
292 min_height= menu_height-197;
293 suggested= min_height;
294 if((inner_height-230)-suggested>0) {
295 suggested= inner_height-230;
296 }
298 }
300 // IE uses other height specifications
301 } else if (Prototype.Browser.IE) {
302 suggested= document.all.menucell.offsetHeight;
303 offset= absTop(d_scrollbody);
304 suggested-= offset;
305 if((inner_height-230)-suggested>0) {
306 suggested= inner_height-230;
307 }
308 }
310 /* Reduce height if a list footer is set */
311 if(document.getElementById("t_scrollfoot")){
312 suggested = suggested -20;
313 }
315 if (!document.getElementById("list_workaround")) {
316 document.getElementById("d_scrollbody").style.height=suggested+"px";
317 } else {
318 if (!Prototype.Browser.IE) {
319 current_height= parseInt(document.defaultView.getComputedStyle(document.getElementById("t_nscrollbody"),"").getPropertyValue('height'));
320 if (current_height < menu_height) {
321 document.getElementById("d_scrollbody").style.height=suggested+20+"px";
322 }
323 }
324 }
325 if (document.getElementById("t_nscrollbody")) {
326 document.getElementById("t_nscrollbody").style.height=(suggested-22)+"px";
327 }
328 }
329 return true;
330 }
332 function absTop(e) {
333 return (e.offsetParent)?e.offsetTop+absTop(e.offsetParent) : e.offsetTop;
334 }
336 /* Set focus to first valid input field
337 avoid IExplorer warning about hidding or disabled fields
338 */
339 function focus_field()
340 {
341 var i = 0;
342 var e = 0;
343 var found = false;
344 var element_name = "";
345 var element =null;
347 while(focus_field.arguments[i] && !found){
349 var tmp = document.getElementsByName(focus_field.arguments[i]);
350 for(e = 0 ; e < tmp.length ; e ++ ){
352 if(isVisible(tmp[e])){
353 found = true;
354 element = tmp[e];
355 break;
356 }
357 }
358 i++;
359 }
361 if(element && found){
362 element.blur();
363 element.focus();
364 }
365 }
368 /* This function pops up messages from message queue
369 All messages are hidden in html output (style='display:none;').
370 This function makes single messages visible till there are no more dialogs queued.
372 hidden inputs:
373 current_msg_dialogs - Currently visible dialog
374 closed_msg_dialogs - IDs of already closed dialogs
375 pending_msg_dialogs - Queued dialog IDs.
376 */
377 function next_msg_dialog()
378 {
379 var s_pending = "";
380 var a_pending = new Array();
381 var i_id = 0;
382 var i = 0;
383 var tmp = "";
384 var ele = null;
385 var ele2 = null;
386 var cur_id = "";
388 if(document.getElementById('current_msg_dialogs')){
389 cur_id = document.getElementById('current_msg_dialogs').value;
390 if(cur_id != ""){
391 ele = document.getElementById('e_layer' + cur_id);
392 ele.onmousemove = "";
393 $('e_layer' + cur_id).hide();
394 document.getElementById('closed_msg_dialogs').value += "," + cur_id;
395 document.getElementById('current_msg_dialogs').value= "";
396 }
397 }
399 if(document.getElementById('pending_msg_dialogs')){
400 s_pending = document.getElementById('pending_msg_dialogs').value;
401 a_pending = s_pending.split(",");
402 if(a_pending.length){
403 i_id = a_pending.pop();
404 for (i = 0 ; i < a_pending.length; ++i){
405 tmp = tmp + a_pending[i] + ',';
406 }
407 tmp = tmp.replace(/,$/g,"");
408 if(i_id != ""){
409 ele = document.getElementById('e_layer' + i_id);
410 ele3 = document.getElementById('e_layerTitle' + i_id);
411 ele.style.display= 'block' ;
412 document.getElementById('pending_msg_dialogs').value= tmp;
413 document.getElementById('current_msg_dialogs').value= i_id;
414 ele2 = document.getElementById('e_layer2') ;
415 ele3.onmousedown = start_move_div_by_cursor;
416 ele2.onmouseup = stop_move_div_by_cursor;
417 ele2.onmousemove = move_div_by_cursor;
418 }else{
419 ele2 = document.getElementById('e_layer2') ;
420 ele2.style.display ="none";
421 }
422 }
423 }
424 }
427 /* Drag & drop for message dialogs */
428 var enable_move_div_by_cursor = false; // Indicates wheter the div movement is enabled or not
429 var mouse_x_on_div = 0; //
430 var mouse_y_on_div = 0;
431 var div_offset_x = 0;
432 var div_offset_y = 0;
434 /* Activates msg_dialog drag & drop
435 * This function is called when clicking on a displayed msg_dialog
436 */
437 function start_move_div_by_cursor(e)
438 {
439 var x = 0;
440 var y = 0;
441 var cur_id = 0;
442 var dialog = null;
443 var event = null;
445 /* Get current msg_dialog position
446 */
447 cur_id = document.getElementById('current_msg_dialogs').value;
448 if(cur_id != ""){
449 dialog = document.getElementById('e_layer' + cur_id);
450 x = dialog.style.left;
451 y = dialog.style.top;
452 x = x.replace(/[^0-9]/g,"");
453 y = y.replace(/[^0-9]/g,"");
454 if(!y) y = 1;
455 if(!x) x = 1;
456 }
458 /* Get mouse position within msg_dialog
459 */
460 if(window.event){
461 event = window.event;
462 if(event.offsetX){
463 div_offset_x = event.clientX -x;
464 div_offset_y = event.clientY -y;
465 enable_move_div_by_cursor = true;
466 }
467 }else if(e){
468 event = e;
469 if(event.layerX){
470 div_offset_x = event.screenX -x;
471 div_offset_y = event.screenY -y;
472 enable_move_div_by_cursor = true;
473 }
474 }
475 }
478 /* Deactivate msg_dialog movement
479 */
480 function stop_move_div_by_cursor()
481 {
482 mouse_x_on_div = 0;
483 mouse_y_on_div = 0;
484 div_offset_x = 0;
485 div_offset_y = 0;
486 enable_move_div_by_cursor = false;
487 }
490 /* Move msg_dialog with cursor */
491 function move_div_by_cursor(e)
492 {
493 var event = false;
494 var mouse_pos_x = 0;
495 var mouse_pos_y = 0;
496 var cur_div_x = 0;
497 var cur_div_y = 0;
498 var cur_id = 0;
499 var dialog = null;
502 if(undefined !== enable_move_div_by_cursor && enable_move_div_by_cursor == true){
504 if(document.getElementById('current_msg_dialogs')){
506 /* Get mouse position on screen
507 */
508 if(window.event){
509 event = window.event;
510 mouse_pos_x =event.clientX;
511 mouse_pos_y =event.clientY;
512 }else if (e){
513 event = e;
514 mouse_pos_x =event.screenX;
515 mouse_pos_y =event.screenY;
516 }else{
517 return;
518 }
520 /* Get id of current msg_dialog */
521 cur_id = document.getElementById('current_msg_dialogs').value;
522 if(cur_id != ""){
523 dialog = document.getElementById('e_layer' + cur_id);
525 /* Calculate new position */
526 cur_div_x = mouse_pos_x - div_offset_x;
527 cur_div_y = mouse_pos_y - div_offset_y;
529 /* Ensure that dialog can't be moved out of screen */
530 if(cur_div_x < 0 ) cur_div_x = 0
531 if(cur_div_y < 0 ) cur_div_y = 0
533 /* Assign new values */
534 dialog.style.left = (cur_div_x ) + "px";
535 dialog.style.top = (cur_div_y ) + "px";
536 }
537 }
538 }
539 }
542 function isVisible(obj)
543 {
544 if (obj == document) return true
546 if (!obj) return false
547 if (!obj.parentNode) return false
548 if (obj.style) {
549 if (obj.style.display == 'none') return false
550 if (obj.style.visibility == 'hidden') return false
551 }
553 //Try the computed style in a standard way
554 if (window.getComputedStyle) {
555 var style = window.getComputedStyle(obj, "")
556 if (style.display == 'none') return false
557 if (style.visibility == 'hidden') return false
558 }
560 //Or get the computed style using IE's silly proprietary way
561 var style = obj.currentStyle
562 if (style) {
563 if (style['display'] == 'none') return false
564 if (style['visibility'] == 'hidden') return false
565 }
567 return isVisible(obj.parentNode)
568 }
572 // Global storage for baseSelector timer
573 var rtimer;
575 // vim:ts=2:syntax