﻿// Standard validation
var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lowerChars = "abcdefghijklmnopqrstuvwxyz";
var digits = "0123456789";

function validate(form) {

    var validForm = false;
    var mMsg = "";
    var vMsg = "";

    var PersonDetails;
    var CardDetails;
    var BankDetails;
    var PaymentDetails;
    var Switch = getFieldValue(form, "Switch")

    if (getFieldValue(form, "PersonDetails") == "True") { PersonDetails = true; } else { PersonDetails = false; }
    if (getFieldValue(form, "Switch") != "True") {
        if (getFieldValue(form, "CardDetails") == "True") { CardDetails = true; } else { CardDetails = false; }
    }
    if (getFieldValue(form, "BankDetails") == "True") { BankDetails = true; } else { BankDetails = false; }
    if (getFieldValue(form, "PaymentDetails") == "True") { PaymentDetails = true; } else { PaymentDetails = false; }

    //	alert(getFieldValue(form, "PersonDetails"))


    if (PersonDetails) {

        var Password = getFieldValue(form, "Password")
        var Person_Email = getFieldValue(form, "Email");
        var Person_Title = getFieldValue(form, "Title");
        var Person_Forenames = getFieldValue(form, "Forenames");
        var Person_Surname = getFieldValue(form, "Surname");
        //var Person_DOB = getFieldValue(form, "DOB");
        var Person_DOB = getFieldValue(form, "DOB_dd") + "/" + getFieldValue(form, "DOB_mm") + "/" + getFieldValue(form, "DOB_yyyy");
        var Person_NINumber = getFieldValue(form, "NINumber");
        var Person_noNINumber = getFieldValue(form, "noNINumber", "checkbox");
        var Product_EligibilityQ1 = getFieldValue(form, "EligibilityQ1");
        var Person_AddressLine1 = getFieldValue(form, "AddressLine1");
        var Person_AddressLine2 = getFieldValue(form, "AddressLine2");
        var Person_AddressLine3 = getFieldValue(form, "AddressLine3");
        var Person_AddressLine4 = getFieldValue(form, "AddressLine4");
        var Person_Postcode = getFieldValue(form, "Postcode");
        var Person_Country = getFieldValue(form, "Country");
        var Person_Telephone = getFieldValue(form, "Telephone");
        var Person_FaxNumber = getFieldValue(form, "FaxNumber");
        var ContactDetails = getFieldValue(form, "contactAddress", "checkbox");
        var Person_ContactName = getFieldValue(form, "ContactName");
        var Person_ContactAddressLine1 = getFieldValue(form, "ContactAddressLine1");
        var Person_ContactAddressLine2 = getFieldValue(form, "ContactAddressLine2");
        var Person_ContactAddressLine3 = getFieldValue(form, "ContactAddressLine3");
        var Person_ContactAddressLine4 = getFieldValue(form, "ContactAddressLine4");
        var Person_ContactPostcode = getFieldValue(form, "Postcode");
        var Person_ContactCountry = getFieldValue(form, "Country");
        var Person_ContactTelephone = getFieldValue(form, "Telephone");
        //		var Product_EligibilityQ1 = getFieldValue(form, "EligibilityQ1");
    }
    if (CardDetails) {
        Card_Type = getFieldValue(form, "Card_Type");
        Card_Name = getFieldValue(form, "Card_Name");
        Card_Number = getFieldValue(form, "Card_Number");
        //Card_StartDate = getFieldValue(form, "Card_StartDate");
        Card_StartDate_MM = getFieldValue(form, "Card_StartDate_MM");
        Card_StartDate_YY = getFieldValue(form, "Card_StartDate_YY");
        //Card_ExpiryDate = getFieldValue(form, "Card_ExpiryDate");
        Card_ExpiryDate_MM = getFieldValue(form, "Card_ExpiryDate_MM");
        Card_ExpiryDate_YY = getFieldValue(form, "Card_ExpiryDate_YY");
        Card_IssueNumber = getFieldValue(form, "Card_IssueNumber");
        Card_CV2 = getFieldValue(form, "Card_CV2");
    }

    if (BankDetails) {
        Bank_AccountName = getFieldValue(form, "Bank_AccountName");
        Bank_AccountNumber = getFieldValue(form, "Bank_AccountNumber");
        Bank_SortCode = getFieldValue(form, "Bank_SortCode");
        Bank_Name = getFieldValue(form, "Bank_Name");
        Bank_AddressLine1 = getFieldValue(form, "Bank_AddressLine1");
        Bank_AddressLine2 = getFieldValue(form, "Bank_AddressLine2");
        Bank_AddressLine3 = getFieldValue(form, "Bank_AddressLine3");
        Bank_AddressLine4 = getFieldValue(form, "Bank_AddressLine4");
        Bank_Country = getFieldValue(form, "Bank_Country");
        Bank_Postcode = getFieldValue(form, "Bank_Postcode");
    }
    if (PaymentDetails) {
        Product_OrderNumber = getFieldValue(form, "Product_OrderNumber");
        Product_PaymentMethod = getFieldValue(form, "Product_PaymentMethod");
    }
    // Mandatory fields
    if (CardDetails) {
        //        mMsg += mandatory(Card_Type, "\nCard Type")
        //        mMsg += mandatory(Card_Name, "\nCard Name")
        //        mMsg += mandatory(Card_Number, "\nCard Number")
        //        if ((Card_StartDate_MM != "" && Card_StartDate_YY == "") || (Card_StartDate_MM == "" && Card_StartDate_YY != "")) { mMsg += "\nCard Start Date incomplete" }
        //        //mMsg += mandatory(Card_ExpiryDate, "\nExpiry Date")
        //        mMsg += mandatory(Card_ExpiryDate_MM, "\nExpiry Date Month")
        //        mMsg += mandatory(Card_ExpiryDate_YY, "\nExpiry Date Year")
        //        //if (Card_Type == "Switch" && Card_StartDate_YY == "" && Card_IssueNumber == ""){mMsg += "\nCard Start Date or Issue Number"}
        //        if (Card_StartDate_YY == "" && Card_IssueNumber == "") { mMsg += "\nCard Start Date or Issue Number" }
        //        mMsg += mandatory(Card_CV2, "\nCV2 Number")
    }
    if (BankDetails) {
        mMsg += mandatory(Bank_AccountName, "\nBank Account Name")
        mMsg += mandatory(Bank_AccountNumber, "\nBank Account Number")
        mMsg += mandatory(Bank_SortCode, "\nBank Sort Code")
        mMsg += mandatory(Bank_Name, "\nBank Name")
        mMsg += mandatory(Bank_AddressLine1, "\nBank Address Line 1")
        mMsg += mandatory(Bank_AddressLine2, "\nBank Address Line 2")
        mMsg += mandatory(Bank_Postcode, "\nBank Postcode")
        if (!validPostcode(Bank_Postcode)) { vMsg += "\nPlease enter a valid Bank Postcode."; }
    }
    if (PersonDetails) {

        //mMsg += mandatory(Password, "\nPassword")

        mMsg += mandatory(Person_Email, "\nEmail Address")
        mMsg += mandatory(Person_Title, "\nTitle")
        mMsg += mandatory(Person_Forenames, "\nForenames")
        mMsg += mandatory(Person_Surname, "\nSurname")
        mMsg += mandatory(Person_DOB, "\nDate of Birth")
        if (Person_noNINumber != true && (Person_NINumber == "" || Person_NINumber == "#blank#")) { mMsg += "\nNational Insurance Number"; }
        mMsg += mandatory(Person_AddressLine1, "\n1st Line of Address")
        mMsg += mandatory(Person_AddressLine2, "\n2nd Line of Address")
        mMsg += mandatory(Person_Postcode, "\nPostcode")
        mMsg += mandatory(Product_EligibilityQ1, "\nResident in UK Question")
        //if (ContactDetails){
        //	mMsg += mandatory(Person_ContactAddressLine1, "\n1st Line of Contact Address")
        //	mMsg += mandatory(Person_ContactAddressLine2, "\n2nd Line of Contact Address")
        //	mMsg += mandatory(Person_ContactPostcode, "\nContact Postcode")			
        //}
    }
    if (mMsg > "") {
        for (var i = 0; i < form.elements.length; i++) {
            if (form.elements[i].value == "#blank#") {
                form.elements[i].value = "";
            }
        }
        alert("The following fields are mandatory and\ndo not appear to contain any data.\n" + mMsg);
        validForm = false;
    } else {

        if (PersonDetails) {
            if (form.elements["Password"] != null) { if (invalidChars(Password, upperChars + lowerChars + digits + "_")) { vMsg += "\nPassword (should only contain 'A-Z','a-z','0-9' or '_' characters)" } }
            if (form.elements["Password"] != null) { if (Password.length < 5 || Password.length > 25) { vMsg += "\nPassword should be between 5 and 25 characters long." } }
            if (form.elements["Person_Email"] != null) { if (!validEmail(Person_Email)) { vMsg += "\nEmail Address" } }
            if (!validDate(Person_DOB)) { vMsg += "\nDate of Birth."; }
            if (!calcAge(Person_DOB)) { vMsg += "\nYou must be over 18 to use this website."; }
            if (!validPostcode(Person_Postcode)) { vMsg += "\nPostcode for the Main Address."; }
            if (ContactDetails && !validPostcode(Person_ContactPostcode)) { vMsg += "\nPostcode for the Contact Address."; }
            if (!(Person_NINumber == "" || validNINumber(Person_NINumber))) {
                vMsg += "\nNational Insurance Number.";
            } else if (Person_NINumber.length != 0 && Person_noNINumber == true) {
                form.elements["Person_noNINumber"].checked = false;
            }
            if (invalidChars(Person_Telephone, digits + " ")) { vMsg += "\nTelephone Number."; }
            if (invalidChars(Person_FaxNumber, digits + " ")) { vMsg += "\nFax Number."; }
            if (invalidChars(Person_ContactTelephone, digits + " ")) { vMsg += "\nContact Telephone Number."; }
        }

        if (CardDetails) {
            validForm = true;
            //if (!validCardNumber(Card_Number)) { vMsg += "\nDebit Card Number."; }
            //if (!validShortDate(Card_StartDate)){vMsg += "\nStart Date";}
            //if (!validShortDate(Card_ExpiryDate)){vMsg += "\nExpiry Date";}
            //if (!validExpiraryDate(Card_StartDate, Card_ExpiryDate)){vMsg += "\nThe Start Date and Expiry Date combination is invalid";}
        }
        else {
            validForm = true;
            try {
                form.elements["btnSubmit"].disabled = true;
                form.elements["btnBack"].disabled = true;
                document.getElementById("btnSubmit").value = "Processing .. please wait";
            }
            catch (e) { }
        }
    }

    if (BankDetails) {
    }

    // Validate data
    if (validForm) {
        if (vMsg > "") {
            for (var i = 0; i < form.elements.length; i++) {
                if (form.elements[i].value == "#blank#") {
                    form.elements[i].value = "";
                }
            }
            alert("The following values do not seem to be valid:\n" + vMsg);
            validForm = false;
        } else {
            validForm = true;
            try {
                document.getElementById("btnSubmit").disabled = true;
                document.getElementById("btnBack").disabled = true;
                document.getElementById("btnSubmit").value = "Processing .. please wait";
            }
            catch (e) { }
        }
    }
    return validForm;
}

function mandatory(field, description)
{
	if (field == "" || field == "#blank#") {
		return description;
	} else {
		return "";
	}
}

function getFieldValue(form, fieldName, fieldType) 
{
	if (fieldType == "checkbox") {
		if (form.elements[fieldName].checked) {
			return true;
		} else {
			return false;
		}
	} else {
		if (form.elements[fieldName] != null) {		
			if (form.elements[fieldName].value == "") {
			    form.elements[fieldName].value = "";
			}
			return form.elements[fieldName].value;
		} else {
			return "";
		}
	}
}

function invalidChars(strTest, validChars) 
{
	if (strTest == "#blank#") { strTest = "" }
	if (strTest == "") {
		return false;
	} else {
		for (var i=0; i<strTest.length; i++) {
			if (validChars.indexOf(strTest.charAt(i)) < 0) {
			    return true;
			}
		}
		return false;
	}
}

function validPostcode(postcode)
{		
	var valid = false;
	var matchStr = "";
		
	if (postcode == "#blank#") {
	    postcode = ""
	}
	if (postcode == "") {
		return true;
	} else {
		for (var i=postcode.length-1; i>=0; --i) {
			pchar = postcode.charAt(i);
			if (pchar==' '){ 
			    matchStr += "";
			} else if (upperChars.indexOf(pchar)!=-1 || lowerChars.indexOf(pchar)!=-1) {
			    matchStr += "A";
			}
			else if (digits.indexOf(pchar)!=-1) {
			    matchStr += "9";
			}
		}
					
		if (matchStr=="AA99A") {valid=true;}
		else if (matchStr=="AA999A") { valid=true; }
		else if (matchStr=="AA9A9A") { valid=true; }
		else if (matchStr=="AA99AA") { valid=true; }
		else if (matchStr=="AA999AA") { valid=true; }
		else if (matchStr=="AA9A9AA") { valid=true; }
		else if (matchStr!="") { valid=true; }

		return valid;
	}
}

function validNINumber(NINumber)
{		
	var valid = false;
	var matchStr = "";

	if (NINumber == "#blank#") { NINumber = "" }
	if (NINumber == "") {
		return true;
	} else {
		for (var i=NINumber.length-1; i>=0; --i) {
			pchar = NINumber.charAt(i);
			if (pchar==' ') {
			    matchStr+=""
			}
			else if (upperChars.indexOf(pchar)!=-1 || lowerChars.indexOf(pchar)!=-1) {
			    matchStr += "A";
			}
			else if (digits.indexOf(pchar)!=-1) {
			    matchStr += "9";
			}
		}			
		if (matchStr=="A999999AA") {
		    valid=true;
		}
		return valid;
	}
}
		
function validEmail(email)
{
	if (email == "#blank#") { email = "" }
	if (email == ""){
		return true
	} else {
		var emailReg = "^[a-z0-9\-]+([_|-|\\.][a-z0-9]+)*\@([a-z0-9]+((-*)(\\.*)[a-z0-9]+)*\\.(com|edu|biz|org|gov|int|info|mil|net|arpa|name|museum|coop|aero|[a-z][a-z])|(\[\d{1,3}\\.\d{1,3}\\.\d{1,3}\\.\d{1,3}\]))$"; //"^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
		var regex = new RegExp(emailReg);
		return regex.test(email);
	}
}

function validSortCode(Bank_SortCode)
{
	//First remove all characters except for numbers
	var inputStr = Bank_SortCode.value;
	var outStr = "";

	for (var i=0; i < inputStr.length; i++) { 
       var c = inputStr.charAt(i);
       if (c != " " && !isNaN(c)) {
           outStr = outStr + c;            
        }
	}
	Bank_SortCode.value = outStr;
	
	//Then stage check the length of the string		    
	var str = Bank_SortCode.value;
	var bnk = str.substring(0,2);
	var length = str.length;
	if (length != 6) {
		alert("The Sort Code needs to be 6 numbers. Please correct.");
		Bank_SortCode.focus();
		return false;
	}
}

function validCardNumberp1(Card_Number)
{
	//remove all characters and spaces except for numbers
	var inputStr = Card_Number.value;
	var outStr = "";
	
	for (var i=0; i < inputStr.length; i++) { 
      	var c = inputStr.charAt(i);
		if (c != " " && !isNaN(c)) {
  	        outStr = outStr + c;            
        }
	}
	
	Card_Number.value = outStr;
}
		
function validCardNumber(cardNumber)
{
	var ch, chval;
	var bdouble = false;
	var result = 0;
	var retval = false;

	if (cardNumber == "#blank#"){cardNumber = ""}
	if (cardNumber == ""){
		return true;
	} else {		
		if (parseInt(cardNumber) != "NaN" || parseInt(cardNumber) != "0") {
			for (var i=cardNumber.length-1; i>=0; i--) {
				ch = cardNumber.substring(i,i+1);
				if (ch != ' ') {
					chval = parseInt(ch);
					if (bdouble == true) {
						chval = chval * 2;
						chval += '';
						if (chval.length > 1) {
							for (var j=0; j<chval.length; j++) {
								result += parseInt(chval.substring(j,j+1));
							}
						} else {
							result += parseInt(chval);
						}	
					} else {
						result += chval;
					}
					//toggle bdouble
					if (bdouble == true) {
						bdouble = false;
					} else {
						bdouble = true;
					}
				}
			}
			// convert result to a string
			result += '';
			// check the last digit to see if it is '0'
			if (result.substring(result.length - 1, result.length) == '0') {
				retval = true;
			}
		}	
		return retval;
	}
}

// UK Format Only
function validDate(dateStr)
{
	var valid = false;
	var ch = "";
	var day = "";
	var month = "";
	var year = "";
	var section = 0;
	
	if (dateStr == "#blank#"){dateStr = ""}
	if (dateStr == ""){
		return true;
	} else {
		// Check valid characters
		if (!invalidChars(dateStr, digits + "/")) {
			for (var i=0;i<dateStr.length;i++) {
				ch = dateStr.substring(i,i+1);
				if(ch == "/") {
					section += 1;
				} else {
					if (section ==0) { day += ch }
					if (section ==1) { month += ch }
					if (section ==2) { year += ch }
				}
			}
		}
		if (day > "" && month > "" && year > "") {
			var theDay = parseInt(day, 10);
			var theMonth = parseInt(month, 10);
			var theYear = parseInt(year, 10);
			var testDate = new Date("01/01/1900");
			
			testDate.setUTCFullYear(theYear);
			testDate.setUTCMonth(theMonth - 1);
			testDate.setUTCDate(theDay);
			
			var testYear = testDate.getUTCFullYear();
			var testMonth = testDate.getUTCMonth() + 1;
			var testDay = testDate.getUTCDate();
			
			if (theDay == testDay && theMonth == testMonth && theYear == testYear && theYear > 1000) {
				valid = true;
			}
		}
		return valid;
	}
}

function validShortDate(dateStr) 
{
	var valid = false;
	var ch = "";
	var day = "1";
	var month = "";
	var year = "";
	var section = 0;

	if (dateStr == "#blank#"){dateStr = ""}
	if (dateStr == "") {
		return true;
	} else {
		// Check valid characters
		if (!invalidChars(dateStr, digits + "/")) {
			for (var i=0;i<dateStr.length;i++) {
				ch = dateStr.substring(i,i+1);
				if(ch == "/") {
					section += 1;
				} else {
					if (section ==0) {month += ch}
					if (section ==1) {year += ch}
				}		
			}
		}
		if (day > "" && month > "" && year > "") {
			var theDay = 1;
			var theMonth = parseInt(month, 10);
			var theYear = parseInt(year, 10);

			if (theYear < 10) {theYear = parseInt("200" + theYear, 10);}
			else if (theYear < 50){theYear = parseInt("20" + theYear, 10);}
			else {theYear = parseInt("19" + theYear, 10);}

			var testDate = new Date("01/01/1900");
			testDate.setUTCFullYear(theYear);
			testDate.setUTCMonth(theMonth - 1);
			testDate.setUTCDate(theDay);
			
			var testYear = testDate.getUTCFullYear();
			var testMonth = testDate.getUTCMonth() + 1;
			var testDay = testDate.getUTCDate();
			
			if(theDay == testDay && theMonth == testMonth && theYear == testYear && theYear > 1000){
				valid = true;
			}
		}
		return valid;
	}
}

function validExpiraryDate(dateStart, dateEnd)
{
	var valid = false;
	var ch = "";
	var day = "1";
	var month = "";
	var year = "";
	var section = 0;
	
	for (var i=0; i<dateEnd.length; i++) {
		ch = dateEnd.substring(i,i+1);
		if(ch == "/") {
			section += 1;
		} else {
			if (section ==0){month += ch}
			if (section ==1){year += ch}
		}
	}	
	var theEndDay = 1;
	var theEndMonth = parseInt(month, 10);
	var theEndYear = parseInt(year, 10);
	var dateEndNew
	
	if (theEndYear < 10){theEndYear = parseInt("200" + theEndYear, 10);}
	else if (theEndYear < 50){theEndYear = parseInt("20" + theEndYear, 10);}
	else {theEndYear = parseInt("19" + theEndYear, 10);}
	
	dateEndNew = new Date(theEndYear, theEndMonth, theEndDay);
	
	if (dateEndNew < new Date()){
		return false;
	}
	
	//set the endDate
	ch = "";
	day = "1";
	month = "";
	year = "";
	section = 0;
	
	for (var i=0;i<dateStart.length;i++) {
		ch = dateStart.substring(i,i+1);
		if(ch == "/") {
			section += 1;
		} else {
			if (section ==0){month += ch}
			if (section ==1){year += ch}
		}
	}	
	var theStartDay = 1;
	var theStartMonth = parseInt(month, 10);
	var theStartYear = parseInt(year, 10);
	var dateStartNew;
	
	if (theStartYear < 10){theStartYear = parseInt("200" + theStartYear, 10);}
	else if (theStartYear < 50){theStartYear = parseInt("20" + theStartYear, 10);}
	else {theStartYear = parseInt("19" + theStartYear, 10);}
	dateStartNew = new Date(theStartYear, theStartMonth, theStartDay);	
	
	//Compare
	if (dateStartNew  > dateEndNew) {
		valid = false;
	} else {
		valid = true;
	}
	return valid;
}

function makeDaysOfMonth() 
{
    var i = 0;
    this[i++] = 0;
    this[i++] = 31;
    this[i++] = 29;
    this[i++] = 31;
    this[i++] = 30;
    this[i++] = 31;
    this[i++] = 30;
    this[i++] = 31;
    this[i++] = 31;
    this[i++] = 30;
    this[i++] = 31;
    this[i++] = 30;
    this[i  ] = 31;
    this.length = i;
}

function calcAge(person_DOB)
{

    //make sure the user is over 18
    var t, mon, day, year, DD, MM, YY, age;
    var valid = false
    var MTB = new makeDaysOfMonth();
    var mydate = person_DOB.split ("/");

    DD=mydate[0]
    MM=mydate[1]
    YY=mydate[2]

    if (MTB[MM] < DD || DD < 1) return -1;
    t = new Date();	// get current date
    year = t.getFullYear();	// get year of current
    mon = t.getMonth() + 1;	// get month of current
    day = t.getDate();	// get date of current
    age = year - YY;
    
    if ((MM > mon) || (MM == mon && day < DD)) age --; {
  	    if (age > 17) {
  	        valid = true;
  	    } else {
  	        valid = false;
  	    }
    }
    return valid;
}
		
function removeAlpha(obj) {
    var inputStr = obj.value;
    var outStr = "";
    for (var i=0; i < inputStr.length; i++) { 
        var c = inputStr.charAt(i);
        if (!isNaN(c) && c != " ") {
            outStr = outStr + c;            
        }
    }
    obj.value = outStr;
}

function checkEmail(obj) {
    if (obj.value.indexOf('@') == -1) {
    	alert("This is not a valid email format. Please check that you have entered it correctly.");
        obj.value = "";
        return;
    }
    if (obj.value.indexOf('.') == -1) {
    	alert("This is not a valid email format. Please check that you have entered it correctly.");
        obj.value = "";
        return;
    }
}