1var compressMenu = true; 2 3var BRAND_TRACKING_VERSION = "V2"; 4 5function getBrandPageContext() { 6 var meta = document.querySelector('meta[name="brand-page-context"]'); 7 return meta ? meta.getAttribute('content') : null; 8} 9 10// Send a Somo Analytics (SAS) track event. somoAnalytics only exists when 11// SAS_PROPERTY_ID is set (see shared/_sas_analytics), so check for it first. 12function sasTrack(name, properties) { 13 if (window.somoAnalytics) window.somoAnalytics.track(name, properties); 14} 15 16$(document).ready(function () { 17 checkSize(); 18 mobileMenuSetup(); 19 mobileMenu(); 20 clickTrackingSetup(); 21 seoMenuSetup(); 22 addToList(); 23 recipeClickTracking(); 24 featuredPartnerClickTracking(); 25 contestClickTracking(); 26 couponClickTracking(); 27 circularClickTracking(); 28 promoClickTracking(); 29}); 30 31$(window).resize(function () { 32 checkSize(); 33 mobileMenu(); 34}); 35 36// mobile menu setup 37function mobileMenuSetup() { 38 $(".menu__primary").append( 39 '<li class="expand" title="Show menu"><span class="icon-menu"></span> <em>More</em></li>', 40 ); // add expand link placeholder 41 $(".menu__primary li.expand").on("click", function (e) { 42 // when expand link is clicked 43 if ($(".menu__primary li.expand em").html() == "More") { 44 $(".menu__primary li.expand em").html("Less"); 45 $("header .more").show(); 46 } else { 47 $(".menu__primary li.expand em").html("More"); 48 $("header .more").hide(); 49 } 50 e.preventDefault(); 51 }); 52} 53 54// toggle mobile menu 55function mobileMenu() { 56 if (compressMenu) { 57 // if media query is small or primary menu is wrapping 58 $("header .more").hide(); // hide most links 59 $(".menu__primary li.expand em").html("More"); 60 $(".menu__primary li.expand").show(); // show expand link 61 } else { 62 $("header .more").show(); // show most links 63 $(".menu__primary li.expand em").html("Less"); 64 $(".menu__primary li.expand").hide(); // hide expand link 65 } 66} 67 68// check if browser width exceeds primary menu width 69function checkSize() { 70 if ($("header").width() > 860) { 71 compressMenu = false;
72 } else { 73 compressMenu = true; 74 } 75} 76 77// track clicks on links with data-track attribute 78function clickTrackingSetup() { 79 $("a[data-track]").on("click", function (e) { 80 // when tracked link is clicked 81 var redirect_to = $(this).attr("href"); 82 var tracking_id = $(this).data("track"); 83 var external = $(this).attr("rel") == "external" ? true : false; 84 var isExternalBrand = $(this).hasClass("external-brand-link"); 85 86 // Track all data-track clicks with Ahoy for timestamped per-user data 87 ahoy.track("Link Clicked", { 88 url: redirect_to, 89 tag: tracking_id, 90 }); 91 92 // Also track with Ahoy if this is an external brand link 93 if (isExternalBrand) { 94 ahoy.track("External Brand Clicked", { 95 brand_id: $(this).data("brand-id"), 96 brand_name: $(this).data("brand-name"), 97 url: redirect_to, 98 }); 99 } 100 101 if (external) window.open(redirect_to, "_blank"); // open requested link in new tab 102 $.post("/clicks", { url: redirect_to, tag: tracking_id }, function () { 103 // capture url and tracking id 104 if (!external) { 105 // Delay navigation for external brand links to allow Ahoy request to complete 106 if (isExternalBrand) { 107 setTimeout(function () { 108 window.location.href = redirect_to; 109 }, 150); 110 } else { 111 window.location.href = redirect_to; 112 } 113 } 114 }); 115 e.preventDefault(); 116 }); 117} 118 119// hide/show seo footer links 120function seoMenuSetup() { 121 $("footer .secondary li.seo_page").hide(); 122 if ($("footer .secondary li.seo_page").length > 0) { 123 $("footer .secondary").append('<li class="seo_toggle">More…<li>'); 124 $("footer .seo_toggle").on("click", function (e) { 125 $("footer .seo_toggle").hide(); 126 $("footer .secondary li.seo_page").fadeIn(); 127 }); 128 } 129} 130 131// Ajax add to list hijack 132function addToList() { 133 $("a.add_to_list").on("click", function (e) { 134 var action_item = $(this); 135 var item_id = action_item.data("item-id"); 136 var itemName = action_item.data("item-name"); 137 var brandId = action_item.data("brand-id"); 138 var brandName = action_item.data("brand-name"); 139 140 // Track with Ahoy 141 var eventData = { item_id: item_id }; 142 if (itemName) eventData.item_name = itemName; 143 if (brandId) eventData.brand_id = brandId; 144 if (brandName) eventData.brand_name = brandName; 145 var page = getBrandPageContext(); 146 if (page) eventData.page = page; 147 eventData.tracking_version = BRAND_TRACKING_VERSION; 148 ahoy.track("Shopping List Item Added", eventData); 149 150 // add the item to the list via ajax 151 $.get("/shopping-list/add/" + item_id, function (data) { 152 addToListHighlight(action_item); 153 $(".shopping_list_count").text(data.item_count); 154 sasTrack("shopping_list_add", data.sas_properties); 155 }).fail(function () { 156 // Visitors get a 401 and must sign in first; follow the link so the 157 // server can send them there, or show its error on the list page. 158 window.location.href = action_item.attr("href"); 159 }); 160 e.preventDefault(); 161 }); 162} 163 164// Mark list button temporarily 165function addToListHighlight(action_item) { 166 action_item.text("Added"); 167 action_item.addClass("added"); 168} 169 170// Track recipe button clicks with Ahoy 171function recipeClickTracking() { 172 $(".recipe-view-button").on("click", function (e) { 173 var recipeId = $(this).data("recipe-id"); 174 var recipeName = $(this).data("recipe-name"); 175 var brandId = $(this).data("brand-id"); 176 var brandName = $(this).data("brand-name"); 177 178 // Track the event with Ahoy 179 var eventData = { 180 recipe_id: recipeId, 181 recipe_name: recipeName, 182 source: "recipe_button_click", 183 }; 184 if (brandId) eventData.brand_id = brandId; 185 if (brandName) eventData.brand_name = brandName; 186 var page = getBrandPageContext(); 187 if (page) eventData.page = page; 188 eventData.tracking_version = BRAND_TRACKING_VERSION; 189 ahoy.track("Recipe Viewed", eventData); 190 sasTrack("recipe_view", eventData); 191 }); 192} 193 194// Track featured partner link clicks with Ahoy 195function featuredPartnerClickTracking() { 196 $(".featured-partner-link").on("click", function () { 197 var brandId = $(this).data("brand-id"); 198 var brandName = $(this).data("brand-name"); 199 200 var eventData = { 201 brand_id: brandId, 202 brand_name: brandName, 203 }; 204 var page = getBrandPageContext(); 205 if (page) eventData.page = page; 206 eventData.tracking_version = BRAND_TRACKING_VERSION; 207 ahoy.track("Featured Partner Clicked", eventData); 208 }); 209} 210 211// Track contest button clicks with Ahoy 212function contestClickTracking() { 213 $(".contest-enter-button").on("click", function () {
214 var contestId = $(this).data("contest-id"); 215 var contestName = $(this).data("contest-name"); 216 var contestType = $(this).data("contest-type"); 217 218 var eventData = { 219 contest_id: contestId, 220 contest_name: contestName, 221 contest_type: contestType, 222 }; 223 var page = getBrandPageContext(); 224 if (page) eventData.page = page; 225 eventData.tracking_version = BRAND_TRACKING_VERSION; 226 ahoy.track("Contest Entered", eventData); 227 }); 228} 229 230// Track coupon button clicks with Ahoy 231function couponClickTracking() { 232 $(".coupon-view-button").on("click", function () { 233 var couponId = $(this).data("coupon-id"); 234 var couponName = $(this).data("coupon-name"); 235 var brandId = $(this).data("brand-id"); 236 var brandName = $(this).data("brand-name"); 237 238 var eventData = { 239 coupon_id: couponId, 240 coupon_name: couponName, 241 }; 242 if (brandId) eventData.brand_id = brandId; 243 if (brandName) eventData.brand_name = brandName; 244 var page = getBrandPageContext(); 245 if (page) eventData.page = page; 246 eventData.tracking_version = BRAND_TRACKING_VERSION; 247 ahoy.track("Coupon Viewed", eventData); 248 sasTrack("coupon_view", eventData); 249 }); 250} 251 252// Track opening a circular (a monthly ad) with SAS 253function circularClickTracking() { 254 $(".stack--monthly_ads a").on("click", function () { 255 var circular = $(this).closest(".stack--monthly_ads"); 256 257 sasTrack("circular_view", { 258 circular_id: circular.data("circular-id"), 259 circular_title: circular.data("circular-title"), 260 }); 261 }); 262} 263 264// Track promo button clicks with Ahoy 265function promoClickTracking() { 266 $(".promo-view-button").on("click", function () { 267 var promoId = $(this).data("promo-id"); 268 var promoName = $(this).data("promo-name"); 269 var brandId = $(this).data("brand-id"); 270 var brandName = $(this).data("brand-name"); 271 272 var eventData = { 273 promo_id: promoId, 274 promo_name: promoName, 275 }; 276 if (brandId) eventData.brand_id = brandId; 277 if (brandName) eventData.brand_name = brandName; 278 var page = getBrandPageContext(); 279 if (page) eventData.page = page; 280 eventData.tracking_version = BRAND_TRACKING_VERSION; 281 ahoy.track("Promo Viewed", eventData); 282 }); 283}
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.