1class CTFormHandler{static PATTERNS={name:["name","firstname","first_name","имÑ","lastname","last_name","ÑамилиÑ","secondname","second_name","оÑÑеÑÑво","patronum","fullname","full_name","Ñио","fio","applicant_name","applicant_name_first","applicant_name_last","applicant_name_second","surname","middle_name"],email:["email","email_address","email_"],phone:["phone","phone_number","ÑелеÑон","number"],comment:["comment","comments","комменÑаÑий","message"],formName:["formName","formCode"]};static API_ENDPOINT="https://api.calltouch.ru/calls-service/RestAPI/requests";constructor(e){if(!e)throw new Error("Site ID is required");this.siteId=e}async sendCalltouchRequest(e){try{this.validateData(e);var a=this.createRequestParams(e),r=await this.makeRequest(a);return this.handleResponse(r)}catch(e){throw this.handleError(e),e}}validateData(e){if(!e||"object"!=typeof e)throw new Error("Invalid data format")}createRequestParams(e){return new URLSearchParams({subject:e.formName??"",fio:e.name??"",email:e.email??"",phoneNumber:e.phone??"",comment:e.comment??"",requestUrl:window.location.href,sessionId:window.call_value})}async makeRequest(e){e=`${CTFormHandler.API_ENDPOINT}/${this.siteId}/register/?`+e,e=await fetch(e);if(e.ok)return e;throw new Error("HTTP error! status: "+e.status)}async handleResponse(e){e=await e.json();if(e)return e;throw new Error("Empty response from server")}handleError(e){throw console.error("Error in sendCalltouchRequest:",e),new Error("Failed to send request to CallTouch: "+e.message)}async send(e){try{var a,r;if(e&&"object"==typeof e)return a=this.prepareData(e),r=await this.sendCalltouchRequest(a),console.log({CTResult:r}),r;throw new Error("Invalid raw data format")}catch(e){throw console.error("Error in send:",e),e}}prepareData(e){console.log("ÐÑ
одÑÑие даннÑе в prepareData:",e);let r={},t=Object.entries(e).reduce((e,[a,r])=>(e[(a.includes("---")?a.split("---")[1]:a).toLowerCase()]=r,e),{});return console.log("ÐÑиÑеннÑе даннÑе:",{cleanData:t}),Object.entries(CTFormHandler.PATTERNS).forEach(([e,a])=>{"name"===e?(r[e]=this.prepareFullName(t),console.log("ÐодгоÑовленное ФÐÐ:",r[e])):r[e]=this.findFieldsByPattern(t,a)}),r}prepareFullName(e){if(!e||"object"!=typeof e)return"";e=Object.entries(e).reduce((e,[a,r])=>(CTFormHandler.PATTERNS.name.some(e=>a===e)&&(e[a]=r),e),{});if(console.log('ÐайденнÑе Ð¿Ð¾Ð»Ñ "NAME":',{foundFields:e}),0===Object.keys(e).length)return"";let r={lastname:"",firstname:"",secondname:""};return Object.entries(e).forEach(([e,a])=>{e.includes("last")||"surname"===e?r.lastname=a:e.includes("first")||"name"===e?r.firstname=a:(e.includes("second")||e.includes("patronum")||e.includes("middle"))&&(r.secondname=a)}),Object.values(r).some(e=>""!==e)?[r.lastname,r.firstname,r.secondname].filter(Boolean).join(" ").trim():Object.values(e)[0]}findFieldsByPattern(e,a){if(!e||"object"!=typeof e)return"";let r=new Set,t=a.map(e=>e.toLowerCase());return Object.entries(e).forEach(([a,e])=>{t.some(e=>a===e)&&r.add(e)}),Array.from(r).join(" ").trim()}}
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.