// JavaScript Document
<!--
/* hide Mortgage Calculators script from non scriptable browsers

 LANGUAGE: JavaScript 1.1 compliant

  PATTERN: MVC

*/

window.onerror=null;

bState = true;

oReq = new Collection("mortgage amount","mortgage interest rate","mortgage length","","","");

oVal = new Collection("mortgage amount","mortgage interest rate","mortgage length","","","");

oType = new Collection("int","flt","int","","",""); //number type

oMin = new Collection(10000,3,1,"","",""); //min values

oMax = new Collection(3000000,25,40,"","",""); //max values

function controller(oForm) 
{

   while (bState) 
   {
      if (!Required(oForm))
         break;
      if (!Validate(oForm))
         break;
      if (!SetValue(oForm))
         break;
      if (bState) 
	  {
          bState = false;
      }

   }

   bState = true;
}

function Required(oView) 
{

   for (i in oView) 
   {
      for (j in oReq) 
	  {
        if (i==oReq[j]) 
		{      
           if (isMissing(oView[i])) 
		   {
               return(false);
           }
        }
     }
  }

  return(true);
}

function Validate(oView) 
{
   for (i in oView) 
   {
      for (j in oVal) 
	  {
        if (i==oVal[j] && oType[j]!="") 
		{      
           if (isTest(oView[i], oType[j])) 
		   {
               return(false);
           }
        }
     }
  }
  return(true);
}

function SetValue(oView) 
{
   Mortgage = new Loan(stripFormatting(oView.amount.value), stripFormatting(oView.rate.value), oView.years.value, 0, get_checked(oView.frequency), 0);

   Mortgage.calcPeriods();

   Mortgage.calcPayment();

   oView.payment.value = calcRound(Mortgage.Payment);

   return(true);

}

function isMissing(oCtrl) 
{
	if (oCtrl.value == "") 
	{  
		alert("You have left a required value blank. Please type a number"); 
		oCtrl.focus();
      	oCtrl.select();
		 return(true);
    }
   	else
    { 
		return(false);
   	}
}

function isTest(oCtrl, oTest) 
{
	var input = stripFormatting(oCtrl.value);
    if ((oTest=="int" && !isInteger(input))||(oTest=="flt" && !isNumber(input)))
    {
      alert("The '"+oCtrl.name+"' field contains an invalid character. Please enter a number.");
      oCtrl.focus();
      return(true);
	}
	else
	{ 
      return(false);
	}
}

function isNumber(input) 
{
	var dec = 0;
   for (var i=0;i<input.length;i++) 
   {
       var oneChar = input.substring(i, i+1);
	 
       if (oneChar < "0" || oneChar > "9") 
	   {
          if (oneChar == ".") 
		  {
			  dec++;
		  }
		  else
		  { 
             return(false);
          }
       }
   }
   if(dec >1)
   {
	   return(false);
   }
   else
   {
   		return(true);
   }
}

function isInteger(input)
{
   for (var i=0;i<input.length;i++) 
   {
       var oneChar = input.substring(i, i+1);
       if (oneChar < "0" || oneChar > "9") 
	   {  
             return(false);
       }
   }
   return(true);
}

function inRange(oCtrl, minVal, maxVal)
{
	var input = oCtrl;
	if (maxVal == ""||maxVal == null)
	{
		if (parseFloat(input) < minVal)
		{
			  return(minVal);
		}
	}
	else
	{
		if (parseFloat(input) < minVal)//if under set to min limit
		{
			  return(minVal);
		}
		if(parseFloat(input) > maxVal) //if over set to max limit
		{
			  return(maxVal);
		}
	}
	return input;
}


function Collection(item1, item2, item3, item4, item5, item6) 
{
   this.item1 = item1;
   this.item2 = item2;
   this.item3 = item3;
   this.item4 = item4;
   this.item5 = item5;
   this.item6 = item6;
}

function Loan(Amount, Rate, Term, Payment, Frequency, Periods ) 
{
   this.Amount = Amount;

   this.Rate = Rate;

   this.Term = Term;

   this.Payment = Payment;

   this.Frequency = Frequency;

   this.Periods = Periods;

   this.calcPeriods = calcPeriods;

   this.calcPayment = calcPayment;
}

function calcPayment() 
{
   this.Payment = (this.Amount*((this.Rate/(this.Periods*100))/(1-(Math.pow(1+(this.Rate/(this.Periods*100)),((this.Term*this.Periods)*-1))))));
}

function calcPeriods() 
{
   switch (this.Frequency)
   {
	   case "monthly":
	   	this.Periods=12;
	   break;
	   case "fortnightly":
	   	this.Periods=26;
	   break;
	   case "weekly":
	   	this.Periods=52;
		break;	
   }
}

function calcRound(num) 
{
   var result="$"+formatInt(num)+".";

   var cents=100*(num-Math.floor(num))+0.5;

   result += Math.floor(cents/10);

   result += Math.floor(cents%10);

	if (result < 1)
	{
		result = 0;
	}
   return(result);
}



function select_item(name, value) 
{  
   this.name = name;
   this.value = value;
}

function get_selection(select_object) 
{   
   contents = new select_item()

   for(var i=0;i<select_object.options.length;i++)
	{
      if(select_object.options[i].selected == true) 
	  {
        contents.name = select_object.options[i].text;
        contents.value = select_object.options[i].value;
      }      
	}
   return(contents.name);
}

function radio_item(value) 
{   
   this.value = value;
}

function get_checked(radio_object)
{
	contents = new radio_item();
	
	for(var i=0;i<radio_object.length;i++)
	{
      if(radio_object[i].checked == true) 
	  {
        	contents.value = radio_object[i].value;
      }   
	}
   return(contents.value);
}

function clearResult()
{
	document.mortgagecalc.payment.value = "";
}

function setfocus()   
{ 
   document.MORTGAGE.AMOUNT.focus();

   document.MORTGAGE.AMOUNT.select();
}

function formatInput(input,type)
{
	var value = stripFormatting(input.value);
	
	for (b in oVal) 
	{
		if(oVal[b] == input.name)
		{
			if(!isNumber(value)||value.isNaN)
			{	
				value = String(oMin[b]);
			}
			else
			{
				value = String(inRange(value, oMin[b], oMax[b]));
			}
		}
	}
	switch (type)
	{
		case "int": //integer
			input.value = formatInt(value);
			break;
		case "cur": //currency - no cents
			input.value = "$"+formatInt(value);
			break;
		case "flt": //float - 2 decimal places
			input.value = formatFlt(value)+"%";
			break;
	}
}
function formatInt(num)
{
	num = String(Math.floor(num));
	var len = num.length;
	var result = "";
	if (len < 4)
	{
		result = num;
	}
	else
	{
		var unary = "";
		if(num.charAt(0) == "-")
		{
			num = num.substr(1,(len-1)); //remove minus sign
			unary = "-";
			len -=1;
		}
		for(i=len;i>=0;i--)
		{
			if(((len-i)%3 == 0)&&(i != len)&&(len-i != len))
			{
				result = ","+num.charAt(i)+result;
			}
			else
			{
				result = num.charAt(i)+result;
			}
		}
		result = unary+result;
	}
	return result;
}

function formatFlt(num)
{
	var result=formatInt(num);
	var decimal = num.indexOf(".");
	
	if (decimal > -1)
	{
		var len = num.length;
		var dnum = num.substring(decimal+1,len);
		
		var dlen = dnum.length;
		switch (dlen)
		{
			case 0:
				result = result+".00";
				break;
			case 1:
				result = result.concat(".",num.substr(decimal+1,1),"0");
				break;
			case 2:
				result = result.concat(".",num.substr(decimal+1,2));
				break;
			default:
				 d1 = num.substr(decimal+1,2);
				 d2 = num.substring(decimal+3,len);
				 dnum = d1.concat(".",d2);
				 dnum = Math.round(dnum);
				 if(dnum == 100)
				 {
					 result = parseInt(result)+1;
					 result = result+".00";
				 }
				 else
				 {
				 	result = result.concat(".",dnum);
				 }
				break; 
		 }
	}
	else
	{
		result = result+".00";
	}

   return(result);
}

function stripFormatting(input)
{
	var value = input.replace(/,/g,"");
	value = value.replace(/\$/g,"");
	value = value.replace(/%/g,"");
	
	return value;
}

function prepareEdit(input)
{
	input.value = stripFormatting(input.value);
	input.select();
}
// unhide 

function Certify(URL) {
  popupWin = window.open(URL, 'Participant', 'location,scrollbars,width=450,height=300')
  window.top.name = 'opener';
}
function blockNonNumbers(type)
{
	switch (type)
	{
		case "int":
		if (event.keyCode < 48 || event.keyCode > 57)
		{
			 event.returnValue = false;
		}
		break;
		case "flt":
		if ((event.keyCode < 48 || event.keyCode > 57) && event.keyCode != 46)
		{
			 event.returnValue = false;
		}
	}
}


// -->
   