// JavaScript Document

function calculator_mortgage_check_number(input, min, max, msg) {
      msg = msg + " field has invalid data: " + input.value;
    
      var str = input.value;
      for (var i = 0; i < str.length; i++) {
        var ch = str.substring(i, i + 1)
        if ((ch < "0" || "9" < ch) && ch != '.') {
          alert(msg);
          return false;
        }
      }
      var num = 0 + str
      if (num < min || max < num) {
        alert(msg + " not in range [" + min + ".." + max + "]");
        return false;
      }
      input.value = str;
      return true;
    }

    function calculator_mortgage_calculate_field(input) {
      if (input.value != null && input.value.length != 0)
        input.value = "" + eval(input.value);
        calculator_mortgage_calculate_form(input.form);
      }

    function calculator_mortgage_calculate_form(form) {
      if ((form.payments.value == null || form.payments.value.length == 0) || (form.interest.value == null || form.interest.value.length == 0) || (form.principal.value == null || form.principal.value.length == 0)) {
        return false;
      }

      if (!calculator_mortgage_check_number(form.payments, 1, 480, "# of payments") || !calculator_mortgage_check_number(form.interest, .001, 99, "Interest") || !calculator_mortgage_check_number(form.principal, 100, 10000000, "Principal")) { 
        form.payment.value = "Invalid";
        return false;
      }

      var i = form.interest.value;
   
      i = i / 100.0;
      m = Math.pow((1 + i/2), (1/6));
      i = m-1;
      n = form.payments.value * 12;

      var pow = 1;
      for (var j = 0; j < n; j++)
      pow = pow * (1 + i);
      form.payment.value = (form.principal.value * pow * i) / (pow - 1)
      form.payment.value = calculator_mortgage_exact(form.payment.value, 15, 1);
    }

    function calculator_mortgage_exact(val, len, decimal) {
      if(decimal == null)
        decimal = 1;
        scale = Math.pow(10, decimal+1);
        tStr = "" + Math.round(parseFloat(val) * scale);
      if(tStr.length == 0 || tStr == "0") {
        tStr = "0";
        for(var i=0; i<=decimal; i++)
        tStr += "0";
      }
      str = "." 
      + tStr.substring(tStr.length-decimal-1,
      tStr.length);
      for(i=tStr.length-decimal-2, j=0 ; i>=0; i--) {
        if(++j > 3) {
          str = "," + str;
          j = 0;
        }
        str = tStr.substring(i, i+1) + str;
      }
      str = "$" + str;
      i = len - str.length;
      return str;
    }

    function calculator_mortgage_dollar(str) {
      tStr = "";
      for(var i=0; i<str.length; i++) {
        ch = str.substring(i, i + 1);
        if((ch >= '0' && ch <= '9') || ch == '.')
        tStr += ch;
      }
    }
	
	function calculator_loan_check_number(input, min, max, msg) {
      msg = msg + " field has invalid data: " + input.value;

      var str = input.value;
      for (var i = 0; i < str.length; i++) {        // ensure the input string is a number
        var ch = str.substring(i, i + 1)
        if ((ch < "0" || "9" < ch) && ch != '.') {  // check whether the character is a digit or decimal point
          alert(msg);                               // error!
          return false;
        }

      }

      var num = 0 + str
      if (num < min || max < num) {
        alert(msg + " not in range [" + min + ".." + max + "]");
        return false;
      }

      input.value = str;
      return true;
    }

    function calculator_loan_calculate_field(input) {
      if (input.value != null && input.value.length != 0)
        input.value = "" + eval(input.value);
      calculator_loan_calculate_form(input.form);
    }

    function calculator_loan_calculate_form(form) {
      // are any fields blank? if so, exit now
      if ((form.payments.value == null || form.payments.value.length == 0) || (form.interest.value == null || form.interest.value.length == 0) || (form.principal.value == null || form.principal.value.length == 0)) {
        return false;
      }

      if (!calculator_loan_check_number(form.payments, 1, 480, "# of payments") || !calculator_loan_check_number(form.interest, .001, 99, "Interest") || !calculator_loan_check_number(form.principal, 100, 10000000, "Principal")) {
        form.payment.value = "Invalid";
        return false;
      }

      var i = form.interest.value;
      if (i > 1.0)
        i = i / 100.0;
        i /= 12;

        var pow = 1;
        var answer;
        for (var j = 0; j < form.payments.value; j++)
                pow = pow * (1 + i);
        form.payment.value = (form.principal.value * pow * i) / (pow - 1);
        form.payment.value = calculator_loan_exact(form.payment.value, 15, 1);
    }

    function calculator_loan_exact(val, len, decimal) {
        if(decimal == null)
                decimal = 1;
        scale = Math.pow(10, decimal+1);
        tStr = "" + Math.round(parseFloat(val) * scale);

        if(tStr.length == 0 || tStr == "0") {
                tStr = "0";
                for(var i=0; i<=decimal; i++)
                        tStr += "0";
        }

        str = "." + tStr.substring(tStr.length-decimal-1, tStr.length);
        for(i=tStr.length-decimal-2, j=0 ; i>=0; i--) {
                if(++j > 3) {
                        str = "," + str;
                        j = 0;
        }
      str = tStr.substring(i, i+1) + str;
      }

      str = "$" + str;
      i = len - str.length;
      return str;
    }
	
	function calculator_mortgage_education_verify_whole(num) {
    	if (num.indexOf(".") > -1)
    		return false
    	else  
    		return true
    }

    function calculator_mortgage_education_calculate_resp(theForm) {
      with (theForm) {
    	 /* if (parseInt(calculator_mortgage_education_strip_commas(theForm.AnnualContribution.value)) > 4000){
    	    alert("Annual Contribution cannot exceed $4000.00");
    			theForm.AnnualContribution.value = "";
    			theForm.AnnualContribution.focus();
    			return false;
      	}*/
        theForm.CurrentSavings.value = parse_value(calculator_mortgage_education_strip_commas(theForm.CurrentSavings.value));
      	theForm.AnnualContribution.value = parse_value(calculator_mortgage_education_strip_commas(theForm.AnnualContribution.value));
        interest_selected=theForm.interest.options[theForm.interest.selectedIndex].value;
      	i = parseFloat(interest_selected);
      	i = i / 100.0;
		
		var d = new Date();
		var curr_year = d.getFullYear();
		
        NumOfYears_selected=theForm.NumOfYears.options[theForm.NumOfYears.selectedIndex].value;
        year_born = NumOfYears_selected;
      	NumOfYears_selected=parseFloat(NumOfYears_selected)+17-curr_year;

	      // calculate
		
		
	      years_old = curr_year-parseInt(year_born);
		  if(years_old < 0) years_old = 0;
		  
	      years_to_18 = 18-parseInt(years_old);
		  years_to_17 = 17-parseInt(years_old);
        temp_years = parseInt(theForm.withdrawfunds.value)-parseInt(years_old);
      	years_of_nogovt_contrib = parseInt(temp_years) - parseInt(years_to_17);
        if (parseInt(temp_years) >  25) {
	        alert("The account must be deregistered by December 31 of the year that the plan has its 25th anniversary.  You have selected - "+temp_years+" years");
          theForm.withdrawfunds.focus();
	         return false;
      	}
	
        CurrentSavings_stripped = calculator_mortgage_education_strip_commas(theForm.CurrentSavings.value);
	      AnnualContribution_stripped = calculator_mortgage_education_strip_commas(theForm.AnnualContribution.value);

        // static variables finished

	      if (parseFloat(AnnualContribution_stripped) <= 2000){
      		flGovernmentContribution = parseFloat(AnnualContribution_stripped) * 0.2 * parseFloat(NumOfYears_selected);
      		govt_contrib_peryear = parseFloat(AnnualContribution_stripped) * 0.2;
      	}	else {
      		flGovernmentContribution = 500 * parseFloat(NumOfYears_selected)
      		govt_contrib_peryear = 500;
      	}

		if(flGovernmentContribution > 7200) flGovernmentContribution = 7200;
      	flGovernmentContribution = Math.round(100 * flGovernmentContribution) / 100;
		
      	strResult = "" + eval(flGovernmentContribution);
      	if (calculator_mortgage_education_verify_whole(strResult))
    		strResult = strResult + ".00"
      	if (strResult.charAt(strResult.indexOf(".") + 2) == '') 
    		strResult = strResult + '0';
      	GovernmentContribution.value = strResult
      	theForm.GovernmentContribution.value = parse_value(theForm.GovernmentContribution.value);
        interest_value = 0;
        current_value = parseFloat(CurrentSavings_stripped);
      	interest_rate = parseFloat(interest_selected)/100;
      	current_contribution = 0;
      	for (a=0; a<NumOfYears_selected; a++){
          current_contribution = current_contribution + parseFloat(AnnualContribution_stripped);
          if (parseFloat(current_contribution) > 50000) {
		        AnnualContribution_stripped = 0;
      	  }
          current_value = parseFloat(current_value) + parseFloat(AnnualContribution_stripped);
	        interest_value_new = ((parseFloat(current_value) + parseFloat(govt_contrib_peryear)) * parseFloat(interest_rate));
		      interest_value = parseFloat(interest_value) + parseFloat(interest_value_new);
		      current_value = parseFloat(current_value) + parseFloat(govt_contrib_peryear) + parseFloat(interest_value_new);
        }
	      for (b=0; b<parseInt(years_of_nogovt_contrib); b++) {
	        current_contribution = current_contribution + parseFloat(AnnualContribution_stripped);
		      if (parseFloat(current_contribution) > 50000) {
            AnnualContribution_stripped = 0;
		      }
          current_value = parseFloat(current_value) + parseFloat(AnnualContribution_stripped);
          interest_value_new = (parseFloat(current_value) * parseFloat(interest_rate));
          interest_value = parseFloat(interest_value) + parseFloat(interest_value_new);
          current_value = parseFloat(current_value) + parseFloat(interest_value_new);
        }
        funds = ""+Math.round(100*current_value)/100+"";
        checkdecimal = parseInt(funds.length) - (parseInt(funds.indexOf('.')+1));
        if (parseInt(checkdecimal) == 1){
          funds = ""+funds+"0";
        }

        theForm.FundsAvailable.value = parse_value(funds);
        return true;
      }
    }

    function parse_value(float_value) {
      number = ""+float_value+"";
      anydecimals = number.indexOf('.');
	    if (anydecimals >= 0) {
	      decimal_value = number.substring (number.indexOf('.')+1, number.length);
	      if (decimal_value.length > 2) {
	        third = decimal_value.substring (2,3);
	        if (parseInt(third) >= 5) {
			      if (parseInt(decimal_value.substring (0,1)) != 9) {
				      if (parseInt(decimal_value.substring (1,2)) != 9) {
		            first = decimal_value.substring (0,1);
			          second = parseInt(decimal_value.substring (1,2))+1;
			          decimal_part = ""+first+second+"";
					    }
				    }
				    if (parseInt(decimal_value.substring (1,2)) == 9) {
				      if (parseInt(decimal_value.substring (0,1)) < 9) {
				        first = parseInt(decimal_value.substring (0,1))+1;
					      decimal_part = ""+first+"0";
					    }
				    }
				    if (parseInt(decimal_value.substring (0,1)) == 9) {
				      if (parseInt(decimal_value.substring (1,2)) == 9) {
					      decimal_part = "00";
					      number = ""+(parseFloat(float_value)+1.00)+"";
					    } else {
					      second = parseInt(decimal_value.substring (1,2))+1;
					      decimal_part = "9"+second+"";
    					}
				    }
		      } else {
            firsttwo = decimal_value.substring (0,2);
		        decimal_part = ""+firsttwo+"";
          }
        } else {
          decimal_part = decimal_value;
		    }
	 	    integer_part = ""+number.substring (0, number.indexOf('.'))+"";

	      if (integer_part.length > 3) {
          a = new Array();
	        a = integer_part.split("");
	        b = new Array();
	        b_count = 0;
	        comma_count = 0;
	        for (i=a.length-1; i>=0; i--) {
	          b[b_count] = a[i];
	          comma_count++;
		        b_count = b_count+1;
		        if (comma_count == 3) {
			        if (i != 0) {
			          b[b_count] = ","
			          comma_count = 0;
			          b_count=b_count+1;
		          }
			      }
	        }
	        integer_part_joined = "";
	        for (i=b_count-1;i>=0; i--){
	          integer_part_joined = ""+integer_part_joined+b[i]+"";
	        }
	        return (""+integer_part_joined+"."+decimal_part+"");
	      } else {
	        return (""+integer_part+"."+decimal_part+"");
	      }
      }	else if (number.length > 3) {
        a = new Array();
	      a = number.split("");
	      b = new Array();
	      b_count = 0;
	      comma_count = 0;
	      for (i=a.length-1; i>=0; i--){
	        b[b_count] = a[i];
		      comma_count++;
		      b_count = b_count+1;
		      if (comma_count == 3){
			      if (i != 0){
			        b[b_count] = ","
			        comma_count = 0;
			        b_count=b_count+1;
	          }
		      }
        }
        number_part_joined = "";
 	      for (i=b_count-1;i>=0; i--) {
          number_part_joined = ""+number_part_joined+b[i]+"";
        }
        return (""+number_part_joined+".00");
      } else {	
        return (""+number+".00");
      }
    }

    function calculator_mortgage_education_strip_commas(number) {
	    a = new Array();
	    a = number.split("");
	    b = new Array();
	    b_count = 0;
	    for (i=0;i<=a.length-1;i++) {
	      if (a[i] != ",") {		  
	        b[b_count] = a[i];
		      b_count++;
		    }  
	    }

      number_stripped = "";
	    for (i=0; i<=b_count-1; i++) {
	      number_stripped = number_stripped + b[i];
	    }
	    return (""+number_stripped+"");
    }
	
	function calculator_retirement_check_number(input, min, max, msg) {
      msg = msg + " field has invalid data: " + input.value;
      var str = input.value;
      for (var i = 0; i < str.length; i++) {
        var ch = str.substring(i, i + 1)
        if ((ch < "0" || "9" < ch) && ch != '.') {
            alert(msg);
            return false;
        }
      }
      var num = 0 + str
      if (num < min || max < num) {
        alert(msg + " not in range [" + min + ".." + max + "]");
        return false;
      }
      input.value = str;
      return true;
    }

    function calculator_retirement_calculate_field(input) {
      if (input.value != null && input.value.length != 0)
      input.value = "" + eval(input.value);
      calculator_retirement_calculate_form(input.form);
    }

    function calculator_retirement_calculate_form(form) {
      if ((form.payments.value == null || form.payments.value.length == 0) || (form.interest.value == null || form.interest.value.length == 0) || (form.principal.value == null || form.principal.value.length == 0)) {
        return false;
      }

      if (!calculator_retirement_check_number(form.payments, 1, 480, "# of payments") || !calculator_retirement_check_number(form.interest, .001, 99, "Interest") || !calculator_retirement_check_number(form.principal, 100, 10000000, "Principal")) { 
        form.payment.value = "Invalid";
        return false;
      }

      var i = form.interest.value;
      i = i / 100.0;
      var m = Math.pow((1 + i), form.payments.value);
      form.payment.value = (form.principal.value * m) + form.annual.value*(1 + i * 1) * ((m - 1)/i);
      form.payment.value = calculator_retirement_exact(form.payment.value, 10, 2);
    }

    function calculator_retirement_exact(val, len, decimal) {
      if(decimal == null)
      decimal = 1;
      scale = Math.pow(10, decimal+1);
      tStr = "" + Math.round(parseFloat(val) * scale);
      if(tStr.length == 0 || tStr == "0") {
        tStr = "0";
        for(var i=0; i<=decimal; i++)
        tStr += "0";
      }
      str = "." 
      + tStr.substring(tStr.length-decimal,
      tStr.length);
      for(i=tStr.length-decimal-2, j=0 ; i>=0; i--) {
        if(++j > 3) {
          str = "," + str;
          j = 0;
        }
        str = tStr.substring(i, i+1) + str;
      }
      str = "$" + str;
      i = len - str.length;
      return str;
    }
