//
// Copyright 2008, squawkfox.com
// All rights reserved
//


/*
 * Initialize
 */
$(function() {
    initGasCalc();
});


/*
 * Bind all callbacks to controls.
 */
function initGasCalc() {
    $("#Calculate").click(calculate);
    $("#Clear").click(reset);
    $("#distanceUnits").change(distanceUnitsChanged);

    if (validate(false)) {
        calculate();
    }
}


/*
 * Callback to switch units when the distance is changed
 * and no other data has been entered.
 */
function distanceUnitsChanged() {
    if ($("#fuelUsed").val() == "" && $("#priceOfFuel").val() == "") {
        if ($("#distanceUnits").val() == "miles") {
            switchToUS();
        }
        else {
            switchToMetric();
        }
    }
}


/*
 * Switch to metric units
 */
function switchToMetric() {
    $("#distanceUnits").val("km");
    $("#fuelUnits").val("litres");
    $("#fuelPriceUnits").val("litres");
}


/*
 * Switch to US units
 */
function switchToUS() {
    $("#distanceUnits").val("miles");
    $("#fuelUnits").val("gallons");
    $("#fuelPriceUnits").val("gallons");
}


/*
 * Reset to initial state.
 */
function reset() {
    clearInput();
    clearOutput();
}


/*
 * Perform calculation and update UI.
 */
function calculate() {

    if (!validate()) {
        clearOutput();
        return;
    }

    var distance = new Distance($("#distance").val(), $("#distanceUnits").val());
    var fuelUsed = new Volume($("#fuelUsed").val(), $("#fuelUnits").val());
    var unitFuelCost = new CostPerVolume($("#priceOfFuel").val(), $("#fuelPriceUnits").val());
    
    var efficiency = new Efficiency(distance.getMiles() / fuelUsed.getGallons(), "mpg");
    $("#USFuelEfficiency").text(format.round(efficiency.getMpg(), 2));
    $("#MetricFuelEfficiency").text(format.round(efficiency.getLPer100km(), 2));

    var costPerDistance = new CostPerUnitDistance(efficiency, unitFuelCost);
    $("#DollarsPerMile").text(format.formatCurrency(costPerDistance.getCostPerMile()));
    $("#DollarsPerKm").text(format.formatCurrency(costPerDistance.getCostPerKm()));
}


/*
 * Validate all input fields.
 */
function validate(setClasses) {
    var valid = true;
    $("#gasCalculator input").removeClass("invalid").each(
        function() {
            if ($(this).val() == "") {
                if (setClasses == undefined || setClasses) {
                    $(this).addClass("invalid");
                }
                valid = false;
            }
        });

    return valid;
}


/*
 * Clear output fields
 */
function clearOutput() {
    $("#USFuelEfficiency").text("0.0");
    $("#MetricFuelEfficiency").text("0.0");
    $("#DollarsPerMile").text(format.formatCurrency(0));
    $("#DollarsPerKm").text(format.formatCurrency(0));
}


/*
 * Clear input
 */
function clearInput() {
    $("#distance").val("");
    $("#fuelUsed").val("");
    $("#priceOfFuel").val("");
    $("#gasCalculator input").removeClass("invalid");

}

