r8353: Use a PNG instead of a GIF for padding. Also fixes a file not found
[kai/samba.git] / swat / scripting / common.js
1 /*
2         js functions and code common to all pages
3 */
4
5 /* define some global variables for this request */
6 global.page = new Object();
7
8 /* fill in some defaults */
9 global.page.title = "Samba Web Administration Tool";
10
11 /* to cope with browsers that don't support cookies we append the sessionid
12    to the URI */
13 global.SESSIONURI = "";
14 if (request['COOKIE_SUPPORT'] != "True") {
15         global.SESSIONURI="?SwatSessionId=" + request['SESSION_ID'];
16 }
17
18 /*
19   possibly adjust a local URI to have the session id appended
20   used for browsers that don't support cookies
21 */
22 function session_uri(uri) {
23         return uri + global.SESSIONURI;
24 }
25
26
27
28 /* if the browser was too dumb to set the HOST header, then
29    set it now */
30 if (headers['HOST'] == undefined) {
31         headers['HOST'] = server['SERVER_HOST'] + ":" + server['SERVER_PORT'];
32 }
33
34 /*
35   show the page header. page types include "plain" and "column" 
36 */
37 function page_header(pagetype, title) {
38         global.page.pagetype = pagetype;
39         global.page.title = title;
40         include("/scripting/header_" + pagetype + ".esp");
41 }
42
43 /*
44   show the page footer, getting the page type from page.pagetype
45   set in page_header()
46 */
47 function page_footer() {
48         include("/scripting/footer_" + global.page.pagetype + ".esp");
49 }
50
51
52 /*
53   check if a uri is one of the 'always allowed' pages, even when not logged in
54   This allows the login page to use the same style sheets and images
55 */
56 function always_allowed(uri) {
57         var allowed = new Array("/images/favicon.ico", 
58                                 "/images/linkpad.png",
59                                 "/images/logo.png",
60                                 "/style/main.css",
61                                 "/style/common.css");
62         for (i in allowed) {
63                 if (allowed[i] == uri) {
64                         return true;
65                 }
66         }
67         return false;
68 }
69
70 /*
71   create a menu object with the defaults filled in, ready for display_menu()
72  */
73 function MenuObj(name, num_elements)
74 {
75         var o = new Object();
76         o.name = name;
77         o.class = "menu";
78         o.style = "simple";
79         o.orientation = "vertical"
80         o.element = new Array(num_elements);
81         for (i in o.element) {
82                 o.element[i] = new Object();
83         }
84         return o;
85 }
86
87 /*
88   display a menu object. Currently only the "simple", "vertical" menu style
89   is supported
90 */
91 function display_menu(m) {
92         assert(m.style == "simple" && m.orientation == "vertical");
93         write('<div class="' + m.class + '">\n');
94         write("<i>" + m.name + "</i><br /><ul>\n");
95         for (i = 0; i < m.element.length; i++) {
96                 var e = m.element[i];
97                 write("<li><a href=\"" + e.link + "\">" + e.label + "</a></li>\n");
98         }
99         write("</ul></div>\n");
100 }
101
102 function simple_menu() {
103         var m = MenuObj(arguments[0], (arguments.length-1)/2);
104         for (i=0;i<m.element.length;i++) {
105                 m.element[i].label = arguments[1+(i*2)];
106                 m.element[i].link = arguments[2+(i*2)];
107         }
108         display_menu(m);
109 }
110
111 /*
112   display a table element
113 */
114 function table_element(i, o) {
115         write("<tr><td>" + i + "</td><td>");
116         if (typeof(o[i]) == "object") {
117                 var j, first;
118                 first = true;
119                 for (j in o[i]) {
120                         if (first == false) {
121                                 write("<br />");
122                         }
123                         write(o[i][j]);
124                         first = false;
125                 }
126         } else {
127                 write(o[i]);
128         }
129         write("</td></tr>\n");
130 }
131
132 /*
133   display a ejs object as a table. The header is optional
134 */
135 function simple_table(v) {
136         if (v.length == 0) {
137                 return;
138         }
139         write("<table class=\"data\">\n");
140         var r;
141         for (r in v) {
142                 table_element(r, v);
143         }
144         write("</table>\n");
145 }
146
147 /*
148   display an array of objects, with the header for each element from the given 
149   attribute
150 */
151 function multi_table(array, header) {
152         var i, n;
153         write("<table class=\"data\">\n");
154         for (i=0;i<array.length;i++) {
155                 var r, v = array[i];
156                 write('<tr><th colspan="2">' + v[header] + "</th></tr>\n");
157                 for (r in v) {
158                         if (r != header) {
159                             table_element(r, v);
160                         }
161                 }
162         }
163         write("</table>\n");
164 }
165
166 /*
167   create a Form object with the defaults filled in, ready for display_form()
168  */
169 function FormObj(name, num_elements, num_submits)
170 {
171         var f = new Object();
172         f.name = name;
173         f.element = new Array(num_elements);
174         f.submit =  new Array(num_submits);
175         f.action = session_uri(request.REQUEST_URI);
176         f.class = "defaultform";
177         for (i in f.element) {
178                 f.element[i] = new Object();
179                 f.element[i].type = "text";
180                 f.element[i].value = "";
181         }
182         return f;
183 }
184
185 /*
186   display a simple form from a ejs Form object
187   caller should fill in
188     f.name          = form name
189     f.action        = action to be taken on submit (optional, defaults to current page)
190     f.class         = css class (optional, defaults to 'form')
191     f.submit        = an array of submit labels
192     f.element[i].label = element label
193     f.element[i].name  = element name (defaults to label)
194     f.element[i].type  = element type (defaults to text)
195     f.element[i].value = current value (optional, defaults to "")
196  */
197 function display_form(f) {
198         write('<form name="' + f.name +
199               '" method="post" action="' + f.action + 
200               '" class="' + f.class + '">\n');
201         if (f.element.length > 0) {
202                 write("<table>\n");
203         }
204         for (i in f.element) {
205                 var e = f.element[i];
206                 if (e.name == undefined) {
207                         e.name = e.label;
208                 }
209                 if (e.value == undefined) {
210                         e.value = "";
211                 }
212                 write("<tr>");
213                 write("<td>" + e.label + "</td>");
214                 if (e.type == "select") {
215                         write('<td><select name="' + e.name + '">\n');
216                         for (s in e.list) {
217                                 if (e.value == e.list[s]) {
218                                         write('<option selected=selected>' + e.list[s] + '</option>\n');
219                                 } else {
220                                         write('<option>' + e.list[s] + '</option>\n');
221                                 }
222                         }
223                         write('</select></td>\n');
224                 } else {
225                         write('<td><input name="' + e.name + '" type="' + 
226                               e.type + '" value="' + e.value + '" /></td>\n');
227                 }
228                 write("</tr>");
229         }
230         if (f.element.length > 0) {
231                 write("</table>\n");
232         }
233         for (i in f.submit) {
234                 write('<input name="submit" type="submit" value="' + f.submit[i] + '" />\n');
235         }
236         write("</form>\n");
237 }
238