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.