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 != 3) {
        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;
        }
	}
    
    /* enable disabled controls so they are posted into loan application page */
    f.bpo_impounds.disabled = false;
    f.bpo_documentation_type.disabled = false;
    
    /* passed validation */
    return true;
}

function pricerFieldChanged(me) {
    f = me.form;
    /* process changes of Occupancy field */
    if (me.name == 'bpo_occupancy') {
        if (me.value == 1) {
            /* Owner Occupied is selected */
            /* set Impounds to Yes and disable changing it */
            f.bpo_impounds.selectedIndex = 1;
            f.bpo_impounds.disabled = true;
            /* set Documentation Type to Full and disable changing it */
            f.bpo_documentation_type.selectedIndex = 3;
            f.bpo_documentation_type.disabled = true;
        } else {
            /* Owner Occupied is not selected */
            /* enable changing Impounds */
            f.bpo_impounds.disabled = false;
            /* enable changing Documentation Type */
            f.bpo_documentation_type.disabled = false;
        }
    }
    /* start calculating price */
    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;
}

function contactFormSubmitted(frm) {
    var elem = frm.FirstName;
    if (!elem.value) {
        alert("Error: First Name is missing.");
        elem.focus();
        return false;
    }
    var elem = frm.LastName;
    if (!elem.value) {
        alert("Error: Last Name is missing.");
        elem.focus();
        return false;
    }
    var elem = frm.Email;
    if (!elem.value) {
        alert("Error: Email is missing.");
        elem.focus();
        return false;
    }
    var elem = frm.Email;
    if (!/^[\S]+@[\S]+\.[\S]+$/.test(elem.value)) {
        alert("Error: Invalid Email address.");
        elem.focus();
        return false;
    }
    var elem = frm.Phone1;
    if (elem && !elem.value) {
        alert("Error: Phone number is missing.");
        elem.focus();
        return false;
    }
    return true;
}
