/**
 * Handles functionality for the residential automobile offset calculator.
 */

var auto_url = '/auto-ajax.html?';

var defaultValues = {
    miles: 12000,
    year: '',
    make: '',
    model: ''
};

var storedCookie;
var storedVehicle;
var lastUpdate = -1;

/**
 * Execute when the source loads
 */
$(document).ready(function() {
    storedCookie = jQuery.cookie('AutoCalculator');
    storedVehicle = (storedCookie) ? window.JSON.parse(storedCookie) : defaultValues;

    var form_miles = $('#form_miles');
    var form_year = $('#form_year');
    var form_make = $('#form_make');
    var form_model = $('#form_model');

    resetFields(false);

    $('#calculator').submit(saveForm);

    form_miles.change(updateSelectFields);
    form_year.change(updateSelectFields);
    form_make.change(updateSelectFields);

    $('#form_clear_fields').click(function(event) {
        event.preventDefault();
        resetFields(true);
        saveForm();
    });
});

/**
 * Disable a select box
 */
var disableField = function(el) {
    if ($(el).prop('disabled') == false) {
        $(el).prop('disabled', true);
        $(el).val('');
        $(el).css({
            'background-color': '#c2e4f0'
        });
        $(el).animate({
            'background-color': '#ffffff'
        }, 800, 'linear');
    }
}

/**
 * Enable a select box
 */
var enableField = function(el) {
    if ($(el).prop('disabled') == true) {
        $(el).prop('disabled', false);
    }
    $(el).css({
        'background-color': '#b2d65e'
    });
    $(el).animate({
        'background-color': '#ffffff'
    }, 700, 'linear');
}

/**
 * Reset select fields (when refreshing the page)
 */
var resetFields = function(clearFields) {
    $('select').each(function(index, el) {
        resetField(el, clearFields);
    });
}

/**
 * Reset a an individual field's value and enabled state
 */
var resetField = function(el, clearField) {
    var form_miles = $('#form_miles');
    var form_year = $('#form_year');
    var form_make = $('#form_make');
    var form_model = $('#form_model');

    // Handle AJAX requests
    switch ($(el).attr('name')) {
        case 'make':
            if (form_year.val() == '') {
                disableField(el);
            } else {
                $(el).empty().append(new Option('Select a make...', '', true, true));
                var reqUrl = auto_url + '&' + jQuery.param({action: 'makes', year: form_year.val()});
                var request = jQuery.ajax({
                    //type: 'POST',
                    //data: data,
                    //success: success,
                    type: 'GET',
                    url: reqUrl,
                    dataType: 'json',
                    complete: function(response) {
                        var data = jQuery.parseJSON(response.responseText);

                        jQuery.each(data.options, function(index, option) {
                            $(el).append(new Option(option.description, option.value, false, false));
                        });

                        setDefaultFieldValue(el, clearField);
                        enableField(el);

                        // Chain load next dependent field
                        resetField(form_model, clearField);
                    }
                });
            }
            break;
        case 'model':
            if (form_year.val() == '' || form_make.val() == '') {
                disableField(el);
            } else {
                $(el).empty().append(new Option('Select a model...', '', true, true));
                var reqUrl = auto_url + '&' + jQuery.param({action: 'models', year: form_year.val(), make: form_make.val()});
                var request = jQuery.ajax({
                    type: 'GET',
                    url: reqUrl,
                    dataType: 'json',
                    complete: function(response) {
                        var data = jQuery.parseJSON(response.responseText);

                        jQuery.each(data.options, function(index, option) {
                            $(el).append(new Option(option.description, option.value, false, false));
                        });

                        setDefaultFieldValue(el, clearField);
                        enableField(el);
                    }
                });
            }
            break;
        default:
            setDefaultFieldValue(el, clearField);
            enableField(el);
    }
}


/**
 * Set the default value for a field
 */
var setDefaultFieldValue = function(el, clearField) {
    // Select the default value for the field
    var selectedValue = defaultValues[$(el).attr('name')];

    if (!clearField) {
        if ($(el).val() == '' && storedVehicle[$(el).attr('id')]) {
            // Load value from previously stored cookie
            selectedValue = storedVehicle[$(el).attr('id')];
            $(el).val(selectedValue);
        }
    } else {
        $(el).val(selectedValue);
    }
}

/**
 * Update the select fields, issuing an AJAX request when necessary
 */
var updateSelectFields = function(event) {
    var form_miles = $('#form_miles');
    var form_year = $('#form_year');
    var form_make = $('#form_make');
    var form_model = $('#form_model');

    switch ($(this).attr('name')) {
        case 'miles':
            if (lastUpdate != form_miles.val()) {
                if (form_miles.val() == '') {
                    resetField(form_year, true);
                    disableField(form_make);
                    disableField(form_model);
                } else if (form_year.prop('disabled') == true) {
                    resetField(form_year, true);
                }
            }
            lastUpdate = form_miles.val();
            break;
        case 'year':
            if (lastUpdate != form_year.val()) {
                if (form_year.val() == '') {
                    disableField(form_make);
                    disableField(form_model);
                } else {
                    if (form_miles.val() == '') {
                        resetField(form_year, true);
                        disableField(form_make);
                    } else {
                        resetField(form_make, true);
                    }
                    disableField(form_model);
                }
            }
            lastUpdate = form_year.val();
            break;
        case 'make':
            if (lastUpdate != form_make.val()) {
                if (form_make.val() <= 0) {
                    disableField(form_model)
                } else {
                    resetField(form_model, true);
                }
            }
            lastUpdate = form_make.val();
            break;
        default:
            lastUpdate = -1;
    }
}

/**
 * Save form values to the hash cookie on form submit
 */
var saveForm = function() {
    $('select').each(function(index, el) {
        storedVehicle[$(el).attr('id')] = $(el).val() + '';
    });

    var expiresOn = new Date();
    expiresOn.setTime(expiresOn.getTime() + (365 * 24 * 60 * 60 * 1000));
    jQuery.cookie('AutoCalculator', window.JSON.stringify(storedVehicle), {expires: expiresOn});
}

