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