// jason's additional functionality
// october 2006
var activeStory = 0;//calc default values
var canPrint = false;//user can only print when results are showing
var Stories = new Array ('Story0','Story1');

//---------------------------- investment, iReturn, yearsInvested, income, taxRate
Stories["Story0"] = new Array('','','',0,'');
Stories["Story1"] = new Array('10,000','5','10',2,'31.15');


function setStory(thisStory, start) {
	toggleDiv ("ResultsPane", false);
	toggleDiv("Help1", false);
	toggleDiv("Help2", false);
	canPrint = false;
	if (start) {
		window.location.hash = 'CalcStart';
	}
	
	for (var i=0; i < Stories.length; i++) {
		if (thisStory == Stories[i]) {
			if (thisStory == 'Story0') {
				useMyNumbers(true);
			} else {
				toggleDiv(thisStory, true);
				activeStory = i;
				resetFieldBgColor('fff');
				useStoryNumbers(Stories[i]);
				Calculate(false);
			}
		} else {
			toggleDiv(Stories[i], false);
		}
	}
}

function useMyNumbers(reset) {
	document.aspnetForm.numbers[0].checked = true;
	activeStory = 0;
	if (reset) {
		useStoryNumbers('Story0');
	}
	resetFieldBgColor('c6f7a2');
	for (var i=0; i < Stories.length; i++) {
		toggleDiv(Stories[i], false);
	}
	toggleDiv("ResultsPane", false);
	toggleDiv("Help1", false);
	toggleDiv("Help2", false);
	canPrint = false;
}

function useStoryNumbers(str) {
	document.aspnetForm.investment.value = Stories[str][0];
	document.aspnetForm.iReturn.value = Stories[str][1];
	document.aspnetForm.yearsInvested.value = Stories[str][2];
	document.aspnetForm.income.selectedIndex = Stories[str][3];
	document.aspnetForm.taxRate.value = Stories[str][4];
}

function toggleDiv(thisDiv, state) {
	toggle = eval('document.getElementById(\''+ thisDiv +'\')');
	if (state) {
		toggle.style.display = "block";
	} else {
		toggle.style.display = "none";
	}
}


function fieldUpdate(field,fieldPosition,isValueCheck,isAddZeros) {
	thisField = eval('document.aspnetForm.'+ field);
	if (activeStory != 0) {
		useMyNumbers(false);
	} else {
		toggleDiv("ResultsPane", false);
		toggleDiv("Help1", false);
		toggleDiv("Help2", false);
	}
	thisField.style.backgroundColor = '#fff';
	
	if (ValueCheck(thisField, isValueCheck)) {
		if (isValueCheck) {
			if (thisField.value > 99) { 
				thisField.value = '99.99'; 
			}
		}
		thisField.value=addzeros(thisField.value, isAddZeros);
	}
}

function resetFieldBgColor(color) {
	document.aspnetForm.investment.style.backgroundColor = "#"+ color +"";
	document.aspnetForm.iReturn.style.backgroundColor = "#"+ color +"";
	document.aspnetForm.yearsInvested.style.backgroundColor = "#"+ color +"";
	document.aspnetForm.income.style.backgroundColor = "#"+ color +"";
	document.aspnetForm.taxRate.style.backgroundColor = "#"+ color +"";
}


function printCalc() {
	if (canPrint) {
		window.print();
	} else {
		alert('Please calculate the results before printing');
	}
}

function init() {
	document.aspnetForm.numbers[activeStory].checked = true;
	setStory (Stories[activeStory], false);
}

function resetCalc(frm) {
	setStory('Story0', true);
}

function addzeros(num, useDecimals) {  
// Takes an unformatted number and adds formatting (commas and up to 2 decimal places).

	if (useDecimals == true) {
		if (num == null || isNaN(num) || Number(num) == 0) { return 0; }
		num = parseFloat(num);
		num = Math.round(100*num);
		num = num.toString();
		var p1 = num.substring(0, num.length - 2);
		var p2 = num.substring(num.length - 2, num.length);
		num = p1 + '.' + p2;
	}

	var txtNumber = '' + num;
	var rxSplit = new RegExp('([0-9])([0-9][0-9][0-9][,.])');
	var arrNumber = txtNumber.split('.');
	arrNumber[0] += '.';
	do { arrNumber[0] = arrNumber[0].replace(rxSplit, '$1,$2');	} 
	while (rxSplit.test(arrNumber[0]));

	if (arrNumber.length > 1) {
	return arrNumber.join('');
	}
	else {
	return arrNumber[0].split('.')[0];
    }	
}

function ValueCheck(refVal, AllowDecimal) {
// Validates the contents of a field, checking for illegal characters and nags if it finds any.

	if (refVal.value.length == 0) { return true; }
	var DecimalFlag = false;	var bDec = true; var FieldValid = true;
	for (var i=0; i < refVal.value.length; i++) {
		var c = refVal.value.charCodeAt(i);
        if ((c > 57 || c < 48)) {
			if (c==46) {
				if (AllowDecimal == false || DecimalFlag == true) {	var bDec = false; }
				else { DecimalFlag = true; } }
			else if (c==44 || c==36 || c==37) { }
			else { FieldValid = false; }
			}
	}
	if (FieldValid==false || bDec==false) {
		if (AllowDecimal) { alert('Only numbers and a decimal can be entered into this field.\nPlease adjust the value.'); }
		else { alert('Only enter numbers into this field.\nPlease adjust the value.'); }
		refVal.focus();	refVal.select(); return false; }
	else { return true; } 
}

function FormatToNumber(refVal) {
// Returns a formatted number to it's root form ($1,000.00 to 1000).

	tmpVar = refVal.value;
	if (tmpVar.length != 0) { 
		for (count = 0; count < tmpVar.length; count ++) {
			if (tmpVar.charCodeAt(count) == 44 || tmpVar.charCodeAt(count) == 36 || tmpVar.charCodeAt(count) == 37) {
				tmpVar = tmpVar.substring(0, count) + tmpVar.substring(count+1, tmpVar.length); }
		}}
	return tmpVar;
}

//////////////////////////////////////////////////

//This function adds comma formating to the number
var ErrorObjects=new Array();

function nYearSet(nYearField,nYearValue){
	var elem=document.getElementById(nYearField);
	elem.data=nYearValue
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}


//This functions calls validate function then optionally calls calculate function
function Calculate(results) {
	if (Validate()) {
		toggleDiv ("ResultsPane", true);
		canPrint = true;
		CalculateFunction();
		if (results) {
			window.location.hash = 'ResultsStart';
		}
	}
}


//This function calculates the form
function CalculateFunction() {

var A = document.aspnetForm.investment.value.replace(",","");
var B = document.aspnetForm.iReturn.value.replace(",","")/100;
var C = document.aspnetForm.yearsInvested.value.replace(",","");
var D = document.aspnetForm.taxRate.value.replace(",","")/100;

var E = A*(1+B); 
var F = A*(1+B*(1-D));
var G = A*D*(1+B);
var H = A*(Math.pow((1+B),C));
var I = A*(Math.pow((1+B*(1-D)),C));
var J = A*D*(Math.pow((1+B),C));
var K = H+J-I;

document.aspnetForm.investment.value = addCommas(A);
document.getElementById("madeInsideOne").innerHTML = addCommas(Math.round(E*100)/100);
document.getElementById("madeOutsideOne").innerHTML = addCommas(Math.round(F*100)/100);
document.getElementById("madeInsideC").innerHTML = addCommas(Math.round(H*100)/100);
document.getElementById("madeOutsideC").innerHTML = addCommas(Math.round(I*100)/100);
document.getElementById("refundInsideOne").innerHTML = addCommas(Math.round(G*100)/100);
document.getElementById("refundInsideC").innerHTML = addCommas(Math.round(J*100)/100);
document.getElementById("worth").innerHTML = addCommas(Math.round(K*100)/100);
document.getElementById("nYears1").innerHTML = document.aspnetForm.yearsInvested.value;
document.getElementById("nYears2").innerHTML = document.aspnetForm.yearsInvested.value;
}
//--------------------------------------------- Validation -------------------------------------------//
function showError(obj){
	obj.focus();
	obj.select();
	obj.className="BlankField";
	ErrorObjects[ErrorObjects.length]=obj;
}
//
function clearAllError(){
	var i=0;
	for(i=0;i<ErrorObjects.length;i++){
		ErrorObjects[i].className="";
	}
}


function check_A() {
	var A_Format =/(^\d{1,6}$)|(^\d{0,6}\.\d{1,2}$)/;
	var A = document.aspnetForm.investment.value.replace(",","");
	if (A_Format.test(A))
		{
		if (A<300001 && A>0)
			{
			return true;
			}
		else
			{
			return false;
			}
		}
	else
		{
		return false;
		}				
}
function check_B() {
	var B_Format =/(^\d{1,2}$)|(^\d{0,2}\.\d{1,2}$)/;
	var B = document.aspnetForm.iReturn.value.replace(",","");
	if (B_Format.test(B))
		{
		if (B<=30 && B>0)
			{
			return true;
			}
		else
			{
			return false;
			}
		}
	else
		{
		return false;
		}		
}
function check_C() {
	var C_Format =/(^\d{1,2}$)/;
	var C = document.aspnetForm.yearsInvested.value.replace(",","");
	if (C_Format.test(C))
		{
		if (C>=1 && C<=60)
			{
			return true;
			}
		else
			{
			return false;
			}
		}
	else
		{
		return false;
		}		
}
function check_D() {
	var D_Format =/(^\d{1,3}$)|(^\d{0,3}\.\d{1,2}$)/;
	var D = document.aspnetForm.taxRate.value.replace(",","");
	if (D_Format.test(D))
		{
		if (D>0 && D<=100)
			{
			return true;
			}
		else
			{
			return false;
			}
		}
	else
		{
		return false;
		}		
}


function Validate() {

clearAllError();
try
	{
		if (!check_A())
			{
			showError(document.aspnetForm.investment);
			throw "This is the amount of a single annual contribution. Your entry must be greater than 0 and less than 300,001. You can enter the amount with or without cents or commas.";
			return false;
			}
		if (!check_B())
			{
			showError(document.aspnetForm.iReturn);
			throw "This is the annual rate of return. Please enter a number greater than 0 and less than or equal to 30.0. You can use a whole number or use one decimal point.";
			return false;
			}
		if (!check_C())
			{
			showError(document.aspnetForm.yearsInvested);
			throw "How many years will you hold this investment inside your RRSP?  Enter a number between 1 and 60.";
			return false;
			}
		if (!check_D())
			{
			showError(document.aspnetForm.taxRate);
			throw "Please enter a percent greater than 0. If you are not sure what your tax rate is, enter 31.15."
			return false;
			}
	}

catch(e)
	{
		alert(e);
		return false;
	}
	return true;
}
