/**
 * lattecalculator.js
 * author: john berry john \ ulfmagnet / com
 *
 */

function WindowOnload(f) {
  var prev=window.onload;
  window.onload=function(){ if(prev)prev(); f(); }
}

/* make sure the form resets on page load */
WindowOnload( function()  { 
		  javascript:document.forms.theform.reset();
	      });
 
function calculate() {
    /* get handles to the elements we need */
    var _form = document.forms.theform;
    var _contribution = document.getElementById('contribution');
    var _period = document.getElementById('period');
    var _rate = document.getElementById('rate');
    var _time = document.getElementById('time');
    var _match = '';

    /* validate the form */
    if (_contribution == null || _contribution.value == null || _contribution.value.length == 0) {
	handle_error("Please enter a dollar amount for your investment.");
	return false;
    }
    else if ((_match =_contribution.value.search(new RegExp(/[^\$\-\.\d,]/))) != -1) {
	handle_error("Please enter a valid dollar amount for your investment.");
	return false;
    }
    else if (_rate == null || _rate.value == null || _rate.value.length == 0) {
	handle_error("Please enter the annual rate of return.");
	return false;
    }
    else if ((_match =_rate.value.search(new RegExp(/[^\.\d%]/))) != -1) {
	handle_error("Please enter a valid rate for your investment (for example, 4.99 or 12.00%).");
	return false;
    }
    else if (_time == null || _time.value == null || _time.value.length == 0) {
	handle_error("Please enter the number of years the investment will be held.");
	return false;
    }
    else if (isNaN(parseInt(_time.value))) {
	handle_error("Please enter a valid number of years the investment will be held.");
	return false;
    }

    /* clean up the data */
    var _dollaramount = format_currency(_contribution.value.replace(new RegExp(/[\$,]/g), ""));
    _contribution.value = "$" + add_commas(_dollaramount);
    var _ratevalue = _rate.value.replace(new RegExp(/%/g), "");
    var _ratepercent = get_percentage(_ratevalue);
    _rate.value = _ratevalue + "%";
    var _years = parseInt(_time.value);
    _time.value = _years;

    /* do the calculation */
    var _periodvalue = _period.value;
    var _ac = 0;
    if (_periodvalue == 'weekly') {
	_ac = 52 * _dollaramount;
    }
    else if (_periodvalue == 'monthly') {
	_ac = 12 * _dollaramount;
    }
    else {  /* yearly */
	_ac = _dollaramount;
    }
    var _z = 1 + (0.01 * _ratevalue);
    var _total = _ac * ((Math.pow(_z, (_years + 1)) - _z) / (_z - 1));

    /* display the results */
    var _error = document.getElementById('error');
    var _result = document.getElementById('result');
    var _resultamount = document.getElementById('resultAmount');
    _error.style.display = 'none';
    _resultamount.innerHTML = '$' + add_commas(format_currency(_total));
    _result.style.display = 'block';
    _resultamount.style.display = 'block';

    return false;  /* don't actually submit the form */
}

function handle_error(_msg) {
    var _error = document.getElementById('error');
    _error.innerHTML = "<b>Please correct these problems:</b><br/>" + _msg;
    _error.style.display = 'block';
}

function format_currency(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;
}

function add_commas(amount) {
    var delimiter = ",";
    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;
}

function get_percentage(amount) {
    var i = parseFloat(amount);
    if(isNaN(i)) { i = 0.00; }
    return i / 100;
}