﻿function validate() {
    var frm = document.forms[0];
    alert("validate");

    return false;
}

function ele(e) { return document.getElementById(e); }

var ammendged = false;
var allOK = true;

var msg = '';

function ammend(name, error) {
    allOK = false;
    ele(name).style.backgroundColor = '#FF0000';
    if (ammendged == false) {
        try {
            ele(name).focus();
            ammendged = true; 
        }
        catch (x) { }
    }
    msg += error + '\n';
}

function unblock() {
    for (var i = 0; i < window.top.document.getElementsByTagName('SELECT').length; i++)
        window.top.document.getElementsByTagName('SELECT')[i].style.backgroundColor = "#ffffff";
    for (var i = 0; i < window.top.document.getElementsByTagName('INPUT').length; i++)
        if (window.top.document.getElementsByTagName('INPUT')[i].id != 'btnNext' && window.top.document.getElementsByTagName('INPUT')[i].id != 'pcaButtonTE35')
        window.top.document.getElementsByTagName('INPUT')[i].style.backgroundColor = "#ffffff";

    if (navigator.appVersion.indexOf('MSIE 6') > -1)
        for (var i = 0; i < window.top.document.getElementsByTagName('SELECT').length; i++) {
        try {
            var old = window.top.ge('txt' + window.top.document.getElementsByTagName('SELECT')[i].id);
            old.id = '';
            old.style.display = 'none';
            window.top.document.getElementsByTagName('SELECT')[i].style.display = 'inline';
        }
        catch (x) { x = x; }
    }
}

function validate() {
    allOK = true;
    unblock();
    msg = 'Please correct the following errors.\n Fields with errors are highlighted in red\n\n';
    
    dropValidate('loandrop', 'Please select the loan amount you require.');
    dropValidate('titledrop', 'Please select your title.');
    txtValidate('nametxt', 1, 'Please enter your first name.');
    txtValidate('surnametxt', 1, 'Please enter your surname.');
    txtValidate('emailtxt', 7, 'Please enter your email address.');
    if (!emailValidate(ele('emailtxt').value))
        ammend('emailtxt', 'Invalid email address');
    if (txtValidate('emailConftxt', 7, 'Please confirm your email address.'))
        if (ele('emailConftxt').value != ele('emailtxt').value)
            ammend('emailConftxt', 'Email addresses do not match.');
    dropValidate('dobDaydrop', 'Please select your date of birth. (day)');
    dropValidate('dobMonthdrop', 'Please select your date of birth. (month)');
    dropValidate('dobYeardrop', 'Please select your date of birth. (year)');
    var dob = ele('dobDaydrop').value + '/' + ele('dobMonthdrop').value + '/' + ele('dobYeardrop').value;
    checkIf18(dob);
    
    var testPattern = /07\d\d\d\d\d\d\d\d\d/;

    // Now we alert out the result of the test:
    if (testPattern.test(ele('homeTeltxt').value) == false) {
        if (!checkUKTelephone(ele('homeTeltxt').value, 'homeTeltxt'))
            ammend('homeTeltxt', telNumberErrors[telNumberErrorNo]);
    }
    else
        ammend('homeTeltxt', 'Home phone number must start with 01 or 02.');

    if (testPattern.test(ele('workTeltxt').value) == false) {
        if (!checkUKTelephone(ele('workTeltxt').value, 'workTeltxt'))
            ammend('workTeltxt', telNumberErrors[telNumberErrorNo]);
    }
    else
        ammend('workTeltxt', 'Work phone number must start with 01, 02 or 08.');

    if (testPattern.test(ele('mobileTeltxt').value) == true) {
        if (!checkUKTelephone(ele('mobileTeltxt').value, 'mobileTeltxt'))
            ammend('mobileTeltxt', telNumberErrors[telNumberErrorNo]);
    }
    else
        ammend('mobileTeltxt', 'Mobile phone number must start with 07 and be 11 digits.');
    
        
 /*   var tel1 = txtValidate('homeTeltxt', 11, 'Please enter your home phone number.');
    if (tel1)
        if (isNaN(ele('homeTeltxt').value))
        ammend('homeTeltxt', 'Home phone number must be numeric.')
    else
        if (ele('homeTeltxt').value.substr(0, 2) != '01' && ele('homeTeltxt').value.substr(0, 2) != '02' && ele('homeTeltxt').value.substr(0, 2) != '07' && ele('homeTeltxt').value.substr(0, 2) != '08')
        ammend('homeTeltxt', 'Home phone number must start with 01 or 02.');
    var tel2 = txtValidate('workTeltxt', 11, 'Please enter your work phone number.');
    if (tel2)
        if (isNaN(ele('workTeltxt').value))
        ammend('workTeltxt', 'Work phone number must be numeric.')
    else
        if (ele('workTeltxt').value.substr(0, 2) != '01' && ele('workTeltxt').value.substr(0, 2) != '02' && ele('workTeltxt').value.substr(0, 2) != '07' && ele('workTeltxt').value.substr(0, 2) != '08')
        ammend('workTeltxt', 'Work phone number must start with 01, 02, 07 or 08.');
    if (tel1 && tel2)
        if (ele('homeTeltxt').value == ele('workTeltxt').value)
        ammend('workTeltxt', 'Home phone and Work phone must be different.');
    txtValidate('mobileTeltxt', 11, 'Please enter your mobile phone number.');
    if (isNaN(ele('mobileTeltxt').value))
        ammend('mobileTeltxt', 'Mobile phone number must be numeric.')
    else
        if (ele('mobileTeltxt').value.substr(0, 2) != '07')
            ammend('mobileTeltxt', 'Mobile phone number must start with 07.');*/
            
    txtValidate('postcodetxt', 5, 'Please enter your postcode.');
    txtValidate('houseNotxt', 1, 'Please enter your house name / number.');
    txtValidate('streetNametxt', 1, 'Please enter your street name.');
    txtValidate('towntxt', 2, 'Please enter your town/city.');
    //txtValidate('countytxt',4,'Please enter your county.');
    dropValidate('employdrop', 'Please select your primary income type.');
    txtValidate('employNametxt', 2, 'Please enter your employer\'s name.');
    dropValidate('employTimedrop', 'Please select time at employer.');
    if (txtValidate('monthPaytxt', 1, 'Please enter your net monthly pay.'))
        if (isNaN(ele('monthPaytxt').value))
            ammend('monthPaytxt', 'Net monthly pay must be numeric. no pound sign!')
    else
        if (ele('monthPaytxt').value.indexOf('.') > -1)
            ammend('monthPaytxt', 'Please enter your net monthly pay as whole pounds only.')
    else
        if (ele('monthPaytxt').value.indexOf('£') > -1)
            ammend('monthPaytxt', 'Net monthly pay must be numeric. no pound sign!');
        dropValidate('whenPaydrop', 'Please select pay frequency.');
        dropValidate('directDebitdrop', 'Please select whether paid into bank account.');
        dropValidate('payDaydrop', 'Please select next pay date. (day)');
        dropValidate('payMonthdrop', 'Please select next pay date. (month)');
        dropValidate('payYeardrop', 'Please select next pay date. (year)');
        dropValidate('nxtpayDaydrop', 'Please select following pay date. (day)');
        dropValidate('nxtpayMonthdrop', 'Please select following pay date. (month)');
        dropValidate('nxtpayYeardrop', 'Please select following pay date. (year)');
        dropValidate('debitCarddrop', 'Please select primary debit card.');
        
        var pday = ele('payDaydrop').options[ele('payDaydrop').selectedIndex].value;
        
        if (pday != '') {
            isValidDate(ele('payDaydrop').options[ele('payDaydrop').selectedIndex].value + '/' + ele('payMonthdrop').options[ele('payMonthdrop').selectedIndex].value + '/' + ele('payYeardrop').options[ele('payYeardrop').selectedIndex].value, '');
        }
        
        var npday = ele('nxtpayDaydrop').options[ele('nxtpayDaydrop').selectedIndex].value;
        
        if (npday != '') {
            isValidDate(ele('nxtpayDaydrop').options[ele('nxtpayDaydrop').selectedIndex].value + '/' + ele('nxtpayMonthdrop').options[ele('nxtpayMonthdrop').selectedIndex].value + '/' + ele('nxtpayYeardrop').options[ele('nxtpayYeardrop').selectedIndex].value, 'nxt');
        }
        
        ele('nitxt').value = checkNI('nitxt', 'Please enter a valid national insurance number.');

        if (txtLengthValidate('bankAccNotxt', 8, 'Please enter a valid 8-digit bank account number.')) {
            if (isNaN(ele('bankAccNotxt').value))
                ammend('bankAccNotxt', 'Bank account must be numeric.');
        }

        if (txtLengthValidate('sortCodetxt', 6, 'Please enter a valid 6-digit bank sort code.')) {
            if (isNaN(ele('sortCodetxt').value))
                ammend('sortCodetxt', 'Bank sort code must be numeric.');
        }
        
        if (!ele('agreechk').checked)
            ammend('agreechk', 'Please confirm Loan4PayDay\'s Conditions and Policies.');

        if (allOK) {
            ele('subbutt').disabled = true;
          //  alert("-- Please wait while your application is being processed. --\n\n" +
         //   "This should take less than a minute, during this time please DO not refresh your browser or push the back button.\n\n" +
         //   "Thank you for using Loan4Payday");
            var theForm = document.getElementById("postfrm");
            theForm.submit(); 
        }
        else {
            alert(msg);
            
        return false;
    }

    function txtValidate(name, minlength, error) {
        if (ele(name).value.length < minlength) {
            ammend(name, error);
            return false;
        }
        return true;
    }

    function txtLengthValidate(name, minlength, error) {
        if (ele(name).value.length < minlength) {
            ammend(name, error);
            return false;
        }
        if (ele(name).value.length > minlength) {
            ammend(name, error);
            return false;
        }
        return true;
    }

    function dropValidate(name, error) {
        if (ele(name).options[ele(name).selectedIndex].value.length == 0) {
            ammend(name, error);
            return false;
        }
        return true;
    }

    function checkNI(num, error) {

        var niNum = ele(num).value;
        var invalid = false;
        if (checkNINO(niNum)) {
            return checkNINO(niNum);
        }
        else {
            error = "National Insurance Number has invalid format";
            ammend("nitxt", error);
            return false;
        }

  /*      var niNum = ele(num).value; // the number to be tested
        var invalid = false;
        niNum = niNum.replace(/\s/g, "");   // remove spaces

        if (!/^[a-z]{2}\d{6}[a-d]/i.test(niNum)) {   // basic format = 2 letters + 6 digits + 1 letter (a-d)
            invalid = true;
        }
        if (/^[dfiquv]/i.test(niNum)) {   // invalid first letters
            invalid = true;
        }
        if (/^[a-z][dfioquv]/i.test(niNum)) {   // invalid second letters
            invalid = true;
        }
        if (/^(bg)|(gb)|(nk)|(tn)|(nt)|(zz)/i.test(niNum)) {  // invalid first/second letter combinations
            invalid = true;
        }

        if (invalid == false) {
            return num.toUpperCase()
        }
        else {
            ammend("nitxt", error);
            return false;
        }*/
    }

    function emailValidate(emailStr) {
        var checkTLD = 1;
        var knownDomsPat = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/i;
        var emailPat = /^(.+)@(.+)$/;
        var specialChars = "\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
        var validChars = "\[^\\s" + specialChars + "\]";
        var quotedUser = "(\"[^\"]*\")";
        var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
        var atom = validChars + '+';
        var word = "(" + atom + "|" + quotedUser + ")";
        var userPat = new RegExp("^" + word + "(\\." + word + ")*$");
        var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");
        var matchArray = emailStr.match(emailPat);
        if (matchArray == null)
            return false;
        var user = matchArray[1];
        var domain = matchArray[2];
        for (i = 0; i < user.length; i++) {
            if (user.charCodeAt(i) > 127)
                return false;
        }
        for (i = 0; i < domain.length; i++) {
            if (domain.charCodeAt(i) > 127)
                return false;
        }
        if (user.match(userPat) == null)
            return false;
        var IPArray = domain.match(ipDomainPat);
        if (IPArray != null) {
            for (var i = 1; i <= 4; i++) {
                if (IPArray[i] > 255)
                    return false;
            }
            return true;
        }
        var atomPat = new RegExp("^" + atom + "$");
        var domArr = domain.split(".");
        var len = domArr.length;
        for (i = 0; i < len; i++) {
            if (domArr[i].search(atomPat) == -1)
                return false;
        }

        if (checkTLD && domArr[domArr.length - 1].length != 2 && domArr[domArr.length - 1].search(knownDomsPat) == -1)
            return false;

        if (len < 2)
            return false;
        return true;
    }
}

function checkNINO(toCheck) {

    var exp1 = /^[A-CEGHJ-NOPR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D\s]{1}/i;
    var exp2 = /(^GB)|(^BG)|(^NK)|(^KN)|(^TN)|(^NT)|(^ZZ).+/i;

    if (toCheck.match(exp1) && !toCheck.match(exp2))
        return toCheck.toUpperCase()
    else {
        ammend('nitxt', 'You must enter a valid National Insurance No.');
        return false;
    }
}

function checkIf18(DateValue) {
    var today = new Date();
    var dtDate = new Date(DateValue)
    if (dtDate.getTime() > (today.getTime() - (18 * 31556926000))) {
        ammend('dobYeardrop', 'You must be over 18 years of Age to apply!');
        return false;
    }
    else {
        return true;
    }
}

function isValidDate(dateStr, type) {
var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
var matchArray = dateStr.match(datePat); // is the format ok?

day = matchArray[1]; // p@rse date into variables
month = matchArray[3] - 1;
year = matchArray[5];

if (isDate(dateStr) == false) {
    if (type == "nxt")
        ammend(type + 'payDaydrop', 'Next Pay Date must be a valid date.');
    else
        ammend(type + 'payDaydrop', 'Pay Date must be a valid date.');
    return false;
}

var dateObj = new Date();
dateObj.setFullYear(year, month, day);

if (dateObj < new Date()) {
    ammend(type + 'payDaydrop', 'Date must be a future date.');
    return false;
}

if (month < 0 || month > 11) { // check month range
ammend(type + 'payMonthdrop', 'Month must be between 1 and 12.');
return false;
}

if (day < 1 || day > 31) {
ammend(type + 'payDaydrop', 'Day must be between 1 and 31.');
return false;
}

if ((month==4 || month==6 || month==9 || month==11) && day==31) {
ammend(type + 'payMonthdrop', 'Month ' + month + ' doesn`t have 31 days!');
return false;
}

if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day > 29 || (day==29 && !isleap)) {
ammend(type + 'payYeardrop', 'February ' + year + ' doesn`t have ' + day + ' days!');
return false;
}
}
return true; // date is valid
}

var dtCh = "/";
var minYear = 1900;
var maxYear = 2100;

function isInteger(s) {
    var i;
    for (i = 0; i < s.length; i++) {
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag) {
    var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary(year) {
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
}
function DaysArray(n) {
    for (var i = 1; i <= n; i++) {
        this[i] = 31
        if (i == 4 || i == 6 || i == 9 || i == 11) { this[i] = 30 }
        if (i == 2) { this[i] = 29 }
    }
    return this
}

function isDate(dtStr) {
    var daysInMonth = DaysArray(12)
    var pos1 = dtStr.indexOf(dtCh)
    var pos2 = dtStr.indexOf(dtCh, pos1 + 1)
    var strDay = dtStr.substring(0, pos1)
    var strMonth = dtStr.substring(pos1 + 1, pos2)
    var strYear = dtStr.substring(pos2 + 1)
    strYr = strYear
    if (strDay.charAt(0) == "0" && strDay.length > 1) strDay = strDay.substring(1)
    if (strMonth.charAt(0) == "0" && strMonth.length > 1) strMonth = strMonth.substring(1)
    for (var i = 1; i <= 3; i++) {
        if (strYr.charAt(0) == "0" && strYr.length > 1) strYr = strYr.substring(1)
    }
    month = parseInt(strMonth)
    day = parseInt(strDay)
    year = parseInt(strYr)
    if (pos1 == -1 || pos2 == -1) {
        //alert("The date format should be : mm/dd/yyyy")
        return false
    }
    if (strMonth.length < 1 || month < 1 || month > 12) {
        //alert("Please enter a valid month")
        return false
    }
    if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > daysInMonth[month]) {
        //alert("Please enter a valid day")
        return false
    }
    if (strYear.length != 4 || year == 0 || year < minYear || year > maxYear) {
        //alert("Please enter a valid 4 digit year between " + minYear + " and " + maxYear)
        return false
    }
    if (dtStr.indexOf(dtCh, pos2 + 1) != -1 || isInteger(stripCharsInBag(dtStr, dtCh)) == false) {
        //alert("Please enter a valid date")
        return false
    }
    return true
}