1"use strict"; 2(function() { 3 4function loadScript(url, callback){ 5 let script = document.createElement("script"); 6 script.type = "text/javascript"; 7 8 if (script.readyState){ //IE 9 script.onreadystatechange = function(){ 10 if (script.readyState == "loaded" || 11 script.readyState == "complete"){ 12 script.onreadystatechange = null; 13 callback(); 14 } 15 }; 16 } 17 else { //Others 18 script.onload = function(){ 19 callback(); 20 }; 21 } 22 23 script.src = url; 24 document.getElementsByTagName("body")[0].appendChild(script); 25} 26 27function getHostNameFromUrl(url) { 28 // <summary>Parses the domain/host from a given url.</summary> 29 let a = document.createElement("a"); 30 a.href = url; 31 // Handle chrome which will default to domain where script is called from if invalid 32 return url.indexOf(a.hostname) != -1 ? a.hostname : ''; 33} 34 35function loadReferrer() { 36 let dateTime = Date.now(); 37 let timestamp = Math.floor(dateTime / 1000); 38 let referrerInfo = localStorage.getItem('referrerInfo'); 39 if (referrerInfo) { 40 referrerInfo = JSON.parse(referrerInfo); 41 } 42 43 // use 30mins time to check if this is same session. 44 if (referrerInfo && typeof referrerInfo.timestamp !== 'undefined' && timestamp - referrerInfo.timestamp < 1800) { 45 // check if campaign exists 46 let url = window.location.href; 47 let referrer = ''; 48 if (typeof document.referrer !== 'undefined') { 49 referrer = document.referrer; 50 } 51 inbound.referrer.parse(url, referrer, function(err, visitInfo){ 52 if (typeof visitInfo.campaign !== 'undefined' && typeof referrerInfo.campaign === 'undefined') { 53 referrerInfo.campaign = visitInfo.campaign; 54 } 55 referrerInfo.timestamp = timestamp; 56 localStorage.setItem('referrerInfo', JSON.stringify(referrerInfo)); 57 trackVisit(referrerInfo); 58 }); 59 } 60 // someone visit this site over 30mins, it's a new visit anyway 61 else { 62 localStorage.removeItem('referrerInfo'); 63 let url = window.location.href; 64 let referrer = ''; 65 if (typeof document.referrer !== 'undefined') { 66 referrer = document.referrer; 67 } 68 inbound.referrer.parse(url, referrer, function (err, visitInfo) { 69 visitInfo.landing = location.href.replace(location.origin, ''); 70 visitInfo.timestamp = timestamp; 71 // set to localStorage because we need to make sure same browser with different tab has same referrer result. 72 localStorage.setItem('referrerInfo', JSON.stringify(visitInfo)); 73 trackVisit(visitInfo); 74 }); 75 } 76 77 // remove unused params 78 let queue_id = location.search.match(/civimail_x_q=(\d+)/); 79 let url_id = location.search.match(/civimail_x_u=(\d+)/); 80 if (queue_id && url_id) { 81 if (typeof URLSearchParams === 'function') { 82 let searchParams = new URLSearchParams(window.location.search); 83 searchParams.delete("civimail_x_q"); 84 searchParams.delete("civimail_x_u"); 85 let newQuery = ''; 86 if (searchParams.toString() === '') { 87 newQuery = ''; 88 } 89 else { 90 newQuery = '?'+searchParams.toString(); 91 } 92 let newUrl = window.location.origin+window.location.pathname+newQuery; 93 window.history.replaceState({}, null, newUrl); 94 } 95 } 96} 97 98function trackVisit(visitInfo) { 99 let object = {}; 100 if (location.href.match(/civicrm\/event\/(register|info)/)) { 101 object['page_type'] = 'civicrm_event'; 102 } 103 else if (location.href.match(/civicrm\/contribute\/transact/)) { 104 object['page_type'] = 'civicrm_contribution_page'; 105 } 106 else if (location.href.match(/civicrm\/profile\/create/)) { 107 object['page_type'] = 'civicrm_uf_group'; 108 } 109 let page_id = location.search.match(/id=(\d+)/); 110 if (page_id) { 111 object['page_id'] = page_id[1]; 112 } 113 if (!object['page_type'] || !object['page_id']) { 114 return; 115 } 116 117 // prepare 118 object['landing'] = visitInfo.landing ? visitInfo.landing : ''; 119 object['referrer_type'] = visitInfo.referrer.type; 120 object['referrer_network'] = ''; 121 object['referrer_url'] = ''; 122 // detect if from civimail mailing list 123 let queue_id = location.search.match(/civimail_x_q=(\d+)/); 124 let url_id = location.search.match(/civimail_x_u=(\d+)/); 125 if (queue_id && url_id) { 126 object['referrer_type'] = 'email'; 127 object['referrer_network'] = 'civimail'; 128 object['referrer_url'] = 'external/url.php?qid='+queue_id[1]+'&u='+url_id[1]; 129 if (typeof URLSearchParams === 'function') { 130 let searchParams = new URLSearchParams(window.location.search); 131 searchParams.delete("civimail_x_q"); 132 searchParams.delete("civimail_x_u"); 133 let newQuery = '?'+searchParams.toString(); 134 let newUrl = window.location.origin+window.location.pathname+newQuery; 135 window.history.replaceState({}, null, newUrl); 136 } 137 } 138 switch(object['referrer_type']){ 139 case 'ad': 140 object['referrer_network'] = visitInfo.referrer.network; 141 break; 142 case 'direct': 143 object['referrer_network'] = ''; 144 break; 145 case 'email': 146 if (typeof visitInfo.referrer.client !== 'undefined' && visitInfo.referrer.client !== 'unknown') { 147 object['referrer_network'] = visitInfo.referrer.client; 148 } 149 break; 150 case 'internal': 151 object['referrer_network'] = ''; 152 break; 153 case 'link': 154 object['referrer_network'] = getHostNameFromUrl(visitInfo.referrer.from); 155 if (typeof visitInfo.referrer.from !== 'undefined') { 156 object['referrer_url'] = visitInfo.referrer.from; 157 } 158 break; 159 case 'local': 160 object['referrer_network'] = visitInfo.referrer.site; 161 break; 162 case 'search': 163 object['referrer_network'] = visitInfo.referrer.engine; 164 break; 165 case 'social': 166 object['referrer_network'] = visitInfo.referrer.network; 167 break; 168 default: 169 object['referrer_type'] = 'unknown'; 170 object['referrer_network'] = ''; 171 break; 172 } 173 if (typeof visitInfo.campaign !== 'undefined') { 174 for(let utmKey in visitInfo.campaign) { 175 object[utmKey] = visitInfo.campaign[utmKey]; 176 } 177 } 178 if (typeof navigator.doNotTrack === 'string' && navigator.doNotTrack == '1') { 179 object['referrer_type'] = 'unknown'; 180 object['referrer_network'] = ''; 181 object['referrer_url'] = ''; 182 } 183 184 const url = '/civicrm/ajax/track'; 185 const data = 'data='+encodeURIComponent(JSON.stringify(object)); 186 fetch(url, { 187 method: "POST", 188 headers: { 189 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8' 190 }, 191 body: data 192 }); 193} 194 195; 196if (typeof document.currentScript === 'object' && typeof document.currentScript.src === 'string') { 197 let inboundSrc = document.currentScript.src; 198 inboundSrc = inboundSrc.replace('insights.js', 'inbound.js'); 199 loadScript(inboundSrc, function(){ loadReferrer(); }); 200} 201else if (typeof Drupal !== 'undefined' && typeof Drupal.settings !== 'undefined') { 202 let inboundSrc = Drupal.settings.civicrm.resourceBase+'js/inbound.js'; 203 loadScript(inboundSrc, function(){ loadReferrer(); }); 204} 205else if (typeof drupalSettings !== 'undefined') { 206 let inboundSrc = drupalSettings.civicrm.resourceBase+'js/inbound.js'; 207 loadScript(inboundSrc, function(){ loadReferrer(); }); 208} 209 210})();
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.