﻿/// <reference path="./jquery.min.js" />

(function() {
    $.fn.State = function(options) {
        var transitionType = {
            Forward: 0,
            Backward: 1,
            Reset: 2,
            Error: 3
        }

        var defaults = {
            startStep: 1,
            steps: [],
            nextButton: null,
            backButton: null,
            resetButton: null,
            onReset: null
        };
        var options = $.extend({}, defaults, options);
        var currentObj = $(this);
        var currentStep = options.startStep;

        var switchState = function(startStep, transition) {
            var newState = '';

            if (transition == transitionType.Forward) {
                newState = 'Step' + ++currentStep;
            } else if (transition == transitionType.Backward) {
                newState = 'Step' + --currentStep;
            } else if (transition == transitionType.Reset) {
                newState = 'Step' + startStep;
                currentStep = startStep;
            }
            else if (transition == transitionType.Error) {
                // Hack so we can move back.
                currentStep++;
                newState = 'Error';
            }

            // We need to remove the current
            currentObj.removeClass('Step1 Step2 Step3 Step4 Step5 Step6 Step7 Error');
            currentObj.addClass(newState);
            currentObj.trigger({
                type: 'StateChanged',
                newState: newState
            });
        };

        var moveForward = function() {
            switchState(options.startStep, transitionType.Forward);
        }

        var errorOccurred = function() {
            switchState(options.startStep, transitionType.Error);
        }

        var nextClick = function(e) {
            e.preventDefault();

            var valid = true;
            $.each(options.steps, function(i, data) {
                if (currentStep == data.step && typeof (data.onNext) == 'function') {
                    valid = data.onNext();
                }
            });

            if (valid == true) {
                switchState(options.startStep, transitionType.Forward);
            }
        };

        var backClick = function(e) {
            e.preventDefault();

            switchState(options.startStep, transitionType.Backward);
        };

        var resetClick = function(e) {
            e.preventDefault();

            if (typeof (options.onReset) == 'function') {
                options.onReset();
            }

            switchState(options.startStep, transitionType.Reset);
        };


        if (options.nextButton && options.nextButton.length > 0)
            $(options.nextButton).click(nextClick);

        if (options.backButton && options.backButton.length > 0)
            $(options.backButton).click(backClick);

        if (options.resetButton && options.resetButton.length > 0)
            $(options.resetButton).click(resetClick);

        return {
            MoveForward: moveForward,
            Error: errorOccurred
        }
    };
})(jQuery);