1( function( window ){ 2 3 'use strict'; 4 5 6 window.fav_form_callback_work = function( params ){ 7 8 var _this = this; 9 10 params = params || {}; 11 params.id = params.id || null; 12 params.url = params.url || null; 13 14 _this.par = {}; 15 _this.par.id = params.id; 16 _this.par.hash = params.hash; 17 _this.par.url = params.action; 18 19 _this.par.form = document.getElementById( params.id ); 20 21 if( _this.par.form && _this.par.url ){ 22 23 _this.par.form.addEventListener( 'submit', function(e){ e.preventDefault(); }); 24 25 _this.par.pattern = _this.par.form.querySelector( '.' + _this.set.form_pattern ); 26 _this.par.submit = _this.par.form.querySelector( '.' + _this.set.form_submit ); 27 _this.par.inputs = _this.par.form.querySelectorAll( '.' + _this.set.form_input ); 28 _this.par.error = _this.par.form.querySelectorAll( '.' + _this.set.form_error ); 29 _this.par.message = _this.par.form.querySelectorAll( '.' + _this.set.form_message ); 30 31 if( _this.par.submit ){ _this.par.submit.addEventListener( 'click', function( event ){ _this.send(); }); } 32 33 if(_this.par.inputs.length > 0) { 34 _this.par.inputs.forEach(input => { 35 input.addEventListener('focus', function () { 36 _this.clear_error(this); 37 }) 38 }) 39 } 40 } 41 } 42 43 window.fav_form_callback_work.prototype = { 44 45 set : { 46 form_pattern : 'fav_form-pattern', // ÐлаÑÑ ÐаÑÑеÑн 47 form_pattern_active : 'fav_form-pattern-active', // ÐлаÑÑ ÐаÑÑеÑн акÑивнÑй 48 form_hidden : 'fav_form-hidden', // ÐлаÑÑ ÑкÑÑÑÑй 49 form_submit : 'fav_form-send', // ÐлаÑÑ ÑоÑÐ¼Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ оÑпÑавки 50 form_error : 'fav_form-error', // ÐлаÑÑ Ðлок ÑоÑÐ¼Ñ Ñ ÑекÑÑом оÑибки 51 form_message : 'fav_form-message', // ÐлаÑÑ Ðлок ÑоÑÐ¼Ñ Ñ ÑекÑÑом ÑообÑÐµÐ½Ð¸Ñ 52 form_input : 'fav_form-input', // ÐлаÑÑ Ð¿Ð¾Ð»Ñ ÑоÑÐ¼Ñ 53 form_input_mail : 'fav_form-input-mail', // ÐлаÑÑ Ð¿Ð¾Ð»Ñ ÑоÑÐ¼Ñ e-mail 54 form_input_error : 'fav_form-input-error', // ÐлаÑÑ Ð¾Ñибки Ð¿Ð¾Ð»Ñ ÑоÑÐ¼Ñ 55 form_input_required : 'fav_form-required', // ÐлаÑÑ Ð¾Ð±ÑзаÑелÑное поле 56 }, 57 58 // ÐаÑÑеÑн 59 60 pattern : function( action ){ 61 let active = this.set.form_pattern_active; 62 if( this.par.pattern && active && action ){ 63 if( action == 'show' ){ this.par.pattern.classList.add( active ); } 64 if( action == 'hide' ){ this.par.pattern.classList.remove( active ); } 65 } 66 }, 67 68 // ÐÑиÑÑиÑÑ Ð¾Ñибки ÑоÑÐ¼Ñ 69 70 clear_error : function( elem ){ 71 72 let _this = this; 73 elem = elem || null; 74 75 if( !elem ){ 76 77 _this.par.error.forEach( elem => { elem.innerHTML = ''; }); 78 _this.par.inputs.forEach( elem => { _this.clear_error( elem ); }); 79 80 } else { 81 82 let input_block = elem.closest('.fav_form-block'); 83 84 if( input_block ){ 85 let field = input_block.querySelector('.fav_form-field'); 86 let error = input_block.querySelector('.error'); 87 if( field ){ field.classList.remove('form__line__error'); } 88 if( error ){ error.remove(); } 89 } 90 } 91 }, 92 93 // ÐÑовеÑка ÑоÑÐ¼Ñ 94 95 check_form : function( callback ){ 96 97 let _this = this; 98 let errors = false; 99 let error_mail = false; 100 let error_phone = false; 101 let error_required = false; 102 let messages = []; 103 104 if( _this.par.form && _this.par.url && _this.par.hash ){ 105 106 _this.clear_error(); 107 108 let form_data = new FormData( _this.par.form ); 109 form_data.set( 'PARAMS_HASH', _this.par.hash ); 110 if( document.querySelector('h1') ){ 111 form_data.set( 'MATERIAL', document.querySelector('h1').innerHTML ); 112 } 113 form_data.set( 'form_submit', 'Y' ); 114 115 if( _this.par.inputs.length ){ 116 117 _this.par.inputs.forEach( input => { 118 119 let input_error_message = false; 120 121 let input_error = false; 122 let input_value = input.value || null; 123 let input_type = input.getAttribute('type') || null; 124 let input_name = input.getAttribute('name') || null; 125 126 if( input_name && input_value ){ 127 128 if( input_type == "mail" ){
129 var re = /^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i; 130 if( !re.test( input_value ) ){ 131 input_error_message = 'ÐекоÑÑекÑнÑй ÑоÑÐ¼Ð°Ñ Ð¿Ð¾ÑÑÑ'; 132 input_error = true; 133 error_mail = true; 134 } 135 } else if( input_type == "tel" ){ 136 var re = /^(\+7\s)+(\([\d]{3}\)\s)+([\d]{3}\s)+([\d]{2}\s)+([\d]{2})+$/; 137 if( !re.test( input_value ) ){ 138 input_error_message = 'ÐекоÑÑекÑнÑй ÑоÑÐ¼Ð°Ñ Ð½Ð¾Ð¼ÐµÑа'; 139 input_error = true; 140 error_phone = true; 141 } 142 } else if( input_name == 'check-personal' && !input.checked ){ 143 messages.push('ÐодÑвеÑдиÑе ÑоглаÑие на обÑабоÑÐºÑ Ð¿ÐµÑÑоналÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ '); 144 input_error = true; 145 } 146 147 } else if( input.hasAttribute('required') || input.classList.contains( _this.set.form_input_required ) ){ 148 if( input.classList.contains( _this.set.form_hidden ) || input.closest( _this.set.form_hidden ) ){ 149 form_data.delete( input_name ); 150 } else { 151 input_error_message = 'ÐаполниÑе поле'; 152 input_error = true; 153 error_required = true; 154 } 155 } 156 157 if( input_error ){ 158 159 let input_block = input.closest('.fav_form-block'); 160 let clear_error = () => _this.clear_error( input ); 161 input.removeEventListener( 'change', clear_error ); 162 input.addEventListener( 'change', clear_error ); 163 164 if( input_block ){ 165 let field = input_block.querySelector('.fav_form-field'); 166 if( field ){ field.classList.add('form__line__error'); } 167 if( input_error_message ){ 168 let msg = '<div class="form__line__info active error">' + input_error_message + '</div>'; 169 input_block.insertAdjacentHTML( "beforeend", msg ); 170 } 171 } 172 173 errors = true; 174 } 175 }); 176 } 177 178 if( errors ){ 179 180 // if( error_required ){ messages.push('ÐаполниÑе обÑзаÑелÑнÑе полÑ'); } 181 // if( error_mail ){ messages.push('УкажиÑе коÑÑекÑнÑй e-mail'); } 182 183 messages = messages.length ? messages.join('<br>') : null; 184 185 if( messages && _this.par.error.length ){ 186 _this.par.error.forEach( e => { 187 e.innerHTML = '<span>' + messages + '</span>'; 188 }); 189 } 190 191 } else { callback( form_data ); } 192 } 193 194 }, 195 196 // ÐÑпÑавка ÑоÑÐ¼Ñ 197 198 send : function(){ 199 200 let _this = this; 201 _this.check_form( function( form_data ){ 202 _this.pattern('show'); 203 fetch( _this.par.url, { 204 method: "POST", 205 body: form_data 206 }).then( response => { 207 _this.pattern('hide'); 208 response.json().then( result => { 209 _this.form_result( result ); 210 }); 211 }).catch( function(){ _this.pattern('hide'); }); 212 }); 213 }, 214 215 // Ð Ð°Ð·Ð±Ð¾Ñ ÑезÑлÑÑаÑа оÑпÑавки 216 217 form_result : function( form_data ){ 218 219 let _this = this; 220 221 form_data = form_data || {}; 222 form_data.ERROR = form_data.ERROR || 0; 223 form_data.CLEAR = form_data.CLEAR || 0; 224 form_data.STATUS = form_data.STATUS || 0; 225 form_data.RELOAD = form_data.RELOAD || 0; 226 form_data.FIELDS = form_data.FIELDS || {}; 227 form_data.ERRORS = form_data.ERRORS || {}; 228 form_data.PATCH = form_data.PATCH || null; 229 form_data.MESSAGE = form_data.MESSAGE || ''; 230 231 let timeout; 232 233 if( form_data.ERROR == 1 ){ 234 235 236 if( _this.par.form ){ 237 var messages = []; 238 if( form_data.MESSAGE ){ messages.push( form_data.MESSAGE ); } 239 for( var name in form_data.ERRORS ){ 240 // if( form_data.ERRORS[ name ] ){ messages.push( form_data.ERRORS[ name ] ); } 241 let input = _this.par.form.querySelector( '.' + _this.set.form_input + '[name="' + name + '"]' ); 242 if( input ){ input.classList.add( _this.set.form_input_error ); } 243 } 244 messages = messages.length ? messages.join('<br>') : null; 245 if( messages && _this.par.error.length ){ 246 _this.par.error.forEach( e => { 247 e.innerHTML = '<span>' + messages + '</span>'; 248 }); 249 } 250 } 251 252 } else { 253 254 if( form_data.RELOAD == 0 && !form_data.PATCH ){ 255 if( form_data.CLEAR == 1 && _this.par.form ){ _this.par.form.reset(); } 256 clearInputFiles( '#' + _this.par.id ); 257 _this.form_success( form_data ); 258 } else if( form_data.PATCH ){ 259 document.location = form_data.PATCH; 260 } else { window.location.reload( true ); } 261 } 262 }, 263 264 // ÐейÑÑÐ²Ð¸Ñ Ð¿Ð¾Ñле оÑпÑавки 265 266 form_success : function( form_data ){ 267 let _this = this; 268 Fancybox.close(); 269 Fancybox.show([{ src: '#js--modal-thanks', type: "inline" }],{ 270 autoFocus: false, 271 fullscreen: true, 272 compact: true, 273 showClass: "animate__fadeInDownBig", 274 hideClass: "animate__fadeOutDownBig", 275 mainClass: 'fancy-modals', 276 preload: true, 277 }); 278 //if( form_data.MESSAGE && _this.par.message.length ){ 279 //_this.par.message.forEach( e => { 280 //e.innerHTML = '<span>' + form_data.MESSAGE + '</span>'; 281 //}); 282 //} 283 } 284 } 285 286})(window);
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.