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