r7134: a number of small changes to make the pages HTML compliant. The
[kai/samba.git] / swat / scripting / common.js
index 34f5a958dacd7589f22a9cf258ce32bf91ab1ae9..d7252b3bf9460bd4e873d05e526c553bc4831e97 100644 (file)
@@ -8,6 +8,22 @@ global.page = new Object();
 /* fill in some defaults */
 global.page.title = "Samba Web Administration Tool";
 
+/* to cope with browsers that don't support cookies we append the sessionid
+   to the URI */
+global.SESSIONURI = "";
+if (request['COOKIE_SUPPORT'] != "True") {
+       global.SESSIONURI="?SwatSessionId=" + request['SESSION_ID'];
+}
+
+/*
+  possibly adjust a local URI to have the session id appended
+  used for browsers that don't support cookies
+*/
+function session_uri(uri) {
+       return uri + global.SESSIONURI;
+}
+
+
 
 /* if the browser was too dumb to set the HOST header, then
    set it now */
@@ -32,6 +48,7 @@ function page_footer() {
        include("/scripting/footer_" + global.page.pagetype + ".esp");
 }
 
+
 /*
   check if a uri is one of the 'always allowed' pages, even when not logged in
   This allows the login page to use the same style sheets and images
@@ -40,6 +57,7 @@ function always_allowed(uri) {
        var allowed = new Array("/images/favicon.ico", 
                                "/images/linkpad.gif",
                                "/images/logo.png",
+                               "/images/logo.gif",
                                "/style/main.css",
                                "/style/common.css");
        for (i in allowed) {
@@ -51,13 +69,183 @@ function always_allowed(uri) {
 }
 
 /*
-  display a simple menu. First argument is menu title, followed by
-  pairs of menu item name and link
+  create a menu object with the defaults filled in, ready for display_menu()
+ */
+function MenuObj(name, num_elements)
+{
+       var o = new Object();
+       o.name = name;
+       o.class = "menu";
+       o.style = "simple";
+       o.orientation = "vertical"
+       o.element = new Array(num_elements);
+       for (i in o.element) {
+               o.element[i] = new Object();
+       }
+       return o;
+}
+
+/*
+  display a menu object. Currently only the "simple", "vertical" menu style
+  is supported
 */
+function display_menu(m) {
+       assert(m.style == "simple" && m.orientation == "vertical");
+       write('<div class="' + m.class + '">\n');
+       write("<i>" + m.name + "</i><br /><ul>\n");
+       for (i = 0; i < m.element.length; i++) {
+               var e = m.element[i];
+               write("<li><a href=\"" + e.link + "\">" + e.label + "</a></li>\n");
+       }
+       write("</ul></div>\n");
+}
+
 function simple_menu() {
-       write("<i>" + arguments[0] + "</i><br /><ul>\n");
-       for (i = 1; i < arguments.length; i = i + 2) {
-               write("<li><a href=\"" + arguments[i+1] + "\">" + arguments[i] + "</a></li>\n");
+       var m = MenuObj(arguments[0], (arguments.length-1)/2);
+       for (i=0;i<m.element.length;i++) {
+               m.element[i].label = arguments[1+(i*2)];
+               m.element[i].link = arguments[2+(i*2)];
+       }
+       display_menu(m);
+}
+
+/*
+  display a table element
+*/
+function table_element(i, o) {
+       write("<tr><td>" + i + "</td><td>");
+       if (typeof(o[i]) == "object") {
+               var first;
+               first = true;
+               for (j in o[i]) {
+                       if (first == false) {
+                               write("<br />");
+                       }
+                       write(o[i][j]);
+                       first = false;
+               }
+       } else {
+               write(o[i]);
+       }
+       write("</td></tr>\n");
+}
+
+/*
+  return the number of elements in an object
+*/
+function elcount(o) {
+       var count = 0;
+       for (i in o) {
+               count++;
+       }
+       return count;
+}
+
+/*
+  display a ejs object as a table. The header is optional
+*/
+function simple_table(v) {
+       if (elcount(v) == 0) {
+               return;
+       }
+       write("<table class=\"data\">\n");
+       for (r in v) {
+               table_element(r, v);
+       }
+       write("</table>\n");
+}
+
+/*
+  display an array of objects, with the header for each element from the given 
+  attribute
+*/
+function multi_table(array, header) {
+       if (elcount(v) == 0) {
+               return;
        }
-       write("</ul>\n");
+       write("<table class=\"data\">\n");
+       for (i in array) {
+               var v = array[i];
+               write('<tr><th colspan="2">' + v[header] + "</th></tr>\n");
+               for (r in v) {
+                       if (r != header) {
+                           table_element(r, v);
+                       }
+               }
+       }
+       write("</table>\n");
 }
+
+/*
+  create a Form object with the defaults filled in, ready for display_form()
+ */
+function FormObj(name, num_elements, num_submits)
+{
+       var f = new Object();
+       f.name = name;
+       f.element = new Array(num_elements);
+       f.submit =  new Array(num_submits);
+       f.action = session_uri(request.REQUEST_URI);
+       f.class = "defaultform";
+       for (i in f.element) {
+               f.element[i] = new Object();
+               f.element[i].type = "text";
+               f.element[i].value = "";
+       }
+       return f;
+}
+
+/*
+  display a simple form from a ejs Form object
+  caller should fill in
+    f.name          = form name
+    f.action        = action to be taken on submit (optional, defaults to current page)
+    f.class         = css class (optional, defaults to 'form')
+    f.submit        = an array of submit labels
+    f.element[i].label = element label
+    f.element[i].name  = element name (defaults to label)
+    f.element[i].type  = element type (defaults to text)
+    f.element[i].value = current value (optional, defaults to "")
+ */
+function display_form(f) {
+       write('<form name="' + f.name +
+             '" method="post" action="' + f.action + 
+             '" class="' + f.class + '">\n');
+       if (f.element.length > 0) {
+               write("<table>\n");
+       }
+       for (i in f.element) {
+               var e = f.element[i];
+               if (e.name == undefined) {
+                       e.name = e.label;
+               }
+               if (e.value == undefined) {
+                       e.value = "";
+               }
+               write("<tr>");
+               write("<td>" + e.label + "</td>");
+               if (e.type == "select") {
+                       write('<td><select name="' + e.name + '">\n');
+                       for (s in e.list) {
+                               if (e.value == e.list[s]) {
+                                       write('<option selected=selected>' + e.list[s] + '</option>\n');
+                               } else {
+                                       write('<option>' + e.list[s] + '</option>\n');
+                               }
+                       }
+                       write('</select></td>\n');
+               } else {
+                       write('<td><input name="' + e.name + '" type="' + 
+                             e.type + '" value="' + e.value + '" /></td>\n');
+               }
+               write("</tr>");
+       }
+       if (f.element.length > 0) {
+               write("</table>\n");
+       }
+       for (i in f.submit) {
+               write('<input name="submit" type="submit" value="' + f.submit[i] + '" />\n');
+       }
+       write("</form>\n");
+}
+