function LongInteger_ClientValidate(sender, args) {
    
    args.IsValid = true;
    var errormessage = '';
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else 
    {
        if (!isDecimal(args.Value))
        {
            args.IsValid = false;
            errormessage = 'Please enter a valid number';
        }

        errormessage = ValidateMinAndMax(sender, args);
        errormessage += ValidateMinAndMaxLength(sender, args);
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Integer_ClientValidate(sender, args) {
    
    args.IsValid = true;
    var errormessage = '';
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else 
    {
        if (!isInt(args.Value))
        {
            args.IsValid = false;
            errormessage = 'Please enter a valid number';
        }
        
        errormessage = ValidateMinAndMax(sender, args);
        errormessage += ValidateMinAndMaxLength(sender, args);
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Currency_ClientValidate(sender, args) {

    args.IsValid = true;
    var errormessage = '';

    // remove commas and pound symbols
    args.Value = args.Value.replace(/,/g, ''); 
    var replaceSymbol = false;
    if (args.Value.startsWith('£'))
    {
        args.Value = args.Value.substring(1);
        replaceSymbol = true;
    }
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else 
    {
        if (!isInt(args.Value))
        {
            args.IsValid = false;
            errormessage = 'Please enter a valid amount';
        }
        
        errormessage = ValidateMinAndMax(sender, args);
        errormessage += ValidateMinAndMaxLength(sender, args);
    }
    
    //reinstate pound symbol if removed
    if (replaceSymbol == true)
        args.Value = '£' + args.Value;

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Email_ClientValidate(sender, args) {

    args.IsValid = true;
    var errormessage = '';
    if (args.Value == '')
    {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else {
        myregexp = /^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]*?@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$/i;
        if (!myregexp.test(args.Value))
        {
            args.IsValid = false;
            errormessage += 'Please enter a valid email address';        
        }
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Text_ClientValidate(sender, args) {
    //args.IsValid = true;
    var errormessage = '';
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else 
    {
        errormessage = ValidateMinAndMaxLength(sender, args);
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Name_ClientValidate(sender, args) {
    
    args.IsValid = true;
    var errormessage = '';
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else {
        test_nameregexp = /^[a-zA-Z-]+\d{2}\/\d{2}\/\d{4}\s\d{2}:\d{2}:\d{2}$/;     //Special case for Unit tests, where name is followed immediately by datetime.
        
        name_regexp = /^[a-zA-Z]{1,}[-\s]{0,1}[a-zA-Z]+$/i;                         //Regex for text only. Allows double barrel name, space or hypen separated.
        vowel_regexp = /[aeiouyAEIOUY]/;                                            //Regex to ensure presence of at least 1 vowel
        cons_regexp = /[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]/;                 //Regex to ensure presence of at least 1 consonant
        vowel_repitition_regexp = /[aeiouyAEIOUY]{5}/;                              //Regex to ensure no vowel is repeated more than 4 times
        cons_repetition_regexp = /[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]{5}/;   //Regex to ensure no consonant is repeated more than 4 times
        

        if (test_nameregexp.test(args.Value)) {
            args.IsValid = true;
        }
        else if (!name_regexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'There appears to be something wrong with the information you entered. Please review the data and try again.';
        }
        else if (!vowel_regexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'There appears to be something wrong with the information you entered. Please review the data and try again.';
        }
        else if (!cons_regexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'There appears to be something wrong with the information you entered. Please review the data and try again.';
        }
        else if (vowel_repitition_regexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'There appears to be something wrong with the information you entered. Please review the data and try again.';
        }
        else if (cons_repetition_regexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'There appears to be something wrong with the information you entered. Please review the data and try again.';
        }
    }

    if (args.IsValid) {
        activatevalid(sender.ElementID);
    }
    else {
        activateerror(sender.ElementID, errormessage);
    }
}

function Mobile_ClientValidate(sender, args) {

    Mobile_ClientValidate2(sender.ElementID, sender.AllowNull, args.IsValid, args.Value, sender.IsMobilePhoneId);
}

function Mobile_ClientValidate2(elementID, allowNull, isValid, value, isMobilePhoneId) {
    if (isMobilePhoneId != null) {
        var isMobilePhone = document.getElementById(isMobilePhoneId).checked;
        if (!isMobilePhone) {
            Phone_ClientValidate2(elementID, allowNull, isValid, value);
            return;
        }
    }
    isValid = true;
    var errormessage = '';
    if (value == '') {
        if (allowNull != 'True') {
            isValid = false;
            errormessage = 'This field is required';
        }
    }
    else {
        myregexp = /^[\s\(\),-]*(((00|\+)?[\s\(\),-]*44)|0)[\s\(\),-]*7[\s\(\),-]*[5789]([\s\(\),-]*[\d]){8}$/i;
        if (!myregexp.test(value)) {
            isValid = false;
            errormessage += 'Please enter a valid mobile number';
        }
    }

    if (isValid)
        activatevalid(elementID);
    else
        activateerror(elementID, errormessage);
}

function Phone_ClientValidate(sender, args) {

    Phone_ClientValidate2(sender.ElementID, sender.AllowNull, args.IsValid, args.Value);
}

function Phone_ClientValidate2(elementID, allowNull, isValid, value) {

    isValid = true;
    var errormessage = '';
    if (value == '') {
        if (allowNull != 'True') {
            isValid = false;
            errormessage = 'This field is required';
        }
    }
    else 
    {
        myregexp = /^[\s\(\),-]*(((00|\+)?[\s\(\),-]*44)|0)[\s\(\),-]*((7[\s\(\),-]*[5789]([\s\(\),-]*[\d]){8})|([1-6,8-9][\s\(\),-]*([\s\(\),-]*[\d]){9}))$/i;
        if (!myregexp.test(value))
        {
            isValid = false;
            errormessage += 'Please enter a valid phone number';        
        }
    }

    if (isValid)
        activatevalid(elementID);
    else
        activateerror(elementID, errormessage);
}

function PostCode_ClientValidate(sender, args) {

    args.IsValid = true;
    var errormessage = '';
    
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    else {
        myregexp = /^(X98 7AA|GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])\s?[0-9][ABD-HJLNP-UW-Z]{2})$/i;
        if (!myregexp.test(args.Value)) {
            args.IsValid = false;
            errormessage += 'Please enter a valid postcode';
        }
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function DDL_ClientValidate(sender, args) {
    args.IsValid = true;
    var errormessage = '';
    if (args.Value == '') {
        if (sender.AllowNull != 'True') {
            args.IsValid = false;
            errormessage = 'This field is required';
        }
    }
    
    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage);
}

function Date_ClientValidate(sender, args) {
    //alert('date val');
    args.IsValid = true;
    var errormessage = '';
    dateerrorcount = 0;

    var day = document.getElementById(sender.DayId);
    var month = document.getElementById(sender.MonthId);
    var year = document.getElementById(sender.YearId);

    if (args.value < 100 && year.value == '')
        return;

    if (year.value == '') {
        args.IsValid = false;
        errormessage = AppendString(errormessage, "Year");
    }
    if (month.value == '') {
        args.IsValid = false;
        errormessage = AppendString(errormessage, "Month");
    }
    if (day.value == '') {
        args.IsValid = false;
        errormessage = AppendString(errormessage, "Day");
    }

    if (args.IsValid)
        activatevalid(sender.ElementID);
    else
        activateerror(sender.ElementID, errormessage + " must be selected");
}

var dateerrorcount = 0;
function AppendString(oldString, newString) {
    dateerrorcount++;
    if (dateerrorcount == 1)
        return newString;
    else if (dateerrorcount == 2)
        return newString + ' and ' + oldString;
    else
        return newString + ', ' + oldString;
}

//function Radio_ClientValidate(sender, args) {
//    //alert('radio val' + sender.ElementID);

//    args.IsValid = true;
//    var errormessage = '';
    //    if (args.Value == '' && sender.AllowNull != 'True') {
    //        args.IsValid = false;
    //        errormessage = 'This field is required';
    //    }
    //    else {
    //        myregexp = /^[\s\(\),-]*(((00|\+)?[\s\(\),-]*44)|0)[\s\(\),-]*7[\s\(\),-]*[5789]([\s\(\),-]*[\d]){8}$/i;
    //        if (!myregexp.test(args.Value)) {
    //            args.IsValid = false;
    //            errormessage += 'Please enter a valid mobile number';
    //        }
    //    }

//    if (args.IsValid)
//        activatevalid(sender.ElementID);
//    else
//        activateerror(sender.ElementID, errormessage);
//}

function ValidateMinAndMax(sender, args) {
    var errormessage = '';
    var value = parseInt(args.Value.replace(/,/g, ''));
    
    if (sender.Min != null && sender.Min > 0 && value < sender.Min)
    {
        args.IsValid = false;
        errormessage += 'The minimum you may enter is ' + sender.Min;
    }
    else if (sender.Max != null && sender.Max > 0 && value > sender.Max)
    {
        args.IsValid = false;
        errormessage += 'The maximum you may enter is ' + sender.Max;
    }
    return errormessage;
}

function ValidateMinAndMaxLength(sender, args) {
    var errormessage = '';
    if (sender.MinLength != null && sender.MinLength > 0 && args.Value.length < sender.MinLength)
    {
        args.IsValid = false;
        errormessage += 'The minimum length is ' + sender.MinLength;
    }
    else if (sender.MaxLength != null && sender.MaxLength > 0 && args.Value.length > sender.MaxLength)
    {
        args.IsValid = false;
        errormessage += 'The maximum length is ' + sender.MaxLength;
    }
    return errormessage;
}

function isInt(sNum)
{
    return ( sNum != "" && !isNaN(sNum) && (sNum/1) == parseInt(sNum));
}

function isDecimal(sNum)
{
    return !isNaN( sNum != "" && sNum);
}

String.prototype.startsWith = function(str){
    return (this.indexOf(str) === 0);
}




//function Mobile_ClientValidate(sender, args) {

//    if (sender.IsMobilePhoneId != null) {
//        var isMobilePhone = document.getElementById(sender.IsMobilePhoneId).checked;
//        if (!isMobilePhone) {
//            Phone_ClientValidate(sender, args);
//            return;
//        }
//    }
//    args.IsValid = true;
//    var errormessage = '';
//    if (args.Value == '') {
//        if (sender.AllowNull != 'True') {
//            args.IsValid = false;
//            errormessage = 'This field is required';
//        }
//    }
//    else {
//        myregexp = /^[\s\(\),-]*(((00|\+)?[\s\(\),-]*44)|0)[\s\(\),-]*7[\s\(\),-]*[5789]([\s\(\),-]*[\d]){8}$/i;
//        if (!myregexp.test(args.Value)) {
//            args.IsValid = false;
//            errormessage += 'Please enter a valid mobile number';
//        }
//    }

//    if (args.IsValid)
//        activatevalid(sender.ElementID);
//    else
//        activateerror(sender.ElementID, errormessage);
//}
//function Phone_ClientValidate(sender, args) {

//    args.IsValid = true;
//    var errormessage = '';
//    if (args.Value == '') {
//        if (sender.AllowNull != 'True') {
//            args.IsValid = false;
//            errormessage = 'This field is required';
//        }
//    }
//    else {
//        myregexp = /^[\s\(\),-]*(((00|\+)?[\s\(\),-]*44)|0)[\s\(\),-]*((7[\s\(\),-]*[5789]([\s\(\),-]*[\d]){8})|([1-6,8-9][\s\(\),-]*([\s\(\),-]*[\d]){8,9}))$/i;
//        if (!myregexp.test(args.Value)) {
//            args.IsValid = false;
//            errormessage += 'Please enter a valid phone number';
//        }
//    }

//    if (args.IsValid)
//        activatevalid(sender.ElementID);
//    else
//        activateerror(sender.ElementID, errormessage);
//}
