window.last_time_set = '';
if (window.base_directory === undefined) window.base_directory = '../';
var LIST_DELIMITER = '<br>';  // also defined in html.php

//! prototypes

String.prototype.trim = function() {
	a = this.replace(/^\s+/, '');
	return a.replace(/\s+$/, '');
};

String.prototype.ucFirst = function () {
    return this.substr(0,1).toUpperCase() + this.substr(1,this.length).toLowerCase();
};

function array_contains (ar, needle) 
{
   for (var i in ar) {
       if (ar[i] == needle) return true;
   }
   return false;
}

function empty (v)
{
	if (v == null) return true;
	if (v == 0) return true;
	if (v == '') return true;
	return false;
}

function debug (m)
{
	if (window.console) window.console.log (m);
}


//! mark Navigation

function go_to_location (loc)
{
	if (loc == '') loc = window.location.href;
	if (loc.substr(0,1) == '!') {
		loc = loc.substr(1);
	} else {
		if (loc.substr(0,1) == '*') {
			loc = loc.substr(1);
			if (!confirm (get_translation ('js_forms_are_you_sure', 'Are you sure?'))) return;
		}
	}
	if (loc.indexOf("print=yes") !== -1 && !window.can_auto_print) {
		window.open (loc);
	} else {
		if (window.unload_page) unload_page ();
		window.location.replace (loc);
	}
}

function go_to_location_on_confirmation (message, loc)
{
	if (!confirm(message)) return;
	//disable_buttons (); 
	go_to_location (loc)
}

function execute_or_go_to (v)
{
	if (v == '') return;
	if (v.indexOf(".php") > -1 && v.indexOf("window.open") == -1 && v.indexOf("window.location") == -1) {
			go_to_location (v);
	} else {
		eval (v)
	}
}

function get_URL_parameter (strParamName)
{ 
	var strReturn = "";
	var strHref = window.location.href;
	
	if ( strHref.indexOf("?") > -1 ) { 
		var strQueryString = strHref.substr(strHref.indexOf("?")+1);
		var aQueryString = strQueryString.split("&");
		for ( var iParam = 0; iParam < aQueryString.length; iParam++ ) { 
			if ( aQueryString[iParam].indexOf(strParamName + "=") == 0 ) { 
				var aParam = aQueryString[iParam].split("=");
				strReturn = aParam[1];
				break;
			}
		}
	} 
	return unescape(strReturn);
} 



function redirect_after_loading (loc, time)
{
	window.timeout = setTimeout ('go_to_location ("' + loc + '")', time * 1000);
}

function previous_page_after_loading ()
{
	var script = "var url = execute_on_server ('" + base_directory + "dynamic/previous_page.php', ''); go_to_location(url);"
	window.timeout = setTimeout (script, 1000);
}

function redirect_to_home ()
{
	window.onunload = '';
	window.location.replace (window.base_directory + 'index.php');
}

function select_tab_section_on_page (n, section, selected_class, cookie_name)
{
	var el = form_item(n);
	var ar = el.getElementsByTagName('li'); 
	if (ar) {
		for (var i = 0; i < ar.length; i++) {
			var id = ar[i].id.substr(4); 
			if (id != '') show_or_hide_item(id, id == section);
			ar[i].className = id == section ? selected_class : '';
		}
	}
	//document.cookie = cookie_name+'='+section+'; path=/'; 
	set_saved_session_variable (cookie_name, section);
}

function toggle_tab_section_on_page (n, section, selected_class, cookie_name)
{
	var el = form_item(n);
	//alert (section)
	var v = !form_item_visible (section);
	var ar = el.getElementsByTagName('li'); 
	if (ar) {
		var id = ar[0].id.substr(4); 
		ar[0].className = v ? selected_class : '';
	}
	var s = get_session_variable (cookie_name);
//	alert (s);
	s = v ? add_to_list (s, section) : remove_from_list (s, section);
//	alert (s);
//	document.cookie = cookie_name+'='+s+'; path=/'; 
	set_saved_session_variable (cookie_name, s);
	show_or_hide_item(section, v);
}

function get_cookie (c)
{
// 	alert (c);
// 	alert (document.cookie)
 	var cookies = document.cookie.split(';');
 	for (var i = 0; i < cookies.length; i++) {
 		var cr = cookies[i].split('=');
 		var n = cr[0].trim ();
// 		alert (c + '.' + n + '.' + cr[1])
 		if (n.toString() == c.toString()) return cr[1];
 	}
 	return '';
}

function add_to_list (list, item)
{
	var pattern = new RegExp("(^| )" + item + "( |$)");
	if (!pattern.test(list))
	{
		if (list == "") {
		  	list = item;
		} else {
		  	list = item + " " + list;
		}
	}
	return list;
}

function remove_from_list (list, item)
{
	var pattern = new RegExp("(^| )" + item + "( |$)");
	list = list.replace(pattern, "$1");
	list = list.replace(/ $/, "");
	return list;
}



function hide_item (b)
{
    var f = form_item (b);
    if (f) f.style.display = 'none';
}

function hide_item_delayed (b, d)
{
    setTimeout ("hide_item ('" + b + "')", d);
}

function show_item (b)
{
    var f = form_item (b);
    if (f) {
    	f.style.display = ''; 
    	f.style.visibility = 'visible';
    }
}

function show_or_hide_item (b, show)
{
	if (show) {
		show_item (b);
	} else {
		hide_item (b);
	}
}

function show_or_hide_group (g, show)
{
	g = get_form_item_value ('group_' + g);
	var fields = g.split (',');
	for (var i in fields) {
		show_or_hide_item (fields[i], show)
	}
}

function toggle_disclosure_triangle (op, im, dv1, dv2)
{
	var vis = !form_item_visible (dv1);
	form_item (im).src = window.base_directory + 'gfx/' + (vis ? 'disclosure-open.gif' : 'disclosure-closed.gif');
	show_or_hide_item (dv1, vis);
/* 	show_or_hide_item (dv2, !vis); */
	set_saved_session_variable (op, vis ? '1' : '0');
}

function toggle_tab_disclosure_triangle (section, im, dv)
{
	var vis = !form_item_visible (dv);
	form_item (im).src = window.base_directory + 'gfx/' + (vis ? 'tab-disclosure-open.gif' : 'tab-disclosure-closed.gif');
	show_or_hide_item (dv, vis);
	var s = get_session_variable (section);
	s = vis ? add_to_list (s, dv) : remove_from_list (s, dv);
	set_saved_session_variable (section, s);
}

function form_divider_group_clicked (clicked_group)
{
	var divider_groups = get_form_item_value ('divider_groups').split (',');
	for (var g in divider_groups) {
	//	if (!confirm (g)) return;
		var show = divider_groups[g] == clicked_group;
		var fields = get_form_item_value (divider_groups[g]).split (',');
		for (var i in fields) {
			show_or_hide_item (fields[i], show)
		}
	}
}

function form_item_visible (e)
{
	if (form_item(e) == null) return false;
	return form_item(e).style.display != 'none';
}


//- mark Forms, general

function form_item(e)
{
	return document.getElementById(e);
}

function form_item_exists(e)
{
	if (form_item(e) == null) return false;
	return true;
}


function focus_form_item (e)
{
	var el = form_item (e);
	if (!el) {
		debug ("***Couldn't focus_form_item(" + e + ")");
		return;
	}
	el.focus();
}


function get_form_item_value (e) 
{
	if (!form_item_exists (e)) {
		return null;
	}
	if (form_item(e).type == 'checkbox')
		return form_item(e).checked ? '1' : '0';
	return form_item(e).value;
}

function set_form_item_value(e, v) 
{
	if (!form_item_exists(e)) {
		alert("Couldn't set_form_item_value(" + e + "," + v + ")");
		return;
	}
	form_item(e).value = v;
}

function get_form_item_checked(e) 
{
	if (!form_item_exists(e)) {
		return false;
	}
	return get_form_item_value(e) == '1';
}

function set_form_item_checked(e, v) 
{
	form_item(e).checked = v;
}

function get_radio_button (el)
{
	return $('input[name=' + el + ']:checked').val();
}

function set_radio_button (el, val) 
{
	var $radios = $('input:radio[name=' + el + ']');
	$radios.attr('ckecked', false);
	$radios.filter('[value="'+val+'"]').attr('checked', true);
}


function get_form_item_decimal (e) 
{
	if (!form_item_exists (e)) {
		return null;
	}
	var v = get_form_item_value(e);
	if (v == '') v = '0';
	var decimal = get_form_item_value(e + '_decimal');
	if (decimal == '') decimal = '0';
	v = parseInt (v, 10) + parseFloat (decimal) / 100;
	return v;
}

function set_form_item_decimal(e, v) 
{
	if (!form_item_exists(e) || !form_item_exists(e + '_decimal')) {
		alert("Couldn't set_form_item_value(" + e + "," + v + ")");
	}
	form_item(e).value = Math.floor (v);
	form_item(e + '_decimal').value = pad_string_left (Math.round ((v - Math.floor (v)) * 100), 2, '0');
}


function get_form_item_inner_html(e) 
{
	if (!form_item_exists(e)) {
		return null;
	}
	return form_item(e).innerHTML;
}


function set_form_item_inner_html(e, v) 
{
	if (!form_item_exists(e)) {
		alert("Couldn't set_form_item_inner_html(" + e + "," + v + ")");
	}
	form_item(e).innerHTML = v;
}

function add_option_at_top_of_popup_menu (n,op)
{
	var ar = form_item(n); 
	if (which_browser() == 'Internet Explorer') { 
		ar.add (op, 0);
	} else {
		ar.add (op, ar.options[0]);
	}
}

function add_option_to_popup_menu (n,label,value)
{
	var ar = form_item(n); 
	if (ar) {
		i = ar.selectedIndex;
		ar.add(new Option(label,value),null);
		ar.selectedIndex = i;
	}
}

function add_request_to_popup_menu (n,request)
{
	var ar = form_item(n); 
	if (ar) {
		add_option_at_top_of_popup_menu (n, new Option(request,''));
		ar.selectedIndex = 0;
	}
}

function select_popup_menu_index(n,i)
{
	var ar = form_item(n); 
	if (ar) {
		ar.selectedIndex = i;
	}
}



function make_form_element_read_only (e, ro)
{
	form_item(e).readOnly = ro;	
}

function enable_form_element (e, enabled)
{
	form_item(e).disabled = !enabled;	
}



function get_translation (field, english_text)
{
	return english_text;
}



//! Forms, checking

function disable_buttons ()
{
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) 
		if (ar[i].type == "button" || ar[i].type == "submit" ) ar[i].disabled = true;
	return true;
}

function enable_buttons ()
{
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) 
		if (ar[i].type == "button" || ar[i].type == "submit" ) ar[i].disabled = false;
	return true;
}

function disable_submit ()
{
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) 
		if (ar[i].type == "submit" ) ar[i].disabled = true;
	return true;
}

function enable_submit ()
{
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) 
		if (ar[i].type == "submit" ) ar[i].disabled = false;
	return false;
}

function enable_or_disable_submit (b)
{
	if (b) 
		enable_submit ();
	else
		disable_submit ();
}

function disable_page ()
{
	if (window.dont_disable_when_changing_location) return;
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) 
		if (ar[i].type == "button" || ar[i].type == "submit" ) ar[i].disabled = true;
	ar = document.getElementsByTagName("select");
	for (var i = 0; i < ar.length; i++) ar[i].disabled = true;
	ar = document.getElementsByTagName("a");
	for (var i = 0; i < ar.length; i++) ar[i].disabled = true;
	return true;
}



function form_item_error (field, m)
{
	var marker = field + '_marker';
	if (form_item_exists (marker)) 
		set_form_item_inner_html (field + '_marker', '<div class="error">*** ' + m.replace (/\n/g, '</span>'));
	form_item (field).focus();
	enable_submit ();
	return false;
}

function field_OK (field)
{
	var marker = field + '_marker';
	if (form_item_exists (marker)) 
		set_form_item_inner_html (field + '_marker', '');
	return true;
}

function check_integer_field (f, minval, maxval)
{
	var v = get_form_item_value(f);
	for (i=0; i < v.length; i++) {
	   	if (v.charAt(i) == '-' && i > 0) {
		  	return form_item_error (f, get_translation ('js_forms_integer_badformat', 'can only contain an integer number'));
	   	}
	   	if ((v.charAt(i) != '-') && (v.charAt(i) < "0" || v.charAt(i) > "9")) {
		  	return form_item_error (f, get_translation ('js_forms_integer_badformat', 'can only contain an integer number'));
	   	}
	}
	v = parseInt(v,10);
	if (minval !== '' && v < minval) {
	  	return form_item_error (f, get_translation ('js_forms_integer_too_small', 'cannot be less than') + ' ' + minval);
	}
	if (maxval !== '' & v > maxval) {
	  	return form_item_error (f, get_translation ('js_forms_integer_too_big', 'cannot be greater than') + ' ' + maxval);
	}
	return field_OK (f);
}

function check_decimal_field (f, minval, maxval)
{
	var v = get_form_item_value(f);
	for (i=0; i < v.length; i++) {
	   	if (v.charAt(i) == '-' && i > 0) {
		  	return form_item_error (f, get_translation ('js_forms_decimal_badformat', 'can only contain an decimal number'));
	   	}
	   	if ((v.charAt(i) != '-') && (v.charAt(i) != '.') && (v.charAt(i) < "0" || v.charAt(i) > "9")) {
		  	return form_item_error (f, get_translation ('js_forms_decimal_badformat', 'can only contain an decimal number'));
	   	}
	}
	v = parseFloat(v);
	if (minval !== '' && v < minval) {
	  	return form_item_error (f, get_translation ('js_forms_decimal_too_small', 'cannot be less than') + ' ' + minval);
	}
	if (maxval !== '' & v > maxval) {
	  	return form_item_error (f, get_translation ('js_forms_decimal_too_big', 'cannot be greater than') + ' ' + maxval);
	}
	return field_OK (f);
}

function check_separated_decimal_field (f, minval, maxval)
{
	if (!check_integer_field (f + '_decimal', 0, 99)) return false;
	var v = get_form_item_value(f);
	if (v == '') v = '0';
	var pattern = /^-?\d+(\d+)?$/;
	if (!pattern.test(v) && v != '') {
	  	return form_item_error (f, 'can only contain a numeric value.\n\nUse the second field for the value after the decimal place.');
	}
	var decimal = get_form_item_value(f + '_decimal');
	if (decimal == '') decimal = '0';
	v = parseInt (v, 10) + parseFloat (decimal) / 100;
	if (v == '') return field_OK (f);
	if (minval !== '' && v < minval) {
	  	return form_item_error (f, 'cannot be less than ' + minval + ".");
	}
	if (maxval !== '' & v > maxval) {
	  	return form_item_error (f, 'cannot be greater than ' + maxval + ".");
	}
	return field_OK (f);
}

function check_date_field (f)
{
	var e = form_item(f);
	if (!e) return true;
	if (!is_valid_date(e.value)) 
	{
      return form_item_error (f, 'contains an invalid date. (Expected format YYYY-MM-DD)');
   }
   return field_OK (f);
}

function _isDate (day,month,year) 
{
// checks if date passed is valid
// will accept dates in following format:
// _isDate(dd,mm,ccyy), or
// _isDate(dd,mm) - which defaults to the current year, or
// _isDate(dd) - which defaults to the current month and year.
// Note, if passed the month must be between 1 and 12, and the
// year in ccyy format.

    var today = new Date();
    year = ((!year) ? _y2k(today.getYear()):year);
    month = ((!month) ? today.getMonth():month-1);
    if (!day) return false
    var test = new Date(year,month,day);
	//alert(test)
    if ( (_y2k(test.getYear()) == year) &&
         (month == test.getMonth()) &&
         (day == test.getDate()) )
        return true;
    else
        return false
}

function is_valid_date(d)
{
	if (d.length == 0) return true
	if (d.length != 10) return false
	if (!_isNum(d.substring(0,4))) return false
	if (!_isNum(d.substring(5,7))) return false
	if (!_isNum(d.substring(8,10))) return false
	if (d.substring(4,5) != "-") return false;
	if (d.substring(7,8) != "-") return false;
	var year = parseInt(d.substring(0,4),10)
	var month = parseInt(d.substring(5,7),10)
	var day = parseInt(d.substring(8,10),10)
    if (month<1 || month>12)  return false; 
  	if (day<1 || day>31)  return false; 
//  	if (year<yl || year>ym) return false; 
  	if (month==4 || month==6 || month==9 || month==11) 
    	if (day==31) return false; 
  	if (month==2) {
    	var b=parseInt(year/4,10); 
    	if (isNaN(b)) return false; 
    	if (day>29)     return false; 
    	if (day==29 && ((year/4)!=parseInt(year/4,10))) return false; 
  	} 	
	return _isDate(day,month,year)
}

function check_time_field (f)
{
   	var e = get_form_item_value(f);
   	if (e == '') return field_OK (f);
   	var elems = e.split(':');
   	var OK = true;
   
   	if (elems.length > 3) OK = false;
   
   	if (OK) {
   	 	for (i=0; i < elems.length; i++) {
   	 		var v = elems[i];
   	 		if (v.length != 2) OK = false;
			for (j=0; j < v.length; j++) {
				if ((v.charAt(j) < "0" || v.charAt(j) > "9")) OK = false;
			}
   	 	}
   	}
   	if (!OK) 	  	
   		return form_item_error (f, get_translation ('js_forms_time_format_invalid', 'invalid time format, should be hh:mm or hh:mm:ss'));
   	return field_OK (f);
}

function check_year_field (f)
{
	var v = get_form_item_value(f);
	for (i=0; i < v.length; i++) {
	   	if ((v.charAt(i) < "0" || v.charAt(i) > "9")) {
		  	return form_item_error (f, get_translation ('js_forms_year_badformat', 'can only contain a 4-digit year'));
	   	}
	}
	v = parseInt(v,10);
	if (v < 1900) {
	  	return form_item_error (f, get_translation ('js_forms_year_too_small', 'cannot be less than 1900'));
	}
	var today = new Date();
	var maxval = today.getFullYear() + 10; // 10 years into the furure
	if (maxval != '' & v > maxval) {
	  	return form_item_error (f, get_translation ('js_forms_integer_too_big', 'cannot be greater than') + ' ' + maxval);
	}
	return field_OK (f);
}

function check_compulsory_field (field)
{
	if (!form_item_visible ('row_' + field)) return field_OK (field);
	if (get_form_item_value (field) == '') {
		return form_item_error (field, get_translation ('js_forms_compulsory_field', 'cannot be empty'));
	}
	return field_OK (field);
}

function check_filename_field (f)
{
	if (!check_compulsory_field (f)) return false;
	var e = form_item(f);
	if (!validFileName(e.value)) 
	{
      return form_item_error (f, get_translation ('js_forms_filename_field', "contains an invalid file name.\n\nPlease do not use spaces or any of these characters:\n\n/\\:,;\"'"));
   }
   return field_OK (f);
}



function confirm_verifiable_field (field_name, field_label)
{
	if (!form_item_exists (field_name)) return true;
	var newData = get_form_item_value (field_name);
	
	if (newData != '') {
		set_form_item_value(field_name,'');
		inputData = prompt ("Please re-enter " + field_label + ".\n", "");
		if (inputData == null) {
			set_form_item_value (field_name, newData);
			enable_submit ();
			return false;
		}
		var dataChanged = inputData.toUpperCase() != newData.toUpperCase();
		if (inputData != null && dataChanged) alert ("That's not the same!");
		set_form_item_value(field_name,newData);
		if (!dataChanged) return true;
		enable_submit ();
		return false;
	}
	return true;
}

function confirm_comparable_field (field_name, field_label, original_data)
{
	if (!form_item_exists(field_name)) return true;
	var newData = get_form_item_value(field_name);
	
	if (newData == '' || original_data == '') return true;
	original_data = html_entity_decode(original_data);
	
	if (newData.replace(/[^a-zA-Z0-9]+/g,'') != original_data.replace(/[^a-zA-Z0-9]+/g,'')) {
		r = form_item ('reason_for_change_' + field_name);
		msg = 'The data entered for ' + field_label + "\n\n    '" + newData + "'\n\nis not the same as the data currently stored in the database: \n\n    '" + original_data + "'\n\n(ignoring punctuation and space characters)\n\n";
		if (r) {
			reason = prompt(msg + "Please enter the reason for this change.\n");
			if (reason == '' || reason == null) {
				enable_submit ();
				return false;
			}
			r.value = reason;
		} else {
			if (!confirm (msg + 'Please confirm that this change is correct.\n'))  {
				enable_submit ();
				return false;
			}
		}
	}
	return true;
}




//- mark Dynamic
function get_ajax_request (url)
{
	var req = null;
	if (url.indexOf('?') > 0 )url = url + "&random_parameter=" + new Date().getTime();
	if(window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		} catch(e) {
			req = false;
		}
	// branch for IE/Windows ActiveX version
	} else if(window.ActiveXObject) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
					req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
					req = false;
			}
		}
	}
	return req;
}


function execute_on_server (url, script)
{
	var req = get_ajax_request (url);
	if(req) {
		req.open("GET", url, false);
		req.send(null);
        eval(script);
        return req.responseText;
	} else {
		alert ("AJAX call failed")
	}
}

function execute_on_server_async (url)
{
	var req = get_ajax_request (url);
	if(req) {
		req.open("GET", url, true);
		req.send(null);
	} else {
		alert ("AJAX call failed")
	}
}

function get_dynamic_row (table, id)
{
	var row = execute_on_server(window.base_directory + 'dynamic/dynamic_row.php?table=' + table + '&id=' + id, '');
	var ar = row.split ('$$$$');
	row = new Object ();
	var key, value;
	for (var i in ar) {
		var a2 = ar[i].split ('||||');
		row[a2[0]] = a2[1];
	}
	return row;
}

function load_from_server_into_element (url, id, is_value) {
	var v = execute_on_server (url, '');
	if (is_value) {
		set_form_item_value (id, v);
	} else {
		set_form_item_inner_html (id, v);
	}
}


function get_dynamic_query (query)
{
	return execute_on_server (window.base_directory + 'dynamic/dynamic_query.php?query=' + query, '');
}

function set_dynamic_form_item (e, table, field, match_on, match_on_value)
{
	load_from_server_into_element (window.base_directory + 'dynamic/dynamic_form_item.php?table=' + table + '&field=' + field + '&match_on=' + match_on + '&match_on_value=' + match_on_value, e, true);
}

function set_dynamic_form_html (e, table, field, match_on, match_on_value)
{
	load_from_server_into_element (window.base_directory + 'dynamic/dynamic_form_item.php?table=' + table + '&field=' + field + '&match_on=' + match_on + '&match_on_value=' + match_on_value + '&convert_text=yes', e, false);
}

function set_dynamic_form_html_as_list (e, table, field, match_on, match_on_value)
{
	load_from_server_into_element (window.base_directory + 'dynamic/dynamic_form_item.php?table=' + table + '&field=' + field + '&match_on=' + match_on + '&match_on_value=' + match_on_value + '&make_list=yes', e, false);
}

function get_dynamic_value (table, field, match_on, match_on_value)
{
	return execute_on_server (window.base_directory + 'dynamic/dynamic_form_item.php?table=' + table + '&field=' + field + '&match_on=' + match_on + '&match_on_value=' + match_on_value, '');
}


function get_session_variable (variable)
{
	var url = window.base_directory + 'dynamic/get_session_variable.php?variable=' + variable;
	return execute_on_server (url, '');
}

function set_session_variable (variable, value)
{
	var url = window.base_directory + 'dynamic/set_session_variable.php?variable=' + variable + '&value=' + value;
	execute_on_server (url, '');
}

function set_session_array_variable (array, variable, value)
{
	var url = window.base_directory + 'dynamic/set_session_variable.php?array=' + array + '&variable=' + variable + '&value=' + value;
	execute_on_server (url, '');
}

function set_saved_session_variable (variable, value)
{
	var url = window.base_directory + 'dynamic/set_saved_session_variable.php?variable=' + variable + '&value=' + value;
	execute_on_server (url, '');
}

function add_class (target, classValue)
{
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	if (!pattern.test(target.className))
	{
		if (target.className == "") {
		  	target.className = classValue;
		} else {
		  	target.className = classValue + " " + target.className;
		}
	}
}

function remove_class (target, classValue)
{
	var removedClass = target.className;
	var pattern = new RegExp("(^| )" + classValue + "( |$)");
	
	removedClass = removedClass.replace(pattern, "$1");
	removedClass = removedClass.replace(/ $/, "");
	
	target.className = removedClass;
}

var selected_row = new Array ();

function select_row_in_table (table, id, async)
{
	if (table in selected_row && selected_row[table] != 0) {
		var e = form_item (table + '_row_' + selected_row[table]);
		if (e) e = e.firstChild;
		while (e != null) {
			if (e.tagName == 'TD') remove_class (e, 'listSelected');
			e = e.nextSibling;
		}
	}
	var url = window.base_directory + 'dynamic/set_selected_row.php?table=' + table + '&id=' + id;
	if (async) {
		execute_on_server_async (url);
	} else {
		execute_on_server (url);
	}
	selected_row[table] = id;
	if (id > 0) {
		var e = form_item (table + '_row_' + selected_row[table]);
		e = e.firstChild;
		while (e != null) {
			if (e.tagName == 'TD') add_class (e, 'listSelected');
			e = e.nextSibling;
		}
	}
}

function set_form_row_color (item, color)
{
	var e = form_item ('row_' + item);
	e = e.firstChild.nextSibling; // skip lable
	e = e.nextSibling;
	while (e != null) {
		if (e.tagName == 'TD') e.style.backgroundColor = color;
		e = e.nextSibling;
	}
}

function validatePassword (pw, options) {
	// default options (allows any password)
	var o = {
		lower:    0,
		upper:    0,
		alpha:    0, /* lower + upper */
		numeric:  0,
		special:  0,
		length:   [0, Infinity],
		custom:   [ /* regexes and/or functions */ ],
		badWords: [],
		badSequenceLength: 0,
		noQwertySequences: false,
		noSequential:      false
	};

	for (var property in options)
		o[property] = options[property];

	var	re = {
			lower:   /[a-z]/g,
			upper:   /[A-Z]/g,
			alpha:   /[A-Z]/gi,
			numeric: /[0-9]/g,
			special: /[\W_]/g
		},
		rule, i;

	// enforce min/max length
	if (pw.length < o.length[0] || pw.length > o.length[1])
		return false;

	// enforce lower/upper/alpha/numeric/special rules
	for (rule in re) {
		if ((pw.match(re[rule]) || []).length < o[rule])
			return false;
	}

	// enforce word ban (case insensitive)
	for (i = 0; i < o.badWords.length; i++) {
		if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
			return false;
	}

	// enforce the no sequential, identical characters rule
	if (o.noSequential && /([\S\s])\1/.test(pw))
		return false;

	// enforce alphanumeric/qwerty sequence ban rules
	if (o.badSequenceLength) {
		var	lower   = "abcdefghijklmnopqrstuvwxyz",
			upper   = lower.toUpperCase(),
			numbers = "0123456789",
			qwerty  = "qwertyuiopasdfghjklzxcvbnm",
			start   = o.badSequenceLength - 1,
			seq     = "_" + pw.slice(0, start);
		for (i = start; i < pw.length; i++) {
			seq = seq.slice(1) + pw.charAt(i);
			if (
				lower.indexOf(seq)   > -1 ||
				upper.indexOf(seq)   > -1 ||
				numbers.indexOf(seq) > -1 ||
				(o.noQwertySequences && qwerty.indexOf(seq) > -1)
			) {
				return false;
			}
		}
	}

	// enforce custom regex/function rules
	for (i = 0; i < o.custom.length; i++) {
		rule = o.custom[i];
		if (rule instanceof RegExp) {
			if (!rule.test(pw))
				return false;
		} else if (rule instanceof Function) {
			if (!rule(pw))
				return false;
		}
	}

	// great success!
	return true;
}

function validFileName(fileName) {
	var invalidChars = " /\\:,;\"'";

	if (fileName == "") {						// cannot be empty
		return false
	}
	for (i=0; i<invalidChars.length; i++) {	// does it contain any invalid characters?
		badChar = invalidChars.charAt(i)
		if (fileName.indexOf(badChar,0) > -1) {
			return false
		}
	}
	return true
}


function pad_string_left (st, len, pad) 
{
	st = String(st)
	while (st.length < len) {
		st = pad + st
	}
	return st
}

function date_PHP_format (now) 
{
	y = now.getYear()
	if (y < 1900) y = y + 1900
	y = y.toString()
	m = now.getMonth()+1
	m = pad_string_left (m.toString(), 2, '0')
	d = now.getDate()
	d = pad_string_left (d.toString(), 2, '0')
	return y + "-" + m + "-" + d
}

function current_date_PHP_format () 
{
	now = new Date
	y = now.getYear()
	if (y < 1900) y = y + 1900
	y = y.toString()
	m = now.getMonth()+1
	m = pad_string_left (m.toString(), 2, '0')
	d = now.getDate()
	d = pad_string_left (d.toString(), 2, '0')
	return y + "-" + m + "-" + d
}


function current_time_PHP_format () 
{
	now = new Date
	m = now.getHours()
	m = pad_string_left (m.toString(), 2, '0')
	d = now.getMinutes()
	d = pad_string_left (d.toString(), 2, '0')
	s = now.getSeconds()
	s = pad_string_left (s.toString(), 2, '0')
	return  m + ":" + d + ":" + s
}

function date_field_value(f)
{
	var d = get_form_item_value(f);
	var year = parseInt(d.substring(0,4),10)
	var month = parseInt(d.substring(5,7),10)
	var day = parseInt(d.substring(8,10),10)
    var today = new Date();
    today.setFullYear(year, month-1, day);
	return today;
}

function add_to_date (theDate, amount, units, no_cross)
{
    amount = parseInt(amount,10);
    var original_month = theDate.getMonth();
    var original_day = theDate.getDate();
    var amountYears = 0;
    var amountMonths = 0;
    var amountDays = 0;
	switch (units) {
		case 'years':
			amountYears = amount;
			theDate.setFullYear(theDate.getFullYear() + amountYears);
			break;
		case 'months':
			amountMonths = original_month + amount, 10;
			amountYears = 0;
			while (amountMonths > 11) {
				amountMonths = amountMonths - 12;
				amountYears++;
			}
			//alert ('months = ' + amountMonths + '    years = ' + amountYears);
		    theDate = new Date(theDate.getFullYear() + amountYears, amountMonths,theDate.getDate(),theDate.getHours(),theDate.getMinutes(),theDate.getSeconds()); 
			break;
		case 'weeks':
			amount = amount * 7;
		case 'days':
			theDate.setTime(theDate.getTime() + amount*24*60*60*1000)
			break;
	}
	var new_month = theDate.getMonth();
	if (no_cross && (units == 'years' || units == 'months') && original_day > theDate.getDate()) { // && new_month > original_month
		var thisMonth = theDate.getMonth();
		while (thisMonth == theDate.getMonth()) theDate.setDate(theDate.getDate()-1); 
	}
	return theDate;	
}


function change_value (table, field, id, value)
{
	var changed = execute_on_server (base_directory + 'dynamic/change_value.php?table=' + table + '&field=' + field + '&id=' + id + '&value=' + value);
	if (form_item_exists ('dynamic_messages')) set_form_item_inner_html ('dynamic_messages', changed);
}

function which_browser() {
	var agt=navigator.userAgent.toLowerCase();
	if (agt.indexOf("omniweb") != -1) return 'Omniweb';
	if (agt.indexOf("opera") != -1) return 'Opera';
	if (agt.indexOf("staroffice") != -1) return 'Star Office';
	if (agt.indexOf("beonex") != -1) return 'Beonex';
	if (agt.indexOf("chimera") != -1) return 'Chimera';
	if (agt.indexOf("netpositive") != -1) return 'NetPositive';
	if (agt.indexOf("phoenix") != -1) return 'Phoenix';
	if (agt.indexOf("firefox") != -1) return 'Firefox';
	if (agt.indexOf("safari") != -1) return 'Safari';
	if (agt.indexOf("skipstone") != -1) return 'SkipStone';
	if (agt.indexOf("msie") != -1) return 'Internet Explorer';
	if (agt.indexOf("netscape") != -1) return 'Netscape';
	if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
	if (agt.indexOf('\/') != -1) {
	if (agt.substr(0,agt.indexOf('\/')) != 'mozilla') {
	return navigator.userAgent.substr(0,agt.indexOf('\/'));}
	else return 'Netscape';} else if (agt.indexOf(' ') != -1)
	return navigator.userAgent.substr(0,agt.indexOf(' '));
	else return navigator.userAgent;
}

function html_entity_decode( string, quote_style ) {  
    var histogram = {}, symbol = '', tmp_str = '', entity = '';  
    tmp_str = string.toString();  
      
    if (false === (histogram = get_html_translation_table('HTML_ENTITIES', quote_style))) {  
        return false;  
    }  
  
    // &amp; must be the last character when decoding!  
    delete(histogram['&']);  
    histogram['&'] = '&amp;';  
  
    for (symbol in histogram) {  
        entity = histogram[symbol];  
        tmp_str = tmp_str.split(entity).join(symbol);  
    }  
      
    return tmp_str;  
}  

function get_html_translation_table (table, quote_style) {
    var entities = {}, hash_map = {}, decimal = 0, symbol = '';
    var constMappingTable = {}, constMappingQuoteStyle = {};
    var useTable = {}, useQuoteStyle = {};
    
    // Translate arguments
    constMappingTable[0]      = 'HTML_SPECIALCHARS';
    constMappingTable[1]      = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
 
    useTable       = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
    useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';
 
    if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
        throw new Error("Table: "+useTable+' not supported');
        // return false;
    }
 
    entities['38'] = '&amp;';
    if (useTable === 'HTML_ENTITIES') {
        entities['160'] = '&nbsp;';
        entities['161'] = '&iexcl;';
        entities['162'] = '&cent;';
        entities['163'] = '&pound;';
        entities['164'] = '&curren;';
        entities['165'] = '&yen;';
        entities['166'] = '&brvbar;';
        entities['167'] = '&sect;';
        entities['168'] = '&uml;';
        entities['169'] = '&copy;';
        entities['170'] = '&ordf;';
        entities['171'] = '&laquo;';
        entities['172'] = '&not;';
        entities['173'] = '&shy;';
        entities['174'] = '&reg;';
        entities['175'] = '&macr;';
        entities['176'] = '&deg;';
        entities['177'] = '&plusmn;';
        entities['178'] = '&sup2;';
        entities['179'] = '&sup3;';
        entities['180'] = '&acute;';
        entities['181'] = '&micro;';
        entities['182'] = '&para;';
        entities['183'] = '&middot;';
        entities['184'] = '&cedil;';
        entities['185'] = '&sup1;';
        entities['186'] = '&ordm;';
        entities['187'] = '&raquo;';
        entities['188'] = '&frac14;';
        entities['189'] = '&frac12;';
        entities['190'] = '&frac34;';
        entities['191'] = '&iquest;';
        entities['192'] = '&Agrave;';
        entities['193'] = '&Aacute;';
        entities['194'] = '&Acirc;';
        entities['195'] = '&Atilde;';
        entities['196'] = '&Auml;';
        entities['197'] = '&Aring;';
        entities['198'] = '&AElig;';
        entities['199'] = '&Ccedil;';
        entities['200'] = '&Egrave;';
        entities['201'] = '&Eacute;';
        entities['202'] = '&Ecirc;';
        entities['203'] = '&Euml;';
        entities['204'] = '&Igrave;';
        entities['205'] = '&Iacute;';
        entities['206'] = '&Icirc;';
        entities['207'] = '&Iuml;';
        entities['208'] = '&ETH;';
        entities['209'] = '&Ntilde;';
        entities['210'] = '&Ograve;';
        entities['211'] = '&Oacute;';
        entities['212'] = '&Ocirc;';
        entities['213'] = '&Otilde;';
        entities['214'] = '&Ouml;';
        entities['215'] = '&times;';
        entities['216'] = '&Oslash;';
        entities['217'] = '&Ugrave;';
        entities['218'] = '&Uacute;';
        entities['219'] = '&Ucirc;';
        entities['220'] = '&Uuml;';
        entities['221'] = '&Yacute;';
        entities['222'] = '&THORN;';
        entities['223'] = '&szlig;';
        entities['224'] = '&agrave;';
        entities['225'] = '&aacute;';
        entities['226'] = '&acirc;';
        entities['227'] = '&atilde;';
        entities['228'] = '&auml;';
        entities['229'] = '&aring;';
        entities['230'] = '&aelig;';
        entities['231'] = '&ccedil;';
        entities['232'] = '&egrave;';
        entities['233'] = '&eacute;';
        entities['234'] = '&ecirc;';
        entities['235'] = '&euml;';
        entities['236'] = '&igrave;';
        entities['237'] = '&iacute;';
        entities['238'] = '&icirc;';
        entities['239'] = '&iuml;';
        entities['240'] = '&eth;';
        entities['241'] = '&ntilde;';
        entities['242'] = '&ograve;';
        entities['243'] = '&oacute;';
        entities['244'] = '&ocirc;';
        entities['245'] = '&otilde;';
        entities['246'] = '&ouml;';
        entities['247'] = '&divide;';
        entities['248'] = '&oslash;';
        entities['249'] = '&ugrave;';
        entities['250'] = '&uacute;';
        entities['251'] = '&ucirc;';
        entities['252'] = '&uuml;';
        entities['253'] = '&yacute;';
        entities['254'] = '&thorn;';
        entities['255'] = '&yuml;';
    }
 
    if (useQuoteStyle !== 'ENT_NOQUOTES') {
        entities['34'] = '&quot;';
    }
    if (useQuoteStyle === 'ENT_QUOTES') {
        entities['39'] = '&#39;';
    }
    entities['60'] = '&lt;';
    entities['62'] = '&gt;';
 
 
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal);
        hash_map[symbol] = entities[decimal];
    }
    
    return hash_map;
}



