function budget_reduction_listings_total_recurring_cuts() {
    var recurring_revenue_increase = document.getElementById('recurring_revenue_increase').value;
    var recurring_salary_and_benefits = document.getElementById('recurring_salary_and_benefits').value;
    var recurring_operating_expenses = document.getElementById('recurring_operating_expenses').value;
    var recurring_ops_expenses = document.getElementById('recurring_ops_expenses').value;

    var total = -budget_reduction_listings_validate_number(recurring_revenue_increase) + budget_reduction_listings_validate_number(recurring_salary_and_benefits) + budget_reduction_listings_validate_number(recurring_operating_expenses) + budget_reduction_listings_validate_number(recurring_ops_expenses);

    var recurring_total = document.getElementById('recurring_total');
    recurring_total.replaceChild(document.createTextNode(budget_reduction_listings_format_currency(total)), recurring_total.firstChild);
}

function budget_reduction_listings_total_personnel_impact() {
    var personnel_layoffs_faculty = document.getElementById('personnel_layoffs_faculty').value;
    var personnel_layoffs_staff = document.getElementById('personnel_layoffs_staff').value;

    var total = budget_reduction_listings_validate_number(personnel_layoffs_faculty) + budget_reduction_listings_validate_number(personnel_layoffs_staff);

    var personnel_layoffs_total = document.getElementById('personnel_layoffs_total');
    personnel_layoffs_total.replaceChild(document.createTextNode(budget_reduction_listings_format_number(total)), personnel_layoffs_total.firstChild);
}

function budget_reduction_listings_total_instructional_impact() {
    var instructional_professional = document.getElementById('instructional_professional').value;
    var instructional_graduate = document.getElementById('instructional_graduate').value;
    var instructional_undergraduate = document.getElementById('instructional_undergraduate').value;

    var total = budget_reduction_listings_validate_number(instructional_professional) + budget_reduction_listings_validate_number(instructional_graduate) + budget_reduction_listings_validate_number(instructional_undergraduate);

    var instructional_total = document.getElementById('instructional_total');
    instructional_total.replaceChild(document.createTextNode(budget_reduction_listings_format_number(total)), instructional_total.firstChild);
}

function budget_reduction_listings_validate_number(value) {
    var s = new String(value || 0);

    s = s.replace(/[^0-9.-]+/g, '');

    return parseFloat(s);
}

function budget_reduction_listings_format_number(value) {
    // Split the raw value into an integer and a decimal part
    value = budget_reduction_listings_validate_number(value);
    var s = new String(value).split('.', 2);

    var i = parseInt(s[0]);
    var negative = (i < 0);
    i = Math.abs(i);

    var d = '';
    if (s.length == 2) {
        d = s[1].substr(0, 2);
    }

    // Split the dollar part into chunks of three digits
    i = new String(i);
    var parts = new Array();

    while (i.length > 3) {
        var part = i.substr(i.length - 3);
        parts.unshift(part);

        i = i.substr(0, i.length - 3);
    }

    if (i.length > 0) {
        parts.unshift(i);
    }

    // Join the chunks of three digits and add final values
    i = parts.join(',');

    var formatted = (negative ? '-' : '') + i + (d ? '.' + d : '');

    return formatted;
}

function budget_reduction_listings_format_currency(value) {
    var s = budget_reduction_listings_format_number(value);

    var negative = false;
    if (s.charAt(0) == '-') {
        negative = true;
        s = s.replace(/^-/, '');
    }

    var formatted = (negative ? '(' : '') + '$' + s + (negative ? ')' : '');

    return formatted;
}

function budget_reduction_listings_format_number_field(f) {
    var formatted = budget_reduction_listings_format_number(f.value);

    f.value = formatted;
}
