﻿
var errorSummary = '';

function sfm_show_error_msg(msg, input_elmt) {
    errorSummary = errorSummary + msg + '\n';
}

function validateEmail(email) {
    var retVal = false, regx, mtch;
    if (!IsNullOrEmpty(email)) {
        mtch = email.match(/@/g);
        if ((mtch != null) && (mtch.length == 1)) {
            // do we have only one @?  (breaks RFC, but who cares, more than one is stupid)
            regx = /([a-z0-9\&\=\"\'\`\~\#\%\!\$\*\-\|\^\+\/\?\_\{\}\. ]{1,64})\@([a-z0-9\-\.]{4,64})$/i;
            var groups = regx.exec(email)
            if ((groups !== null) && (groups[2] !== undefined)) {
                // groups[2] should be the domain portion
                regx = /([a-z0-9]+)(([\.\-]?[a-z0-9]+)*)\.([a-z]{2,})$/i  // won't validate user@<ip address>, which also breaks RFC...
                retVal = regx.test(groups[2]);
            }
        }
    }
    return retVal;
}

function IsCheckSelected(objValue, chkValue) {
    var selected = false;
    var objcheck = objValue.form.elements[objValue.name];
    if (objcheck.length) {
        var idxchk = -1;
        for (var c = 0; c < objcheck.length; c++) {
            if (objcheck[c].value == chkValue) {
                idxchk = c;
                break;
            } //if
        } //for
        if (idxchk >= 0) {
            if (objcheck[idxchk].checked == "1") {
                selected = true;
            }
        } //if
    }
    else {
        if (objValue.checked == "1") {
            selected = true;
        } //if
    } //else	

    return selected;
}
function TestDontSelectChk(objValue, chkValue, strError) {
    var pass = true;
    pass = IsCheckSelected(objValue, chkValue) ? false : true;

    if (pass === false) {
        if (!strError || strError.length === 0) {
            strError = "Can't Proceed as you selected " + objValue.name;
        } //if			  
        sfm_show_error_msg(strError, objValue);

    }
    return pass;
}
function TestShouldSelectChk(objValue, chkValue, strError) {
    var pass = true;
    pass = IsCheckSelected(objValue, chkValue) ? true : false;
    if (pass === false) {
        if (!strError || strError.length === 0) {
            strError = "You should select " + objValue.name;
        } //if			  
        sfm_show_error_msg(strError, objValue);
    }
    return pass;
}

function TestRequiredInput( objId, strError) {

    var objValue = document.getElementById(objId);

    var ret = true;
    var val = objValue.value;
    val = val.replace(/^\s+|\s+$/g, ""); //trim
    if (eval(val.length) === 0) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + " : Required Field";
        } //if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if 
    return ret;
}

function TestMaxLen(objId, strMaxLen, strError) {

    var objValue = document.getElementById(objId);

    var ret = true;
    if (eval(objValue.value.length) > eval(strMaxLen)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + " : " + strMaxLen + " characters maximum ";
        } //if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if 
    return ret;
}

function TestMinLen(objId, strMinLen, strError) {

    var objValue = document.getElementById(objId);

    var ret = true;
    if (eval(objValue.value.length) < eval(strMinLen)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + " : " + strMinLen + " characters minimum  ";
        } //if               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if 
    return ret;
}
function TestInputType(objId, strRegExp, strError, strDefaultError) {

    var objValue = document.getElementById(objId);

    if (objValue.value == '') return true;
    
    var ret = true;

    var charpos = objValue.value.search(strRegExp);
    if (objValue.value.length > 0 && charpos >= 0) {
        if (!strError || strError.length === 0) {
            strError = strDefaultError;
        } //if 
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if 
    return ret;
}

/* Removed because it's stupid
function TestSQLInjection(objId) {
    var objValue = document.getElementById(objId);
    if (objValue.value == '') return true;
    var sqlregex = /(cast\s*\()|(((exec)|(execute))((\s+)|(\()|(\[)))|(script\s+src)|(((alter)|(create)|(drop))\s+((@)|(database)|(function)|(index)|(login)|(proc)|(role)|(schema)|(table)|(trigger)|(user)|(view)))|(((alter)|(create)|(declare)|(delete\s+from)|(drop)|(insert))\s*\[)|(declare\s+((@)|(cursor)|(table)|(xml)))|(delete((\s+top)|(\s*\[)))|(((delete\s+from)|(delete))\s+((@)|(dbo)|(tbl)|(hbm\s*\.)|(tempdb)|(master)))|(insert\s+((@)|(into)|(tbl)|(vw)))|(truncate((log)|(\s+table)))|((43|63)(41|61)(53|73)(54|74)(20|09|0A|0B|0C|0D)*(28))|((((45|65)(58|78)(45|65)(43|63))|((45|65)(58|78)(45|65)(43|63)(55|75)(54|74)(45|65)))(((20|09|0A|0B|0C|0D)+)|((28))|((5b))))|((53|73)(43|63)(52|72)(49|69)(50|70)(54|74)(20|09|0A|0B|0C|0D)+(53|73)(52|72)(43|63))|((((41|61)(4c|6c)(54|74)(45|65)(52|72))|((43|63)(52|72)(45|65)(41|61)(54|74)(45|65))|((44|64)(52|72)(4f|6f)(50|70)))(20|09|0A|0B|0C|0D)+(((40))|((44|64)(41|61)(54|74)(41|61)(42|62)(41|61)(53|73)(45|65))|((46|66)(55|75)(4e|6e)(43|63)(54|74)(49|69)(4f|6f)(4e|6e))|((49|69)(4e|6e)(44|64)(45|65)(58|78))|((4c|6c)(4f|6f)(47|67)(49|69)(4e|6e))|((50|70)(52|72)(4f|6f)(43|63))|((52|72)(4f|6f)(4c|6c)(45|65))|((53|73)(43|63)(48|68)(45|65)(4d|6d)(41|61))|((54|74)(41|61)(42|62)(4c|6c)(45|65))|((54|74)(52|72)(49|69)(47|67)(47|67)(45|65)(52|72))|((55|75)(53|73)(45|65)(52|72))|((56|76)(49|69)(45|65)(57|77))))|((((41|61)(4c|6c)(54|74)(45|65)(52|72))|((43|63)(52|72)(45|65)(41|61)(54|74)(45|65))|((44|64)(45|65)(43|63)(4c|6c)(41|61)(52|72)(45|65))|((44|64)(45|65)(4c|6c)(45|65)(54|74)(45|65)(20|09|0A|0B|0C|0D)+(46|66)(52|72)(4f|6f)(4d|6d))|((44|64)(52|72)(4f|6f)(50|70))|((49|69)(4e|6e)(53|73)(45|65)(52|72)(54|74)))(20|09|0A|0B|0C|0D)*(5b))|((44|64)(45|65)(43|63)(4c|6c)(41|61)(52|72)(45|65)(20|09|0A|0B|0C|0D)+(((40))|((43|63)(55|75)(52|72)(53|73)(4f|6f)(52|72))|((54|74)(41|61)(42|62)(4c|6c)(45|65))|((58|78)(4d|6d)(4c|6c))))|((44|64)(45|65)(4c|6c)(45|65)(54|74)(45|65)(((20|09|0A|0B|0C|0D)+(54|74)(4f|6f)(50|70))|((20|09|0A|0B|0C|0D)*(5b))))|((((44|64)(45|65)(4c|6c)(45|65)(54|74)(45|65)(20|09|0A|0B|0C|0D)+(46|66)(52|72)(4f|6f)(4d|6d))|((44|64)(45|65)(4c|6c)(45|65)(54|74)(45|65)))(20|09|0A|0B|0C|0D)+(((40))|((44|64)(42|62)(4f|6f))|((54|74)(42|62)(4c|6c))|((48|68)(42|62)(4d|6d)(20|09|0A|0B|0C|0D)*(2e))|((54|74)(45|65)(4d|6d)(50|70)(44|64)(42|62))|((4d|6d)(41|61)(53|73)(54|74)(45|65)(52|72))))|((49|69)(4e|6e)(53|73)(45|65)(52|72)(54|74)(20|09|0A|0B|0C|0D)+(((40))|((49|69)(4e|6e)(54|74)(4f|6f))|((54|74)(42|62)(4c|6c))|((56|76)(57|77))))|((54|74)(52|72)(55|75)(4e|6e)(43|63)(41|61)(54|74)(45|65)(((4c|6c)(4f|6f)(47|67))|((20|09|0A|0B|0C|0D)+(54|74)(41|61)(42|62)(4c|6c)(45|65))))|((0043|0063)(0041|0061)(0053|0073)(0054|0074)(0020|0009|000A|000B|000C|000D)*(0028))|((((0045|0065)(0058|0078)(0045|0065)(0043|0063))|((0045|0065)(0058|0078)(0045|0065)(0043|0063)(0055|0075)(0054|0074)(0045|0065)))(((0020|0009|000A|000B|000C|000D)+)|((0028))|((005b))))|((0053|0073)(0043|0063)(0052|0072)(0049|0069)(0050|0070)(0054|0074)(0020|0009|000A|000B|000C|000D)+(0053|0073)(0052|0072)(0043|0063))|((((0041|0061)(004c|006c)(0054|0074)(0045|0065)(0052|0072))|((0043|0063)(0052|0072)(0045|0065)(0041|0061)(0054|0074)(0045|0065))|((0044|0064)(0052|0072)(004f|006f)(0050|0070)))(0020|0009|000A|000B|000C|000D)+(((0040))|((0044|0064)(0041|0061)(0054|0074)(0041|0061)(0042|0062)(0041|0061)(0053|0073)(0045|0065))|((0046|0066)(0055|0075)(004e|006e)(0043|0063)(0054|0074)(0049|0069)(004f|006f)(004e|006e))|((0049|0069)(004e|006e)(0044|0064)(0045|0065)(0058|0078))|((004c|006c)(004f|006f)(0047|0067)(0049|0069)(004e|006e))|((0050|0070)(0052|0072)(004f|006f)(0043|0063))|((0052|0072)(004f|006f)(004c|006c)(0045|0065))|((0053|0073)(0043|0063)(0048|0068)(0045|0065)(004d|006d)(0041|0061))|((0054|0074)(0041|0061)(0042|0062)(004c|006c)(0045|0065))|((0054|0074)(0052|0072)(0049|0069)(0047|0067)(0047|0067)(0045|0065)(0052|0072))|((0055|0075)(0053|0073)(0045|0065)(0052|0072))|((0056|0076)(0049|0069)(0045|0065)(0057|0077))))|((((0041|0061)(004c|006c)(0054|0074)(0045|0065)(0052|0072))|((0043|0063)(0052|0072)(0045|0065)(0041|0061)(0054|0074)(0045|0065))|((0044|0064)(0045|0065)(0043|0063)(004c|006c)(0041|0061)(0052|0072)(0045|0065))|((0044|0064)(0045|0065)(004c|006c)(0045|0065)(0054|0074)(0045|0065)(0020|0009|000A|000B|000C|000D)+(0046|0066)(0052|0072)(004f|006f)(004d|006d))|((0044|0064)(0052|0072)(004f|006f)(0050|0070))|((0049|0069)(004e|006e)(0053|0073)(0045|0065)(0052|0072)(0054|0074)))(0020|0009|000A|000B|000C|000D)*(005b))|((0044|0064)(0045|0065)(0043|0063)(004c|006c)(0041|0061)(0052|0072)(0045|0065)(0020|0009|000A|000B|000C|000D)+(((0040))|((0043|0063)(0055|0075)(0052|0072)(0053|0073)(004f|006f)(0052|0072))|((0054|0074)(0041|0061)(0042|0062)(004c|006c)(0045|0065))|((0058|0078)(004d|006d)(004c|006c))))|((0044|0064)(0045|0065)(004c|006c)(0045|0065)(0054|0074)(0045|0065)(((0020|0009|000A|000B|000C|000D)+(0054|0074)(004f|006f)(0050|0070))|((0020|0009|000A|000B|000C|000D)*(005b))))|((((0044|0064)(0045|0065)(004c|006c)(0045|0065)(0054|0074)(0045|0065)(0020|0009|000A|000B|000C|000D)+(0046|0066)(0052|0072)(004f|006f)(004d|006d))|((0044|0064)(0045|0065)(004c|006c)(0045|0065)(0054|0074)(0045|0065)))(0020|0009|000A|000B|000C|000D)+(((0040))|((0044|0064)(0042|0062)(004f|006f))|((0054|0074)(0042|0062)(004c|006c))|((0048|0068)(0042|0062)(004d|006d)(0020|0009|000A|000B|000C|000D)*(002e))|((0054|0074)(0045|0065)(004d|006d)(0050|0070)(0044|0064)(0042|0062))|((004d|006d)(0041|0061)(0053|0073)(0054|0074)(0045|0065)(0052|0072))))|((0049|0069)(004e|006e)(0053|0073)(0045|0065)(0052|0072)(0054|0074)(0020|0009|000A|000B|000C|000D)+(((0040))|((0049|0069)(004e|006e)(0054|0074)(004f|006f))|((0054|0074)(0042|0062)(004c|006c))|((0056|0076)(0057|0077))))|((0054|0074)(0052|0072)(0055|0075)(004e|006e)(0043|0063)(0041|0061)(0054|0074)(0045|0065)(((004c|006c)(004f|006f)(0047|0067))|((0020|0009|000A|000B|000C|000D)+(0054|0074)(0041|0061)(0042|0062)(004c|006c)(0045|0065))))/;
    if (sqlregex.test(objValue.value)) {
        return false;
    }
    return true;
}
*/

function TestEmail(objId, strError) {

    var objValue = document.getElementById(objId);

    var ret = true;
    if (objValue.value.length > 0 && !validateEmail(objValue.value)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + ": Enter a valid Email address ";
        } //if                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if 
    return ret;
}

function TestLessThan(objId, strLessThan, strError) {

    var objValue = document.getElementById(objId);
    var ret = true;
    if (isNaN(objValue.value)) {
        sfm_show_error_msg(objValue.name + ": Should be a number ", objValue);
        ret = false;
    } //if 
    else
        if (eval(objValue.value) >= eval(strLessThan)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + " : value should be less than " + strLessThan;
        } //if               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if   
    return ret;
}

function TestGreaterThan(objId, strGreaterThan, strError) {

    var objValue = document.getElementById(objId);
    var ret = true;
    if (isNaN(objValue.value)) {
        sfm_show_error_msg(objValue.name + ": Should be a number ", objValue);
        ret = false;
    } //if 
    else
        if (eval(objValue.value) <= eval(strGreaterThan)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + " : value should be greater than " + strGreaterThan;
        } //if               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if  
    return ret;
}

function TestRegExp(objId, strRegExp, strError) {

    var objValue = document.getElementById(objId);
    var ret = true;
    if (objValue.value.length > 0 &&
        !objValue.value.match(strRegExp)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + ": Invalid characters found ";
        } //if                                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    } //if return ret;
}

function TestDontSelect(objId, dont_sel_index, strError) {

    var objValue = document.getElementById(objId);
    var ret = true;
    if (objValue.selectedIndex === null) {
        sfm_show_error_msg("ERROR: dontselect command for non-select Item");
        ret = false;
    }
    if (objValue.selectedIndex == eval(dont_sel_index)) {
        if (!strError || strError.length === 0) {
            strError = objValue.name + ": Please Select one option ";
        } //if                                                               
        sfm_show_error_msg(strError, objValue);
        ret = false;
    }
    return ret;
}

// wtf!  This why we use real radio buttons
// instead of checkboxes
function TestSelectOneRadio(objId, strError) {

    var objValue = document.getElementById(objId);
    
    var objradio = objValue.form.elements[objValue.name];
    var one_selected = false;
    for (var r = 0; r < objradio.length; r++) {
        if (objradio[r].checked) {
            one_selected = true;
            break;
        }
    }
    if (false === one_selected) {
        if (!strError || strError.length === 0) {
            strError = "Please select one option from " + objValue.name;
        }
        sfm_show_error_msg(strError, objValue);
    }
    return one_selected;
}


function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

function TestPhoneNumber(objId, strError )   // true if required
{
    var objValue = document.getElementById(objId);

    if (objValue.value === '') return true; // if no input passed then we call it good. 
    
    var tfld = trim(objValue.value);  // value of field with whitespace trimmed off
    var telnr = /^\+?[0-9 ()\-]+[0-9]$/;
    if (!telnr.test(tfld)) {
        //msg(infofield, "error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
        strError = "Not a valid telephone number. Characters permitted are digits, space ()- and leading +";
        sfm_show_error_msg(strError, objValue);
        //setfocus(objValue);
        return false;
    }

    var numdigits = 0;
    for (var j = 0; j < tfld.length; j++)
        if (tfld.charAt(j) >= '0' && tfld.charAt(j) <= '9') numdigits++;

    if (numdigits < 6) {
        //msg(infofield, "error", "ERROR: " + numdigits + " digits - too short");
        //setfocus(objValue);
        strError = numdigits + " digits - too short";
        sfm_show_error_msg(strError, objValue);
        return false;
    }

    return true;
}
