// Pay or Invest JS File


//Script for error suppression
//function bpTrapError(msg, URI, ln) {return true;}
//window.onerror = bpTrapError;


//----------BEGIN GENERIC FUNCTIONS----------------------------------------------------------
function fnGetObj(name)
{ //Generic function to get object reference for most browsers
  if (document.getElementById)
  {
  	this.obj = document.getElementById(name);
	this.style = document.getElementById(name).style;
  }
  else if (document.all)
  {
	this.obj = document.all[name];
	this.style = document.all[name].style;
  }
  else if (document.layers)
  {
   	this.obj = document.layers[name];
   	this.style = document.layers[name];
  }
}

function fnValidateNumeric(fieldname)
{ //Validate a Field contains only valid numbers.

  //var fieldObj = new fnGetObj(fieldname);
  //var strValue = fieldObj.obj.value;
  //var strValue = fnTrimAll(fieldname);
  var strValue = fieldname;


  var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
  return objRegExp.test(strValue);
}

function fnTrimAll(strValue) 
{ //Remove leading and trailing spaces plus commas and dollar signs from provided string

  strValue = fnRemoveCommas(strValue);
  strValue = fnRemoveDollarSigns(strValue);
  var objRegExp = /^(\s*)$/;

  //check for all spaces
  if(objRegExp.test(strValue))
  {
    strValue = strValue.replace(objRegExp, '');
    if( strValue.length == 0)
    return strValue;
  }

  //check for leading & trailing spaces
  objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
  if(objRegExp.test(strValue))
  {
    //remove leading and trailing whitespace characters
    strValue = strValue.replace(objRegExp, '$2');
  }

  return strValue;
}

function fnValidateInteger(fieldname)
{ //Validate a Field contains a valid integer number.

  var fieldObj = new fnGetObj(fieldname);
  var strValue = fieldObj.obj.value;
  strValue = fnTrimAll(strValue);

  var objRegExp  = /(^-?\d\d*$)/;
  return objRegExp.test(strValue);
}

function fnCheckField(fieldname)
{ //Check a Field (cannot be null, empty string, zero length, or string of blanks)
  
  var fieldObj = new fnGetObj(fieldname);
  var teststring = fieldObj.obj.value;

  teststring = fnTrimAll(teststring);
  if ((teststring == '') || (teststring == null) || (teststring.length == 0))
  {
    return false;
  }

  return true;
}

function fnValidatePosNum(fieldname)
{ //Validate a Number is Positive (including 0)

  var fieldObj = new fnGetObj(fieldname);
  var strValue = fieldObj.obj.value;
  strValue = fnTrimAll(strValue);

  return (parseInt(strValue,10)>=0); 
}


function fnRemoveCommas(strValue)
{  //Remove commas from string

  var objRegExp = /,/g; //search for commas globally
  
  //replace all matches with empty strings 
  return strValue.replace(objRegExp, '');
  
}

function fnRemoveDollarSigns(strValue)
{  //Remove dollar sign from string

  if(strValue.indexOf('$') >= 0)
  {
    strValue = strValue.substring(1, strValue.length);
  }
   return strValue;
}

function fnAddCommas(srcNumber)
{  //Add commas to number string

   var txtNumber = '' + srcNumber;
   if (isNaN(txtNumber) || txtNumber == "") {
      return srcNumber;
   }
   else 
   {
      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 fnShowHide(fieldname, desiredaction)
{  //Function to Show or Hide a Field
   
   var fieldObj = new fnGetObj(fieldname);

   if (desiredaction == "Hide")
   {
      if (fieldObj.style.display != "none")
      {
         fieldObj.style.display = "none";
      }
   }
   
   if (desiredaction == "Show")
   {
      if (fieldObj.style.display == "none")
      {
         fieldObj.style.display = "";
      }
   }
}


function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function fnShowNote(InfoText,obj,NoteHeight)
{
  var ToolTip = new fnGetObj("largenote");
  
  if (ToolTip.style.visibility=="visible") {
	ToolTip.style.visibility = "hidden";
  } 
  else {
	  
	  ToolTip.style.left = findPosX(obj);
	  ToolTip.style.top = findPosY(obj)-NoteHeight;
	
	  var ToolTipText = new fnGetObj("largenotetext");
	  ToolTipText.obj.innerHTML = "<font size=1 color='#000000' style='font-family:Verdana, Arial, Helvetica, sans-serif'>" + InfoText + "</font>";
	
	  ToolTip.style.visibility = "visible";
	  //window.status="visible";  
  }
  
}


function fnHideNote() {
   var ToolTip = new fnGetObj("largenote");
   ToolTip.style.visibility = "hidden"; 
   //window.status="hidden";  
}


function fnAddDollarSign(number)
{
	var output;
	var num = parseFloat(number);//.toFixed(2);
	num = num.toFixed(2);
	
	var commas = fnAddCommas(num);
	
	if(number < 0)
	{
		//alert(commas);
		output = "-$" + commas.substring(1, commas.length);	
	}
	else
	{
		output = "$" + commas;	
	}
	
	return output;
}



function fnFormatInput(ref)
{
	//alert(ref.id);
	var ref = new fnGetObj(ref.id);
	var value = fnTrimAll(ref.obj.value);

	//Remove non-numeric characters; This is to prevent users from pasting a string.
	value = fnRemoveNonNumeric(value);

	//Remove unnecesary 0's from the input.
	value = fnRemoveLeadingZeros(value);

	//Add commas
	value = fnAddCommas(value);

	//Display the value on the textbox
	ref.obj.value = value;
	
	
}

function fnFormatInput2(id) //This version is used for the Current Age and Age of Retirement
{
	var ref = new fnGetObj(id);
	var value = fnTrimAll(ref.obj.value);
	
	
	//Remove non-numeric characters; This is to prevent users from pasting a string.
	value = fnRemoveNonNumeric(value);

	//Remove unnecesary 0's from the input.
	value = fnRemoveLeadingZeros(value);

	//If Age of Retirement = 0, then make it 1 (default value)
	if(value == 0 && id == 'ageAtRetirement') value = 1;
	

	//Display the value on the textbox
	ref.obj.value = value;
	
}


function fnCheckInput(e, ref, count) //Check user's input | DO NOT ALLOW COMMAS
{
	
	/*
	Function will do the following:
		-Function checks every keystroke (onKeyPress event) for the set parameters below.
		-If the user presses a key that is not defined, the function will return false.
		-The function has a counter to limit the amount of characters the user can enter. 
		 This is useful when you want to format the text inside the textbox after the user enters data. Example: textbox maxlength='8', 
		 function limits user to 6 chartacters, so we have 2 characters available for commas, periods, etc. (need to do this for Safari and NS)
		-Function limits the user to only one period per textbox.
		
	List of ASCII codes:
	
		Symbol		Code
		------		----
		,			44
		.			46
		$			36
		<			60
		>			62
		0 - 9		48 - 57
		a - z		97 - 122
		A - Z		65 - 90
		backspace	8
		delete		127
		del (Mac)	63272
		tab			9
		Arrows		0
		
	For more symbols: http://www.ascii.cl/htmlcodes.htm
	*/
	
	var key = window.event ? e.keyCode : e.which; //Determine which key the user pressed
	//alert("key: " + key);
	//var keychar = String.fromCharCode(key);
	
	//If key pressed is one of the following, return true: 'delete', 'backspace', 'tab' 
	//This is a workaround for the MAC not allowing users to delete input once the limit (counter) reached 6.
	
	// delete (win)  backspace   --tab--    delete (Mac)  left arrow (Mac) right arrow (Mac)
	if(key == 127 || key == 8 || key ==9 || key == 63272 || key == 63234 || key == 63235) 
	{
		
		return true;
		fnCalculateSavingsAndDebt();
	}
	else
	{
		var id = ref.id;
		//alert(ref.id);
		var element = new fnGetObj(id);
		var counter;
		counter = element.obj.value.length; //Count the number of characters in the text box
		//alert(counter);
		
		if (counter >= count) //If user enteres more than 6 characters return false and prevent user from entering more data
		{	
			if(key == 0) return true; //Allow Arrow Keys when the limit is reached
			else return false;				
		}
		else
		{

			// ------------------ Numbers-----------------------   --comma--      --period--    ---delete---  Backspace
			if ((key > 47 && key < 58) || (key == 0 || key == 8 || /*(key == 44) ||*/ (key == 46)) || key == 127 || key == 8) //Valid Input (numbers, commas, periods, backspace, delete
			{
				var elContent = element.obj.value; //Get textbox content
				//alert("elContent: " + elContent);
				
				if((key == 46) && elContent.indexOf(".") != -1) //If there is already a period on the input field, return false
				{
					return false;	
				}
				if(key == 0) return true; //Do not run the function if user presses the arrow keys
				else setTimeout("fnCalculateSavingsAndDebt();", 100); //delay: allows function to capture the entire value inputted; otherwise, last value entered is lost.
			}
			else //Invalid input, return false
			{
				return false;
			}
		}
	}
}

function fnCheckInput2(e, ref, count) //Check user's input | DO NOT allow periods or commas
{
	var key = window.event ? e.keyCode : e.which; //Determine which key the user pressed
	//alert("key: " + key);
	//var keychar = String.fromCharCode(key);
	
	//If key pressed is one of the following, return true: 'delete', 'backspace', 'tab' 
	//This is a workaround for the MAC not allowing users to delete input once the limit (counter) reached 6.
	
	// delete (win)  backspace   --tab--    delete (Mac)  left arrow (Mac) right arrow (Mac)
	if(key == 127 || key == 8 || key ==9 || key == 63272 || key == 63234 || key == 63235) 
	{
		return true;
		fnCalculateSavingsAndDebt();
	}
	else
	{
		var id = ref.id;
		//alert(ref.id);
		var element = new fnGetObj(id);
		var counter;
		counter = element.obj.value.length; //Count the number of characters in the text box
		//alert(counter);
		
		if (counter >= count) //If user enteres more than 6 characters return false and prevent user from entering more data
		{	
			if(key == 0) return true; //Allow Arrow Keys when the limit is reached
			else return false;			
		}
		else
		{

			// ------------------ Numbers-----------------------   --comma--      --period--    ---delete---  Backspace
			if ((key > 47 && key < 58) || (key == 0 || key == 8 || (key == 44) /*|| (key == 46)*/) || key == 127 || key == 8) //Valid Input (numbers, commas, periods, backspace, delete
			{
				var elContent = element.obj.value; //Get textbox content
				//alert("elContent: " + elContent);
				
				/*
				if((key == 46) && elContent.indexOf(".") != -1) //If there is already a period on the input field, return false
				{
					return false;	
				}
				*/
				if(key == 0) return true; //Do not run the function if user presses the arrow keys
				else setTimeout("fnCalculateSavingsAndDebt();", 100); //delay: allows function to capture the entire value inputted; otherwise, last value entered is lost.
			}
			else //Invalid input, return false
			{
				return false;
			}
		}
	}

//clearTimeout(globalTimeout);
//globalTimeout = setTimeout("fnShowHide('loaderDiv', 'Show');", 100);
}


function fnRemoveLeadingZeros(value)
{
	/*
	Function will do the following:
		-If there are zeros to the left of a number, it will remove all of them. Example: '00150' -> '150'
		-If there is a period and there are more than one zero to the left of it, it will remove all but one zero. Example: '00.50' - > '0.50'
		-If the value starts with a period, it will add a zero to the left of the period. Example: '.50' - > '0.50'
		-If the user entered one or more zeros in the input box, the value will default to one zero. Example: '000' -> '0'
		-If the last character is a period, the function will remove the period. Example: '5000.' - > '5000'
		
	Assumptions:
		-The user will only be allowed to enter ONE period in the text box. (fnCheckInput)
	*/
	
	
	val = value;
	
	var newVal = val;
	var nextVal;
	var prevVal;
	var currCharacter;
	
	if(val.indexOf(".") == 0) newVal = "0" + newVal; //If the value starts with a period, add a zero. Example: ".5" -> "0.5"
	//if(val.indexOf(".") == (val.length - 1)) newVal = newVal + "00";
	
	if(val.indexOf("0") != -1)
	{
		
		for(i = 0; i <= val.length - 1; i++)
		{
					
			if(val.charAt(i) == "0") //If current character is zero, start validation
			{
							
				prevVal = i-1;
				nextVal = i+1;
				
				if(prevVal < 0) prevVal = 0; //If previous value does not exist, make prevVal the current value
				
				if(val.charAt(prevVal) == "0")
				{
						
					if(i < val.indexOf(".")) //If the current character comes BEFORE the period
					{
						var curr = parseInt(i);
						var period = parseInt(val.indexOf("."));
					
						if((period - curr) <= 1)
						{
							break;	
						}
						else if((period - curr) > 1)
						{
							newVal = val.substring(nextVal);
						}
							
					}
					else
					{
						//alert(val.charAt(nextVal));
						if(val.charAt(nextVal) == "0")
						{
							newVal = val.substring(nextVal);
						}
						else if(val.charAt(nextVal) != "0")
						{
							newVal = val.substring(nextVal);
							break;
						}
			
					}
				
				}
				
			}
			else if(val.charAt(i) != "0")  //If current character is NOT zero, break loop
			{
				break;	
			}
			
		}
	}
	
	if(newVal.indexOf(".") == (newVal.length - 1)) newVal = newVal.substring(0, newVal.length - 1); //If the last character is a period, remove the period.
	if(newVal == "") newVal = 0; //If the user entered 1 or more zeros in the input field, default it to 1 zero
	
	return newVal;
}


function fnAddSpaces(value, spaces)
{
	var sOutput = "";
	var iCounter = 0;
	
	for(iChar = 0; iChar <= value.length - 1; iChar++)
	{
		sOutput += value.charAt(iChar);
		if (value.charAt(iChar) != " ") 
		{
			iCounter++;
			if (iCounter == spaces) 
			{
				iCounter = 0;
				sOutput += " ";
			}	
		} 
		else 
		{
			iCounter = 0;	
		}
		
	}	
	
	return sOutput;
}

function fnRemoveNonNumeric(value)
{
	var sOutput = "";
	
	for(l = 0; l <= value.length - 1; l++)
	{
			
		if (fnValidateNumeric(value.charAt(l)) == true || value.charAt(l) == ".") //If the character is numeric OR a period, add to output string
		{
			sOutput += value.charAt(l);
							
		} 
	
	}	
	//alert(sOutput);
	return sOutput;
}

function fnHideShowText(id, value, action)
{
	/*
	Insert the following parameters in the input element (textbox):
	
	onfocus=\"fnHideShowText(this.id, this.value, 'Hide')\" 
	onBlur=\"fnHideShowText(this.id, this.value, 'Show')\"
	
	*/
	
	var ref = new fnGetObj(id);
	var val = value;

	
	if(action == 'Hide') //User clicks on textbox (onFocus)
	{
		//alert("Hide");	
		ref.obj.className = 'txtbox';	
		if(value == pop19) //If textbox value = defaul value
		{
			val='';	
			ref.obj.value = val;
		}
	
	}
	else if (action == 'Show') //User clicks out of textbox (onBlur)
	{
		//alert("Show");
		if(value == '') 
		{
			val= pop19;
			ref.obj.className = 'txtboxGrey';
			ref.obj.value = val;
		}
		
	}
	
}


//----------END GENERIC FUNCTIONS----------------------------------------------------


//Global Variables

var amountYouOwe;
var rateOnDebt = 0;
var termOfDebt = 0;
var monthlySavings;
var rateOfReturn = 0; 
var federalStateTaxRate;
var decision; //Final decision
var diff; //The cost to choose one option over another

var globalTimeout;

//Arrays
var monthsArr = new Array();

//Debt
var debtEarningsArr = new Array();
var debtInterestArr = new Array();
var debtNetEarningsArr = new Array();


//Savings
var savingsEarningsArr = new Array();
var savingsInterestArr = new Array();
var savingsNetEarningsArr = new Array();

var emptyVar = "N/A";

//Graph variables
var graphDecimalsFlag; 
var label;
var ValScaler=1;
var graphDecimalsFlag2; 
var label2;
var ValScaler2=1;
var threshold=0;
var AbsMaxVal;


function fnAttachEvents()
{
	var formElements = new Array();
	formElements = document.getElementsByTagName('input');
	
	for(var i = 0; i < formElements.length; i++)
	{
		//if (id.search("c") > 0 || id.search("d") > 0)
	
		if(formElements[i].getAttribute("filter") == 'savings')
		{
			var id = formElements[i].id;
			//alert(id);
			id = id.toString();
			var el = new fnGetObj(id); 
			
			//Apply the onBlur events
			el.obj.onblur = function() 
			{
				fnFormatInput(this);
				//fnCalculateSavingsAndDebt();
			} 
			/*
			//Apply the onKeyUp events
			el.obj.onKeyUp = function() 
			{
				fnCheckKeyUp(event);
			} 
			//Added this event to the input tags to fix Firefox issue on the Mac - event was not being added properly through this method
			/*
			//Apply onKeyPress events
			el.obj.onkeypress = function() 
			{
				return fnCheckInput(event, this);
			} 
			*/
			//alert("browser: " + BrowserDetect.browser + "\n" + "version: " + BrowserDetect.version + "\n" + "OS: " + BrowserDetect.OS);
		}
		
		if(formElements[i].getAttribute("filter") == 'debt')
		{
			var id = formElements[i].id;
			//alert(id);
			id = id.toString();
			var el = new fnGetObj(id); 
			
			//Apply the onBlur events
			el.obj.onblur = function() 
			{
				fnFormatInput(this);
				//fnCalculateSavingsAndDebt();
			} 
			/*
			//Apply the onKeyUp events
			el.obj.onKeyUp = function() 
			{
				fnCheckKeyUp(event);
			} 
			//Added this event to the input tags to fix Firefox issue on the Mac - event was not being added properly through this method
			/*
			//Apply onKeyPress events
			el.obj.onkeypress = function() 
			{
				return fnCheckInput(event, this);
			} 
			*/
		}
	}
	//After page loads and events are added, perform calculations to populate table and graph
	fnCalculateSavingsAndDebt();
}

function fnCheckKeyUp(e)
{
	var key = window.event ? e.keyCode : e.which; //Determine which key the user pressed
	//alert("key: " + key);
	//var keychar = String.fromCharCode(key);
	
	//If key pressed is one of the following, return true: 'delete', 'backspace', 'tab' 
	//This is a workaround for the MAC not allowing users to delete input once the limit (counter) reached 6.
	
	if(key == 37 || key == 39) return true;
	// delete (win)  backspace   backspace    Left Arrow   Right arrow
	else if(key == 127 || key == 8 || key == 46 /*|| key == 37 || key == 39*/) 
	{
		fnCalculateSavingsAndDebt();
	}
	
}

function fnDeclareArrays()
{
	
	monthsArr = new Array();
	
	//Debt
	debtEarningsArr = new Array();
	debtInterestArr = new Array();
	debtNetEarningsArr = new Array();
	
	//Savings
	savingsEarningsArr = new Array();
	savingsInterestArr = new Array();
	savingsNetEarningsArr = new Array();
	
	for(var h = 0; h <= termOfDebt; h++)
	{
		monthsArr[h] = h;
		debtEarningsArr[h] = 0;
		debtInterestArr[h] = 0;
		debtNetEarningsArr[h] = 0;
		savingsEarningsArr[h] = 0;
		savingsInterestArr[h] = 0;
		savingsNetEarningsArr[h] = 0;
	}
}


function fnGenerateOutput(action)
{
	
	var ref, i, temp, tmpMonths;
	var table, header, tableBody;
	var printPage;
	var newWin = "";
		
	temp = "";
	if(action == 'display')tableBody = "<table border=0 class='output' cellspacing='0' cellpadding='5'>";
	else if(action == 'print')tableBody = "<table border=0 style='table-layout:fixed;font-size:12px;width:700px;border-bottom:1px; border-bottom-color:#C8CEA2; border-bottom-style:solid;border-left:1px; border-left-color:#C8CEA2; border-left-style:solid;border-right:1px; border-right-color:#C8CEA2; border-right-style:solid;' cellspacing='0' cellpadding='5'>";
	
	for(i=1; i <= termOfDebt; i++)
	{	
		if(i == termOfDebt && i%12 == 0) //Last month and also an exact year->Change BGColor and bold text. Add year info
		{
			temp += "<tr align='right' bgcolor='#C8CEA2' style='font-weight:bold;'>"; 
			tmpMonths = "(Year:<b>" + i/12 + "</b>)&nbsp;&nbsp;&nbsp;" + monthsArr[i];
		}
		else if (i == termOfDebt) //Last month; NOT a year->Bold text
		{
			temp += "<tr align='right' bgcolor='#EEEFDD' style='font-weight:bold;'>";
			tmpMonths = monthsArr[i];
		}
		else if(i%12 == 0) //Year-> display year information
		{
			temp += "<tr align='right' bgcolor='#C8CEA2'>"; 
			tmpMonths = "(Year:<b>" + i/12 + "</b>)&nbsp;&nbsp;&nbsp;" + monthsArr[i];
		}
		else if(i%2 == 0) //Normal month
		{
			temp += "<tr align='right' bgcolor='#EEEFDD'>";
			tmpMonths = monthsArr[i];
		}
		else 
		{
			temp += "<tr align='right'>";
			tmpMonths = monthsArr[i];
		}
				
		temp+= "<td>" + tmpMonths + "</td><td>" + fnAddDollarSign(debtEarningsArr[i]) + "</td><td>" + fnAddDollarSign(debtInterestArr[i]) + "</td><td>" + fnAddDollarSign(debtNetEarningsArr[i]) + "</td><td>" + fnAddDollarSign(savingsEarningsArr[i]) + "</td><td>" + fnAddDollarSign(savingsInterestArr[i]) + "</td><td style='padding-right:5px;'>" + fnAddDollarSign(savingsNetEarningsArr[i]) + "</td></tr>";
		
		if(i%30 == 0) 
		{
			tableBody += temp;
			temp = "";
		}

	}
	tableBody+= temp + "</table>";
	table = tableBody;
		
	if(action == 'display')
	{
		ref = new fnGetObj('output');
		ref.obj.innerHTML = table;
		fnShowHideOutput('Show');
	}
	else if(action == 'print')
	{
		printPage = "<html><body onLoad='window.print();'><input type='button' value='Print' onClick='window.print();'>";
		
		header = "<table border='0' style='table-layout:fixed;font-size:12px;width:700px;border-top:1px; border-top-color:#C8CEA2; border-top-style:solid;border-left:1px; border-left-color:#C8CEA2; border-left-style:solid;border-right:1px; border-right-color:#C8CEA2; border-right-style:solid;border-bottom:1px; border-bottom-color:#C8CEA2; border-bottom-style:solid;'>"; 
		header+= "<tr style='font-weight:bold'>";
		header+= "<td rowspan='2' valign='bottom' align='right'>Months</td>";
		header+= "<td colspan='3' align='center' style='background:#000066; color:#FFFFFF;'>Pay Debt Early</td>";
		header+= "<td colspan='3' align='center' style='background:#FF6600; color:#FFFFFF;'>Invest in Savings</td>";
		header+= "</tr>";
		header+= "<tr style='font-weight:bold' align='right'>";
		header+= "<td>Earnings</td><td>Interest</td><td>Net Earnings</td><td>Earnings</td><td>Interest</td><td>Net Earnings</td>";
		header+= "</tr>";
		header+= "</table>";
		
		printPage+= header + tableBody;
		printPage+= "<script language='javascript'>window.print();</script>";
		
		printPage+= "</body></html>";
	
		newWin = window.open("", 'Payment', 'height=600,width=750,resizable=yes,scrollbars=yes,toolbar=yes,status=yes');
		newWin.document.write(printPage);
		newWin.window.focus();
		//newWin.window.print();
		//newWin.window.close();
	}
}

function fnShowHideOutput(action)
{
	//scroll(0,0); //Scroll to the top to solve a quirk with FF; when content is hidden, FF scrolls to the top by default, yet the Div is not centered.
	
	var Voffset = window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop; //Find how much the user scrolled vertically
	var Hoffset = window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft; //Find how much the user scrolled horizontally
	//alert("Voffset="+Voffset);
	//alert("Hoffset="+Hoffset);
	
	var winW = 630, winH = 460;

	if (parseInt(navigator.appVersion)>3) {
 		if (navigator.appName=="Netscape") {
 		 winW = window.innerWidth;
	  	 winH = window.innerHeight;
 		}
	 	if (navigator.appName.indexOf("Microsoft")!=-1) {
	 	 winW = document.body.offsetWidth;
	 	 winH = document.body.offsetHeight;
 		}
	}
	
	var trans = new fnGetObj('trans');
	var popup = new fnGetObj('outputDiv');
	
	//trans.style.width = winW + Hoffset;
	//trans.style.height = winH + Voffset;

	popup.style.marginLeft = ((winW + Hoffset)/2) - 350 + "px"; //Position:Fixed-> ((winW + Hoffset)/2) - 310 + "px"; Position:absolute -> (Hoffset - 310) + "px";
	popup.style.marginTop = ((winH + Voffset)/2) - 200 + "px"; //Position:Fixed-> ((winH + Voffset)/2) - 200 + "px";  Position:absolute -> (Voffset - 200) + "px";
	
	if(action == 'Show')
	{
		fnShowHide('trans', 'Show');
		fnShowHide('outputDiv', 'Show');
		//window.document.body.style.overflow = 'hidden';
		//window.document.body.scroll = 'no'; //Only works in IE
	}
	else if(action == 'Hide')
	{
		fnShowHide('trans', 'Hide');
		fnShowHide('outputDiv', 'Hide');
		//window.document.body.scroll = 'yes'; //Only works in IE
		//window.document.body.style.overflow = 'auto';
	}
}

function Browser() {

  var ua, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

var browser = new Browser(); 

// Global object to hold drag information.

var dragObj = new Object();

dragObj.zIndex = 5;

function fnDragStart(event, id) {

  var el;
  var x, y;

  // If an element id was given, find it. Otherwise use the element being
  // clicked on.
	
  if (id)
    dragObj.elNode = document.getElementById(id);
	
  else {
    if (browser.isIE)
      dragObj.elNode = window.event.srcElement;
	  
    if (browser.isNS)
      dragObj.elNode = event.target;
	 

    // If this is a text node, use its parent element.

    if (dragObj.elNode.nodeType == 3)
      dragObj.elNode = dragObj.elNode.parentNode;
	
  }

  // Get cursor position with respect to the page.

  if (browser.isIE) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  // Save starting positions of cursor and element.

  dragObj.cursorStartX = x;
  dragObj.cursorStartY = y;
  dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
  dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

  if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
  if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

  // Update element's z-index.

  dragObj.elNode.style.zIndex = ++dragObj.zIndex;

  // Capture mousemove and mouseup events on the page.

  if (browser.isIE) {
    document.attachEvent("onmousemove", fnDragGo);
    document.attachEvent("onmouseup",   fnDragStop);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS) {
    document.addEventListener("mousemove", fnDragGo,   true);
    document.addEventListener("mouseup",   fnDragStop, true);
    event.preventDefault();
  }
}

function fnDragGo(event) {

  var x, y;

  // Get cursor position with respect to the page.

  if (browser.isIE) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  // Move drag element by the same amount the cursor has moved.

  dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
  dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";
  
  /* //Drag Iframe div by same amount
  var dragIframe = new fnGetObj('iframeDiv'); //Iframe used to cover drop-down menu
  dragIframe.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
  dragIframe.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px"; */

  if (browser.isIE) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS)
    event.preventDefault();
}

function fnDragStop(event) {

  // Stop capturing mousemove and mouseup events.

  if (browser.isIE) {
    document.detachEvent("onmousemove", fnDragGo);
    document.detachEvent("onmouseup",   fnDragStop);
  }
  if (browser.isNS) {
    document.removeEventListener("mousemove", fnDragGo,   true);
    document.removeEventListener("mouseup",   fnDragStop, true);
  }
}


function fnUpdateTable()
{
	var ref, earnOrSave, returnOrInterest;
	decision = "";
	diff = 0;
	
	//BEGIN Earnings----
	//Debt
	ref = new fnGetObj('debtEarnings');
	//if(isNaN(debtEarningsArr[termOfDebt])) debtEarningsArr[termOfDebt] = 0;
	ref.obj.innerHTML = fnAddDollarSign(debtEarningsArr[termOfDebt]);
	
	
	//Savings
	ref = new fnGetObj('savingsEarnings');
	//if(isNaN(savingsEarningsArr[termOfDebt])) savingsEarningsArr[termOfDebt] = 0;
	ref.obj.innerHTML = fnAddDollarSign(savingsEarningsArr[termOfDebt]);
	//END Earnings-----
	
	//BEGIN Interest----
	//Debt
	ref = new fnGetObj('debtInterest');
	ref.obj.innerHTML = fnAddDollarSign(debtInterestArr[termOfDebt]);
	
	//Savings
	//ref = new fnGetObj('savingsInterest');
	//ref.obj.innerHTML = fnAddDollarSign(savingsInterestArr[termOfDebt]);
	//END Interest----
	
	//BEGIN Net Earnings----
	//Debt
	ref = new fnGetObj('debtNet');
	ref.obj.innerHTML = fnAddDollarSign(debtNetEarningsArr[termOfDebt]);
	
	//Savings
	ref = new fnGetObj('savingsNet');
	ref.obj.innerHTML = fnAddDollarSign(savingsNetEarningsArr[termOfDebt]);
	//END Net Earnings----
	
	//Decision
	diff = savingsNetEarningsArr[termOfDebt] - debtNetEarningsArr[termOfDebt];
	diff = Math.abs(diff);
	diff = fnAddDollarSign(diff);	
	
	if((debtNetEarningsArr[termOfDebt] - savingsNetEarningsArr[termOfDebt]) > 0.01)
	{
		decision = "<br>You will have <b>" + diff + "</b> more if you <b>pay off your debt early</b> rather than invest.<br><br>";	
		//fnChangeStyle('DebtTitle', '#000066', 'bold');
		//fnChangeStyle('SavingsTitle', '#000000', 'bold');
	}
	else if((debtNetEarningsArr[termOfDebt] - savingsNetEarningsArr[termOfDebt]) < - 0.01)
	{
		decision = "<br>You will have <b>" + diff + "</b> more if you <b>invest</b> rather than pay off your debt early.<br><br>";
		//fnChangeStyle('SavingsTitle', '#FF6600', 'bold');
		//fnChangeStyle('DebtTitle', '#000000', 'bold');
	}
	else
	{
		decision = "<br>Investing or paying off your debt early will yield the same result.<br><br>";
		//fnChangeStyle('SavingsTitle', '#000000', 'bold');
		//fnChangeStyle('DebtTitle', '#000000', 'bold');
	}

	ref = new fnGetObj('decision');
	ref.obj.innerHTML = decision;
}

function fnChangeStyle(id, color, fweight)
{
	var ref = new fnGetObj(id);
	ref.style.color = color;
	ref.style.fontWeight = fweight;
	
	var ref2 = new fnGetObj('print' + id);
	ref2.style.color = color;
	ref2.style.fontWeight = fweight;
}

function fnCheckLimits(element, value, limit)
{
	if(value > limit)
	{ 
		value = limit;
		document.getElementById(element).value = limit;
	}	
	return value;
}

function fnCalculateSavingsAndDebt()
{
	//Get monthly savings
	var ms = new fnGetObj('monthlySavings');
	
	//Get rate of return
	var rateOnSavings = new fnGetObj('rateOfReturn');
	rateOfReturn = rateOnSavings.obj.value;
	rateOfReturn = fnCheckLimits('rateOfReturn', rateOfReturn, 15);
	rateOfReturn = rateOfReturn/100;
	
	//Get tax rate
	var tax = new fnGetObj('taxrate');
	federalStateTaxRate = tax.obj.value;
	federalStateTaxRate = fnCheckLimits('taxrate', federalStateTaxRate, 50);
	federalStateTaxRate = federalStateTaxRate/100;
	
	//Get term of debt
	var debtterm = new fnGetObj('termOfDebt');
	termOfDebt = debtterm.obj.value;
	termOfDebt = fnCheckLimits('termOfDebt', termOfDebt, 360);
	if(termOfDebt < 1) termOfDebt = 1;
	//termOfDebt = termOfDebt/12;
	//termOfDebt = termOfDebt.toFixed(0);
	termOfDebt = parseFloat(termOfDebt);
		
	//Get amount owed
	var ao = new fnGetObj('amountOwed');
	
	//Get rate on Debt
	var debtRate = new fnGetObj('rateOnDebt');
	rateOnDebt = debtRate.obj.value;
	rateOnDebt = fnCheckLimits('rateOnDebt', rateOnDebt, 50);
	//rateOnDebt = rateOnDebt/100;
	
	//Reset Savings and Debt Arrays	
	fnDeclareArrays();		
	
	//BEGIN SAVINGS--------------------------------------------------------------------------------

	//Remove formatting from input value (monthly savings)
	monthlySavings = ms.obj.value;
	monthlySavings = monthlySavings.toString();
	monthlySavings = fnRemoveDollarSigns(monthlySavings);
	monthlySavings = fnRemoveCommas(monthlySavings);
	
	if (monthlySavings == "") monthlySavings = 0;
	
	//Start Validation
	if (fnValidateNumeric(monthlySavings) && monthlySavings >= 0) //Passed validation
	{			
		monthlySavings = parseFloat(monthlySavings);
			
					
		// Populate the Savings Array with values
		for(var i = 1; i <= termOfDebt; i++)
		{
			//alert("savingsEarningsArr[" + i + "]: " + savingsEarningsArr[i] + "\n" + "typeof(savingsEarningsArr[i]): " + typeof(savingsEarningsArr[i]));
			savingsEarningsArr[i] = fnCalculateSavingsFutureFactors(monthlySavings, i-1);
			if(savingsEarningsArr[i] < 0) savingsEarningsArr[i] = 0; //If value is negative, equal it to 0
			//alert("savingsEarningsArr[" + i + "]: " + savingsEarningsArr[i]);
		}
		savingsEarningsArr[1] = monthlySavings*(1-federalStateTaxRate)*rateOfReturn/12;
	}
	
	//END SAVINGS-----------------------------------------------------------------------------------------
	
	//BEGIN DEBT------------------------------------------------------------------------------------------
	
	//Remove formatting from input value (amount owed)
	amountYouOwe = ao.obj.value;
	
	amountYouOwe = amountYouOwe.toString();
	amountYouOwe = fnRemoveDollarSigns(amountYouOwe);
	amountYouOwe = fnRemoveCommas(amountYouOwe);
	
	if (amountYouOwe == "") amountYouOwe = 0;
	
	//Start Validation
	if (fnValidateNumeric(amountYouOwe) && amountYouOwe >= 0) //Passed validation
	{			
		amountYouOwe = parseFloat(amountYouOwe);
		termOfDebt = parseFloat(termOfDebt);

		// Populate the Debt Array with values
		/*
		for(var i = 1; i <= termOfDebt; i++)
		{
			savingsInterestArr[i] = fnCalculateDebtFutureFactors(amountYouOwe, i);
			if(savingsInterestArr[i] < 0) savingsInterestArr[i] = 0; //If value is negative, equal it to 0
			//alert("savingsInterestArr[" + i + "]: " + savingsInterestArr[i]);
		}*/
		
		var tmpInterest = 0;
		var totalInterest = 0;
		var tAmountYouOwe = amountYouOwe;
		var AmortizedPayment = (amountYouOwe*((rateOnDebt/(1200))/(1-(Math.pow(1+(rateOnDebt/(1200)),(-termOfDebt-1))))));		
		for(var i = 1; i <= termOfDebt && tAmountYouOwe>0; i++)
		{
			tmpInterest = tAmountYouOwe *(rateOnDebt/(1200));
			totalInterest += tmpInterest;
			savingsInterestArr[i] = -totalInterest;
			savingsNetEarningsArr[i] = savingsEarningsArr[i];
			tAmountYouOwe += tmpInterest - AmortizedPayment;			
		}
		
		var tmpInterest = 0;
		var totalInterest = 0;
		var InvestMonth = 0;
		var tAmountYouOwe = amountYouOwe;
		//var AmortizedPayment = (amountYouOwe*((rateOnDebt/(1200))/(1+(Math.pow(1+(rateOnDebt/(1200)),(-termOfDebt))))));		
		for(var i = 1; i <= termOfDebt; i++)
		{
			
			if (tAmountYouOwe>0) {
				tmpInterest = tAmountYouOwe *(rateOnDebt/(1200));
				totalInterest += tmpInterest;				
				tAmountYouOwe += tmpInterest - AmortizedPayment - monthlySavings;
				if (tAmountYouOwe<0) {
					//totalInterest += tAmountYouOwe;
					InvestMonth = i;
					//totalInterest -= fnCalculateSavingsFutureFactors(monthlySavings,(termOfDebt-i));
				}
				debtInterestArr[i] = -totalInterest - savingsInterestArr[i];
			} else {
				var tmpEarning = fnCalculateSavingsFutureFactors(monthlySavings,(i-InvestMonth-1));
				if (tmpEarning ==0) tmpEarning =  monthlySavings*(1-federalStateTaxRate)*rateOfReturn/12;
					
				debtInterestArr[i] = -totalInterest - savingsInterestArr[i];
				debtEarningsArr[i] = tmpEarning;
			}
			debtNetEarningsArr[i] = debtEarningsArr[i] + debtInterestArr[i];
			savingsInterestArr[i] = 0;
		}
		
		
	}
	//END DEBT--------------------------------------------------------------------------------------------
	
	//Update table
	fnUpdateTable();
	
	//Update Term Invested (either 'months' or 'years')
	var t, tOut;
		
	if(termOfDebt <= 23) tOut = "Months";
	else tOut = "Years";
	
	t = new fnGetObj('termInvested');
	t.obj.innerHTML = tOut;
	
	t = new fnGetObj('printTermInvested');
	t.obj.innerHTML = tOut;
	
	//Update graph
	clearTimeout(globalTimeout);
	globalTimeout = setTimeout("fnShowHide('loaderDiv', 'Show');", 100);
	globalTimeout = setTimeout("fnDrawGraph('chart');", 400);
	
	//Enable Print button if Amount Owed > 0	
	if(monthlySavings > 0 || amountYouOwe > 0)
	{
		var btn = new fnGetObj('printBtn');
		btn.obj.disabled = false;
		
		//btn = new fnGetObj('paymentSchedule');
		//btn.obj.disabled = false;
	}
	else
	{
		var btn = new fnGetObj('printBtn');
		btn.obj.disabled = true;
		
		//btn = new fnGetObj('paymentSchedule');
		//btn.obj.disabled = true;
	}
		
}

function fnCalculateSavingsFutureFactors(fieldValue, months)
{
	//Calculate Factors:
	var savings = 0;
	var AS = fieldValue; //* 12;
	
	var Y = months;
	var R = rateOfReturn;
	var T = federalStateTaxRate;
	var AR = (1-T)*R/12;

	var factor = (Math.exp(Y*Math.log(AR+1)) + (Math.exp((Y+1)*Math.log(AR+1)) - (AR+1))/AR);
	savings = AS*(factor);
	
	var output =  (AS*factor) - ((months+1)*AS);
	
	if(isNaN(output)) output = 0;
	return output;
}


var debt = 0;
var pay = 0; //Net monthly payment on debt after you pay with your monthly savings; default: $170
var inter = 0; //Interest rate if you DONT pay your debt
function fnCalculateDebtFutureFactors(fieldValue, months)
{
	var principal = parseFloat(fieldValue);
	var rate = rateOnDebt;
	var M = termOfDebt; //months;
	var Y = termOfDebt/12; //months / 12;
	
	if(Y == 0) debt = principal;
	else
	{
		var Payment = (principal*((rate/(1200))/(1-(Math.pow(1+(rate/(1200)),((Y*12)*-1))))));
		//pay = Payment + monthlySavings;
		var Interest = ((Payment*(Y*12))-principal);	
		//var Interest = ((pay*(Y*12))-principal);
		//alert("Payment: " + Payment + "\n" + "Interest: " + Interest);
		//var factor = (principal * ((rate)/(1-(Math.pow(1+(rate), (-Y))))));
		debt += (Payment + Interest); //termOfDebt
		//alert("Payment: " + Payment + "\n" + "Interest: " + Interest + "\n" + "M: " + M + "\n" + "Debt: " + debt);
		inter += Interest;
	}
	return debt;
	//return int;
}

var step = 0;
var divider = 0;
function fnScaleLabels(range)
{
	step = 0;
	divider = 0;
	if(range == 'months'){//Monthly	
		step = 1; divider = 1;
	}
	else if(range == 'yearly'){//Yearly
		step = 12; divider = 12;
	}
	else if(range == '5years'){//5 years
		step = 60; divider = 12;
	}
	else{ //10 years	
		step = 120; divider = 12;
	}
}

function fnDrawGraph(divID, action) 
{
	var c = new Chart(document.getElementById(divID));
	
	var labelArr = new Array();
	labelArr[0] = 0;
	
	var q, density;
	var d = 1;
	
	var emptyArr = new Array();

	if(termOfDebt < 24) fnScaleLabels('months');
	else if(termOfDebt <= 144) fnScaleLabels('yearly');
	else fnScaleLabels('5years');
	
	for(q=0; q <= termOfDebt; q++) 
	{
		if(termOfDebt < 24) // If 24 months or less, display all labels
		{
			labelArr[q] = Math.floor((q)/divider); 
			d++;
		}
		else // Else, scale labels
		{
			if((q+1)%step == 1) labelArr[q] = Math.floor((q+1)/divider); 
			else labelArr[q] = "";
		}
		
		emptyArr[q] = 0;
	}
		
	density = termOfDebt+1;	
	c.setDefaultType(CHART_LINE);
	c.setGridDensity(density, 9);
	//c.setVerticalRange(0, 100);
	c.setHorizontalLabels(labelArr);
	c.setShowLegend(false);
	//c.setPainterFactory(JsGraphicsChartPainterFactory); //SVGChartPainterFactory
	//c.setPainterFactory(CanvasChartPainterFactory);
	
	//alert(typeof(debtNetEarningsArr[0]));

	c.add('Net Debt', '#000066', debtNetEarningsArr);
	c.add('Net Savings', '#FF6600', savingsNetEarningsArr);
	//c.add('0', '#000000', emptyArr);
	
	
	fnShowHide('loaderDiv', 'Hide');
	
	c.draw();
	
	//window.onload = function() {
	//ieCanvasInit('../JSGraphics/iecanvas.htc');
	//draw(); 
	//};
	
}

function fnClearAll()
{
	//Hide Popups
	fnHideNote();
	
	//Clear all textboxes
	var ref;
	
	ref = new fnGetObj('amountOwed');
	ref.obj.value = "1";
	
	ref = new fnGetObj('rateOnDebt');
	ref.obj.value = "1";
	
	ref = new fnGetObj('termOfDebt');
	ref.obj.value = "1";
	
	ref = new fnGetObj('monthlySavings');
	ref.obj.value = "0";
	
	ref = new fnGetObj('rateOfReturn');
	ref.obj.value = "0";
	
	ref = new fnGetObj('taxrate');
	ref.obj.value = "0";
	
	fnCalculateSavingsAndDebt();
	
	//Disable Print button (Amount Owed and Monthly savings = 0)
	var btn = new fnGetObj('printBtn');
	btn.obj.disabled = true;
	
	//btn = new fnGetObj('paymentSchedule');
	//btn.obj.disabled = true;
	
	//Change Results table titles to default
	fnChangeStyle('DebtTitle', '#000000', 'bold');
	fnChangeStyle('SavingsTitle', '#000000', 'bold');
}

function fnReset()
{
	fnClearAll();
	
	var ref;
	
	ref = new fnGetObj('amountOwed');
	ref.obj.value = val1;
	
	ref = new fnGetObj('rateOnDebt');
	ref.obj.value = val2;
	
	ref = new fnGetObj('termOfDebt');
	ref.obj.value = val3;
	
	ref = new fnGetObj('monthlySavings');
	ref.obj.value = val4;
	
	ref = new fnGetObj('rateOfReturn');
	ref.obj.value = val5;
	
	ref = new fnGetObj('taxrate');
	ref.obj.value = val6;
	
	fnCalculateSavingsAndDebt();
	scroll(0,0); //Bump the page to the top.
}

function fnGeneratePrintPage()
{
	//Hide Popups
	fnHideNote();
	
	var ref, ref2, val;
	
	//Hide Normal DIVs
	var div = new fnGetObj('normalDIV');
	div.style.display = 'none';
	
	//Show Print DIV
	var div = new fnGetObj('printDIV');
	div.style.display = '';
	
	//Generate Printable chart
	fnDrawGraph('printchart');
		
	//Generate data for Results Table
	
	//BEGIN Earnings----
	//Debt
	ref = new fnGetObj('printDebtEarnings');
	ref.obj.innerHTML = fnAddDollarSign(debtEarningsArr[termOfDebt]);
	
	//Savings
	ref = new fnGetObj('printSavingsEarnings');
	ref.obj.innerHTML = fnAddDollarSign(savingsEarningsArr[termOfDebt]);
	//END Earnings-----
	
	//BEGIN Interest----
	//Debt
	ref = new fnGetObj('printDebtInterest');
	ref.obj.innerHTML = fnAddDollarSign(debtInterestArr[termOfDebt]);
	
	//Savings
	//ref = new fnGetObj('printSavingsInterest');
	//ref.obj.innerHTML = fnAddDollarSign(savingsInterestArr[termOfDebt]);
	//END Interest----
	
	
	//BEGIN Net Earnings----
	//Debt
	ref = new fnGetObj('printDebtNet');
	ref.obj.innerHTML = fnAddDollarSign(debtNetEarningsArr[termOfDebt]);
	
	//Savings
	ref = new fnGetObj('printSavingsNet');
	ref.obj.innerHTML = fnAddDollarSign(savingsNetEarningsArr[termOfDebt]);
	//END Net Earnings----
	
	//Decision
	ref = new fnGetObj('printDecision');
	ref.obj.innerHTML = decision;
	
	//Generate data for input table
	
	//Amount Owed
	ref = new fnGetObj('printAmountOwed');
	ref2 = new fnGetObj('amountOwed');
	val = fnRemoveCommas(ref2.obj.value);
	ref.obj.innerHTML = fnAddDollarSign(parseFloat(val));
	
	//Rate on Debt
	ref = new fnGetObj('printRateOnDebt');
	ref2 = new fnGetObj('rateOnDebt');
	ref.obj.innerHTML = ref2.obj.value + "%";
	
	//Term of Debt
	ref = new fnGetObj('printTermOfDebt');
	ref2 = new fnGetObj('termOfDebt');
	ref.obj.innerHTML = ref2.obj.value;
	
	//Monthly Savings
	ref = new fnGetObj('printMonthlySavings');
	ref2 = new fnGetObj('monthlySavings');
	val = fnRemoveCommas(ref2.obj.value);
	ref.obj.innerHTML = fnAddDollarSign(parseFloat(val));
	
	//Rate of Return
	ref = new fnGetObj('printRateOfReturn');
	ref2 = new fnGetObj('rateOfReturn');
	ref.obj.innerHTML = ref2.obj.value + "%";
	
	//Feferal and State Tax
	ref = new fnGetObj('printTaxRate');
	ref2 = new fnGetObj('taxrate');
	ref.obj.innerHTML = ref2.obj.value + "%";
}

function fnBackToNormal()
{
	//Hide Print DIV
	var div = new fnGetObj('printDIV');
	div.style.display = 'none';
	
	//Show Normal DIV
	var div = new fnGetObj('normalDIV');
	div.style.display = '';
	
	//Enable Print button
	var printbtn = new fnGetObj('printBtn');
	printbtn.obj.disabled = false;
	
	scroll(0,0); //Bump the page to the top.
	
	//Draw graph
	fnDrawGraph('chart');
}

var vals = "<br>";
function formatbignums(inputval)
{
	var decimalPlaces = 0;
	//alert("inputval: " + inputval + "\n" + "threshold: " + threshold);
 
	if(inputval > 0) //If value is positive, do normal scaling
	{
	   if(inputval < threshold) //Add decimal place
	   {
			if(graphDecimalsFlag2)  decimalPlaces = 1;   
			outputstring = fnAddCommas((inputval*ValScaler2*100)/100);
			outputstring = parseFloat(outputstring).toFixed(decimalPlaces) + label2;
			
			//if(inputval == 1000) outputstring = "1,000" + label2;
			//outputstring = "+" + outputstring;
	   }
	   else
	   {
		   if(graphDecimalsFlag)  decimalPlaces = 1;
			outputstring = fnAddCommas((inputval*ValScaler*100)/100);
			outputstring = parseFloat(outputstring).toFixed(decimalPlaces) + label;
			
			if(outputstring == 1) outputstring = "1,000";
			//outputstring = "+" + outputstring;
	   }
	}
	else if(inputval < 0) //If value is negative, reverse scaling
	{
	   if(inputval > -threshold) //Add decimal place
	   {
			if(graphDecimalsFlag2)  decimalPlaces = 1;   
			outputstring = fnAddCommas((inputval*ValScaler2*100)/100);
			outputstring = parseFloat(outputstring).toFixed(decimalPlaces) + label2;
			
			//if(inputval == -1000) alert("inputval==1000");//outputstring = "-1,000" + label2;
	   }
	   else
	   {
		   if(graphDecimalsFlag)  decimalPlaces = 1;
			outputstring = fnAddCommas((inputval*ValScaler*100)/100);
			outputstring = parseFloat(outputstring).toFixed(decimalPlaces) + label;
			
			//if(inputval == -1000) alert("inputval==1000");//outputstring = "-1,000" + label;
	   }
	}
	else outputstring = 0;
   
   //if(outputstring == "+1") outputstring = "+1,000";
   //if(outputstring == "-1") outputstring = "-1,000";

   return outputstring;
}
