1;(function ($) { 2 $(document).ready(function () { 3 $(document).on('click', '.js-open-calendly', function (e) { 4 e.preventDefault() 5 6 //open link as fallback if Calendly is not loaded 7 if (typeof Calendly === 'undefined') { 8 window.open($(this).attr('href')) 9 return 10 } 11 12 var calendlyLink = $(this).attr('href') 13 var prefill = {} 14 15 if (typeof currentUser !== 'undefined' && currentUser !== null) { 16 prefill = { 17 name: 18 currentUser.data.firstName + 19 ' ' + 20 currentUser.data.lastName, 21 email: currentUser.data.email, 22 } 23 } 24 25 Calendly.initPopupWidget({ url: calendlyLink, prefill: prefill }) 26 }) 27 }) 28 29 function isCalendlyEvent(e) { 30 return ( 31 e.origin === 'https://calendly.com' && 32 e.data.event && 33 e.data.event.indexOf('calendly.') === 0 34 ) 35 } 36 37 function logCallBooked(payload) { 38 if (typeof F7HCalendly === 'undefined' || !F7HCalendly.enabled) { 39 return 40 } 41 42 if (!payload || !payload.event || !payload.invitee) { 43 return 44 } 45 46 var activity = '-' 47 var location = '-' 48 49 if (typeof adventureInfo !== 'undefined') { 50 if (adventureInfo.activity) { 51 activity = Array.isArray(adventureInfo.activity) 52 ? adventureInfo.activity.join(', ') || '-' 53 : adventureInfo.activity 54 } 55 56 if (adventureInfo.location) { 57 location = Array.isArray(adventureInfo.location) 58 ? adventureInfo.location.join(', ') || '-' 59 : adventureInfo.location 60 } 61 } 62 63 var data = { 64 action: 'f7h_log_call_booked', 65 nonce: F7HCalendly.nonce, 66 event_uri: payload.event.uri, 67 invitee_uri: payload.invitee.uri, 68 url: window.location.href, 69 path: window.location.pathname, 70 activity: activity, 71 location: location, 72 } 73 74 if (typeof adventureInfo !== 'undefined') { 75 data.adventure_id = adventureInfo.adventureId || '' 76 data.title = adventureInfo.title || '' 77 data.price = adventureInfo.price || '' 78 data.lead_value = typeof adventureInfo.leadValue === 'number' ? adventureInfo.leadValue : '' 79 data.inquiry_value = typeof adventureInfo.inquiryValue === 'number' ? adventureInfo.inquiryValue : '' 80 data.call_value = typeof adventureInfo.callValue === 'number' ? adventureInfo.callValue : '' 81 } 82 83 var params = new URLSearchParams(data).toString() 84 85 if (navigator.sendBeacon) { 86 var blob = new Blob([params], { type: 'application/x-www-form-urlencoded' }) 87 if (navigator.sendBeacon(F7HCalendly.ajaxUrl, blob)) { 88 return 89 } 90 } 91 92 if (typeof fetch === 'function') { 93 fetch(F7HCalendly.ajaxUrl, { 94 method: 'POST', 95 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 96 body: params, 97 keepalive: true, 98 }) 99 } else { 100 jQuery.ajax({ 101 url: F7HCalendly.ajaxUrl, 102 method: 'POST', 103 data: data, 104 }) 105 } 106 } 107 108 window.addEventListener('message', function (e) { 109 if (isCalendlyEvent(e)) { 110 window.dataLayer = window.dataLayer || [] 111 112 if (e.data.event === 'calendly.event_type_viewed') { 113 dataLayer.push({ event: 'BookACallClicked' }) 114 } else if (e.data.event === 'calendly.date_and_time_selected') { 115 dataLayer.push({ event: 'BookACallTimeSelected' }) 116 } else if (e.data.event === 'calendly.event_scheduled') { 117 // Call value is only present on adventure / premium adventure pages 118 var callValue = (typeof adventureInfo !== 'undefined' && typeof adventureInfo.callValue === 'number') 119 ? adventureInfo.callValue 120 : null 121 122 if (typeof f7hTracking !== 'undefined' && typeof f7hTracking.sendFacebookEvent === 'function') { 123 if (typeof adventureInfo !== 'undefined' && typeof adventureInfo['inquiryValue'] !== 'undefined') { // we are on adventure or premium adventure page 124 // A booked call is reported at the Call value on every event. 125 // Falls back to the inquiry value when no Call value is set. 126 f7hTracking.sendFacebookEvent(null, null, 'Purchase', callValue); // Purchase event - call value 127 f7hTracking.sendFacebookEvent(null, null, 'Contact', callValue); // Contact event - call value 128 f7hTracking.sendFacebookEvent(null, null, 'Call', callValue); // Call event - call value 129 } 130 } 131 132 // Send the Call value through the existing inquiryValue field so GTM reports 133 // a booked call at its own value;
133 callValue is exposed for a cleaner mapping. 134 if (callValue !== null) { 135 dataLayer.push({ event: 'CallBooked', inquiryValue: callValue, callValue: callValue }) 136 } else { 137 dataLayer.push({ event: 'CallBooked' }) 138 } 139 140 logCallBooked(e.data.payload) 141 } 142 } 143 }) 144})(jQuery)
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.