// 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') && (c != '')) return false;
    }
    return true;
}

// This is the function that performs form verification. It is 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 errorsMsg = "";

    // 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,
    // verify that they are numbers and in the right range.
    // If the element has a "numeric" property defined, verify that
    // it is a number, but don't check its 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.optional) {
            // first check if the field is empty
            if ((e.value == null) || (e.value == "") || isblank(e.value)) {
                empty_fields += "\n          " + e.name;
                continue;
            }

            // 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 += "- The field " + e.name + " must be a number";
                    if (e.min != null) errors += " that is no less than " + e.min;
                    if (e.max != null && e.min != null) errors += " and no greater than " + e.max;
                    else if (e.max != null) errors += " that is no greater than " + e.max;
                    errors += ".\n";
                }
            }
        }
            // Check that Zip Code is valid format:  99999 or 99999-9999
            if (e.zipType && !isblank(e.value)) {
                 var zipStr = e.value;
                 var zipRe = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
                 if (!zipStr.match(zipRe)) {
                         errors += "- Please verify and adjust the format of " + e.name + ".\n";
                 }
            }
            
            // Check that the Phone Numbers are formatted correctly
            if (e.phoneType && !isblank(e.value)) {
                    var phoneStr = e.value;
                    var phoneRe = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
                    if (!phoneStr.match(phoneRe)) {
                            errors += "- Please verify and correct the " + e.name + " entry.\n";
                    }
            }
            
            // Loop through and check that a State has been selected
            if (e.stateType && e.selectedIndex == -1) {
		errors += "- Please make a choice from the " + e.name +  "list.\n";
		}
    }
    
	// Check for correct email address
	if ((!isblank(f.Email.value)) && (f.Email.value != null)) {
	var emailStr = f.Email.value;
	var emailRe = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	if (!emailStr.match(emailRe)) {
       errors += "- Please verify and correct the Email address format.\n";
		}
	}
	
	//validate that the user has selected one of the Product-Type radio buttons
	if ((!f.Product_Type[0].checked) && (!f.Product_Type[1].checked) && (!f.Product_Type[2].checked)) {
		errors += "- Please select one of the \"Product Type\" options.\n";
		}
        
        // Check that the credit card number is a number and between 13-16 characters long
	 if ((f.Payment_Method[0].checked) && (!isblank(f.Credit_Card_Number.value)) && (f.Credit_Card_Number.value != null)) {
		 var CCstr = f.Credit_Card_Number.value;
		 var CCre = /\b\d{13,16}\b/;
		 if (!CCstr.match(CCre)){
			 errors += "- Please verify the Credit Card Number.\n";
			 }
		}
                
        // Check that a Payment Method was selected
        if ((!f.Payment_Method[0].checked) && (!f.Payment_Method[1].checked)) {
                errors += "- Please select a Payment Method.\n";
        }
	
	// 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) 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:" + empty_fields + "\n";
        if (errors) msg += "\n";
    }
	if (errors){
	    errorsMsg = "______________________________________________________\n\n";
		errorsMsg += "The following field(s) have problems that require correction:\n";
		errorsMsg += errors;
		}
    msg += errorsMsg;
    alert(msg);
    return false;
}