function validate(formName)
{
    var error = "";
    var formElementNameForDisplayReg = /^[a-zA-Z0-9\- ?]*$/;     //make sure the display name passed in in the form is valid (avoid XSS problems)
    var i;
    var details;
    var currentField;
    var f = eval("document."+formName);
    if (f._required)
    {
        var required = f._required.value.split(",");
        for (i=0;i<required.length;i++)
        {
            details = required[i].split(":");
            currentField = eval("f."+details[0]);
            if (currentField.value.length < 1)
            {
                if (formElementNameForDisplayReg.test(details[1]))
                {
                    error = error+"Please enter "+details[1]+"\n";
                }
                else
                {
                    error = "Please fill in all required fields.\n";
                }
            }
        }
    }
    if (f._requiredRadio)
    {
        var j;
        var foundChecked;
        var requiredRadio = f._requiredRadio.value.split(",");
        for (i=0;i<requiredRadio.length;i++)
        {
            foundChecked = false;
            details = requiredRadio[i].split(":");
            currentField = eval("f."+details[0]);
            for (j=0;j<currentField.length;j++)
            {
                if (currentField[j].checked)
                {
                    foundChecked = true;
                }
            }
            if (!foundChecked)
            {
                if (formElementNameForDisplayReg.test(details[1]))
                {
                    error = error+"Please enter "+details[1]+"\n";
                }
                else
                {
                    alert(details[1]);
                    error = "Please fill in all required fields.\n";
                }
            }
        }
    }
    if (f._date)
    {
        var dateReg = /^(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/;
        if (f._date.value.length > 0)
        {
            var date = f._date.value.split(",");
            for (i=0;i<date.length;i++)
            {
                details = date[i].split(":");
                currentField = eval("f."+details[0]);
                if (currentField.value.length > 0 && !dateReg.test(currentField.value))
                {
                    if (formElementNameForDisplayReg.test(details[1]))
                    {
                        error = error+"Please enter a valid date for "+details[1]+"\n";
                    }
                    else
                    {
                        error = error+"Please fill in a valid date.\n";
                    }
                }
            }
        }
    }
    if (f._email)
    {
        var mailReg = /^[a-zA-Z0-9][a-zA-Z0-9\-\.'_]*@[a-zA-Z0-9][a-zA-Z0-9\-\.]*\.([a-zA-Z]{2,6})$/; 
        if (f._email.value.length > 0)
        {
            var email = f._email.value.split(",");
            for (i=0;i<email.length;i++)
            {
                details = email[i].split(":");
                currentField = eval("f."+details[0]);
                if (currentField.value.length > 0 && !mailReg.test(currentField.value))
                {
                    if (formElementNameForDisplayReg.test(details[1]))
                    {
                        error = error+"Please enter a valid email address for "+details[1]+"\n";
                    }
                    else
                    {
                        error = error+"Please enter a valid email address.\n";
                    }
                }
            }
        }
    }
    if (f._phone)
    {
        var phoneReg = /^[0-9 \-\+\(\)]*$/;
        if (f._phone.value.length > 0)
        {
            var phone = f._phone.value.split(",");
            for (i=0;i<phone.length;i++)
            {
                details = phone[i].split(":");
                currentField = eval("f."+details[0]);
                if (currentField.value.length > 0 && !phoneReg.test(currentField.value))
                {
                    if (formElementNameForDisplayReg.test(details[1]))
                    {
                        error = error + details[1] + " must be a valid phone number.\n";
                    }
                    else
                    {
                        error = error+"Please enter a valid phone number.\n";
                    }
                }
            }
        }
    }
    if (f._number)
    {
        var numberReg = /^[0-9]*$/;
        if (f._number.value.length > 0)
        {
            var phone = f._number.value.split(",");
            for (i=0;i<phone.length;i++)
            {
                details = phone[i].split(":");
                currentField = eval("f."+details[0]);
                if (currentField.value.length > 0 && !numberReg.test(currentField.value))
                {
                    if (formElementNameForDisplayReg.test(details[1]))
                    {
                        error = error + details[1] + " must be a number.\n";
                    }
                    else
                    {
                        error = error+"Please enter a number.\n";
                    }
                }
            }
        }
    }
    if (formName == 'quoteForm')
    {
        if ((f.contents_sum_insured.value == "0") && (f.buildings_sum_insured.value == "0"))
        {
            error = error+"Please select a value for Buildings sum insured or Contents sum insured.\n";
        }
        if (f.dob_day.value.length<1 || f.dob_month.value.length<1 || f.dob_year.value.length<1)
        {
            error = error+"Please enter Your date of birth.\n";
        }
        if (!f.agree_with_assumptions.checked)
        {
            error = error+"Please indicate that you agree with our assumptions.\n";
        }
        if (f.previously_insured[0].checked && f.years_without_a_claim.value!="0")
        {
            error = error+"You have indicated that the property was not previously insured, but you have entered a non-zero value for Years without a claim.\n";
        }
        
        /* 
            all risks validation  - only perform if all other validation is correct, so we can
            switch to the all risks form if there is a problem
        */
        if (error == "")
        {
            error = validateAllRisks(f);
            if (error != "")
            {
                showAllRisksForm(true);
                showMainQuoteForm(false);
            }
        }
    }
    if (formName == 'mtaForm')
    {
        if ((f.contents_sum_insured.value == "0") && (f.buildings_sum_insured.value == "0"))
        {
            error = error+"Please select a value for Buildings sum insured or Contents sum insured.\n";
        }
        if ((f.title2.value || f.firstname2.value || f.lastname2.value) && !(f.title2.value && f.firstname2.value && f.lastname2.value))
        {
            error = error+"Please enter the other proposer's full name.\n";
        }
        //Check that we have at last 2 lines of a postal address (if it's not left blank)
        if (
            !(f.postalAddress1.value && f.postalAddress2.value) && !(f.postalAddress2.value && f.postalAddress3.value) && !(f.postalAddress3.value && f.postalAddress1.value)
        )
        {
            error = error+"Please enter at least two lines for your postal address.\n";
        }
        error = error+validateAllRisks(f);
    }
    if (formName == 'quoteRetrieveForm')
    {
        var refReg = /^[0-9]+\-[0-9]+$/;
        if (f.reference && (f.reference.value.length > 0))
        {
            if (!refReg.test(f.reference.value))
            {
                error = error+"Please enter a valid Quote reference number.\n";
            }
        }
    }
    if (formName == 'policyNumberRange') 
    {
        if (parseInt(f.from.value) > parseInt(f.to.value))
        {
            error = error+"Lowest number must be less than highest number.\n";
        }
    }
    if (formName == 'lifeForm')
    {
        if (f.fCovertype.value == 'DTA' || f.fCovertype.value == 'MTA')
        {
            if (f.finterest.value.length<1)
            {
                error = error+"Please enter Mortgage interest rate.\n";
            }
        }
        else
        {
            if (f.fConversion.value.length<1)
            {
                error = error+"Please indicate whether you wish to be able to renew your insurance under the same terms when the term is complete.\n";
            }
        }
        if (document.getElementById('flives1').checked || document.getElementById('flives2').checked)
        {
            if (f.flcsa1.value.length<1)
            {
                error = error+"Please enter Sum assured for Insured person 1.\n";
            }
            if (f.dob_day1.value.length<1 || f.dob_month1.value.length<1 || f.dob_year1.value.length<1)
            {
                error = error+"Please enter Date of birth for Insured person 1.\n";
            }
            if (f.fsex1.value.length<1)
            {
                error = error+"Please enter Sex for Insured person 1.\n";
            }
            if (f.fsmoker1.value.length<1)
            {
                error = error+"Please enter Smoker? for Insured person 1.\n";
            }
            if (document.getElementById('flives2').checked)
            {
                if (f.fjointcoverbasis.value.length<1)
                {
                    error = error+"Please enter Cover basis.\n";
                }
                if (f.flcsa2.value.length<1)
                {
                    error = error+"Please enter Sum assured for Insured person 2.\n";
                }
                if (f.dob_day2.value.length<1 || f.dob_month2.value.length<1 || f.dob_year2.value.length<1)
                {
                    error = error+"Please enter Date of birth for Insured person 2.\n";
                }
                if (f.fsex2.value.length<1)
                {
                    error = error+"Please enter Sex for Insured person 2.\n";
                }
                if (f.fsmoker2.value.length<1)
                {
                    error = error+"Please enter Smoker? for Insured person 2.\n";
                }
            }
            if (f.fCovertype.value == 'MTA')
            {
                if (f.fcisa1.value.length<1)
                {
                    error = error+"Please enter Serious illness sum insured for Insured person 1.\n";
                }
                else
                {
                    if ((f.flcsa1.value.length>0) && (parseInt(f.flcsa1.value) < parseInt(f.fcisa1.value)))
                    {
                        error = error+"Serious illness sum insured must be less than or equal to Sum assured for Insured person 1.\n";
                    }
                }
                if (document.getElementById('flives2').checked && f.fcisa2.value.length<1)
                {
                    error = error+"Please enter Serious illness sum insured for Insured person 2.\n";
                }
                else 
                {
                    if ((f.flcsa2.value.length>0) && (parseInt(f.flcsa2.value) < parseInt(f.fcisa2.value)))
                    {
                        error = error+"Serious illness sum insured must be less than or equal to Sum assured for Insured person 2.\n";
                    }
                }
            }
        }
        if (parseInt(f.fterm.value) > 40)
        {
            error = error+"The maximum Term is 40 years. Please enter a lower number for Term in years.";
        }
        if (!f.terms.checked)
        {
            error = error+"Please indicate that you have been given the opportunity to read our terms of business.\n";
        }
    }
    /* Selects the direct debit payment form - _requiredRadio isn't set for the cc payment form */
    if ((formName == 'paymentForm') && (f._requiredRadio))
    {
        if (!f.terms.checked)
        {
            error = error+"Please indicate that you agree to our terms and conditions.\n";
        }
    }
    if (error != "")
    {
        alert(error);
        return false;
    }
    else
    {
        if (formName == 'quoteForm')
        {
            return validateNoClaims();
        } 
        else 
        {
            return true;
        }
    }
}

function validateAllRisks(form)
{
    var error = "";
    var itemDescriptionField;
    var itemTypeField;
    var itemValueField;
    for (i=0;i<10;i++) 
    {
        itemDescriptionField = eval('form.allrisks_itemDescription'+i);
        itemTypeField = eval('form.allrisks_itemType'+i);
        itemValueField = eval('form.allrisks_itemValue'+i);
        if ((itemDescriptionField.value != "" ||  itemTypeField.value != "" || itemValueField.value != "") && (itemDescriptionField.value == "" ||  itemTypeField.value == "" || itemValueField.value == ""))
        {
            error = error+"Please enter item description AND item type AND item value for All Risks item number " + (i+1) + "\n";
        }
    }
    return error;
}

function validateQuotePersonalDetailsForm()
{
    var error = "";
    var f = eval("document.quotePersonalDetailsForm");
    if ((!(f.title.value && f.firstname.value && f.lastname.value))||(f.firstname.value == 'Enter Firstname')||(f.lastname.value == 'Enter Surname'))
    {
        error = error+"Please enter your full name.\n";
    }
    if (((f.title2.value) && ((f.firstname2.value == 'Enter Firstname') ||(f.lastname2.value == 'Enter Surname')))||(!(f.title2.value) && ((f.firstname2.value != 'Enter Firstname') ||(f.lastname2.value != 'Enter Surname'))))
    {
        error = error+"Please enter the other proposer's full name.\n";
    }
    
    if (f.occupation.value.length < 1)
    {
        error = error+"Please select an occupation.\n";
    }
    var dateReg = /^20[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/;
    if ((f.cover_start_date.value.length != 10) || !dateReg.test(f.cover_start_date.value))
    {
        error = error+"Please enter a valid start date for your cover.\n";
        //NOTE: Date range checking carried out on server side only
        //The reason for this is Date.getMonth() returns 0 for January, 1 for Feb, etc - I didn't realise
        //this was supposed to happen and thought maybe the function was broken in FF. 
        //Will go back and do the client-side validation when I get a chance
    }
    //Check that we have at last 2 lines of a postal address (if it's not left blank)
    if (
        (f.postalAddress1.value || f.postalAddress2.value || f.postalAddress2.value)
        &&
        !(f.postalAddress1.value && f.postalAddress2.value) && !(f.postalAddress2.value && f.postalAddress3.value) && !(f.postalAddress3.value && f.postalAddress1.value))
    {
        error = error+"Please enter at least two lines for your postal address.\n";
    }
    if (!f.terms.checked)
    {
        error = error+"Please indicate that you have been given the opportunity to read our terms of business.\n";
    }
    if (error != "")
    {
        alert(error);
        return false;
    }
    else
    {
        return true;
    }
}

function validateAdminRiskAddressForm()
{
    var f = document.getElementById('viewPolicyRiskAddressUpdate');
    //Check that we have at least 2 lines for the risk address
    if (!(f.address1.value && f.address2.value) && !(f.address2.value && f.address3.value) && !(f.address3.value && f.address1.value))
    {
        alert ("Please enter at least two lines for Risk address.\n");
        return false;
    }
    return true;
}

function validateAdminDiscountsForm()
{
    var error = "";
    var f = eval("document.adminDiscountsForm");
    var a = f.discountAmount.value;  
	
    if (f.discountCode.value.length < 1)
    {
        error = error+"Please enter a Discount Code.\n";
    }
    if (a.indexOf(".") != -1) 
    {
        var temp = a.split('.');
        if (isNaN(temp[0]) || isNaN(temp[1]) || (a =='0.00')){
            error = error+"Please enter a valid numeric value for Discount Amount.\n";
        }
    } else if (isNaN(a)){
            error = error+"Please enter a numeric value for Discount Amount.\n";
    }
    
    if ((f.dateStart.value.length != 10) || (f.dateStart.value =='yyyy-mm-dd'))
    {
        error = error+"Please enter a valid start date for the Discount.\n";
        //NOTE: Date range checking carried out on server side only
        //The reason for this is Date.getMonth() returns 0 for January, 1 for Feb, etc - I didn't realise
        //this was supposed to happen and thought maybe the function was broken in FF. 
        //Will go back and do the client-side validation when I get a chance
    }
    if ((f.dateExpiry.value.length != 10) || (f.dateExpiry.value =='yyyy-mm-dd'))
    {
        error = error+"Please enter a valid expiry date for the Discount.\n";
        //NOTE: Date range checking carried out on server side only
        //The reason for this is Date.getMonth() returns 0 for January, 1 for Feb, etc - I didn't realise
        //this was supposed to happen and thought maybe the function was broken in FF. 
        //Will go back and do the client-side validation when I get a chance
    }
    if (isNaN(f.usesPerCoupon.value))
    {
        error = error+"Please enter a valid number for Uses of Coupon.\n";
    }
    
    if (error != "")
    {
        alert(error);
        return false;
    }
    else
    {
        return true;
    }
}