1jQuery( 2 function( $ ) { 3 $( document.body ).on( 4 'added_to_cart', 5 function( e, fragments, cart_hash, thisbutton ) { 6 var pixel_code = window.tt4b_script_vars.pixel_code; 7 var currency = window.tt4b_script_vars.currency; 8 var product_id = thisbutton.data('product_id'); 9 var product_name = thisbutton.data('product_name'); 10 var price = thisbutton.data('price'); 11 12 ttq.instance(pixel_code).track( 13 'AddToCart', 14 { 15 'content_id': product_id, 16 'content_name': product_name, 17 'content_type': 'product', 18 'price': price, 19 'value': price, 20 'quantity': 1, 21 'currency': currency 22 } 23 ); 24 } 25 ); 26 27 28 // add library to help parse phone numbers 29 let script = document.createElement('script'); 30 script.src = 'https://unpkg.com/[email protected]/bundle/libphonenumber-min.js'; 31 document.head.appendChild(script); 32 33 // add library to generate uuid4 for event api 34 let uuidScript = document.createElement('script'); 35 uuidScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/uuid/8.1.0/uuidv4.min.js'; 36 document.head.appendChild(uuidScript); 37 38 // advanced matching - will send hashed advanced_matching fields if true, otherwise will exit if advanced_matching value is false or null 39 function getEmailAndPhone(inputElement, pixelCode, source) { 40 if (window.tt4b_script_vars.advanced_matching !== '1') { 41 return; 42 } 43 let result = { 44 email: "", 45 phone_number: "" 46 }; 47 if (!inputElement) { 48 return result 49 } 50 let form = inputElement.closest('form') || inputElement.querySelector('form'); 51 if ((!form || form.length === 0) && source !== 'ninjaforms') { 52 return; 53 } else if ((!form || form.length === 0) && source === 'ninjaforms') { 54 form = inputElement.first('form')[0]; 55 } 56 let inputElements = form.querySelectorAll('input'); 57 for (let input of inputElements) { 58 if (input.type === 'email') { 59 result.email = input.value; 60 } else if (input.type === 'tel') { 61 try { 62 let phone_number = input.value; 63 result.phone_number = libphonenumber.parsePhoneNumber(phone_number, window.tt4b_script_vars.country).number 64 } catch (error) { 65 console.error("Error occurred while parsing phone number: ", error); 66 } 67 } 68 } 69 ttq.instance(pixelCode).identify(result); 70 } 71 72 // Fires a Contact event if AM data present in form, otherwise fires a SubmitForm vent 73 function firePixelBasedOnFormIntent(inputElement, pixelCode, source) { 74 let form = inputElement.closest('form') || inputElement.querySelector('form'); 75 if ((!form || form.length === 0) && source !== 'ninjaforms') { 76 return; 77 } else if ((!form || form.length === 0) && source === 'ninjaforms') { 78 form = inputElement.first('form')[0]; 79 } 80 let inputElements = form.querySelectorAll('input'); 81 let hasAMData = false; 82 for (let input of inputElements) { 83 if (input.type === 'email' || input.type === 'tel') { 84 hasAMData = true; 85 break; 86 } 87 } 88 let eventType = hasAMData ? 'Contact' : 'SubmitForm' 89 ttq.instance(pixelCode).track(eventType, { 90 'source' : source, 91 'wp_plugin' : source, 92 "event_id" : uuidv4() 93 }) 94 } 95 96 // Some forms will trigger the submit event, even if the form submission is unsuccessful 97 // In this case we want to make sure the form submission is successful by checking for the success message 98 // once the message is visible, we will fire the pixel event 99 function createObserver(source) { 100 return new MutationObserver(function(mutations) { 101 mutations.forEach(function(mutation) { 102 if (window.getComputedStyle(mutation.target).display !== 'none') { 103 getEmailAndPhone(mutation.target, window.tt4b_script_vars.pixel_code); 104 firePixelBasedOnFormIntent(mutation.target, window.tt4b_script_vars.pixel_code, source) 105 } 106 }); 107 }); 108 } 109 110 // fallback case 111 document.addEventListener('submit', function(event) { 112 var pixel_code = window.tt4b_script_vars.pixel_code; 113 getEmailAndPhone(event.target, pixel_code); 114 firePixelBasedOnFormIntent(event.target, pixel_code, "fallback") 115 }); 116 117 // ButtonClick Lead Gen Event 118 $('button, :submit').on( 'click', function(event) { 119 var pixel_code = window.tt4b_script_vars.pixel_code; 120 // AM based on form inputs when submit clicked 121 getEmailAndPhone(event.target, pixel_code); 122 ttq.instance(pixel_code).track('ClickButton', { 123 'content': 'SubmitClick', 124 "event_id": uuidv4() 125 }); 126 }); 127 128 // Contact Lead Gen Event: Contact Form 7 129 // https://wordpress.org/plugins/contact-form-7/ 130 document.addEventListener('wpcf7mailsent', function(event) { 131 var pixel_code = window.tt4b_script_vars.pixel_code; 132 getEmailAndPhone(event.target, pixel_code);
133 firePixelBasedOnFormIntent(event.target, pixel_code, "contactform7") 134 }, false); 135 136 // Contact Lead Gen Event: MC4WP: Mailchimp for Wordpress 137 // https://wordpress.org/plugins/mailchimp-for-wp/ 138 var mailchimp_forms = document.querySelectorAll('.mc4wp-form'); 139 mailchimp_forms.forEach(function(form) { 140 var pixel_code = window.tt4b_script_vars.pixel_code; 141 form.addEventListener('submit', function(event) { 142 getEmailAndPhone(event.target, pixel_code); 143 firePixelBasedOnFormIntent(event.target, pixel_code, "mailchimp4wordpress") 144 }); 145 }); 146 147 // Contact Lead Gen Event: Jetpack + Mailchimp 148 // https://jetpack.com/support/jetpack-blocks/mailchimp-block/ 149 var jetpackMailchimpNodes = document.querySelectorAll('.wp-block-jetpack-mailchimp_success'); 150 if (jetpackMailchimpNodes.length > 0) { 151 var jetpackMailchimpObserver = createObserver('jetpackmailchimp'); 152 jetpackMailchimpNodes.forEach(function(targetNode) { 153 jetpackMailchimpObserver.observe(targetNode, { attributes: true, childList: true, subtree: true }); 154 }); 155 } 156 157 // Contact Lead Get Event: MailPoet 158 // https://wordpress.org/plugins/mailpoet/ 159 $('input.mailpoet_submit').on('click', function() { 160 var pixel_code = window.tt4b_script_vars.pixel_code; 161 getEmailAndPhone(event.target, pixel_code); 162 firePixelBasedOnFormIntent(event.target, pixel_code, "mailpoet") 163 }); 164 165 // Contact Lead Gen Event: Spectra 166 // https://wordpress.org/plugins/ultimate-addons-for-gutenberg/ 167 var spectraForms = document.querySelectorAll('.uagb-forms-main-form'); 168 spectraForms.forEach(function(form) { 169 var pixel_code = window.tt4b_script_vars.pixel_code; 170 form.addEventListener('submit', function(event) { 171 getEmailAndPhone(event.target, pixel_code); 172 firePixelBasedOnFormIntent(event.target, pixel_code, "spectra") 173 }); 174 }); 175 176 // Submit Form Lead Gen Event: WPForms 177 // https://wordpress.org/plugins/wpforms-lite/ 178 $('form.wpforms-form').on('wpformsAjaxSubmitSuccess', (event) => { 179 var pixel_code = window.tt4b_script_vars.pixel_code; 180 getEmailAndPhone(event.target, pixel_code); 181 firePixelBasedOnFormIntent(event.target, pixel_code, "wpforms") 182 }) 183 184 185 // Submit Form Lead Gen Events: JetPack 186 // https://wordpress.org/plugins/jetpack/ 187 if (document.querySelector('[class*=jetpack-contact-form]')) { 188 document.addEventListener('submit', (event) => { 189 var pixel_code = window.tt4b_script_vars.pixel_code; 190 getEmailAndPhone(event.target, pixel_code); 191 firePixelBasedOnFormIntent(event.target, pixel_code, "jetpack") 192 }); 193 } 194 195 // Submit Form Lead Gen Events: Ninja Forms 196 // https://wordpress.org/plugins/ninja-forms/ 197 $(document).on('nfFormSubmitResponse', (event) => { 198 event.preventDefault(); 199 var pixel_code = window.tt4b_script_vars.pixel_code; 200 getEmailAndPhone($('.nf-form-layout'), pixel_code, "ninjaforms"); 201 firePixelBasedOnFormIntent($('.nf-form-layout'), pixel_code, "ninjaforms") 202 }); 203 204 $(document).on('nfFormReady', (event) => { 205 event.preventDefault(); 206 $('button, :submit, input[type="submit"]').on( 'click', function(event) { 207 var pixel_code = window.tt4b_script_vars.pixel_code; 208 // AM based on form inputs when submit clicked 209 getEmailAndPhone(event.target, pixel_code); 210 ttq.instance(pixel_code).track('ClickButton', { 211 'content': 'SubmitClick' 212 }); 213 }); 214 }) 215 216}); 217
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.