var mstrEditFeeURL = null;
var mobjWindow = null;

function Browser() {

  var ua, s, i;

  this.isIE    = false;  // Internet Explorer
  this.isNS    = false;  // Netscape
  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();

function initialize() {
	var objBalloon = document.LoanForm.Balloon;
	var objAmortization = document.LoanForm.AmortizationTerm;
	var objBalance = document.LoanForm.Balance;
	var objPaymentsPerYear = document.LoanForm.PaymentsPerYear;
	var objNumberOfPayments = document.LoanForm.NumberOfPayments;
	var objPayment = document.LoanForm.DesiredPayment;
	var objInterestRate = document.LoanForm.APR;
	var objEffectiveDate = document.LoanForm.LoanDate;
	var objFirstDateDue = document.LoanForm.FirstDateDue;
	var objBuyerBirthDate = document.LoanForm.BuyerBirthDate;
	var objCoBuyerBirthDate = document.LoanForm.CoBuyerBirthDate;
	var objFees = document.LoanForm.FeeList;

	if (typeof objBalance.addEventListener != "undefined") {
		objBalance.addEventListener("blur", blurBalance, false);
		objBalance.addEventListener("focus", selectElement, false);
		
		objPaymentsPerYear.addEventListener("change", blurPaymentsPerYear, false);

		objNumberOfPayments.addEventListener("blur", blurNumberOfPayments, false);
		objNumberOfPayments.addEventListener("focus", selectElement, false);

		objPayment.addEventListener("blur", blurPayment, false);
		objPayment.addEventListener("focus", selectElement, false);

		objInterestRate.addEventListener("blur", blurInterestRate, false);
		objInterestRate.addEventListener("focus", selectElement, false);

		if (typeof objEffectiveDate != "undefined") {
			objEffectiveDate.addEventListener("blur", blurEffectiveDate, false);
			objEffectiveDate.addEventListener("focus", selectElement, false);
		}
		if (typeof objFirstDateDue != "undefined") {
			objFirstDateDue.addEventListener("blur", blurFirstDateDue, false);
			objFirstDateDue.addEventListener("focus", selectElement, false);
		}
		if (typeof objFees != "undefined") {
			objFees.addEventListener("click", clickFees, false);
		}
		if (typeof objBalloon != "undefined") {
			objBalloon.addEventListener("blur", blurBalloon, false);
			objBalloon.addEventListener("focus", selectElement, false);
		}
		if (typeof objAmortization != "undefined") {
			objAmortization.addEventListener("blur", blurAmoritization, false);
			objAmortization.addEventListener("focus", selectElement, false);
		}
		if (typeof objBuyerBirthDate != "undefined") {
			objBuyerBirthDate.addEventListener("blur", blurBuyerBirthDate, false);
			objBuyerBirthDate.addEventListener("focus", selectElement, false);
		}
		if (typeof objCoBuyerBirthDate != "undefined") {
			objCoBuyerBirthDate.addEventListener("blur", blurCoBuyerBirthDate, false);
			objCoBuyerBirthDate.addEventListener("focus", selectElement, false);
		}
	} else if (typeof objBalance.attachEvent != "undefined") {
		objBalance.attachEvent("onblur", blurBalance);
		objBalance.attachEvent("onfocus", selectElement);

		objPaymentsPerYear.attachEvent("onchange", blurPaymentsPerYear);

		objNumberOfPayments.attachEvent("onblur", blurNumberOfPayments);
		objNumberOfPayments.attachEvent("onfocus", selectElement);

		objPayment.attachEvent("onblur", blurPayment);
		objPayment.attachEvent("onfocus", selectElement);

		objInterestRate.attachEvent("onblur", blurInterestRate, false);
		objInterestRate.attachEvent("onfocus", selectElement, false);

		if (typeof objEffectiveDate != "undefined") {
			objEffectiveDate.attachEvent("onblur", blurEffectiveDate, false);
			objEffectiveDate.attachEvent("onfocus", selectElement, false);
		}
		if (typeof objFirstDateDue != "undefined") {
			objFirstDateDue.attachEvent("onblur", blurFirstDateDue, false);
			objFirstDateDue.attachEvent("onfocus", selectElement, false);
		}
		if (typeof objFees != "undefined") {
			objFees.attachEvent("onclick", clickFees, false);
		}
		if (typeof objBalloon != "undefined") {
			objBalloon.attachEvent("onblur", blurBalloon);
			objBalloon.attachEvent("onfocus", selectElement);
		}
		if (typeof objAmortization != "undefined") {
			objAmortization.attachEvent("onblur", blurAmoritization);
			objAmortization.attachEvent("onfocus", selectElement);
		}
		if (typeof objBuyerBirthDate != "undefined") {
			objBuyerBirthDate.attachEvent("onblur", blurBuyerBirthDate, false);
			objBuyerBirthDate.attachEvent("onfocus", selectElement, false);
		}
		if (typeof objCoBuyerBirthDate != "undefined") {
			objCoBuyerBirthDate.attachEvent("onblur", blurCoBuyerBirthDate, false);
			objCoBuyerBirthDate.attachEvent("onfocus", selectElement, false);
		}
	}
	recalcTerm();
}

function selectElement(e) {
  if (browser.isIE)
    target = window.event.srcElement;
  if (browser.isNS)
    target = e.target;

	target.select();
}
function blurBalance() {
	validateField(document.LoanForm.Balance, "currency", true, false, 0, 999999.99, true);
}
function blurPaymentsPerYear() {
	recalcTerm();
}
function blurNumberOfPayments() {
	if (validateField(document.LoanForm.NumberOfPayments, "integer", true, false, 0, 600, true) == true)
		recalcTerm();
}
function blurPayment() {
	validateField(document.LoanForm.DesiredPayment, "currency", true, false, 0, 99999.99, true);
}
function blurBalloon() {
	validateField(document.LoanForm.Balloon, "currency", true, false, 0, 999999.99, true);
}
function blurAmoritization() {
	validateField(document.LoanForm.AmortizationTerm, "posinteger", true, false, 0, 999, true);
}
function blurInterestRate() {
	validateField(document.LoanForm.APR, "float", true, false, 0, 99, true);
}
function blurEffectiveDate() {
	validateField(document.LoanForm.LoanDate, "date", true, false, "01/01/1900", "06/01/2079", false);
}
function blurFirstDateDue() {
	validateField(document.LoanForm.FirstDateDue, "date", true, false, "01/01/1900", "06/01/2079", false);
}
function blurBuyerBirthDate() {
	validateField(document.LoanForm.BuyerBirthDate, "date", true, false, "01/01/1900", formatDate(new Date(), "MM/dd/yyyy"), false);
}
function blurCoBuyerBirthDate() {
	validateField(document.LoanForm.CoBuyerBirthDate, "date", true, false, "01/01/1900", formatDate(new Date(), "MM/dd/yyyy"), false);
}
function clickFees() {
	if (document.LoanForm.FeeList.length == 0)
		alert("To add a fee, click on the button labeled, \"Add Fee\".");
}

function recalcTerm() {
	var objForm = document.LoanForm;

	var intNumPmts = parseInt(objForm.NumberOfPayments.value);
	var intPmtsPerYear = getRadioValue(objForm.PaymentsPerYear);
	var dblTerm = (intNumPmts / intPmtsPerYear) * 12;

	if (Math.ceil(dblTerm) != dblTerm)
		getElement("LoanTerm").firstChild.nodeValue = "~" + Math.ceil(dblTerm);
	else
		getElement("LoanTerm").firstChild.nodeValue = Math.ceil(dblTerm);
}
function changeLoanType() {
	var objForm = document.LoanForm;
	var intRadioValue;
	
	if (typeof objForm.RepaymentStructureID.value == "undefined")
		intRadioValue = getRadioValue(objForm.RepaymentStructureID);
	else
		intRadioValue = objForm.RepaymentStructureID.value;
	
	if (typeof objForm.InstallmentSolveType != "undefined")
		var intInstallmentSolve = getRadioValue(objForm.InstallmentSolveType);
	else
		var intInstallmentSolve = "0";

	if (typeof objForm.BalloonSolveType != "undefined")
		var intBalloonSolve = getRadioValue(objForm.BalloonSolveType);
	else
		var intBalloonSolve = "0";
	
	if (typeof objForm.InstallmentSolveType != "undefined") {
		objForm.InstallmentSolveType[0].disabled = (intRadioValue != "1");
		objForm.InstallmentSolveType[1].disabled = (intRadioValue != "1");
		objForm.InstallmentSolveType[2].disabled = (intRadioValue != "1");
	}
	if (typeof objForm.BalloonSolveType != "undefined") {
		objForm.BalloonSolveType[0].disabled = (intRadioValue != "2");
		objForm.BalloonSolveType[1].disabled = (intRadioValue != "2");
		objForm.BalloonSolveType[2].disabled = (intRadioValue != "2");
	}
	if (intRadioValue != "1" && typeof objForm.InstallmentSolveType != "undefined") {
		objForm.InstallmentSolveType[0].checked = false;
		objForm.InstallmentSolveType[1].checked = false;
		objForm.InstallmentSolveType[2].checked = false;
	}
	if (intRadioValue != "2" && typeof objForm.BalloonSolveType != "undefined") {
		objForm.BalloonSolveType[0].checked = false;
		objForm.BalloonSolveType[1].checked = false;
		objForm.BalloonSolveType[2].checked = false;
	}
	if (intRadioValue == "1" && intInstallmentSolve == null) {
		objForm.InstallmentSolveType[0].checked = true;
		objForm.SolveType.value = "2";
	} else if (intRadioValue == "2" && intBalloonSolve == null) {
		objForm.BalloonSolveType[0].checked = true;
		objForm.SolveType.value = "2";
	}
	
	/* Single payment notes are always monthly... */
	if (intRadioValue == "3")
		objForm.PaymentsPerYear.options[3].selected = true;
	
	objForm.PaymentsPerYear.disabled = (intRadioValue == "3")

	changeSolveType();
}
function changeSolveType() {
	var objForm = document.LoanForm;
	var intLoanType = getRadioValue(objForm.RepaymentStructureID);

	if (typeof objForm.InstallmentSolveType != "undefined")
		var intInstallmentSolve = getRadioValue(objForm.InstallmentSolveType);
	else
		var intInstallmentSolve = "0";
		
	if (typeof objForm.BalloonSolveType != "undefined") {
		var intBalloonSolve = getRadioValue(objForm.BalloonSolveType);

		objForm.Balloon.disabled = (intBalloonSolve != "1");
		objForm.AmortizationTerm.disabled = (intBalloonSolve != "3");
	
		if (intBalloonSolve != "1")
			objForm.Balloon.value = "0.00";
		if (intBalloonSolve != "3")
			objForm.AmortizationTerm.value = "0";
	} else
		var intBalloonSolve = "0";

	objForm.Balance.disabled = (intLoanType == "1" && intInstallmentSolve == "3");
	if (objForm.Balance.disabled == true)
		objForm.Balance.value = "0.00"
		
	objForm.NumberOfPayments.disabled = ((intLoanType == "1" && intInstallmentSolve == "2") || intLoanType == "3");
	if (objForm.NumberOfPayments.disabled == true)
		objForm.NumberOfPayments.value = "0"

	objForm.DesiredPayment.disabled = (
			(intLoanType == "1" && intInstallmentSolve == "1") 
		|| 	(intLoanType == "2" && (intBalloonSolve == "1" || intBalloonSolve == "3")) 
		|| 	(intLoanType == "3") 
		|| 	(intLoanType == "4"));
	if (objForm.DesiredPayment.disabled == true)
		objForm.DesiredPayment.value = "0.00";
}
function openFeeWindow(ForEdit) {
	var objForm = document.LoanForm;

	if (ForEdit == true && objForm.FeeList.selectedIndex < 0) {
		alert("No fee was selected to edit");
		return;
	} else if (objForm.FeeList.length >= 5) {
		alert("Maximum number of fees has been reached");
		return;
	}
	winList["FeeWindow"].open();
	
	if (ForEdit == false) {
		objForm.FeeValue = "";
		objForm.FeeType[0].checked = true;
		objForm.Amount.value = "0.00";
		objForm.Rate.value = "0";
	} else {
		var strValue = objForm.FeeList.options[document.LoanForm.FeeList.selectedIndex].value;
		var aryFee = strValue.split(",");

		objForm.FeeValue = strValue;
		
		for (var i = 0; i < objForm.FeeType.length; i++)
			objForm.FeeType[i].checked = (objForm.FeeType[i].value == aryFee[0]);
		
		objForm.Amount.value = aryFee[1];
		objForm.Rate.value = aryFee[2];
	}
}
function removeFee() {
	var objFees = document.LoanForm.FeeList;

	if (objFees.selectedIndex < 0) {
		alert("No fee was selected to be removed");
		return;
	}
		
	objFees.remove(objFees.selectedIndex);
}
function loadFees(Fees) {
	if (Fees == "")
		return;
		
	var strFees = Fees.split(";");
	var strFee = null;
	
	for (var i = 0; i < strFees.length; i++) {
		strFee = strFees[i].split(",");	

		saveFee("", strFee[0], strFee[1], strFee[2]);
	}
}
function submitFeeForm() {
	var objForm = document.LoanForm;
	var intFeeType = getRadioValue(objForm.FeeType);
	var curAmount = parseFloat(objForm.Amount.value);
	var dblRate = parseFloat(objForm.Rate.value);
	var strFeeValue = objForm.FeeValue;

	if (isNaN(curAmount) == true)
		curAmount = 0;
	if (isNaN(dblRate) == true)
		dblRate = 0;
				
	if (curAmount == 0 && dblRate == 0) {
		alert("The Flat Amount and Loan Percentage were both zero");
		return;
	} else if (curAmount != 0 && dblRate != 0) {
		alert("You must provide a non-zero value for only the Flat Amount or Loan Percentage");
		return;
	}

	saveFee(strFeeValue, intFeeType, curAmount, dblRate);
	
	winList["FeeWindow"].close();
}
function saveFee(ExistingValue, Type, Amount, Rate) {	
	var strValue = "", strText = "";

	strValue = Type + "," + Amount + "," + Rate;
	
	if (Amount != 0)
		strText = formatCurrency(Amount)
	else if (Rate != 0)
		strText = Rate + '%'
	
	strText = strText + ' ' + getFeeType(Type);

	if (ExistingValue == "") 
		insertFee(strValue, strText);
	else {
		var i = 0;
		var objFees = document.LoanForm.FeeList;
		while (i < objFees.length) {
			if (objFees.options[i].value == ExistingValue) {
				updateFee(i, strValue, strText);
				break;
			}
			i = i + 1;
		}
		if (i == objFees.length) 
			insertFee(strValue, strText);
	}
}
function insertFee(Value, Text) {
	var objOption = document.createElement("option");
	var objFees = document.LoanForm.FeeList;
	
	objOption.value = Value;
	objOption.text = Text;
	
	objFees.options[objFees.length] = objOption;
}
function updateFee(Index, Value, Text) {
	var objFees = document.LoanForm.FeeList;

	objFees.options[Index].value = Value;
	objFees.options[Index].text = Text;
}
function getFeeType(Type) {
	switch (parseInt(Type)) {
		case 1: return "(Financed into loan, not a finance charge)";
		case 2: return "(Deducted from proceeds, prepaid)";
		case 3: return "(Financed into loan, financed charge)";
	}
}
function processLoan() {
	var objForm = document.LoanForm;
	var intLoanType = getRadioValue(objForm.RepaymentStructureID);

	/* The following is a hack. I couldn't find another way of doing it. If the user pressed
	   enter on one of the date fields, the blur event doesn't fire, and a date like '1/1/06'
	   is interpreted as '1/1/1906' by the new Date() function. I couldn't find a way of
	   intercepting the Enter keystroke, call the corresponding blur event for the current object,
	   and then continuing to process the page as though the keystroke wasn't intercepted. 
	   Long story short, this was the easy way out. Can't see what harm it'll do since technically
	   all of these blur functions should run smoothly in order for the form to have been submitted. */

	// Begin hack
	blurEffectiveDate();
	blurFirstDateDue();
	if (objForm.BuyerBirthDate != null)
		blurBuyerBirthDate();
	if (objForm.CoBuyerBirthDate != null)
		blurCoBuyerBirthDate();
   	// End hack
	
	if (parseFloat(objForm.Balance.value) == 0 && objForm.SolveType.value != "1") {
		alert("The Loan Amount is required");
		return false;
	} else if (parseInt(objForm.NumberOfPayments.value) == 0 && objForm.SolveType.value != "4" && intLoanType != "3") {
		alert("The Number of Payments is required");
		return false;
	} else if (parseFloat(objForm.DesiredPayment.value) == 0 && objForm.SolveType.value != "2") {
		alert("The Payment is required");
		return false;
	} else if (objForm.Balloon != null && parseFloat(objForm.Balloon.value) == 0 && getRadioValue(objForm.BalloonSolveType) == "1") {
		alert("The Balloon Amount is required");
		return false;
	} else if (objForm.Balloon != null && objForm.Balance != null && parseFloat(objForm.Balloon.value) > parseFloat(objForm.Balance.value)) {
		alert("The Balloon cannot be greater than the Loan Amount");
		return false;
	} else if (objForm.AmortizationTerm != null && parseFloat(objForm.AmortizationTerm.value) == 0 && getRadioValue(objForm.BalloonSolveType) == "3") {
		alert("The Amortization Term is required");
		return false;
	} else if (objForm.LoanDate.value == "") {
		alert("The loan's Effective Date is required");
		return false;
	} else if (objForm.FirstDateDue.value == "") {
		alert("The loan's First Payment Due Date is required");
		return false;
	} else 	if (new Date(objForm.LoanDate.value) > new Date(objForm.FirstDateDue.value)) {
		alert("The loan's First Payment Due Date cannot be earlier than the Effective Date");
		return false;
	} else if (objForm.BuyerBirthDate != null && objForm.BuyerBirthDate.value == "" && objForm.CoBuyerBirthDate.value != "") {
		alert("The Buyer's Date of Birth is required when the Co-Buyer's Date of Birth is provided");
		return false;
	}	

	var objFees = objForm.FeeList;
	var strFees = "";
	
	for (var i = 0; i < objFees.length; i++) {
		if (strFees != "")
			strFees = strFees + ";";

		strFees = strFees + objFees.options[i].value;
	}

	document.LoanForm.Fees.value = strFees;

	var strFeeExclusions = "";

	if (getElement("FeeExclusionList") != null) {
	  	var objFeeExclusions = getElement("FeeExclusionList").getElementsByTagName("input")
		var objExclusion = null;
	
		for (var i = 0; i < objFeeExclusions.length; i++) {
			objExclusion = objFeeExclusions[i];
			
			if (objExclusion.checked == false) {
				if (strFeeExclusions != "") 
					strFeeExclusions = strFeeExclusions + ","
					
				strFeeExclusions = strFeeExclusions + objExclusion.name.substr(4);
			}
		}
	}

	document.LoanForm.FeeExclusions.value = strFeeExclusions;
		
	return true;
}
