/**2011 Tax Calculator * Nicholas A. Kasprak * Tax Foundation */
var displayedColumns = 3;
//The MarriedBoxValue variable stores what was entered into the spouse's wages box so that it can be restored
//if the user switches between filing statuses.
var MarriedBoxValue = "";
//This keeps track of if the calculation has occured or not - if this variable is greater than zero than
//automatic updating is turned on.
var timesButtonPushed = 0;

var showAdvanced = false;

var debugCounter = 0;

function DebugAlert(whatToAlert) {
	if (debugCounter < 5) {
		alert(whatToAlert);
		debugCounter++;
	}
}

//This function runs when the user leaves certain input boxes, and it makes sure that the number of dependents in
//college is never more than the number of dependents 17 and over.
function LeaveChildrenOver17Box(nameOfInput) {
    NegativeToZero(nameOfInput);
    var under17 = GetValue("inputForm", "numDependentsUnder17");
    var over17 = GetValue("inputForm", "numDependents17Plus");
    var collegeOriginal = GetValue("inputForm", "dependentsInCollege");
    collegeOriginal = collegeOriginal + 0;
    var college = 0;
    if (collegeOriginal > over17) {
        college = over17;
    }
    else {
        college = collegeOriginal;
    }
    if (collegeOriginal != 0) {
        document["inputForm"]["dependentsInCollege"]["value"] = college;
    }
    var dependents = over17 + under17;
    if (dependents < 1) {
        document.inputForm.childCareExpenses.value = "";
        document.inputForm.childCareExpenses.disabled = true;
    }
    else {
        document.inputForm.childCareExpenses.disabled = false;
    }
    UpdateResult();
};
//This function runs after the user leaves most boxes (with the exception of the capital gains boxes)
//and turns any negative number to zero.
function NegativeToZero(nameOfInput) {
    var quantity = GetValue("inputForm", nameOfInput);
    if (quantity < 0) {
        quantity = 0;
    }
    WriteValue("inputForm", nameOfInput, quantity);
    UpdateResult();
};
//Eliminates extraneous characters after a box is left
function ParseNumber(nameOfInput) {
    var quantity = GetValue("inputForm", nameOfInput);
    WriteValue("inputForm", nameOfInput, quantity);
    UpdateResult();
};
//This function disables the given field and is used to disable the spouse's wage box when filing status
//is not set to married.
function DisableField(form, fieldName) {
    document[form][fieldName].value = "";
    document[form][fieldName].disabled = true;
    return 0;
};
//This function enables the given field.
function EnableField(form, fieldName) {
    document[form][fieldName].disabled = false;
    return 0;
};
//This function checks to see if the filing status is married, and, if so, enables various boxes; otherwise
//it disables the same.
function MarriedCheck() {
    var selection = document.inputForm.filingstatus.selectedIndex;
    if (selection == 1) {
        EnableField("inputForm", "wagesSpouse");
        document.inputForm.wagesSpouse.value = MarriedBoxValue;
        MakeElderlySpouseSelectActive();
    }
    else {
        MarriedBoxValue = document.inputForm.wagesSpouse.value;
        DisableField("inputForm", "wagesSpouse");
        MakeElderlySpouseSelectInactive();
    }
    if (selection == 0) {
        if (document.inputForm.numDependentsUnder17.value > 0) {
            document.inputForm.numDependentsUnder17.value = 0;
        }
        if (document.inputForm.numDependents17Plus.value > 0) {
            document.inputForm.numDependents17Plus.value = 0;
        }
        if (document.inputForm.dependentsInCollege.value > 0) {
            document.inputForm.dependentsInCollege.value = 0;
        }
        DisableField("inputForm", "numDependentsUnder17");
        DisableField("inputForm", "numDependents17Plus");
        DisableField("inputForm", "dependentsInCollege");
        document.inputForm.childCareExpenses.value = "";
        DisableField("inputForm", "childCareExpenses");
    }
    else {
        EnableField("inputForm", "numDependentsUnder17");
        EnableField("inputForm", "numDependents17Plus");
        EnableField("inputForm", "dependentsInCollege");
    }
    UpdateResult();
    return 0;
};
//This function calculates the regular tax based on bracket information and taxable income.
function FigureTax(bracket1, bracket2, bracket3, bracket4, bracket5, bracket6, bracket1Rate, bracket2Rate, bracket3Rate, bracket4Rate, bracket5Rate, bracket6Rate, bracket7Rate, taxableIncome) {
    //alert("bracket1 = " + bracket1 + "\n bracket2 = "  + bracket2 + "\n bracket3 = " + bracket3 + "\n bracket4 = " + bracket4 + "\n bracket5 = " + bracket5 + "\n bracket6 = " + bracket6);
	var Tax;
    if (taxableIncome <= bracket1) {
        Tax = taxableIncome * bracket1Rate;
    }
    else {
        Tax = bracket1 * bracket1Rate;
        if (taxableIncome <= bracket2) {
            Tax = Tax + (taxableIncome - bracket1) * bracket2Rate;
        }
        else {
            Tax = Tax + (bracket2 - bracket1) * bracket2Rate;
            if (taxableIncome <= bracket3) {
                Tax = Tax + (taxableIncome - bracket2) * bracket3Rate;
            }
            else {
                Tax = Tax + (bracket3 - bracket2) * bracket3Rate;
                if (taxableIncome <= bracket4) {
                    Tax = Tax + (taxableIncome - bracket3) * bracket4Rate;
                }
                else {
                    Tax = Tax + (bracket4 - bracket3) * bracket4Rate;
                    if (taxableIncome <= bracket5) {
                        Tax = Tax + (taxableIncome - bracket4) * bracket5Rate;
                    }
                    else {
                        Tax = Tax + (bracket5 - bracket4) * bracket5Rate;
                        if (taxableIncome <= bracket6) {
                            Tax = Tax + (taxableIncome - bracket5) * bracket6Rate;
                        }
						else {
                        	Tax = Tax + (bracket6 - bracket5) * bracket6Rate;
                        	if (taxableIncome > bracket6) {
                            	Tax = Tax + (taxableIncome - bracket6) * bracket7Rate;
							}
                        }
                    }
                }
            }
        }
    }
    return Tax;
};
//This function calculates Personal Exemption Phaseout (PEP) for high-income filers. 
function PEP(scenario, filingStatus, numOfExemptions, agi) {
    var pepSingle = 0;
    var pepMarried = 0;
    var pepHoh = 0;
    var personalExemption = 0;
    switch (scenario) {
        case "BushExt":
            var pepSingle = pepSingleBushExt;
            var pepMarried = pepMarriedBushExt;
            var pepHoh = pepHohBushExt;
            var personalExemption = personalExemptionBushExt;
            break;
        case "PreBush":
            var pepSingle = pepSinglePreBush;
            var pepMarried = pepMarriedPreBush;
            var pepHoh = pepHohPreBush;
            var personalExemption = personalExemptionPreBush;
            break;
        case "Obama":
            var pepSingle = pepSingleObama;
            var pepMarried = pepMarriedObama;
            var pepHoh = pepHohObama;
            var personalExemption = personalExemptionObama;
            break;
		case "Democrats":
            var pepSingle = pepSingleDemocrats;
            var pepMarried = pepMarriedDemocrats;
            var pepHoh = pepHohDemocrats;
            var personalExemption = personalExemptionDemocrats;
            break;
    }
    switch (filingStatus) {
        case "single":
            var pep = pepSingle;
            break;
        case "married":
            var pep = pepMarried;
            break;
        case "hoh":
            var pep = pepHoh;
            break;
    }
    if (agi <= pep) {
        var result = numOfExemptions * personalExemption;
        return result;
    }
    else {
        var line5 = agi - pep;
        var line6 = Math.ceil(line5 / 2500);
        if (line6 > 50) {
            line6 = 50;
        }
        var line7 = line6 * 0.02;
        var line8 = personalExemption * numOfExemptions * line7;
        if (scenario == "BushExt") {
            line8 = 0;
        }
        var result = personalExemption * numOfExemptions - line8;
        return result;
    }
};
//This function calculates the non-refundable portion of the Child Tax Credit.
function NonRefundableChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi, totalTax, childCareCredit, eduCredit) {
    var line6 = TotalChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi);
    var line8 = childCareCredit + eduCredit;
    var line9 = totalTax - line8;
    var result = 0;
    if (line9 < 0) {
        line9 = 0;
    }
    if (line6 > line9) {
        result = line9;
    }
    else {
        result = line6;
    }
    return result;
};
//This function calculates the refundable portion of the Child Tax Credit.
function RefundableChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi, totalTax, childCareCredit, eduCredit, earnedIncome) {
    switch (scenario) {
        case "BushExt":
            var refCtcLimit = refCtcLimitBushExt;
            break;
        case "PreBush":
            var refCtcLimit = 0;
            break;
        case "Obama":
            var refCtcLimit = refCtcLimitObama;
            break;
		case "Democrats":
            var refCtcLimit = refCtcLimitDemocrats;
            break;
    }
    var line1 = TotalChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi);
    var line2 = NonRefundableChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi, totalTax, childCareCredit, eduCredit);
    var line3 = line1 - line2;
    var line4 = earnedIncome;
    var line5 = 0;
    if (line4 > refCtcLimit) {
        line5 = line4 - refCtcLimit;
    }
    else {
        line5 = 0;
    }
    var line6 = line5 * 0.15;
    var line13 = SmallerOfTwo(line3, line6);
    if (scenario == "PreBush") {
        line13 = 0;
    }
    return line13;
};
//This function is used inside the functions to calculate the refundable and nonrefundable 
//portions of the CTC use this function to find the total CTC
function TotalChildTaxCredit(scenario, filingStatus, qualifyingChildren, agi) {
    switch (scenario) {
        case "BushExt":
            var ctcIncomeCapSingle = ctcIncomeCapSingleBushExt;
            var ctcIncomeCapMarried = ctcIncomeCapMarriedBushExt;
            var ctcIncomeCapHoh = ctcIncomeCapHohBushExt;
            var ctcAmount = ctcAmountBushExt;
            break;
        case "PreBush":
            var ctcIncomeCapSingle = ctcIncomeCapSinglePreBush;
            var ctcIncomeCapMarried = ctcIncomeCapMarriedPreBush;
            var ctcIncomeCapHoh = ctcIncomeCapHohPreBush;
            var ctcAmount = ctcAmountPreBush;
            break;
        case "Obama":
            var ctcIncomeCapSingle = ctcIncomeCapSingleObama;
            var ctcIncomeCapMarried = ctcIncomeCapMarriedObama;
            var ctcIncomeCapHoh = ctcIncomeCapHohObama;
            var ctcAmount = ctcAmountObama;
            break;
		case "Democrats":
            var ctcIncomeCapSingle = ctcIncomeCapSingleDemocrats;
            var ctcIncomeCapMarried = ctcIncomeCapMarriedDemocrats;
            var ctcIncomeCapHoh = ctcIncomeCapHohDemocrats;
            var ctcAmount = ctcAmountDemocrats;
            break;
    }
    switch (filingStatus) {
        case "single":
            var ctcIncomeCap = ctcIncomeCapSingle;
            break;
        case "married":
            var ctcIncomeCap = ctcIncomeCapMarried;
            break;
        case "hoh":
            var ctcIncomeCap = ctcIncomeCapHoh;
            break;
    }
    var line1 = qualifyingChildren * ctcAmount;
    incomeOverCap = agi - ctcIncomeCap;
    if (incomeOverCap < 0) {
        incomeOverCap = 0;
    }
    var incomeOverCapRounded = RoundUpNext1000(incomeOverCap);
    var line5 = incomeOverCapRounded * 0.05;
    var line6 = line1 - line5;
    if (line6 < 0) {
        return 0;
    }
    else {
        return line6;
    }
};
//This function is used in handful of locations to round a given number
//up to the next multiple of 1,000.
function RoundUpNext1000(amount) {
    if (amount == 0) {
        return 0;
    }
    amount = amount / 1000;
    var newamount = Math.ceil(amount);
    newamount = newamount * 1000;
    return newamount;
};
//This function calculates the credit for child and dependent care expenses.
function ChildCareCredit(scenario, filingStatus, agi, earnedIncome, spouseEarnedIncome, childCareExpenses, numOfChildren, totalTax) {
    switch (scenario) {
        case "BushExt":
            childCarePhaseOutStart = childCarePhaseOutStartBushExt;
            childCarePhaseOutStep = childCarePhaseOutStepBushExt;
            childCarePhaseOutRateStart = childCarePhaseOutRateStartBushExt;
            childCarePhaseOutRateStep = childCarePhaseOutRateStepBushExt;
            childCareExpensesCap = childCareExpensesCapBushExt;
            break;
        case "PreBush":
            childCarePhaseOutStart = childCarePhaseOutStartPreBush;
            childCarePhaseOutStep = childCarePhaseOutStepPreBush;
            childCarePhaseOutRateStart = childCarePhaseOutRateStartPreBush;
            childCarePhaseOutRateStep = childCarePhaseOutRateStepPreBush;
            childCareExpensesCap = childCareExpensesCapPreBush;
            break;
        case "Obama":
            childCarePhaseOutStart = childCarePhaseOutStartObama;
            childCarePhaseOutStep = childCarePhaseOutStepObama;
            childCarePhaseOutRateStart = childCarePhaseOutRateStartObama;
            childCarePhaseOutRateStep = childCarePhaseOutRateStepObama;
            childCareExpensesCap = childCareExpensesCapObama;
            break;
		case "Democrats":
            childCarePhaseOutStart = childCarePhaseOutStartDemocrats;
            childCarePhaseOutStep = childCarePhaseOutStepDemocrats;
            childCarePhaseOutRateStart = childCarePhaseOutRateStartDemocrats;
            childCarePhaseOutRateStep = childCarePhaseOutRateStepDemocrats;
            childCareExpensesCap = childCareExpensesCapDemocrats;
            break;
    }
    var cap = childCareExpensesCap * numOfChildren;
    if (childCareExpenses < cap) {
        var line3 = childCareExpenses;
    }
    else {
        var line3 = cap;
    }
    var line4 = earnedIncome;
    var line5 = line4;
    if (filingStatus == "married") {
        line5 = spouseEarnedIncome;
    }
    var line6 = SmallerOfThree(line3, line4, line5);
    var line7 = agi;
    var ratetest = childCarePhaseOutRateStart;
    var rate = 0;
    if (line7 < childCarePhaseOutStart) {
        rate = childCarePhaseOutRateStart;
    }
    else {
    	var rateChosen = false;
        var counter = 0;
        var line7Test = childCarePhaseOutStart;
        var ceiling;
        while (ratetest > 0.2) {
            ratetest = ratetest - childCarePhaseOutRateStep;
            ceiling = line7Test + childCarePhaseOutStep;
            if (agi > line7Test && agi <= ceiling) {
                rate = ratetest;
                rateChosen = true;
            }
            line7Test = line7Test + childCarePhaseOutStep;
        }
        if (rateChosen == false) {
            rate = 0.2;
        }
    }
    var line9 = line6 * rate;
    var line10 = totalTax;
    result = SmallerOfTwo(line9, totalTax);	if (result < 0) {result = 0;}
    return result;
};
//This function runs when the reset button is pushed.
function ResetAllFields(form1, form2) {
    timesButtonPushed = 0;
    MarriedBoxValue = "";
    form1.reset();
    form2.reset();
    MakeElderlySpouseSelectInactive();
    DisableField("inputForm", "wagesSpouse");
    DisableField("inputForm", "numDependentsUnder17");
    DisableField("inputForm", "numDependents17Plus");
    DisableField("inputForm", "dependentsInCollege");
    DisableField("inputForm", "childCareExpenses");
    document.getElementById("finalcompare").style.visibility = "hidden";
	document.getElementById("democratcompare").style.visibility = "hidden";
    var resultBushExt = document.getElementById("BushCutsExpireResultText");
    var resultPreBush = document.getElementById("BushCutsExtendedResultText");
    var resultObama = document.getElementById("ObamaResultText");
	var resultDemocrats = document.getElementById("DemocratsResultText");
    resultBushExt.innerHTML = "";
    resultPreBush.innerHTML = "";
    resultObama.innerHTML = "";
	resultDemocrats.innerHTML = "";
};
//This function calculates the earned income credit (EITC.)
function EITC(scenario, filingStatus, qualifyingChildren, earnedIncome, investmentIncome) {
    var result;
    if (investmentIncome > eitcInvestmentIncomeCap) {
        return 0;
    }
    var eitcSingle = new Array(4);
    for (m = 0; m <= 3; m++) {
        eitcSingle[m] = new Array(3);
    }
    var eitcMarried = new Array(4);
    for (m = 0; m <= 3; m++) {
        eitcMarried[m] = new Array(3);
    }
    var eitc = new Array(4);
    for (m = 0; m <= 3; m++) {
        eitc[m] = new Array(3);
    }
    var eitcCreditRate = new Array(4);
    var eitcPhaseOutRate = new Array(4);
    for (m = 0; m <= 3; m++) {
        eitcPhaseOutRate[m] = 0;
    }
    for (m = 0; m <= 3; m++) {
        for (n = 0; n <= 2; n++) {
            switch (scenario) {
                case "BushExt":
                    eitcSingle[m][n] = eitcSingleBushExt[m][n];
                    eitcMarried[m][n] = eitcMarriedBushExt[m][n];
                    break;
                case "PreBush":
                    eitcSingle[m][n] = eitcSinglePreBush[m][n];
                    eitcMarried[m][n] = eitcMarriedPreBush[m][n];
                    break;
                case "Obama":
                    eitcSingle[m][n] = eitcSingleObama[m][n];
                    eitcMarried[m][n] = eitcMarriedObama[m][n];
                    break;
				case "Democrats":
                    eitcSingle[m][n] = eitcSingleDemocrats[m][n];
                    eitcMarried[m][n] = eitcMarriedDemocrats[m][n];
                    break;
            }
            switch (filingStatus) {
                case "single":
                    eitc[m][n] = eitcSingle[m][n];
                    break;
                case "hoh":
                    eitc[m][n] = eitcSingle[m][n];
                    break;
                case "married":
                    eitc[m][n] = eitcMarried[m][n];
                    break;
            }
        }
        switch (scenario) {
            case "BushExt":
                eitcCreditRate[m] = eitcCreditRateBushExt[m];
                eitcPhaseOutRate[m] = eitcPhaseOutRateBushExt[m];
                break;
            case "PreBush":
                eitcCreditRate[m] = eitcCreditRatePreBush[m];
                eitcPhaseOutRate[m] = eitcPhaseOutRatePreBush[m];
                break;
            case "Obama":
                eitcCreditRate[m] = eitcCreditRateObama[m];
                eitcPhaseOutRate[m] = eitcPhaseOutRateObama[m];
                break;
			case "Democrats":
                eitcCreditRate[m] = eitcCreditRateDemocrats[m];
                eitcPhaseOutRate[m] = eitcPhaseOutRateDemocrats[m];
                break;
        }
    }
    if (qualifyingChildren > 3) {
        qualifyingChildren = 3;
    }
    if (earnedIncome < eitc[qualifyingChildren][0]) {
        result = earnedIncome * eitcCreditRate[qualifyingChildren];
    }
    else {
        if (earnedIncome < eitc[qualifyingChildren][1]) {
            result = eitc[qualifyingChildren][0] * eitcCreditRate[qualifyingChildren];
        }
        else {
            if (earnedIncome < eitc[qualifyingChildren][2]) {
                result = eitc[qualifyingChildren][0] * eitcCreditRate[qualifyingChildren] -((earnedIncome - eitc[qualifyingChildren][1]) * eitcPhaseOutRate[qualifyingChildren]);
            }
            else {
                result = 0;
            }
        }
    }	if (result<0) {result = 0;}
    return result;
};
//This function is used to limit capital gains losses to $3,000.
function CapitalGains(shortGain, longGain) {
    var netGain = shortGain + longGain;
    if (netGain < -3000) {
        netGain = -3000;
    }
    return netGain;
};
//This function looks at your taxable income, including capital gains, dividends, and ordinary income,
//and calculates the regular tax on it according to the various scenarios and parameters.
function TaxOnCapitalGains(scenario, filingStatus, shortGain, longGain, netCapGains, taxableIncome, dividends, returnMode) {
    var capGainsRateHigh = 0;
    var capGainsRateLow = 0;
	var capGainsRateHighest = 0;
    switch (scenario) {
        case "BushExt":
            capGainsRateHigh = capGainsRateHighBushExt;
            capGainsRateLow = capGainsRateLowBushExt;
			capGainsRateHighest = capGainsRateHighestBushExt;
            var bracket1Single = bracket1SingleBushExt;
            var bracket2Single = bracket2SingleBushExt;
            var bracket3Single = bracket3SingleBushExt;
            var bracket4Single = bracket4SingleBushExt;
            var bracket5Single = bracket5SingleBushExt;
			var bracket6Single = bracket6SingleBushExt;
            var bracket1Married = bracket1MarriedBushExt;
            var bracket2Married = bracket2MarriedBushExt;
            var bracket3Married = bracket3MarriedBushExt;
            var bracket4Married = bracket4MarriedBushExt;
            var bracket5Married = bracket5MarriedBushExt;
			var bracket6Married = bracket6MarriedBushExt;
            var bracket1Hoh = bracket1HohBushExt;
            var bracket2Hoh = bracket2HohBushExt;
            var bracket3Hoh = bracket3HohBushExt;
            var bracket4Hoh = bracket4HohBushExt;
            var bracket5Hoh = bracket5HohBushExt;
			var bracket6Hoh = bracket6HohBushExt;
            var bracket1Rate = bracket1RateBushExt;
            var bracket2Rate = bracket2RateBushExt;
            var bracket3Rate = bracket3RateBushExt;
            var bracket4Rate = bracket4RateBushExt;
            var bracket5Rate = bracket5RateBushExt;
            var bracket6Rate = bracket6RateBushExt;
			var bracket7Rate = bracket7RateBushExt;
            break;
        case "PreBush":
            capGainsRateHigh = capGainsRateHighPreBush;
            capGainsRateLow = capGainsRateLowPreBush;
			capGainsRateHighest = capGainsRateHighestPreBush;
            var bracket1Single = bracket1SinglePreBush;
            var bracket2Single = bracket2SinglePreBush;
            var bracket3Single = bracket3SinglePreBush;
            var bracket4Single = bracket4SinglePreBush;
            var bracket5Single = bracket5SinglePreBush;
			var bracket6Single = bracket6SinglePreBush;
            var bracket1Married = bracket1MarriedPreBush;
            var bracket2Married = bracket2MarriedPreBush;
            var bracket3Married = bracket3MarriedPreBush;
            var bracket4Married = bracket4MarriedPreBush;
            var bracket5Married = bracket5MarriedPreBush;
			var bracket6Married = bracket6MarriedPreBush;
            var bracket1Hoh = bracket1HohPreBush;
            var bracket2Hoh = bracket2HohPreBush;
            var bracket3Hoh = bracket3HohPreBush;
            var bracket4Hoh = bracket4HohPreBush;
            var bracket5Hoh = bracket5HohPreBush;
			var bracket6Hoh = bracket6HohPreBush;
            var bracket1Rate = bracket1RatePreBush;
            var bracket2Rate = bracket2RatePreBush;
            var bracket3Rate = bracket3RatePreBush;
            var bracket4Rate = bracket4RatePreBush;
            var bracket5Rate = bracket5RatePreBush;
            var bracket6Rate = bracket6RatePreBush;
			var bracket7Rate = bracket7RatePreBush;
            break;
        case "Obama":
			capGainsRateHighest = capGainsRateHighestObama;
            capGainsRateHigh = capGainsRateHighObama;
            capGainsRateLow = capGainsRateLowObama;
            var bracket1Single = bracket1SingleObama;
            var bracket2Single = bracket2SingleObama;
            var bracket3Single = bracket3SingleObama;
            var bracket4Single = bracket4SingleObama;
            var bracket5Single = bracket5SingleObama;
			var bracket6Single = bracket6SingleObama;
            var bracket1Married = bracket1MarriedObama;
            var bracket2Married = bracket2MarriedObama;
            var bracket3Married = bracket3MarriedObama;
            var bracket4Married = bracket4MarriedObama;
            var bracket5Married = bracket5MarriedObama;
			var bracket6Married = bracket6MarriedObama;
            var bracket1Hoh = bracket1HohObama;
            var bracket2Hoh = bracket2HohObama;
            var bracket3Hoh = bracket3HohObama;
            var bracket4Hoh = bracket4HohObama;
            var bracket5Hoh = bracket5HohObama;
			var bracket6Hoh = bracket6HohObama;
            var bracket1Rate = bracket1RateObama;
            var bracket2Rate = bracket2RateObama;
            var bracket3Rate = bracket3RateObama;
            var bracket4Rate = bracket4RateObama;
            var bracket5Rate = bracket5RateObama;
            var bracket6Rate = bracket6RateObama;
			var bracket7Rate = bracket7RateObama;
            break;
		case "Democrats":
			capGainsRateHighest = capGainsRateHighestDemocrats;
            capGainsRateHigh = capGainsRateHighDemocrats;
            capGainsRateLow = capGainsRateLowDemocrats;
            var bracket1Single = bracket1SingleDemocrats;
            var bracket2Single = bracket2SingleDemocrats;
            var bracket3Single = bracket3SingleDemocrats;
            var bracket4Single = bracket4SingleDemocrats;
            var bracket5Single = bracket5SingleDemocrats;
			var bracket6Single = bracket6SingleDemocrats;
            var bracket1Married = bracket1MarriedDemocrats;
            var bracket2Married = bracket2MarriedDemocrats;
            var bracket3Married = bracket3MarriedDemocrats;
            var bracket4Married = bracket4MarriedDemocrats;
            var bracket5Married = bracket5MarriedDemocrats;
			var bracket6Married = bracket6MarriedDemocrats;
            var bracket1Hoh = bracket1HohDemocrats;
            var bracket2Hoh = bracket2HohDemocrats;
            var bracket3Hoh = bracket3HohDemocrats;
            var bracket4Hoh = bracket4HohDemocrats;
            var bracket5Hoh = bracket5HohDemocrats;
			var bracket6Hoh = bracket6HohDemocrats;
            var bracket1Rate = bracket1RateDemocrats;
            var bracket2Rate = bracket2RateDemocrats;
            var bracket3Rate = bracket3RateDemocrats;
            var bracket4Rate = bracket4RateDemocrats;
            var bracket5Rate = bracket5RateDemocrats;
            var bracket6Rate = bracket6RateDemocrats;
			var bracket7Rate = bracket7RateDemocrats;
            break;
    }
    switch (filingStatus) {
        case ("single"):
            var bracket1 = bracket1Single;
            var bracket2 = bracket2Single;
            var bracket3 = bracket3Single;
            var bracket4 = bracket4Single;
            var bracket5 = bracket5Single;
			var bracket6 = bracket6Single;
            break;
        case ("married"):
            var bracket1 = bracket1Married;
            var bracket2 = bracket2Married;
            var bracket3 = bracket3Married;
            var bracket4 = bracket4Married;
            var bracket5 = bracket5Married;
			var bracket6 = bracket6Married;
            break;
        case ("hoh"):
            var bracket1 = bracket1Hoh;
            var bracket2 = bracket2Hoh;
            var bracket3 = bracket3Hoh;
            var bracket4 = bracket4Hoh;
            var bracket5 = bracket5Hoh;
			var bracket6 = bracket6Hoh;
            break;
    }
    var smallerOfLongOrNetGain = SmallerOfTwo(longGain, netCapGains);
    if (smallerOfLongOrNetGain < 0) {
        smallerOfLongOrNetGain = 0;
    }
    if (scenario == "PreBush") {
        var totalCapGains = smallerOfLongOrNetGain;
    }
    else if (scenario == "Democrats") {
		var nonDividendIncome = taxableIncome - dividends;
		if (nonDividendIncome < 0) nonDividendIncome = 0;
		var limit = bracket5 - nonDividendIncome;
		var dividendsUnderLimit = SmallerOfTwo(dividends, limit);
		var totalCapGains =  smallerOfLongOrNetGain + dividendsUnderLimit;
	} else {
        var totalCapGains = smallerOfLongOrNetGain + dividends;
    }
    var adjustedTaxableIncome = taxableIncome - totalCapGains;
    if (adjustedTaxableIncome < 0) {
        adjustedTaxableIncome = 0;
    }
    var smallerOfIncomeOrBracket2 = SmallerOfTwo(taxableIncome, bracket2);
    var lowCapGains = smallerOfIncomeOrBracket2 - adjustedTaxableIncome;
    if (lowCapGains < 0) {
        lowCapGains = 0;
    }
    var lowCapGainsTax = lowCapGains * capGainsRateLow;
	
	var smallerOfIncomeOrBracket5 = SmallerOfTwo(taxableIncome, bracket5);
    var highCapGains = smallerOfIncomeOrBracket5 - lowCapGains - adjustedTaxableIncome;
    if (highCapGains < 0) {
        highCapGains = 0;
    }
    var highCapGainsTax = highCapGains * capGainsRateHigh;
	
	var highestCapGains = taxableIncome - adjustedTaxableIncome - lowCapGains - highCapGains;
	var highestCapGainsTax = highestCapGains*capGainsRateHighest;
	
	var totalCapGainsTax = lowCapGainsTax + highCapGainsTax + highestCapGainsTax;
	//alert("bracket1 = " + bracket1 + "\n bracket2 = "  + bracket2 + "\n bracket3 = " + bracket3 + "\n bracket4 = " + bracket4 + "\n bracket5 = " + bracket5 + "\n bracket6 = " + bracket6);
	//alert("regular" + scenario + "\n" + "lowCapGains = " + lowCapGains + " " + lowCapGainsTax + "\n" + "highCapGains = " + highCapGains + " " + highCapGainsTax + "\n" + "highestCapGains = " + highestCapGains + " " + highestCapGainsTax);
	var ordinaryTax = FigureTax(bracket1, bracket2, bracket3, bracket4, bracket5, bracket6, bracket1Rate, bracket2Rate, bracket3Rate, bracket4Rate, bracket5Rate, bracket6Rate, bracket7Rate, adjustedTaxableIncome);
    var ordinaryTaxAndCapGainsTax = ordinaryTax + totalCapGainsTax;
    var alternateOrdinaryTax = FigureTax(bracket1, bracket2, bracket3, bracket4, bracket5, bracket6, bracket1Rate, bracket2Rate, bracket3Rate, bracket4Rate, bracket5Rate, bracket6Rate, bracket7Rate, taxableIncome);
    var result = SmallerOfTwo(ordinaryTaxAndCapGainsTax, alternateOrdinaryTax);
    if (returnMode == "TotalCapGains") {
        return totalCapGains;
    }
    else {
        return result;
    }
};
//These functions are used throughout to compare various quantities.
function SmallerOfTwo(num1, num2) {
    var result = 0;
    if (num1 < num2) {
        result = num1;
    }
    else {
        result = num2;
    }
    return result;
};
function GreaterOfTwo(num1, num2) {
    var result = 0;
    if (num1 > num2) {
        result = num1;
    }
    else {
        result = num2;
    }
    return result;
};
function SmallerOfThree(num1, num2, num3) {
    var result = 0;
    var smallerof1or2 = SmallerOfTwo(num1, num2);
    result = SmallerOfTwo(smallerof1or2, num3);
    return result;
};
function GreaterOfThree(num1, num2, num3) {
    var result = 0;
    var greaterof1or2 = GreaterOfTwo(num1, num2);
    result = GreaterOfTwo(greaterof1or2, num3);
    return result;
};
//This function determines the taxable portion of your social security benefits.
function TaxableSocialSecurity(filingStatus, wages, socialSecurityBenefits, dividends, capitalGains, otherIncome) {
    switch (filingStatus) {
        case "single":
            var socialSecurityUpper = socialSecurityUpperSingle;
            var socialSecurityLower = socialSecurityLowerSingle;
            break;
        case "married":
            var socialSecurityUpper = socialSecurityUpperMarried;
            var socialSecurityLower = socialSecurityLowerMarried;
            break;
        case "hoh":
            var socialSecurityUpper = socialSecurityUpperSingle;
            var socialSecurityLower = socialSecurityLowerSingle;
            break;
    }
    var line1 = socialSecurityBenefits;
    var line2 = line1 / 2;
    var line3 = wages + dividends + capitalGains + otherIncome;
    var line5 = line2 + line3;
    var line6 = 0;
    var line7 = line5 - line6;
    if (line7 < 0) {
        line7 = 0;
    }
    var line8 = socialSecurityUpper;
    var line9 = line7 - line8;
    if (line9 < 0) {
        line9 = 0;
    }
    var line10 = socialSecurityLower;
    var line11 = line9 - line10;
    if (line11 < 0) {
        line11 = 0;
    }
    var line12 = SmallerOfTwo(line9, line10);
    var line13 = line12 / 2;
    var line14 = SmallerOfTwo(line2, line13);
    var line15 = line11 * .85;
    var line16 = line14 + line15;
    var line17 = line1 * .85;
    var line18 = SmallerOfTwo(line16, line17);
    return line18;
};
//The next three functions make up the core of the calculator, reading the user's
//input, going sequentially through the Form 1040, calling other functions as needed,
//and writing to the output boxes.  Although inefficient, it was easiest
//to make separate main functions for each of the three scenarios.  


function BushExtForm1040(inputForm, outputForm) {
	function CalculateBushExtForm1040(inputForm, outputForm, deductionMode) {
	    var numOfChildren17Under = GetValue(inputForm, "numDependentsUnder17");
	    var numOfChildren17Over = GetValue(inputForm, "numDependents17Plus");
	    var filingStatusIndex = document[inputForm]["filingstatus"]["selectedIndex"];
	    switch (filingStatusIndex) {
	        case 0:
	            filingStatus = "single";
	            break;
	        case 1:
	            filingStatus = "married";
	            break;
	        case 2:
	            filingStatus = "hoh";
	            break;
	    }
	    var numOfSpouses = 0;
	    if (filingStatus == "married") {
	        numOfSpouses = 1;
	    }
	    else {
	        numOfSpouses = 0;
	    }
	    var DependentsInCollege = GetValue(inputForm, "dependentsInCollege");
	    var isHeadInCollegeIndex = document[inputForm]["inCollege"]["selectedIndex"];
	    var numOfStudents = DependentsInCollege + isHeadInCollegeIndex;
	    var TuitionExpenses = GetValue(inputForm, "tuitionExpenses");
	    var Exemptions = numOfChildren17Under + numOfChildren17Over + numOfSpouses + 1;
	    var WagesHead = GetValue(inputForm, "wagesHead");
	    var WagesSpouse = GetValue(inputForm, "wagesSpouse");
		var payrollTaxHead = PayrollTaxes(0.042,WagesHead);
		var payrollTaxSpouse = PayrollTaxes(0.042,WagesSpouse);
		var payrollTax = payrollTaxHead + payrollTaxSpouse;
	    var EarnedIncome = WagesHead + WagesSpouse;
	    var Dividends = GetValue(inputForm, "dividends");
	    var shortTermGain = GetValue(inputForm, "capGainsShort");
	    var longTermGain = GetValue(inputForm, "capGainsLong");
	    var capGains = CapitalGains(shortTermGain, longTermGain);
	    var socialSecurityBenefits = GetValue(inputForm, "ssBenefits");
	    var OtherIncome = GetValue(inputForm, "otherIncome");
	    var TaxableSocialSecurityBenefits = TaxableSocialSecurity(filingStatus, EarnedIncome, socialSecurityBenefits, Dividends, capGains, OtherIncome);
	    var GrossIncome = EarnedIncome + Dividends + capGains + TaxableSocialSecurityBenefits + OtherIncome;
	    var HeadOver65Index = document[inputForm]["head65OrOver"]["selectedIndex"];
	    var IsHeadOver65 = "No";
	    if (HeadOver65Index == 1) {
	        IsHeadOver65 = "Yes";
	    }
	    var SpouseOver65Index = document[inputForm]["spouse65OrOver"]["selectedIndex"];
	    var IsSpouseOver65 = "No";
	    if (SpouseOver65Index == 1) {
	        IsSpouseOver65 = "Yes";
	    }
	    var RealEstateTaxes = GetValue(inputForm, "realEstateTaxes");
	    var LocalTaxes = GetValue(inputForm, "stateIncomeTax");
	    var otherItemizedDeductions = GetValue(inputForm, "otherItemizedDeductions");
	    var ChildCareExpenses = GetValue(inputForm, "childCareExpenses");
	    // Do everything from here to education credits twice to compare tuition benefit to education credits
		var TotalItemizedDeductionstd = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var TuitionDeductionAmounttd = TuitionDeduction(filingStatus, TuitionExpenses, GrossIncome, numOfStudents);
	    var AGItd = GrossIncome - TuitionDeductionAmounttd;
	    var PersonalExemptionsAmounttd = PEP("BushExt", filingStatus, Exemptions, AGItd);
	    var ItemizedDeductionstd = ItemizedDeductionLimitation(filingStatus, "BushExt", AGItd, TotalItemizedDeductionstd);
	    var TotalStandardDeductiontd = StandardDeduction("BushExt", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductiontd = 0;
	    }
	    else {
	        ItemizedDeductionstd = 0;
			TotalItemizedDeductionstd = 0;
	    }
	    var TotalDeductionstd = TotalStandardDeductiontd + ItemizedDeductionstd;
	    var TaxableIncometd = AGItd - PersonalExemptionsAmounttd - TotalStandardDeductiontd - ItemizedDeductionstd;
	    if (TaxableIncometd < 0) {
	        TaxableIncometd = 0;
	    }
	    var OrdinaryTaxtd = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "Tax");
	    var TotalCapGainstd = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "TotalCapGains");
	    var TMTtd = TentativeMinimumTax("BushExt", filingStatus, AGItd, TotalItemizedDeductionstd, ItemizedDeductionstd, RealEstateTaxes, LocalTaxes, TotalCapGainstd, TotalDeductionstd, deductionMode, TaxableIncometd);
	    var AMTtd = TMTtd - OrdinaryTaxtd;
	    if (AMTtd < 0) {
	        AMTtd = 0;
	    }
	    var IncomeTaxBeforeCreditstd = OrdinaryTaxtd + AMTtd;
	    var ChildExpensesCredittd = ChildCareCredit("BushExt", filingStatus, AGItd, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditstd);
	    var NonrefundableCTCtd = NonRefundableChildTaxCredit("BushExt", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0);
	    var RefundableCTCtd = RefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0, EarnedIncome);
	    // Repeat without tuition deduction but with education credits
		var TotalItemizedDeductionsec = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var AGIec = GrossIncome;
	    var PersonalExemptionsAmountec = PEP("BushExt", filingStatus, Exemptions, AGIec);
	    var ItemizedDeductionsec = ItemizedDeductionLimitation(filingStatus, "BushExt", AGIec, TotalItemizedDeductionsec);
	    var TotalStandardDeductionec = StandardDeduction("BushExt", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductionec = 0;
	    }
	    else {
	        ItemizedDeductionsec = 0;
			TotalItemizedDeductionsec = 0;
	    }
	    var TotalDeductionsec = TotalStandardDeductionec + ItemizedDeductionsec;
	    var TaxableIncomeec = AGIec - PersonalExemptionsAmountec - TotalStandardDeductionec - ItemizedDeductionsec;
	    if (TaxableIncomeec < 0) {
	        TaxableIncomeec = 0;
	    }
	    var OrdinaryTaxec = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "Tax");
	    var TotalCapGainsec = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "TotalCapGains");
		var TMTec = TentativeMinimumTax("BushExt", filingStatus, AGIec, TotalItemizedDeductionsec, ItemizedDeductionsec, RealEstateTaxes, LocalTaxes, TotalCapGainsec, TotalDeductionsec, deductionMode, TaxableIncomeec);
	    
		var AMTec = TMTec - OrdinaryTaxec;
	    if (AMTec < 0) {
	        AMTec = 0;
	    }
	    var IncomeTaxBeforeCreditsec = OrdinaryTaxec + AMTec;
	    var ChildExpensesCreditec = ChildCareCredit("BushExt", filingStatus, AGIec, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditsec);
	    var eduCreditType = EducationCreditsComparison("Obama", filingStatus, TuitionExpenses, numOfStudents, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	    var refundableEduCredec = 0;
	    var nonrefundableEduCredec = 0;
	    switch (eduCreditType) {
	        case "AOC":
	            var tenAOC = TentativeAOC(TuitionExpenses, numOfStudents);
	            refundableEduCredec = RefundableAOC(filingStatus, AGIec, tenAOC);
	            nonrefundableEduCredec = NonRefundableAOC(filingStatus, AGIec, tenAOC, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	            break;
	        case "otherCredits":
	            var tenHope = TentativeHope("Obama", TuitionExpenses, numOfStudents);
	            var tenll = TentativeLifelongLearning("Obama", TuitionExpenses, numOfStudents);
	            nonrefundableEduCredec = NonRefundableEduCredits("Obama", filingStatus, AGIec, tenHope, tenll, ChildExpensesCreditec, IncomeTaxBeforeCreditsec);
	            break;
	    }
	    var NonrefundableCTCec = NonRefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec);
	    var RefundableCTCec = RefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec, EarnedIncome);
	    // Compare the two cases (tuition deduction vs. education credits)
	    var TuitionDeductionAmount;
	    var TaxBurdenTuitionDeduction;
	    var TaxBurdenEducationCredits;
	    var AGI;
	    var PersonalExemptionsAmount;
	    var ItemizedDeductions;
	    var TotalStandardDeduction;
	    var TaxableIncome;
	    var OrdinaryTax;
	    var AMT;
	    var IncomeTaxBeforeCredits;
	    var ChildExpensesCredit;
	    var RefundableEducationCredits;
	    var NonRefundableEducationCredits;
	    var NonrefundableCTC;
	    var RefundableCTC;
	    var TotalCapGains;
	    TaxBurdenTuitionDeduction = IncomeTaxBeforeCreditstd - ChildExpensesCredittd - NonrefundableCTCtd - RefundableCTCtd;
	    TaxBurdenEducationCredits = IncomeTaxBeforeCreditsec - ChildExpensesCreditec - refundableEduCredec - nonrefundableEduCredec - NonrefundableCTCec - RefundableCTCec;
	    if (TaxBurdenTuitionDeduction <= TaxBurdenEducationCredits) {
	        TuitionDeductionAmount = TuitionDeductionAmounttd;
	        AGI = AGItd;
	        PersonalExemptionsAmount = PersonalExemptionsAmounttd;
	        ItemizedDeductions = ItemizedDeductionstd;
	        TotalStandardDeduction = TotalStandardDeductiontd;
	        TaxableIncome = TaxableIncometd;
	        TotalCapGains = TotalCapGainstd;
	        OrdinaryTax = OrdinaryTaxtd;
	        AMT = AMTtd;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditstd;
	        ChildExpensesCredit = ChildExpensesCredittd;
	        RefundableEducationCredits = 0;
	        NonRefundableEducationCredits = 0;
	        NonrefundableCTC = NonrefundableCTCtd;
	        RefundableCTC = RefundableCTCtd;
	    }
	    else {
	        TuitionDeductionAmount = 0;
	        AGI = AGIec;
	        PersonalExemptionsAmount = PersonalExemptionsAmountec;
	        ItemizedDeductions = ItemizedDeductionsec;
	        TotalStandardDeduction = TotalStandardDeductionec;
	        TotalCapGains = TotalCapGainsec;
	        TaxableIncome = TaxableIncomeec;
	        OrdinaryTax = OrdinaryTaxec;
	        AMT = AMTec;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditsec;
	        ChildExpensesCredit = ChildExpensesCreditec;
	        RefundableEducationCredits = refundableEduCredec;
	        NonRefundableEducationCredits = nonrefundableEduCredec;
	        NonrefundableCTC = NonrefundableCTCec;
	        RefundableCTC = RefundableCTCec;
	    }
	    var EICQualifyingChildren = DependentsInCollege + numOfChildren17Under;
	    var EICInvestmentIncome = Dividends + capGains;
	    var EarnedIncomeCredit = EITC("Obama", filingStatus, EICQualifyingChildren, EarnedIncome, EICInvestmentIncome);
	    var TotalIncomeTax = IncomeTaxBeforeCredits - ChildExpensesCredit - RefundableEducationCredits - NonRefundableEducationCredits - NonrefundableCTC - RefundableCTC - EarnedIncomeCredit;
	    var RoundedTax = Math.round(TotalIncomeTax);
	    if (deductionMode == "standard") {
	    	gTaxableSocialSecurityBenefits[0] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[0] = EarnedIncome;
			gPayrollTax[0] = payrollTax;
	    	gExemptions[0] = Exemptions;
	    	gDividends[0] = Dividends;
	    	gcapGains[0] = capGains;
	    	gOtherIncome[0] = OtherIncome;
	    	gGrossIncome[0] = GrossIncome;
	    	gTuitionDeductionAmount[0] = TuitionDeductionAmount;
	    	gAGI[0] = AGI;
	    	gPersonalExemptionsAmount[0] = PersonalExemptionsAmount;
	    	gItemizedDeductions[0] = ItemizedDeductions;
	    	gTotalStandardDeduction[0] = TotalStandardDeduction;
	    	gTaxableIncome[0] = TaxableIncome;
	    	gOrdinaryTax[0] = OrdinaryTax;
	    	gAMT[0] = AMT;
	    	gIncomeTaxBeforeCredits[0] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[0] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[0] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[0] = RefundableEducationCredits;
	    	gNonrefundableCTC[0] = NonrefundableCTC;
	    	gRefundableCTC[0] = RefundableCTC;
	    	gEarnedIncomeCredit[0] = EarnedIncomeCredit;
	    	gTotalIncomeTax[0] = TotalIncomeTax;
	    }
	    if (deductionMode == "itemized") {
	    	gTaxableSocialSecurityBenefits[1] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[1] = EarnedIncome;
			gPayrollTax[1] = payrollTax;
	    	gExemptions[1] = Exemptions;
	    	gDividends[1] = Dividends;
	    	gcapGains[1] = capGains;
	    	gOtherIncome[1] = OtherIncome;
	    	gGrossIncome[1] = GrossIncome;
	    	gTuitionDeductionAmount[1] = TuitionDeductionAmount;
	    	gAGI[1] = AGI;
	    	gPersonalExemptionsAmount[1] = PersonalExemptionsAmount;
	    	gItemizedDeductions[1] = ItemizedDeductions;
	    	gTotalStandardDeduction[1] = TotalStandardDeduction;
	    	gTaxableIncome[1] = TaxableIncome;
	    	gOrdinaryTax[1] = OrdinaryTax;
	    	gAMT[1] = AMT;
	    	gIncomeTaxBeforeCredits[1] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[1] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[1] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[1] = RefundableEducationCredits;
	    	gNonrefundableCTC[1] = NonrefundableCTC;
	    	gRefundableCTC[1] = RefundableCTC;
	    	gEarnedIncomeCredit[1] = EarnedIncomeCredit;
	    	gTotalIncomeTax[1] = TotalIncomeTax;
	    }
	    return TotalIncomeTax;
	};
    var gTaxableSocialSecurityBenefits = new Array(2);
    var gEarnedIncome = new Array(2);
	var gPayrollTax = new Array(2);
    var gExemptions = new Array(2);
    var gDividends = new Array(2);
    var gcapGains = new Array(2);
    var gOtherIncome = new Array(2);
    var gGrossIncome = new Array(2);
    var gTuitionDeductionAmount = new Array(2);
    var gAGI = new Array(2);
    var gPersonalExemptionsAmount = new Array(2);
    var gItemizedDeductions = new Array(2);
    var gTotalStandardDeduction = new Array(2);
    var gTaxableIncome = new Array(2);
    var gOrdinaryTax = new Array(2);
    var gAMT = new Array(2);
    var gIncomeTaxBeforeCredits = new Array(2);
    var gChildExpensesCredit = new Array(2);
    var gNonRefundableEducationCredits = new Array(2);
    var gRefundableEducationCredits = new Array(2);
    var gNonrefundableCTC = new Array(2);
    var gRefundableCTC = new Array(2);
    var gEarnedIncomeCredit = new Array(2);
    var gMakingWorkPayCredit = new Array(2);
    var gTotalIncomeTax = new Array(2);
    var resultStandard = CalculateBushExtForm1040(inputForm, outputForm, "standard");
    var resultItemized = CalculateBushExtForm1040(inputForm, outputForm, "itemized");
    var deductionIndex = 0;
    if (resultItemized < resultStandard) {
    	deductionIndex = 1;
    }
	if (document.getElementById("forceStandard").checked == true) {
		deductionIndex = 0;
	}
	if (document.getElementById("forceItemized").checked == true) {
		deductionIndex = 1;
	}
    WriteCashValue("outputForm", "taxableSSBushExt", gTaxableSocialSecurityBenefits[deductionIndex]);
    WriteCashValue("outputForm", "wagesBushExt", gEarnedIncome[deductionIndex]);
    WriteValue("outputForm", "exemptionsBushExt", gExemptions[deductionIndex]);
    WriteCashValue("outputForm", "dividendsBushExt", gDividends[deductionIndex]);
    WriteCashValue("outputForm", "capGainsBushExt", gcapGains[deductionIndex]);
    WriteCashValue("outputForm", "otherIncomeBushExt", gOtherIncome[deductionIndex]);
    WriteCashValue("outputForm", "grossIncomeBushExt", gGrossIncome[deductionIndex]);
    WriteCashValue("outputForm", "tuitionDeductionBushExt", gTuitionDeductionAmount[deductionIndex]);
    WriteCashValue("outputForm", "AGIBushExt", gAGI[deductionIndex]);
    WriteCashValue("outputForm", "personalExemptionsBushExt", gPersonalExemptionsAmount[deductionIndex]);
    WriteCashValue("outputForm", "itemizedDeductionsBushExt", gItemizedDeductions[deductionIndex]);
    WriteCashValue("outputForm", "standardDeductionBushExt", gTotalStandardDeduction[deductionIndex]);
    WriteCashValue("outputForm", "taxableIncomeBushExt", gTaxableIncome[deductionIndex]);
    WriteCashValue("outputForm", "taxBushExt", gOrdinaryTax[deductionIndex]);
    WriteCashValue("outputForm", "AMTBushExt", gAMT[deductionIndex]);
    WriteCashValue("outputForm", "totalTaxBushExt", gIncomeTaxBeforeCredits[deductionIndex]);
    WriteCashValue("outputForm", "childExpensesBushExt", gChildExpensesCredit[deductionIndex]);
    WriteCashValue("outputForm", "nonRefundableEducationCreditsBushExt", gNonRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "refundableEducationCreditsBushExt", gRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "ctcBushExt", gNonrefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "refCTCBushExt", gRefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "eitcBushExt", gEarnedIncomeCredit[deductionIndex]);
    WriteCashValue("outputForm", "netTaxBushExt", gTotalIncomeTax[deductionIndex]);
	WriteCashValue("outputForm", "payrollTaxBushExt", gPayrollTax[deductionIndex]);
	WriteCashValue("outputForm", "incomePayrollTaxBushExt", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    WriteValueWithCommas("BushCutsExtendedResultText", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    return gTotalIncomeTax[deductionIndex];
}

function PreBushForm1040(inputForm, outputForm) {
	function CalculatePreBushForm1040(inputForm, outputForm, deductionMode) {
	    var numOfChildren17Under = GetValue(inputForm, "numDependentsUnder17");
	    var numOfChildren17Over = GetValue(inputForm, "numDependents17Plus");
	    var filingStatusIndex = document[inputForm]["filingstatus"]["selectedIndex"];
	    switch (filingStatusIndex) {
	        case 0:
	            filingStatus = "single";
	            break;
	        case 1:
	            filingStatus = "married";
	            break;
	        case 2:
	            filingStatus = "hoh";
	            break;
	    }
	    var numOfSpouses = 0;
	    if (filingStatus == "married") {
	        numOfSpouses = 1;
	    }
	    else {
	        numOfSpouses = 0;
	    }
	    var DependentsInCollege = GetValue(inputForm, "dependentsInCollege");
	    var isHeadInCollegeIndex = document[inputForm]["inCollege"]["selectedIndex"];
	    var numOfStudents = DependentsInCollege + isHeadInCollegeIndex;
	    var TuitionExpenses = GetValue(inputForm, "tuitionExpenses");
	    var Exemptions = numOfChildren17Under + numOfChildren17Over + numOfSpouses + 1;
	    var WagesHead = GetValue(inputForm, "wagesHead");
	    var WagesSpouse = GetValue(inputForm, "wagesSpouse");
		var payrollTaxHead = PayrollTaxes(0.062,WagesHead);
		var payrollTaxSpouse = PayrollTaxes(0.062,WagesSpouse);
		var payrollTax = payrollTaxHead + payrollTaxSpouse;
	    var EarnedIncome = WagesHead + WagesSpouse;
	    var Dividends = GetValue(inputForm, "dividends");
	    var shortTermGain = GetValue(inputForm, "capGainsShort");
	    var longTermGain = GetValue(inputForm, "capGainsLong");
	    var capGains = CapitalGains(shortTermGain, longTermGain);
	    var socialSecurityBenefits = GetValue(inputForm, "ssBenefits");
	    var OtherIncome = GetValue(inputForm, "otherIncome");
	    var TaxableSocialSecurityBenefits = TaxableSocialSecurity(filingStatus, EarnedIncome, socialSecurityBenefits, Dividends, capGains, OtherIncome);
	    var GrossIncome = EarnedIncome + Dividends + capGains + TaxableSocialSecurityBenefits + OtherIncome;
	    var HeadOver65Index = document[inputForm]["head65OrOver"]["selectedIndex"];
	    var IsHeadOver65 = "No";
	    if (HeadOver65Index == 1) {
	        IsHeadOver65 = "Yes";
	    }
	    var SpouseOver65Index = document[inputForm]["spouse65OrOver"]["selectedIndex"];
	    var IsSpouseOver65 = "No";
	    if (SpouseOver65Index == 1) {
	        IsSpouseOver65 = "Yes";
	    }
	    var RealEstateTaxes = GetValue(inputForm, "realEstateTaxes");
	    var LocalTaxes = GetValue(inputForm, "stateIncomeTax");
	    var otherItemizedDeductions = GetValue(inputForm, "otherItemizedDeductions");
	    
	    var ChildCareExpenses = GetValue(inputForm, "childCareExpenses");
	    // Do everything from here to education credits twice to compare tuition benefit to education credits
		var TotalItemizedDeductionstd = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var TuitionDeductionAmounttd = TuitionDeduction(filingStatus, TuitionExpenses, GrossIncome, numOfStudents);
	    var AGItd = GrossIncome - TuitionDeductionAmounttd;
	    var PersonalExemptionsAmounttd = PEP("PreBush", filingStatus, Exemptions, AGItd);
	    var ItemizedDeductionstd = ItemizedDeductionLimitation(filingStatus, "PreBush", AGItd, TotalItemizedDeductionstd);
	    var TotalStandardDeductiontd = StandardDeduction("PreBush", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductiontd = 0;
	    }
	    else {
	        ItemizedDeductionstd = 0;
			TotalItemizedDeductionstd = 0;
	    }
	    var TotalDeductionstd = TotalStandardDeductiontd + ItemizedDeductionstd;
	    var TaxableIncometd = AGItd - PersonalExemptionsAmounttd - TotalStandardDeductiontd - ItemizedDeductionstd;
	    if (TaxableIncometd < 0) {
	        TaxableIncometd = 0;
	    }
	    var OrdinaryTaxtd = TaxOnCapitalGains("PreBush", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "Tax");
	    var TotalCapGainstd = TaxOnCapitalGains("PreBush", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "TotalCapGains");
	    var TMTtd = TentativeMinimumTax("PreBush", filingStatus, AGItd, TotalItemizedDeductionstd, ItemizedDeductionstd, RealEstateTaxes, LocalTaxes, TotalCapGainstd, TotalDeductionstd, deductionMode, TaxableIncometd);
	    var AMTtd = TMTtd - OrdinaryTaxtd;
	    if (AMTtd < 0) {
	        AMTtd = 0;
	    }
	    var IncomeTaxBeforeCreditstd = OrdinaryTaxtd + AMTtd;
	    var ChildExpensesCredittd = ChildCareCredit("PreBush", filingStatus, AGItd, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditstd);
	    var NonrefundableCTCtd = NonRefundableChildTaxCredit("PreBush", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0);
	    var RefundableCTCtd = RefundableChildTaxCredit("PreBush", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0, EarnedIncome);
	    // Repeat without tuition deduction but with education credits
		var TotalItemizedDeductionsec = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var AGIec = GrossIncome;
	    var PersonalExemptionsAmountec = PEP("PreBush", filingStatus, Exemptions, AGIec);
	    var ItemizedDeductionsec = ItemizedDeductionLimitation(filingStatus, "PreBush", AGIec, TotalItemizedDeductionsec);
	    var TotalStandardDeductionec = StandardDeduction("PreBush", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductionec = 0;
	    }
	    else {
	        ItemizedDeductionsec = 0;
			TotalItemizedDeductionsec = 0;
	    }
	    var TotalDeductionsec = TotalStandardDeductionec + ItemizedDeductionsec;
	    var TaxableIncomeec = AGIec - PersonalExemptionsAmountec - TotalStandardDeductionec - ItemizedDeductionsec;
	    if (TaxableIncomeec < 0) {
	        TaxableIncomeec = 0;
	    }
	    var OrdinaryTaxec = TaxOnCapitalGains("PreBush", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "Tax");
	    var TotalCapGainsec = TaxOnCapitalGains("PreBush", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "TotalCapGains");
		var TMTec = TentativeMinimumTax("PreBush", filingStatus, AGIec, TotalItemizedDeductionsec, ItemizedDeductionsec, RealEstateTaxes, LocalTaxes, TotalCapGainsec, TotalDeductionsec, deductionMode, TaxableIncomeec);
		var AMTec = TMTec - OrdinaryTaxec;
	    if (AMTec < 0) {
	        AMTec = 0;
	    }
	    var IncomeTaxBeforeCreditsec = OrdinaryTaxec + AMTec;
	    var ChildExpensesCreditec = ChildCareCredit("PreBush", filingStatus, AGIec, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditsec);
	    var eduCreditType = EducationCreditsComparison("PreBush", filingStatus, TuitionExpenses, numOfStudents, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	    var refundableEduCredec = 0;
	    var nonrefundableEduCredec = 0;
	    switch (eduCreditType) {
	        case "AOC":
	            var tenAOC = TentativeAOC(TuitionExpenses, numOfStudents);
	            refundableEduCredec = RefundableAOC(filingStatus, AGIec, tenAOC);
	            nonrefundableEduCredec = NonRefundableAOC(filingStatus, AGIec, tenAOC, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	            break;
	        case "otherCredits":
	            var tenHope = TentativeHope("PreBush", TuitionExpenses, numOfStudents);
	            var tenll = TentativeLifelongLearning("PreBush", TuitionExpenses, numOfStudents);
	            nonrefundableEduCredec = NonRefundableEduCredits("PreBush", filingStatus, AGIec, tenHope, tenll, ChildExpensesCreditec, IncomeTaxBeforeCreditsec);
	            break;
	    }
	    var NonrefundableCTCec = NonRefundableChildTaxCredit("PreBush", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec);
	    var RefundableCTCec = RefundableChildTaxCredit("PreBush", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec, EarnedIncome);
	    // Compare the two cases (tuition deduction vs. education credits)
	    var TuitionDeductionAmount;
	    var TaxBurdenTuitionDeduction;
	    var TaxBurdenEducationCredits;
	    var AGI;
	    var PersonalExemptionsAmount;
	    var ItemizedDeductions;
	    var TotalStandardDeduction;
	    var TaxableIncome;
	    var OrdinaryTax;
	    var AMT;
	    var IncomeTaxBeforeCredits;
	    var ChildExpensesCredit;
	    var RefundableEducationCredits;
	    var NonRefundableEducationCredits;
	    var NonrefundableCTC;
	    var RefundableCTC;
	    var TotalCapGains;
	    TaxBurdenTuitionDeduction = IncomeTaxBeforeCreditstd - ChildExpensesCredittd - NonrefundableCTCtd - RefundableCTCtd;
	    TaxBurdenEducationCredits = IncomeTaxBeforeCreditsec - ChildExpensesCreditec - refundableEduCredec - nonrefundableEduCredec - NonrefundableCTCec - RefundableCTCec;
	    if (TaxBurdenTuitionDeduction <= TaxBurdenEducationCredits) {
	        TuitionDeductionAmount = TuitionDeductionAmounttd;
	        AGI = AGItd;
	        PersonalExemptionsAmount = PersonalExemptionsAmounttd;
	        ItemizedDeductions = ItemizedDeductionstd;
	        TotalStandardDeduction = TotalStandardDeductiontd;
	        TaxableIncome = TaxableIncometd;
	        TotalCapGains = TotalCapGainstd;
	        OrdinaryTax = OrdinaryTaxtd;
	        AMT = AMTtd;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditstd;
	        ChildExpensesCredit = ChildExpensesCredittd;
	        RefundableEducationCredits = 0;
	        NonRefundableEducationCredits = 0;
	        NonrefundableCTC = NonrefundableCTCtd;
	        RefundableCTC = RefundableCTCtd;
	    }
	    else {
	        TuitionDeductionAmount = 0;
	        AGI = AGIec;
	        PersonalExemptionsAmount = PersonalExemptionsAmountec;
	        ItemizedDeductions = ItemizedDeductionsec;
	        TotalStandardDeduction = TotalStandardDeductionec;
	        TotalCapGains = TotalCapGainsec;
	        TaxableIncome = TaxableIncomeec;
	        OrdinaryTax = OrdinaryTaxec;
	        AMT = AMTec;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditsec;
	        ChildExpensesCredit = ChildExpensesCreditec;
	        RefundableEducationCredits = refundableEduCredec;
	        NonRefundableEducationCredits = nonrefundableEduCredec;
	        NonrefundableCTC = NonrefundableCTCec;
	        RefundableCTC = RefundableCTCec;
	    }
	    var EICQualifyingChildren = DependentsInCollege + numOfChildren17Under;
	    var EICInvestmentIncome = Dividends + capGains;
	    var EarnedIncomeCredit = EITC("PreBush", filingStatus, EICQualifyingChildren, EarnedIncome, EICInvestmentIncome);
	    if (numOfChildren17Under > 2) {
	        RefundableCTC = ACTCPreBush(EarnedIncomeCredit, filingStatus, numOfChildren17Under, AGI, IncomeTaxBeforeCredits, WagesHead, WagesSpouse, ChildExpensesCredit, NonRefundableEducationCredits);
	    }
	    var TotalIncomeTax = IncomeTaxBeforeCredits - ChildExpensesCredit - RefundableEducationCredits - NonRefundableEducationCredits - NonrefundableCTC - RefundableCTC - EarnedIncomeCredit;
	    var RoundedTax = Math.round(TotalIncomeTax);
	    if (deductionMode == "standard") {
	    	gTaxableSocialSecurityBenefits[0] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[0] = EarnedIncome;
			gPayrollTax[0] = payrollTax;
	    	gExemptions[0] = Exemptions;
	    	gDividends[0] = Dividends;
	    	gcapGains[0] = capGains;
	    	gOtherIncome[0] = OtherIncome;
	    	gGrossIncome[0] = GrossIncome;
	    	gTuitionDeductionAmount[0] = TuitionDeductionAmount;
	    	gAGI[0] = AGI;
	    	gPersonalExemptionsAmount[0] = PersonalExemptionsAmount;
	    	gItemizedDeductions[0] = ItemizedDeductions;
	    	gTotalStandardDeduction[0] = TotalStandardDeduction;
	    	gTaxableIncome[0] = TaxableIncome;
	    	gOrdinaryTax[0] = OrdinaryTax;
	    	gAMT[0] = AMT;
	    	gIncomeTaxBeforeCredits[0] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[0] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[0] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[0] = RefundableEducationCredits;
	    	gNonrefundableCTC[0] = NonrefundableCTC;
	    	gRefundableCTC[0] = RefundableCTC;
	    	gEarnedIncomeCredit[0] = EarnedIncomeCredit;
	    	gTotalIncomeTax[0] = TotalIncomeTax;
	    }
	    if (deductionMode == "itemized") {
	    	gTaxableSocialSecurityBenefits[1] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[1] = EarnedIncome;
			gPayrollTax[1] = payrollTax;
	    	gExemptions[1] = Exemptions;
	    	gDividends[1] = Dividends;
	    	gcapGains[1] = capGains;
	    	gOtherIncome[1] = OtherIncome;
	    	gGrossIncome[1] = GrossIncome;
	    	gTuitionDeductionAmount[1] = TuitionDeductionAmount;
	    	gAGI[1] = AGI;
	    	gPersonalExemptionsAmount[1] = PersonalExemptionsAmount;
	    	gItemizedDeductions[1] = ItemizedDeductions;
	    	gTotalStandardDeduction[1] = TotalStandardDeduction;
	    	gTaxableIncome[1] = TaxableIncome;
	    	gOrdinaryTax[1] = OrdinaryTax;
	    	gAMT[1] = AMT;
	    	gIncomeTaxBeforeCredits[1] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[1] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[1] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[1] = RefundableEducationCredits;
	    	gNonrefundableCTC[1] = NonrefundableCTC;
	    	gRefundableCTC[1] = RefundableCTC;
	    	gEarnedIncomeCredit[1] = EarnedIncomeCredit;
	    	gTotalIncomeTax[1] = TotalIncomeTax;
	    }
	    return TotalIncomeTax;
	};
    var gTaxableSocialSecurityBenefits = new Array(2);
    var gEarnedIncome = new Array(2);
	var gPayrollTax = new Array(2);
    var gExemptions = new Array(2);
    var gDividends = new Array(2);
    var gcapGains = new Array(2);
    var gOtherIncome = new Array(2);
    var gGrossIncome = new Array(2);
    var gTuitionDeductionAmount = new Array(2);
    var gAGI = new Array(2);
    var gPersonalExemptionsAmount = new Array(2);
    var gItemizedDeductions = new Array(2);
    var gTotalStandardDeduction = new Array(2);
    var gTaxableIncome = new Array(2);
    var gOrdinaryTax = new Array(2);
    var gAMT = new Array(2);
    var gIncomeTaxBeforeCredits = new Array(2);
    var gChildExpensesCredit = new Array(2);
    var gNonRefundableEducationCredits = new Array(2);
    var gRefundableEducationCredits = new Array(2);
    var gNonrefundableCTC = new Array(2);
    var gRefundableCTC = new Array(2);
    var gEarnedIncomeCredit = new Array(2);
    var gMakingWorkPayCredit = new Array(2);
    var gTotalIncomeTax = new Array(2);
    var resultStandard = CalculatePreBushForm1040(inputForm, outputForm, "standard");
    var resultItemized = CalculatePreBushForm1040(inputForm, outputForm, "itemized");
    var deductionIndex = 0;
    if (resultItemized < resultStandard) {
    	deductionIndex = 1;
    }
	if (document.getElementById("forceStandard").checked == true) {
		deductionIndex = 0;
	}
	if (document.getElementById("forceItemized").checked == true) {
		deductionIndex = 1;
	}
    WriteCashValue("outputForm", "taxableSSPreBush", gTaxableSocialSecurityBenefits[deductionIndex]);
    WriteCashValue("outputForm", "wagesPreBush", gEarnedIncome[deductionIndex]);
    WriteValue("outputForm", "exemptionsPreBush", gExemptions[deductionIndex]);
    WriteCashValue("outputForm", "dividendsPreBush", gDividends[deductionIndex]);
    WriteCashValue("outputForm", "capGainsPreBush", gcapGains[deductionIndex]);
    WriteCashValue("outputForm", "otherIncomePreBush", gOtherIncome[deductionIndex]);
    WriteCashValue("outputForm", "grossIncomePreBush", gGrossIncome[deductionIndex]);
    WriteCashValue("outputForm", "tuitionDeductionPreBush", gTuitionDeductionAmount[deductionIndex]);
    WriteCashValue("outputForm", "AGIPreBush", gAGI[deductionIndex]);
    WriteCashValue("outputForm", "personalExemptionsPreBush", gPersonalExemptionsAmount[deductionIndex]);
    WriteCashValue("outputForm", "itemizedDeductionsPreBush", gItemizedDeductions[deductionIndex]);
    WriteCashValue("outputForm", "standardDeductionPreBush", gTotalStandardDeduction[deductionIndex]);
    WriteCashValue("outputForm", "taxableIncomePreBush", gTaxableIncome[deductionIndex]);
    WriteCashValue("outputForm", "taxPreBush", gOrdinaryTax[deductionIndex]);
    WriteCashValue("outputForm", "AMTPreBush", gAMT[deductionIndex]);
    WriteCashValue("outputForm", "totalTaxPreBush", gIncomeTaxBeforeCredits[deductionIndex]);
    WriteCashValue("outputForm", "childExpensesPreBush", gChildExpensesCredit[deductionIndex]);
    WriteCashValue("outputForm", "nonRefundableEducationCreditsPreBush", gNonRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "refundableEducationCreditsPreBush", gRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "ctcPreBush", gNonrefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "refCTCPreBush", gRefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "eitcPreBush", gEarnedIncomeCredit[deductionIndex]);
    WriteCashValue("outputForm", "netTaxPreBush", gTotalIncomeTax[deductionIndex]);
	WriteCashValue("outputForm", "payrollTaxPreBush", gPayrollTax[deductionIndex]);
	WriteCashValue("outputForm", "incomePayrollTaxPreBush", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    WriteValueWithCommas("BushCutsExpireResultText", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    return gTotalIncomeTax[deductionIndex];
}

function RepublicanForm1040(inputForm, outputForm) {
	function CalculateRepublicanForm1040(inputForm, outputForm, deductionMode) {
	    var numOfChildren17Under = GetValue(inputForm, "numDependentsUnder17");
	    var numOfChildren17Over = GetValue(inputForm, "numDependents17Plus");
	    var filingStatusIndex = document[inputForm]["filingstatus"]["selectedIndex"];
	    switch (filingStatusIndex) {
	        case 0:
	            filingStatus = "single";
	            break;
	        case 1:
	            filingStatus = "married";
	            break;
	        case 2:
	            filingStatus = "hoh";
	            break;
	    }
	    var numOfSpouses = 0;
	    if (filingStatus == "married") {
	        numOfSpouses = 1;
	    }
	    else {
	        numOfSpouses = 0;
	    }
	    var DependentsInCollege = GetValue(inputForm, "dependentsInCollege");
	    var isHeadInCollegeIndex = document[inputForm]["inCollege"]["selectedIndex"];
	    var numOfStudents = DependentsInCollege + isHeadInCollegeIndex;
	    var TuitionExpenses = GetValue(inputForm, "tuitionExpenses");
	    var Exemptions = numOfChildren17Under + numOfChildren17Over + numOfSpouses + 1;
	    var WagesHead = GetValue(inputForm, "wagesHead");
	    var WagesSpouse = GetValue(inputForm, "wagesSpouse");
		var payrollTaxHead = PayrollTaxes(0.062,WagesHead);
		var payrollTaxSpouse = PayrollTaxes(0.062,WagesSpouse);
		var payrollTax = payrollTaxHead + payrollTaxSpouse;
	    var EarnedIncome = WagesHead + WagesSpouse;
	    var Dividends = GetValue(inputForm, "dividends");
	    var shortTermGain = GetValue(inputForm, "capGainsShort");
	    var longTermGain = GetValue(inputForm, "capGainsLong");
	    var capGains = CapitalGains(shortTermGain, longTermGain);
	    var socialSecurityBenefits = GetValue(inputForm, "ssBenefits");
	    var OtherIncome = GetValue(inputForm, "otherIncome");
	    var TaxableSocialSecurityBenefits = TaxableSocialSecurity(filingStatus, EarnedIncome, socialSecurityBenefits, Dividends, capGains, OtherIncome);
	    var GrossIncome = EarnedIncome + Dividends + capGains + TaxableSocialSecurityBenefits + OtherIncome;
	    var HeadOver65Index = document[inputForm]["head65OrOver"]["selectedIndex"];
	    var IsHeadOver65 = "No";
	    if (HeadOver65Index == 1) {
	        IsHeadOver65 = "Yes";
	    }
	    var SpouseOver65Index = document[inputForm]["spouse65OrOver"]["selectedIndex"];
	    var IsSpouseOver65 = "No";
	    if (SpouseOver65Index == 1) {
	        IsSpouseOver65 = "Yes";
	    }
	    var RealEstateTaxes = GetValue(inputForm, "realEstateTaxes");
	    var LocalTaxes = GetValue(inputForm, "stateIncomeTax");
	    var otherItemizedDeductions = GetValue(inputForm, "otherItemizedDeductions");
	    var ChildCareExpenses = GetValue(inputForm, "childCareExpenses");
	    // Do everything from here to education credits twice to compare tuition benefit to education credits
		var TotalItemizedDeductionstd = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var TuitionDeductionAmounttd = TuitionDeduction(filingStatus, TuitionExpenses, GrossIncome, numOfStudents);
	    var AGItd = GrossIncome - TuitionDeductionAmounttd;
	    var PersonalExemptionsAmounttd = PEP("BushExt", filingStatus, Exemptions, AGItd);
	    var ItemizedDeductionstd = ItemizedDeductionLimitation(filingStatus, "BushExt", AGItd, TotalItemizedDeductionstd);
	    var TotalStandardDeductiontd = StandardDeduction("BushExt", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductiontd = 0;
	    }
	    else {
	        ItemizedDeductionstd = 0;
			TotalItemizedDeductionstd = 0;
	    }
	    var TotalDeductionstd = TotalStandardDeductiontd + ItemizedDeductionstd;
	    var TaxableIncometd = AGItd - PersonalExemptionsAmounttd - TotalStandardDeductiontd - ItemizedDeductionstd;
	    if (TaxableIncometd < 0) {
	        TaxableIncometd = 0;
	    }
	    var OrdinaryTaxtd = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "Tax");
	    var TotalCapGainstd = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "TotalCapGains");
	    var TMTtd = TentativeMinimumTax("Republican", filingStatus, AGItd, TotalItemizedDeductionstd, ItemizedDeductionstd, RealEstateTaxes, LocalTaxes, TotalCapGainstd, TotalDeductionstd, deductionMode, TaxableIncometd);
	    var AMTtd = TMTtd - OrdinaryTaxtd;
	    if (AMTtd < 0) {
	        AMTtd = 0;
	    }
	    var IncomeTaxBeforeCreditstd = OrdinaryTaxtd + AMTtd;
	    var ChildExpensesCredittd = ChildCareCredit("BushExt", filingStatus, AGItd, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditstd);
	    var NonrefundableCTCtd = NonRefundableChildTaxCredit("BushExt", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0);
	    var RefundableCTCtd = RefundableChildTaxCredit("BushExt", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0, EarnedIncome);
	    // Repeat without tuition deduction but with education credits
		var TotalItemizedDeductionsec = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var AGIec = GrossIncome;
	    var PersonalExemptionsAmountec = PEP("BushExt", filingStatus, Exemptions, AGIec);
	    var ItemizedDeductionsec = ItemizedDeductionLimitation(filingStatus, "BushExt", AGIec, TotalItemizedDeductionsec);
	    var TotalStandardDeductionec = StandardDeduction("BushExt", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    if (deductionMode == "itemized") {
	        TotalStandardDeductionec = 0;
	    }
	    else {
	        ItemizedDeductionsec = 0;
			TotalItemizedDeductionsec = 0;
	    }
	    var TotalDeductionsec = TotalStandardDeductionec + ItemizedDeductionsec;
	    var TaxableIncomeec = AGIec - PersonalExemptionsAmountec - TotalStandardDeductionec - ItemizedDeductionsec;
	    if (TaxableIncomeec < 0) {
	        TaxableIncomeec = 0;
	    }
	    var OrdinaryTaxec = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "Tax");
	    var TotalCapGainsec = TaxOnCapitalGains("BushExt", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "TotalCapGains");
		var TMTec = TentativeMinimumTax("Republican", filingStatus, AGIec, TotalItemizedDeductionsec, ItemizedDeductionsec, RealEstateTaxes, LocalTaxes, TotalCapGainsec, TotalDeductionsec, deductionMode, TaxableIncomeec);
	    
		var AMTec = TMTec - OrdinaryTaxec;
	    if (AMTec < 0) {
	        AMTec = 0;
	    }
	    var IncomeTaxBeforeCreditsec = OrdinaryTaxec + AMTec;
	    var ChildExpensesCreditec = ChildCareCredit("BushExt", filingStatus, AGIec, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditsec);
	    var eduCreditType = EducationCreditsComparison("BushExt", filingStatus, TuitionExpenses, numOfStudents, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	    var refundableEduCredec = 0;
	    var nonrefundableEduCredec = 0;
	    switch (eduCreditType) {
	        case "AOC":
	            var tenAOC = TentativeAOC(TuitionExpenses, numOfStudents);
	            refundableEduCredec = RefundableAOC(filingStatus, AGIec, tenAOC);
	            nonrefundableEduCredec = NonRefundableAOC(filingStatus, AGIec, tenAOC, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	            break;
	        case "otherCredits":
	            var tenHope = TentativeHope("BushExt", TuitionExpenses, numOfStudents);
	            var tenll = TentativeLifelongLearning("BushExt", TuitionExpenses, numOfStudents);
	            nonrefundableEduCredec = NonRefundableEduCredits("BushExt", filingStatus, AGIec, tenHope, tenll, ChildExpensesCreditec, IncomeTaxBeforeCreditsec);
	            break;
	    }
	    var NonrefundableCTCec = NonRefundableChildTaxCredit("BushExt", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec);
	    var RefundableCTCec = RefundableChildTaxCredit("BushExt", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec, EarnedIncome);
	    // Compare the two cases (tuition deduction vs. education credits)
	    var TuitionDeductionAmount;
	    var TaxBurdenTuitionDeduction;
	    var TaxBurdenEducationCredits;
	    var AGI;
	    var PersonalExemptionsAmount;
	    var ItemizedDeductions;
	    var TotalStandardDeduction;
	    var TaxableIncome;
	    var OrdinaryTax;
	    var AMT;
	    var IncomeTaxBeforeCredits;
	    var ChildExpensesCredit;
	    var RefundableEducationCredits;
	    var NonRefundableEducationCredits;
	    var NonrefundableCTC;
	    var RefundableCTC;
	    var TotalCapGains;
	    TaxBurdenTuitionDeduction = IncomeTaxBeforeCreditstd - ChildExpensesCredittd - NonrefundableCTCtd - RefundableCTCtd;
	    TaxBurdenEducationCredits = IncomeTaxBeforeCreditsec - ChildExpensesCreditec - refundableEduCredec - nonrefundableEduCredec - NonrefundableCTCec - RefundableCTCec;
	    if (TaxBurdenTuitionDeduction <= TaxBurdenEducationCredits) {
	        TuitionDeductionAmount = TuitionDeductionAmounttd;
	        AGI = AGItd;
	        PersonalExemptionsAmount = PersonalExemptionsAmounttd;
	        ItemizedDeductions = ItemizedDeductionstd;
	        TotalStandardDeduction = TotalStandardDeductiontd;
	        TaxableIncome = TaxableIncometd;
	        TotalCapGains = TotalCapGainstd;
	        OrdinaryTax = OrdinaryTaxtd;
	        AMT = AMTtd;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditstd;
	        ChildExpensesCredit = ChildExpensesCredittd;
	        RefundableEducationCredits = 0;
	        NonRefundableEducationCredits = 0;
	        NonrefundableCTC = NonrefundableCTCtd;
	        RefundableCTC = RefundableCTCtd;
	    }
	    else {
	        TuitionDeductionAmount = 0;
	        AGI = AGIec;
	        PersonalExemptionsAmount = PersonalExemptionsAmountec;
	        ItemizedDeductions = ItemizedDeductionsec;
	        TotalStandardDeduction = TotalStandardDeductionec;
	        TotalCapGains = TotalCapGainsec;
	        TaxableIncome = TaxableIncomeec;
	        OrdinaryTax = OrdinaryTaxec;
	        AMT = AMTec;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditsec;
	        ChildExpensesCredit = ChildExpensesCreditec;
	        RefundableEducationCredits = refundableEduCredec;
	        NonRefundableEducationCredits = nonrefundableEduCredec;
	        NonrefundableCTC = NonrefundableCTCec;
	        RefundableCTC = RefundableCTCec;
	    }
	    var EICQualifyingChildren = DependentsInCollege + numOfChildren17Under;
	    var EICInvestmentIncome = Dividends + capGains;
	    var EarnedIncomeCredit = EITC("BushExt", filingStatus, EICQualifyingChildren, EarnedIncome, EICInvestmentIncome);
	    var TotalIncomeTax = IncomeTaxBeforeCredits - ChildExpensesCredit - RefundableEducationCredits - NonRefundableEducationCredits - NonrefundableCTC - RefundableCTC - EarnedIncomeCredit;
	    var RoundedTax = Math.round(TotalIncomeTax);
	    if (deductionMode == "standard") {
	    	gTaxableSocialSecurityBenefits[0] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[0] = EarnedIncome;
			gPayrollTax[0] = payrollTax;
	    	gExemptions[0] = Exemptions;
	    	gDividends[0] = Dividends;
	    	gcapGains[0] = capGains;
	    	gOtherIncome[0] = OtherIncome;
	    	gGrossIncome[0] = GrossIncome;
	    	gTuitionDeductionAmount[0] = TuitionDeductionAmount;
	    	gAGI[0] = AGI;
	    	gPersonalExemptionsAmount[0] = PersonalExemptionsAmount;
	    	gItemizedDeductions[0] = ItemizedDeductions;
	    	gTotalStandardDeduction[0] = TotalStandardDeduction;
	    	gTaxableIncome[0] = TaxableIncome;
	    	gOrdinaryTax[0] = OrdinaryTax;
	    	gAMT[0] = AMT;
	    	gIncomeTaxBeforeCredits[0] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[0] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[0] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[0] = RefundableEducationCredits;
	    	gNonrefundableCTC[0] = NonrefundableCTC;
	    	gRefundableCTC[0] = RefundableCTC;
	    	gEarnedIncomeCredit[0] = EarnedIncomeCredit;
	    	gTotalIncomeTax[0] = TotalIncomeTax;
	    }
	    if (deductionMode == "itemized") {
	    	gTaxableSocialSecurityBenefits[1] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[1] = EarnedIncome;
			gPayrollTax[1] = payrollTax;
	    	gExemptions[1] = Exemptions;
	    	gDividends[1] = Dividends;
	    	gcapGains[1] = capGains;
	    	gOtherIncome[1] = OtherIncome;
	    	gGrossIncome[1] = GrossIncome;
	    	gTuitionDeductionAmount[1] = TuitionDeductionAmount;
	    	gAGI[1] = AGI;
	    	gPersonalExemptionsAmount[1] = PersonalExemptionsAmount;
	    	gItemizedDeductions[1] = ItemizedDeductions;
	    	gTotalStandardDeduction[1] = TotalStandardDeduction;
	    	gTaxableIncome[1] = TaxableIncome;
	    	gOrdinaryTax[1] = OrdinaryTax;
	    	gAMT[1] = AMT;
	    	gIncomeTaxBeforeCredits[1] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[1] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[1] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[1] = RefundableEducationCredits;
	    	gNonrefundableCTC[1] = NonrefundableCTC;
	    	gRefundableCTC[1] = RefundableCTC;
	    	gEarnedIncomeCredit[1] = EarnedIncomeCredit;
	    	gTotalIncomeTax[1] = TotalIncomeTax;
	    }
	    return TotalIncomeTax;
	};
    var gTaxableSocialSecurityBenefits = new Array(2);
    var gEarnedIncome = new Array(2);
	var gPayrollTax = new Array(2);
    var gExemptions = new Array(2);
    var gDividends = new Array(2);
    var gcapGains = new Array(2);
    var gOtherIncome = new Array(2);
    var gGrossIncome = new Array(2);
    var gTuitionDeductionAmount = new Array(2);
    var gAGI = new Array(2);
    var gPersonalExemptionsAmount = new Array(2);
    var gItemizedDeductions = new Array(2);
    var gTotalStandardDeduction = new Array(2);
    var gTaxableIncome = new Array(2);
    var gOrdinaryTax = new Array(2);
    var gAMT = new Array(2);
    var gIncomeTaxBeforeCredits = new Array(2);
    var gChildExpensesCredit = new Array(2);
    var gNonRefundableEducationCredits = new Array(2);
    var gRefundableEducationCredits = new Array(2);
    var gNonrefundableCTC = new Array(2);
    var gRefundableCTC = new Array(2);
    var gEarnedIncomeCredit = new Array(2);
    var gMakingWorkPayCredit = new Array(2);
    var gTotalIncomeTax = new Array(2);
    var resultStandard = CalculateRepublicanForm1040(inputForm, outputForm, "standard");
    var resultItemized = CalculateRepublicanForm1040(inputForm, outputForm, "itemized");
    var deductionIndex = 0;
    if (resultItemized < resultStandard) {
    	deductionIndex = 1;
    }
	if (document.getElementById("forceStandard").checked == true) {
		deductionIndex = 0;
	}
	if (document.getElementById("forceItemized").checked == true) {
		deductionIndex = 1;
	}
    WriteCashValue("outputForm", "taxableSSRepublican", gTaxableSocialSecurityBenefits[deductionIndex]);
    WriteCashValue("outputForm", "wagesRepublican", gEarnedIncome[deductionIndex]);
    WriteValue("outputForm", "exemptionsRepublican", gExemptions[deductionIndex]);
    WriteCashValue("outputForm", "dividendsRepublican", gDividends[deductionIndex]);
    WriteCashValue("outputForm", "capGainsRepublican", gcapGains[deductionIndex]);
    WriteCashValue("outputForm", "otherIncomeRepublican", gOtherIncome[deductionIndex]);
    WriteCashValue("outputForm", "grossIncomeRepublican", gGrossIncome[deductionIndex]);
    WriteCashValue("outputForm", "tuitionDeductionRepublican", gTuitionDeductionAmount[deductionIndex]);
    WriteCashValue("outputForm", "AGIRepublican", gAGI[deductionIndex]);
    WriteCashValue("outputForm", "personalExemptionsRepublican", gPersonalExemptionsAmount[deductionIndex]);
    WriteCashValue("outputForm", "itemizedDeductionsRepublican", gItemizedDeductions[deductionIndex]);
    WriteCashValue("outputForm", "standardDeductionRepublican", gTotalStandardDeduction[deductionIndex]);
    WriteCashValue("outputForm", "taxableIncomeRepublican", gTaxableIncome[deductionIndex]);
    WriteCashValue("outputForm", "taxRepublican", gOrdinaryTax[deductionIndex]);
    WriteCashValue("outputForm", "AMTRepublican", gAMT[deductionIndex]);
    WriteCashValue("outputForm", "totalTaxRepublican", gIncomeTaxBeforeCredits[deductionIndex]);
    WriteCashValue("outputForm", "childExpensesRepublican", gChildExpensesCredit[deductionIndex]);
    WriteCashValue("outputForm", "nonRefundableEducationCreditsRepublican", gNonRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "refundableEducationCreditsRepublican", gRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "ctcRepublican", gNonrefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "refCTCRepublican", gRefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "eitcRepublican", gEarnedIncomeCredit[deductionIndex]);
    WriteCashValue("outputForm", "netTaxRepublican", gTotalIncomeTax[deductionIndex]);
	WriteCashValue("outputForm", "payrollTaxRepublican", gPayrollTax[deductionIndex]);
	WriteCashValue("outputForm", "incomePayrollTaxRepublican", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    WriteValueWithCommas("RepublicanResultText", gPayrollTax[deductionIndex]+gTotalIncomeTax[deductionIndex]);
    return gTotalIncomeTax[deductionIndex];
}

function DemocratsForm1040(inputForm, outputForm) {
	function CalculateDemocratsForm1040(inputForm, outputForm, deductionMode) {
	    var numOfChildren17Under = GetValue(inputForm, "numDependentsUnder17");
	    var numOfChildren17Over = GetValue(inputForm, "numDependents17Plus");
	    var filingStatusIndex = document[inputForm]["filingstatus"]["selectedIndex"];
	    switch (filingStatusIndex) {
	        case 0:
	            filingStatus = "single";
	            break;
	        case 1:
	            filingStatus = "married";
	            break;
	        case 2:
	            filingStatus = "hoh";
	            break;
	    }
	    var numOfSpouses = 0;
	    if (filingStatus == "married") {
	        numOfSpouses = 1
	    }
	    else {
	        numOfSpouses = 0
	    };
	    var DependentsInCollege = GetValue(inputForm, "dependentsInCollege");
	    var isHeadInCollegeIndex = document[inputForm]["inCollege"]["selectedIndex"];
	    var numOfStudents = DependentsInCollege + isHeadInCollegeIndex;
	    var TuitionExpenses = GetValue(inputForm, "tuitionExpenses");
	    var Exemptions = numOfChildren17Under + numOfChildren17Over + numOfSpouses + 1;
	    var WagesHead = GetValue(inputForm, "wagesHead");
	    var WagesSpouse = GetValue(inputForm, "wagesSpouse");
		var payrollTaxHead = PayrollTaxes(0.062,WagesHead);
		var payrollTaxSpouse = PayrollTaxes(0.062,WagesSpouse);
		var payrollTax = payrollTaxHead + payrollTaxSpouse;
	    var EarnedIncome = WagesHead + WagesSpouse;
	    var Dividends = GetValue(inputForm, "dividends");
	    var shortTermGain = GetValue(inputForm, "capGainsShort");
	    var longTermGain = GetValue(inputForm, "capGainsLong");
	    var capGains = CapitalGains(shortTermGain, longTermGain);
	    var socialSecurityBenefits = GetValue(inputForm, "ssBenefits");
	    var OtherIncome = GetValue(inputForm, "otherIncome");
	    var TaxableSocialSecurityBenefits = TaxableSocialSecurity(filingStatus, EarnedIncome, socialSecurityBenefits, Dividends, capGains, OtherIncome);
	    var GrossIncome = EarnedIncome + Dividends + capGains + TaxableSocialSecurityBenefits + OtherIncome;
	    var HeadOver65Index = document[inputForm]["head65OrOver"]["selectedIndex"];
	    var IsHeadOver65 = "No";
	    if (HeadOver65Index == 1) {
	        IsHeadOver65 = "Yes";
	    }
	    var SpouseOver65Index = document[inputForm]["spouse65OrOver"]["selectedIndex"];
	    var IsSpouseOver65 = "No";
	    if (SpouseOver65Index == 1) {
	        IsSpouseOver65 = "Yes";
	    }
	    var RealEstateTaxes = GetValue(inputForm, "realEstateTaxes");
	    var LocalTaxes = GetValue(inputForm, "stateIncomeTax");
	    var otherItemizedDeductions = GetValue(inputForm, "otherItemizedDeductions");
	    
	    var AMTPreferenceDeductions = RealEstateTaxes + LocalTaxes;
	    var ChildCareExpenses = GetValue(inputForm, "childCareExpenses");
	    // Do everything from here to education credits twice to compare tuition benefit to education credits
		var TotalItemizedDeductionstd = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var TuitionDeductionAmounttd = TuitionDeduction(filingStatus, TuitionExpenses, GrossIncome, numOfStudents);
	    var AGItd = GrossIncome - TuitionDeductionAmounttd;
	    var PersonalExemptionsAmounttd = PEP("Democrats", filingStatus, Exemptions, AGItd);
	    var ItemizedDeductionstd = ItemizedDeductionLimitation(filingStatus, "Democrats", AGItd, TotalItemizedDeductionstd);
	    var TotalStandardDeductiontd = StandardDeduction("Democrats", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    var useItemizedtd = false;
	    if (deductionMode == "itemized") {
	        useItemizedtd = true;
	        TotalStandardDeductiontd = 0;
	    }
	    else {
	        ItemizedDeductionstd = 0;
			TotalItemizedDeductionstd = 0;
	    }
	    var TotalDeductionstd = TotalStandardDeductiontd + ItemizedDeductionstd;
	    var TaxableIncometd = AGItd - PersonalExemptionsAmounttd - TotalStandardDeductiontd - ItemizedDeductionstd;
	    if (TaxableIncometd < 0) {
	        TaxableIncometd = 0
	    };
	    var boolmultipliertd = 0;
	    if (useItemizedtd == true) {
	        boolmultipliertd = 1;
	    }
	    var OrdinaryTaxtd = TaxOnCapitalGains("Democrats", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "Tax");
	    var TotalCapGainstd = TaxOnCapitalGains("Democrats", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncometd, Dividends, "TotalCapGains");
	    var AGIecMinusExemptionstd = AGItd - PersonalExemptionsAmounttd;
	    if (AGIecMinusExemptionstd < 0) {
	        AGIecMinusExemptionstd = 0;
	    }
	    var deductionsBelowZerotd = AGIecMinusExemptionstd - TotalStandardDeductiontd - TotalDeductionstd;
	    if (deductionsBelowZerotd < 0) {
	        deductionsBelowZerotd = 0 - deductionsBelowZerotd;
	    }
	    else {
	        deductionsBelowZerotd = 0;
	    }
	    var TMTtd = TentativeMinimumTax("Democrats", filingStatus, AGItd, TotalItemizedDeductionstd, ItemizedDeductionstd, RealEstateTaxes, LocalTaxes, TotalCapGainstd, TotalDeductionstd, deductionMode, TaxableIncometd);
	    var AMTItd = AGItd - TotalDeductionstd + AMTPreferenceDeductions + ItemizedDeductionstd - TotalItemizedDeductionstd;
	    var AMTtd = TMTtd - OrdinaryTaxtd;
	    if (AMTtd < 0) {
	        AMTtd = 0;
	    }
	    var IncomeTaxBeforeCreditstd = OrdinaryTaxtd + AMTtd;
	    var ChildExpensesCredittd = ChildCareCredit("Democrats", filingStatus, AGItd, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditstd);
	    var NonrefundableCTCtd = NonRefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0);
	    var RefundableCTCtd = RefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGItd, IncomeTaxBeforeCreditstd, ChildExpensesCredittd, 0, EarnedIncome);
		// Repeat without tuition deduction but with education credits
		var TotalItemizedDeductionsec = otherItemizedDeductions + RealEstateTaxes + LocalTaxes;
	    var AGIec = GrossIncome;
	    var PersonalExemptionsAmountec = PEP("Democrats", filingStatus, Exemptions, AGIec);
	    var ItemizedDeductionsec = ItemizedDeductionLimitation(filingStatus, "Democrats", AGIec, TotalItemizedDeductionsec);
	    var TotalStandardDeductionec = StandardDeduction("Democrats", filingStatus, IsHeadOver65, IsSpouseOver65, RealEstateTaxes);
	    var useItemizedec = false;
	    if (deductionMode == "itemized") {
	        TotalStandardDeductionec = 0;
	        useItemizedec = true;
	    }
	    else {
	        ItemizedDeductionsec = 0;
			TotalItemizedDeductionsec = 0;
	    }
		
	    var TotalDeductionsec = TotalStandardDeductionec + ItemizedDeductionsec;
	    var TaxableIncomeec = AGIec - PersonalExemptionsAmountec - TotalStandardDeductionec - ItemizedDeductionsec;
	    if (TaxableIncomeec < 0) {
	        TaxableIncomeec = 0;
	    }
	    var boolmultiplierec = 0;
	    if (useItemizedec == true) {
	        boolmultiplierec = 1;
	    }
	    var OrdinaryTaxec = TaxOnCapitalGains("Democrats", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "Tax");
	    var TotalCapGainsec = TaxOnCapitalGains("Democrats", filingStatus, shortTermGain, longTermGain, capGains, TaxableIncomeec, Dividends, "TotalCapGains");
	    var AGIecMinusExemptionsec = AGIec - PersonalExemptionsAmountec;
	    if (AGIecMinusExemptionsec < 0) {
	        AGIecMinusExemptionsec = 0;
	    }
	    var deductionsBelowZeroec = AGIecMinusExemptionsec - TotalStandardDeductionec - TotalDeductionsec;
	    if (deductionsBelowZeroec < 0) {
	        deductionsBelowZeroec = 0 - deductionsBelowZeroec;
	    }
	    else {
	        deductionsBelowZeroec = 0;
	    }
	    var TMTec = TentativeMinimumTax("Democrats", filingStatus, AGIec, TotalItemizedDeductionsec, ItemizedDeductionsec, RealEstateTaxes, LocalTaxes, TotalCapGainsec, TotalDeductionsec, deductionMode, TaxableIncomeec);
	    var AMTIec = AGIec - TotalDeductionsec + AMTPreferenceDeductions + ItemizedDeductionsec - TotalItemizedDeductionsec;
	    var AMTec = TMTec - OrdinaryTaxec;
	    if (AMTec < 0) {
	        AMTec = 0;
	    }
	    var IncomeTaxBeforeCreditsec = OrdinaryTaxec + AMTec;
	    var ChildExpensesCreditec = ChildCareCredit("Democrats", filingStatus, AGIec, WagesHead, WagesSpouse, ChildCareExpenses, numOfChildren17Under, IncomeTaxBeforeCreditsec);
	    var eduCreditType = EducationCreditsComparison("Democrats", filingStatus, TuitionExpenses, numOfStudents, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	    var refundableEduCredec = 0;
	    var nonrefundableEduCredec = 0;
	    switch (eduCreditType) {
	        case "AOC":
	            var tenAOC = TentativeAOC(TuitionExpenses, numOfStudents);
	            refundableEduCredec = RefundableAOC(filingStatus, AGIec, tenAOC);
	            nonrefundableEduCredec = NonRefundableAOC(filingStatus, AGIec, tenAOC, IncomeTaxBeforeCreditsec, ChildExpensesCreditec);
	            break;
	        case "otherCredits":
	            var tenHope = TentativeHope("Democrats", TuitionExpenses, numOfStudents);
	            var tenll = TentativeLifelongLearning("Democrats", TuitionExpenses, numOfStudents);
	            nonrefundableEduCredec = NonRefundableEduCredits("Democrats", filingStatus, AGIec, tenHope, tenll, ChildExpensesCreditec, IncomeTaxBeforeCreditsec);
	            break;
	    }
	    var NonrefundableCTCec = NonRefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec);
	    var RefundableCTCec = RefundableChildTaxCredit("Democrats", filingStatus, numOfChildren17Under, AGIec, IncomeTaxBeforeCreditsec, ChildExpensesCreditec, nonrefundableEduCredec, EarnedIncome);
	    // Compare the two cases (tuition deduction vs. education credits)
	    var TuitionDeductionAmount;
	    var TaxBurdenTuitionDeduction;
	    var TaxBurdenEducationCredits;
	    var AGI;
	    var PersonalExemptionsAmount;
	    var ItemizedDeductions;
	    var TotalStandardDeduction;
	    var TaxableIncome;
	    var OrdinaryTax;
	    var AMT;
	    var IncomeTaxBeforeCredits;
	    var ChildExpensesCredit;
	    var RefundableEducationCredits;
	    var NonRefundableEducationCredits;
	    var NonrefundableCTC;
	    var RefundableCTC;
	    var TotalCapGains;
	    var useItemized;
	    TaxBurdenTuitionDeduction = IncomeTaxBeforeCreditstd - ChildExpensesCredittd - NonrefundableCTCtd - RefundableCTCtd;
	    TaxBurdenEducationCredits = IncomeTaxBeforeCreditsec - ChildExpensesCreditec - refundableEduCredec - nonrefundableEduCredec - NonrefundableCTCec - RefundableCTCec;
	    if (TaxBurdenTuitionDeduction <= TaxBurdenEducationCredits) {
	        TuitionDeductionAmount = TuitionDeductionAmounttd;
	        AGI = AGItd;
	        PersonalExemptionsAmount = PersonalExemptionsAmounttd;
	        ItemizedDeductions = ItemizedDeductionstd;
	        TotalStandardDeduction = TotalStandardDeductiontd;
	        TaxableIncome = TaxableIncometd;
	        TotalCapGains = TotalCapGainstd;
	        OrdinaryTax = OrdinaryTaxtd;
	        AMT = AMTtd;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditstd;
	        ChildExpensesCredit = ChildExpensesCredittd;
	        RefundableEducationCredits = 0;
	        NonRefundableEducationCredits = 0;
	        NonrefundableCTC = NonrefundableCTCtd;
	        RefundableCTC = RefundableCTCtd;
	        useItemized = useItemizedtd;
	    }
	    else {
	        TuitionDeductionAmount = 0;
	        AGI = AGIec;
	        PersonalExemptionsAmount = PersonalExemptionsAmountec;
	        ItemizedDeductions = ItemizedDeductionsec;
	        TotalStandardDeduction = TotalStandardDeductionec;
	        TotalCapGains = TotalCapGainsec;
	        TaxableIncome = TaxableIncomeec;
	        OrdinaryTax = OrdinaryTaxec;
	        AMT = AMTec;
	        IncomeTaxBeforeCredits = IncomeTaxBeforeCreditsec;
	        ChildExpensesCredit = ChildExpensesCreditec;
	        RefundableEducationCredits = refundableEduCredec;
	        NonRefundableEducationCredits = nonrefundableEduCredec;
	        NonrefundableCTC = NonrefundableCTCec;
	        RefundableCTC = RefundableCTCec;
	        useItemized = useItemizedec;
	    }
	    var EICQualifyingChildren = DependentsInCollege + numOfChildren17Under;
	    var EICInvestmentIncome = Dividends + capGains;
	    var EarnedIncomeCredit = EITC("Democrats", filingStatus, EICQualifyingChildren, EarnedIncome, EICInvestmentIncome);
	    var MakingWorkPayCredit = 0;
	    var TotalIncomeTax = IncomeTaxBeforeCredits - ChildExpensesCredit - RefundableEducationCredits - NonRefundableEducationCredits - NonrefundableCTC - RefundableCTC - EarnedIncomeCredit - MakingWorkPayCredit;
	    var RoundedTax = Math.round(TotalIncomeTax);
	    if (deductionMode == "standard") {
	    	gTaxableSocialSecurityBenefits[0] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[0] = EarnedIncome;
			gPayrollTax[0] = payrollTax;
	    	gExemptions[0] = Exemptions;
	    	gDividends[0] = Dividends;
	    	gcapGains[0] = capGains;
	    	gOtherIncome[0] = OtherIncome;
	    	gGrossIncome[0] = GrossIncome;
	    	gTuitionDeductionAmount[0] = TuitionDeductionAmount;
	    	gAGI[0] = AGI;
	    	gPersonalExemptionsAmount[0] = PersonalExemptionsAmount;
	    	gItemizedDeductions[0] = ItemizedDeductions;
	    	gTotalStandardDeduction[0] = TotalStandardDeduction;
	    	gTaxableIncome[0] = TaxableIncome;
	    	gOrdinaryTax[0] = OrdinaryTax;
	    	gAMT[0] = AMT;
	    	gIncomeTaxBeforeCredits[0] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[0] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[0] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[0] = RefundableEducationCredits;
	    	gNonrefundableCTC[0] = NonrefundableCTC;
	    	gRefundableCTC[0] = RefundableCTC;
	    	gEarnedIncomeCredit[0] = EarnedIncomeCredit;
	    	gMakingWorkPayCredit[0] = MakingWorkPayCredit;
	    	gTotalIncomeTax[0] = TotalIncomeTax;
	    }
	    if (deductionMode == "itemized") {
	    	gTaxableSocialSecurityBenefits[1] = TaxableSocialSecurityBenefits;
	    	gEarnedIncome[1] = EarnedIncome;
			gPayrollTax[1] = payrollTax;
	    	gExemptions[1] = Exemptions;
	    	gDividends[1] = Dividends;
	    	gcapGains[1] = capGains;
	    	gOtherIncome[1] = OtherIncome;
	    	gGrossIncome[1] = GrossIncome;
	    	gTuitionDeductionAmount[1] = TuitionDeductionAmount;
	    	gAGI[1] = AGI;
	    	gPersonalExemptionsAmount[1] = PersonalExemptionsAmount;
	    	gItemizedDeductions[1] = ItemizedDeductions;
	    	gTotalStandardDeduction[1] = TotalStandardDeduction;
	    	gTaxableIncome[1] = TaxableIncome;
	    	gOrdinaryTax[1] = OrdinaryTax;
	    	gAMT[1] = AMT;
	    	gIncomeTaxBeforeCredits[1] = IncomeTaxBeforeCredits;
	    	gChildExpensesCredit[1] = ChildExpensesCredit;
	    	gNonRefundableEducationCredits[1] = NonRefundableEducationCredits;
	    	gRefundableEducationCredits[1] = RefundableEducationCredits;
	    	gNonrefundableCTC[1] = NonrefundableCTC;
	    	gRefundableCTC[1] = RefundableCTC;
	    	gEarnedIncomeCredit[1] = EarnedIncomeCredit;
	    	gMakingWorkPayCredit[1] = MakingWorkPayCredit;
	    	gTotalIncomeTax[1] = TotalIncomeTax;
	    }
	    return TotalIncomeTax;
	};
    var gTaxableSocialSecurityBenefits = new Array(2);
    var gEarnedIncome = new Array(2);
	var gPayrollTax = new Array(2);
    var gExemptions = new Array(2);
    var gDividends = new Array(2);
    var gcapGains = new Array(2);
    var gOtherIncome = new Array(2);
    var gGrossIncome = new Array(2);
    var gTuitionDeductionAmount = new Array(2);
    var gAGI = new Array(2);
    var gPersonalExemptionsAmount = new Array(2);
    var gItemizedDeductions = new Array(2);
    var gTotalStandardDeduction = new Array(2);
    var gTaxableIncome = new Array(2);
    var gOrdinaryTax = new Array(2);
    var gAMT = new Array(2);
    var gIncomeTaxBeforeCredits = new Array(2);
    var gChildExpensesCredit = new Array(2);
    var gNonRefundableEducationCredits = new Array(2);
    var gRefundableEducationCredits = new Array(2);
    var gNonrefundableCTC = new Array(2);
    var gRefundableCTC = new Array(2);
    var gEarnedIncomeCredit = new Array(2);
    var gMakingWorkPayCredit = new Array(2);
    var gTotalIncomeTax = new Array(2);
    var resultStandard = CalculateDemocratsForm1040(inputForm, outputForm, "standard");
    var resultItemized = CalculateDemocratsForm1040(inputForm, outputForm, "itemized");
    var deductionIndex = 0;
    if (resultItemized < resultStandard) {
    	deductionIndex = 1;
    }
	if (document.getElementById("forceStandard").checked == true) {
		deductionIndex = 0;
	}
	if (document.getElementById("forceItemized").checked == true) {
		deductionIndex = 1;
	}
    WriteCashValue("outputForm", "taxableSSDemocrats", gTaxableSocialSecurityBenefits[deductionIndex]);
    WriteCashValue("outputForm", "wagesDemocrats", gEarnedIncome[deductionIndex]);
    WriteValue("outputForm", "exemptionsDemocrats", gExemptions[deductionIndex]);
    WriteCashValue("outputForm", "dividendsDemocrats", gDividends[deductionIndex]);
    WriteCashValue("outputForm", "capGainsDemocrats", gcapGains[deductionIndex]);
    WriteCashValue("outputForm", "otherIncomeDemocrats", gOtherIncome[deductionIndex]);
    WriteCashValue("outputForm", "grossIncomeDemocrats", gGrossIncome[deductionIndex]);
    WriteCashValue("outputForm", "tuitionDeductionDemocrats", gTuitionDeductionAmount[deductionIndex]);
    WriteCashValue("outputForm", "AGIDemocrats", gAGI[deductionIndex]);
    WriteCashValue("outputForm", "personalExemptionsDemocrats", gPersonalExemptionsAmount[deductionIndex]);
    WriteCashValue("outputForm", "itemizedDeductionsDemocrats", gItemizedDeductions[deductionIndex]);
    WriteCashValue("outputForm", "standardDeductionDemocrats", gTotalStandardDeduction[deductionIndex]);
    WriteCashValue("outputForm", "taxableIncomeDemocrats", gTaxableIncome[deductionIndex]);
    WriteCashValue("outputForm", "taxDemocrats", gOrdinaryTax[deductionIndex]);
    WriteCashValue("outputForm", "AMTDemocrats", gAMT[deductionIndex]);
    WriteCashValue("outputForm", "totalTaxDemocrats", gIncomeTaxBeforeCredits[deductionIndex]);
    WriteCashValue("outputForm", "childExpensesDemocrats", gChildExpensesCredit[deductionIndex]);
    WriteCashValue("outputForm", "nonRefundableEducationCreditsDemocrats", gNonRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "refundableEducationCreditsDemocrats", gRefundableEducationCredits[deductionIndex]);
    WriteCashValue("outputForm", "ctcDemocrats", gNonrefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "refCTCDemocrats", gRefundableCTC[deductionIndex]);
    WriteCashValue("outputForm", "eitcDemocrats", gEarnedIncomeCredit[deductionIndex]);
    WriteCashValue("outputForm", "netTaxDemocrats", gTotalIncomeTax[deductionIndex]);
	var totalTax = gPayrollTax[deductionIndex] + gTotalIncomeTax[deductionIndex];
	WriteCashValue("outputForm", "payrollTaxDemocrats", gPayrollTax[deductionIndex]);
	WriteCashValue("outputForm", "incomePayrollTaxDemocrats", totalTax);
    WriteValueWithCommas("DemocratsResultText", totalTax);
    return gTotalIncomeTax[deductionIndex];
}

//This function compares the benefits of the various education credits and selects 
//the best option.
function EducationCreditsComparison(scenario, filingStatus, tuitionExpenses, numOfStudents, agi, totalTax, childexpensescred) {
    var tenAOC = TentativeAOC(tuitionExpenses, numOfStudents);
    var AOC = RefundableAOC(filingStatus, agi, tenAOC) + NonRefundableAOC(filingStatus, agi, tenAOC, totalTax, childexpensescred);
    if (scenario != "Obama") {
        AOC = 0;
    }
    var tenHope = TentativeHope(scenario, tuitionExpenses, numOfStudents);
    var tenLL = TentativeLifelongLearning(scenario, tuitionExpenses, numOfStudents);
    var otherCredits = NonRefundableEduCredits(scenario, filingStatus, agi, tenHope, tenLL, childexpensescred, totalTax);
    if (AOC > otherCredits) {
        return "AOC";
    }
    else {
        return "otherCredits";
    }
};
//This function calculates the total American Opportunity education credit.
function TotalAOC(filingStatus, agi, tentativeAOC) {
    var refAOCIncomeCap = refAOCIncomeCapSingle;
    var refAOCIncomeLim = refAOCIncomeLimSingle;
    if (filingStatus == "married") {
        refAOCIncomeCap = refAOCIncomeCapMarried;
        refAOCIncomeLim = refAOCIncomeLimMarried;
    }
    var line12 = refAOCIncomeCap - agi;
    if (line12 < 0) {
        line12 = 0;
    }
    var line14 = line12 / refAOCIncomeLim;
    if (line14 > 1) {
        line14 = 1;
    }
    var line15 = tentativeAOC * line14;
    return line15;
};
//This function calculates the refundable portion of the AOC.
function RefundableAOC(filingStatus, agi, tentativeAOC) {
    var totalAOC = TotalAOC(filingStatus, agi, tentativeAOC);
    return 0.4 * totalAOC;
};
//This function calculates the non-refundable portion of the AOC.
function NonRefundableAOC(filingStatus, agi, tentativeAOC, totaltax, childexpenses) {
    var totalAOC = TotalAOC(filingStatus, agi, tentativeAOC);
    var line17 = 0.6 * totalAOC;
    var line26 = totaltax;
    var line27 = childexpenses;
    var line28 = line26 - line27;
    if (line28 < 0) {
        line28 = 0;
    }
    return SmallerOfTwo(line17, line28);
};
//This function calculates the non-refundable portion of the other education credits.
function NonRefundableEduCredits(scenario, filingStatus, agi, tentativehope, tentativell, childexpenses, totalTax) {
    var line18 = GreaterOfTwo(tentativehope, tentativell);
    var nonRefEduCredIncomeCap = nonRefEduCredIncomeCapSingle;
    var nonRefEduCredIncomeLim = nonRefEduCredIncomeLimSingle;
    if (filingStatus == "married") {
        nonRefEduCredIncomeCap = nonRefEduCredIncomeCapMarried;
        nonRefEduCredIncomeLim = nonRefEduCredIncomeLimMarried;
    }
    var line19 = nonRefEduCredIncomeCap;
    var line20 = agi;
    var line21 = line19 - line20;
    if (line21 < 0) {
        line21 = 0;
    }
    var line22 = nonRefEduCredIncomeLim;
    var line23 = line21 / line22;
    if (line23 > 1) {
        line23 = 1;
    }
    var line24 = line18 * line23;
    var line26 = totalTax;
    var line27 = childexpenses;
    var line28 = line26 - line27;
    if (line28 < 0) {
        line28 = 0;
    }
    return SmallerOfTwo(line24, line28);
};
//This function calculates the tentative American Opportunity Credit, before
//limiting effects based on income are taken into account.
function TentativeAOC(tuition, numOfStudents) {
    var tentativeAOCMax = numOfStudents * aocExpensesCap;
    var tentativeAOCLim = numOfStudents * aocExpensesLim;
    if (tuition > tentativeAOCMax) {
        tuition = tentativeAOCMax;
    }
    if (tuition < tentativeAOCLim) {
        tentativeAOC = tuition;
    }
    else {
        var amountOverLim = tuition - tentativeAOCLim;
        tentativeAOC = tentativeAOCLim + amountOverLim * 0.25;
    }
    if (numOfStudents == 0) {
        tentativeAOC = 0;
    }
    return tentativeAOC;
};
//This function calculates the tentative Hope education credit, before
//limiting effects based on income are taken into account.
function TentativeHope(scenario, tuition, numOfStudents) {
    var hopeExpensesCap;
    var hopeExpensesLim;
    switch (scenario) {
        case "BushExt":
            hopeExpensesCap = hopeExpensesCapBushExt;
            hopeExpensesLim = hopeExpensesLimBushExt;
            break;
        case "PreBush":
            hopeExpensesCap = hopeExpensesCapPreBush;
            hopeExpensesLim = hopeExpensesLimPreBush;
            break;
        case "Obama":
            hopeExpensesCap = hopeExpensesCapObama;
            hopeExpensesLim = hopeExpensesLimObama;
            break;
		case "Democrats":
            hopeExpensesCap = hopeExpensesCapDemocrats;
            hopeExpensesLim = hopeExpensesLimDemocrats;
            break;
    }
    var tentativeHopeMax = numOfStudents * hopeExpensesCap;
    var tentativeHopeLim = numOfStudents * hopeExpensesLim;
    if (tuition > tentativeHopeMax) {
        tuition = tentativeHopeMax;
    }
    var columnD = SmallerOfTwo(tuition, tentativeHopeLim);
    var columnE = columnD + tuition;
    var tentativeHopeCredit = columnE * 0.5;
    if (numOfStudents == 0) {
        tentativeHopeCredit = 0;
    }
    return tentativeHopeCredit;
};
//This function calculates the tentative Lifelong Learning credit,
//before limiting effects based on income are taken into account.
function TentativeLifelongLearning(scenario, tuition, numOfStudents) {
    var lifetimeLearningCap = 0;
    switch (scenario) {
        case "BushExt":
            lifetimeLearningCap = lifetimeLearningCapBushExt;
            break;
        case "PreBush":
            lifetimeLearningCap = lifetimeLearningCapPreBush;
            break;
        case "Obama":
            lifetimeLearningCap = lifetimeLearningCapObama;
            break;
		case "Democrats":
            lifetimeLearningCap = lifetimeLearningCapDemocrats;
            break;
    }
    var reducedTuition = SmallerOfTwo(tuition, lifetimeLearningCap);
    var tentativeLL = reducedTuition * 0.2;
    return tentativeLL;
};
//This function calculates the so-called "Pease Limitation" on itemized deductions.
function ItemizedDeductionLimitation(filingStatus, scenario, agi, itemizedDeductions) {
    var peaseThreshold = 0;
    switch (scenario) {
        case "BushExt":
            peaseThreshold = peaseThresholdBushExt;
            break;
        case "PreBush":
            peaseThreshold = peaseThresholdPreBush;
            break;
        case "Obama":
            var peaseThresholdObama = peaseThresholdSingleObama;
            if (filingStatus == "married") {
                peaseThresholdObama = peaseThresholdMarriedObama;
            }
            peaseThreshold = peaseThresholdObama;
            break;
		case "Democrats":
            var peaseThresholdDemocrats = peaseThresholdSingleDemocrats;
            if (filingStatus == "married") {
                peaseThresholdDemocrats = peaseThresholdMarriedDemocrats;
            }
            peaseThreshold = peaseThresholdDemocrats;
            break;
    }
    var line3 = itemizedDeductions;
    var line4 = line3 * 0.8;
    var line5 = agi;
    var line6 = peaseThreshold;
    var line7 = agi - peaseThreshold;
    if (line7 < 0) {
        line7 = 0;
    }
    var line8 = line7 * 0.03;
    var line9 = SmallerOfTwo(line4, line8);
    if (scenario == "BushExt") {
        line9 = 0;
    }
    var result = itemizedDeductions - line9;
    return result;
};
//This function calculates the user's standard deduction.
function StandardDeduction(scenario, filingStatus, headOver65, spouseOver65, realEstateTaxes) {
    var singleStandardDeduction;
    var marriedStandardDeduction;
    var hohStandardDeduction;
    switch (scenario) {
        case "BushExt":
            singleStandardDeduction = singleStandardDeductionBushExt;
            marriedStandardDeduction = marriedStandardDeductionBushExt;
            hohStandardDeduction = hohStandardDeductionBushExt;
            break;
        case "PreBush":
            singleStandardDeduction = singleStandardDeductionPreBush;
            marriedStandardDeduction = marriedStandardDeductionPreBush;
            hohStandardDeduction = hohStandardDeductionPreBush;
            break;
        case "Obama":
            singleStandardDeduction = singleStandardDeductionObama;
            marriedStandardDeduction = marriedStandardDeductionObama;
            hohStandardDeduction = hohStandardDeductionObama;
            break;
		case "Democrats":
            singleStandardDeduction = singleStandardDeductionDemocrats;
            marriedStandardDeduction = marriedStandardDeductionDemocrats;
            hohStandardDeduction = hohStandardDeductionDemocrats;
            break;
    }
    var standardDeduction;
    var realEstateSDCap;
    var elderlySD;
    switch (filingStatus) {
        case "single":
            standardDeduction = singleStandardDeduction;
            realEstateSDCap = realEstateSDCapSingle;
            elderlySD = elderlySDSingle;
            break;
        case "married":
            standardDeduction = marriedStandardDeduction
            realEstateSDCap = realEstateSDCapMarried;
            elderlySD = elderlySDMarried;
            break;
        case "hoh":
            standardDeduction = hohStandardDeduction;
            realEstateSDCap = realEstateSDCapSingle;
            elderlySD = elderlySDSingle;
            break;
    }
    var realEstateBonus = SmallerOfTwo(realEstateTaxes, realEstateSDCap);
	if (scenario == "BushExt") realEstateBonus = 0;
    var elderlyBonus = 0;
    if (headOver65 == "Yes") {
        elderlyBonus = elderlyBonus + elderlySD;
    }
    if (spouseOver65 == "Yes") {
        elderlyBonus = elderlyBonus + elderlySD;
    }
    var result = standardDeduction + realEstateBonus + elderlyBonus;
    return result;
};
//This function calculates the user's tuition deduction.
function TuitionDeduction(filingStatus, tuitionExpenses, totalIncome, numOfStudents) {
    var incomecap = tuitionDeductionIncomeCap;
    var incomelim = tuitionDeductionIncomeLim;
    var cap = tuitionDeductionCap;
    if (filingStatus == "married") {
        incomecap = incomecap * 2;
        incomelim = incomelim * 2;
    }
    line2 = tuitionExpenses;
    line4 = totalIncome;
    var result = 0;
    if (line4 > incomecap) {
        return result;
    }
    else {
        if (line4 > incomelim) {
            result = SmallerOfTwo(cap, line2);
        }
        else {
            result = SmallerOfTwo(cap * 2, line2);
        }
    }
    if (numOfStudents == 0) {
        result = 0;
    }
    return result;
};
//This function calculates the user's "Tentative Minimum Tax" - the tax owed under the alternate AMT system.
//If TMT exceeds the regular tax, the difference becomes the filer's alternative minimum tax.
function TentativeMinimumTax(scenario, filingStatus, agi, itemizedUnlimited, itemizedPeaseLimited, realEstateTaxes, localTaxes, totalCapGains, deductions, deductionMode, taxableIncome) {
    if (deductionMode == "standard") {
    	itemizedUnlimited = 0;
    	itemizedPeaseLimited = 0;
    	realEstateTaxes = 0;
    	localTaxes = 0;
    	deductions = 0;
    }
	var line1 = agi - itemizedPeaseLimited;
    var line3 = realEstateTaxes + localTaxes;
    var line6 = itemizedPeaseLimited - itemizedUnlimited;
    var amti = line1 + line3 + line6;
    var amtThresholdSingle;
    var amtThresholdMarried;
    var amtExemptionSingle;
    var amtExemptionMarried;
    var amtBracket;
    var ordinaryTaxSingleBracket2;
    var ordinaryTaxMarriedBracket2;
    var ordinaryTaxHohBracket2;
    var ordinaryTaxSinglebracket5;
    var ordinaryTaxMarriedbracket5;
    var ordinaryTaxHohbracket5;
    var capGainsRateLow;
    var capGainsRateHigh;
    var capGainsRateHighest;
    switch (scenario) {
        case "BushExt":
            amtThresholdSingle = amtThresholdSingleBushExt;
            amtThresholdMarried = amtThresholdMarriedBushExt;
            amtExemptionSingle = amtExemptionSingleBushExt;
            amtExemptionMarried = amtExemptionMarriedBushExt;
            amtBracket = amtBracketBushExt;
            ordinaryTaxSingleBracket2 = bracket2SingleBushExt;
            ordinaryTaxMarriedBracket2 = bracket2MarriedBushExt;
            ordinaryTaxHohBracket2 = bracket2HohBushExt;
            ordinaryTaxSingleBracket5 = bracket5SingleBushExt;
            ordinaryTaxMarriedBracket5 = bracket5MarriedBushExt;
            ordinaryTaxHohBracket5 = bracket5HohBushExt;
            capGainsRateLow = capGainsRateLowBushExt;
            capGainsRateHigh = capGainsRateHighBushExt;
			capGainsRateHighest = capGainsRateHighestBushExt;
            break;
        case "PreBush":
            amtThresholdSingle = amtThresholdSinglePreBush;
            amtThresholdMarried = amtThresholdMarriedPreBush;
            amtExemptionSingle = amtExemptionSinglePreBush;
            amtExemptionMarried = amtExemptionMarriedPreBush;
            amtBracket = amtBracketPreBush;
            ordinaryTaxSingleBracket2 = bracket2SinglePreBush;
            ordinaryTaxMarriedBracket2 = bracket2MarriedPreBush;
            ordinaryTaxHohBracket2 = bracket2HohPreBush;
            ordinaryTaxSingleBracket5 = bracket5SinglePreBush;
            ordinaryTaxMarriedBracket5 = bracket5MarriedPreBush;
            ordinaryTaxHohBracket5 = bracket5HohPreBush;
            capGainsRateLow = capGainsRateLowPreBush;
            capGainsRateHigh = capGainsRateHighPreBush;
			capGainsRateHighest = capGainsRateHighestPreBush;
            break;
        case "Republican":
            amtThresholdSingle = amtThresholdSingleRepublican;
            amtThresholdMarried = amtThresholdMarriedRepublican;
            amtExemptionSingle = amtExemptionSingleRepublican;
            amtExemptionMarried = amtExemptionMarriedRepublican;
            ordinaryTaxSingleBracket2 = bracket2SingleBushExt;
            ordinaryTaxMarriedBracket2 = bracket2MarriedBushExt;
            ordinaryTaxHohBracket2 = bracket2HohBushExt;
            ordinaryTaxSingleBracket5 = bracket5SingleBushExt;
            ordinaryTaxMarriedBracket5 = bracket5MarriedBushExt;
            ordinaryTaxHohBracket5 = bracket5HohBushExt;
            amtBracket = amtBracketRepublican;
            capGainsRateLow = capGainsRateLowBushExt;
            capGainsRateHigh = capGainsRateHighBushExt;
			capGainsRateHighest = capGainsRateHighestBushExt;
            break;
		 case "Democrats":
            amtThresholdSingle = amtThresholdSingleDemocrats;
            amtThresholdMarried = amtThresholdMarriedDemocrats;
            amtExemptionSingle = amtExemptionSingleDemocrats;
            amtExemptionMarried = amtExemptionMarriedDemocrats;
            ordinaryTaxSingleBracket2 = bracket2SingleDemocrats;
            ordinaryTaxMarriedBracket2 = bracket2MarriedDemocrats;
            ordinaryTaxHohBracket2 = bracket2HohDemocrats;
            ordinaryTaxSingleBracket5 = bracket5SingleDemocrats;
            ordinaryTaxMarriedBracket5 = bracket5MarriedDemocrats;
            ordinaryTaxHohBracket5 = bracket5HohDemocrats;
            amtBracket = amtBracketDemocrats;
            capGainsRateLow = capGainsRateLowDemocrats;
            capGainsRateHigh = capGainsRateHighDemocrats;
			capGainsRateHighest = capGainsRateHighestDemocrats;
            break;
    }
    var amtThreshold;
    var amtExemption;
    var ordinaryTaxBracket2;
    var ordinaryTaxBracket5;
    switch (filingStatus) {
        case "single":
            amtThreshold = amtThresholdSingle;
            amtExemption = amtExemptionSingle;
            ordinaryTaxBracket2 = ordinaryTaxSingleBracket2;
            ordinaryTaxBracket5 = ordinaryTaxSingleBracket5;
            break;
        case "married":
            amtThreshold = amtThresholdMarried;
            amtExemption = amtExemptionMarried;
            ordinaryTaxBracket2 = ordinaryTaxMarriedBracket2;
            ordinaryTaxBracket5 = ordinaryTaxMarriedBracket5;
            break;
        case "hoh":
            amtThreshold = amtThresholdSingle;
            amtExemption = amtExemptionSingle;
            ordinaryTaxBracket2 = ordinaryTaxHohBracket2;
            ordinaryTaxBracket5 = ordinaryTaxHohBracket5;
            break;
    }
    var amountOverThreshold = amti - amtThreshold;
    if (amountOverThreshold < 0) {
        amountOverThreshold = 0;
    }
    var limitedExemption = amtExemption - 0.25 * amountOverThreshold;
    if (limitedExemption < 0) {
        limitedExemption = 0;
    }
    var line31 = amti - limitedExemption;
    if (line31 < 0) {line31 = 0;}
    var line38 = totalCapGains;
	var line41 = line38;
    var line41 = SmallerOfTwo(line38, line31);
    var line42 = line31 - line41;
    var line43 = 0;
    if (line42 <= amtBracket) {
        line43 = 0.26 * line42;
    }
    else {
        line43 = 0.28 * line42 - 0.02 * amtBracket;
    }
    var line44 = ordinaryTaxBracket2;
	if (totalCapGains > taxableIncome) {totalCapGains = taxableIncome;}
    var line45 = taxableIncome - totalCapGains;
    var line46 = line44 - line45;
    if (line46 < 0) {
        line46 = 0;
    }
    var line47 = SmallerOfTwo(line31, line38);
	var line48 = SmallerOfTwo(line46, line47);
	
	
	
	
	
	capGainsBracket5 = ordinaryTaxBracket5 - line45;
	if (capGainsBracket5 < 0) {capGainsBracket5 = 0;}
	capGainsBracket2 = ordinaryTaxBracket2 - line45;
	if (capGainsBracket2 < 0) {capGainsBracket2 = 0;}
	
	line48 = totalCapGains;
	line49 = 0;
	if (totalCapGains > capGainsBracket2) {
		line49 = totalCapGains - capGainsBracket2;
	}
	highestCapGains = 0;
	if (totalCapGains > capGainsBracket5) {
		highestCapGains = totalCapGains - capGainsBracket5;
	}
	if (highestCapGains < 0) {highestCapGains = 0;}
	line49 = line49 - highestCapGains;
	if (line49 < 0 ) {line49 = 0;}
	line48 = line48 - highestCapGains - line49;
	if (line48 < 0) {line48 = 0;}
	
	lowCapGainsTax = line48 * capGainsRateLow;
    var line50 = capGainsRateHigh * line49;
    var highestCapGainsTax = highestCapGains * capGainsRateHighest;
	//DebugAlert(scenario + " " + line43);
    
	//alert("amt: " + scenario + "\n" + "lowCapGains = " + line48 + " " + lowCapGainsTax + "\n" + "highCapGains = " + line49 + " " + line50 + "\n" + "highestCapGains = " + highestCapGains + " " + highestCapGainsTax);
    
	var line53 = line43 + lowCapGainsTax + line50 + highestCapGainsTax;
    if (line31 <= amtBracket) {
        line54 = 0.26 * line31;
    }
    else {
        line54 = 0.28 * line31 - 0.02 * amtBracket;
    }
    tmt = SmallerOfTwo(line54, line53);
    return tmt;
};
//This function calculates the Making Work Pay credit, used only in the Obama scenario.
function MakingWorkPay(filingStatus, earnedIncome, agi) {
    var MWPCredit = MWPSingle;
    var MWPPhaseout = MWPPhaseoutSingle;
    if (filingStatus == "married") {
        MWPCredit = MWPMarried;
        MWPPhaseout = MWPPhaseoutMarried;
    }
    var line1 = earnedIncome;
    var line2 = line1 * 0.062;
    var line3 = MWPCredit;
    var line4 = SmallerOfTwo(line2, line3);
    var line5 = agi;
    var line6 = MWPPhaseout;
    var line7 = line5 - line6;
    if (line7 < 0) {
        line7 = 0;
    }
    var line8 = line7 * 0.02;
    var line9 = line4 - line8;
    if (line9 < 0) {
        line9 = 0;
    }
    return line9;
};
//President Obama has proposed a further limit on itemized deductions (that is, beyond the
//"Pease" Limitation) where any limit gained from claiming a deduction is limited to the benefit
//that one would receive if in the 28% income bracket.  This has effects on both regular tax
//and AMT, and these effects are accounted for by the next two functions.  The details of this
//are somewhat arcane, but I have implemented it here as described by the Joint Committee on
//Taxation. For information on details see the Joint Committee on Taxation report JCS-2-09 pages 123-130.
function Obama28PercentDeductionLimit(filingStatus, agi, personalExemption, totalCapGains, itemizedDeductions, deductionsBelowZero) {
    itemizedDeductions = itemizedDeductions - deductionsBelowZero;
    switch (filingStatus) {
        case "single":
            bracket6Obama = bracket6SingleObama;
            bracket5Obama = bracket5SingleObama;
            break;
        case "married":
            bracket6Obama = bracket6MarriedObama;
            bracket5Obama = bracket5MarriedObama;
            break;
        case "hoh":
            bracket6Obama = bracket6HohObama;
            bracket5Obama = bracket5HohObama;
            break;
    }
    var agiMinusExemptionAndCapGains = agi - (personalExemption + totalCapGains);
    var incomeOverTopBracketLevel = agiMinusExemptionAndCapGains - bracket5Obama;
    if (incomeOverTopBracketLevel < 0) {
        incomeOverTopBracketLevel = 0;
    }
    var deductionsOverThreshold = SmallerOfTwo(incomeOverTopBracketLevel, itemizedDeductions);
    var highRateOnAbove = bracket7RateObama * deductionsOverThreshold;
    var lowRateOnAbove = bracket5RateObama * deductionsOverThreshold;
    var topBracketDifference = highRateOnAbove - lowRateOnAbove;
    var incomeOverNextBracket = agiMinusExemptionAndCapGains - bracket5Obama;
    if (incomeOverNextBracket < 0) {
        incomeOverNextBracket = 0;
    }
    var leftoverIncome = incomeOverNextBracket - incomeOverTopBracketLevel;
    var leftoverDeductions = itemizedDeductions - deductionsOverThreshold;
    var deductionsOverThreshold = SmallerOfTwo(leftoverIncome, leftoverDeductions);
    var highRateNext = bracket6RateObama * deductionsOverThreshold;
    var lowRateNext = bracket5RateObama * deductionsOverThreshold;
    var lowerBracketDifference = highRateNext - lowRateNext;
    var totalDifference = topBracketDifference + lowerBracketDifference;
    return totalDifference;
};
function Obama28PercentTMTEffects(filingStatus, preferenceDeductions, totalDeductions, amti, agi, personalExemptions, totalCapGains, itemizedDeductionsAfterPease, deductionsBelowZero) {
    var fraction = 0;
    preferenceDeductions = preferenceDeductions - deductionsBelowZero; 
    if (preferenceDeductions < 0) {
        preferenceDeductions = 0;
    }
    totalDeductions = totalDeductions - deductionsBelowZero;
    if (totalDeductions < 0) {
        totalDeductions = 0;
    }
    var nonPreferenceDeductions = totalDeductions - preferenceDeductions;
    if (totalDeductions != 0) {
    	fraction = nonPreferenceDeductions / totalDeductions;
    }
    var increase1 = fraction * Obama28PercentDeductionLimit(filingStatus, agi, personalExemptions, totalCapGains, itemizedDeductionsAfterPease, deductionsBelowZero);
    var amtiAndNonPreference = amti + nonPreferenceDeductions;	amtiAndNonPreference = amtiAndNonPreference - totalCapGains;
    var amtBracketThreshold = amtBracketObama;
    var amtThreshold = amtThresholdSingleObama;
    var amtExemption = amtExemptionSingleObama;
    if (filingStatus == "married") {
        amtThreshold = amtThresholdMarriedObama;
        amtExemption = amtExemptionMarriedObama;
    }
    var amtiExemptionLimitIncomeCap = (amtExemption * 4) + amtThreshold;
    var amtiOverPhaseoutCap = amtiAndNonPreference - amtiExemptionLimitIncomeCap;
    if (amtiOverPhaseoutCap < 0) {
        amtiOverPhaseoutCap = 0;
    }
    nonPreferenceDeductions = nonPreferenceDeductions - amtiOverPhaseoutCap;
    amtiAndNonPreference = amtiAndNonPreference - amtiOverPhaseoutCap;
    var amtiOverThreshold = amtiAndNonPreference - amtBracketThreshold;
    if (amtiOverThreshold < 0) {
        amtiOverThreshold = 0;
    }
    var smallerOfDeductionsOrAmountOverThreshold = SmallerOfTwo(amtiOverThreshold, nonPreferenceDeductions);
    var times35Percent = smallerOfDeductionsOrAmountOverThreshold * 0.35;
    var times28Percent = smallerOfDeductionsOrAmountOverThreshold * 0.28;
    var difference = times35Percent - times28Percent;
    var leftoverDeductions = nonPreferenceDeductions - smallerOfDeductionsOrAmountOverThreshold;
    var leftoverAMTI = amtiAndNonPreference - amtiOverThreshold;
    if (leftoverAMTI < 0) {
        leftoverAMTI = 0;
    }
    var exemptionReductionThreshold = amtThreshold;
    var leftoverAMTIAboveExemptionThreshold = leftoverAMTI - exemptionReductionThreshold;
    if (leftoverAMTIAboveExemptionThreshold < 0) {
        leftoverAMTIAboveExemptionThreshold = 0;
    }
    var smallerOfThese = SmallerOfTwo(leftoverAMTIAboveExemptionThreshold, leftoverDeductions);
    var abovetimes325 = smallerOfThese * 0.325;
    var abovetimes28 = smallerOfThese * 0.28;
    var difference2 = abovetimes325 - abovetimes28;
    var totalDifference = difference + difference2;
    var result = increase1 + totalDifference;
    return result;
};
//This function is used inside the main Form1040 functions - 
//it gets the contents of an input box and returns it as a number,
//ignoring any non-numerical characters (aside from negative signs.)
function GetValue(inputFormLocal, nameOfInputBox) {
    var lengthOfString = 0;
    var result = "";
    var stringInput = "";
    var decimalcount = 0;
    stringInput = document[inputFormLocal][nameOfInputBox].value;
    lengthOfString = stringInput.length;
    var firstCharacter = stringInput.charAt(0);
    if (firstCharacter == "-") {
        result = result + firstCharacter;
    }
    if (firstCharacter == ".") {
        result = result + firstCharacter;
        decimalcount++;
    }
    if (isNaN(firstCharacter) == false) {
        result = result + firstCharacter;
    }
    var characterIndex = 1;
    var currentCharacter = "";
    for (characterIndex; characterIndex < lengthOfString; characterIndex++) {
        currentCharacter = stringInput.charAt(characterIndex);
        var IsNotNumber = isNaN(currentCharacter);
        if (IsNotNumber == false) {
            result = result + currentCharacter;
        }
        if (currentCharacter == ".") {
            if (decimalcount < 1) {
                result = result + currentCharacter;
            }
            decimalcount++;
        }
    }
    result = result * 1;
    if (isNaN(result)) {
        result = 0;
    }
    return result;
};
//This function writes a numerical value to an output box.
function WriteValue(outputFormLocal, OutputName, amountToWrite) {
    var result = Math.round(amountToWrite);
    result = result + "";
    document[outputFormLocal][OutputName]["value"] = result;
};
//This function writes a numerical value with a dollar sign in front
//to an output box.
function WriteCashValue(outputFormLocal, OutputName, amountToWrite) {
    var result = Math.round(amountToWrite);
    if (result < 0) {
        result = 0 - result;
        document[outputFormLocal][OutputName].value = "-" + "$" + result;
    }
    else {
        result = result + "";
        document[outputFormLocal][OutputName].value = "$" + result;
    }
};
//This function occurs when the main button is pushed, and calls the three Form 1040 functions.
function PushButton() {
	try {
    var BushExtResult = BushExtForm1040("inputForm", "outputForm");
    var PreBushResult = PreBushForm1040("inputForm", "outputForm");
	var DemocratsResult = DemocratsForm1040("inputForm", "outputForm");
	var RepublicanResult = RepublicanForm1040("inputForm","outputForm");
    timesButtonPushed++;
    /*var finalcompare = document.getElementById("finalcompare");
	var democratcompare = document.getElementById("democratcompare");
	var democratRepublicanCompare = document.getElementById("democratRepublicanCompare");
    finalcompare.style.visibility = "visible";
	democratcompare.style.visibility = "visible";
    var comparisontest = document.getElementById("comparisontest");
	var democratcomparisontest = document.getElementById("democratcomparisontest");
	var fullexpirationDemocratcompare = document.getElementById("fullexpirationDemocratcompare");
    var comparisonString = CompareScenarios(BushExtResult, PreBushResult,false,true);
	if (DemocratsResult < 0) {
		var DemocratText = AddCommasToNumber(Math.round(0-DemocratsResult));
		DemocratText = "-$" + DemocratText;
	} else {
		var DemocratText = AddCommasToNumber(Math.round(DemocratsResult));
		DemocratText = "$" + DemocratText;
	}
	document.getElementById("democratTaxFinal").innerHTML = DemocratText;
	var democratCompare = CompareScenarios(BushExtResult, DemocratsResult,true,false);
	if (democratCompare != "the same as") {democratCompare = "$" + democratCompare;}
    comparisontest.innerHTML = comparisonString;
	democratRepublicanCompare.innerHTML = democratCompare;*/
	} catch (ex) {
		alert(ex);
	}
	
};
//This function runs after any box has been changed and calculation has already occured once.
function UpdateResult() {
    var IsChecked = document.inputForm.automaticUpdate.checked;
    if (timesButtonPushed > 0 && IsChecked == true) {
        PushButton();
    }
};
//This function writes a numerical value, with commas, and a dollar sign.
function WriteValueWithCommas(OutputName, amountToWrite) {
    var outputValue = Math.round(amountToWrite);
    outputValue = outputValue + "";
    var backwardsresult = "";
    var lengthOfOutput = outputValue.length;
    var counterVar = 0;
    var commaCounter = 0;
    var commaCount = 0;
    var currentChar = "";
    for (counterVar = lengthOfOutput - 1; counterVar >= 0; counterVar--) {
        currentChar = outputValue.charAt(counterVar);
        nextCharLocation = counterVar - 1;
        if (nextCharLocation < 0) {
            nextCharLocation = 0;
        }
        nextChar = outputValue.charAt(nextCharLocation);
        backwardsresult = backwardsresult + currentChar;
        commaCounter++;
        if (commaCounter == 3 && counterVar != 0) {
            if (nextChar != "-") {
                backwardsresult = backwardsresult + ",";
            }
            commaCounter = 0;
            commaCount++;
        }
    }
    var result = "";
    var isNumberNegative = false;
    for (counterVar = lengthOfOutput + commaCount - 1; counterVar >= 0; counterVar--) {
        currentChar = backwardsresult.charAt(counterVar);
        if (currentChar != "-") {
            result = result + backwardsresult.charAt(counterVar);
        }
        else {
            isNumberNegative = true;
        }
    }
    var outputText;
    if (isNumberNegative == false) {
        outputText = "$" + result;
    }
    else {
        outputText = "$" + result + " refund";
    }
    var outputFieldName = document.getElementById(OutputName);
    outputFieldName.innerHTML = outputText;
    return outputText;
};

//This function makes the "Is Spouse 65 Or Older" select box active, and runs
//when the filing status is set to Married.
function MakeElderlySpouseSelectActive() {
    document.inputForm.spouse65OrOver.disabled = false;
    if (document.inputForm.spouse65OrOver.selectedIndex == 2) {
        document.inputForm.spouse65OrOver.selectedIndex = 0;
    }
    document.inputForm["spouse65OrOver"][2].disabled = true;
};
//The function makes the "Is Spouse 65 Or Older" select box inactive, sets it to
//"N/A", and runs whenever the filing status is set to Single or Head of Household.
function MakeElderlySpouseSelectInactive() {
    document.inputForm.spouse65OrOver.selectedIndex = 2;
    document.inputForm.spouse65OrOver.disabled = true;
};
function CompareScenarios(lowScenario, highScenario,addThan,addDollarSign) {
	highScenario = Math.round(highScenario);
	lowScenario = Math.round(lowScenario);
    var difference = highScenario - lowScenario;
    var result = "";
    if (difference >= 0) {
        difference = AddCommasToNumber(difference);
        result = difference + " higher";
    }
    if (difference == 1) {
        result = difference + " higher";
    }
    if (difference < 0) {
        difference = 0 - difference;
        difference = AddCommasToNumber(difference);
        result = difference + " lower";
    }
    if (difference == -1) {
        difference = 0 - difference;
        result = difference + " lower";
    }
	if (difference == 0) {
		result = "the same";
	}
	if (addThan == true) {
		result = result + " than";	
		if (difference == 0) {
			result = "the same as";
			return result;
		}
	}
	if (addDollarSign == true && difference != 0) {
			result = "$" + result;
	}
    return result;
};
function AddCommasToNumber(number) {
    var outputValue = number + "";
    var lengthOfOutput = outputValue.length;
    var counterVar = 0;
    var commaCounter = 0;
    var commaCount = 0;
    var currentChar = "";
    var result = "";
    for (counterVar = lengthOfOutput - 1; counterVar >= 0; counterVar--) {
        currentChar = outputValue.charAt(counterVar);
        result = currentChar + result;
        commaCounter++;
        if (commaCounter == 3 && counterVar != 0) {
            result = "," + result;
            commaCounter = 0;
            commaCount++;
        }
    }
    return result;
};
//These functions are used for popup windows.
function popup(mylink, windowname) {
    if (!window.focus)
        return true;
    var href;
    if (typeof (mylink) == 'string')
        href = mylink;
    else
        href = mylink.href;
    window.open(href, windowname, 'scrollbars,resizable');
    return false;
};
function popupNewWindow(mylink, windowname) {
    if (!window.focus)
        return true;
    var href;
    if (typeof (mylink) == 'string')
        href = mylink;
    else
        href = mylink.href;
    window.open(href, windowname, 'width=400,height=500,scrollbars=0,location=0');
    return false;
};
function ACTCPreBush(EITC, filingStatus, qualifyingChildren, agi, totalTax, wagesHead, wagesSpouse, childCareCredit, eduCredit) {
    var ssPayrollTaxes1 = SmallerOfTwo(SSWageBase, 0.062 * wagesHead);
    var medicareTaxes1 = 0.0145 * wagesHead;
	var ssPayrollTaxes2 = SmallerOfTwo(SSWageBase, 0.062* wagesSpouse);
	var medicareTaxes2 = 0.0145 * wagesSpouse;
    var line3 = ssPayrollTaxes1 + medicareTaxes1 + ssPayrollTaxes2 + medicareTaxes2;
    var line4 = EITC;
    var line5 = line3 - line4;
    if (line5 < 0) {
        line5 = 0;
    }
    var line6 = TotalChildTaxCredit("PreBush",filingStatus,qualifyingChildren,agi);
    var line7 = NonRefundableChildTaxCredit("PreBush", filingStatus, qualifyingChildren, agi, totalTax, childCareCredit, eduCredit);
    var line8 = line6 - line7;
    var result = SmallerOfTwo(line8, line5);
    return result;
};
function KeyPress() {
    if (window.event.keyCode == 13) {
        window.event.keyCode = 0;
    }
}

function ChangeColumn(checkboxName, columnName){
	var counter = 0;
	var x = document.getElementsByTagName("*");
	if (document.getElementById(checkboxName).checked == true) {
		for (counter = 0; counter<x.length; counter++) {
			if (x[counter].getAttribute('name') == columnName) {
				x[counter].className = "VisibleColumn";
				displayedColumns++;
			}
		}
	} else {
		for (counter = 0; counter<x.length; counter++) {
			if (x[counter].getAttribute('name') == columnName) {
				x[counter].className = "InvisibleColumn";
				displayedColumns--;
			}
		}
	}
	if (displayedColumns > 3) {
		document.getElementById("topbar").style.minWidth = "1024px";
	} else {
		document.getElementById("topbar").style.minWidth = "850px";
	}
};

function ChangeBackgroundImage(divID, url) {
	document.getElementById(divID).src = url;
};

function ClickArrow() {
	if (showAdvanced == false) {
		showAdvanced = true;
		document.getElementById("arrow").src = "arrowDown.png";
		document.getElementById("advancedRow").style.display = "table-row";
	} else {
		showAdvanced = false;
		document.getElementById("arrow").src = "arrowRight.png";
		document.getElementById("advancedRow").style.display = "none";
	}
};

function ChangeAMTBox() {
	if (document.getElementById("includeAMT").checked == false) {
		amtExemptionSinglePreBush = 33750;
		amtExemptionMarriedPreBush = 45000;
	} else {
		amtExemptionSinglePreBush = 48450;
		amtExemptionMarriedPreBush = 74450;
	}
	if (document.getElementById("includeAMTBushExt").checked == false) {
		amtExemptionSingleBushExt = 33750;
		amtExemptionMarriedBushExt = 45000;
	} else {
		amtExemptionSingleBushExt = 48450;
		amtExemptionMarriedBushExt = 74450;
	}
	if (document.getElementById("includeAMTDems").checked == false) {
		amtExemptionSingleDemocrats = 33750;
		amtExemptionMarriedDemocrats = 45000;
	} else {
		amtExemptionSingleDemocrats = 47450;
		amtExemptionMarriedDemocrats = 72450;
	}
	if (document.getElementById("includeAMTRepublicans").checked == false) {
		amtExemptionSingleRepublican = 33750;
		amtExemptionMarriedRepublican = 45000;
	} else {
		amtExemptionSingleRepublican = 48450;
		amtExemptionMarriedRepublican = 74450;
	}
	if (timesButtonPushed != 0) {
		PushButton();
	}
};

function PayrollTaxes(ssRate,earnedIncome) {
	return earnedIncome*0.0145 + SmallerOfTwo(SSWageBase*ssRate,earnedIncome*ssRate);
};
