 (function ($) {
     "use strict";
     var methods = {
         init: function (options) {
             var form = this;
             if (!form.data('jqv') || form.data('jqv') == null) {
                 options = methods._saveOptions(form, options);
                 $(document).on("click", ".formError", function () {
                     $(this).fadeOut(150, function () {
                         $(this).closest('.formError').remove()
                     })
                 })
             }
             return this
         }
         , attach: function (userOptions) {
             var form = this;
             var options;
             if (userOptions) options = methods._saveOptions(form, userOptions);
             else options = form.data('jqv');
             options.validateAttribute = (form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine" : "class";
             if (options.binded) {
                 form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
                 form.on("click", "[" + options.validateAttribute + "*=validate][type=checkbox],[" + options.validateAttribute + "*=validate][type=radio]", methods._onFieldEvent);
                 form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate][class*=datepicker]", {
                     "delay": 300
                 }, methods._onFieldEvent)
             }
             if (options.autoPositionUpdate) {
                 $(window).bind("resize", {
                     "noAnimation": !0
                     , "formElem": form
                 }, methods.updatePromptsPosition)
             }
             form.on("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
             form.removeData('jqv_submitButton');
             form.on("submit", methods._onSubmitEvent);
             return this
         }
         , detach: function () {
             var form = this;
             var options = form.data('jqv');
             form.off(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
             form.off("click", "[" + options.validateAttribute + "*=validate][type=checkbox],[" + options.validateAttribute + "*=validate][type=radio]", methods._onFieldEvent);
             form.off(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate][class*=datepicker]", methods._onFieldEvent);
             form.off("submit", methods._onSubmitEvent);
             form.removeData('jqv');
             form.off("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
             form.removeData('jqv_submitButton');
             if (options.autoPositionUpdate) $(window).off("resize", methods.updatePromptsPosition);
             return this
         }
         , validate: function (userOptions) {
             var element = $(this);
             var valid = null;
             var options;
             if (element.is("form") || element.hasClass("validationEngineContainer")) {
                 if (element.hasClass('validating')) {
                     return !1
                 }
                 else {
                     element.addClass('validating');
                     if (userOptions) options = methods._saveOptions(element, userOptions);
                     else options = element.data('jqv');
                     var valid = methods._validateFields(this);
                     setTimeout(function () {
                         element.removeClass('validating')
                     }, 100);
                     if (valid && options.onSuccess) {
                         options.onSuccess()
                     }
                     else if (!valid && options.onFailure) {
                         options.onFailure()
                     }
                 }
             }
             else if (element.is('form') || element.hasClass('validationEngineContainer')) {
                 element.removeClass('validating')
             }
             else {
                 var form = element.closest('form, .validationEngineContainer');
                 options = (form.data('jqv')) ? form.data('jqv') : $.validationEngine.defaults;
                 valid = methods._validateField(element, options);
                 if (valid && options.onFieldSuccess) options.onFieldSuccess();
                 else if (options.onFieldFailure && options.InvalidFields.length > 0) {
                     options.onFieldFailure()
                 }
                 return !valid
             }
             if (options.onValidationComplete) {
                 return !!options.onValidationComplete(form, valid)
             }
             return valid
         }
         , updatePromptsPosition: function (event) {
             if (event && this == window) {
                 var form = event.data.formElem;
                 var noAnimation = event.data.noAnimation
             }
             else var form = $(this.closest('form, .validationEngineContainer'));
             var options = form.data('jqv');
             if (!options) options = methods._saveOptions(form, options);
             form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function () {
                 var field = $(this);
                 if (options.prettySelect && field.is(":hidden")) field = form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
                 var prompt = methods._getPrompt(field);
                 var promptText = $(prompt).find(".formErrorContent").html();
                 if (prompt) methods._updatePrompt(field, $(prompt), promptText, undefined, !1, options, noAnimation)
             });
             return this
         }
         , showPrompt: function (promptText, type, promptPosition, showArrow) {
             var form = this.closest('form, .validationEngineContainer');
             var options = form.data('jqv');
             if (!options) options = methods._saveOptions(this, options);
             if (promptPosition) options.promptPosition = promptPosition;
             options.showArrow = showArrow == !0;
             methods._showPrompt(this, promptText, type, !1, options);
             return this
         }
         , hide: function () {
             var form = $(this).closest('form, .validationEngineContainer');
             var options = form.data('jqv');
             if (!options) options = methods._saveOptions(form, options);
             var fadeDuration = (options && options.fadeDuration) ? options.fadeDuration : 0.3;
             var closingtag;
             if ($(this).is("form") || $(this).hasClass("validationEngineContainer")) {
                 closingtag = "parentForm" + methods._getClassName($(this).attr("id"))
             }
             else {
                 closingtag = methods._getClassName($(this).attr("id")) + "formError"
             }
             $('.' + closingtag).fadeTo(fadeDuration, 0, function () {
                 $(this).closest('.formError').remove()
             });
             return this
         }
         , hideAll: function () {
             var form = this;
             var options = form.data('jqv');
             var duration = options ? options.fadeDuration : 300;
             $('.formError').fadeTo(duration, 0, function () {
                 $(this).closest('.formError').remove()
             });
             return this
         }
         , _onFieldEvent: function (event) {
             var field = $(this);
             var form = field.closest('form, .validationEngineContainer');
             var options = form.data('jqv');
             if (!options) options = methods._saveOptions(form, options);
             options.eventTrigger = "field";
             if (options.notEmpty == !0) {
                 if (field.val().length > 0) {
                     window.setTimeout(function () {
                         methods._validateField(field, options)
                     }, (event.data) ? event.data.delay : 0)
                 }
             }
             else {
                 window.setTimeout(function () {
                     methods._validateField(field, options)
                 }, (event.data) ? event.data.delay : 0)
             }
         }
         , _onSubmitEvent: function () {
             var form = $(this);
             var options = form.data('jqv');
             if (form.data("jqv_submitButton")) {
                 var submitButton = $("#" + form.data("jqv_submitButton"));
                 if (submitButton) {
                     if (submitButton.length > 0) {
                         if (submitButton.hasClass("validate-skip") || submitButton.attr("data-validation-engine-skip") == "true") return !0
                     }
                 }
             }
             options.eventTrigger = "submit";
             var r = methods._validateFields(form);
             if (r && options.ajaxFormValidation) {
                 methods._validateFormWithAjax(form, options);
                 return !1
             }
             if (options.onValidationComplete) {
                 return !!options.onValidationComplete(form, r)
             }
             return r
         }
         , _checkAjaxStatus: function (options) {
             var status = !0;
             $.each(options.ajaxValidCache, function (key, value) {
                 if (!value) {
                     status = !1;
                     return !1
                 }
             });
             return status
         }
         , _checkAjaxFieldStatus: function (fieldid, options) {
             return options.ajaxValidCache[fieldid] == !0
         }
         , _validateFields: function (form) {
             var options = form.data('jqv');
             var errorFound = !1;
             form.trigger("jqv.form.validating");
             var first_err = null;
             form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function () {
                 var field = $(this);
                 var names = [];
                 if ($.inArray(field.attr('name'), names) < 0) {
                     errorFound |= methods._validateField(field, options);
                     if (errorFound && first_err == null)
                         if (field.is(":hidden") && options.prettySelect) first_err = field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
                         else {
                             if (field.data('jqv-prompt-at') instanceof jQuery) {
                                 field = field.data('jqv-prompt-at')
                             }
                             else if (field.data('jqv-prompt-at')) {
                                 field = $(field.data('jqv-prompt-at'))
                             }
                             first_err = field
                         }
                     if (options.doNotShowAllErrosOnSubmit) return !1;
                     names.push(field.attr('name'));
                     if (options.showOneMessage == !0 && errorFound) {
                         return !1
                     }
                 }
             });
             form.trigger("jqv.form.result", [errorFound]);
             if (errorFound) {
                 if (options.scroll) {
                     var destination = first_err.offset().top;
                     var fixleft = first_err.offset().left;
                     var positionType = options.promptPosition;
                     if (typeof (positionType) == 'string' && positionType.indexOf(":") != -1) positionType = positionType.substring(0, positionType.indexOf(":"));
                     if (positionType != "bottomRight" && positionType != "bottomLeft") {
                         var prompt_err = methods._getPrompt(first_err);
                         if (prompt_err) {
                             destination = prompt_err.offset().top
                         }
                     }
                     if (options.scrollOffset) {
                         destination -= options.scrollOffset
                     }
                     if (options.isOverflown) {
                         var overflowDIV = $(options.overflownDIV);
                         if (!overflowDIV.length) return !1;
                         var scrollContainerScroll = overflowDIV.scrollTop();
                         var scrollContainerPos = -parseInt(overflowDIV.offset().top);
                         destination += scrollContainerScroll + scrollContainerPos - 5;
                         var scrollContainer = $(options.overflownDIV).filter(":not(:animated)");
                         scrollContainer.animate({
                             scrollTop: destination
                         }, 1100, function () {
                             if (options.focusFirstField) first_err.focus()
                         })
                     }
                     else {
                         $("html, body").animate({
                             scrollTop: destination
                         }, 1100, function () {
                             if (options.focusFirstField) first_err.focus()
                         });
                         $("html, body").animate({
                             scrollLeft: fixleft
                         }, 1100)
                     }
                 }
                 else if (options.focusFirstField) first_err.focus();
                 return !1
             }
             return !0
         }
         , _validateFormWithAjax: function (form, options) {
             var data = form.serialize();
             var type = (options.ajaxFormValidationMethod) ? options.ajaxFormValidationMethod : "GET";
             var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
             var dataType = (options.dataType) ? options.dataType : "json";
             $.ajax({
                 type: type
                 , url: url
                 , cache: !1
                 , dataType: dataType
                 , data: data
                 , form: form
                 , methods: methods
                 , options: options
                 , beforeSend: function () {
                     return options.onBeforeAjaxFormValidation(form, options)
                 }
                 , error: function (data, transport) {
                     if (options.onFailure) {
                         options.onFailure(data, transport)
                     }
                     else {
                         methods._ajaxError(data, transport)
                     }
                 }
                 , success: function (json) {
                     if ((dataType == "json") && (json !== !0)) {
                         var errorInForm = !1;
                         for (var i = 0; i < json.length; i++) {
                             var value = json[i];
                             var errorFieldId = value[0];
                             var errorField = $($("#" + errorFieldId)[0]);
                             if (errorField.length == 1) {
                                 var msg = value[2];
                                 if (value[1] == !0) {
                                     if (msg == "" || !msg) {
                                         methods._closePrompt(errorField)
                                     }
                                     else {
                                         if (options.allrules[msg]) {
                                             var txt = options.allrules[msg].alertTextOk;
                                             if (txt) msg = txt
                                         }
                                         if (options.showPrompts) methods._showPrompt(errorField, msg, "pass", !1, options, !0)
                                     }
                                 }
                                 else {
                                     errorInForm |= !0;
                                     if (options.allrules[msg]) {
                                         var txt = options.allrules[msg].alertText;
                                         if (txt) msg = txt
                                     }
                                     if (options.showPrompts) methods._showPrompt(errorField, msg, "", !1, options, !0)
                                 }
                             }
                         }
                         options.onAjaxFormComplete(!errorInForm, form, json, options)
                     }
                     else options.onAjaxFormComplete(!0, form, json, options)
                 }
             })
         }
         , _validateField: function (field, options, skipAjaxValidation) {
             if (!field.attr("id")) {
                 field.attr("id", "form-validation-field-" + $.validationEngine.fieldIdCounter);
                 ++$.validationEngine.fieldIdCounter
             }
             if (field.hasClass(options.ignoreFieldsWithClass)) return !1;
             if (!options.validateNonVisibleFields && (field.is(":hidden") && !options.prettySelect || field.parent().is(":hidden"))) return !1;
             var rulesParsing = field.attr(options.validateAttribute);
             var getRules = /validate\[(.*)\]/.exec(rulesParsing);
             if (!getRules) return !1;
             var str = getRules[1];
             var rules = str.split(/\[|,|\]/);
             var isAjaxValidator = !1;
             var fieldName = field.attr("name");
             var promptText = "";
             var promptType = "";
             var required = !1;
             var limitErrors = !1;
             options.isError = !1;
             options.showArrow = !0;
             if (options.maxErrorsPerField > 0) {
                 limitErrors = !0
             }
             var form = $(field.closest("form, .validationEngineContainer"));
             for (var i = 0; i < rules.length; i++) {
                 rules[i] = rules[i].replace(" ", "");
                 if (rules[i] === '') {
                     delete rules[i]
                 }
             }
             for (var i = 0, field_errors = 0; i < rules.length; i++) {
                 if (limitErrors && field_errors >= options.maxErrorsPerField) {
                     if (!required) {
                         var have_required = $.inArray('required', rules);
                         required = (have_required != -1 && have_required >= i)
                     }
                     break
                 }
                 var errorMsg = undefined;
                 switch (rules[i]) {
                 case "required":
                     required = !0;
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);
                     break;
                 case "custom":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);
                     break;
                 case "groupRequired":
                     var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                     var firstOfGroup = form.find(classGroup).eq(0);
                     if (firstOfGroup[0] != field[0]) {
                         methods._validateField(firstOfGroup, options, skipAjaxValidation);
                         options.showArrow = !0
                     }
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);
                     if (errorMsg) required = !0;
                     options.showArrow = !1;
                     break;
                 case "ajax":
                     errorMsg = methods._ajax(field, rules, i, options);
                     if (errorMsg) {
                         promptType = "load"
                     }
                     break;
                 case "minSize":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);
                     break;
                 case "maxSize":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);
                     break;
                 case "min":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);
                     break;
                 case "max":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);
                     break;
                 case "past":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._past);
                     break;
                 case "future":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._future);
                     break;
                 case "dateRange":
                     var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                     options.firstOfGroup = form.find(classGroup).eq(0);
                     options.secondOfGroup = form.find(classGroup).eq(1);
                     if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
                         errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateRange)
                     }
                     if (errorMsg) required = !0;
                     options.showArrow = !1;
                     break;
                 case "dateTimeRange":
                     var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                     options.firstOfGroup = form.find(classGroup).eq(0);
                     options.secondOfGroup = form.find(classGroup).eq(1);
                     if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
                         errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateTimeRange)
                     }
                     if (errorMsg) required = !0;
                     options.showArrow = !1;
                     break;
                 case "maxCheckbox":
                     field = $(form.find("input[name='" + fieldName + "']"));
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);
                     break;
                 case "minCheckbox":
                     field = $(form.find("input[name='" + fieldName + "']"));
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);
                     break;
                 case "equals":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);
                     break;
                 case "funcCall":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);
                     break;
                 case "creditCard":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);
                     break;
                 case "condRequired":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._condRequired);
                     if (errorMsg !== undefined) {
                         required = !0
                     }
                     break;
                 case "funcCallRequired":
                     errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCallRequired);
                     if (errorMsg !== undefined) {
                         required = !0
                     }
                     break;
                 default:
                 }
                 var end_validation = !1;
                 if (typeof errorMsg == "object") {
                     switch (errorMsg.status) {
                     case "_break":
                         end_validation = !0;
                         break;
                     case "_error":
                         errorMsg = errorMsg.message;
                         break;
                     case "_error_no_prompt":
                         return !0;
                         break;
                     default:
                         break
                     }
                 }
                 if (i == 0 && str.indexOf('funcCallRequired') == 0 && errorMsg !== undefined) {
                     promptText += errorMsg + "<br/>";
                     options.isError = !0;
                     field_errors++;
                     end_validation = !0
                 }
                 if (end_validation) {
                     break
                 }
                 if (typeof errorMsg == 'string') {
                     promptText += errorMsg + "<br/>";
                     options.isError = !0;
                     field_errors++
                 }
             }
             if (!required && !(field.val()) && field.val().length < 1 && $.inArray('equals', rules) < 0) options.isError = !1;
             var fieldType = field.prop("type");
             var positionType = field.data("promptPosition") || options.promptPosition;
             if ((fieldType == "radio" || fieldType == "checkbox") && form.find("input[name='" + fieldName + "']").size() > 1) {
                 if (positionType === 'inline') {
                     field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:last"))
                 }
                 else {
                     field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first"))
                 }
                 options.showArrow = options.showArrowOnRadioAndCheckbox
             }
             if (field.is(":hidden") && options.prettySelect) {
                 field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix)
             }
             if (options.isError && options.showPrompts) {
                 methods._showPrompt(field, promptText, promptType, !1, options)
             }
             else {
                 if (!isAjaxValidator) methods._closePrompt(field)
             }
             if (!isAjaxValidator) {
                 field.trigger("jqv.field.result", [field, options.isError, promptText])
             }
             var errindex = $.inArray(field[0], options.InvalidFields);
             if (errindex == -1) {
                 if (options.isError) options.InvalidFields.push(field[0])
             }
             else if (!options.isError) {
                 options.InvalidFields.splice(errindex, 1)
             }
             methods._handleStatusCssClasses(field, options);
             if (options.isError && options.onFieldFailure) options.onFieldFailure(field);
             if (!options.isError && options.onFieldSuccess) options.onFieldSuccess(field);
             return options.isError
         }
         , _handleStatusCssClasses: function (field, options) {
             if (options.addSuccessCssClassToField) field.removeClass(options.addSuccessCssClassToField);
             if (options.addFailureCssClassToField) field.removeClass(options.addFailureCssClassToField);
             if (options.addSuccessCssClassToField && !options.isError) field.addClass(options.addSuccessCssClassToField);
             if (options.addFailureCssClassToField && options.isError) field.addClass(options.addFailureCssClassToField)
         }
         , _getErrorMessage: function (form, field, rule, rules, i, options, originalValidationMethod) {
             var rule_index = jQuery.inArray(rule, rules);
             if (rule === "custom" || rule === "funcCall" || rule === "funcCallRequired") {
                 var custom_validation_type = rules[rule_index + 1];
                 rule = rule + "[" + custom_validation_type + "]";
                 delete(rules[rule_index])
             }
             var alteredRule = rule;
             var element_classes = (field.attr("data-validation-engine")) ? field.attr("data-validation-engine") : field.attr("class");
             var element_classes_array = element_classes.split(" ");
             var errorMsg;
             if (rule == "future" || rule == "past" || rule == "maxCheckbox" || rule == "minCheckbox") {
                 errorMsg = originalValidationMethod(form, field, rules, i, options)
             }
             else {
                 errorMsg = originalValidationMethod(field, rules, i, options)
             }
             if (errorMsg != undefined) {
                 var custom_message = methods._getCustomErrorMessage($(field), element_classes_array, alteredRule, options);
                 if (custom_message) errorMsg = custom_message
             }
             return errorMsg
         }
         , _getCustomErrorMessage: function (field, classes, rule, options) {
             var custom_message = !1;
             var validityProp = /^custom\[.*\]$/.test(rule) ? methods._validityProp.custom : methods._validityProp[rule];
             if (validityProp != undefined) {
                 custom_message = field.attr("data-errormessage-" + validityProp);
                 if (custom_message != undefined) return custom_message
             }
             custom_message = field.attr("data-errormessage");
             if (custom_message != undefined) return custom_message;
             var id = '#' + field.attr("id");
             if (typeof options.custom_error_messages[id] != "undefined" && typeof options.custom_error_messages[id][rule] != "undefined") {
                 custom_message = options.custom_error_messages[id][rule].message
             }
             else if (classes.length > 0) {
                 for (var i = 0; i < classes.length && classes.length > 0; i++) {
                     var element_class = "." + classes[i];
                     if (typeof options.custom_error_messages[element_class] != "undefined" && typeof options.custom_error_messages[element_class][rule] != "undefined") {
                         custom_message = options.custom_error_messages[element_class][rule].message;
                         break
                     }
                 }
             }
             if (!custom_message && typeof options.custom_error_messages[rule] != "undefined" && typeof options.custom_error_messages[rule].message != "undefined") {
                 custom_message = options.custom_error_messages[rule].message
             }
             return custom_message
         }
         , _validityProp: {
             "required": "value-missing"
             , "custom": "custom-error"
             , "groupRequired": "value-missing"
             , "ajax": "custom-error"
             , "minSize": "range-underflow"
             , "maxSize": "range-overflow"
             , "min": "range-underflow"
             , "max": "range-overflow"
             , "past": "type-mismatch"
             , "future": "type-mismatch"
             , "dateRange": "type-mismatch"
             , "dateTimeRange": "type-mismatch"
             , "maxCheckbox": "range-overflow"
             , "minCheckbox": "range-underflow"
             , "equals": "pattern-mismatch"
             , "funcCall": "custom-error"
             , "funcCallRequired": "custom-error"
             , "creditCard": "pattern-mismatch"
             , "condRequired": "value-missing"
         }
         , _required: function (field, rules, i, options, condRequired) {
             switch (field.prop("type")) {
             case "radio":
             case "checkbox":
                 if (condRequired) {
                     if (!field.prop('checked')) {
                         return options.allrules[rules[i]].alertTextCheckboxMultiple
                     }
                     break
                 }
                 var form = field.closest("form, .validationEngineContainer");
                 var name = field.attr("name");
                 if (form.find("input[name='" + name + "']:checked").size() == 0) {
                     if (form.find("input[name='" + name + "']:visible").size() == 1) return options.allrules[rules[i]].alertTextCheckboxe;
                     else return options.allrules[rules[i]].alertTextCheckboxMultiple
                 }
                 break;
             case "text":
             case "password":
             case "textarea":
             case "file":
             case "select-one":
             case "select-multiple":
             default:
                 var field_val = $.trim(field.val());
                 var dv_placeholder = $.trim(field.attr("data-validation-placeholder"));
                 var placeholder = $.trim(field.attr("placeholder"));
                 if ((!field_val) || (dv_placeholder && field_val == dv_placeholder) || (placeholder && field_val == placeholder)) {
                     return options.allrules[rules[i]].alertText
                 }
                 break
             }
         }
         , _groupRequired: function (field, rules, i, options) {
             var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
             var isValid = !1;
             field.closest("form, .validationEngineContainer").find(classGroup).each(function () {
                 if (!methods._required($(this), rules, i, options)) {
                     isValid = !0;
                     return !1
                 }
             });
             if (!isValid) {
                 return options.allrules[rules[i]].alertText
             }
         }
         , _custom: function (field, rules, i, options) {
             var customRule = rules[i + 1];
             var rule = options.allrules[customRule];
             var fn;
             if (!rule) {
                 alert("jqv:custom rule not found - " + customRule);
                 return
             }
             if (rule.regex) {
                 var ex = rule.regex;
                 if (!ex) {
                     alert("jqv:custom regex not found - " + customRule);
                     return
                 }
                 var pattern = new RegExp(ex);
                 if (!pattern.test(field.val())) return options.allrules[customRule].alertText
             }
             else if (rule.func) {
                 fn = rule.func;
                 if (typeof (fn) !== "function") {
                     alert("jqv:custom parameter 'function' is no function - " + customRule);
                     return
                 }
                 if (!fn(field, rules, i, options)) return options.allrules[customRule].alertText
             }
             else {
                 alert("jqv:custom type not allowed " + customRule);
                 return
             }
         }
         , _funcCall: function (field, rules, i, options) {
             var functionName = rules[i + 1];
             var fn;
             if (functionName.indexOf('.') > -1) {
                 var namespaces = functionName.split('.');
                 var scope = window;
                 while (namespaces.length) {
                     scope = scope[namespaces.shift()]
                 }
                 fn = scope
             }
             else fn = window[functionName] || options.customFunctions[functionName];
             if (typeof (fn) == 'function') return fn(field, rules, i, options)
         }
         , _funcCallRequired: function (field, rules, i, options) {
             return methods._funcCall(field, rules, i, options)
         }
         , _equals: function (field, rules, i, options) {
             var equalsField = rules[i + 1];
             if (field.val() != $("#" + equalsField).val()) return options.allrules.equals.alertText
         }
         , _maxSize: function (field, rules, i, options) {
             var max = rules[i + 1];
             var len = field.val().length;
             if (len > max) {
                 var rule = options.allrules.maxSize;
                 return rule.alertText + max + rule.alertText2
             }
         }
         , _minSize: function (field, rules, i, options) {
             var min = rules[i + 1];
             var len = field.val().length;
             if (len < min) {
                 var rule = options.allrules.minSize;
                 return rule.alertText + min + rule.alertText2
             }
         }
         , _min: function (field, rules, i, options) {
             var min = parseFloat(rules[i + 1]);
             var len = parseFloat(field.val());
             if (len < min) {
                 var rule = options.allrules.min;
                 if (rule.alertText2) return rule.alertText + min + rule.alertText2;
                 return rule.alertText + min
             }
         }
         , _max: function (field, rules, i, options) {
             var max = parseFloat(rules[i + 1]);
             var len = parseFloat(field.val());
             if (len > max) {
                 var rule = options.allrules.max;
                 if (rule.alertText2) return rule.alertText + max + rule.alertText2;
                 return rule.alertText + max
             }
         }
         , _past: function (form, field, rules, i, options) {
             var p = rules[i + 1];
             var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
             var pdate;
             if (p.toLowerCase() == "now") {
                 pdate = new Date()
             }
             else if (undefined != fieldAlt.val()) {
                 if (fieldAlt.is(":disabled")) return;
                 pdate = methods._parseDate(fieldAlt.val())
             }
             else {
                 pdate = methods._parseDate(p)
             }
             var vdate = methods._parseDate(field.val());
             if (vdate > pdate) {
                 var rule = options.allrules.past;
                 if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
                 return rule.alertText + methods._dateToString(pdate)
             }
         }
         , _future: function (form, field, rules, i, options) {
             var p = rules[i + 1];
             var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
             var pdate;
             if (p.toLowerCase() == "now") {
                 pdate = new Date()
             }
             else if (undefined != fieldAlt.val()) {
                 if (fieldAlt.is(":disabled")) return;
                 pdate = methods._parseDate(fieldAlt.val())
             }
             else {
                 pdate = methods._parseDate(p)
             }
             var vdate = methods._parseDate(field.val());
             if (vdate < pdate) {
                 var rule = options.allrules.future;
                 if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
                 return rule.alertText + methods._dateToString(pdate)
             }
         }
         , _isDate: function (value) {
             var dateRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/);
             return dateRegEx.test(value)
         }
         , _isDateTime: function (value) {
             var dateTimeRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/);
             return dateTimeRegEx.test(value)
         }
         , _dateCompare: function (start, end) {
             return (new Date(start.toString()) < new Date(end.toString()))
         }
         , _dateRange: function (field, rules, i, options) {
             if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
             if (!methods._isDate(options.firstOfGroup[0].value) || !methods._isDate(options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
             if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
         }
         , _dateTimeRange: function (field, rules, i, options) {
             if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
             if (!methods._isDateTime(options.firstOfGroup[0].value) || !methods._isDateTime(options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
             if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
                 return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2
             }
         }
         , _maxCheckbox: function (form, field, rules, i, options) {
             var nbCheck = rules[i + 1];
             var groupname = field.attr("name");
             var groupSize = form.find("input[name='" + groupname + "']:checked").size();
             if (groupSize > nbCheck) {
                 options.showArrow = !1;
                 if (options.allrules.maxCheckbox.alertText2) return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
                 return options.allrules.maxCheckbox.alertText
             }
         }
         , _minCheckbox: function (form, field, rules, i, options) {
             var nbCheck = rules[i + 1];
             var groupname = field.attr("name");
             var groupSize = form.find("input[name='" + groupname + "']:checked").size();
             if (groupSize < nbCheck) {
                 options.showArrow = !1;
                 return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + options.allrules.minCheckbox.alertText2
             }
         }
         , _creditCard: function (field, rules, i, options) {
             var valid = !1
                 , cardNumber = field.val().replace(/ +/g, '').replace(/-+/g, '');
             var numDigits = cardNumber.length;
             if (numDigits >= 14 && numDigits <= 16 && parseInt(cardNumber) > 0) {
                 var sum = 0
                     , i = numDigits - 1
                     , pos = 1
                     , digit, luhn = new String();
                 do {
                     digit = parseInt(cardNumber.charAt(i));
                     luhn += (pos++ % 2 == 0) ? digit * 2 : digit
                 } while (--i >= 0)
                 for (i = 0; i < luhn.length; i++) {
                     sum += parseInt(luhn.charAt(i))
                 }
                 valid = sum % 10 == 0
             }
             if (!valid) return options.allrules.creditCard.alertText
         }
         , _ajax: function (field, rules, i, options) {
             var errorSelector = rules[i + 1];
             var rule = options.allrules[errorSelector];
             var extraData = rule.extraData;
             var extraDataDynamic = rule.extraDataDynamic;
             var data = {
                 "fieldId": field.attr("id")
                 , "fieldValue": field.val()
             };
             if (typeof extraData === "object") {
                 $.extend(data, extraData)
             }
             else if (typeof extraData === "string") {
                 var tempData = extraData.split("&");
                 for (var i = 0; i < tempData.length; i++) {
                     var values = tempData[i].split("=");
                     if (values[0] && values[0]) {
                         data[values[0]] = values[1]
                     }
                 }
             }
             if (extraDataDynamic) {
                 var tmpData = [];
                 var domIds = String(extraDataDynamic).split(",");
                 for (var i = 0; i < domIds.length; i++) {
                     var id = domIds[i];
                     if ($(id).length) {
                         var inputValue = field.closest("form, .validationEngineContainer").find(id).val();
                         var keyValue = id.replace('#', '') + '=' + escape(inputValue);
                         data[id.replace('#', '')] = inputValue
                     }
                 }
             }
             if (options.eventTrigger == "field") {
                 delete(options.ajaxValidCache[field.attr("id")])
             }
             if (!options.isError && !methods._checkAjaxFieldStatus(field.attr("id"), options)) {
                 $.ajax({
                     type: options.ajaxFormValidationMethod
                     , url: rule.url
                     , cache: !1
                     , dataType: "json"
                     , data: data
                     , field: field
                     , rule: rule
                     , methods: methods
                     , options: options
                     , beforeSend: function () {}
                     , error: function (data, transport) {
                         if (options.onFailure) {
                             options.onFailure(data, transport)
                         }
                         else {
                             methods._ajaxError(data, transport)
                         }
                     }
                     , success: function (json) {
                         var errorFieldId = json[0];
                         var errorField = $("#" + errorFieldId).eq(0);
                         if (errorField.length == 1) {
                             var status = json[1];
                             var msg = json[2];
                             if (!status) {
                                 options.ajaxValidCache[errorFieldId] = !1;
                                 options.isError = !0;
                                 if (msg) {
                                     if (options.allrules[msg]) {
                                         var txt = options.allrules[msg].alertText;
                                         if (txt) {
                                             msg = txt
                                         }
                                     }
                                 }
                                 else msg = rule.alertText;
                                 if (options.showPrompts) methods._showPrompt(errorField, msg, "", !0, options)
                             }
                             else {
                                 options.ajaxValidCache[errorFieldId] = !0;
                                 if (msg) {
                                     if (options.allrules[msg]) {
                                         var txt = options.allrules[msg].alertTextOk;
                                         if (txt) {
                                             msg = txt
                                         }
                                     }
                                 }
                                 else msg = rule.alertTextOk;
                                 if (options.showPrompts) {
                                     if (msg) methods._showPrompt(errorField, msg, "pass", !0, options);
                                     else methods._closePrompt(errorField)
                                 }
                                 if (options.eventTrigger == "submit") field.closest("form").submit()
                             }
                         }
                         errorField.trigger("jqv.field.result", [errorField, options.isError, msg])
                     }
                 });
                 return rule.alertTextLoad
             }
         }
         , _ajaxError: function (data, transport) {
             if (data.status == 0 && transport == null) alert("The page is not served from a server! ajax call failed");
             else if (typeof console != "undefined") console.log("Ajax error: " + data.status + " " + transport)
         }
         , _dateToString: function (date) {
             return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate()
         }
         , _parseDate: function (d) {
             var dateParts = d.split("-");
             if (dateParts == d) dateParts = d.split("/");
             if (dateParts == d) {
                 dateParts = d.split(".");
                 return new Date(dateParts[2], (dateParts[1] - 1), dateParts[0])
             }
             return new Date(dateParts[0], (dateParts[1] - 1), dateParts[2])
         }
         , _showPrompt: function (field, promptText, type, ajaxed, options, ajaxform) {
             if (field.data('jqv-prompt-at') instanceof jQuery) {
                 field = field.data('jqv-prompt-at')
             }
             else if (field.data('jqv-prompt-at')) {
                 field = $(field.data('jqv-prompt-at'))
             }
             var prompt = methods._getPrompt(field);
             if (ajaxform) prompt = !1;
             if ($.trim(promptText)) {
                 if (prompt) methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
                 else methods._buildPrompt(field, promptText, type, ajaxed, options)
             }
         }
         , _buildPrompt: function (field, promptText, type, ajaxed, options) {
             var prompt = $('<div>');
             prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
             prompt.addClass("parentForm" + methods._getClassName(field.closest('form, .validationEngineContainer').attr("id")));
             prompt.addClass("formError");
             switch (type) {
             case "pass":
                 prompt.addClass("greenPopup");
                 break;
             case "load":
                 prompt.addClass("blackPopup");
                 break;
             default:
             }
             if (ajaxed) prompt.addClass("ajaxed");
             var promptContent = $('<div>').addClass("formErrorContent").html(promptText).appendTo(prompt);
             var positionType = field.data("promptPosition") || options.promptPosition;
             if (options.showArrow) {
                 var arrow = $('<div>').addClass("formErrorArrow");
                 if (typeof (positionType) == 'string') {
                     var pos = positionType.indexOf(":");
                     if (pos != -1) positionType = positionType.substring(0, pos)
                 }
                 switch (positionType) {
                 case "bottomLeft":
                 case "bottomRight":
                     prompt.find(".formErrorContent").before(arrow);
                     arrow.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
                     break;
                 case "topLeft":
                 case "topRight":
                     arrow.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
                     prompt.append(arrow);
                     break
                 }
             }
             if (options.addPromptClass) prompt.addClass(options.addPromptClass);
             var requiredOverride = field.attr('data-required-class');
             if (requiredOverride !== undefined) {
                 prompt.addClass(requiredOverride)
             }
             else {
                 if (options.prettySelect) {
                     if ($('#' + field.attr('id')).next().is('select')) {
                         var prettyOverrideClass = $('#' + field.attr('id').substr(options.usePrefix.length).substring(options.useSuffix.length)).attr('data-required-class');
                         if (prettyOverrideClass !== undefined) {
                             prompt.addClass(prettyOverrideClass)
                         }
                     }
                 }
             }
             prompt.css({
                 "opacity": 0
             });
             if (positionType === 'inline') {
                 prompt.addClass("inline");
                 if (typeof field.attr('data-prompt-target') !== 'undefined' && $('#' + field.attr('data-prompt-target')).length > 0) {
                     prompt.appendTo($('#' + field.attr('data-prompt-target')))
                 }
                 else {
                     field.after(prompt)
                 }
             }
             else {
                 field.before(prompt)
             }
             var pos = methods._calculatePosition(field, prompt, options);
             prompt.css({
                 'position': positionType === 'inline' ? 'relative' : 'absolute'
                 , "top": pos.callerTopPosition
                 , "left": pos.callerleftPosition
                 , "marginTop": pos.marginTopSize
                 , "opacity": 0
             }).data("callerField", field);
             if (options.autoHidePrompt) {
                 setTimeout(function () {
                     prompt.animate({
                         "opacity": 0
                     }, function () {
                         prompt.closest('.formError').remove()
                     })
                 }, options.autoHideDelay)
             }
             return prompt.animate({
                 "opacity": 0.87
             })
         }
         , _updatePrompt: function (field, prompt, promptText, type, ajaxed, options, noAnimation) {
             if (prompt) {
                 if (typeof type !== "undefined") {
                     if (type == "pass") prompt.addClass("greenPopup");
                     else prompt.removeClass("greenPopup");
                     if (type == "load") prompt.addClass("blackPopup");
                     else prompt.removeClass("blackPopup")
                 }
                 if (ajaxed) prompt.addClass("ajaxed");
                 else prompt.removeClass("ajaxed");
                 prompt.find(".formErrorContent").html(promptText);
                 var pos = methods._calculatePosition(field, prompt, options);
                 var css = {
                     "top": pos.callerTopPosition
                     , "left": pos.callerleftPosition
                     , "marginTop": pos.marginTopSize
                     , "opacity": 0.87
                 };
                 prompt.css({
                     "opacity": 0
                     , "display": "block"
                 });
                 if (noAnimation) prompt.css(css);
                 else prompt.animate(css)
             }
         }
         , _closePrompt: function (field) {
             var prompt = methods._getPrompt(field);
             if (prompt) prompt.fadeTo("fast", 0, function () {
                 prompt.closest('.formError').remove()
             })
         }
         , closePrompt: function (field) {
             return methods._closePrompt(field)
         }
         , _getPrompt: function (field) {
             var formId = $(field).closest('form, .validationEngineContainer').attr('id');
             var className = methods._getClassName(field.attr("id")) + "formError";
             var match = $("." + methods._escapeExpression(className) + '.parentForm' + methods._getClassName(formId))[0];
             if (match) return $(match)
         }
         , _escapeExpression: function (selector) {
             return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1")
         }
         , isRTL: function (field) {
             var $document = $(document);
             var $body = $('body');
             var rtl = (field && field.hasClass('rtl')) || (field && (field.attr('dir') || '').toLowerCase() === 'rtl') || $document.hasClass('rtl') || ($document.attr('dir') || '').toLowerCase() === 'rtl' || $body.hasClass('rtl') || ($body.attr('dir') || '').toLowerCase() === 'rtl';
             return Boolean(rtl)
         }
         , _calculatePosition: function (field, promptElmt, options) {
             var promptTopPosition, promptleftPosition, marginTopSize;
             var fieldWidth = field.width();
             var fieldLeft = field.position().left;
             var fieldTop = field.position().top;
             var fieldHeight = field.height();
             var promptHeight = promptElmt.height();
             promptTopPosition = promptleftPosition = 0;
             marginTopSize = -promptHeight;
             var positionType = field.data("promptPosition") || options.promptPosition;
             var shift1 = "";
             var shift2 = "";
             var shiftX = 0;
             var shiftY = 0;
             if (typeof (positionType) == 'string') {
                 if (positionType.indexOf(":") != -1) {
                     shift1 = positionType.substring(positionType.indexOf(":") + 1);
                     positionType = positionType.substring(0, positionType.indexOf(":"));
                     if (shift1.indexOf(",") != -1) {
                         shift2 = shift1.substring(shift1.indexOf(",") + 1);
                         shift1 = shift1.substring(0, shift1.indexOf(","));
                         shiftY = parseInt(shift2);
                         if (isNaN(shiftY)) shiftY = 0
                     };
                     shiftX = parseInt(shift1);
                     if (isNaN(shift1)) shift1 = 0
                 }
             };
             switch (positionType) {
                 default:
                 case "topRight":
                     promptleftPosition += fieldLeft + fieldWidth - 27;promptTopPosition += fieldTop;
                 break;
             case "topLeft":
                     promptTopPosition += fieldTop;promptleftPosition += fieldLeft;
                 break;
             case "centerRight":
                     promptTopPosition = fieldTop + 4;marginTopSize = 0;promptleftPosition = fieldLeft + field.outerWidth(!0) + 5;
                 break;
             case "centerLeft":
                     promptleftPosition = fieldLeft - (promptElmt.width() + 2);promptTopPosition = fieldTop + 4;marginTopSize = 0;
                 break;
             case "bottomLeft":
                     promptTopPosition = fieldTop + field.height() + 5;marginTopSize = 0;promptleftPosition = fieldLeft;
                 break;
             case "bottomRight":
                     promptleftPosition = fieldLeft + fieldWidth - 27;promptTopPosition = fieldTop + field.height() + 5;marginTopSize = 0;
                 break;
             case "inline":
                     promptleftPosition = 0;promptTopPosition = 0;marginTopSize = 0
             };
             promptleftPosition += shiftX;
             promptTopPosition += shiftY;
             return {
                 "callerTopPosition": promptTopPosition + "px"
                 , "callerleftPosition": promptleftPosition + "px"
                 , "marginTopSize": marginTopSize + "px"
             }
         }
         , _saveOptions: function (form, options) {
             if ($.validationEngineLanguage) var allRules = $.validationEngineLanguage.allRules;
             else $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
             $.validationEngine.defaults.allrules = allRules;
             var userOptions = $.extend(!0, {}, $.validationEngine.defaults, options);
             form.data('jqv', userOptions);
             return userOptions
         }
         , _getClassName: function (className) {
             if (className) return className.replace(/:/g, "_").replace(/\./g, "_")
         }
         , _jqSelector: function (str) {
             return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1')
         }
         , _condRequired: function (field, rules, i, options) {
             var idx, dependingField;
             for (idx = (i + 1); idx < rules.length; idx++) {
                 dependingField = jQuery("#" + rules[idx]).first();
                 if (dependingField.length && methods._required(dependingField, ["required"], 0, options, !0) == undefined) {
                     return methods._required(field, ["required"], 0, options)
                 }
             }
         }
         , _submitButtonClick: function (event) {
             var button = $(this);
             var form = button.closest('form, .validationEngineContainer');
             form.data("jqv_submitButton", button.attr("id"))
         }
     };
     $.fn.validationEngine = function (method) {
         var form = $(this);
         if (!form[0]) return form;
         if (typeof (method) == 'string' && method.charAt(0) != '_' && methods[method]) {
             if (method != "showPrompt" && method != "hide" && method != "hideAll") methods.init.apply(form);
             return methods[method].apply(form, Array.prototype.slice.call(arguments, 1))
         }
         else if (typeof method == 'object' || !method) {
             methods.init.apply(form, arguments);
             return methods.attach.apply(form)
         }
         else {
             $.error('Method ' + method + ' does not exist in jQuery.validationEngine')
         }
     };
     $.validationEngine = {
         fieldIdCounter: 0
         , defaults: {
             validationEventTrigger: "blur"
             , scroll: !0
             , focusFirstField: !0
             , showPrompts: !0
             , validateNonVisibleFields: !1
             , ignoreFieldsWithClass: 'ignoreMe'
             , promptPosition: "topRight"
             , bindMethod: "bind"
             , inlineAjax: !1
             , ajaxFormValidation: !1
             , ajaxFormValidationURL: !1
             , ajaxFormValidationMethod: 'get'
             , onAjaxFormComplete: $.noop
             , onBeforeAjaxFormValidation: $.noop
             , onValidationComplete: !1
             , doNotShowAllErrosOnSubmit: !1
             , custom_error_messages: {}
             , binded: !0
             , notEmpty: !1
             , showArrow: !0
             , showArrowOnRadioAndCheckbox: !1
             , isError: !1
             , maxErrorsPerField: !1
             , ajaxValidCache: {}
             , autoPositionUpdate: !1
             , InvalidFields: []
             , onFieldSuccess: !1
             , onFieldFailure: !1
             , onSuccess: !1
             , onFailure: !1
             , validateAttribute: "class"
             , addSuccessCssClassToField: ""
             , addFailureCssClassToField: ""
             , autoHidePrompt: !1
             , autoHideDelay: 10000
             , fadeDuration: 300
             , prettySelect: !1
             , addPromptClass: ""
             , usePrefix: ""
             , useSuffix: ""
             , showOneMessage: !1
         }
     };
     $(function () {
         $.validationEngine.defaults.promptPosition = methods.isRTL() ? 'topLeft' : "topRight"
     })
 })(jQuery)