// (c) 2006 conscious.co.uk
function calcsavings() {
// calculates the value of your savings in the future from a form
   
   var formnames = new Array("startingbalance", "monthlydeposit", "avginterestrate", "avginflationrate", "noyears");
   var formdisplayednames = new Array("Starting Balance", "Monthly Deposit", "Average Annual Interest Rate", "Average Annual Inflation Rate", "Number of Years");
   var formvals = new Array();
   var outnames = new Array("savingsworth", "valuetodaysmoney");
   var outvals = new Array();


   // get form values      
   for (i=0; i<formnames.length; i++)
      for (j=0,m=document.savingsform.elements.length;j<m;j++)
         if (document.savingsform.elements[j].name == formnames[i])
            formvals[formnames[i]] = document.savingsform.elements[j].value;

   // Error checking
   var isvalidnum = true;
   for (j=0; j<formnames.length; j++) {
      formvals[formnames[j]] = formvals[formnames[j]].replace("£", "");
      for (i=0; i<formvals[formnames[j]].length; i++) {
         if ((formvals[formnames[j]].charAt(i) != "0")
         && (formvals[formnames[j]].charAt(i) != ".")
         && (!parseFloat(formvals[formnames[j]].charAt(i)))) {
            isvalidnum = false;
            alert("Please enter a valid number in the "+formdisplayednames[j]+" field");
            break;

      }
   }
   }
   
   if (isvalidnum) {
   // Calculations

      for (i=0; i<formnames.length; i++) {
         if ((formnames[i] == "avginterestrate") || (formnames[i] == "startingbalance")) formvals[formnames[i]] = parseFloat(formvals[formnames[i]]);
         else formvals[formnames[i]] = parseInt(formvals[formnames[i]]);
      }


      tempvalA = ((formvals['avginterestrate']/100)/12);  // best to create these values for rounding and cross-browser compatibility reasons
      
      tempvalB = (formvals['noyears']*12); // best to create these values for rounding and cross-browser compatibility reasons

      outvals['savingsworth'] = (formvals['startingbalance']*(Math.pow(1+tempvalA,tempvalB))) + ((( formvals['monthlydeposit']*((Math.pow(1+tempvalA,tempvalB)) - 1))/tempvalA));  // future savings value calculated from starting savings balance plus accrued interest over the given years, plus the monthly deposit and the interest accrued on that value over the given number of years
      
      outvals['valuetodaysmoney'] = (outvals['savingsworth']/(Math.pow(1+(formvals['avginflationrate']/100),formvals['noyears'])));  // value in todays money is the future savings value less the estimated inflation increase over the given number of years
        for (i=0; i<outnames.length; i++) if (!parseFloat(outvals[outnames[i]])) outvals[outnames[i]] = 0;

      // display with correct decimal places, thousands
      for (i=0; i<outnames.length; i++) outvals[outnames[i]] = poundsandpence(outvals[outnames[i]], false, true);	

   // output values
   for (i=0; i<outnames.length; i++)
      for (j=0,m=document.savingsform.elements.length;j<m;j++)
         if (document.savingsform.elements[j].name == outnames[i])
            document.savingsform.elements[j].value = outvals[outnames[i]];

   }
}

function poundsandpence(numnotrounded, returnasfloat, isthousands) {
// makes number conform to pounds and 2 decimal (pence) digits, with options of commas denoting thousands
var decbit = (numnotrounded.toString()).split(".");

if (!decbit[1]) var decpart = "00";
else if ((decbit[1].length) == 1) var decpart = decbit[1]+"0";
else if ((decbit[1].length) == 2) var decpart = decbit[1];
else {
// Varies to get right result - check
   var tempbit = (Math.round((decbit[0]+decbit[1].substring(0,2))+"."+(decbit[1].substring(2)))).toString();
   var decpart = tempbit.substring((tempbit.length-2));
   decbit[0] = tempbit.substring(0, (tempbit.length-2));
//   var decpart = (decbit[1].substring(0, 2));

}

if ((!returnasfloat) && (isthousands) && (decbit[0].length > 3)) {  // add commas for thousands if appropriate
   var afterthousands = "";
   for (tocommas = 0; tocommas < (decbit[0].length / 3); tocommas++) afterthousands = ","+decbit[0].substring((decbit[0].length-((tocommas+1)*3)), (decbit[0].length-(tocommas*3)))+afterthousands;
   afterthousands = afterthousands.substring(1);

}
else afterthousands = decbit[0];

var wholebit = afterthousands+"."+decpart;

if (!returnasfloat) return wholebit;
else return parseFloat(wholebit);
}

