1var clickTrack = { 2 uniqueId: "", 3 rfc3986EncodeURIComponent: function(n) { 4 return encodeURIComponent(n).replace(/[!'()*]/g, escape) 5 }, 6 isNullOrEmpty: function(n) { 7 return n == null || typeof n == "string" && n.trim() === "" || Array.isArray(n) && n.filter(Boolean).length === 0 8 }, 9 generateUUID: function() { 10 // Fallback-safe UUID v4 generation 11 return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".replace(/x/g, function() { 12 var r; 13 try { 14 // Try crypto.getRandomValues first 15 r = (crypto.getRandomValues(new Uint8Array(1))[0] & 15); 16 } catch(e) { 17 // Fallback to Math.random for old WebViews 18 r = Math.random() * 16 | 0; 19 } 20 return r.toString(16); 21 }); 22 }, 23 getUniqueId: function() { 24 if (clickTrack.isNullOrEmpty(clickTrack.uniqueId)) { 25 clickTrack.uniqueId = clickTrack.generateUUID(); 26 } 27 return clickTrack.uniqueId; 28 }, 29 trackClickLinks: function(n) { 30 var t = clickTrack.getUniqueId(), r = clickTrack.isNullOrEmpty(n) ? clickTrack.rfc3986EncodeURIComponent(window.location.href) : clickTrack.rfc3986EncodeURIComponent(n), u = clickTrack.rfc3986EncodeURIComponent(navigator.userAgent), i; 31 jQuery(".fs-linkout-tr, .school-container a, .feat-school-list a, .fs-row-e a").each(function() { 32 var n = jQuery(this).attr("href"), i, r; 33 n && !n.match(/s2sId/) && (i = `s2sId=${t}`, 34 r = n + (n.match(/\?/) ? "&" : "?") + i, 35 jQuery(this).attr("href", r)) 36 }); 37 i = `https://tracking.xyzmedia.net/ClickTracker?uniqueId=${t}&pageUrl=${r}&userAgent=${u}`; 38 jQuery.ajax({ 39 url: i, 40 method: "GET" 41 }).fail(function(n) { 42 console.error(n) 43 }) 44 } 45}; 46 47window.addEventListener('load', function() { 48 loadXYZSchoolListeners(); 49 clickTrack.trackClickLinks(); 50}); 51 52 53function loadXYZSchoolListeners(){ 54 jQuery('.fs-linkout-tr').click(function() { 55 var eventCat = 'fsb'; 56 var eventAction = jQuery(this).attr("data-point"); 57 var eventCode = jQuery(this).attr("data-code"); 58 var eventOrder = jQuery(this).attr("data-order"); 59 if(!eventOrder){ 60 eventOrder = jQuery(this).parent().index(); 61 } 62 63 sendEvent(eventCat, eventAction, eventCode, eventOrder); 64 }); 65 66 jQuery('.more-sponsor').click(function(e) { 67 e.stopPropagation(); 68 jQuery('.sponosor-extended').show(); 69 }); 70 71 jQuery('body').click(function(e) { 72 if (jQuery('.sponosor-extended').is(':visible')) { 73 e.stopPropagation(); 74 jQuery('.sponosor-extended').hide(); 75 } 76 }); 77 78 jQuery('.show-more-btn').click(function(e) { 79 jQuery('.fs-hide-school').removeClass('fs-hide-school'); 80 jQuery('.show-more-btn').hide(); 81 sendEvent("Show More", "Click", "Featured School"); 82 }); 83 84 jQuery('.right').click(function(e) { 85 let iw = jQuery('.item-wrapper').first().width(); 86 let move = jQuery('.carousel').scrollLeft() +iw + 50; 87 jQuery('.carousel').scrollLeft(move); 88 }); 89 90 jQuery('.left').click(function(e) { 91 let iw = jQuery('.item-wrapper').first().width(); 92 let move = jQuery('.carousel').scrollLeft() -iw -50; 93 jQuery('.carousel').scrollLeft(move); 94 }); 95 96} 97 98function sendEvent(eventCat, eventAction, eventLabel, eventOrder){ 99 100 //Maybe we have 2 versions of this file one with and one without PPC GA Load 101 //GA 102 var useGA = xyzInfo.useGA == 1; 103 var payload = xyzInfo; 104 if (useGA){ 105 if(typeof gtag === 'function') { 106 gtag('event', eventCat, { 107 component:eventAction, 108 component_value: eventLabel 109 }); 110 }else if (typeof dataLayer === 'object'){ 111 dataLayer.push({ 112 'event':eventCat, 113 'component':eventAction, 114 'component_value': eventLabel 115 }); 116 } 117 } 118 119 if(payload && eventCat === "fsb"){ 120 //let endpoint = xyzInfo.endpoint 121 let endpoint = xyzInfo.endpoint; 122 let action = xyzInfo.event; 123 let advertiser; 124 if(eventLabel){ 125 advertiser = eventLabel; 126 }else{ 127 advertiser = eventLabel.replace(/\s+/g, "-").toLowerCase(); 128 } 129 let payloadJson = {"action":action, "advertiser":advertiser, "pos":eventOrder, "clicktrack": clickTrack.uniqueId, "component": eventAction}; 130 131 jQuery.ajax({ 132 url: endpoint, 133 type: 'POST', 134 data: payloadJson, 135 error: function(error) { 136 console.error('Error:', error); 137 } 138 }); 139 } 140 141 //matomo 142 _paq.push(['trackEvent',eventCat, eventAction, eventLabel]); 143} 144 145function decorateLink(url){ 146 var tracker = ga.getAll()[0]; 147 var linker = new window.gaplugins.Linker(tracker); 148 var destinationUrl = url; 149 if(linker){ 150 destinationUrl = linker.decorate(destinationUrl); 151 } 152 return destinationUrl; 153} 154 155 156 157var widgetListener = false;
158var widgetClickListener = function() { 159 if(!widgetListener && jQuery('#btnSearchSchools')[0]){ 160 161 jQuery('select[name="educationLevelId"]').on('change', function() { 162 var widLoc = getWidgetPosition(jQuery(this)); 163 var eventCat = 'widget_interaction_' + widLoc; 164 var eventAction = 'education level'; 165 var eventCode = this.value; 166 sendEvent(eventCat, eventAction, eventCode,null); 167 }); 168 169 jQuery('select[name="outcomeIdList"]').on('change', function() { 170 var widLoc = getWidgetPosition(jQuery(this)); 171 var eventCat = 'widget_interaction_' + widLoc; 172 var eventAction = 'outcome'; 173 var eventCode = this.value; 174 sendEvent(eventCat, eventAction, eventCode,null); 175 }); 176 177 jQuery('select[name="tags"]').on('change', function() { 178 var widLoc = getWidgetPosition(jQuery(this)); 179 var eventCat = 'widget_interaction_' + widLoc; 180 var eventAction = 'tags'; 181 var eventCode = this.value; 182 sendEvent(eventCat, eventAction, eventCode,null); 183 }); 184 185 //jQuery('form[name="quickSearchWizardForm"]').on('submit', function() { 186 //jQuery('button[name="btnSearchSchools"]').click(function(e) { 187 jQuery('button[name="btnSearchSchools"]').on('click', function() { 188 var widLoc = getWidgetPosition(jQuery(this)); 189 var levelId = jQuery('#educationLevelId').val(); 190 var outcomeId = jQuery('#outcomeIdList').val(); 191 var tags = jQuery('#tags').val(); 192 var eventCode = levelId + "_" + outcomeId + "_" + tags; 193 var eventCat = 'widget_submit_' + widLoc; 194 var eventAction = 'button'; 195 sendEvent(eventCat, eventAction, eventCode,null); 196 }); 197 widgetListener = true; 198 window.removeEventListener('scroll',widgetClickListener); 199 window.removeEventListener('mousemove',widgetClickListener); 200 } 201}; 202window.addEventListener('scroll', widgetClickListener); 203window.addEventListener('mousemove', widgetClickListener); 204 205function getWidgetPosition(elem){ 206 var widLoc = "body"; 207 if (elem.parents('.searchboxleftnav').length || elem.parents('.searchbox-nav').length) { 208 widLoc = "left_nav"; 209 }else if(elem.parents('.searchbox-footer').length){ 210 widLoc = "footer"; 211 } 212 return widLoc; 213}
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.