var LIST_DELIMITER = '<br>';  // option spaces, also defined in updates.php
var focused_form_item = '';
if (window.base_directory === undefined) window.base_directory = '../';

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

function in_array (needle, haystack)
{
	var i;
	var l = haystack.length;
	for (i = 0; i < l; i++) {
		if (haystack[i] == needle) return i
	}
	return -1;
}

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

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;
	return true;
}

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 display_page ()
{
	var page_content = form_item ('page_content');
	if (!page_content) return;
	page_content.style.display = 'block';
	if (focused_form_item != '') form_item(focused_form_item).focus();
}


function clear_input_items (exceptions)
{
	var ar = document.getElementsByTagName("input");
	for (var i = 0; i < ar.length; i++) {
		if (exceptions && in_array (ar[i].id, exceptions) >= 0) continue;
		if (ar[i].type == "text") {
			ar[i].value = '';
			var date_display_item = "form_" + ar[i].id;
			if (form_item_exists (date_display_item))
				set_form_item_inner_html (date_display_item, '');
		}
	}
}

function clear_page_contents()
{
	document.write('');
	document.close();
	return true;
}

function go_to_location (loc)
{
	if (loc == '') loc = window.location.href;
	disable_page();
	window.location = loc;
}

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

function execute_or_go_to(v)
{
	if (v == '') return;
	if (v.indexOf("(") > -1 || v.indexOf("href=") > -1) {
		eval(v)
	} else {
		go_to_location(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 current_parameters()
{
	var i = window.location.href.indexOf("?");
	if (i == -1) return '';
	return window.location.href.substr(i+1);
}

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 log(message)
{
	if (window.console) window.console.log(message);
}

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

function form_item_by_name(e)
{
	var ar = document.getElementsByName(e);
	if (ar.length > 0) return ar[0];
	return null;
}

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


function form_item_visible(e)
{
	if (form_item(e) == null) return false;
	e = e + '_row';
	if (form_item(e) == null) return true;
	return form_item(e).className.indexOf("hidden") == -1;
}

function form_items_for_clipboard()
{
	var s = 'for_clipboard_';
	var ar = new Array();
	var all = document.getElementsByTagName("*");
	for (var e = 0; e < all.length; e++) {
		var el = all[e];
		if (el.id.substr(0,s.length) == s) {
			ar.push(el.id.substr(s.length));
		}
	}
	return ar.join();
}


function get_form_item_value (e) 
{
	if (!form_item_exists (e)) {
		return null;
	}
	return form_item(e).value;
}

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 get_form_item_inner_html(e) 
{
	if (!form_item_exists(e)) {
		return null;
	}
	return form_item(e).innerHTML;
}

function get_form_item_checked(e) 
{
	if (!form_item_exists(e)) {
		return false;
	}
	if (form_item(e).type == 'checkbox')
		return form_item(e).checked;
	return get_form_item_value(e) == '1';
}

function set_form_item_value(e, v) 
{
	if (!form_item_exists(e)) {
		alert("Couldn't set_form_item_value(" + e + "," + v + ")");
	}
	form_item(e).value = 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 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 set_form_item_checked(e, v) 
{
	form_item(e).checked = v;
}

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;
		}
	}
}

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;
}

function toggle_element_visibility(e)
{
	if (form_item(e).className.indexOf("hidden") >= 0) {
		//alert ('showing ' + e)
		remove_class(form_item(e), "hidden");
	} else {
		//alert ('hiding ' + e)
		add_class(form_item(e), "hidden");
	}
}

function show_element(e,show)
{
	el = form_item(e);
	if (!el) {
		alert ('Element "' + e + '" not found.');
		return
	}
	if (show) {
		//alert ('showing ' + e)
		remove_class(el, "hidden");
	} else {
		//alert ('hiding ' + e)
		add_class(el, "hidden");
	}
}

function show_group (e, show)
{
	var ar = form_item(e).value.split(',');
	for (var i = 0; i < ar.length; i++) if (form_item(ar[i]+'_row')) show_element(ar[i]+'_row',show);
}

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

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

function enable_form_submit_button (enabled)
{
	if (form_item_exists('Submit')) enable_form_element ('Submit', enabled)
}

function form_date_field (f) 
{
	var e = form_item(f);
	if (!e) return;
	var d =  e.value;
	if (d != "" && is_valid_date(d))
	{
		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 d = new Date(year,month-1,day+1)
		var msg = d.toUTCString();
		if (msg.substr(5,1) == '0') msg = msg.substr(0,5) + ' ' + msg.substr(6);
	    set_form_item_inner_html("form_" + f,msg.substring(0,17));
     } else {
		set_form_item_inner_html("form_" + f,"");
	 }
}

function display_date_field (f) 
{
	var e = form_item(f);
	if (!e) return;
	var d =  e.value;
	if (d != "" && is_valid_date(d))
	{
		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 d = new Date(year,month-1,day+1)
		var msg = d.toUTCString();
		if (msg.substr(5,1) == '0') msg = msg.substr(0,5) + ' ' + msg.substr(6);
	    set_form_item_inner_html("display_" + f,msg.substr(0,17));
     } else {
		set_form_item_inner_html("display_" + f,"");
	 }
}

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 add_selection_request_to_popup_menu(n)
{
	add_request_to_popup_menu(n,'Select to add/delete entries...')
}

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

function remove_option_from_popup_menu(n,value)
{
	var el = form_item(n); 
	var ar = el.options;
	if (ar) {
		for(var i = 0; i < ar.length; i++) {
			if (ar[i].value == value) ar[i] = null;
		}
	}
}

function select_section_on_page (n, section)
{
	var el = form_item(n); 
	var ar = el.options;
	if (ar) {
		for(var i = 0; i < ar.length; i++) {
			show_element(ar[i].value, ar[i].value == section);
		}
	}
	document.cookie = 'section='+section; 
}

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_element(id, id == section);
			ar[i].className = id == section ? selected_class : '';
		}
	}
	document.cookie = cookie_name+'='+section; 
}

function select_row (rowid, cname)
{
	var ar = document.getElementsByTagName("tr"); 
	if (ar) {
		for(var i = 0; i < ar.length; i++) {
			var id = ar[i].id; 
			if (id != '') {
				var tds = ar[i].getElementsByTagName("td");
				for (var j = 0; j < tds.length; j++) {
					if (id == rowid) {
						add_class (tds[j], cname);
					} else {
						remove_class (tds[j], cname);
					}
				}
			}
		}
	}
}

function htmlEscape (string) {
	var div = document.createElement('div');
	div.appendChild(document.createTextNode(string));
	return div.innerHTML;
}

function change_list_entry(change_what, change_with)
{
	names = form_item(change_what+'_display').innerHTML;
	change = change_with.value;
    if (change == '' || change == 0) return;
	ar = names.length == 0 ?  new Array( ) : names.split(LIST_DELIMITER);
	found = false;
	for(var i = 0; i < ar.length; i++) {
		if (ar[i] == htmlEscape(change)) {
			found = true;
			ar.splice(i,1);
			break;
		}
	}
	if (!found) ar.push(change);
	ar.sort();
	names = ar.length == 1 ? ar[0] : ar.join(LIST_DELIMITER);
	set_form_item_value(change_what,names);
	set_form_item_inner_html(change_what+'_display',names);
	change_with.selectedIndex = 0;
}

function change_list_entry_with_data(change_what, change_with, change)
{
	names = form_item(change_what+'_display').innerHTML;
    if (change == '' || change == 0) return;
    if (which_browser() == 'Firefox') {
    	while (names.indexOf('&nbsp;') != -1) names = names.replace('&nbsp;LIST_DELIMITER ');
    	//while (names.indexOf('  ') != -1) names = names.replace('  LIST_DELIMITER ');
     	while (change.indexOf(String.fromCharCode(160)) != -1) change = change.replace(String.fromCharCode(160), ' ');
    }
	ar = names.length == 0 ?  new Array( ) : names.split(LIST_DELIMITER);
	found = false;
	for(var i = 0; i < ar.length; i++) {
		var b = ar[i] == change;
		//alert ('array entry = "' + ar[i].charCodeAt(4) + '" change = "' + change.charCodeAt(4) + '" = ' + b);
		if (ar[i] == change) {
			found = true;
			ar.splice(i,1);
			break;
		}
	}
	if (!found) ar.push(change);
	ar.sort();
	names = ar.length == 1 ? ar[0] : ar.join(LIST_DELIMITER);
	set_form_item_value(change_what,names);
	set_form_item_inner_html(change_what+'_display',names);
	change_with.selectedIndex = 0;
}

function replace_list_entries(change_what,new_list)
{
	set_form_item_value(change_what,new_list);
	choices = 'change_' + change_what;
	names = get_names_for_id_based_list(change_what,choices)
	set_form_item_inner_html(change_what+'_display',names);
}

function get_name_for_id_based_list(id, choices)
{
	options = form_item(choices).options;
	for(var j = 0; j < options.length; j++) {
		if (options[j].value == id) return options[j].text;
	}
	return '';
}

function get_names_for_id_based_list(list, choices)
{
	ids = get_form_item_value(list);
	ar = !ids || ids.length == 0 ?  new Array( ) : ids.split(',');
	names_ar = new Array( );
	options = form_item(choices).options;
	for(var i = 0; i < ar.length; i++) {
		for(var j = 0; j < options.length; j++) {
			if (options[j].value == ar[i]) names_ar.push(options[j].text);
		}
	}
	names = names_ar.length == 1 ? names_ar[0] : names_ar.join(LIST_DELIMITER);
	return names;
}

function get_ids_for_id_based_list(list, choices)
{
	names = get_form_item_value(list);
	ar = names.length == 0 ?  new Array( ) : names.split(LIST_DELIMITER);
	ids_ar = new Array( );
	options = form_item(choices).options;
	for(var i = 0; i < ar.length; i++) {
		for(var j = 0; j < options.length; j++) {
			var t = options[j].text;
			if (which_browser() == 'Firefox') t = t.replace(String.fromCharCode(160), ' ');
			if (t == ar[i]) ids_ar.push(options[j].value);
		}
	}
	ids = ids_ar.length == 1 ? ids_ar[0] : ids_ar.join(',');
	return ids;
}

function change_id_based_list_entry(change_what, change_with)
{
	if (change_with.value == '') return;
	choices = 'change_' + change_what;
	name = get_name_for_id_based_list(change_with.value,choices)
	change_list_entry_with_data(change_what, form_item(choices), name);
	set_form_item_value(change_what,get_ids_for_id_based_list(change_what, choices));
}

function show_fields_on_form (displayed_fields, all_fields, with_filled_fields)
{
	//alert(displayed_fields)
	ar = displayed_fields.split(',');
	all = all_fields.split(',');
	var i;
	for (i = 0; i < all.length; i++) {
		//show = displayed_fields.indexOf(all[i]) >= 0 ? 1 : 0;
		show = in_array(all[i],ar) >= 0 ? 1 : 0;
		//alert(all[i] + '  ' + show)
		is_group = all[i].indexOf('_group') > 0;
		//if (!is_group) show_element(all[i]+'_row',show);
		if (!is_group && form_item(all[i]+'_row')) show_element(all[i]+'_row',show || (with_filled_fields && get_form_item_value(all[i]) != ''));
		if (is_group) show_group(all[i],show);
	}
}

function confirm_verifiable_field (field_name, field_label)
{
	if (!form_item_exists(field_name)) return true;
	var originalData = get_form_item_value(field_name+'_original_data');
	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_form_buttons (true);
			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_form_buttons (true);
		return false;
	} else {
		//set_form_item_value (field_name, originalData);
	}
	return true;
}

function confirm_comparable_field (field_name, field_label)
{
	if (!form_item_exists(field_name)) return true;
	var originalData = get_form_item_value(field_name+'_original_data');
	var newData = get_form_item_value(field_name);
	
	if (newData == '' || originalData == '') return true;
	
	if (newData.replace(/[^a-zA-Z0-9]+/g,'') != originalData.replace(/[^a-zA-Z0-9]+/g,'')) {
		r = form_item(field_name+'_reason_for_change');
		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    '" + originalData + "'\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_form_buttons (true);
				return false;
			}
			r.value = reason;
		} else {
			if (!confirm(msg + 'Please confirm that this change is correct.\n'))  {
				enable_form_buttons (true);
				return false;
			}
		}
	}
	return true;
}

function enable_form_buttons (enable)
{
	var e = form_item_by_name("Cancel");
	if (e) e.disabled = !enable;
	e = form_item_by_name("Submit");
	if (e) e.disabled = !enable;
	return !enable;
}

function back_to_form ()
{
	enable_form_buttons (true);
	return false;
}

function display_compulsory_field (f)
{
	set_form_item_inner_html('form_item_marker_'+f, '&nbsp;<b><font color=\"#FF0000\" size=\"+1\">*</font></b>');
	show_element('form_item_marker_'+f, true);
}

function display_field_in_error (f,m)
{
	form_item(f).focus();
	enable_form_buttons (true);
	set_form_item_inner_html('form_item_marker_'+f, '&nbsp;<b><font color=\"#FF0000\"><br />*** this field ' + m + '</font></b>');
	show_element('form_item_marker_'+f, true);
	return false;
}

function field_OK (f)
{
	var m = get_form_item_inner_html('form_item_marker_'+f);
	if (m != null && m.indexOf('>*<') == -1)  // not a "compulsory field" display
		show_element('form_item_marker_'+f, false);
	enable_form_buttons (false);
	return true;
}

function check_compulsory_field (f)
{
   if (!form_item_visible(f)) return true;
   if(get_form_item_value(f) == "")
   {
      return display_field_in_error (f, 'cannot be blank.');
   }
   return field_OK (f);
}

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

function check_decimal_field (f, minval, maxval)
{
	if (!check_integer_field (f + '_decimal', 0, 99)) return false;
	var v = get_form_item_value(f);
//	alert ('v1 = "' + v + '"')
	if (v == '') v = '0';
///	alert ('v2 = "' + v + '"')
	var pattern = /^-?\d+(\d+)?$/;
	if (!pattern.test(v) && v != '') {
	  	return display_field_in_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';
//	alert (parseFloat (v)); alert (parseFloat(decimal) / 100); 
	v = parseInt (v, 10) + parseFloat (decimal) / 100;
//	alert (v);
	if (v == '') return field_OK (f);
	if (minval != '' && v < minval) {
	  	return display_field_in_error (f, 'cannot be less than ' + minval + ".");
	}
	if (maxval != '' & v > maxval) {
	  	return display_field_in_error (f, 'cannot be greater than ' + maxval + ".");
	}
	return field_OK (f);
}

function check_email_field (f)
{
	var e = form_item(f);
	if (!e || e.value == '') return field_OK(f);
	if (!validEmail(e.value)) 
	{
      return display_field_in_error (f, 'contains an invalid E-mail address.');
   }
   return field_OK (f);
}

function check_filename_field (f)
{
	if (!check_compulsory_field (f)) return false;
	var e = form_item(f);
	if (!validFileName(e.value)) 
	{
      return display_field_in_error (f, "contains an invalid file name.\n\nPlease do not use spaces or any of these characters:\n\n/\\:,;\"'");
   }
   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 display_field_in_error (f, 'contains an invalid date. (Expected format YYYY-MM-DD)');
   }
   return field_OK (f);
}

function check_date_field_not_in_future (f)
{
	var e = form_item(f);
	if (!e) return true;
	if (!check_date_field (f)) return false;
	if (date_field_value(f) > new Date())
	{
      return display_field_in_error (f, 'contains a future date. This is not allowed.');
   }
   return field_OK (f);
}






// =============================== //
// Popup Calendar                  //
// v1.1 - Mar 1, 2005              //
// ------------------------------- //
// Written by Lloyd Hassell        //
// Website: lloydhassell.com       //
// Email: lloydhassell@hotmail.com //
// =============================== //

// INITIALIZATION:

var popupCalendar = new Object();

// CONFIGURATION:

popupCalendar.windowWidth = 300;
popupCalendar.windowHeight = 310;
//if (which_browser() == "Firefox") popupCalendar.windowHeight -= 45;
popupCalendar.windowBgColor = '#666666';

popupCalendar.dayCellFontColor = '#000000';
popupCalendar.dayCellFontFace = 'verdana,arial';
popupCalendar.dayCellFontSize = 5;
popupCalendar.dayCellBgColor = '#FFFFFF';

popupCalendar.dateCellFontColor = '#000000';
popupCalendar.dateCellFontFace = 'verdana,arial';
popupCalendar.dateCellFontSize = 5;
popupCalendar.dateCellWeekdayBgColor = '#CCCCCC';
popupCalendar.dateCellWeekendBgColor = '#BBBBBB';
popupCalendar.dateCellTodayBgColor = '#FFFFFF';
popupCalendar.dateCellCurrentBgColor = '#00FFFF'; // was dateCellCurrentDateBgColor

popupCalendar.firstYear = 1995;
popupCalendar.lastYear = 2010;
popupCalendar.firstDayOfWeek = 1;

// MAIN:

popupCalendar.monthList = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
popupCalendar.dayList = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');

popupCalendar.isOpen = false;

function openPopupCalendar(the_date, the_field) {
	if (the_date == null || the_date =='' || !is_valid_date(the_date)) {
		var currentDate = new Date();
		STARTYEAR = currentDate.getFullYear();
		STARTMONTH = currentDate.getMonth();
		STARTDAY = currentDate.getDate()-1;
	} else {
		STARTYEAR = parseInt(the_date.substring(0,4),10);
		STARTMONTH = parseInt(the_date.substring(5,7),10)-1;
		STARTDAY =  parseInt(the_date.substring(8,10),10)-1;
	}
	popupCalendar.firstYear = STARTYEAR - 2;
	popupCalendar.lastYear = STARTYEAR + 4;
	
	var posx = 0;
	var posy = 0;
	
	if (which_browser() == 'Safari' && false) { // only works with Safari 3.0 beta
		var e = window.event;
		posx += e.screenX;
		posy += e.screenY;
	} else {
		posx = 300;
		posy = 300;
	}
	
	if (posy + popupCalendar.windowHeight > screen.availHeight) posy = screen.availHeight - popupCalendar.windowHeight;
		
	if (!popupCalendar.isOpen) popupCalendar.winObj = window.open('','SelectDate','width=' + popupCalendar.windowWidth + ',height=' + popupCalendar.windowHeight + ',location=no,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,left=' + posx + ',screenX=' + posx + ',top=' + posy + ',screenY=' + posy);
	popupCalendar.winObj.document.bgColor = popupCalendar.windowBgColor;
	popupCalendar.winObj.document.title = 'Select date';
	popupCalendar.fieldName = the_field;
	popupCalendar.currentDateTime = new Date(STARTYEAR,STARTMONTH,STARTDAY+1);
	_writeCalendar(STARTYEAR,STARTMONTH);
}
   
function pick_date (fieldName, theYear, theMonth, theDate)
{
    theMonth++;
	theMonth = pad_string_left (theMonth.toString(), 2, '0')
    theDate = pad_string_left (theDate.toString(), 2, '0')

	newDate = theYear + '-' + theMonth + '-' +  theDate;
	set_form_item_value(fieldName, newDate);
	form_date_field (fieldName);
//	alert(document.getElementById(fieldName).onchange+';onchange(0)');
//	eval(document.getElementById(fieldName).onchange+';onchange(0)');
	popupCalendar.winObj.close();
}

function _writeCalendar(STARTYEAR,STARTMONTH) {
   if (arguments[2] != null) {
      var yearMonthStr = arguments[2];
      STARTYEAR = parseInt(yearMonthStr.substring(0,yearMonthStr.indexOf(',')));
      STARTMONTH = parseInt(yearMonthStr.substring(yearMonthStr.indexOf(',') + 1));
      }
   popupCalendar.nextMonthMonth = STARTMONTH + 1;
   popupCalendar.nextMonthYear = STARTYEAR;
   if (popupCalendar.nextMonthMonth == 12) {
      popupCalendar.nextMonthMonth = 0;
      popupCalendar.nextMonthYear = STARTYEAR + 1;
      }
   popupCalendar.previousMonthMonth = STARTMONTH - 1;
   popupCalendar.previousMonthYear = STARTYEAR;
   if (popupCalendar.previousMonthMonth == -1) {
      popupCalendar.previousMonthMonth = 11;
      popupCalendar.previousMonthYear = STARTYEAR - 1;
      }
   var todayDateTime = new Date();
   var todayYear = todayDateTime.getFullYear();
   var todayMonth = todayDateTime.getMonth();
   var todayDate = todayDateTime.getDate();
   var currentDateTime = popupCalendar.currentDateTime;
   var currentYear = currentDateTime.getFullYear();
   var currentMonth = currentDateTime.getMonth();
   var currentDate = currentDateTime.getDate();
   var calendarMonthDateTime = new Date(STARTYEAR,STARTMONTH);
   var calendarMonthStartDay = calendarMonthDateTime.getDay();
   var calendarMonthStartDayOffset = calendarMonthStartDay - popupCalendar.firstDayOfWeek;
   if (calendarMonthStartDayOffset < 0) calendarMonthStartDayOffset += 7;
   var calendarMonthDays = 31;
   if (STARTMONTH == 3 || STARTMONTH == 5 || STARTMONTH == 8 || STARTMONTH == 10) calendarMonthDays = 30;
   if (STARTMONTH == 1 && STARTYEAR % 4 == 0) calendarMonthDays = 29;
   if (STARTMONTH == 1 && STARTYEAR % 4 != 0) calendarMonthDays = 28;
   var dateCellText = new Array();
   for (var dateCellPos = 0; dateCellPos < calendarMonthStartDayOffset; dateCellPos++) dateCellText[dateCellPos] = '&nbsp;';
   for (var dateCellPos = calendarMonthStartDayOffset; dateCellPos < calendarMonthDays + calendarMonthStartDayOffset; dateCellPos++) dateCellText[dateCellPos] = dateCellPos - calendarMonthStartDayOffset + 1;
   for (var dateCellPos = calendarMonthStartDayOffset + calendarMonthDays; dateCellPos < 42; dateCellPos++) dateCellText[dateCellPos] = '&nbsp;';
   var windowHtml = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Select date</title></head>\r';
   windowHtml += '<style type="text/css"> a { text-decoration: none; }  </style>';
   windowHtml += '<body bgcolor="' + popupCalendar.windowBgColor + '" link="' + popupCalendar.dateCellFontColor + '" vlink="' + popupCalendar.dateCellFontColor + '" alink="' + popupCalendar.dateCellFontColor + '" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0">\r';
   windowHtml += '<form>\r';
   windowHtml += '<table cellpadding="0" cellspacing="0" border="0" width="100%" height="100%"><tr><td align="center" valign="middle">\r';
   windowHtml += '<table cellpadding="3" cellspacing="0" border="0"><tr>\r';
   windowHtml += '<td valign="middle"><input type="button" value="&nbsp;&lt;&nbsp;" onClick="javascript:window.opener._writeCalendar(' + popupCalendar.previousMonthYear + ',' + popupCalendar.previousMonthMonth + ');"></td>\r';
   windowHtml += '<td valign="middle"><select onChange="javascript:window.opener._writeCalendar(null,null,this.value);">\r';
   var monthOptionLength = (popupCalendar.lastYear - popupCalendar.firstYear + 1) * 12;
   for (var monthOption = 0; monthOption < monthOptionLength; monthOption++) {
      var optionYear = Math.floor(monthOption / 12) + popupCalendar.firstYear;
      var optionMonth = monthOption % 12;
      windowHtml += (optionYear == STARTYEAR && optionMonth == STARTMONTH) ? '<option selected ' : '<option ';
      windowHtml += 'value="' + optionYear + ',' + optionMonth + '">' + popupCalendar.monthList[optionMonth] + ' ' + optionYear + '</option>\r';
      }
   windowHtml += '</select></td>\r';
   windowHtml += '<td valign="middle"><input type="button" value="&nbsp;&gt;&nbsp;" onClick="javascript:window.opener._writeCalendar(' + popupCalendar.nextMonthYear + ',' + popupCalendar.nextMonthMonth + ');"></td>\r';
   windowHtml += '</tr></table>\r';
   windowHtml += '<table cellpadding="5" cellspacing="0" border="0">\r';
   windowHtml += '<tr><td height="6" colspan="7"></td></tr><tr>\r';
   for (var posLoop = popupCalendar.firstDayOfWeek; posLoop < 7 + popupCalendar.firstDayOfWeek; posLoop++) {
      var dayLoop = posLoop;
      if (dayLoop > 6) dayLoop -= 7;
      windowHtml += '<td bgcolor="' + popupCalendar.dayCellBgColor + '" align="center" valign="middle"><font color="' + popupCalendar.dayCellFontColor + '" face="' + popupCalendar.dayCellFontFace + '" size="' + popupCalendar.dayCellFontSize + '"><b>' + popupCalendar.dayList[dayLoop].charAt(0) + '</b></font></td>\r';
      }
   windowHtml += '</tr>\r';
   for (var posLoop = 0; posLoop < 42; posLoop++) {
      if (posLoop % 7 == 0) windowHtml += '<tr>\r';
      var cellBgColor = posLoop % 7 + popupCalendar.firstDayOfWeek;
      var cellStyleFontWeight = "normal";
      if (cellBgColor > 6) cellBgColor -= 7;
      cellBgColor = (cellBgColor == 0 || cellBgColor == 6) ? popupCalendar.dateCellWeekendBgColor : popupCalendar.dateCellWeekdayBgColor;
      if (todayYear == STARTYEAR && todayMonth == STARTMONTH && todayDate == dateCellText[posLoop]) {
      		//cellBgColor = popupCalendar.dateCellTodayBgColor;
      		cellStyleFontWeight = "bold";
      }
      if (currentYear == STARTYEAR && currentMonth == STARTMONTH && currentDate == dateCellText[posLoop]) cellBgColor = popupCalendar.dateCellCurrentBgColor;
      windowHtml += '<td bgcolor="' + cellBgColor + '" align="center" valign="middle"><font color="' + popupCalendar.dateCellFontColor + '" face="' + popupCalendar.dateCellFontFace + '" size="' + popupCalendar.dateCellFontSize + '" style="text-decoration: none; font-weight: ' + cellStyleFontWeight + '">\r';
      if (dateCellText[posLoop] != '&nbsp;') 
	  	windowHtml += '<a href="javascript:window.opener.pick_date(\'' + popupCalendar.fieldName + '\','  + STARTYEAR + ',' + STARTMONTH + ',' + dateCellText[posLoop] + ');">' + dateCellText[posLoop] + '</a>' ;
      windowHtml += '</font></td>\r';
      if (posLoop % 7 == 6) windowHtml += '</tr>\r';
      }
   windowHtml += '</tr>\r';
   windowHtml += '</table>\r';
   windowHtml += '</td></tr></table>\r';
   windowHtml += '</form></body></html>\r';
   popupCalendar.winObj.document.write(windowHtml);
   popupCalendar.winObj.document.close();
   popupCalendar.winObj.focus();
   }
   
   
   
   
var req;
var previousRandom = 0;

function execute_on_server (url, script)
{
    random = previousRandom + 1; 
	url = url + "&random_parameter=" + random;
	previousRandom = random;
	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;
			}
		}
	}
	if(req) {
		req.open("GET", url, false);
		req.send(null);
        eval(script);
        return req.responseText;
	} else {
		alert ("no req!")
	}
}

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

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

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

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

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

function get_dynamic_row (table_name, id)
{
	var row = execute_on_server(window.base_directory + 'dynamic/dynamic_row.php?table_name=' + table_name + '&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 getStyleClass (className) {
	if (document.all) {
		for (var s = 0; s < document.styleSheets.length; s++)
	  	for (var r = 0; r < document.styleSheets[s].rules.length; r++)
		if (document.styleSheets[s].rules[r].selectorText == className)
		  	return document.styleSheets[s].rules[r];
	} else if (document.getElementById) {
		for (var s = 0; s < document.styleSheets.length; s++)
	  	for (var r = 0; r < document.styleSheets[s].cssRules.length; r++)
		if (document.styleSheets[s].cssRules[r].selectorText == className)
		  return document.styleSheets[s].cssRules[r];
	}
	return null;
}

function validEmail(email) {
	var invalidChars = " /:,;";

	if (email == "") {						// cannot be empty
		return false
	}
	for (i=0; i<invalidChars.length; i++) {	// does it contain any invalid characters?
		badChar = invalidChars.charAt(i)
		if (email.indexOf(badChar,0) > -1) {
			return false
		}
	}
	atPos = email.indexOf("@",1)			// there must be one "@" symbol
	if (atPos == -1) {
		return false
	}
	if (email.indexOf("@",atPos+1) != -1) {	// and only one "@" symbol
		return false
	}
	periodPos = email.indexOf(".",atPos)
	if (periodPos == -1) {					// and at least one "." after the "@"
		return false
	}
	if (periodPos+3 > email.length)	{		// must be at least 2 characters after the "."
		return false
	}
	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 _y2k(number) 
{ 
	return (number < 1000) ? number + 1900 : number; 
}

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 _isNum(passedVal) {					// Is this a number?
	if (passedVal == "") {
		return false
	}
	for (i=0; i<passedVal.length; i++) {
		if (passedVal.charAt(i) < "0") {
			return false
		}
		if (passedVal.charAt(i) > "9") {
			return false
		}
	}
	return true
}

function send_email_via_client(to)
{
	window.location = 'mailto:' + to;
}
  
function send_email_reply_via_client(to,subject,text)
{
	window.location = 'mailto:' + to + '?subject=' + encodeURI(subject) + '&body=' + encodeURI(text);
}

function print_window_and_return()
{
	//alert(which_browser())
	window.print();
	if (which_browser() == "Omniweb") {
		self.setTimeout("window.location='" + window.base_directory + "global/include/previous_page.php'", 10000)
	} else {
		window.location=window.base_directory + 'global/include/previous_page.php';
	}
}

function copy_onto_clipboard (text) {

	var flashId = 'flashId-HKxmj5';

	/* Replace this with your clipboard.swf location */
	var clipboardSWF = window.base_directory + 'global/swf/clipboard.swf';

	if(!document.getElementById(flashId)) {
		var div = document.createElement('div');
		div.id = flashId;
		document.body.appendChild(div);
	}
	document.getElementById(flashId).innerHTML = '';
	var content = '<embed src="' + 
		clipboardSWF +
		'" FlashVars="clipboard=' + encodeURIComponent(text) +
		'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
	document.getElementById(flashId).innerHTML = content;
}


function call_skype_number(n)
{
	//if (!skypeCheck()) return;
	n = n.replace(/-/g,'');
	n = n.replace(/\s/g,'');
	n = n.replace(/\(/g,'');
	n = n.replace(/\)/g,'');
	if (n.substring(0,2) != '00') {
		if (n.substring(0,1) == '0') n = '+31' + n.substring(1);
	} else {
		n = '+' + n.substring(2);
	}
	window.location = 'skype://' + n + '?call';
}

function sms_skype_number(n)
{
	//if (!skypeCheck()) return;
	n = n.replace(/-/g,'');
	n = n.replace(/\s/g,'');
	n = n.replace(/\(/g,'');
	n = n.replace(/\)/g,'');
	if (n.substring(0,2) != '00') {
		if (n.substring(0,1) == '0') n = '+31' + n.substring(1);
	} else {
		n = '+' + n.substring(2);
	}
	window.location = 'skype://' + n + '?sms';
}

function call_international_skype_number(code,n)
{
	//if (!skypeCheck()) return;
	n = n.replace(/-/g,'');
	n = n.replace(/\s/g,'');
	n = n.replace(/\(/g,'');
	n = n.replace(/\)/g,'');
	if (n.substring(0,2) != '00') {
		if (n.substring(0,1) == '0') n = '+' + code + n.substring(1);
	} else {
		n = '+' + n.substring(2);
	}
	window.location = 'skype://' + n + '?call';
}

function resizeIframe() {

	// Must launched on the body onload event handler for IE
	// Use document.documentElement if you are in Compat mode
	i = parent.document.getElementById(window.name)
	iHeight = document.body.scrollHeight
	i.style.height = iHeight + 5 + "px"
}

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;
}
