1function setCookie(name, value, days) { 2 var expires = ""; 3 if (days) { 4 var date = new Date(); 5 date.setTime(date.getTime() + (days*24*60*60*1000)); 6 expires = "; expires=" + date.toUTCString(); 7 } 8 9 document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=None; Secure"; 10 11 // Check if the cookie was set successfully immediately 12 if (document.cookie.indexOf(name + "=" + encodeURIComponent(value)) !== -1) { 13 // console.log("Cookie set successfully."); 14 return true; 15 } else { 16 // console.error("Failed to set cookie correctly."); 17 return false; 18 } 19} 20 21function getCookie(name) { 22 var nameEQ = name + "="; 23 var ca = document.cookie.split(';'); 24 for(var i=0;i < ca.length;i++) { 25 var c = ca[i]; 26 while (c.charAt(0)==' ') c = c.substring(1,c.length); 27 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 28 } 29 return ""; 30} 31 32function eraseCookie(name) { 33 try { 34 document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 35 } catch (e) { 36 console.error('Failed to erase Cookie item.'); 37 } 38} 39 40function setLocalStorage(name, value) { 41 try { 42 localStorage.setItem(name, value); 43 var storedValue = localStorage.getItem(name); 44 45 if (storedValue === value) { 46 // console.log("Item set successfully in localStorage."); 47 return true; 48 } else { 49 console.error("Failed to set item correctly in localStorage."); 50 return false; 51 } 52 } catch (e) { 53 console.error('Local Storage is not available.'); 54 return false; 55 } 56} 57 58function getLocalStorage(name) { 59 try { 60 return localStorage.getItem(name); 61 } catch (e) { 62 console.error('Local Storage is not available.'); 63 return null; 64 } 65} 66 67function eraseLocalStorage(name) { 68 try { 69 localStorage.removeItem(name); 70 } catch (e) { 71 console.error('Failed to erase Local Storage item.'); 72 } 73} 74 75function setSessionStorage(name, value) { 76 jQuery.ajax({ 77 url: sdlst.ajax_url, 78 type: 'POST', 79 data: { 80 action: 'sdlst_set_session_storage', 81 name: name, 82 value: value 83 }, 84 success: function (response) { 85 // console.log(response); 86 }, 87 error: function (response) { 88 console.error('Failed to set session storage.'); 89 } 90 }); 91} 92 93function getSessionStorage(name) { 94 jQuery.ajax({ 95 url: sdlst.ajax_url, 96 type: 'POST', 97 data: { 98 action: 'sdlst_get_session_storage', 99 name: name 100 }, 101 success: function (response) { 102 return response.data; 103 }, 104 error: function (response) { 105 console.error('Failed to get session storage.'); 106 } 107 }); 108} 109 110function eraseSessionStorage(name) { 111 jQuery.ajax({ 112 url: sdlst.ajax_url, 113 type: 'POST', 114 data: { 115 action: 'sdlst_erase_session_storage', 116 name: name 117 }, 118 success: function (response) { 119 return response.data; 120 }, 121 error: function (response) { 122 console.error('Failed to erase session storage.'); 123 } 124 }); 125} 126 127function storeData(name, value, days = 30) { 128 let success = false; 129 let storageMethod = ''; 130 131 try { 132 if (setCookie(name, value, days)) { 133 success = true; 134 storageMethod = 'cookies'; 135 } 136 } catch (e) { 137 console.error('Cookies are not available.'); 138 } 139 140 return; 141 // If cookies didn't work, try localStorage 142 if (!success) { 143 try { 144 if (setLocalStorage(name, value)) { 145 success = true; 146 storageMethod = 'localStorage'; 147 } else { 148 // If localStorage set fails, try sessionStorage immediately 149 try { 150 setSessionStorage(name, value); 151 success = true; 152 storageMethod = 'sessionStorage'; 153 } catch (e) { 154 console.error('Session Storage is not available.'); 155 } 156 } 157 } catch (e) { 158 console.error('Local Storage is not available.'); 159 } 160 } 161 162 if (success) { 163 console.log(`Data stored successfully in ${storageMethod}.`); 164 } else { 165 console.error('Failed to store data in any available storage.'); 166 } 167} 168 169function getData(name) { 170 let value = getCookie(name); 171 172 if (value !== undefined && value !== "") { 173 return value; 174 } 175 176 value = getLocalStorage(name); 177 178 if (value !== undefined && value !== "") { 179 return value; 180 } 181 182 return getSessionStorage(name); 183} 184 185function eraseData(name) { 186 eraseCookie(name); 187 eraseLocalStorage(name); 188 eraseSessionStorage(name); 189} 190 191function processData() { 192 let queryString = window.location.search;
193 let urlParams = new URLSearchParams(queryString); 194 let utmAllowedTerms = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "referrer"]; 195 let utmTermsObj = {}; 196 197 // Fetch UTM parameters and referrer 198 urlParams.forEach((value, key) => { 199 if (utmAllowedTerms.includes(key)) { 200 utmTermsObj[key] = value; 201 } 202 }); 203 204 if (document.referrer) { 205 utmTermsObj["referrer"] = document.referrer.replace(/^https?:\/\//, ''); 206 } 207 208 // Update UTM fields in Gravity Forms 209 updateUTMFields(utmTermsObj); 210 211 let utmTermsJsonString = JSON.stringify(utmTermsObj); 212 let utmTermsNumber = Object.keys(utmTermsObj).length; 213 console.log('utmTermsNumber', utmTermsNumber); 214 215 // Check if referrer is on staging website 216 let referrerIsNotOwnWebsite = document.referrer.includes("stonedigital.dev") || document.referrer.includes("stonedigital.com.au"); 217 referrerIsNotOwnWebsite = false; 218 219 let sourceListCookie = getData("utm_source_list"); 220 sourceListCookie = decodeURIComponent(sourceListCookie); 221 let sourceListArray; 222 223 // Prepare source list array from cookie data 224 if (getData("utm_source_list")) { 225 sourceListArray = sourceListCookie.split("\n"); 226 } else { 227 sourceListArray = []; 228 } 229 230 // Limit to the latest 10 entries 231 if (sourceListArray.length >= 10) { 232 sourceListArray = sourceListArray.slice(-9); // Keep the latest 9 entries 233 } 234 // Track unique URLs and use an incrementing counter 235 let count = 1; 236 237 // Update each item in sourceListArray directly 238 sourceListArray = sourceListArray.map(item => { 239 // Extract the URL part after "||||||" 240 let url = item.split("||||||")[1]; 241 // Replace "10" with the current count and increment the count 242 return `${count++}||||||${url}`; 243 }); 244 245 console.log(sourceListArray); 246 let newSourceListIndex = sourceListArray.length + 1; 247 248 // Construct new source list entry if there are UTM parameters and referrer is internal 249 if (utmTermsNumber > 0 && !referrerIsNotOwnWebsite) { 250 let newSourceListText = newSourceListIndex; 251 for (let i = 0; i < utmAllowedTerms.length; i++) { 252 let termKey = utmAllowedTerms[i]; 253 let termValue = (utmTermsObj[termKey] == null) ? "" : utmTermsObj[termKey]; 254 newSourceListText += "|" + termValue; 255 } 256 sourceListArray.push(newSourceListText); 257 } 258 259 let sourceListString = sourceListArray.join("\n"); 260 sourceListString = encodeURIComponent(sourceListString); 261 262 // Store updated source list back into the cookie 263 if (!referrerIsNotOwnWebsite) { 264 storeData("utm_source_list", sourceListString, 30); // Assuming storeData sets a cookie with 30 days expiry 265 } 266 267 document.querySelectorAll(".utm_source_list textarea").forEach(input => { 268 input.value = sourceListArray.join("\n"); 269 }); 270} 271 272function updateUTMFields(utmTermsObj) { 273 // Define the class of the parent container that holds the UTM fields 274 let parentClass = '.gfield'; // Replace with your actual parent class 275 276 // Loop through each UTM field and update its value if it exists in the form 277 let fieldLabels = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]; 278
279 fieldLabels.forEach(label => { 280 let fieldValue = utmTermsObj[label] || ""; 281 282 // Store the UTM value in a cookie 283 if (fieldValue) { 284 storeData(label, fieldValue, 30); 285 } 286 287 let fieldElement = document.querySelector(`${parentClass}.${label} input[type="hidden"]`); 288 289 // Update the field value if it exists 290 if (fieldElement) { 291 if (!fieldValue) { 292 fieldValue = getData(label); 293 } 294 295 fieldElement.value = fieldValue; 296 } 297 }); 298} 299 300jQuery(document).on('gform_confirmation_loaded', function(event, formId) { 301 eraseData('sdlst_initial_source'); 302 eraseData('sdlst_final_source'); 303 eraseData('utm_source_list'); 304 console.log('removed UTM cookies via gform_confirmation_loaded'); 305}); 306 307jQuery(document).on('gform_post_render', function() { 308 processData(); 309}); 310 311(function() { 312 let pageviewCount = getCookie("pageviewCount"); 313 if (typeof pageviewCount === "undefined") { 314 pageviewCount = 1; 315 } else { 316 pageviewCount++; 317 } 318 // console.log("pageviewCount", pageviewCount); 319 setCookie("pageviewCount", pageviewCount, 30); 320})(); 321 322jQuery(document).ready(function($) { 323 if (jQuery('.utm_source_list textarea').length) { 324 processData(); 325 } 326}); 327 328// Code Snippet to use in browser console to make all hidden fields visible 329/** 330let inputs = document.querySelectorAll("input[type='hidden']"); 331inputs.forEach(input => input.setAttribute("type", "text")); 332 */
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.