window.CarsWanted = window.CarsWanted || {};
CarsWanted.QuoteForm = CarsWanted.QuoteForm || function () {

    var me = this;
    var previousMake;
    var previousModel;
    var previousYear;
    var previousDescription;

    var makeObject = $('[name=make]');
    var modelObject = $('[name=model]');
    var yearObject = $('[name=year]');
    var descriptionObject = $('#series');
    var exactObject = $('[name=exact]');
    var cnameObject = $('[name=cname]');
    var cemailObject = $('[name=cemail]');
    var cstateObject = $('[name=cstate]');
    var chowdidyouObject = $('[name=chowdidyou]');
    var vwhensellObject = $('[name=vwhensell]');
    var vkmtravelObject = $('[name=vkmtravel]');
    var vcolourObject = $('[name=vcolour]');

    this.MakeChanged = function () {
        var make = makeObject.val();

        if ($.trim(make) != "" && make != previousMake) {
            previousMake = make;
            me.MakeSelected(make);
        }
    }
    this.ModelChanged = function () {
        var make = makeObject.val();
        var model = modelObject.val();

        if ($.trim(model) != "" && model != previousModel) {
            previousModel = model;
            me.ModelSelected(make, model);
        }
    }
    this.YearChanged = function () {
        var make = makeObject.val();
        var model = modelObject.val();
        var year = yearObject.val();

        if ($.trim(year) != "" && year != previousYear) {
            previousYear = year;
            me.YearSelected(make, model, year);
        }
    }
    this.SeriesChanged = function () {
        var make = makeObject.val();
        var model = modelObject.val();
        var year = yearObject.val();
        var description = descriptionObject.val();

        if ($.trim(description) != "" && description != previousDescription) {
            previousDescription = description;
            me.DescriptionSelected(make, model, year, description);
        }
    }

    function IsDropDownValid(object, errorString) {
        var value = object.val();

        if (!value || $.trim(value) == "" || $.trim(value) == "BLANK") {
            alert(errorString);
            return false;
        }
        return true;
    };
    function checkEmailIsValid(emailString) {
        var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        if (!filter.test(emailString)) {
            return false;
        }
        return true;
    }

    this.validateForm = function () {
        if (IsDropDownValid(makeObject, "Car make must be selected") == false) {
            return false;
        }
        if (IsDropDownValid(modelObject, "Car model must be selected") == false) {
            return false;
        }
        if (IsDropDownValid(cnameObject, "Your name must be filled out") == false) {
            return false;
        }
        if (IsDropDownValid(cemailObject, "Your email address must be provided") == false) {
            return false;
        }
        if (checkEmailIsValid(cemailObject.val()) == false) {
            alert('Please provide a valid email address');
            return false;
        }
        if (IsDropDownValid(cstateObject, "Your state must be provided") == false) {
            return false;
        }
        if (IsDropDownValid(chowdidyouObject, "How did you find us must be provided") == false) {
            return false;
        }
        if (IsDropDownValid(vwhensellObject, "How did you find us must be provided") == false) {
            return false;
        }
        if (IsDropDownValid(vkmtravelObject, "KM travelled must be provided") == false) {
            return false;
        }
        if (IsDropDownValid(vcolourObject, "Colour must be provided") == false) {
            return false;
        }

        return true;
    };

    this.ResetDropdown = function (dropdownObject) {
        dropdownObject.find('option').remove();
    };
    this.AddOptionsToSelect = function (dropdownObject, data) {
        dropdownObject.append($("<option></option>").attr("value", " ").text("Select one..."));

        var dataArray = eval(data);
        for (i = 0; i < dataArray.length; i++) {
            dropdownObject.append($("<option></option>").attr("value", dataArray[i]).text(dataArray[i]));
        }
    }

    this.HideLoadingGif = function () {
        $('#loadingGif').hide();
    };
    this.ShowLoadingGif = function () {
        $('#loadingGif').show();
    };
    this.MakeSelected = function () {
        me.ShowLoadingGif();
        $.ajax({
            url: "get_model.php?make=" + makeObject.val() + "&sid=" + Math.random(),
            success: function (data) {
                me.UpdateModel(data);
            },
            error: function () {
                alert('Something has gone wrong, please try again');
            },
            complete: function () {
                me.HideLoadingGif();
            }
        });
    };
    this.UpdateModel = function (data) {
        me.ResetDropdown(modelObject);
        me.ResetDropdown(yearObject);
        me.ResetDropdown(descriptionObject);
        me.ResetDropdown(exactObject);

        me.AddOptionsToSelect(modelObject, data);
    };
    this.ModelSelected = function () {
        me.ShowLoadingGif();
        $.ajax({
            url: "get_year.php?make=" + makeObject.val() + "&model=" + modelObject.val() + "&sid=" + Math.random(),
            success: function (data) {
                me.UpdateYear(data);
            },
            error: function () {
                alert('Something has gone wrong, please try again');
            },
            complete: function () {
                me.HideLoadingGif();
            }
        });
    };
    this.UpdateYear = function (data) {
        me.ResetDropdown(yearObject);
        me.ResetDropdown(descriptionObject);
        me.ResetDropdown(exactObject);

        me.AddOptionsToSelect(yearObject, data);
    };
    this.YearSelected = function () {
        me.ShowLoadingGif();
        $.ajax({
            url: "get_description.php?make=" + makeObject.val() + "&model=" + modelObject.val() + "&year=" + yearObject.val() + "&sid=" + Math.random(),
            success: function (data) {
                me.UpdateDescription(data);
            },
            error: function () {
                alert('Something has gone wrong, please try again');
            },
            complete: function () {
                me.HideLoadingGif();
            }
        });
    };
    this.UpdateDescription = function (data) {
        me.ResetDropdown(descriptionObject);
        me.ResetDropdown(exactObject);

        me.AddOptionsToSelect(descriptionObject, data);
    };
    this.DescriptionSelected = function () {
        me.ShowLoadingGif();
        $.ajax({
            url: "get_exact.php?make=" + makeObject.val() + "&model=" + modelObject.val() + "&year=" + yearObject.val() + "&description=" + descriptionObject.val() + "&sid=" + Math.random(),
            success: function (data) {
                me.UpdateExact(data);
            },
            error: function () {
                alert('Something has gone wrong, please try again');
            },
            complete: function () {
                me.HideLoadingGif();
            }
        });
    };
    this.UpdateExact = function (data) {
        me.ResetDropdown(exactObject);

        me.AddOptionsToSelect(exactObject, data);
    };

    /**********************************/
    /* Bindings                       */
    /**********************************/
    $('[name=make]').bind('keyup', function () {
        me.MakeChanged();
    });
    $('[name=make]').change(function () {
        me.MakeChanged();
    });

    $('[name=model]').bind('keyup', function () {
        me.ModelChanged();
    });
    $('[name=model]').change(function () {
        me.ModelChanged();
    });

    $('[name=year]').bind('keyup', function () {
        me.YearChanged();
    });
    $('[name=year]').change(function () {
        me.YearChanged();
    });

    $('#series').bind('keyup', function () {
        me.SeriesChanged();
    });
    $('#series').change(function () {
        me.SeriesChanged();
    });
    $('#formLoadingDiv').hide();
};
