1(function(){'use strict';var ALLOWED_EXT=['doc','docx','pdf','xls','xlsx'];var MAX_BYTES=2*1024*1024;function ext(name){var p=name.lastIndexOf('.');return p===-1?'':name.slice(p+1).toLowerCase()} 2function setStatus(form,msg,type){var el=form.querySelector('.vc-status');if(!el)return;el.textContent=msg||'';el.classList.remove('is-error','is-success');if(type)el.classList.add('is-'+type);el.hidden=!msg} 3function validateFile(file){if(!file)return null;if(ALLOWED_EXT.indexOf(ext(file.name))===-1){return'Unsupported file type. Allowed: '+ALLOWED_EXT.join(', ')+'.'} 4if(file.size>MAX_BYTES){return'File is too large. Maximum size is 2MB.'} 5return null} 6function initForm(form){var input=form.querySelector('.vc-file-input');var attach=form.querySelector('.vc-attach');var nameOut=form.querySelector('.vc-file-name');var btn=form.querySelector('.vc-submit');var btnLabel=btn?btn.textContent:'Send';function showFile(){var file=input&&input.files&&input.files[0];if(!file){if(nameOut)nameOut.textContent='';if(attach)attach.classList.remove('has-file');return} 7var err=validateFile(file);if(err){input.value='';if(nameOut)nameOut.textContent='';if(attach)attach.classList.remove('has-file');setStatus(form,err,'error');return} 8if(nameOut)nameOut.textContent=file.name;if(attach)attach.classList.add('has-file');setStatus(form,'',null)} 9if(input)input.addEventListener('change',showFile);if(attach&&input){['dragenter','dragover'].forEach(function(ev){attach.addEventListener(ev,function(e){e.preventDefault();attach.classList.add('is-dragover')})});['dragleave','drop'].forEach(function(ev){attach.addEventListener(ev,function(e){e.preventDefault();attach.classList.remove('is-dragover')})});attach.addEventListener('drop',function(e){if(e.dataTransfer&&e.dataTransfer.files&&e.dataTransfer.files.length){input.files=e.dataTransfer.files;showFile()}})} 10form.addEventListener('submit',function(e){e.preventDefault();e.stopImmediatePropagation();var endpoint=form.getAttribute('data-ajax');if(!endpoint)return;var nameField=form.querySelector('[name="name"]');var phoneField=form.querySelector('[name="phone"]');if(nameField&&!nameField.value.trim()){setStatus(form,'Please enter your name.','error');nameField.focus();return} 11if(phoneField&&!phoneField.value.trim()){setStatus(form,'Please enter your phone number.','error');phoneField.focus();return} 12var file=input&&input.files&&input.files[0];var fileErr=validateFile(file);if(fileErr){setStatus(form,fileErr,'error');return} 13var data=new FormData(form);if(btn){btn.disabled=!0;btn.textContent='Sendingâ¦'} 14setStatus(form,'',null);fetch(endpoint,{method:'POST',body:data,credentials:'same-origin'}).then(function(r){return r.json().catch(function(){return{success:!1,data:{message:'Unexpected server response.'}}})}).then(function(res){if(res&&res.success){var msg=(res.data&&res.data.message)||form.getAttribute('data-success')||'Thank you!';if(typeof window.voctosShowThankYou==='function'){window.voctosShowThankYou()}else{setStatus(form,msg,'success')} 15form.reset();showFile()}else{var em=(res&&res.data&&res.data.message)||'Something went wrong. Please try again.';setStatus(form,em,'error')}}).catch(function(){setStatus(form,'Network error. Please try again.','error')}).finally(function(){if(btn){btn.disabled=!1;btn.textContent=btnLabel}})},!0)} 16function init(){var forms=document.querySelectorAll('.voctos-contact-form');for(var i=0;i<forms.length;i++)initForm(forms[i]);} 17if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init)}else{init()}})()
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.