1let phones = JSON.parse(asi_callswapper.tracking_numbers); 2let user_agent = asi_callswapper.user_agent; 3let tracking = ""; 4let separator = ","; 5 6 7// Convert numbers to strings 8if(phones) { 9 phones.forEach(function(item, index) { 10 item.real = item.real.toString(); 11 item.tracked = item.tracked.toString(); 12 tracking += item.tracked; 13 if (index < phones.length - 1) { 14 tracking += separator; 15 } 16 }); 17} 18 19var date = new Date(); 20date.setTime(date.getTime() + (86400 * 30)); 21expires = "; expires=" + date.toUTCString(); 22document.cookie = "tracking=" + tracking + expires + "; path=/"; 23document.addEventListener("DOMContentLoaded", function() { 24 if(phones) { 25 swapAndLinkNumbers(); 26 } 27 // console.log(phones); 28 29 document.body.addEventListener("click", function(event) { 30 var target = event.target; // Get the clicked element 31 32 // Check if the clicked element is an anchor or its parent is an anchor with an href attribute starting with "tel:" 33 if ((target.tagName === "A" && target.getAttribute("href") && target.getAttribute("href").startsWith("tel:")) || 34 (target.parentElement.getAttribute("href") && target.parentElement.getAttribute("href").startsWith("tel:"))) { 35 36 // Extract phone number from the href attribute of the anchor element 37 var href= target.getAttribute("href"); 38 if(href){ 39 var phoneNumber = target.getAttribute("href").replace("tel:", ""); 40 }else{ 41 var phoneNumber = target.textContent.trim(); 42 } 43 44 45 46 47 // // Log or perform any action with the extracted phone number 48 // console.log(user_agent); 49 // console.log("Clicked phone number:", phoneNumber); 50 } 51 }); 52 }); 53 function swapAndLinkNumbers() { 54 var elements = document.querySelectorAll("a[href^='tel:'], p > a[href^='tel:'], a.btn[href^='tel:']"); 55 56 for (var i = 0; i < elements.length; i++) { 57 var element = elements[i]; 58 var href = element.getAttribute("href"); 59 // Extract phone number from href instead of text content 60 var phoneNumber = href.replace('tel:', ''); 61 var format = extractFormat(phoneNumber); 62 63 if (format) { 64 var matchedPhone = findMatchingPhone(formatPhoneNumberForComparison(phoneNumber), phones); 65 66 if (matchedPhone) { 67 var realNumber = matchedPhone.real; 68 var trackedNumber = matchedPhone.tracked; 69 var updatedHref = 'tel:' + trackedNumber; 70 element.setAttribute("href", updatedHref); 71 72 // Only update text content if it contains a phone number 73 if (element.textContent.match(/\d/)) { 74 var textFormat = extractFormat(element.textContent); 75 var newTextContent = formatPhoneNumber(trackedNumber, textFormat); 76 if (element.querySelector("p")) { 77 element.querySelector("p").textContent = newTextContent; 78 } else { 79 element.textContent = newTextContent; 80 } 81 } 82 } 83 } 84 } 85 } 86 87 function extractFormat(phoneNumber) { 88 return phoneNumber.replace(/[0-9]/g, "#"); 89 } 90 91 function formatPhoneNumberForComparison(phoneNumber) { 92 return phoneNumber.replace(/\D/g, ''); // Remove non-digits for comparison 93 } 94 95 function findMatchingPhone(phoneNumber, phones) { 96 for (var i = 0; i < phones.length; i++) { 97 var phone = phones[i]; 98 if (phoneNumber === formatPhoneNumberForComparison(phone.real)) { 99 return phone; 100 } 101 } 102 return null; 103 } 104 105 function formatPhoneNumber(number, format) { 106 var formattedNumber = ''; 107 var digitIndex = 0; 108 for (var i = 0; i < format.length; i++) { 109 if (format[i] === '#') { 110 formattedNumber += number[digitIndex]; 111 digitIndex++; 112 } else { 113 formattedNumber += format[i]; 114 } 115 } 116 117 return formattedNumber; 118 } 119 120 function escapeRegExp(string) { 121 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 122 }
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.