// Andrew D Foster  28/11/2008
today = new Date();
forceYear = today.getFullYear();
forceMonth = today.getMonth();
forceDay = today.getDate();

// Global Variables
var ipt = 5.0;									// %
var policyFee = 15.0;							// £
var minAge = 17;								// Minimum Age allowed to tow a caravan
var affiliateDiscount = 10.0;					// Affiliate Discount

// Essentials...
var rates = new Array(2, 2.2, 2.4, 999);	// Relative to the Claims Drop-Down (selectedIndex)
var ratePer = 100.0								// rate per (above)
var maxSI = 15000;								// Can't quote for anything over £20K
var minPrem = 75.00;							// This is checked prior to adding the ipt & policyFee
//  For every &pound;100...
//		0 Claims in last 3 years @ £2
//		1 Claim in last 3 years @ £2.20
//		2 Claims in last 3 years @ £2.40
//		3+ Claims in last 3 years = Refer
// + IPT
// + £10.00 fee


// Economy / Select
var eS_Per = 100.0								// rate per (below)
var eS_minPrem = 112.75;						// This is checked prior to adding the ipt & policyFee

// Economy
var e_Rate = 2.50;								// per £100 (above)
var e_PolicyFee = 15.0;							// Policy Fee
var e_ncd = new Array(15, 10, 5, 0);		// NCD Discount % (selectedIndex)
var e_storage = new Array(0, 25, 10, 10);		// Storage Location Discount % (selectedIndex-1)
var e_AgeCutOff = 50;							// Age Cut-Off for discount (below)
var e_AgeDiscount = 10;							// Age Discount (above)
var e_CaravanAgeDecline = 20;					// Decline if greater than this

// Select
var s_Rate = 2.10;								// per £100 (above)
var s_PolicyFee = 16.0;							// Policy Fee
var s_ncd = new Array(15, 10, 5, 0);		// NCD Discount % (selectedIndex)
var s_storage = new Array(0, 25, 10, 10);		// Storage Location Discount % (selectedIndex-1)
var s_AgeCutOff = 50;							// Age Cut-Off for discount (below)
var s_AgeDiscount = 10;							// Age Discount (above)
var s_CaravanAgeDecline = 5;					// Decline if greater than this
var s_AgeLoads = new Array(0, 10, 20, 30, 40, 50);	// %ge increase to SI prior to initial rating


// IMPORTANT!!!!
var formPos = 0;
var frm = null;


var nYearLast = "xx";
var nYear = 0;
var nClaimsLast = "xx";
var nClaims = 0;
var sInsuredLast = "xx";
var Insured = 0; 
var customerAgeLast = "xx";
var customerAge = 0;
var caravanMakeLast = "xx";
var caravanMake = "";
var caravanAgeLast = "xx";
var caravanAge = 0;
var caravanLocationLast = "xx";
var caravanLocation = 0;
var val = 0;

// Debugging funcs and data
var debugging = 0;
function innerRep(c, n)
{
	if(debugging == 1)
	{
		if(c == 1)
		{
			document.all.message.innerHTML = n + "<BR>";
		}
		else
		{
			document.all.message.innerHTML += n + "<BR>";
		}
	}
}

function calcEssentials()
{
	innerRep(0, "<BR>calcEssentials<BR>--------------");
	if(val == "")
	{
		// Can't quote yet!
		frm["N-Premium."].value = "";
		frm["N-IPT."].value = "";
		frm["N-TotalPayable."].value = "";
		innerRep(0, "Can't quote yet!");
	}
	else
	{
		if(nClaims == "3+" || caravanMake == "Not listed" || Number(val) > maxSI)
		{
			frm["N-Premium."].value = "";
			frm["N-IPT."].value = "";
			frm["N-TotalPayable."].value = "";
			innerRep(0, "3+ Claims or Not Listed Caravan or Sum Insured > &pound;" + maxSI + ".");
		}
		else
		{
			calcer = (Number(val) / ratePer) * rates[nClaims];
			innerRep(0, "Base Rate: (&pound;" + val + " / " + ratePer + ") * " + rates[nClaims] + " = &pound;" + calcer);
			if(calcer < minPrem)
			{	// Minimum Premium
				calcer = minPrem;
				innerRep(0, "Minimum Premium met: &pound;" + calcer);
			}
			frm["N-Premium."].value = formatNumber(calcer, 100, 2, 0, 0);
			iptVal = (calcer / 100.0) * ipt;
			frm["N-IPT."].value = formatNumber(iptVal, 100, 2, 0, 0);
			calcer = calcer + iptVal + policyFee;
			frm["N-TotalPayable."].value = formatNumber(calcer, 100, 2, 0, 0);
		}
	}
} // End calcEssentials function


function calcEconomy()
{
	innerRep(0, "<BR>calcEconomy<BR>-----------");
	if(val == "" || customerAge < minAge || caravanLocation == -1)
	{
		// Can't quote yet!
		frm["N-EconomyPremium."].value = "";
		frm["N-EconomyIPT."].value = "";
		frm["N-EconomyTotalPayable."].value = "";
		innerRep(0, "Can't quote yet!");
	}
	else
	{
		if(nClaims == "3+" || caravanMake == "Not listed" || caravanAge > e_CaravanAgeDecline)
		{
			frm["N-EconomyPremium."].value = "";
			frm["N-EconomyIPT."].value = "";
			frm["N-EconomyTotalPayable."].value = "";
			innerRep(0, "4+ Claims or Not Listed Caravan or Caravan Age > " + e_CaravanAgeDecline + ".");
		}
		else
		{
			// Base Rate
			calcer = (Number(val) / eS_Per) * e_Rate;
			innerRep(0, "Base Rate: (&pound;" + val + " / " + eS_Per + ") * " + e_Rate + " = &pound;" + calcer);
			
			// NCD
			calcer -= (calcer / 100.0) * e_ncd[nClaims];
			innerRep(0, "NCD @ " + e_ncd[nClaims] + "% = &pound;" + calcer);

			// Storage Location
			calcer -= (calcer / 100.0) * e_storage[caravanLocation];
			innerRep(0, "Storage Location (" + frm["N-StorageLocation"][caravanLocation+1].text + ") @ " + e_storage[caravanLocation] + "% = &pound;" + calcer);
			
			// Customer Age
			if(customerAge > e_AgeCutOff)
			{
				calcer -= (calcer / 100.0) * e_AgeDiscount;
				innerRep(0, "Customer Age Discount @ " + e_AgeDiscount + "% = &pound;" + calcer);
			}

			// Affiliate Discount
			calcer -= (calcer / 100.0) * affiliateDiscount;
			innerRep(0, "Affiliate Discount @ " + affiliateDiscount + "% = &pound;" + calcer);
			
			if(calcer < eS_minPrem)
			{	// Minimum Premium
				calcer = eS_minPrem;
				innerRep(0, "Minimum Premium met: &pound;" + calcer);
			}
			
			frm["N-EconomyPremium."].value = formatNumber(calcer, 100, 2, 0, 0);
			iptVal = (calcer / 100.0) * ipt;
			frm["N-EconomyIPT."].value = formatNumber(iptVal, 100, 2, 0, 0);
			calcer = calcer + iptVal + e_PolicyFee;
			frm["N-EconomyTotalPayable."].value = formatNumber(calcer, 100, 2, 0, 0);
		}
	}
} // End calcEconomy function


function calcSelect()
{
	innerRep(0, "<BR>calcSelect<BR>----------");
	if(val == "" || customerAge < minAge || caravanLocation == -1)
	{
		// Can't quote yet!
		frm["N-SelectPremium."].value = "";
		frm["N-SelectIPT."].value = "";
		frm["N-SelectTotalPayable."].value = "";
		innerRep(0, "Can't quote yet!");
	}
	else
	{
		if(nClaims == "3+" || caravanMake == "Not listed" || caravanAge > s_CaravanAgeDecline)
		{
			frm["N-SelectPremium."].value = "";
			frm["N-SelectIPT."].value = "";
			frm["N-SelectTotalPayable."].value = "";
			innerRep(0, "4+ Claims or Not Listed Caravan or Caravan Age > " + s_CaravanAgeDecline + ".");
		}
		else
		{
			// Base Rate defined by caravan age & SI
			cAge = caravanAge;
			maxAgeLoad = s_AgeLoads.length-1;
			if(cAge > maxAgeLoad)
			{
				cAge = maxAgeLoad;
			}
			useVal = ((Number(val) / 100.0) * s_AgeLoads[cAge]);
			innerRep(0, "Loaded SI: (&pound;" + val + " + ((&pound;" + val + " / 100.0) * " + s_AgeLoads[cAge] + "% [" + cAge + " year(s)]) = &pound;" + val + " + &pound;" + useVal + " = &pound;" + (Number(val)+useVal));
			useVal = Number(val) + useVal;
			calcer = (Number(useVal) / eS_Per) * s_Rate;
			innerRep(0, "Base Rate: (&pound;" + useVal + " / " + eS_Per + ") * " + s_Rate + " = &pound;" + calcer);
			
			// NCD
			calcer -= (calcer / 100.0) * s_ncd[nClaims];
			innerRep(0, "NCD @ " + s_ncd[nClaims] + "% = &pound;" + calcer);

			// Storage Location
			calcer -= (calcer / 100.0) * s_storage[caravanLocation];
			innerRep(0, "Storage Location (" + frm["N-StorageLocation"][caravanLocation+1].text + ") @ " + s_storage[caravanLocation] + "% = &pound;" + calcer);
			
			// Customer Age
			if(customerAge > s_AgeCutOff)
			{
				calcer -= (calcer / 100.0) * s_AgeDiscount;
				innerRep(0, "Customer Age Discount @ " + s_AgeDiscount + "% = &pound;" + calcer);
			}

			// Affiliate Discount
			calcer -= (calcer / 100.0) * affiliateDiscount;
			innerRep(0, "Affiliate Discount @ " + affiliateDiscount + "% = &pound;" + calcer);
			
			if(calcer < eS_minPrem)
			{	// Minimum Premium
				calcer = eS_minPrem;
				innerRep(0, "Minimum Premium met: &pound;" + calcer);
			}

			frm["N-SelectPremium."].value = formatNumber(calcer, 100, 2, 0, 0);
			iptVal = (calcer / 100.0) * ipt;
			frm["N-SelectIPT."].value = formatNumber(iptVal, 100, 2, 0, 0);
			calcer = calcer + iptVal + s_PolicyFee;
			frm["N-SelectTotalPayable."].value = formatNumber(calcer, 100, 2, 0, 0);
		}
	}
} // End calcSelect function


function getGlobals(quickQuote, big)
{
	innerRep(1, "getGlobals (" + Math.random() + ")...");
	frm["N-PolicyFee."].value = formatNumber(policyFee, 100, 2, 0, 0);

	if(big == 1)
	{
		frm["N-ePolicyFee."].value = formatNumber(e_PolicyFee, 100, 2, 0, 0);
		frm["N-sPolicyFee."].value = formatNumber(s_PolicyFee, 100, 2, 0, 0);
		// Can now force Date entry
		dateOK = dateCheck("document.forms[" + formPos + "]", "dob");
		if(dateOK)
		{
			nDate = new Date(frm["N-dob."].value + "");
			customerAge = calcAge(nDate, today);
		}
		else
		{
			customerAge = 0;
		}
		innerRep(0, "Customer's age: (" + customerAge + ")");
		frm["N-CustomerAge."].value = customerAge;
	}
	else
	{
		customerAge = 0;
	}

	frm["N-IPTPerc."].value = ipt;
	if(quickQuote == 1)
	{
		// We are going to assume a lot of things based on the fact 
		// that this is a price indication and not a full quote
		nClaims = 0;
		caravanMake = "";
	}
	else
	{
		// Full Quote, check everything
		nClaims = frm["N-Claims"].value;
		caravanMake = frm["N-CaravanMake"].value;
	}

	if(big == 1)
	{
		sYear = frm["N-YearOfManufacture."].value; 
		nYear = Number(formatNumber(sYear, 1, 0, 0, 1));
		if(frm["N-YearOfManufacture."].value != nYear)
		{
			frm["N-YearOfManufacture."].value = nYear;
		}
		if(nYear != nYearLast)
		{
			if(forceYear-nYear < 0)
			{
				nYear = forceYear;
			}
		}
		if(nYear != 0)
		{
			frm["N-YearOfManufacture."].value = nYear;
		}
		caravanAge = forceYear - nYear;
		if(caravanAge == forceYear)
		{
			caravanAge = 0;
		}
		innerRep(0, "Caravan age: " + caravanAge);
		frm["N-CaravanAge."].value = caravanAge;

		caravanLocation = frm["N-StorageLocation"].selectedIndex-1;
		innerRep(0, "Caravan Location: " + caravanLocation);
	}
	else
	{
		nYear = 0;
		caravanAge = 0;
		caravanLocation = "";
	}

	sInsured = frm["N-SumInsured."].value; 
	val = formatNumber(sInsured, 1, 0, 0, 1);
	if(frm["N-SumInsured."].value != val)
	{
		frm["N-SumInsured."].value = val;
	}
	innerRep(0, "val=" + val);

	if(nYear != nYearLast || customerAgeLast != customerAge || caravanAgeLast != caravanAge || caravanLocationLast != caravanLocation || nClaims != nClaimsLast || sInsured != sInsuredLast || caravanMakeLast != caravanMake)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function setNext()
{
	nYearLast = nYear;
	nClaimsLast = nClaims;
	sInsuredLast = sInsured; 
	customerAgeLast = customerAge;
	caravanAgeLast = caravanAge;
	caravanLocationLast = caravanLocation;
}

function checkChanges(quickQuote, big, essentials, others)
{
	// Global Values
	gotter = getGlobals(quickQuote, big);
	innerRep(0, "getGlobals(" + quickQuote + ", " + big + ") = " + gotter);
	if(gotter)
	{
		// Calc All
		if(essentials == 1)
		{
			calcEssentials();
		}
		if(others == 1)
		{
			calcEconomy();
			calcSelect();
		}
		// Make read for next time round
		setNext();
	}
	window.setTimeout("checkChanges(" + quickQuote + ", " + big + ", " + essentials + ", " + others + ");", 100);
}

function check(big)
{
	// This function is called when the user clicks the Quote Button, we need it to ensure all the fields have been populated.
	errorText = "";
	document.all.message.innerHTML = errorText;

	if(frm["N-Title"].value == "")
	{
		errorText += "<LI>Title is required.</LI>";
	}
	if(frm["N-First Name."].value == "")
	{
		errorText += "<LI>First Name(s) is required.</LI>";
	}
	if(frm["N-Surname."].value == "")
	{
		errorText += "<LI>Surname is required.</LI>";
    }
    if (frm["N-Postcode."].value == "") {
        errorText += "<LI>Postcode is required.</LI>";
    }
	
	if(big == 1)
	{
		if(!dateCheck("document.forms[" + formPos + "]", "dob"))
		{
			errorText += "<LI>Date of birth is required.</LI>";
		}
		else
		{
			if(!forcePastDate("document.forms[" + formPos + "]", "dob", "Date of Birth"))
			{
				errorText += "<LI>Date of birth should be in the past.</LI>";
			}
		}
	}

	if(frm["N-Email."].value == "")
	{
		errorText += "<LI>Email is required.</LI>";
	}
	if(frm["N-ContactNumber."].value == "")
	{
		errorText += "<LI>Contact Number is required.</LI>";
	}
	if(frm["N-CaravanMake"].value == "")
	{
		errorText += "<LI>Caravan make is required.</LI>";
	}
	if(big == 1)
	{
		if(frm["N-YearOfManufacture."].value == "")
		{
			errorText += "<LI>Year of manufacture is required.</LI>";
		}
		if(frm["N-StorageLocation"].value == "")
		{
			errorText += "<LI>Storage location is required.</LI>";
		}
	}
	if(frm["N-Claims"].value == "")
	{
		errorText += "<LI>Number of claims is required.</LI>";
	}
	if(frm["N-SumInsured."].value == "")
	{
		errorText += "<LI>Sum insured value (&pound;) is required.</LI>";
	}
	
	if(errorText == "")
	{
		return true;
	}
	else
	{
		document.all.push.focus();
		document.all.errors.innerHTML = "<BR><CENTER><B>The following errors and/or ommissions were found...</B><TABLE><TR><TD align=left><OL>" + errorText + "</OL></TD></TR></TABLE></CENTER>";
		//scrollTo(0);
		top.focus();
		return false;
	}
}


// Onload = getMultiParameters(...)
function getMultiParameters(quickQuote)
{
	frm = document.forms[formPos];

	// Get any possible post parameters and populate...
	frm["N-SumInsured."].value = gup("N-SumInsured.");
	frm["N-Agent."].value = gup("N-Agent.");
	debugging = Number(gup("debug"));

	// Setup ready for actual use
	for(yyyy = forceYear-65; yyyy <= forceYear-minAge; yyyy++)
	{
		addYearItem(frm["N-dob_yyyy"], yyyy, yyyy);
	}
	if(frm["N-dob."].value != "")
	{
		nDate = new Date(frm["N-dob."].value);
		frm["N-dob_yyyy"].value = nDate.getFullYear();
	}
	else
	{
		frm["N-dob_yyyy"].selectedIndex = 0;
	}

	// Start the calculation routine
	checkChanges(quickQuote, 1, 1, 1);
}

// Onload = getParameters(...)
function getParameters(quickQuote)
{
	frm = document.forms[formPos];

	// Get any possible post parameters and populate...
	frm["N-SumInsured."].value = gup("N-SumInsured.");
	frm["N-Agent."].value = gup("N-Agent.");
	debugging = Number(gup("debug"));

	innerRep(1, "debugging: " + debugging);

	// Start the calculation routine
	checkChanges(quickQuote, 0, 1, 0);
}

