PageSourceSearch

https://fairbankshouse.org/js/views/view.contact.js

js fairbankshouse.org collected 2026-10-02 12:14:10 UTC 7,495 bytes, 262 lines download raw bytes

1/*
2Name: 			View - Contact
3Written by: 	Okler Themes - (http://www.okler.net)
4Theme Version:	13.0.0
5*/
6
7(($ => {
8    /*
9	Custom Rules
10	*/
11
12    // No White Space
13    $.validator.addMethod("noSpace", (value, element) => {
14		if( $(element).attr('required') ) {
15			return value.search(/^(?! *$)[^]+$/) == 0;
16		}
17
18		return true;
19	}, 'Please fill this empty field.');
20
21    /*
22	Assign Custom Rules on Fields
23	*/
24    $.validator.addClassRules({
25	    'form-control': {
26	        noSpace: true
27	    }
28	});
29
30    /*
31	Contact Form: Basic
32	*/
33    $('.contact-form').each(function(){
34		$(this).validate({
35			errorPlacement(error, element) {
36				if(element.attr('type') == 'radio' || element.attr('type') == 'checkbox') {
37					error.appendTo(element.closest('.form-group'));
38				} else if( element.is('select') && element.closest('.custom-select-1') ) {
39					error.appendTo(element.closest('.form-group'));
40				} else {
41					if( element.closest('.form-group').length ) {
42						error.appendTo(element.closest('.form-group'));
43					} else {
44						error.insertAfter(element);
45					}
46				}
47			},
48			submitHandler(form) {
49
50				const $form = $(form), $messageSuccess = $form.find('.contact-form-success'), $messageError = $form.find('.contact-form-error'), $submitButton = $(this.submitButton), $errorMessage = $form.find('.mail-error-message'), submitButtonText = $submitButton.val();
51
52				$submitButton.val( $submitButton.data('loading-text') ? $submitButton.data('loading-text') : 'Loading...' ).attr('disabled', true);
53
54				// Fields Data
55				const formData = $form.serializeArray(), data = {};
56
57				$(formData).each((index, {name, value}) => {
58					if( data[name] ) {
59						data[name] = data[name] + ', ' + value;						
60					} else {
61						data[name] = value;
62					}
63				});
64
65				// Google Recaptcha v2
66				if( data["g-recaptcha-response"] != undefined ) {
67					data["g-recaptcha-response"] = $form.find('#g-recaptcha-response').val();
68				}
69
70				// Ajax Submit
71				$.ajax({
72					type: 'POST',
73					url: $form.attr('action'),
74					data
75				}).always(({response, errorMessage, responseText}, textStatus, jqXHR) => {
76
77					$errorMessage.empty().hide();
78
79					if (response == 'success') {
80
81						// Uncomment the code below to redirect for a thank you page
82						// self.location = 'thank-you.html';
83
84						$messageSuccess.removeClass('d-none');
85						$messageError.addClass('d-none');
86
87						// Reset Form
88						$form.find('.form-control')
89							.val('')
90							.blur()
91							.parent()
92							.removeClass('has-success')
93							.removeClass('has-danger')
94							.find('label.error')
95							.remove();
96
97						if (($messageSuccess.offset().top - 80) < $(window).scrollTop()) {
98							$('html, body').animate({
99								scrollTop: $messageSuccess.offset().top - 80
100							}, 300);
101						}
102
103						$form.find('.form-control').removeClass('error');
104
105						$submitButton.val( submitButtonText ).attr('disabled', false);
106						
107						return;
108
109					} else if (response == 'error' && typeof errorMessage !== 'undefined') {
110						$errorMessage.html(errorMessage).show();
111					} else {
112						$errorMessage.html(responseText).show();
113					}
114
115					$messageError.removeClass('d-none');
116					$messageSuccess.addClass('d-none');
117
118					if (($messageError.offset().top - 80) < $(window).scrollTop()) {
119						$('html, body').animate({
120							scrollTop: $messageError.offset().top - 80
121						}, 300);
122					}
123
124					$form.find('.has-success')
125						.removeClass('has-success');
126						
127					$submitButton.val( submitButtonText ).attr('disabled', false);
128
129				});
130			}
131		});
132	});
133
134    /*
135	Contact Form: Advanced
136	*/
137    $('#contactFormAdvanced').validate({
138		onkeyup: false,
139		onclick: false,
140		onfocusout: false,
141		rules: {
142			'captcha': {
143				captcha: true
144			},
145			'checkboxes[]': {
146				required: true
147			},
148			'radios': {
149				required: true
150			}
151		},
152		errorPlacement(error, element) {
153			if(element.attr('type') == 'radio' || element.attr('type') == 'checkbox') {
154				error.appendTo(element.closest('.form-group'));
155			} else if( element.is('select') && element.closest('.custom-select-1') ) {
156				error.appendTo(element.closest('.form-group'));
157			} else {
158				error.insertAfter(element);
159			}
160		}
161	});
162
163    /*
164	Contact Form: reCaptcha v3
165	*/
166    $('.contact-form-recaptcha-v3').each(function(){
167		$(this).validate({
168			errorPlacement(error, element) {
169				if(element.attr('type') == 'radio' || element.attr('type') == 'checkbox') {
170					error.appendTo(element.closest('.form-group'));
171				} else if( element.is('select') && element.closest('.custom-select-1') ) {
172					error.appendTo(element.closest('.form-group'));
173				} else {
174					error.insertAfter(element);
175				}
176			},
177			submitHandler(form) {
178
179				const $form = $(form), $messageSuccess = $form.find('.contact-form-success'), $messageError = $form.find('.contact-form-error'), $submitButton = $(this.submitButton), $errorMessage = $form.find('.mail-error-message'), submitButtonText = $submitButton.val();
180
181				$submitButton.val( $submitButton.data('loading-text') ? $submitButton.data('loading-text') : 'Loading...' ).attr('disabled', true);
182
183				const recaptchaSrcURL = $('#google-recaptcha-v3').attr('src'), newURL          = new URL(recaptchaSrcURL), site_key        = newURL.searchParams.get("render");
184
185				grecaptcha.execute(site_key, {action: 'contact_us'}).then(token => {
186
187					// Fields Data
188					const formData = $form.serializeArray(), data = {};
189
190					$(formData).each((index, {name, value}) => {
191					    data[name] = value;
192					});
193
194					// Recaptcha v3 Token
195					data["g-recaptcha-response"] = token;
196
197					// Ajax Submit
198					$.ajax({
199						type: 'POST',
200						url: $form.attr('action'),
201						data
202					}).always(({response, errorMessage, responseText}, textStatus, jqXHR) => {
203
204						$errorMessage.empty().hide();
205
206						if (response == 'success') {
207
208							// Uncomment the code below to redirect for a thank you page
209							// self.location = 'thank-you.html';
210
211							$messageSuccess.removeClass('d-none');
212							$messageError.addClass('d-none');
213
214							// Reset Form
215							$form.find('.form-control')
216								.val('')
217								.blur()
218								.parent()
219								.removeClass('has-success')
220								.removeClass('has-danger')
221								.find('label.error')
222								.remove();
223
224							if (($messageSuccess.offset().top - 80) < $(window).scrollTop()) {
225								$('html, body').animate({
226									scrollTop: $messageSuccess.offset().top - 80
227								}, 300);
228							}
229
230							$form.find('.form-control').removeClass('error');
231
232							$submitButton.val( submitButtonText ).attr('disabled', false);
233							
234							return;
235
236						} else if (response == 'error' && typeof errorMessage !== 'undefined') {
237							$errorMessage.html(errorMessage).show();
238						} else {
239							$errorMessage.html(responseText).show();
240						}
241
242						$messageError.removeClass('d-none');
243						$messageSuccess.addClass('d-none');
244
245						if (($messageError.offset().top - 80) < $(window).scrollTop()) {
246							$('html, body').animate({
247								scrollTop: $messageError.offset().top - 80
248							}, 300);
249						}
250
251						$form.find('.has-success')
252							.removeClass('has-success');
253							
254						$submitButton.val( submitButtonText ).attr('disabled', false);
255
256					});
257
258				});
259			}
260		});
261	});
262})).apply(this, [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.