
// A utility function that returns true if a string contains only 
// whitespace characters.
function isblank(s)
{
    for(var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((c != ' ') && (c != '\n') && (c != '\t')) return false;
    }
    return true;
}

// This is the function that performs form verification. It will be invoked
// from the onSubmit() event handler. The handler should return whatever
// value this function returns.
function verify(f)
{
    var msg;
    var empty_fields = "";
    var errors = "";    var valueErrors = "";
	var sEval = "";	var re;	var reErrors = "";	
    // Loop through the elements of the form, looking for all 
    // text and textarea elements that don't have an "optional" property
    // defined. Then, check for fields that are empty and make a list of them.
    // Also, if any of these elements have a "min" or a "max" property defined,
    // then verify that they are numbers and that they are in the right range.
    // Put together error messages for fields that are wrong.
    for(var i = 0; i < f.length; i++) {
        var e = f.elements[i];        if (((e.type == "text") || (e.type == "textarea") || (e.type == "password")) && e.required) {
                        // first check if the field is empty
            if ((e.value == null) || (e.value == "") || isblank(e.value)) {
                if (e.fldname && !(isblank(e.fldname))) {
					empty_fields += "\n          " + e.fldname;
				}
				
				else {					empty_fields += "\n          " + e.name;				
				// else				}                continue;
                        // - if ((e.value == null) || (e.value == "") || isblank(e.value)) 
            }		
		// - if (((e.type == "text") || (e.type == "textarea") || (e.type == "password")) && e.required)
		}
        if ( ((e.type == "select-multiple") || (e.type == "select")) && e.required) {
                        // first check if the field is empty
            if (! (e.selectedIndex >= 0)) {
                if (e.fldname && !(isblank(e.fldname))) {
					empty_fields += "\n          " + e.fldname;
				}
				else {					empty_fields += "\n          " + e.name;				}                continue;
            }		// - if ( ((e.type == "select-multiple") || (e.type == "select")) && e.required)
		}        // Now check for fields that are supposed to be numeric.
        if (e.numeric || (e.min != null) || (e.max != null)) { 
            var v = parseFloat(e.value);
            if (isNaN(v) || 
                ((e.min != null) && (v < e.min)) || 
                ((e.max != null) && (v > e.max))) {
                errors += "\n- The field " + e.name + " must be a number";
                if (e.min != null) 
                    errors += " that is greater than " + e.min;
                if (e.max != null && e.min != null) 
                    errors += " and less than " + e.max;
                else if (e.max != null)
                    errors += " that is less than " + e.max;
                errors += ".\n";
            }            continue;
                    // - if (e.numeric || (e.min != null) || (e.max != null))         }
 
		// -- All the "required" checks are above		//    Only valueCompare and rExp checks are below
        		// -- check for valueCompare		if (e.valueCompare) {
			// sEval = "(" + e.name + "." + "value" + " " + e.valueCompare + ")"
			if (!(eval( "(" + e.valueCompare + ")" ))) {				// -- Short-circuit				if (e.fldname && !(isblank(e.fldname))) {
					valueErrors += "\n          " + e.fldname;
				}
				else {					valueErrors += "\n          " + e.name;				// -- if/else (e.fldname && !(isblank(e.fldname)))
				}							// -- if (!(eval( "(" + e.valueCompare + ")" )))			}
		// -- if (e.valueCompare)
		}        // -- Check for regular expression        if (e.rExp) {            
			re = new RegExp(e.rExp);			if (! re.test(e.value)) {				reErrors += "\n          " + e.rExpErrMsg;								}
			                }
        // -- For loop    }

    // Now, if there were any errors, display the messages, and
    // return false to prevent the form from being submitted. 
    // Otherwise return true.
    if (!empty_fields && !errors && !valueErrors && !reErrors) return true;

    msg  = "______________________________________________________\n\n"
    msg += "The form was not submitted because of the following error(s).\n";
    msg += "Please correct these error(s) and re-submit.\n";
    msg += "______________________________________________________\n\n"

    if (empty_fields) {
        msg += "- The following required field(s) are empty:\n" 
                + empty_fields + "\n";
    }
        if (valueErrors) msg += "\n";        if (valueErrors) {
        msg += "- You did not make a valid selection for :\n" 
                + valueErrors + "\n";
    }    				        if (reErrors) msg += "\n"; 
    if (reErrors) {
        msg += "- Values you entered didn't follow a required pattern:\n" 
                + reErrors + "\n";
        if (errors) msg += "\n";
    }       msg += errors;
    alert(msg);
    return false;
}
