// dividend reinvestment script december 2007
	 

 var initial_number_shares;
 var initial_price_pershare;
 var dividend_yield;
 var dividend_growthrate;
 var valuepershare_growthrate;
 var number_years;

 var finalvalue_without;
 var finalvalue_with;
 var numbershares_without;
 var numbershares_with;
 var sumdiv_without;
 var sumdiv_with;
 var annualizedreturn_without;
 var annualizedreturn_with;
  
  
   function CurrencyFormatted(amount)
{
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	return s;
}
// end of function CurrencyFormatted()

function CommaFormatted(amount)
{
	var delimiter = ","; // replace comma if desired
	var a = amount.split('.',2)
	var d = a[1];
	var i = parseInt(a[0]);
	if(isNaN(i)) { return ''; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	var n = new String(i);
	var a = [];
	while(n.length > 3)
	{
		var nn = n.substr(n.length-3);
		a.unshift(nn);
		n = n.substr(0,n.length-3);
	}
	if(n.length > 0) { a.unshift(n); }
	n = a.join(delimiter);
	if(d.length < 1) { amount = n; }
	else { amount = n + '.' + d; }
	amount = minus + amount;
	return amount;
}
// end of function CommaFormatted()
  
	
	
	function formatCurrency(strValue)
{
	strValue = strValue.toString().replace(/\$|\,/g,'');
	dblValue = parseFloat(strValue);

	blnSign = (dblValue == (dblValue = Math.abs(dblValue)));
	dblValue = Math.floor(dblValue*100+0.50000000001);
	intCents = dblValue%100;
	strCents = intCents.toString();
	dblValue = Math.floor(dblValue/100).toString();
	if(intCents<10)
		strCents = "0" + strCents;
	for (var i = 0; i < Math.floor((dblValue.length-(1+i))/3); i++)
		dblValue = dblValue.substring(0,dblValue.length-(4*i+3))+','+
		dblValue.substring(dblValue.length-(4*i+3));
	return (((blnSign)?'':'-') + '$' + dblValue + '.' + strCents);
}
 
 function power(valuepershare_growthrate,number_years)
    {
  var add_one = 1 + valuepershare_growthrate;
  var pow = Math.pow(add_one,number_years);
  return pow;
  } 
  
  
  function calculate(form) {
  
  initial_number_shares = form.initial_number_shares.value;
  initial_price_pershare = form.initial_price_pershare.value;
  dividend_yield = form.dividend_yield.value;
  dividend_growthrate = form.dividend_growthrate.value;
  valuepershare_growthrate = form.valuepershare_growthrate.value;
  number_years =  form.number_years.value;
  
 //Computations  without dividend reinvestment
  var price_pershare = initial_price_pershare;
  var dividend_rate = initial_price_pershare*(1 + valuepershare_growthrate/100)*(dividend_yield/100);
  var dividend;
  
  numbershares_without = initial_number_shares;
  sumdiv_without = 0;
 
  for (var i = 0; i < number_years; i++)
  {
   price_pershare = price_pershare*(1 + valuepershare_growthrate/100);
   dividend_rate = dividend_rate*(1 + dividend_growthrate/100);
   dividend = dividend_rate*numbershares_without;
   sumdiv_without += 1*dividend;
   finalvalue_without = price_pershare*numbershares_without;
  } 
  finalvalue_without +=  1*sumdiv_without;  // add sum dividends
 
  //Computations with dividend reinvestment
   
   price_pershare = initial_price_pershare;
   dividend_rate = initial_price_pershare*(1 + valuepershare_growthrate/100)*(dividend_yield/100);
   var divreinvest_shares;
   numbershares_with = initial_number_shares;
   sumdiv_with = 0;
  
   for (var i = 0; i < number_years; i++)
  {
   price_pershare = price_pershare*(1 + valuepershare_growthrate/100);
   dividend_rate = dividend_rate*(1 + dividend_growthrate/100);
   dividend = dividend_rate*numbershares_with;
   sumdiv_with += 1*dividend;
   divreinvest_shares = dividend/price_pershare;
   
   numbershares_with = 1*divreinvest_shares + 1*numbershares_with;
   finalvalue_with = price_pershare*numbershares_with;
  }
  numbershares_with = numbershares_with - divreinvest_shares;
   
  //Format dividend paid without dividends reinvested
  
  sumdiv_without = Math.round(1000*sumdiv_without)/1000;
  sumdiv_without = CurrencyFormatted(sumdiv_without);
  sumdiv_without = CommaFormatted(sumdiv_without);
  sumdiv_without = formatCurrency(sumdiv_without);
  form.sumdiv_without.value = sumdiv_without;
  
  //Format dividend paid with dividends reinvested
 
  sumdiv_with = Math.round(1000*sumdiv_with)/1000;
  sumdiv_with = CurrencyFormatted(sumdiv_with);
  sumdiv_with = CommaFormatted(sumdiv_with);
  sumdiv_with = formatCurrency(sumdiv_with);
  form.sumdiv_with.value = sumdiv_with;
  
    //annualized returns 
  var x = 1/number_years;
  var initial_value = initial_number_shares*initial_price_pershare;
  //Compute and format annualized returns without dividends reinvested
  var ans =  finalvalue_without/initial_value;
  annualizedreturn_without = Math.pow(ans,x) - 1;
  annualizedreturn_without = annualizedreturn_without*100;
  annualizedreturn_without = Math.round(annualizedreturn_without*100)/100;
  form.annualizedreturn_without.value = annualizedreturn_without;  

  //Compute and format annualized returns with dividends reinvested;
  ans =  finalvalue_with/initial_value;
  annualizedreturn_with = Math.pow(ans,x) - 1;
  annualizedreturn_with = annualizedreturn_with*100;
  annualizedreturn_with = Math.round(annualizedreturn_with*100)/100;
  form.annualizedreturn_with.value = annualizedreturn_with; 
	
  // Format total value without dividend reinvestment
  finalvalue_without = Math.round(100*finalvalue_without)/100;
  finalvalue_without = CurrencyFormatted(finalvalue_without);
  finalvalue_without = CommaFormatted(finalvalue_without);
  finalvalue_without = formatCurrency(finalvalue_without);
  form.finalvalue_without.value = finalvalue_without;
 
  // Format total value with dividend reinvestment
  finalvalue_with = Math.round(100*finalvalue_with)/100; 
  finalvalue_with = CurrencyFormatted(finalvalue_with);
  finalvalue_with = CommaFormatted(finalvalue_with);
  finalvalue_with = formatCurrency(finalvalue_with);
  form.finalvalue_with.value = finalvalue_with;
  
  // Format number shares without dividend reinvestment
 
  numbershares_without = Math.round(100*numbershares_without/100);
  numbershares_without = CurrencyFormatted(numbershares_without);
  numbershares_without = CommaFormatted(numbershares_without);
  form.numbershares_without.value = numbershares_without;

  // Format number shares with dividend reinvestment
  
  numbershares_with = Math.round(10000*numbershares_with)/10000;
  numbershares_with = CurrencyFormatted(numbershares_with);
  numbershares_with = CommaFormatted(numbershares_with);
  form.numbershares_with.value = numbershares_with;
 
	}
	// Copyright ©Richard A. Howard 2003-2007