text: /**
   * Setup function for the plugin
   */
  (function ($) {
  
    'use strict';
  
  
    /**
     * A bit smarter split function
     * delimiter can be space, comma, dash or pipe
     * @param {String} val
     * @param {Function|String} [callback]
     * @returns {Array|void}
     */
    $.split = function (val, callback) {
      if (typeof callback !== 'function') {
        // return array
        if (!val) {
          return [];
        }
        var values = [];
        $.each(val.split(callback ? callback : /[,|\-\s]\s*/g),
          function (i, str) {
            str = $.trim(str);
            if (str.length) {
              values.push(str);
            }
          }
        );
        return values;
      } else if (val) {
        // exec callback func on each
        $.each(val.split(/[,|\-\s]\s*/g),
          function (i, str) {
            str = $.trim(str);
            if (str.length) {
              return callback(str, i);
            }
          }
        );
      }
    };
  
    /**
     * Short hand function that makes the validation setup require less code
     * @param conf
     */
    $.validate = function (conf) {
  
      var defaultConf = $.extend($.formUtils.defaultConfig(), {
        form: 'form',
        validateOnEvent: false,
        validateOnBlur: true,
        validateCheckboxRadioOnClick: true,
        showHelpOnFocus: true,
        addSuggestions: true,
        modules: '',
        onModulesLoaded: null,
        language: false,
        onSuccess: false,
        onError: false,
        onElementValidate: false
      });
  
      conf = $.extend(defaultConf, conf || {});
  
      if( conf.lang && conf.lang !== 'en' ) {
        var langModule = 'lang/'+conf.lang+'.js';
        conf.modules += conf.modules.length ? ','+langModule : langModule;
      }
  
      // Add validation to forms
      $(conf.form).each(function (i, form) {
  
        // Make a reference to the config for this form
        form.validationConfig = conf;
  
        // Trigger jQuery event that we're about to setup validation
        var $form = $(form);
        $.formUtils.$win.trigger('formValidationSetup', [$form, conf]);
        $form.trigger('formValidationSetup', [conf]);
  
        // Remove classes and event handlers that might have been
        // added by a previous call to $.validate
        $form.find('.has-help-txt')
            .unbind('focus.validation')
            .unbind('blur.validation');
  
        $form
          .removeClass('has-validation-callback')
          .unbind('submit.validation')
          .unbind('reset.validation')
          .find('input[data-validation],textarea[data-validation]')
            .unbind('blur.validation');
  
        // Validate when submitted
        $form.bind('submit.validation', function () {
  
          var $form = $(this);
  
          if ($.formUtils.haltValidation) {
            // pressing several times on submit button while validation is halted
            return false;
          }
  
          if ($.formUtils.isLoadingModules) {
            setTimeout(function () {
              $form.trigger('submit.validation');
            }, 200);
            return false;
          }
  
          var valid = $form.isValid(conf.language, conf);
  
          if ($.formUtils.haltValidation) {
            // Validation got halted by one of the validators
            return false;
          } else {
            if (valid && typeof conf.onSuccess === 'function') {
              var callbackResponse = conf.onSuccess($form);
              if (callbackResponse === false) {
                return false;
              }
            } else if (!valid && typeof conf.onError === 'function') {
              conf.onError($form);
              return false;
            } else {
              return valid;
            }
          }
        })
        .bind('reset.validation', function () {
          var $this = $(this),
              $elems = $this.find('.' + conf.errorElementClass + ',.valid');
          $this.find('.' + conf.errorMessageClass + '.alert').remove();
          $.formUtils.errorDialogs.removeErrorStyling($elems, conf);
        })
        .addClass('has-validation-callback');
  
        if (conf.showHelpOnFocus) {
          $form.showHelpOnFocus();
        }
        if (conf.addSuggestions) {
          $form.addSuggestions();
        }
        if (conf.validateOnBlur) {
          $form.validateOnBlur(conf.language, conf);
          $form.bind('html5ValidationAttrsFound', function () {
            $form.validateOnBlur(conf.language, conf);
          });
        }
        if (conf.validateOnEvent) {
          $form.validateOnEvent(conf.language, conf);
        }
      });
  
      if (conf.modules !== '') {
        $.formUtils.loadModules(conf.modules, false, function() {
          if (typeof conf.onModulesLoaded === 'function') {
            conf.onModulesLoaded();
          }
          $.formUtils.$win.trigger('validatorsLoaded', [typeof conf.form === 'string' ? $(conf.form) : conf.form, conf]);
        });
      }
    };
  
  })(jQuery);
  