1jQuery(function ($) { 2 3 /** 4 * Mobile Menu 5 */ 6 function mobilecheck() { 7 var check = false; 8 (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); 9 return check; 10 } 11 12 function init() { 13 14 var menu = document.getElementById( 'main-menu' ), 15 trigger = menu.querySelector( 'a.main-menu-trigger' ), 16 // event type (if mobile, use touch events) 17 eventtype = mobilecheck() ? 'touchstart' : 'click', 18 resetMenu = function() { 19 classie.remove( menu, 'main-menu-open' ); 20 classie.remove( document.getElementById( 'logo' ), 'logo-fix' ); 21 classie.remove( document.getElementById( 'logo' ), 'logo-fix' ); 22 $('body').removeClass('overflow-hidden'); 23 window.ontouchmove = null; 24 classie.add( menu, 'main-menu-close' ); 25 }, 26 closeClickFn = function( ev ) { 27 resetMenu(); 28 overlay.removeEventListener( eventtype, closeClickFn ); 29 }; 30 31 var overlay = document.createElement('div'); 32 overlay.className = 'main-overlay'; 33 menu.appendChild( overlay ); 34 35 trigger.addEventListener( eventtype, function( ev ) { 36 ev.stopPropagation(); 37 ev.preventDefault(); 38 39 if( classie.has( menu, 'main-menu-open' ) ) { 40 resetMenu(); 41 } 42 else { 43 classie.remove( menu, 'main-menu-close' ); 44 classie.add( menu, 'main-menu-open' ); 45 classie.add( document.getElementById( 'logo' ), 'logo-fix' ); 46 $('body').addClass('overflow-hidden'); 47 window.ontouchmove = preventDefault; // disable touch scroll 48 overlay.addEventListener( eventtype, closeClickFn ); 49 } 50 }); 51 52 // disable touch scroll 53 function preventDefault(e) { 54 e = e || window.event; 55 if (e.preventDefault) 56 e.preventDefault(); 57 e.returnValue = false; 58 } 59 60 } 61 62 init(); 63 64 /** 65 * Adjust mobile main menu accoding to window height 66 */ 67 var $this = this; 68 69 $this.adjustMenuHeight = function() { 70 71 if( $(window).width() < 992 ){ 72 var headerHeight = $("header").outerHeight(); 73 var menuHeight = $(window).height() - $(".header").height(); 74 var MenuChildrenCount = $("#menu-main-menu").children().length; 75 var menuLineHeight = menuHeight/MenuChildrenCount; 76 77 if (menuLineHeight > 100){ 78 menuLineHeight = 100; 79 } 80 81 $('.main-menu .site-menu > li > a').css('line-height',menuLineHeight + 'px'); 82 83 if ( menuLineHeight < 50 ) { 84 $('.main-menu .site-menu > li > a').css('fontSize', '1.4em'); 85 } 86 else { 87 $('.main-menu .site-menu > li > a').css('fontSize', '1.8em'); 88 } 89 } else { 90 $('.main-menu .site-menu > li > a').css('line-height', '2.15em'); 91 $('.main-menu .site-menu > li > a').css('fontSize', '17px'); 92 } 93 } 94 95 $(window).on("resize", function() { 96 $this.adjustMenuHeight(); 97 });
98 99 $this.adjustMenuHeight(); 100 101 /** 102 * Toggle search bar 103 */ 104 $("#search-btn").click(function(){ 105 $("#search-bar").toggleClass("search-toggle"); 106 $("#search-field").focus(); 107 }); 108 109 $("#search-btn").click(function(){ 110 $("#search-pop-container").toggleClass("search-toggle"); 111 $("#search-btn").toggleClass("is-active"); 112 $("#search-field").focus(); 113 }); 114 115 $("#explore-category").mouseenter(function(){ 116 $("#categories-dropdown-menu").addClass("categories-dropdown-menu-toggle"); 117 $("#explore-category").addClass("explore-category-toggle"); 118 }); 119 120 $("#explore-category, #categories-dropdown-menu").mouseleave(function(){ 121 if (!$("#categories-dropdown-menu").is(':hover')) { 122 $("#categories-dropdown-menu").removeClass("categories-dropdown-menu-toggle"); 123 $("#explore-category").removeClass("explore-category-toggle"); 124 } 125 }); 126 127 /** 128 * Display lang menu 129 */ 130 $(".pll-parent-menu-item").click(function(){ 131 $(".pll-parent-menu-item").toggleClass("is-active"); 132 }); 133 $(".pll-parent-menu-item").mouseleave(function(){ 134 $(".pll-parent-menu-item").removeClass("is-active"); 135 }); 136 137 /** 138 * Display sub menu 139 */ 140 $(".main-menu ul li.menu-item-has-children").click(function(){ 141 $(this).toggleClass("active"); 142 }); 143 144 /** 145 * Back to top in post pages 146 */ 147 $('#back-to-top').click(function() { 148 $('body,html').animate({scrollTop:0},1000); 149 }); 150 151 /** 152 * Validate the comment form when it is submitted 153 */ 154 $(document).ready(function() { 155 $("#commentform").validate(); 156 }); 157 158 /** 159 * Search form submit in category dropdown change 160 */ 161 $(".search-form .explore-category, .search-form .hvc-category").change(function() { 162 $(".search-form").submit(); 163 }); 164 165 /** 166 * Copy Embed Design 167 */ 168 $('#embed-design-copy').click(function(){ 169 $('#embed-design-textarea').copyme(); 170 }); 171 172 $.fn.copyme = function() { 173 this.select(); 174 $(this).focus(); 175 document.execCommand("copy"); 176 document.getSelection().removeAllRanges(); 177 }; 178 179 /** 180 * Toggle open class on HVC centralize page share button 181 */ 182 $(".hvc-centralize .share").hover(function () { 183 $(this).toggleClass('open'); 184 }); 185 186}); 187 188function hideElement(elSelector, hiddenClass) { 189 const elTarget = document.querySelector(elSelector); 190 if (!elTarget) { 191 console.error( 192 `Unable to hide element: Selector '${elSelector}' not found!` 193 ); 194 return; 195 } 196 elTarget.classList.add(hiddenClass); 197} 198 199document.addEventListener("DOMContentLoaded", function () { 200 const qs = new URLSearchParams(window.location.search); 201 const integrationParam = qs.get("integration"); 202 203 if (integrationParam === "msteams") { 204 attachMutationObserver() 205 document.querySelectorAll("a").forEach(function (anchor) { 206 if (anchor.href.includes("?integration=msteams")) return; 207 anchor.href = anchor.href + "?integration=msteams"; 208 }); 209 hideElement("#main-menu > div:first-child", "is-invisible"); 210 hideElement(".social-links", "hidden"); 211 hideElement(".site-footer", "hidden"); 212 hideElement(".blog-promo-sidebar", "hidden"); 213 hideElement(".site-footer", "hidden"); 214 hideElement(".auth-container", "hidden"); 215 } 216 217 setUserFirstLandingPage(); 218}); 219 220// attached mutation observer to hide 'Add This' social links 221function attachMutationObserver() { 222 function onMutation(mutationList) { 223 for (const mutation of mutationList) { 224 if (mutation.type === 'childList') { 225 mutation.addedNodes.forEach(hideIfAddThisElement); 226 } 227 } 228 }; 229 230 function hideIfAddThisElement(el) { 231 if (el.nodeType === Node.TEXT_NODE) return; // skip initial mutation 232 el.className.includes('at-share-dock-outer') && el.classList.add('hidden'); 233 el.className.includes('addthis-smartlayers') && el.classList.add('hidden'); 234 } 235 236 const observer = new MutationObserver(onMutation); 237 observer.observe(document.querySelector('body'), { attributes: false, childList: true, subtree: true });
238} 239 240/** 241 * Sets the user's first landing page as a GA4 user property. 242 * 243 * Checks if the `first_landing_page` is already stored in cookie. 244 * If not, it saves the current page's pathname in cookie to persist across sessions. 245 * Sends this value as a user property (`first_landing_page`) to GA4 using `gtag('set', 'user_properties', ...)`. 246 * Ensures this only runs once per user, tracking their first-ever page visit. 247 */ 248function setUserFirstLandingPage() { 249 if (!getCookie('first_landing_page')) { 250 setCookie('first_landing_page', window.location.pathname); 251 252 gtag('set', 'user_properties', { 253 'first_landing_page': window.location.pathname 254 }); 255 } 256} 257 258/** 259 * Set cookie 260 * @param {string} cookieName - The name of the cookie 261 * @param {string} cookieValue - The value to store in the cookie 262 * @param {number} [expiryDays=365] - Number of days until cookie expires 263 */ 264function setCookie(cookieName, cookieValue, expiryDays = 365) { 265 let expireDate = new Date(); 266 expireDate.setDate(expireDate.getDate() + expiryDays); 267 // change domain to `localhost` for local testing 268 document.cookie = cookieName + '= ' + cookieValue + '; path=/; domain=.creately.com' + '; expires=' + expireDate.toUTCString(); 269} 270 271/** 272 * Return cookie value for passing cookie name 273 * @param {string} cookieName 274 */ 275function getCookie(cookieName) { 276 let match = document.cookie.match(new RegExp('(^| )' + cookieName + '=([^;]+)')); 277 if (match) { 278 return match[2]; 279 } else { 280 return false; 281 } 282}
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.