var maxCombinedHitOnStarredItems = 1.25;

var maxRateBuyup = 13.50;

var titleEscrowFilled = false;

var brokerFeesCheckResult = 0;

var brokerFeesTotal = 0;

var brokerFeesOverLimit = 0;



function numFormat(num, decPos) {

    var res = num;

    /* decimal point */

    if (res.toFixed) {

        res = res.toFixed(decPos);

        if (num > 0 && res == 0) {

            res = num;

        }

    }

    /* thousands */

    var regExp = /(\d+)(\d{3})/;

    while (regExp.test(res)) {

        res = res.replace(regExp, '$1' + ',' + '$2');

    }

    return res;

}



function formatRate(num) {

    if ((100 * num) % 100 == 0) {

        num -= 0.01;

    }

    return numFormat(num, 2);

}



function formatPoint(num) {

    return numFormat(num, 2);

}



function parseNumber(num) {

    val = parseFloat(num.replace(/[\$,]/g,''));

    if (isNaN(val)) {

        val = 0;

    }

    return val;

}



function formSubmitted(f) {

	if (!f.bpo_state.options[f.bpo_state.selectedIndex].value) {

		f.bpo_state.focus();

		alert("Error: State is not selected.");

		return false;

	}



    /* validate appraised value */

	if (!f.bpo_appraised_value.value && !f.bpo_ltv.value) {

		f.bpo_appraised_value.focus();

		alert("Error: Appraised Value is missing.");

		return false;

	}

	if (f.bpo_appraised_value.value) {

	    if (!/^\$?[1-9][0-9,]+(\.\d{1,2})?$/.test(f.bpo_appraised_value.value)) {

		    f.bpo_appraised_value.focus();

		    alert("Error: Invalid Appraised Value.\nPlease enter valid value in dollars (numbers only)");

		    return false;

	    }

        appraisedValue = parseNumber(f.bpo_appraised_value.value);

	    if (appraisedValue <= 0) {

		    f.bpo_appraised_value.focus();

		    alert("Error: Invalid Appraised Value.\nPlease enter valid value in dollars (numbers only)");

		    return false;

	    }

    }

    /* validate loan amount */

	if (!f.bpo_loan_amount.value && !f.bpo_ltv.value) {

		f.bpo_loan_amount.focus();

		alert("Error: Loan Amount is missing.");

		return false;

	}

    if (f.bpo_loan_amount.value) {

        if (!/^\$?[1-9][0-9,]+(\.\d{1,2})?$/.test(f.bpo_loan_amount.value)) {

            f.bpo_loan_amount.focus();

            alert("Error: Invalid Loan Amount.\nPlease enter valid amount in dollars (numbers only)");

            return false;

        }

        loanAmount = parseNumber(f.bpo_loan_amount.value);

	    if (loanAmount <= 0) {

		    f.bpo_loan_amount.focus();

		    alert("Error: Invalid Loan Amount.\nPlease enter valid amount in dollars (numbers only)");

		    return false;

	    }

	    if (loanAmount < min_loan_amount) {

		    f.bpo_loan_amount.focus();

		    alert("Error: Loan size is outside LJL guidelines. Our minimum loan amount is $" + numFormat(min_loan_amount));

		    return false;

	    }

    }



    /* check MAX LTV */

    LTV = null;

    if (loanAmount && appraisedValue) {

        LTV = 100 * loanAmount / appraisedValue;

        if (loanAmount > loan_amount_for_ltv_percent2

                || loanAmount < loan_amount_for_ltv_percent2_low) {

            eff_max_ltv = max_ltv_percent2;

        } else {

            eff_max_ltv = max_ltv_percent;

        }

    } else if (f.bpo_ltv.value) {

        LTV = parseNumber(f.bpo_ltv.value);

    }

    if (LTV) {

        if (loanAmount > loan_amount_for_ltv_percent2

                || loanAmount < loan_amount_for_ltv_percent2_low) {

            eff_max_ltv = max_ltv_percent2;

        } else {

            eff_max_ltv = max_ltv_percent;

        }

        maxLoan = appraisedValue * max_ltv_percent / 100;

        if (maxLoan > loan_amount_for_ltv_percent2) {

            maxLoan = Math.max(appraisedValue * max_ltv_percent2 / 100, loan_amount_for_ltv_percent2);

            maxLoan = Math.min(maxLoan, max_loan_amount);

        }

        if (maxLoan < loan_amount_for_ltv_percent2_low) {

            maxLoan = appraisedValue * max_ltv_percent2 / 100;

        }

	    if (LTV > eff_max_ltv) {

		    f.bpo_loan_amount.focus();

		    alert("Sorry. Our maximum LTV for this loan amount is " + eff_max_ltv + "%. With the appraised value listed, \nour maximum loan amount would be $" + numFormat(maxLoan, 0));

		    return false;

	    }

    }

    

    /* validate fields in the quick pricer */

    elem = f.bpo_borrower_fico;

    if (elem.value

            && !/^\d{1,4}$/.test(elem.value)) {

        elem.focus();

        alert("Error: Invalid Borrower FICO. Please enter valid FICO score (numbers only) \nor leave the field blank if the borrower has no FICO score.");

        return false;

    }

    elem = f.bpo_coborrower_fico;

    if (elem.value

            && !/^\d{1,4}$/.test(elem.value)) {

        elem.focus();

        alert("Error: Invalid Co-Borrower FICO. Please enter valid FICO score (numbers only) \nor leave the field blank if there is no co-borrower.");

        return false;

    }

    elem = f.bpo_occupancy;

    if (!elem.value) {

        elem.focus();

        alert("Error: Occupancy is not selected.");

        return false;

    }

    elem = f.bpo_property_type;

    if (!elem.value) {

        elem.focus();

        alert("Error: Property type is not selected.");

        return false;

    }

    elem = f.bpo_documentation_type;

    if (!elem.value) {

        elem.focus();

        alert("Error: Documentation type is not selected.");

        return false;

    }

    if (f.bpo_state.options[f.bpo_state.selectedIndex].value == "NV"

            && elem.value != 2) {

        elem.focus();

        alert("Error: All Nevada files must be Full Doc.");

        return false;

    }

    elem = f.bpo_prepayment_penalty;

    if (!elem.value) {

        elem.focus();

        alert("Error: Prepayment Penalty is not selected.");

        return false;

    }

    elem = f.bpo_impounds;

    if (!elem.value) {

        elem.focus();

        alert("Error: Impounds option is not selected.");

        return false;

    }

    elem = f.bpo_buyout;

    if (!elem.value) {

        elem.focus();

        alert("Error: BK/FC Buyout option is not selected.");

        return false;

    }

    

    /* display loan amount warning */

    if (loanAmount > max_loan_amount) {

		var r = confirm("WARNING:  Loan size is outside LJL guidelines ($" + numFormat(min_loan_amount) + " to $" + numFormat(max_loan_amount) + "). If you would like to submit the loan anyway, press 'OK'.  To cancel the submission, press 'Cancel'");

        if (!r) {

		    f.bpo_loan_amount.focus();

            return false;

        }

	}

    

    /* passed validation */

    return true;

}



function pricerFieldChanged(me) {

    f = me.form;

    if (f.bpo_occupancy.value == 2) {

        nonOwnerOccupied = true;

    } else {

        nonOwnerOccupied = false;

    }

    loanAmount = parseNumber(f.bpo_loan_amount.value);

    result = calculatePriceAndPoint(f);

    resultsBox = document.getElementById("quick_pricer_results");

    brokerFeesCheckResult = 0;

    /* display rate buy-up/down options */

    if (result.status) {

        /* minus 2 steps */

        delta = -0.5;

        document.getElementById("rate_option_minus_2_step").firstChild.data = formatRate(result.rate + delta);

        document.getElementById("point_option_minus_2_step").firstChild.data = formatPoint(result.point - delta);

        /* minus 1 step */

        delta = -0.25;

        document.getElementById("rate_option_minus_1_step").firstChild.data = formatRate(result.rate + delta);

        document.getElementById("point_option_minus_1_step").firstChild.data = formatPoint(result.point - delta);

        /* no buy-up/down */

        delta = 0;

        document.getElementById("rate_option_default").firstChild.data = formatRate(result.rate + delta);

        document.getElementById("point_option_default").firstChild.data = formatPoint(result.point - delta);

        /* plus 1 step */

        delta = 0.25;

        document.getElementById("rate_option_plus_1_step").firstChild.data = formatRate(result.rate + delta);

        document.getElementById("point_option_plus_1_step").firstChild.data = formatPoint(result.point - delta);

        /* plus 2 steps */

        delta = 0.5;

        document.getElementById("rate_option_plus_2_step").firstChild.data = formatRate(result.rate + delta);

        document.getElementById("point_option_plus_2_step").firstChild.data = formatPoint(result.point - delta);

        /* plus 3 steps */

        delta = 0.75;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_3_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_3_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_3_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_3_step").style.display = "none";

            document.getElementById("radio_option_plus_3_step").checked = false;

        }

        /* plus 4 steps */

        delta = 1;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_4_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_4_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_4_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_4_step").style.display = "none";

            document.getElementById("radio_option_plus_4_step").checked = false;

        }

        /* plus 5 steps */

        delta = 1.25;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_5_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_5_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_5_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_5_step").style.display = "none";

            document.getElementById("radio_option_plus_5_step").checked = false;

        }

        /* plus 6 steps */

        delta = 1.50;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_6_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_6_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_6_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_6_step").style.display = "none";

            document.getElementById("radio_option_plus_6_step").checked = false;

        }

        /* plus 7 steps */

        delta = 1.75;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_7_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_7_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_7_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_7_step").style.display = "none";

            document.getElementById("radio_option_plus_7_step").checked = false;

        }

        /* plus 8 steps */

        delta = 2;

        if (nonOwnerOccupied && result.rate + delta <= maxRateBuyup) {

            document.getElementById("rate_option_plus_8_step").firstChild.data = formatRate(result.rate + delta);

            document.getElementById("point_option_plus_8_step").firstChild.data = formatPoint(result.point - delta);

            document.getElementById("rate_buyup_plus_8_step").style.display = "";

        } else {

            document.getElementById("rate_buyup_plus_8_step").style.display = "none";

            document.getElementById("radio_option_plus_8_step").checked = false;

        }

        /* apply buy-up/down to the rate and point */

        delta = 0;

        if (document.getElementById("radio_option_minus_2_step").checked) {

            delta = -0.5;

        } else if (document.getElementById("radio_option_minus_1_step").checked) {

            delta = -0.25;

        } else if (document.getElementById("radio_option_plus_1_step").checked) {

            delta = 0.25;

        } else if (document.getElementById("radio_option_plus_2_step").checked) {

            delta = 0.5;

        } else if (document.getElementById("radio_option_plus_3_step").checked) {

            delta = 0.75;

        } else if (document.getElementById("radio_option_plus_4_step").checked) {

            delta = 1;

        } else if (document.getElementById("radio_option_plus_5_step").checked) {

            delta = 1.25;

        } else if (document.getElementById("radio_option_plus_6_step").checked) {

            delta = 1.5;

        } else if (document.getElementById("radio_option_plus_7_step").checked) {

            delta = 1.75;

        } else if (document.getElementById("radio_option_plus_8_step").checked) {

            delta = 2;

        }

        result.rate += delta;

        result.point -= delta;

        /* display final results */

        resultsSpanRate = document.getElementById("pricer_results_rate");

        resultsSpanPoint = document.getElementById("pricer_results_point");

        resultsSpanRate.firstChild.data = formatRate(result.rate) + "%";

        resultsSpanPoint.firstChild.data = formatPoint(result.point) + "%";

        /* show results box */

        resultsBox.style.display = "block";

    } else {

        /* hide results box */

        resultsBox.style.display = "none";

    }

}



function calculatePriceAndPoint(f) {

    /* create result object */

    function PriceResult() {

        this.status = true;

        this.rate = 0;

        this.point = 0;

        this.msg = "";

    }

    var result = new PriceResult();



    /* get appraised value, loan amount and LTV */

    appraisedValue = parseNumber(f.bpo_appraised_value.value);

    loanAmount = parseNumber(f.bpo_loan_amount.value);

    LTV = parseNumber(f.bpo_ltv.value);

    if (appraisedValue > 0 && loanAmount > 0) {

        LTV = 100 * loanAmount / appraisedValue;

    } else {

        if (LTV) {

            appraisedValue = 0;

            loanAmount = 0;

        } else {

            result.status = false;

        }

    }

    

    /* LTV condition */

    if ((LTV - 45) <= -0.01) {

        result.rate += 11.50;

        result.point += 2.50;

    } else if ((LTV - 50) <= -0.01) {

        result.rate += 11.75;

        result.point += 2.50;

    } else if ((LTV - 55) <= -0.01) {

        result.rate += 11.99;

        result.point += 2.75;

    } else {

        result.rate += 12.25;

        result.point += 2.75;

    }

    /* State */

	if (!f.bpo_state.options[f.bpo_state.selectedIndex].value) {

        result.status = false;

    } else if (f.bpo_state.options[f.bpo_state.selectedIndex].value == "ID"

            || f.bpo_state.options[f.bpo_state.selectedIndex].value == "WY") {

        result.point += 0.50;

    }



    /* Occupancy */

    elem = f.bpo_occupancy;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if (elem.value == 2) {

        delta = 2.25;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else {

        pcElem.firstChild.data = '0.00';

    }

    /* Property type */

    elem = f.bpo_property_type;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if (elem.value == 2) {

        delta = 1.25;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else {

        pcElem.firstChild.data = '0.00';

    }



    /* Starred Items */

    var starredItemsPoint = 0;

    if (loanAmount > 0 && loanAmount < 250000 && starredItemsPoint < maxCombinedHitOnStarredItems) {

        delta = Math.min(0.25, maxCombinedHitOnStarredItems - starredItemsPoint);

        starredItemsPoint += delta;

    }

    /* FICO */

    borrowerFico = +f.bpo_borrower_fico.value;

    coBorrowerFico = +f.bpo_coborrower_fico.value;

    if (coBorrowerFico > 0 && coBorrowerFico < borrowerFico) {

        fico = coBorrowerFico;

        pcElem = document.getElementById('pc_bpo_coborrower_fico');

        document.getElementById('pc_bpo_borrower_fico').firstChild.data = '';

    } else {

        fico = borrowerFico;

        pcElem = document.getElementById('pc_bpo_borrower_fico');

        document.getElementById('pc_bpo_coborrower_fico').firstChild.data = '';

    }

    if (fico < 500 && starredItemsPoint < maxCombinedHitOnStarredItems) {

        delta = Math.min(0.75, maxCombinedHitOnStarredItems - starredItemsPoint);

        pcElem.firstChild.data = numFormat(delta, 2);

        starredItemsPoint += delta;

    } else {

        pcElem.firstChild.data = '0.00';

    }

    /* Documentation type */

    elem = f.bpo_documentation_type;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if (elem.value == 1) {

        starredItemsPoint += 0.5;

        pcElem.firstChild.data = '0.50';

    } else if (elem.value == 2) {

        starredItemsPoint += 0.25;

        pcElem.firstChild.data = '0.25';

    } else {

        pcElem.firstChild.data = '0.00';

    }

    /* BK/FC Buyout */

    elem = f.bpo_buyout;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if ((elem.value == 2 || elem.value == 3)

            && starredItemsPoint < maxCombinedHitOnStarredItems) {

        delta = Math.min(0.75, maxCombinedHitOnStarredItems - starredItemsPoint);

        pcElem.firstChild.data = numFormat(delta, 2);

        starredItemsPoint += delta;

    } else {

        pcElem.firstChild.data = '0.00';

    }

    // apply points from starred items

    result.point += starredItemsPoint;

    

    /* Impounds */

    elem = f.bpo_impounds;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if (elem.value == 2) {

        delta = 0.75;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else {

        pcElem.firstChild.data = '0.00';

    }

    /* Prepayment Penalty */

    elem = f.bpo_prepayment_penalty;

    pcElem = document.getElementById('pc_' + elem.id);

    if (!elem.value) {

        result.status = false;

        pcElem.firstChild.data = '';

    } else if (elem.value == 2) {

        delta = 0.50;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else if (elem.value == 3) {

        delta = 1.00;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else if (elem.value == 4) {

        delta = 1.50;

        result.point += delta;

        pcElem.firstChild.data = numFormat(delta, 2);

    } else {

        pcElem.firstChild.data = '0.00';

    }

    

    return result;

}