
/*
    VALIDATORS

    1. IsEmail(c,r)    -- is a valid address
    2. IsPhonenumber(c,r)    -- is a valid 10 digit phone number
    3. IsZip(c,r)    -- is a valid 5 or 9 digit ZIP code
    4. IsPlaintext(c,r) -- allow only numbers and english letters
    5. IsInteger(c,r)    -- is an integer
    6. IsNotHtml(c,r)    -- does not include markup
    7. IsSecure(c,r)    -- is a secure password
    8. IsEqual(c,m,r)    -- matches value of specified field
    9. IsSelected(c) -- a valid option is selected
   10. IsRequired(c) -- a required field has contents

    ARGUMENT KEY

    c = control-reference
    r = required (0|1)
    m = matched control reference


*/

// WARNING MESSAGE
var warning="There are one or more errors or omitted fields in the form. Please correct to continue";

// CHECK VALIDATION: REVIEW ERRORS BEFORE SUBMIT    
// Edit and Move to Head of Document containing form

function Validate(f) {
    if(!document.getElementById) { return true;}
    var errors=0;
    errors+=IsPlaintext(f.username,true);
    errors+=IsSecure(f.password,true);
    errors+=IsEqual(f.confirm,f.password,true);
    errors+=IsEmail(f.email,true);
    errors+=IsPhonenumber(f.phone,false);
    errors+=IsRequired(f.address1);
    errors+=IsPlaintext(f.city,1);
    errors+=IsSelected(f.state);
    errors+=IsZip(f.zip,1);
    if(errors>0) alert (warning);
    return ((errors)? false : true);
    }


// VALIDATORS:

// VALIDATORS: IS EMAIL
function IsEmail(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (!c.value 
        || c.value.search(/^[\w-\.]+@[\w-\.]+\.\w+$/)>-1) {
        unflag_error(c," Unrecognized Format");
        return 0;
        } else {
            flag_error(c," Unrecognized Format");
            return 1;
            }
    }


// VALIDATORS: IS PHONENUMBER        
function IsPhonenumber(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (!c.value 
        || c.value.search(/\(?\d{3}\)?[ \.-]?\d{3}[ \.-]\d{4}/)>-1) {
        unflag_error(c," *Error");
        return 0;
        } else {
            flag_error(c," *Error");
            return 1;
            }
    }

// VALIDATORS: IS ZIP
function IsZip(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (!c.value 
        || c.value.search(/^\d\d\d\d\d(-\d\d\d\d)?$/)>-1) {
        unflag_error(c," *Bad Zip");
        return 0;
        } else {
            flag_error(c," *Bad Zip");
            return 1;
            }
    }

// VALIDATORS: IS PLAINTEXT
function IsPlaintext(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (c.value.search(/[^\w]/)>-1) {
        flag_error(c," Letters and numbers only");
        return 1;
        } else {
            unflag_error(c," Letters and numbers only");
            return 0;
            }
    }

// VALIDATORS: IS INTEGER
function IsInteger(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (c.value.search(/[^\d]/)>-1) {
        flag_error(c," Must be integer");
        return 1;
        } else {
            unflag_error(c," Must be integer");
            return 0;
            }
    }

// VALIDATORS: IS NOT HTML
function IsNotHtml(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if (c.value.search(/<[^>]+>/)>-1) {
        flag_error(c," Markup not permitted");
        return 1;
        } else {
            unflag_error(c," Markup not permitted");
            return 0;
            }
    }

// VALIDATORS: IS SECURE
function IsSecure(c,r) {
    if(r && IsRequired(c)) {return 1;}
    if(c.value.search(/[A-Z]/)>-1 
        && c.value.search(/[\d]/)>-1
        && c.value.length>3) {
        unflag_error(c," Must include at least 4 characters, including 1 number and 1 capital");
        return 0;
        } else {
            flag_error(c," Must include at least 4 characters, including 1 number and 1 capital");
            return 1;
            }
    }

// VALIDATORS: IS EQUAL
function IsEqual(c,m,r) {
    if(r && IsRequired(c)) {return 1;}
    if(!c.value || c.value == m.value) {
        unflag_error(c," Doesn't match "+ m.name);
        return 0;
        } else {
            flag_error(c," Doesn't match "+ m.name);
            return 1;
            }
    }


// VALIDATORS: IS SELECTED
function IsSelected(c,r) {
    if(c.selectedIndex>0) {
        unflag_error(c," Required");
        return 0;
        } else {
            flag_error(c," Required");
            return 1;
            }
    }

// VALIDATORS: IS REQUIRED
function IsRequired(c) {
    if(c.value) { 
        unflag_error(c," Required");
        return 0;
        } else { 
            flag_error(c," Required");
            return 1;
            }
    }

// FLAG/UNFLAG ERRORS

// FLAG ERROR
function flag_error(field,msg) {
    if(document.getElementById) {
        var td=document.getElementById(field.name+'_w')
        td.className="warning_active";
        if(td.firstChild.nodeValue.indexOf(msg)<0) {
            td.firstChild.nodeValue+=msg;
            }
        }
    }

// UNFLAG ERROR
function unflag_error(field,msg) {
    if(document.getElementById) {
        var td=document.getElementById(field.name+'_w')
        td.className="warning";
        if(td.firstChild.nodeValue) td.firstChild.nodeValue=td.firstChild.nodeValue.replace(msg,"");
        }
    }

