/*
	js functions and code common to all pages
*/

/* define some global variables for this request */
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 */
if (headers['HOST'] == undefined) {
	headers['HOST'] = server['SERVER_HOST'] + ":" + server['SERVER_PORT'];
}

/*
  show the page header. page types include "plain" and "column" 
*/
function page_header(pagetype, title) {
	global.page.pagetype = pagetype;
	global.page.title = title;
	include("/scripting/header_" + pagetype + ".esp");
}

/*
  show the page footer, getting the page type from page.pagetype
  set in page_header()
*/
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
*/
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) {
		if (allowed[i] == uri) {
			return true;
		}
	}
	return false;
}

/*
  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() {
	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(array) == 0) {
		return;
	}
	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");
}