PageSourceSearch

https://rowen.ru/local/static/build/js/doubleValidate.js

js rowen.ru collected 2026-10-05 03:47:34 UTC 6,972 bytes, 238 lines download raw bytes

1/* ========================================================================
2 * Jquery Double Validate v1.1.0
3 * https://github.com/north-leshiy/double-validate
4 * ======================================================================== */
5;(function ($) {
6
7	var defaults = {
8		urlHandler:                ''
9		, params:                  {
10			scrollToTopOnError: false,
11			borderColorOnError: false,
12			errorMessageClass:  'error',
13			language : myLanguage
14		}
15		, ajaxMethod:              document.location.host === 'localhost:8080' ? 'GET' : 'POST'
16		, errorMessage:            'Спасибо за отправку формы!\n' +
17									   'Однако что-то пошло не так и мы не смогли получить данные.\n' +
18									   'Перезвоните нам или попробуйте отправить еще раз позже.'
19		, errorMessageNetwork:     'Отсутствует соедиение с сайтом, проверьте соедиенение с интернетом ии попробуйте отправить позже'
20		, classMainErrorContainer: 'double-validate__main-error-container'
21		, classMainErrorItem:      'double-validate__main-error-item'
22		, showErrorMessage:        true
23		, reportErrorToListener:   false
24		, urlErrorListener:        'https://error-listener.w6p.ru/'
25
26		// callbacks
27		, onBeforeSend: 		   function () {}
28		, onServerValidateSuccess: function () {}
29		, onServerValidateError:   function () {}
30		, onBlockedForm:           function () {}
31		, onUnBlockedForm:         function () {}
32		, onErrorRequest:          function () {}
33		, sendErrorToListener:     function (errorData, widget) {
34			if (!widget.config.urlErrorListener) {
35				return;
36			}
37
38			var formTextData = widget.$form.serialize();
39			var requestInfo  = {
40				formTextData: formTextData,
41				responseCode: errorData.status,
42				statusText: errorData.statusText,
43				readyState: errorData.readyState,
44				responseText: errorData.responseText
45			};
46
47			$.ajax({
48				url:         widget.config.urlErrorListener,
49				type:        'POST',
50				dataType:    'json',
51				data:        requestInfo
52			});
53		}
54
55		// callback alias for compatibility
56		, validateSuccess: function () {}
57		, validateError:   function () {}
58	};
59
60	/**
61	 * DoubleValidate constructor
62	 */
63	var DoubleValidate = function ($form, options) {
64		var widget    = this;
65		widget.config = $.extend(true, {}, defaults, options);
66		widget.$form  = $form;
67
68		/**
69		 * Обработка событий
70		 */
71		$.each(widget.config, function (name, value) {
72			if (typeof value === 'function') {
73				widget.$form.on(name + '.doubleValidate', (function (event, data) {
74					return value(data, widget);
75				}))
76			}
77		});
78
79		widget.init();
80	};
81
82	DoubleValidate.prototype = {
83		/**
84		 * Конструктор
85		 * @return {void}
86		 */
87		init: function () {
88			var widget = this;
89
90			widget.$form.on('submit', function (event) {
91				event.preventDefault();
92			});
93
94			// Отключаем нативную валидацию
95			widget.$form.attr('novalidate', 'novalidate');
96
97			// Устанавливаем адрес обработчика
98			if (widget.config.urlHandler === '') {
99				widget.config.urlHandler = widget.$form.attr('action');
100			}
101
102			// Навешиваем обработку плагина validator
103			var validateParams = {
104				form:      '#' + widget.$form.attr('id'),
105				onSuccess: function () {
106					widget.ajaxHandler();
107				}
108			};
109			validateParams     = $.extend(true, {}, validateParams, widget.config.params);
110
111			$.validate(validateParams);
112		},
113
114		/**
115		 * Главный ajax handler
116		 * @return {void}
117		 */
118		ajaxHandler: function () {
119			var widget = this;
120
121			if (widget.formBlocked) {
122				console.error('Дублирующий ajax запрос');
123				return;
124			}
125
126			widget.blockForm();
127
128			var formData = new FormData(widget.$form.get()[0]);
129
130			widget.$form.trigger('onBeforeSend.doubleValidate', [formData]);
131
132			$.ajax({
133					url:         widget.config.urlHandler,
134					type:        widget.config.ajaxMethod,
135					dataType:    'json',
136					data:        formData,
137					processData: false,
138					contentType: false
139				})
140				.done(function (data) {
141					widget.removeMainErrors();
142
143					if (data.status) {
144						widget.$form.trigger('onServerValidateSuccess.doubleValidate', [data]);
145						widget.$form.trigger('validateSuccess.doubleValidate', [data]); // for compability
146					} else {
147						widget.errorHandler(data);
148						widget.$form.trigger('onServerValidateError.doubleValidate', [data]);
149						widget.$form.trigger('validateError.doubleValidate', [data]); // for compability
150
151					}
152				})
153				.fail(function (data) {
154					if (data.status === 0 || data.readyState === 0) {
155						alert(widget.config.errorMessageNetwork);
156					} else {
157						alert(widget.config.errorMessage);
158					}
159
160					if (widget.config.reportErrorToListener) {
161						widget.$form.trigger('sendErrorToListener.doubleValidate', [data]);
162					}
163				})
164				.always(function () {
165					widget.unBlockForm();
166				});
167		},
168
169		/**
170		 * Обработчик ошибок пришедших с сервера
171		 * @param  {object} response ответ сервера
172		 * @param  {object.errors} response ответ сервера
173		 * @return {void}
174		 */
175		errorHandler: function (response) {
176
177			for (var el in response.errors) {
178				this.$form.find('input[name="' + el + '"]')
179					.addClass('error')
180					.after('<span class="help-block error">' + response.errors[el] + '</span>');
181			}
182
183			if (response.mainErrors) {
184				this.addMainErrors(response.mainErrors);
185			} else {
186				this.removeMainErrors();
187			}
188
189		},
190
191		/**
192		 * Бокирование формы, для избежания отправки запросов
193		 * @return {void}
194		 */
195		blockForm: function () {
196			this.$form.addClass('double-validate--wait');
197			this.$form.trigger('onBlockedForm.doubleValidate', [this.$form]);
198			this.formBlocked = true;
199		},
200
201		/**
202		 * Разблокирование формы
203		 * @return {void}
204		 */
205		unBlockForm: function () {
206			this.formBlocked = false;
207			this.$form.trigger('onUnBlockedForm.doubleValidate', [this.$form]);
208			this.$form.removeClass('double-validate--wait');
209		},
210
211		/**
212		 * Добавление общих ошибок в контейнер
213		 * @param {array} mainErrors массив общих ошибок
214		 * @return {void}
215		 */
216		addMainErrors: function (mainErrors) {
217			var $container = $('.' + this.config.classMainErrorContainer);
218
219			for (var i = mainErrors.length - 1; i >= 0; i--) {
220				$('<div class="' + this.config.classMainErrorItem + '">' + mainErrors[i] + '</div>').appendTo($container);
221			}
222		},
223
224		/**
225		 * Удаление общих ошибок
226		 * @return {void}
227		 */
228		removeMainErrors: function () {
229			$('.' + this.config.classMainErrorContainer).html('');
230		}
231
232	};
233
234	$.fn.doubleValidate = function (options) {
235		return new DoubleValidate(this.first(), options);
236	}
237
238}(jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.