﻿// JScript File
var ServerCurrentDate = new Date();


var boolSystemDate = false;
var BaseValues = null;
var BaseValues_5 = null;
var BaseValues_10 = null;
var BaseValues_25 = null;
var BaseValuesA_1 = null;
var BaseValuesA_2 = null;
var BaseValuesA_5 = null;
var StatePension = 209.30;
var StartErrorMessage = "Please correct the following mistakes before continuing:\n";
var PensionsPremiumCharge = 0.05;
var PensionsAnnualGrowthRate = 0.06;
var PensionsAnnualManagementFee = 0.01;
var PensionsInflation = 0.03;
var PensionsSpousesPensionsFactor = 0.5;
var initialCalculationWait =1000;
var graphCalculationWait = 1000;
var MaximumAgeReached = "The retirement age exceeds the upper limit of 75"


function getTerm(DateNow,DateBorn,RetirementAge) {
	DateNow.setHours(0);
	DateNow.setMinutes(0);
	DateNow.setSeconds(0);
	DateBorn.setHours(0);
	DateBorn.setMinutes(0);
	DateBorn.setSeconds(0);
	DateBorn.setMonth(DateBorn.getMonth()+1);
	DateBorn.setDate(0)
	var YearsToRetirement = ((RetirementAge - (DateNow.getFullYear()-DateBorn.getFullYear() + (DateNow.getMonth()-DateBorn.getMonth())/12)))
	return YearsToRetirement;
	}
	
	function getMin(v1,v2) {
	if (v1>v2) return v2;
	return v1;
}


function convertEuro(amt) {
	return formatNumber(amt, "€,##0.00", false);
	}
	
	
function FillResults(resultObject) {
	var FormElement = document.getElementById("aspnetForm");
	FormElement.yearlyPension.value = convertEuro(resultObject.YearlyPension);
	FormElement.projectedWeeklyPension.value = convertEuro(resultObject.projectedWeeklyPension);
    FormElement.weeklyPension.value = convertEuro(resultObject.WeeklyPension);
    FormElement.taxFreeLumpSum.value = convertEuro(resultObject.TaxFreeLumpSum);
    FormElement.statePension.value = convertEuro(StatePension);
    FormElement.weeklyIncome.value = convertEuro(resultObject.WeeklyPension+StatePension);
}



function IncreaseByPercent(AmountContribution,increasePercent) {
	var retAmount = parseInt(AmountContribution) + (parseInt(AmountContribution)/100)*increasePercent;
	return retAmount;
	}
	
	
	
	
function IncreaseByAmount(AmountContribution,increaseAmt) {
	var retAmount = parseInt(AmountContribution) + parseInt(increaseAmt);
	return retAmount;
	}
	
	
function LoadBaseValues(argObjPassedDOB,argObjPassedSex,argObjPassedAge,argObjPassedContribution,argObjPassedPartner,argObjPassedTaxFreeSum,CurrentDate) {

	this.argObjPassedDOB=argObjPassedDOB;
	this.argObjPassedSex=argObjPassedSex;
	this.argObjPassedAge=argObjPassedAge;
	this.argObjPassedContribution=argObjPassedContribution;
	this.argObjPassedPartner=argObjPassedPartner;
	this.argObjPassedTaxFreeSum=argObjPassedTaxFreeSum;
	this.CurrentDate=CurrentDate;
}
function checkAge(val){
	if (val ==0) {
		return false;
		}
	else {
		return true;
		}
	}	
	
	
	
 var separator = ",";
  var decpoint = ".";
  var percent = "%";
  var currency = "€";



function formatNumber(number, format, print) {  
	if (number - 0 != number) return null;  
	var useSeparator = format.indexOf(separator) != -1;  
	var usePercent = format.indexOf(percent) != -1;  
	var useCurrency = format.indexOf(currency) != -1;  
    var isNegative = (number < 0);
    number = Math.abs (number);
    if (usePercent) number *= 100;
    format = strip(format, separator + percent + currency);  // remove key characters
    number = "" + number;

    var dec = number.indexOf(decpoint) != -1;
    var nleftEnd = (dec) ? number.substring(0, number.indexOf(".")) : number;
    var nrightEnd = (dec) ? number.substring(number.indexOf(".") + 1) : "";

    dec = format.indexOf(decpoint) != -1;
    var sleftEnd = (dec) ? format.substring(0, format.indexOf(".")) : format;
    var srightEnd = (dec) ? format.substring(format.indexOf(".") + 1) : "";

    if (srightEnd.length < nrightEnd.length) {
      var nextChar = nrightEnd.charAt(srightEnd.length) - 0;
      nrightEnd = nrightEnd.substring(0, srightEnd.length);
      if (nextChar >= 5) nrightEnd = "" + ((nrightEnd - 0) + 1); 
      while (srightEnd.length > nrightEnd.length) {
        nrightEnd = "0" + nrightEnd;
      }

      if (srightEnd.length < nrightEnd.length) {
        nrightEnd = nrightEnd.substring(1);
        nleftEnd = (nleftEnd - 0) + 1;
      }
    } else {
      for (var i=nrightEnd.length; srightEnd.length > nrightEnd.length; i++) {
        if (srightEnd.charAt(i) == "0") nrightEnd += "0";
        else break;
      }
    }
    sleftEnd = strip(sleftEnd, "#");
    while (sleftEnd.length > nleftEnd.length) {
      nleftEnd = "0" + nleftEnd;
    }

    if (useSeparator) nleftEnd = separate(nleftEnd, separator);
    var output = nleftEnd + ((nrightEnd != "") ? "." + nrightEnd : ""); 
    output = ((useCurrency) ? currency : "") + output + ((usePercent) ? percent : "");
    if (isNegative) {
      output = (useCurrency) ? "(" + output + ")" : "-" + output;
    }
    return output;
  }
  
  
  
  
  
  function strip(input, chars) {  
    var output = ""; 
    for (var i=0; i < input.length; i++)
      if (chars.indexOf(input.charAt(i)) == -1)
        output += input.charAt(i);
    return output;
  }
  
  
  
  
  
  function separate(input, separator) {  
    input = "" + input;
    var output = "";
    for (var i=0; i < input.length; i++) {
      if (i != 0 && (input.length - i) % 3 == 0) output += separator;
      output += input.charAt(i);
    }
    return output;
  }
  
  
function ResultsObject(argObjPassedDOB,argObjPassedSex,argObjPassedAge,argObjPassedContribution,argObjPassedPartner,argObjPassedTaxFreeSum,CurrentDate) {

		this.CurrentServerSystemDate = CurrentDate;

		//Get the Retirement Year and make sure it has not passed
		this.RetirementYear = parseInt(getDateFromString(argObjPassedDOB,"/").getFullYear())+parseInt(argObjPassedAge);
 		if(parseInt(this.RetirementYear)-parseInt(this.CurrentServerSystemDate.getFullYear()) <=0 ) {
			alert("Please ensure your date of birth and retirement age are correct");
	        return false;
			}

		this.PremiumCharge = PensionsPremiumCharge;
		this.AnnualGrowthRate =  PensionsAnnualGrowthRate;
		this.AnnualManagementFee = PensionsAnnualManagementFee;
		this.Inflation = PensionsInflation;
		this.SpousesPension = PensionsSpousesPensionsFactor;
		this.Term = getTerm(this.CurrentServerSystemDate, getDateFromString(argObjPassedDOB,"/"),argObjPassedAge);
		    //alert("The Term = " + this.Term);
		this.NetAnnualGrowthRate = this.AnnualGrowthRate-this.AnnualManagementFee;
		    //alert("NetAnnualGrowthRate = " + this.NetAnnualGrowthRate);
		this.NetMonthlyGrowthRate = Math.pow((1+this.NetAnnualGrowthRate),(1/12))-1;
		    //alert("Monthly Growth rate =" + this.NetMonthlyGrowthRate);
		this.Variable1 = 1/(1+this.NetMonthlyGrowthRate);
		    //alert("Variable 1 =" + this.Variable1);
		this.FactorY = (((1-Math.pow(this.Variable1,12)))/this.NetMonthlyGrowthRate)*(1+this.NetMonthlyGrowthRate);
		    //alert("Factor Y = " + this.FactorY);
		this.VariableJ = (this.NetAnnualGrowthRate - this.Inflation)/(1+this.Inflation);
		    //alert("Variable J = " + this.VariableJ);
		this.Variable2 = 1/(1+this.VariableJ);
		    //alert("Variable 2 = " + this.Variable2);
		this.VariableD = 1 - this.Variable2;
		    //alert("Var D = " + this.VariableD);
		this.VariableAn = (1-Math.pow(this.Variable2,this.Term))/this.VariableD;
		    //alert("Annuity =" + this.VariableAn);
		this.ProjectedFundAtRetirement = argObjPassedContribution *(1-this.PremiumCharge)*(this.FactorY)*(this.VariableAn)*(Math.pow((1+this.NetAnnualGrowthRate),this.Term));
		    //alert("Projected Fund at Retirement = " + this.ProjectedFundAtRetirement);
		//alert(Math.round((this.ProjectedFundAtRetirement*.25)*100/100));
		this.TaxFreeLumpSum = Math.round((((argObjPassedTaxFreeSum==1) ? (this.ProjectedFundAtRetirement*.25):0))*100)/100;
		    //alert("Tax free lump sum = " + this.TaxFreeLumpSum);
		this.PVTaxFreeLumpSum = this.TaxFreeLumpSum/Math.pow((1+this.Inflation),parseInt(this.Term));
            //alert("PVTaxFree= " + this.PVTaxFreeLumpSum)
		this.AvailableProjectedFundAtRetirement = this.ProjectedFundAtRetirement - this.TaxFreeLumpSum;
		    //alert("Available projected funds= " + this.AvailableProjectedFundAtRetirement);
		//Need to get the Annuity Rate
		
		//Get the single Annuity Rate
		this.AnnuityTableFactor = (argObjPassedSex==1) ? (maleAnnuityRate.getAnnuityRate("single",argObjPassedAge)) : (femaleAnnuityRate.getAnnuityRate("single",argObjPassedAge));
		//Get the Spouses nnuity Table Factor
		this.SpouseAnnuityFactor = (argObjPassedSex==1) ? (maleAnnuityRate.getAnnuityRate("spouse",argObjPassedAge)) : (femaleAnnuityRate.getAnnuityRate("spouse",argObjPassedAge));

		this.AnnuityRate=null;

		//If No Spouse
		if (argObjPassedPartner==0) {
			this.AnnuityRate = 1/(this.AnnuityTableFactor*1 * getMin(Math.pow(1.0075,(this.RetirementYear*1 - 1999)),1.25));
			}
		else {
			this.AnnuityRate = 1/(((this.AnnuityTableFactor*1 + this.SpouseAnnuityFactor*1*this.SpousesPension*1) * getMin(Math.pow(1.0075,(this.RetirementYear*1 - 1999)),1.25)));
			}
            //alert("Annuity =" + this.AnnuityRate);
		this.ProjectedAnnuityValue = this.AvailableProjectedFundAtRetirement*this.AnnuityRate;
		    //alert("Projected annuity value = " + this.ProjectedAnnuityValue);
		this.projectedWeeklyPension = this.ProjectedAnnuityValue / 52;
		this.WeeklyPension = Math.round(((this.ProjectedAnnuityValue/Math.pow((1+this.Inflation),(parseInt(this.Term))))/52)*100)/100;	
		    //alert("Weekly pension = " + this.WeeklyPension);
		this.YearlyPension = argObjPassedContribution *(1-this.PremiumCharge)*(this.FactorY)*(this.VariableAn)*(Math.pow((1+this.NetAnnualGrowthRate),this.Term));
		    //alert("Yearly Pension = " + this.YearlyPension);
		if (isNaN(this.WeeklyPension) || this.WeeklyPension<=0 || this.WeeklyPension == null) {this.WeeklyPension=0;}
	}  

	function isValidDate(dateStr) {
        // Checks for the following valid date formats:
        // MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
        // Also separates date into month, day, and year variables

        var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

        // To require a 4 digit year entry, use this line instead:
        // var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

        var matchArray = dateStr.match(datePat); // is the format ok?
        if (matchArray == null) {
        alert("Date is not in a valid format.")
        return false;
        }
        month = matchArray[3]; // parse date into variables
        day = matchArray[1];
        year = matchArray[4];
        if (month < 1 || month > 12) { // check month range
        form.pension_calc_dob.focus();        
        alert("Month must be between 1 and 12.");
        return false;
        }
        if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
        }
        if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("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)) {
        alert("February " + year + " doesn't have " + day + " days!");
        return false;
           }
        }
        return true;  // date is valid
    }
    
	function getTheResults() {
	    
	    var form = document.aspnetForm;
	    if (form.pension_calc_dob.value == "DOB")
	    {
	        alert("Please enter a date of birth in the format DD/MM/YYYY");
	        form.pension_calc_dob.focus();
	        return false;
	    }
	    if (form.pension_calc_monthlycontrib.value == "")
	    {
	        alert("Please provide a monthly contribution amount");
	        form.pension_calc_monthlycontrib.focus();
	        return false;
	    }
	    if (form.pension_calc_retire.value == "0")
	    {
	         alert("Please choose a retirement age!");
	        form.pension_calc_retire.focus();
	        return false;
	    }
	    if (form.pension_calc_sex.value == "nosex")
	    {
	         alert("Please choose your gender!");
	        form.pension_calc_sex.focus();
	        return false;
	    }	    
	    
	    var style1 = document.getElementById("results").style;
        style1.display = style1.display? "":"block";
        var style2 = document.getElementById("showHide").style;
        style2.display = style2.display? "":"none";
        var ServerCurrentDate = new Date();
        CalculatePensionsInitialResults(ServerCurrentDate)
        
	    /*
	    alert("dob=" + document.getElementById('pension_calc_dob').value);
	    

	    
	    var DOB = document.getElementById('pension_calc_dob').value;
	    var sex = document.getElementById('pension_calc_sex').value;
	    var retireAge = document.getElementById('pension_calc_retire').value;
	    var taxFreeSum = document.getElementById('pension_calc_maxlump').value;
	    var spouse =  document.getElementById('pension_calc_spouse').value;
	    var monthlyContrib = document.getElementById('pension_calc_monthlycontrib').value;
	    var InitialResultsObject = new ResultsObject(DOB,sex,retireAge,monthlyContrib,spouse,taxFreeSum,ServerCurrentDate);

	    ResultsObject(InitialResultsObject);
	    */
	    
	
	}
	
	function getDateFromString(DateValue,strDelimiter){
	DateValueArray = DateValue.split(strDelimiter);
	var retDateT = new Date();
	retDateT.setDate(DateValueArray[0]);
	retDateT.setMonth(DateValueArray[1]-1);
	retDateT.setFullYear(DateValueArray[2]);
	return retDateT;
	}
	
	
	function CalculatePensionsInitialResults(CurrentDate) {
	var FormElement = document.getElementById("aspnetForm");
	if (FormElement) {
		var FormElementDOB = FormElement.pension_calc_dob.value;
		var SexDropDown = FormElement.pension_calc_sex;
		var FormElementSex = SexDropDown.options[SexDropDown.selectedIndex].value;
		var AgeDropDown = FormElement.pension_calc_retire;
		var FormElementAge = AgeDropDown.options[AgeDropDown.selectedIndex].value;
		var FormElementContribution = FormElement.pension_calc_monthlycontrib.value;
		var PartnerDropDown = FormElement.pension_calc_spouse;
		var FormElementPartner = PartnerDropDown.options[PartnerDropDown.selectedIndex].value;
		var TaxFreeDropDown = FormElement.pension_calc_maxlump;
		var FormElementTaxFreeSum = TaxFreeDropDown.options[TaxFreeDropDown.selectedIndex].value;
		}
	BaseValues = new LoadBaseValues(FormElementDOB,FormElementSex,FormElementAge,FormElementContribution,FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValues_5 = new LoadBaseValues(FormElementDOB,FormElementSex,FormElementAge,IncreaseByPercent(FormElementContribution,5),FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValues_10 = new LoadBaseValues(FormElementDOB,FormElementSex,FormElementAge,IncreaseByPercent(FormElementContribution,10),FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValues_25 = new LoadBaseValues(FormElementDOB,FormElementSex,FormElementAge,IncreaseByPercent(FormElementContribution,25),FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValuesA_1 = new LoadBaseValues(FormElementDOB,FormElementSex,IncreaseByAmount(FormElementAge,1),FormElementContribution,FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValuesA_2 = new LoadBaseValues(FormElementDOB,FormElementSex,IncreaseByAmount(FormElementAge,2),FormElementContribution,FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	BaseValuesA_5 = new LoadBaseValues(FormElementDOB,FormElementSex,IncreaseByAmount(FormElementAge,5),FormElementContribution,FormElementPartner,FormElementTaxFreeSum,CurrentDate);
	var InitialResultsObject = new ResultsObject(BaseValues.argObjPassedDOB,BaseValues.argObjPassedSex,BaseValues.argObjPassedAge,BaseValues.argObjPassedContribution,BaseValues.argObjPassedPartner,BaseValues.argObjPassedTaxFreeSum,BaseValues.CurrentDate);

	FillResults(InitialResultsObject)
	}
	

	
