<!--
// javascript utility functions - mainly for help with form processing ....

// Form Error Processing ...
var frmErrElem  = null;
var frmErrArray = new Array();
// initialise form errors - call at start of form validation
function initFrmErrs() {
    frmErrElem  = null;
    frmErrArray = new Array();
}
// add form error - pass input element and message text
function addFrmErr(elem, txt) {
    if (frmErrElem==null) { 
	  frmErrElem = ("focus" in elem) ? elem : ( (elem.length!==undefined && "focus" in elem[0]) ? elem[0] : null );
    }
    frmErrArray.push(txt);
}
// returns form errors dialogue box and prevents form submission if any errors
function checkFrmErrs(msg, delim) {
    if (frmErrArray.length==0) { return true; }
    /*
    if (msg===undefined) { msg = "Please provide the following information:"; }
    if (delim===undefined) { delim = "\n - "; }
    alert( msg + delim + frmErrArray.join(delim) );
    if (frmErrElem!=null) { 
        frmErrElem.focus();	
        window.scrollBy(0, -20);	    
    }  
    return false;	
    */
    msg = "The following questions have not been answered or partially answered\n\n" + 
          "Questions: " + frmErrArray.join(", ") + "\n\n" +
          "Please press:\n\n" +
          "- OK to submit the questionnaire with questions unanswered, or\n" +
          "- Cancel to carry on completing the questionnaire\n";
    if (frmErrElem!=null) { 
        frmErrElem.focus();	
        window.scrollBy(0, -40);	    
    }   
    return confirm(msg);
}

// return boolean to indicate if form input has a value
function hasInput(elem) {
    return (getInput(elem)=="") ? false : true;
}
// returns the value of the form input element
function getInput(elem) {
    if (elem===undefined) { return ""; }
    var type = ("type" in elem) ? elem.type : ( (elem.length!==undefined && "type" in elem[0]) ? elem[0].type : "" );
    switch (type) {
      case "":
	      return "";
	case "select-one":
      case "select-multiple": 	
		return getSelectValue(elem);
      case "radio": 
            return getRadioValue(elem);
      case "checkbox": 
            return getCheckboxValue(elem);
      default: // text, textarea, password, file, hidden, submit, reset, button
            return getTextValue(elem);
    }
}
// returns the value of the text input (or textarea, password, file, button etc)
function getTextValue(elem) {
    return (elem.value!==undefined) ? elem.value.replace(/^\s+|\s+$/g,"") : "";
}
// return the value of the selected option
function getSelectValue(elem) {
    var val = "";
    var len = elem.length;
    for (i=0; i<len; i++) {	
        if (elem.options[i].selected) { 
		if (elem.type=="select-one") { return elem.options[i].value; } 
		val += (val=="") ? elem.options[i].value : "\n" + elem.options[i].value; 
	  }
    }
    return val;
}
// returns the value of the radio button or radio button group identified be elem
function getRadioValue(elem) {
    var val = "";
    var len = elem.length;
    if (len===undefined) {
        if (elem.checked) { val = elem.value; }
    } else {	
        for (i=0; i<len; i++) {
            if (elem[i].checked) { val = elem[i].value; break; }
        }	
    }
    return val;
}
// returns the value of the checkbox or checkbox group identified be elem
function getCheckboxValue(elem) {
    var val = "";
    var len = elem.length;
    if (len===undefined) {
        if (elem.checked) { val = elem.value; } 
    } else {
        for (i=0; i<len; i++) {
            if (elem[i].checked) { val += (val=="") ? elem[i].value : "\n" + elem[i].value; }
        }	
    }
    return val;	
}

// extend String object to provide regular expression matching against defined patterns:
String.prototype.isType = function(regex) {
    return (this.match(regex)!=null);
}
// Patterns for isType:
var INT 		= /^-{0,1}\d+$/
var POS_INT 	= /^\d*$/;
var NEG_INT 	= /^-\d+$/;
var NONZERO_INT 	= /^[1-9]+\d*$/;
var NUMBER 		= /^-{0,1}\d*\.{0,1}\d+$/;
var POS_NUMBER 	= /^\d*\.{0,1}\d+$/;
var NEG_NUMBER 	= /^-\d*\.{0,1}\d+$/;
var ALPHA		= /^[A-Z]+$/i;
var ALPHPASPACE	= /^[A-Z ]+$/i;
var ALPHANUM	= /^[A-Z0-9]+$/i;
var ALPHANUMSPACE = /^[A-Z0-9 ]+$/i;
var EMAIL		= /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
var NAME		= /^[A-Z .'-]+$/i;
var USERNAME	= /^[A-Z0-9_]{6,32}$/i;
var FNAME_EXT     = /^[A-Z_]+[A-Z_-]+\.[A-Z]{3,4}$/i;
var FNAME_NO_EXT  = /^[A-Z_]+[A-Z0-9_-]+$/i;
var PRICE 		= /^\d+(\.\d{2})?$/;
// extend String object to provide function to trim whitespace
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}
// extend String object to provide function to trim whitespace
// and convert inner whitespace sequences to single spaces
String.prototype.trimAll = function() {
    return this.replace(/^\s+|\s+$/g,"").replace(/\s+/g, " ");
}
// extend String object to provide function to check if string ends with either:
// str_or_arr value (as String) or one of str_or_arr values (as array)
// ignorecase - optional parameter defaults to false
String.prototype.endsWith = function(str_or_arr, ignorecase) {
    var str = (isArray(str_or_arr) && str_or_arr.length > 0) ? "("+ str_or_arr.join("|") + ")" : String(str_or_arr);
    var pattern = (ignorecase === undefined || ignorecase != true) ? new RegExp(str+ "$") : new RegExp(str+ "$", "i");
    return pattern.test(this);
}
// extend String object to provide function to check if string starts with either:
// str_or_arr value (as String) or one of str_or_arr values (as array)
// ignorecase - optional parameter defaults to false
String.prototype.startsWith = function(str_or_arr, ignorecase) {
    var str = (isArray(str_or_arr) && str_or_arr.length > 0) ? "("+ str_or_arr.join("|") + ")" : String(str_or_arr);
    var pattern = (ignorecase === undefined || ignorecase != true) ? new RegExp("^" + str) : new RegExp("^" + str, "i");
    return pattern.test(this);
}
// determine if variable is string
function isString(s) {
    if (typeof s == 'string') { return true; }
    if (typeof s == 'object') { return (s.constructor.toString().match(/string/i) != null); }
    return false;
}
// determine if variable is array
function isArray(a) {
    if (typeof a == 'object') { return (a.constructor.toString().match(/array/i) != null); }
    return false;
}
// functions to filter form input keys 
// attach to input element as onkeypress="return checkXXX(event);"
function checkKeyInteger(evt) {	// 0-9 (and control chars)
    var keynum = (evt.keyCode) ? evt.keyCode : ( (evt.which) ? evt.which : 0 );
    return ( (keynum >= 48 && keynum <= 57) || (keynum < 32) ) ? true : false;
}
function checkKeyNumeric(evt) {	// 0-9, . (and control chars)
    var keynum = (evt.keyCode) ? evt.keyCode : ( (evt.which) ? evt.which : 0 );
    return ( (keynum >= 48 && keynum <= 57) || (keynum == 46) || (keynum < 32) ) ? true : false;
}
function checkKeyAlpha(evt) {		// A-Z, a-z (and control chars)
    var keynum = (evt.keyCode) ? evt.keyCode : ( (evt.which) ? evt.which : 0 );
    return ( (keynum >= 65 && keynum <= 90) || (keynum >= 97 && keynum <= 122) || (keynum < 32) ) ? true : false;
}
function checkKeyAlphaNumeric(evt) { // 0-9, A-Z, a-z (and control chars)
    var keynum = (evt.keyCode) ? evt.keyCode : ( (evt.which) ? evt.which : 0 );
    return ( (keynum >= 48 && keynum <= 57) || (keynum >= 65 && keynum <= 90) || (keynum >= 97 && keynum <= 122) || (keynum < 32) ) ? true : false;
}
//-->