﻿(function($) {
    $.fn.stepprocess = function(options) {
        var opts = $.extend({}, $.fn.stepprocess.defaults, options);

        return this.each(function() {
            var item = $(this);

            _hideInternalDivs(item);
            _setupControllers(item, opts);

            item.find("div:first").show();
        });
    };

    $.fn.stepprocess.defaults = {
        events: null,
        errorMessage: "There are errors on this form.",
        errorCssClass: "error",
        itemErrorMessage: "There is an error on with this item."
    };

    function _hideInternalDivs(obj) {
        obj.children("div").hide();
    };

    function _setupControllers(obj, opts) {
        obj.children("div").each(function() {
            var item = $(this);

            item.find("input:button").click(function() {
                var itemButton = $(this);
                var itemText = itemButton.val();

                if (itemText.toLowerCase() == "start" || itemText.toLowerCase() == "next" || itemText.toLowerCase() == "submit") {
                    var valid = true;
                    valid = _formValid(item, opts);

                    var errorMessage = $("<h2 id='errorMessage'>" + opts.errorMessage + "</h2>");

                    item.find("#errorMessage").remove();

                    if (valid) {
                        if (opts.events != null) {
                            for (var i = 0; i < opts.events.length; i++) {
                                if (opts.events[i].control == itemButton[0].id) {
                                    opts.events[i].event(valid);
                                }
                            }
                        }

                        item.hide();
                        item.next("div").show();
                    }
                    else {
                        item.prepend(errorMessage);
                    }
                } else if (itemText.toLowerCase() == "previous") {
                    item.hide();
                    item.prev("div").show();
                }
            });
        })
    };

    function _formValid(item, opts) {
        var valid = true;

        item.find("input.validation").each(function() {
            var inputItem = $(this);
            var data = inputItem.metadata();

            inputItem.removeClass(opts.errorCssClass);
            inputItem.parent().find("#" + inputItem[0].id + "Error").remove();

            var dataType = null;

            if (data.datatype == undefined) {
                dataType = "required";
            }
            else {
                dataType = data.datatype.toString();
            }

            switch (dataType) {
                case "int":
                    if (inputItem.val() != "") {
                        var r = new RegExp(/^\d+$/);

                        if (!inputItem.val().match(r)) {
                            var itemErrorMessage = opts.itemErrorMessage;

                            if (data.itemErrorMessage != null) {
                                itemErrorMessage = data.itemErrorMessage;
                            }

                            inputItem.addClass(opts.errorCssClass);
                            inputItem.parent().append("<span id='" + inputItem[0].id + "Error'>" + itemErrorMessage + "</span>");
                            valid = false;
                        }
                    }
                    break;
                case "required":
                default:
                    if (inputItem.val() == "") {
                        inputItem.addClass(opts.errorCssClass);
                        inputItem.parent().append("<span id='" + inputItem[0].id + "Error'>" + opts.itemErrorMessage + "</span>");
                        valid = false;
                    }
                    break;
            }
        });

        return valid;
    }
})(jQuery);