﻿function chkNumber(phone) {
    if (!/^[\d\.\-\(\)]+$/.test(phone))
        return false;
    var cd = 0;
    for (var i = 0; i < phone.length; i++) {
        var c = phone.charAt(i);
        var condition = /\d/.test(c);
        if (condition) {
            cd++;
        }
    }
    if (cd < 5) return false;
    return true;
}

function chkPassword(pass) {
    var dCount = 0;
    var lCount = 0;
    for (var i = 0; i < pass.length; i++) {
        var c = pass.charAt(i);

        var hasDigitsOrSymbols = /\d/.test(c) || /[^A-z]/.test(c);
        var hasLetters = /[A-z]/.test(c);
        var hasSpace = /[\s]/.test(c);
        if (hasSpace) return false;

        if (hasDigitsOrSymbols) dCount++;
        if (hasLetters) lCount++;

    }

    return (lCount > 0 && dCount > 0);

}
function PasswordValidation(e) {
    var rule = /[^\s]/;
    return checkRegExpression(e, rule);
}
function PhoneValidation(e) {
    var rule = /^[\d\.\-\(\)]+$/;
    return checkRegExpression(e, rule);
}
function CCodeValidation(e) {
    var rule = /^[\d]+$/;
    return checkRegExpression(e, rule);
}

function checkRegExpression(e, rule) {
    var e = window.event || e;
    if (e.altKey || e.ctrlKey) return true;

    var keyCode = jQuery.browser.msie ? e.keyCode : e.which;

    var pressed = String.fromCharCode(keyCode);

    if (!_isNormalChar(e))
        return true;


    if (pressed.match(rule)) {
        return true;
    }

    if (e.preventDefault) {
        e.preventDefault();
    }

    e.returnValue = false;
    return false;
}



function _isNormalChar(e) {
    if (jQuery.browser.msie)
        return true;

    if (jQuery.browser.safari) {
        return !(e.charCode < 32 || e.charCode > 60000);
    }

    if (jQuery.browser.opera) {
        return !(e.rawEvent.which == 0);
    }

    if (e.keyCode != 0 && e.keyCode != 13) {
        return false;
    }
    return true;
}

function addMetthods() {

    jQuery.validator.addMethod('phone', function(phone, element) {
        return this.optional(element) || chkNumber(phone);
    }, 'Your telephone number must contain at least 5 digits');

    jQuery.validator.addMethod('phone_validation', function(phone, element) {
        return this.optional(element) || (/^[\d\.\-\(\)]+$/.test(phone) && !/[\s]/.test(phone));
    }, 'Telephone number should only contain digits and the following symbols: - ( ) .');
    
    jQuery.validator.addMethod('password_validation', function(password, element) {
        return this.optional(element) || !/[\s]/.test(password);
    }, 'Password should not contain spaces');
    
    jQuery.validator.addMethod('password', function(password, element) {
        return this.optional(element) || chkPassword(password);
    }, 'Password must contain at least 8 characters, and include at least one number or symbol');

    jQuery.validator.addMethod('equal2', function(value, element, param) {
        return (this.optional(element) || value.toLowerCase() == $(param).val().toLowerCase());
    }, 'Please enter the same value again');

    jQuery.validator.addMethod('exclude_dash', function(value, element, param) {
        return (this.optional(element) || value.toLowerCase() != '-');
    }, 'Please select a country');
}


function setFormValidation(formId, errId) {
    addMetthods();
    $("#countryCode").keypress(CCodeValidation);
    $("#telephoneNumber").keypress(PhoneValidation);
    $("#passwordA").keypress(PasswordValidation);
    
    $(formId).validate({
        rules: {
            firstName: { required: true },
            lastName: { required: true },
            companyName: { required: true },
            countryCode: {
                required: true,
                number: true,
                minlength: 1
            },
            telephoneNumber: {
                required: true,
                phone_validation: true,
                phone: true,
                minlength: 5
            },
            email: {
                required: true,
                email: true
            },
            password: {
                required: true
                //  password: true
            },
            emailAddressA: {
                required: true,
                email: true
            },
            emailAddressB: {
                required: true,
                equal2: "#emailAddressA"
            },
            passwordA: {
                required: true,
                password_validation: true,
                password: true,
                minlength: 8
            },
            passwordB: {
                required: true,
                equalTo: "#passwordA"
            },
            countryOfResidence: {
                required: true,
                exclude_dash: true
            },
            typeofInvestor: { required: true }
        },
        messages: {
            firstName: {
                required: "Please complete first name"
            },
            lastName: {
                required: "Please complete last name"
            },
            companyName: {
                required: "Please complete company name"
            },
            countryCode: {
                required: "Please complete country code",
                minlength: "Country code must contain at least 1 digit"
            },
            telephoneNumber: {
                required: "Please complete telephone number",
                minlength: "Your telephone number must contain at least 5 digits"
            },

            emailAddressA: {
                required: "Please complete email address",
                email: "Please check the format of your email address"
            },
            emailAddressB: {
                required: "Please confirm email address",
                equal2: "Email addresses do not match"
            },
            passwordA: {
                required: "Please complete password",
                minlength: "Password must contain at least 8 characters, and include at least one number or symbol."
            },
            passwordB: {
                required: "Please confirm password",
                equalTo: "Passwords do not match"
            },
            email: {
                required: "Please complete email address",
                email: "Please check the format of your email address"
            },
            password: {
                required: "Please complete password"
                //minlength: "Password must contain at least 8 characters, and include at least one number or symbol"
            },
            countryOfResidence: {
                required: "Please select a country"
            },
            typeofInvestor: {
                required: "Please select an investor type"
            }
        },

        //errorContainer: errId,
        errorLabelContainer: errId,
        errorClass: "ssv-error",
        errorElement: "span",
        validClass: "",
        onclick: false,
        onkeyup: false,
        focusCleanup: true,
        onfocusout: false,
        invalidHandler: function(form, validator) {
            invalidateHandler(form, validator);
        }
    });
    $(formId + " :input:first").focus();
}
function invalidateHandler(form, validator) {
    var errors = validator.numberOfInvalids(); // debugger;
    if (errors) {
        var firstErr = getNextError(validator.errorList);
        validator.errorList = new Array();
        validator.errorList[0] = firstErr;
        validator.focusInvalid();
    }
}

function getNextError(errorList) {

    var minTabIndex = 0;
    var minIndex = 0;
    for (var i = 0; i < errorList.length; i++) {

        if (i == 0 || (minTabIndex > errorList[i].element.tabIndex)) {
            minTabIndex = errorList[i].element.tabIndex;
            minIndex = i;
        }
    }
    return errorList[minIndex];
}


