function Loan(principal, interest, consolidate, type, timestamp) { //a Loan a borrower might have.
  this.validInterest = false;
  this.validPrincipal = false;
  this.validConsolidate = false;
  
  this.isValid = Loan_isValid;
  this.getPrincipal = Loan_getPrincipal;
  this.getInterest = Loan_getInterest;
  this.isConsolidate = Loan_isConsolidate;
  this.isConsolidateYesNo = Loan_isConsolidateYesNo;
  this.getType = Loan_getType;
  this.getTimestamp = Loan_getTimestamp;
  this.getID = Loan_getTimestamp;
  this.validatePrincipal = Loan_validatePrincipal;
  this.validateInterest = Loan_validateInterest;
  this.validateConsolidate = Loan_validateConsolidate;
 

  this.principal = this.validatePrincipal(principal);
  this.interest =  this.validateInterest(interest); 
  this.type = type; //must get for consolidation validation
  this.consolidate = this.validateConsolidate(consolidate);
  this.timestamp = timestamp;

}

function Loan_isValid() {
  return (this.validInterest & this.validPrincipal & this.validConsolidate);
}

function Loan_getPrincipal() {
  return parseFloat(this.principal);
}

function Loan_getInterest() {
  return  parseFloat(this.interest);
}

function Loan_isConsolidate() {
  return this.consolidate;
}

function Loan_isConsolidateYesNo() {
  if (this.consolidate) {return "yes";}
  else { return "no";}
}
function Loan_getTimestamp() {
  return this.timestamp;
}

function Loan_getType() {
  return this.type;
}

function Loan_validatePrincipal(num) {
  num = parseFloat(num.toString().replace(/\$|\,/g,''));
  if (isNaN(num)) {
    alert("Please enter a valid Loan Balance");
    return num;
  } else {
    this.validPrincipal = true; 
    return num;
  }
}

function Loan_validateInterest(num) {
  num = parseFloat(num.toString().replace(/\$|\,/g,''));
 
  if (isNaN(num) || num > 24 || num < 1.25) {
    alert("please enter an interest rate above 1.25%, but below 24%");
    return NaN;
  } else {
    
    this.validInterest = true;
    return num;
  }

}

function Loan_validateConsolidate(bool) {
  if ((this.type == "PRIVATE") & bool) {
    alert("Private Loans may not be selected for consolidation. Please un-check the \"Consolidate\" box and continue");
    return false;
  } else {
    this.validConsolidate = true;
    return bool;
  }

}


/************ LOAN LIST ***************/

function LoansList() { //a list of various Loans. 
  this.loans = new Array();
 
  this.interest = parseFloat("0.0");
 
 this.RightRate = false;
 this.isRightRate = LoansList_isRightRate;
  this.add = LoansList_add;
  this.remove = LoansList_remove;
  this.getLoan = LoansList_getLoan;
  this.getElementAt = LoansList_getLoan;
  this.getLength = LoansList_getLength;
  this.getTotal = LoansList_getTotal;
  this.getConsolidationTotal = LoansList_getConsolidationTotal;
  this.getTermYears = LoansList_getTermYears ;
  this.getTermPeriods = LoansList_getTermPeriods ;
  this.getTermTotal = LoansList_getTermTotal ;
  this.getRate = LoansList_getRate ; 
  
}

function LoansList_add(loan) {
  if (loan.isValid()) {
    this.loans[this.loans.length] = loan ; 
    if (loan.getType() == "DIRCON") this.RightRate = true;
    return true;
  } else {
    return false;
  }
}

function LoansList_remove(loanID) {
  var tmpArr = new Array();
 this.RightRate = false;
  for (var i = 0 ; i < this.loans.length; i++ ) {
    if (this.loans[i].getTimestamp() != loanID) {
      tmpArr[tmpArr.length] = this.loans[i];
      if (this.loans[i].getType() == "DIRCON") this.RightRate = true;
    }
 
  }
  this.loans = tmpArr;

}

function LoansList_getLength() {
  return this.loans.length;
}

function LoansList_getLoan(index) {
  return this.loans[index];
}

function LoansList_isRightRate() {
  return this.RightRate;
}

function LoansList_getTotal() {
  var balance = parseFloat("0.0");
  for (var i = 0 ; i < this.loans.length; i++) {
    balance += this.loans[i].getPrincipal();
  }
  return balance;
}

function LoansList_getTermTotal() {
  var balance = parseFloat("0.0");
  var ffelpBal = parseFloat("0.0");
  var healBal = parseFloat("0.0");
  var privBal =  parseFloat("0.0");
  this.RightRate = false;
  for (var i = 0 ; i < this.loans.length; i++) {
    if(this.loans[i].getType() == "FFELP" || ((this.loans[i].getType() == "DIRCON") & this.loans[i].isConsolidate())) {
      ffelpBal += this.loans[i].getPrincipal();
    }
    if(this.loans[i].getType() == "HEAL") {
      healBal += this.loans[i].getPrincipal();
    }
    if(this.loans[i].getType() == "PRIVATE" || ((this.loans[i].getType() == "DIRCON") & !this.loans[i].isConsolidate()) ) {
      privBal += this.loans[i].getPrincipal();
    } 
    if((this.loans[i].getType() == "DIRCON") & this.loans[i].isConsolidate()) {
      this.RightRate = true;
    }
  }
  balance = ffelpBal + healBal;
  if (privBal < balance) {
    balance += privBal; //if private loans are a minority, add to subtotal
  }else {
    balance *= 2; //otherwise if private loans are majority, double subtotal
  }
 
  return balance;

}

function LoansList_getConsolidationTotal() {
  var balance = parseFloat("0.0");
  for (var i = 0 ; i < this.loans.length; i++) {
    if (this.loans[i].isConsolidate()) {
      balance += this.loans[i].getPrincipal();
    }
  }
  return balance;
}

function LoansList_getTermYears() {  //in Years
  var balance = this.getTermTotal(); //Best to get fresh numbers.
  var term = 12;
  if (balance > 59999) {
    term = 30;
  } else if (balance > 39999) {
    term = 25;
  } else if (balance > 19999) {
    term = 20;
  } else if (balance > 9999) {
    term = 15;
  } else if (balance == 0) {
    term = 0;
  }
  return term;

}

function LoansList_getTermPeriods() { 
  var term = 0;                          
  term = this.getTermYears() * 12;
  return term;
}

function LoansList_getRate() {

  if (this.getLength() > 0 ) {

    var consolidationBal = this.getConsolidationTotal();
    var ffelpBal = parseFloat("0.0");
    var healBal = parseFloat("0.0");
    var ffelpRate = parseFloat("0.0");
    var healRate = parseFloat("0.0");
    var interest = parseFloat("0.0");
    for (var i = 0; i < this.loans.length; i++ ) {
      if((this.loans[i].type == "FFELP") & this.loans[i].isConsolidate()) {
	ffelpBal += this.loans[i].getPrincipal();
      }
      if((this.loans[i].type == "HEAL") & this.loans[i].isConsolidate()) {
	healBal += this.loans[i].getPrincipal();
      }
    }

    for (var i = 0; i < this.loans.length; i++ ) {
      if((this.loans[i].type == "FFELP") & this.loans[i].isConsolidate()) {
	ffelpRate += (this.loans[i].getPrincipal() * this.loans[i].getInterest() / ffelpBal);
      }
      if((this.loans[i].type == "HEAL") & this.loans[i].isConsolidate()) {
	healRate += (this.loans[i].getPrincipal() * this.loans[i].getInterest() / healBal);
      }
      if((this.loans[i].getType() == "DIRCON") & this.loans[i].isConsolidate()) {
      ffelBal += this.loans[i].getPrincipal();
      this.RightRate = true;
    }
    }
 
   interest = setScale( (ffelpRate * (ffelpBal / consolidationBal) + healRate * (healBal / consolidationBal)),3);
    if (parseFloat(interest) < parseFloat("8.875")) { //why? Because we cap at 9%. I suppose we could round, then cap. This version is Brandan's
      interest = (Math.ceil(interest/.125)) * .125;
    } else {
      interest = 9.000;
    }
 
  } else {
    interest = 0;
  }
  
  return interest;
}








