V4.Validator = function() {
    var validator;
    $.tools.validator.fn("[data-equals]", "Value not equal with some field", function(input) {
        var name = input.attr("data-equals"),
                field = this.getInputs().filter("[name=" + name + "]");
        return input.val() == field.val() ? true : [name];
    });

    var errorHandler = function(errors, event) {
        var getErrorType = function(errorMessage) {
            if ($.tools.validator.messages["[data-equals]"].en == errorMessage) return "equalToElement";
            return errorMessage == $.tools.validator.messages["[required]"].en ? "isMandatory" : "regex";
        };

        $.each(errors, function(index, error) {
            error.input.siblings('.error').hide();
            error.input.siblings('.error.' + getErrorType(error.messages[0])).show();
            error.input.addClass('hasError');
        });
    };

    var noErrorHandler = function(inputs) {
        inputs.siblings(".error").hide();
        inputs.removeClass('hasError');
    };

    $.tools.validator.addEffect("4viewers", errorHandler, noErrorHandler);

    this.init = function() {
        validator = $('.moduleID-FM01 form').validator({
            inputEvent: "blur",
            errorInputEvent:"blur",
            effect: "4viewers",
            onBeforeValidate: function(e, els){
                $.each(els, function(index, inputElement) {
                    var trimmedValue = jQuery.trim($(inputElement).val());
                    $(inputElement).val(trimmedValue);    
                });
            }
        });
    };

    this.getValidatorApi = function() {
        return validator.data("validator");
    }
};

