{"version":3,"sources":["../../dev/j/avast.js"],"names":["jQuery","avm","define","evt","pos","speed","offset","$","require","off","position","velocity","preventDefault","animate","scrollTop","currentTarget","attr","window","location","hash","once","init","appendPbld","this","regex","RegExp","results","exec","href","param","each","indexOf","input","find","cartLink","val","document","on","changeCM","abTest","testVariant","avastGlobals","web","abtest","ticketNumber","querySelectorAll","forEach","el","dataCM","getAttribute","split","hrefCM","setAttribute","join","cj","getURLParameter","ref","toUpperCase","setCookie","name","decodeURI","search","value","domain","path","age","exp","p","d","encodeURIComponent","Date","setTime","getTime","toUTCString","cookie","Emitter","obj","mixin","key","prototype","addEventListener","event","fn","_callbacks","push","apply","arguments","removeListener","removeAllListeners","removeEventListener","length","callbacks","cb","i","splice","emit","args","slice","call","len","listeners","hasListeners","$languageSelectorBtn","body","classList","add","options","decimal","translate","number","root","undefined","isNaN","ds","numberDecimalSeparator","ts","numberThousandSeparator","number_format","numberOfDecimals","decimalSeparator","thousandSeparator","symbol","haddValue","haddRegex","providers","dr-store.avast.com","idRegex","paramTmpl","dr-store.avast.co.jp","store.avast.com","store.avast.ru","store.avast.ua","params","$this","cartUrl","attrName","getHaddParam","delim","charAt","substr","attributes","specified","toLowerCase","url","regID","id","hadd","replace","getHadd","nodeType","navigator","cookieEnabled","sessionStorage","localStorage","setItem","removeItem","error","console","warn","animateScroll","$langSelector","$html","self","avast","locale","addClass","proxy","toggleHandler","keyPressHandler","clickHandler","stopPropagation","is","target","className","which","toggleClass","hasClass","removeClass","prop","parents","mqMarker","selectors","sels","prefixRe","mqMarkerPrefix","match","els","nList","list","Array","log","cssClasses","remove","overlayScrollDisable","$body","mousewheel","all","querySelector","css","$overlayBox","$overlayBoxTrigger","$overlayBoxContainerClose","_data","routes","w","$window","hashChangeListener","substring","navigate","set","Error","urlObject","hasOwnProperty","Object","urlString","lang","setDate","getDate","toGMTString","slider","pager","controls","auto","pause","prevDomEl","nextDomEl","subheaderDomEl","textPagerDomEl","useCSS","type","cDomEl","settings","context","closest","parent","slideLocked","pagerEls","children","mode","onSlideBefore","$slideElement","oldIndex","newIndex","eq","onSlideAfter","bxSlider","click","e","goToPrevSlide","stopAuto","goToNextSlide","index","goToSlide","klas","c","onBeforeSlide","currentSlide","totalSlides","getCurrentSlide","thumbIndex","maxSlides","nextSelector","hide","prevSelector","getSlider","forceSlider","reloadSlider","height","pathname","hostname","top","data","getItem","decodeURIComponent","n","clear","nId","tabs","eId","easytabs","select","sHref","dataLayer","trackEvents","chromeOffer","view","eventCategory","eventAction","eventLabel","passwordCheck","called","methods","track","evtName","evtObj","callback","space","handler","spaces","toString","urlQuery","urlParameters","urlParametersLength","urlParameter","addValue","String","getData","getEncodedData","base64encode","stringify","JSON","t","v","json","arr","constructor","o1","o2","o3","h1","h2","h3","h4","bits","b64","ac","enc","tmp_arr","charCodeAt","r","$element","offsetTop","offsetBottom","waypoint","elementTop","elementBottom","outerHeight","viewportTop","viewportBottom","innerHeight","urlBag","aswparam","inited","cartLinks","CX","urls","paramPattern","paramRegex","appendBeforeRegex","SL","globalCartLinks","cookies","p_pro","p_vbd","p_hid","testCookieFail","urlParams","p_glic","values","cookieFail","paramsFromUrl","ppc","updateAswparamPlaceholderLinks","paramName","cookieName","getClientInfo","inArray","urlParamName","urlParamValue","updateLinks","link","linkDecorator","getCookieValue","parts","pop","shift","urlBagEncodedData","provider","providerDef","providerUrl","client","aswparamValue","newLink","not","elDataAswparamPlaceholder","escape","isCookieEnabled","storageFactory","keys","cookieStorage","expires","secure","regExp","test","keysArray","keysArrayLength","regexS","couponParam","cookieExpirationTime","setMonth","getMonth","hostnameSplitted","userAgent","userLanguage","patterns","isStorageEnabled","appCodeName","appVersion","language","browser","Avast","version","Opera","Edge","EdgeChromium","Chrome","Firefox","InternetExplorer","Safari","os","WindowsPhone","Windows","10","8.1","8","7","Vista","XP","2000","Android","IOS","Mac","Linux","Unix","testRegExp","subPatterns","subResults","subversion","isName","nameFound","subversionFound","subPattern","item","downloadPopup","conf","defaults","popup","openBtn","closeBtn","exitIntent","config","extend","$popup","outerWidth","switchBrowser","closeBtnHandler","mouseoutHandler","exitIntentHandler","toElement","relatedTarget","clientY","browserObj","detect","isChrome","isAvast","isEdgeChromium","isFirefox","isOpera","isSafari","isEdge","isInternetExplorer","selector","querystring","newValue","query","unserialize","paramArr","$els","result","$el","prepend","hrefParams","browserDetect","tasks","downloadNameMatch","dlPopup","downloadNames","downloadName","dataset","role","needle","lastIndexOf","URL","searchParams","task","behaviorSelector","configSelectors","pathName","fileName","unserializedUrl","cmpgContent","cmpg_for_af","detected","isAndroid","isIOS","mobileTracking","disableLanguageSelector","navSel","isDesktop","getComputedStyle","getPropertyValue","clearFirstMenuClasses","firstMenu","firstMenuClasses","clearSecondMenuClasses","secondMenu","secondMenuClasses","expandSecondLevel","classes","updateNavigation","openSecondMenu","cachedSecondMenu","clickedSecondMenu","removeSpaces","defInnerLinks","isHidden","thirdMenuLinks","openedThirdMenu","removeExpanded","menuOpened","menuOpenedClass","closeRegionModal","closeSubMenus","languageSelectorTrigger","focus","$style","display","overflow","parentNode","str","strSplitted","map","desktopNav","navInit","preSelectLevels","elementFromPoint","clientX","parentElement","previousElementSibling","$navigation","keyCode","menuElement","openedSubMenu","activeElement","setFocus","innerHTML","$secondMenuBlogs","contains","matches","$languageSelectorButtons","from","history","pushState","avast_regions","element","setTimeout","detectLink","pageNotFound","selfHref","selfHrefParams","getParamsFromHref","isDevEnv","currentPage","isEmptyObject","currentPageParams","detectParent","$foundLinkElement","$parent","$parentWithData","parentClasses","availableClasses","linkFoundInNavigation","separator","$navigationSecondMenuLinks","ulocale","avastGlobalsAvailable","$pressCenter","$blogSecondMenu","$blogMenu","contentGroup","setDesktopNav","mqDesktop","setMqMarkers","setMobileNav","mobileNav","$toggleMenu","$hintToggler","$hintClose","messageBar","cookiesBanner","$target","button","cachedFirstMenu","clickedFirstMenu","mqMobile","$languageSelector","itemData","itemClass","detectedPlatform","matchMedia","checkIfApplyPopupLogicForCurrentPage","page","currentPageName","buttonSelector","isArray","configCurrentPage","applyBrandingStyle","$popupButton","$platformIcon","pageSupportedPlatform","supportedPlatformIcon","defaultIconName","supportedPlatforms","style","updateInsteadLinks","alternativeLinks","alternativeTracking","$targetLinks","detectOthers","_alternativeLinks","$document","pathnameSplitted","android","text","ios","mac","windows","ready","$platformPlaceHolderHeader","$supportedPlatformPlaceHolder","$downloadButton","downloadButtonData","data-os","data-download-name","$close","bodyOverflow","trigger","detectedBrowser","detectedVersion","notSupportedBrowser","router","platforms","disableHash","$jsPlatformSwitcher","$popupButtons","$overlayBoxClose","detectPlatform","switcher","closeOverlayBox","showButtons","pc","addBodyClass","rootPlatform","platform","isMac","addRootClass","resetPlatformClass","selectPlatform","getUrlParameter","sParam","sParameterName","sPageURL","sURLVariables","getExpirationTime","hours","now","domainName","direction","waypoints","lastScrollTop","behavior","stick","highlight","handleClick","visible","$bar","clone","firstItemId","lastItemId","h","anchorId","st","before","lastSection","$self","timeout","clearTimeout","$item","updateActiveItem","qs","re","brcmpgid","ASBLinks","downloadURL","downloadQueryString","URLSearchParams","$cartLink","cmpgMarker","campaignMarker","minutes","isCampaignMarker","updatedLink","campainMarker","CMPGNMARKER","cm","SMBCookeValue","getCampaignMarkerCookie","cookieValue","replaceCookieString","decorateCartLink","updateDataAttr","setCampaignMarkerCookie","nodeList","nodes","HTMLElement","SMBRegExp","links","dataAttr","tracker","hasBanner","product","isMsBuild","isAsb","show","trackClick","pExt","pExtVal","CookieBar","$footer","footerInitialPadding","footerInitialMargin","mediaQuery","mobileScreen","cookieDom","cookieCloseDom","close","today","expire","initialise","opts","legacy","legacySettings","boot","exportLegacy","disabledModules","module","disableAppendPbld","disableAswparam","disableCj","disableShowCouponCode","disableHadd","disableTabs","ie6zh","disableTabsAnchor","disableSmoothScroll","disableSetLanguage","disableSlider","pagerSelector","buildPager","rum","message","ppBx","infiniteLoop","moveSlides","minSlides","slideWidth","slideMargin","onSliderLoad","slideIndex","disableCookieConsent","scanner","slideTop","tooltip","topHeight","minHeight","moduleName","req","RootPath","responsive","rootPath","getOS","getWinVersion","tabsAnchor","src","skipped","getConfig"],"mappings":"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","file":"avast.js","sourcesContent":["/**\n * Avast superclass\n * @author Milan Adam, Ales Gabriel\n * @copyright Avast Software s.r.o ©2011-15\n */\nif (typeof jQuery !== 'undefined') {\n\tif (typeof avm === 'object' && typeof avm.define === 'function') {\n\t\tavm.define('jquery', jQuery);\n\t}\n}\n\n\n/**\n * Animation for scrolling on page\n * @version 2.2.4\n * @author Michal Langhoffer , Ales Gabriel \n * @module avast.scroll.animateScroll\n * @requires jquery\n * @param {event} [evt]\n * @param {number} [pos]\n * @param {number} [speed]\n * @param {number} [offset]\n */\n\navm.define('avast.scroll.animateScroll', function (evt, pos, speed, offset) {\n 'use strict';\n var $ = avm.require('jquery'),\n off = offset ? offset : 0,\n position = pos ? pos + off : 0,\n velocity = speed ? speed : 0;\n\n if(evt && typeof evt.preventDefault === 'function') {\n evt.preventDefault();\n }\n\n $('html, body').animate(\n {scrollTop: position + 'px'},\n velocity,\n\t\tfunction() {\n\t\t\tif (evt && $(evt.currentTarget).attr('data-hash')) {\n\t\t\t\twindow.location.hash = $(evt.currentTarget).attr('data-hash');\n\t\t\t}\n\t\t}\n );\n});\n/**\n * Append p_bld param to cart links\n * @version 0.2.0\n * @author Ales Gabriel \n * @module avast.web.appendPbld\n * @requires jquery\n */\navm.define('avast.web.appendPbld', (function () {\n 'use strict';\n \n var $ = avm.require('jquery');\n \n return {\n once: 0,\n init: function(){\n var appendPbld = this;\n var re = '[\\\\?&](p_bld=[^&#]*)';\n var regex = new RegExp(re, 'i');\n var results = regex.exec(window.location.href);\n var param = '';\n \n if(results){\n // Web\n $('a').each(function() {\n if (this.href.indexOf('store.avast.com') != -1 && this.href.indexOf('p_bld=') == -1) {\n param = (this.href.indexOf('?') > -1) ? '&' + results[1] : '?' + results[1];\n this.href += param;\n }\n });\n // Ints\n $('.choice', '.selection').each(function() {\n var input = $(this).find('input[type=radio]');\n var cartLink = input.val();\n if (cartLink.indexOf('store.avast.com') != -1 && cartLink.indexOf('p_bld=') == -1) {\n param = (cartLink.indexOf('?') > -1) ? '&' + results[1] : '?' + results[1];\n input.val(cartLink + param);\n }\n });\n }\n\n if (!this.once) {\n $(document).on('avast.ab.updatePrice avast.bab.updatePrice', function() {appendPbld.init();});\n this.once = 1;\n }\n }\n };\n})());\n\n/**\n * Avast CampaignMarker set from Google Optimize WYSIWYG editor\n * @version 1.0.0\n * @author Jaroslav Slaby \n * @module avast.web.campaignMarkerChange\n * @copyright Avast Software s.r.o ©2020\n */\n\navm.define('avast.campaignMarkerChange', function() {\n\treturn {\n\t\tchangeCM: function(abTest, testVariant) {\n\t\t\tavastGlobals.web.abtest = {\n\t\t\t\t'ticketNumber': abTest,\n\t\t\t\t'testVariant': testVariant\n\t\t\t}\n\n\t\t\tdocument.querySelectorAll('[data-role=cart-link]').forEach(function(el) {\n\t\t\t\tvar dataCM = el.getAttribute('data-campaign-marker').split('~'),\n\t\t\t\t\threfCM = el.getAttribute('href').split('~');\n\n\t\t\t\tdataCM[3] = abTest;\n\t\t\t\tdataCM[4] = testVariant;\n\t\t\t\threfCM[3] = abTest;\n\t\t\t\threfCM[4] = testVariant;\n\t\t\t\tel.setAttribute('data-campaign-marker', dataCM.join('~'))\n\t\t\t\tel.setAttribute('href', hrefCM.join('~'))\n\t\t\t})\n\t\t}\n\t}\n});\n\n/**\n * Create SOURCE cookie from ref=cj, ref=td query string parameter\n * @version 0.2.0\n * @author Ales Gabriel, Michal Samaš\n * @module avast.web.cj\n * @todo use avast.storage modules for cookie\n * @copyright Avast Software s.r.o ©2015\n */\n\navm.define('avast.web.cj', (function() {\n var cj = {\n init: function(){\n var cj = this;\n var param = cj.getURLParameter('ref');\n var ref = (typeof param === 'string') ? param.toUpperCase() : null;\n var cjCookieName = 'SOURCE';\n var age = 7776000; // 90 days to expire\n var domain = '.avast.com';\n var path = '/';\n\n\t\t\tif (ref === 'CJ' || ref === 'TD') {\n cj.setCookie(cjCookieName, ref, domain, path, age);\n }\n },\n getURLParameter: function(name) {\n return decodeURI((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]);\n },\n setCookie: function(name,value,domain,path,age) {\n var exp = \"\",p = \";path=/\",d = \"\";\n var val = (value) ? encodeURIComponent(value) : '';\n if (age) {\n d = new Date();\n d.setTime(d.getTime()+(age*1000));\n exp = \";expires=\"+d.toUTCString()+\";max-age=\"+ age;\n }\n if(path){\n p = \";path=\"+path;\n } \n if(domain){\n d = \";domain=\"+domain;\n } \n\n document.cookie = name+\"=\"+val+exp+d+p+\";\";\n }\n };\n\nreturn cj;\n\n})());\n\n/**\n * Event emitter\n * @version 1.0.0\n * @author Ales Gabriel \n * @module avast.event.emitter\n * @return {Function} Emitter constructor\n */\navm.define('avast.event.emitter', (function(){\n\t'use strict';\n\n\t/**\n\t * Event emitter\n\t * @version 1.2.1\n\t * @see {@link https://github.com/component/emitter}\n\t */\n\n\t/*\n\t(The MIT License)\n\n\tCopyright (c) 2014 Component contributors \n\n\tPermission is hereby granted, free of charge, to any person\n\tobtaining a copy of this software and associated documentation\n\tfiles (the \"Software\"), to deal in the Software without\n\trestriction, including without limitation the rights to use,\n\tcopy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the\n\tSoftware is furnished to do so, subject to the following\n\tconditions:\n\n\tThe above copyright notice and this permission notice shall be\n\tincluded in all copies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n\tEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n\tOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n\tNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n\tHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n\tWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n\tFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n\tOTHER DEALINGS IN THE SOFTWARE.\n\t*/\n\n\t/**\n\t * Initialize a new `Emitter`.\n\t *\n\t * @api public\n\t */\n\n\tfunction Emitter(obj) {\n\t if (obj) return mixin(obj);\n\t};\n\n\t/**\n\t * Mixin the emitter properties.\n\t *\n\t * @param {Object} obj\n\t * @return {Object}\n\t * @api private\n\t */\n\n\tfunction mixin(obj) {\n\t for (var key in Emitter.prototype) {\n\t\tobj[key] = Emitter.prototype[key];\n\t }\n\t return obj;\n\t}\n\n\t/**\n\t * Listen on the given `event` with `fn`.\n\t *\n\t * @param {String} event\n\t * @param {Function} fn\n\t * @return {Emitter}\n\t * @api public\n\t */\n\n\tEmitter.prototype.on =\n\tEmitter.prototype.addEventListener = function(event, fn){\n\t this._callbacks = this._callbacks || {};\n\t (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n\t\t.push(fn);\n\t return this;\n\t};\n\n\t/**\n\t * Adds an `event` listener that will be invoked a single\n\t * time then automatically removed.\n\t *\n\t * @param {String} event\n\t * @param {Function} fn\n\t * @return {Emitter}\n\t * @api public\n\t */\n\n\tEmitter.prototype.once = function(event, fn){\n\t function on() {\n\t\tthis.off(event, on);\n\t\tfn.apply(this, arguments);\n\t }\n\n\t on.fn = fn;\n\t this.on(event, on);\n\t return this;\n\t};\n\n\t/**\n\t * Remove the given callback for `event` or all\n\t * registered callbacks.\n\t *\n\t * @param {String} event\n\t * @param {Function} fn\n\t * @return {Emitter}\n\t * @api public\n\t */\n\n\tEmitter.prototype.off =\n\tEmitter.prototype.removeListener =\n\tEmitter.prototype.removeAllListeners =\n\tEmitter.prototype.removeEventListener = function(event, fn){\n\t this._callbacks = this._callbacks || {};\n\n\t // all\n\t if (0 == arguments.length) {\n\t\tthis._callbacks = {};\n\t\treturn this;\n\t }\n\n\t // specific event\n\t var callbacks = this._callbacks['$' + event];\n\t if (!callbacks) return this;\n\n\t // remove all handlers\n\t if (1 == arguments.length) {\n\t\tdelete this._callbacks['$' + event];\n\t\treturn this;\n\t }\n\n\t // remove specific handler\n\t var cb;\n\t for (var i = 0; i < callbacks.length; i++) {\n\t\tcb = callbacks[i];\n\t\tif (cb === fn || cb.fn === fn) {\n\t\t callbacks.splice(i, 1);\n\t\t break;\n\t\t}\n\t }\n\t return this;\n\t};\n\n\t/**\n\t * Emit `event` with the given args.\n\t *\n\t * @param {String} event\n\t * @param {Mixed} ...\n\t * @return {Emitter}\n\t */\n\n\tEmitter.prototype.emit = function(event){\n\t this._callbacks = this._callbacks || {};\n\t var args = [].slice.call(arguments, 1)\n\t\t, callbacks = this._callbacks['$' + event];\n\n\t if (callbacks) {\n\t\tcallbacks = callbacks.slice(0);\n\t\tfor (var i = 0, len = callbacks.length; i < len; ++i) {\n\t\t callbacks[i].apply(this, args);\n\t\t}\n\t }\n\n\t return this;\n\t};\n\n\t/**\n\t * Return array of callbacks for `event`.\n\t *\n\t * @param {String} event\n\t * @return {Array}\n\t * @api public\n\t */\n\n\tEmitter.prototype.listeners = function(event){\n\t this._callbacks = this._callbacks || {};\n\t return this._callbacks['$' + event] || [];\n\t};\n\n\t/**\n\t * Check if this emitter has `event` handlers.\n\t *\n\t * @param {String} event\n\t * @return {Boolean}\n\t * @api public\n\t */\n\n\tEmitter.prototype.hasListeners = function(event){\n\t return !! this.listeners(event).length;\n\t};\n\n\treturn Emitter;\n})());\n\n/**\n * Footer - global footer events\n * Opens language selector on navigation\n * @version 1.0.0\n * @author Ales Gabriel \n * @module avast.web.footer\n */\n\navm.define('avast.web.footer', function() {\n\t'use strict';\n\n\tvar $languageSelectorBtn = $('.select-region-button'),\n\t\tlanguageSelectorBodyCssClass = 'first-menu-regions',\n\t\tjqObject;\n\n\tjqObject = $languageSelectorBtn.on('click', function(evt) {\n\t\tevt.preventDefault();\n\t\tdocument.body.classList.add(languageSelectorBodyCssClass);\n\t});\n\n\treturn jqObject;\n});\n\n/**\n * Avast Number format\n * @version 2.1.0\n * @author Michal Langhoffer \n * @module avast.number.format\n * @requires jquery\n */\n\navm.define('avast.number.format', (function () {\n 'use strict';\n var $ = avm.require('jquery');\n return {\n options: {\n decimal: 0\n },\n translate: function (number, decimal) {\n var root = this,\n avastGlobals = window.avastGlobals;\n\n if (decimal !== undefined) {\n this.options.decimal = decimal;\n } else {\n this.options.decimal = 0;\n }\n if (!isNaN(number) && avastGlobals && typeof avastGlobals.web === 'object') {\n var ds = avastGlobals.web.numberDecimalSeparator,\n ts = avastGlobals.web.numberThousandSeparator;\n if (ds && ds) {\n var val = $().number_format(\n number,\n {\n numberOfDecimals: root.options.decimal,\n decimalSeparator: ds,\n thousandSeparator: ts,\n symbol: \"\"\n }\n );\n return val;\n } else {\n return number;\n }\n } else {\n return number;\n }\n }\n };\n})());\n/**\n * Avast hadd manipulation class\n * @version 2.1\n * @author Michal Langhoffer, Milan Adam, Ales Gabriel\n * @copyright Avast Software s.r.o ©2014\n */\navm.define('avast.hadd', function () {\n 'use strict';\n return {\n haddValue: '',\n options: {\n haddRegex: \"[\\\\?&]hadd=([^&#]*)\",\n providers: {\n \"dr-store.avast.com\": {\n idRegex: \"[\\\\?&]PRODUCT([^&#=]*)\",\n paramTmpl: \"HADD{{id}}[ADDITIONAL1]={{hadd}}\"\n },\n \"dr-store.avast.co.jp\": {\n idRegex: \"productID[\\\\.]([^&#=\\/]*)[\\/]\",\n paramTmpl: \"/HADD.{{id}}/ADDITIONAL1.{{hadd}}\"\n },\n \"store.avast.com\": {\n idRegex: \"productID[\\\\.]([^&#=\\/]*)[\\/]\",\n paramTmpl: \"/HADD.{{id}}/ADDITIONAL1.{{hadd}}\"\n },\n \"store.avast.ru\": {\n paramTmpl: \"licenseid={{hadd}}\"\n },\n \"store.avast.ua\": {\n paramTmpl: \"licenseid={{hadd}}\"\n }\n }\n },\n\n init: function (params) {\n //console.time('hadd sken');\n var root = this,\n listen = false;\n\n if (params !== undefined) {\n for (var key in params){\n this.options[key] = params[key];\n }\n }\n\n var regex = new RegExp(this.options.haddRegex,\"i\"),\n results = regex.exec(window.location.href);\n\n if (results === null) {\n // Stops here if no HADD in url\n return 1;\n } else {\n if (!this.haddValue){\n // Store hadd parameter value\n this.haddValue = results[1];\n // Listen to price update and sken again.\n // TODO: Remove 'avast.ab.updatePrice', 'avast.bab.updatePrice' events, when all triggers replaced with 'priceUpdate.ab.avast'.\n $(document).on('priceUpdate.ab.avast avast.ab.updatePrice avast.bab.updatePrice', function () {root.init();});\n }\n\n // Scan all links, radio buttons\n $('a, input[type=\"radio\"]').each(function () {\n var $this = $(this),\n cartUrl = $this.attr('href') || $this.attr('value') || \"\",\n attrName = 'href',\n param = root.getHaddParam(cartUrl),\n delim = '';\n\n if (param && cartUrl.indexOf(param) === -1) {\n if (param.charAt(0) !== '/' && cartUrl.substr(cartUrl.length - 1) !== '&') {\n delim = (cartUrl.indexOf(\"?\") == -1) ? \"?\" : \"&\";\n }\n cartUrl = cartUrl + delim + param;\n\n // check if it has specified property\n $.each(this.attributes, function () {\n if (this.specified && this.name) {\n if (this.name.toLowerCase() === 'href') {\n attrName = 'href';\n return false;\n } else if (this.name.toLowerCase() === 'value') {\n attrName = 'value';\n }\n }\n });\n\n $this.attr(attrName, cartUrl);\n }\n });\n }\n //console.timeEnd('hadd sken');\n },\n\n getHaddParam: function (url) {\n var providers = this.options.providers,\n hadd = this.haddValue,\n param,\n regID,\n id;\n\n for (var key in providers) {\n if (url && url.indexOf(key) != -1) {\n // Look for ID number, if provider has regexp for id search\n if (providers[key].idRegex) {\n regID = providers[key].idRegex ? new RegExp(providers[key].idRegex,\"i\") : '';\n id = regID.exec(url);\n }\n // Replace param template with id\n if (id &&providers[key].paramTmpl) {\n param = providers[key].paramTmpl.replace('{{id}}', id[1]).replace('{{hadd}}', hadd);\n }\n // Replace param template without id\n if (!id && providers[key].paramTmpl) {\n param = providers[key].paramTmpl.replace('{{hadd}}', hadd);\n }\n }\n }\n return param;\n },\n\n getHadd: function (el) {\n // Check in which elements attribute cart link is stored.\n var url;\n\n if (el && el.nodeType === 1) {\n if (el.href) {\n url = el.href;\n }\n if (el.value) {\n url = el.value;\n }\n }\n\n return this.getHaddParam(url);\n }\n };\n});\n/**\n * Check if cookie support is enabled\n * @version 1.0.0\n * @author Jiri Duchon \n * @module avast.storage.isCookieEnabled\n */\navm.define('avast.storage.isCookieEnabled', (function() {\n\t'use strict';\n\tif (navigator.cookieEnabled) {\n\t\treturn true;\n\t} else {\n\t\tvar key = 'isCookieEnabled';\n\t\tdocument.cookie = key + '=1';\n\t\tif (document.cookie.indexOf(key + '=1') !== -1) {\n\t\t\tdocument.cookie = key + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n})());\n\n/**\n * Check if storage support is enabled\n * @version 1.1.0\n * @author Jiri Duchon \n * @module avast.storage.isStorageEnabled\n */\navm.define('avast.storage.isStorageEnabled', (function() {\n\t'use strict';\n\ttry {\n\t\tif (typeof sessionStorage === 'object' && sessionStorage && typeof localStorage === 'object' && localStorage) {\n\t\t\tvar key = 'isStorageEnabled';\n\t\t\tsessionStorage.setItem(key, '1');\n\t\t\tsessionStorage.removeItem(key);\n\t\t\tlocalStorage.setItem(key, '1');\n\t\t\tlocalStorage.removeItem(key);\n\t\t\treturn true;\n\t\t}\n\t} catch (error) {\n\t\tif (typeof console === 'object' && console && typeof console.warn === 'function') {\n\t\t\tconsole.warn(error);\n\t\t}\n\t}\n\treturn false;\n})());\n\n/**\n* Avast Language selector \n* @version 2.0.3\n* @author Michal Langhoffer, Ales Gabriel\n* @module avast.web.languageSelector\n* @requires jquery\n* @requires avast.scroll.animateScroll\n*/\n\navm.define('avast.web.languageSelector', function () {\n\t'use strict';\n\tvar $ = avm.require('jquery'),\n\t\tanimateScroll = avm.require('avast.scroll.animateScroll'),\n\t\t$langSelector = $('#lang-selector'),\n\t\t$html = $('html');\n\treturn {\n\t\tinit: function () {\n\t\t\tvar self = this;\n\t\t\t// Highligh current region\n\t\t\t$langSelector.find('.' + avast.locale).addClass('highlight');\n\n\t\t\t$('.region-selector a, #lang-selector .selector-close').on('click', $.proxy(self.toggleHandler, self));\n\n\t\t\t$(document).on('keydown.languageSelector.avast', $.proxy(self.keyPressHandler, self));\n\t\t\t$langSelector.on('click', $.proxy(self.clickHandler, self));\n\t\t},\n\t\ttoggleHandler: function (evt) {\n\t\t\t// Can be called without argument so check it first\n\n\t\t\tif (evt) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tevt.stopPropagation();\n\t\t\t}\n\t\t\tif ($(evt.currentTarget).is('.region .region-selector-button') || evt.target.className === 'selector-close' || evt.which === 27) {\n\t\t\t\t$langSelector.toggleClass('open');\n\t\t\t}\n\t\t\tif ($langSelector.hasClass('open')) {\n\t\t\t\t$html.addClass('lang-selector-open');\n\t\t\t\tif (animateScroll) {\n\t\t\t\t\tvar pos = $(window).scrollTop();\n\t\t\t\t\tanimateScroll(evt, pos);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$html.removeClass('lang-selector-open');\n\t\t\t}\n\t\t},\n\t\tkeyPressHandler: function (evt) {\n\t\t\tif (evt.which === 27 && $('.lang-selector-open').length > 0) {\n\t\t\t\tthis.toggleHandler(evt);\n\t\t\t}\n\t\t},\n\t\tclickHandler: function (evt) {\n\t\t\tvar target = $(evt.target);\n\t\t\tif (target.prop('tagName').toLowerCase !== 'a' && target.parents('.rs-region').length === 0) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tthis.toggleHandler(evt);\n\t\t\t} else {\n\t\t\t\tevt.stopPropagation();\n\t\t\t}\n\t\t}\n\t};\n});\n/**\n * mqMarker module - Mark elements with css class based on media query\n * Indicate what type of resolution (desktop/mobile) is presented.\n * Based on that, specific elements are marked with css class.\n * Can be used for event delegation and different behavior on desktop/mobile\n * Only one marker per element is possible\n * @param mqMarker {string} Marker as css class. Must have unique prefix separated with \"-\".\n * @version 0.0.1\n * @author Ales Gabriel \n * @module avast.web.mqMarker\n * @param selectors {String} Comma separated list of selectors \n * @param context {DOMElement} Context for querySelector \n * @returns els {Array} DOM elements\n */\n\t\navm.define('avast.web.mqMarker', function(mqMarker, selectors) {\n\t// Define selectors for elements which will be marked.\n\tvar sels = selectors || 'body',\n\t\tprefixRe = /^.*?-/,\n\t\tmqMarkerPrefix = mqMarker.match(prefixRe),\n\t\tels = [],\n\t\tnList = document.querySelectorAll(sels),\n\t\tlist = Array.prototype.slice.call(nList); // Support IE11\n\n\tif (typeof mqMarker !== 'string' && mqMarkerPrefix.length === 0) {\n\t\tconsole.log('mqMarker prefix separated by \"-\" is missing: %s', mqMarker);\n\t\treturn els;\n\t}\n\n\tlist.forEach(function(el) {\n\t\tvar cssClasses = el.classList;\n\n\t\twindow.console.log(cssClasses.length);\n\t\t// Removes all classes with the same prefix\n\t\tif (cssClasses.length) {\n\t\t\tfor (var i = 0; cssClasses.length > i; i++) {\n\t\t\t\tif (cssClasses[i].match(prefixRe)[0] === mqMarkerPrefix[0]) {\n\t\t\t\t\t// console.log('Removed class: %s', cssClasses[i]);\n\t\t\t\t\tel.classList.remove(cssClasses[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (mqMarker) {\n\t\t\tel.classList.add(mqMarker);\n\t\t}\n\n\t\tels.push(el);\n\t});\n\n\treturn els;\n});\n\n/**\n * Avast Overlay Popup\n * @version 1.0.0\n * @author Michal Langhoffer \n * @module avast.web.overlayPopup\n * @requires jquery\n */\navm.define('avast.web.overlayPopup', function () {\n 'use strict';\n var $ = avm.require('jquery'),\n $body = $('body'),\n $overlayBox = $('.overlay-box'),\n $overlayBoxTrigger = $('.overlay-box-trigger'),\n $overlayBoxContainerClose = $('.overlay-box-container .close');\n // Disabling scroll event when overlay active\n function overlayScrollDisable() {\n $body.on({\n 'mousewheel': function (event) {\n if (event.target.id === 'el') {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n }\n });\n if (document.all && document.querySelector && !document.addEventListener) {\n $body.css('overflow', 'auto');\n } else {\n $body.css('overflow', 'hidden');\n }\n }\n // Window resize functions\n $(window).on('resize', function () {\n if ($('[class*=\"overlay-box\"]').hasClass('is-visible')) {\n overlayScrollDisable();\n }\n });\n // scroll event disable when popup active\n $('[class*=\"overlay-box-trigger\"]').on('click', function () {\n overlayScrollDisable();\n });\n $overlayBoxContainerClose.on('click', function () {\n $body.off('mousewheel');\n $body.css('overflow', 'auto');\n });\n\n //open popup\n $overlayBoxTrigger.on('click', function (event) {\n event.preventDefault();\n var _data = ($(this).attr('data-box'));\n $('.overlay-box[data-box*=\"' + _data + '\"]').addClass('is-visible');\n });\n\n //close popup\n $overlayBox.on('click', function (event) {\n if ($(event.target).is('.close') || $(event.target).is('.overlay-box')) {\n event.preventDefault();\n $(this).removeClass('is-visible');\n }\n });\n //close popup when clicking the esc keyboard button\n $(document).on('keyup', function (event) {\n if (event.which === 27) {\n $overlayBox.removeClass('is-visible');\n $body.off('mousewheel');\n $body.css('overflow', 'auto');\n }\n });\n});\n/**\n * Avast Router\n * @version 1.0.1\n * @author Michal Langhoffer \n * @module avast.web.router\n * @requires jquery\n */\navm.define('avast.web.router', (function () {\n\t'use strict';\n\tvar $ = avm.require('jquery'),\n\t\troutes,\n\t\tself,\n\t\tw = window,\n\t\t$window = $(window);\n\n\treturn {\n\t\t/*\n\t\t * add window hashchange listener\n\t\t * look for key in routes object and execute its function\n\t\t */\n\t\thashChangeListener: function () {\n\t\t\tself = this;\n\t\t\t$window.on('hashchange', function () {\n\t\t\t\tself.exec(w.location.hash.substring(1));\n\t\t\t});\n\t\t},\n\t\t/*\n\t\t * @param {string} [path]\n\t\t * change hash in URL if it is not the same as current one, otherwise execute function from routes object\n\t\t */\n\t\tnavigate: function (path) {\n\t\t\tif (w.location.hash.substring(1) !== path) {\n\t\t\t\tw.location.hash = path;\n\t\t\t} else {\n\t\t\t\tthis.exec(path);\n\t\t\t}\n\t\t},\n\t\t/* \n\t\t * @param {string} [path]\n\t\t * execute function from routes object\n\t\t */\n\t\texec: function (path) {\n\t\t\tif (routes[path]) {\n\t\t\t\troutes[path]();\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/*\n\t\t * @param {object} [path]\n\t\t * set the routes object\n\t\t * add hashchange listener\n\t\t * after page load check hash and execute function from routes object\n\t\t * return routes object if path is object, otherwise throw error\n\t\t */\n\t\tset: function (path) {\n\t\t\troutes = path;\n\t\t\tself = this;\n\t\t\tself.hashChangeListener();\n\t\t\tself.navigate(w.location.hash.substring(1));\n\t\t\tif (typeof path === 'object') {\n\t\t\t\treturn routes;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Object has to be passed to router.set()');\n\t\t\t}\n\t\t}\n\t};\n})());\n/**\n * Serialize URL parameters from object to string\n * @version 1.1.0\n * @author Jiri Duchon \n * @module avast.url.serialize\n * @param {Object} urlObject\n * @returns {string}\n */\navm.define('avast.url.serialize', function(urlObject) {\n\t'use strict';\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\tif (typeof urlObject === 'object' && urlObject) {\n\t\tvar urlString = '';\n\t\tfor (var key in urlObject) {\n\t\t\tif (hasOwnProperty.call(urlObject, key)) {\n\t\t\t\tif (urlString.length) {\n\t\t\t\t\turlString += '&';\n\t\t\t\t}\n\t\t\t\turlString += encodeURIComponent(key) + '=' + encodeURIComponent(urlObject[key]);\n\t\t\t}\n\t\t}\n\t\treturn urlString;\n\t} else {\n\t\tthrow new Error('Invalid method arguments to avast.url.serialize');\n\t}\n});\n\n/**\n * Set cookie avastComLocale with locale value\n * @version 0.1.0\n * @author Ales Gabriel \n * @module avast.web.setLanguage\n */\navm.define('avast.web.setLanguage', function (lang) {\n 'use strict'; \n \n var d=new Date();\n d.setDate(d.getDate() + 365);\n document.cookie = \"avastComLocale=\"+lang+\";path=/;EXPIRES=\" + d.toGMTString(); \n});\n\n/**\n * BXslider wrapper\n * @version 0.1.0\n * @author Milan Adam , Ales Gabriel \n * @module avast.web.slider\n * @requires jquery\n */\n\navm.define('avast.web.slider', (function(){\n\n var $ = avm.require('jquery');\n\n var slider = {\n /**\n * @var bxSlider slider - instance of slider\n */\n slider:null,\n /**\n * Slider default options\n * @var boolean pager - creating pager or not\n * @var boolean controls - creating controls(prev/next) or not\n * @var boolean auto - start scrolling or not\n * @var int pause - pause between scrolling\n */\n options:{\n pager: true,\n controls:false,\n auto:true,\n pause:20000,\n prevDomEl:\".prev\",\n nextDomEl:\".next\",\n subheaderDomEl:\"#subheader ul.home li\",\n textPagerDomEl:\".slide-text\",\n useCSS: false\n },\n /**\n * Initialization\n * @param string type - choosing predefined slider\n * @param string cDomEl - slider contnet wrapper\n * @param object params - parameters rewriting default options\n */\n init:function(type,cDomEl,params){\n var root = this;\n var settings = this.options;\n var context = $(cDomEl).closest('.AVsizer').parent();\n\n if(params !== undefined){\n for(var param in params){\n settings[param] = params[param];\n }\n }\n\n if(type === null) type = \"\";\n switch(type){\n case \"v9\":\n var slideLocked = false;\n var pagerEls = context.find(root.options.textPagerDomEl).children();\n settings.mode = 'fade';\n settings.speed = 500;\n settings.onSlideBefore = function($slideElement, oldIndex, newIndex){\n pagerEls.removeClass('active');\n pagerEls.eq(newIndex).addClass('active');\n slideLocked = true;\n };\n settings.onSlideAfter = function($slideElement, oldIndex, newIndex){\n slideLocked = false;\n };\n\n\n // Create slider\n this.slider = $(cDomEl).bxSlider(settings);\n context.find(settings.prevDomEl).click(function(e){\n root.slider.goToPrevSlide();\n root.slider.stopAuto();\n return false;\n });\n context.find(settings.nextDomEl).click(function(e){\n root.slider.goToNextSlide();\n root.slider.stopAuto();\n return false;\n });\n $('.slide-text').children(':not(hr)').on('click', function(){\n var i = pagerEls.index(this);\n if (!slideLocked){\n pagerEls.removeClass('active');\n pagerEls.eq(i).addClass('active');\n root.slider.stopAuto();\n root.slider.goToSlide(i);\n }\n });\n break;\n\n case \"v9hp\":\n // Create slider\n settings.mode = 'fade';\n settings.speed = 900;\n settings.onSlideBefore = function($slideElement, oldIndex, newIndex){\n var klasPrefix = \"bg-slide-\",\n klas = klasPrefix + (newIndex + 1);\n\n\n $('#top').removeClass(function(i, c) {\n var klas = c.match(/bg-slide-\\d+/g);\n return klas ? klas.join(' ') : false;\n });\n $('#top').addClass(klas);\n };\n this.slider = $(cDomEl).bxSlider(settings);\n context.find(settings.prevDomEl).click(function(e){\n root.slider.goToPrevSlide();\n return false;\n });\n context.find(settings.nextDomEl).click(function(e){\n root.slider.goToNextSlide();\n return false;\n });\n break;\n\n case \"hp\":\n settings.onBeforeSlide = function(currentSlide, totalSlides){\n $(root.options.subheaderDomEl).removeClass('active');\n var i = currentSlide + 1;\n $(root.options.subheaderDomEl+':nth-child('+i+')').addClass('active');\n };\n this.slider = $(cDomEl).bxSlider(settings);\n $(settings.prevDomEl).click(function(){\n root.slider.goToPrevSlide();\n $(root.options.subheaderDomEl).removeClass('active');\n var i = root.slider.getCurrentSlide() + 1;\n $(root.options.subheaderDomEl+':nth-child('+i+')').addClass('active');\n return false;\n });\n\n $(settings.nextDomEl).click(function(){\n root.slider.goToNextSlide();\n $(root.options.subheaderDomEl).removeClass('active');\n var i = root.slider.getCurrentSlide() + 1;\n $(root.options.subheaderDomEl+':nth-child('+i+')').addClass('active');\n return false;\n });\n\n $(settings.subheaderDomEl).on('click',function(){\n var thumbIndex = $(root.options.subheaderDomEl).index(this);\n root.slider.goToSlide(thumbIndex);\n\n return false;\n });\n\n $(settings.subheaderDomEl+':first').addClass('active');\n break;\n\n case \"awards\":\n if($(cDomEl + \" .frame\").length > settings.maxSlides){\n var awardsSlider = $(cDomEl).bxSlider(params);\n } else {\n $(params.nextSelector).hide();\n $(params.prevSelector).hide();\n }\n break;\n\n default:\n break;\n }\n\n return this.slider;\n },\n getSlider:function(){\n return this.slider;\n },\n forceSlider : function (slider){\n return function(){\n if(slider) {\n var currentSlide = slider.getCurrentSlide();\n slider.reloadSlider();\n }\n };\n }\n };\n\n return slider;\n\n})());\n\n/**\n * Hash anchor smooth scroll\n * @version 2.4.2\n * @author Michal Langhoffer , Aleš Gabriel \n * @module avast.scroll.smoothScroll\n * @requires jquery\n * @requires avast.scroll.animateScroll\n */\n\n\navm.define('avast.scroll.smoothScroll', function () {\n 'use strict';\n var $ = avm.require('jquery'),\n animateScroll = avm.require('avast.scroll.animateScroll');\n $('a[href*=\"#\"]:not([href=\"#\"])').click(function (evt) {\n var $this = $(this);\n var offset = $(this).closest('#tabs-anchor').length ? (2 - $(this).closest('#tabs-anchor').height()) : 0;\n\n if (location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '')\n && location.hostname === this.hostname\n && !$this.hasClass('no-smooth-scroll')\n && $this.closest('.tabs-nav-faq').length === 0\n && $this.closest('#support-faq #tabs').length === 0) {\n var target = $(this.hash);\n target = target.length ? target : $('[name=\"' + this.hash.slice(1) + '\"]');\n\n if (target.length && typeof animateScroll === 'function') {\n animateScroll(evt, target.offset().top, 400, offset);\n }\n }\n });\n});\n\n/**\n * Factory for storage object\n * @version 1.1.0\n * @author Jiri Duchon \n * @module avast.storage.storageFactory\n * @returns {Object}\n */\navm.define('avast.storage.storageFactory', function() {\n\t'use strict';\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty,\n\t\tdata = {};\n\treturn {\n\t\tlength: 0,\n\n\t\t/**\n\t\t * Add key/value pair\n\t\t * @param {*} key\n\t\t * @param {*} value\n\t\t */\n\t\tsetItem: function(key, value) {\n\t\t\tif (typeof key !== 'undefined' && typeof value !== 'undefined') {\n\t\t\t\tkey = encodeURIComponent(key);\n\t\t\t\tvalue = encodeURIComponent(value);\n\t\t\t\tif (!hasOwnProperty.call(data, key)) {\n\t\t\t\t\tthis.length++;\n\t\t\t\t}\n\t\t\t\tdata[key] = value;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.storageFactory.setItem');\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get value associated with key\n\t\t * @param {*} key\n\t\t * @returns {string}\n\t\t */\n\t\tgetItem: function(key) {\n\t\t\tif (typeof key !== 'undefined') {\n\t\t\t\tkey = encodeURIComponent(key);\n\t\t\t\treturn typeof data[key] !== 'undefined' ? decodeURIComponent(data[key]) : null;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.storageFactory.getItem');\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove key/value pair\n\t\t * @param {*} key\n\t\t */\n\t\tremoveItem: function(key) {\n\t\t\tif (typeof key !== 'undefined') {\n\t\t\t\tkey = encodeURIComponent(key);\n\t\t\t\tif (hasOwnProperty.call(data, key)) {\n\t\t\t\t\tdelete data[key];\n\t\t\t\t\tthis.length--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.storageFactory.removeItem');\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get name of nth key\n\t\t * @param {number} n\n\t\t * @returns {string}\n\t\t */\n\t\tkey: function(n) {\n\t\t\tif (typeof n === 'number') {\n\t\t\t\tvar i = 0;\n\t\t\t\tfor (var key in data) {\n\t\t\t\t\tif (hasOwnProperty.call(data, key)) {\n\t\t\t\t\t\tif (i === n) {\n\t\t\t\t\t\t\treturn decodeURIComponent(key);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.storageFactory.key');\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear all items\n\t\t */\n\t\tclear: function() {\n\t\t\tdata = {};\n\t\t\tthis.length = 0;\n\t\t}\n\n\t};\n});\n\n/**\n * Avast tabs class\n * @version 0.1.0 \n * @author Milan Adam , Ales Gabriel \n * @module avast.web.tabs\n * @requires module:jquery\n * @copyright Avast Software s.r.o ©2013\n */\n\navm.define('avast.web.tabs', (function() {\n \n var $ = avm.require('jquery');\n\n var tabs = {\n /**\n * @var string nId - DOM element that has connected tabs\n */\n nId:null,\n /**\n * Tabs default options\n * @var boolean animate - animate on change or not\n * @var string tabs - css selector of relative position of main list in tabs container\n */\n options:{\n animate: true,\n tabs: \"> div#tabs-navigation > ul > li\"\n },\n /**\n * Initialization\n * @param string eId - DOM element where tabs are included\n * @param object params - parameters rewriting default options\n */\n init:function(eId,params){\n this.nId = eId;\n if(params !== undefined){\n for(var param in params){\n this.options[param] = params[param];\n }\n }\n\n $(this.nId).easytabs(this.options);\n },\n /**\n * Method for selecting specific tab\n * @param string sHref - id of the desired tab with perfix '#' e.g. '#tab3'\n */\n select:function(sHref){\n $(this.nId).easytabs('select',sHref);\n }\n };\n\n return tabs;\n\n})());\n\n/**\n* Push data to GTM dataLayer. \n* @version 1.0.0\n* @author Ales Gabriel \n* @module avast.web.tracker\n* @desc GTM dataLayer helper. Primary centralize various window.datalayer pushes.\n* @requires jquery\n*/\navm.define('avast.web.tracker', (function () {\n\t'use strict';\n\n\tvar $ = avm.require('jquery');\n\t\n\twindow.dataLayer = window.dataLayer || []; \n\n\t/*\n\t *\tConfig events and handlers.\n\t *\tIf tracked via GTM, only datalayer.push should be required.\n\t */\n\n\t// Define callbacks for events\n\tvar trackEvents = {\n\t\t'chromeOffer': {\n\t\t\t/**\n\t\t\t * Track banner impression\n\t\t\t * @return {Integer} Length of datalayer\n\t\t\t */\n\t\t\tview: function(evt){\n\t\t\t\t//console.log(evt);\n\t\t\t\treturn window.dataLayer.push({\n\t\t\t\t\t'event' : 'chromeOffer', \n\t\t\t\t\t'eventCategory' : 'Chrome',\n\t\t\t\t\t'eventAction' : 'Chrome Offer',\n\t\t\t\t\t'eventLabel' : 'View'\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Track clicking on download Chrome button\n\t\t\t * @param {Object} evt Event object\n\t\t\t * @return {Integer} Length of dataLayer\n\t\t\t */\n\t\t\tclick: function(evt){\n\t\t\t\t//console.log(evt);\n\t\t\t\treturn window.dataLayer.push({\n\t\t\t\t\t'event' : 'chromeOffer', \n\t\t\t\t\t'eventCategory' : 'Chrome',\n\t\t\t\t\t'eventAction' : 'Chrome Offer',\n\t\t\t\t\t'eventLabel' : 'Click'\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Password checker on first char - only once per visit \n\t\t * @param {Object} evt Event object\n\t\t * @return {Int} Length of dataLayer array\n\t\t */\n\t\t'passwordCheck' : (function(){\n\t\t\tvar called = 0;\n\n\t\t\treturn function(evt){\n\t\t\t\tif(!called){\n\t\t\t\t\tcalled = 1;\n\t\t\t\t\t//console.log('passwordCheck event: %o', evt);\n\t\t\t\t\treturn window.dataLayer.push({\n\t\t\t\t\t\t'event' : 'passwordCheck', // First char filled\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t})()\n\t};\n\n\t// Bind events\n\t$(document).on('passwordCheck.avast', function(){\n\t\tmethods.track('passwordCheck');\n\t});\n\n\t///////////////////////////////////////////////////////////////////////////////////\n\t\n\t/*\n\t * Methods\n\t */\t\n\tvar methods = {\n\t\t/**\n\t\t * Track event \n\t\t * @param {String} evtName Event name. Looking for callback. Dot notation allowed. \n\t\t * @param {Object} [evtObj] Event object\n\t\t * @param {Function} [callback] Callback handler. If not defined in param, lookup on module internal callbacks storage is made. \n\t\t */\n\t\ttrack: function(evtName, evtObj, callback){\n\t\t\tvar handler = callback || trackEvents,\n\t\t\t\tspaces = (typeof evtName === 'string') ? evtName.split('.') : null,\n\t\t\t\targs = evtObj ? [evtObj] : [], // IE 8 with no arguments \n\t\t\t\tspace,\n\t\t\t\ttoString = Object.prototype.toString;\n\t\t\t\n\t\t\t// TODO: Do not step into object cycles if callback is only plain function by default\n\t\t\tif ((toString.call(handler) === '[object Function]' || toString.call(handler) === '[object Object]') && spaces && spaces.length > 0){\n\t\t\t\tfor (var i = 0; i < spaces.length; i++) {\n\t\t\t\t\tspace = spaces[i];\n\t\t\t\t\tif (handler !== null && space in handler) {\n\t\t\t\t\t\thandler = handler[space];\n\t\t\t\t\t\n\t\t\t\t\t\t// Function founded earlier than in last cycle considered as incorrect.\n\t\t\t\t\t\t// So properties defined on functions are not allowed.\n\t\t\t\t\t\tif (toString.call(handler) === '[object Function]' && i !== (spaces.length - 1)) {\t\t\t\t\t\t\n\t\t\t\t\t\t\thandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof handler === 'function') {\n\t\t\t\treturn handler.apply(this, args); // FIXME: Change to call.\n\t\t\t}\n\t\t}\n\t};\n\n\n\t// Export methods\n\treturn methods;\n})());\n\n/**\n * Unserialize URL parameters from string to object\n * @version 1.2.0\n * @author Jiri Duchon \n * @module avast.url.unserialize\n * @param {string} [urlString]\n * @returns {Object}\n */\navm.define('avast.url.unserialize', function(urlString) {\n\t'use strict';\n\turlString = typeof urlString === 'undefined' ? location.search : urlString;\n\tif (typeof urlString === 'string') {\n\t\tvar urlObject = {},\n\t\t\turlQuery = urlString.replace(/#.*|.*\\?/g, '');\n\t\tif (urlQuery.length) {\n\t\t\tvar urlParameters = urlQuery.split('&'),\n\t\t\t\turlParametersLength = urlParameters.length,\n\t\t\t\turlParameter = [];\n\t\t\tfor (var i = 0; i < urlParametersLength; i++) {\n\t\t\t\turlParameter = urlParameters[i].split('=');\n\t\t\t\turlObject[decodeURIComponent(urlParameter[0])] = decodeURIComponent(urlParameter[1] || '');\n\t\t\t}\n\t\t}\n\t\treturn urlObject;\n\t} else {\n\t\tthrow new Error('Invalid method arguments to avast.url.unserialize');\n\t}\n});\n\n/**\n * Avast UrlBag (adds encoded params to cart links)\n * @version 0.1.0\n * @author Vojtech Sir \n * @module avast.web.urlBag\n * @copyright Avast Software s.r.o ©2014\n */\navm.define('avast.web.urlBag', (function() {\n var urlBag = { \n data: {},\n addValue: function(key, value) {\n this.data[key] = String(value);\n },\n getData: function() {\n return this.data;\n },\n getEncodedData: function() {\n var base64 = this.base64encode(this.stringify(this.data));\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }, \n stringify: function(obj) {\n if (typeof JSON != 'undefined' && JSON && JSON.stringify) {\n return JSON.stringify(obj);\n }\n\n var t = typeof(obj);\n if (t != 'object' || obj === null) {\n if (t == 'string') {\n obj = '\"' + obj + '\"';\n }\n return String(obj);\n }\n else {\n var n, v, json = [], arr = (obj && obj.constructor == Array);\n\n for (n in obj) {\n v = obj[n]; t = typeof(v);\n if (t == 'string') v = '\"' + v + '\"';\n else if (t == 'object' && v !== null) v = this.stringify(v);\n json.push((arr ? \"\" : '\"' + n + '\":') + String(v));\n }\n return (arr ? '[' : '{') + String(json) + (arr ? ']' : '}');\n }\n },\n // http://phpjs.org/functions/base64_encode/\n base64encode: function(data) {\n if (!data) {\n return data;\n }\n\n var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc = '', tmp_arr = [];\n\n do { // pack three octets into four hexets\n o1 = data.charCodeAt(i++);\n o2 = data.charCodeAt(i++);\n o3 = data.charCodeAt(i++);\n\n bits = o1 << 16 | o2 << 8 | o3;\n\n h1 = bits >> 18 & 0x3f;\n h2 = bits >> 12 & 0x3f;\n h3 = bits >> 6 & 0x3f;\n h4 = bits & 0x3f;\n\n // use hexets to index into b64, and append result to encoded string\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n } while (i < data.length);\n\n enc = tmp_arr.join('');\n var r = data.length % 3;\n return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);\n }\n };\n\n return urlBag;\n\n })());\n\n/**\n * Waypoints\n * @version 1.1.0\n * @author Michal Langhoffer \n * @module avast.web.waypoints\n * @requires jquery\n * @param {DOM element} $element\n * @param {Number} offsetTop\n * @param {Number} offsetBottom\n * @param {Boolean} waypoint\n * @returns {boolean}\n */\navm.define('avast.web.waypoints', function($element, offsetTop, offsetBottom, waypoint) {\n\t'use strict';\n\tvar $ = avm.require('jquery'),\n\t\telementTop = $element.offset().top,\n\t\telementBottom = elementTop + $element.outerHeight(),\n\t\tviewportTop = $(window).scrollTop(),\n\t\tviewportBottom = viewportTop + window.innerHeight,\n\t\toffsetTop = offsetTop ? offsetTop : 0,\n\t\toffsetBottom = offsetBottom ? offsetBottom : 0;\n\n\tif (waypoint) {\n\t\tif (viewportTop >= elementTop) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif (offsetTop < 1 && offsetTop !== 0) {\n\t\t\toffsetTop = $element.outerHeight() * offsetTop;\n\t\t}\n\n\t\tif (offsetBottom < 1 && offsetBottom !== 0) {\n\t\t\toffsetBottom = $element.outerHeight() * offsetBottom;\n\t\t}\n\n\t\treturn elementBottom - offsetBottom > viewportTop && elementTop + offsetTop < viewportBottom;\n\t}\n});\n\n/**\n * Avast Aswparam (adds /ASWPARAM to cart links)\n * @version 0.5.0\n * @author Vojtech Sir , Ales Gabriel , Michal Langhoffer \n * @module avast.web.aswparam\n * @requires module:avast.web.urlBag\n * @requires module:jquery\n * @copyright Avast Software s.r.o ©2015\n */\n\navm.define('avast.web.aswparam', (function() {\n\n var $ = avm.require('jquery'),\n urlBag = avm.require('avast.web.urlBag');\n\n var aswparam = {\n inited: false,\n cartLinks: {\n 'CX': {\n urls: ['store.avast.com'],\n paramPattern: '/ASWPARAM.%urlBagValue%',\n paramRegex: /(\\/ASWPARAM\\.)[^/]+/,\n appendBeforeRegex: /(\\/ThemeID\\.)/\n },\n 'SL': {\n urls: ['store.avast.ru', 'store-kz.avast.com', 'store.avast.ua', 'store-sl.avast.com'],\n paramPattern: 'ASWPARAM=%urlBagValue%&',\n paramRegex: /(&(amp;)?ASWPARAM=)[^&]+/,\n appendBeforeRegex: /(quantity=)/\n }\n },\n globalCartLinks: ['store.avast.com', 'store.avast.ru', 'store-kz.avast.com', 'store.avast.ua', 'store-sl.avast.com'],\n init: function(){\n var cookies = {'p_pro': 'x-avast-pro', 'p_vbd': 'x-avast-vbd', 'p_hid': 'x-avast-hid'},\n testCookieFail = ['p_pro', 'p_vbd'],\n urlParams = {'p_glic': 'p_glic'},\n values = {},\n cookieFail = false,\n aswparam = this,\n paramsFromUrl = avm.require('avast.url.unserialize')(window.location.href);\n\n /* OO-8998 */\n if (window.location.pathname.indexOf('cleanup') > -1) {\n if (typeof paramsFromUrl.ppc !== 'undefined' && paramsFromUrl.ppc.length > 0) {\n values.ppc = paramsFromUrl.ppc;\n }\n }\n /* /OO-8998 */\n\n /* WCS-2448 */\n $(document).on('priceUpdate.ab.avast avast.ab.updatePrice avast.bab.updatePrice', function() {\n aswparam.updateAswparamPlaceholderLinks(aswparam.globalCartLinks, paramsFromUrl.aswparam);\n });\n\n if (paramsFromUrl.aswparam && paramsFromUrl.aswparam.length > 0) {\n aswparam.updateAswparamPlaceholderLinks(aswparam.globalCartLinks, paramsFromUrl.aswparam);\n } else {\n aswparam.updateAswparamPlaceholderLinks(aswparam.globalCartLinks);\n /* /WCS-2448 */\n\n $.each(cookies, function(paramName, cookieName) {\n values[paramName] = aswparam.getClientInfo(paramName, cookieName);\n if ($.inArray(paramName, testCookieFail) > -1 && !values[paramName]) {\n cookieFail = true;\n }\n });\n\n if (!cookieFail) {\n $.each(values, function(name, value) {\n urlBag.addValue(name, value);\n });\n\n $.each(urlParams, function(paramName, urlParamName) {\n var urlParamValue = aswparam.getURLParameter(urlParamName);\n\n if (urlParamValue) {\n urlBag.addValue(paramName, urlParamValue);\n }\n });\n\n this.updateLinks();\n }\n }\n },\n updateLinks: function(){\n var aswparam = this;\n\n // Web page\n $('a').each(function() {\n var link = aswparam.linkDecorator(this.href);\n // Decorate only cart links.\n if(link){\n this.href = link;\n }\n });\n // INTs, LPs\n $('.choice', '.selection').each(function() {\n var input = $(this).find('input[type=radio]');\n var link = aswparam.linkDecorator(input.val());\n if(link){\n input.val(link);\n }\n });\n // for dynamically loaded prices\n if (!this.inited) {\n // TODO: Remove 'avast.ab.updatePrice', 'avast.bab.updatePrice' events, when all triggers replaced with 'priceUpdate.ab.avast'.\n $(document).on('priceUpdate.ab.avast avast.ab.updatePrice avast.bab.updatePrice', function() {aswparam.updateLinks();});\n this.inited = true;\n }\n },\n getCookieValue: function(name) {\n var value = '; ' + document.cookie;\n var parts = value.split('; ' + name + '=');\n return (parts.length >= 2) ? parts.pop().split(';').shift() : null;\n },\n getURLParameter: function(name) {\n return decodeURI((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]);\n },\n linkDecorator: function(link){\n var href;\n var urlBagEncodedData = urlBag.getEncodedData();\n\n if (urlBagEncodedData) {\n $.each(this.cartLinks, function (provider, providerDef) {\n $.each(providerDef.urls, function (key, providerUrl) {\n if (link.indexOf(providerUrl) != -1) {\n if (link.search(providerDef.paramRegex) > -1) {\n href = link.replace(providerDef.paramRegex, '$1' + urlBagEncodedData);\n } else {\n href = link.replace(providerDef.appendBeforeRegex, providerDef.paramPattern.replace('%urlBagValue%', urlBagEncodedData) + '$1');\n }\n }\n });\n });\n }\n return href;\n },\n getClientInfo: function(paramName, cookieName){\n var client = (window.avastGlobals && window.avastGlobals.client) ? window.avastGlobals.client : null,\n value;\n\n if(client){\n value = (client[paramName] === 'null') ? null : client[paramName];\n } else {\n value = this.getCookieValue(cookieName + '-i') ? this.getCookieValue(cookieName + '-i') : this.getCookieValue(cookieName);\n }\n\n return value;\n },\n updateAswparamPlaceholderLinks: function(globalCartLinks, aswparamValue) {\n const linkAswparamPlaceholder = '{aswparam}';\n var newLink,\n cartLinks = [];\n\n $('a').not('a[href^=\"#\"]').each(function() {\n var el = this;\n var link = el.href;\n $.each(globalCartLinks, function (provider, providerUrl) {\n if (link.indexOf(providerUrl) != -1) {\n cartLinks.push(el);\n }\n });\n });\n\n $.each(cartLinks, function (el, link) {\n if(aswparamValue && $(this).data('aswparam-placeholder')) {\n var elDataAswparamPlaceholder = $(this).data('aswparam-placeholder');\n aswparam = elDataAswparamPlaceholder.replace('{ASWPARAM}', aswparamValue);\n\n if (link.href.indexOf(linkAswparamPlaceholder) != -1 || link.href.indexOf(escape(linkAswparamPlaceholder) != -1)) {\n newLink = link.href.indexOf(escape(linkAswparamPlaceholder)) != -1 ? link.href.replace(escape(linkAswparamPlaceholder), aswparam) : link.href.replace(linkAswparamPlaceholder, aswparam);\n\n $(link).attr('href', newLink);\n }\n } else {\n newLink = link.href.indexOf(escape(linkAswparamPlaceholder)) != -1 ? link.href.replace(escape(linkAswparamPlaceholder), '') : link.href.replace(linkAswparamPlaceholder, '');\n\n $(link).attr('href', newLink);\n }\n });\n\n }\n };\n\n return aswparam;\n\n})());\n\n/**\n * Wrapper for cookieStorage object\n * @version 1.1.0\n * @author Jiri Duchon \n * @module avast.storage.cookieStorage\n * @requires avast.storage.isCookieEnabled\n * @requires avast.storage.storageFactory\n */\navm.define('avast.storage.cookieStorage', (function() {\n\t'use strict';\n\tvar isCookieEnabled = avm.require('avast.storage.isCookieEnabled'),\n\t\tstorageFactory = avm.require('avast.storage.storageFactory'),\n\t\ttoString = Object.prototype.toString,\n\t\tkeys = function() {\n\t\t\treturn document.cookie.replace(/((?:^|\\s*;)[^=]+)(?=;|$)|^\\s*|\\s*(?:=[^;]*)?(?:\\1|$)/g, '').split(/\\s*(?:=[^;]*)?;\\s*/);\n\t\t},\n\t\tcookieStorage = {\n\t\t\tlength: document.cookie !== '' ? keys().length : 0,\n\n\t\t\t/**\n\t\t\t * Add key/value pair\n\t\t\t * @param {*} key\n\t\t\t * @param {*} value\n\t\t\t * @param {string|date} [expires]\n\t\t\t * @param {string} [path]\n\t\t\t * @param {string} [domain]\n\t\t\t * @param {boolean} [secure]\n\t\t\t */\n\t\t\tsetItem: function(key, value, expires, path, domain, secure) {\n\t\t\t\tif (typeof key !== 'undefined' && typeof value !== 'undefined') {\n\t\t\t\t\tvar regExp = /^(?:expires|max\\-age|path|domain|secure)$/i;\n\t\t\t\t\tkey = encodeURIComponent(key);\n\t\t\t\t\tvalue = encodeURIComponent(value);\n\t\t\t\t\tif (key && !regExp.test(key)) {\n\t\t\t\t\t\tif (document.cookie.indexOf(key) === -1) {\n\t\t\t\t\t\t\tthis.length++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof expires === 'string') {\n\t\t\t\t\t\t\texpires = '; expires=' + expires;\n\t\t\t\t\t\t} else if (toString.call(expires) === '[object Date]') {\n\t\t\t\t\t\t\texpires = '; expires=' + expires.toUTCString();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdocument.cookie = key + '=' + value + (typeof expires === 'string' ? expires : '') + (typeof domain === 'string' ? '; domain=' + domain : '') + (typeof path === 'string' ? '; path=' + path : '') + (secure ? '; secure' : '');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.cookieStorage.setItem');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Get value associated with key\n\t\t\t * @param {*} key\n\t\t\t * @returns {string|null}\n\t\t\t */\n\t\t\tgetItem: function(key) {\n\t\t\t\tif (typeof key !== 'undefined') {\n\t\t\t\t\tvar regExp = new RegExp('(?:(?:^|.*;)\\\\s*' + encodeURIComponent(key).replace(/[\\-\\.\\+\\*]/g, '\\\\$&') + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$');\n\t\t\t\t\treturn decodeURIComponent(document.cookie.replace(regExp, '$1')) || null;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.cookieStorage.getItem');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Remove key/value pair\n\t\t\t * @param {*} key\n\t\t\t * @param {string} [path]\n\t\t\t * @param {string} [domain]\n\t\t\t */\n\t\t\tremoveItem: function(key, path, domain) {\n\t\t\t\tif (typeof key !== 'undefined') {\n\t\t\t\t\tkey = encodeURIComponent(key);\n\t\t\t\t\tif (document.cookie.indexOf(key) !== -1) {\n\t\t\t\t\t\tthis.length--;\n\t\t\t\t\t}\n\t\t\t\t\tdocument.cookie = key + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (typeof domain === 'string' ? '; domain=' + domain : '') + (typeof path === 'string' ? '; path=' + path : '');\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.cookieStorage.removeItem');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Get name of nth key\n\t\t\t * @param {number} n\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tkey: function(n) {\n\t\t\t\tif (typeof n === 'number') {\n\t\t\t\t\tvar keysArray = keys(),\n\t\t\t\t\t\tkeysArrayLength = keysArray.length;\n\t\t\t\t\tif (n < keysArrayLength) {\n\t\t\t\t\t\treturn decodeURIComponent(keysArray[n]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Invalid method arguments to avast.storage.cookieStorage.key');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Clear all items\n\t\t\t */\n\t\t\tclear: function() {\n\t\t\t\tvar keysArray = keys(),\n\t\t\t\t\tkeysArrayLength = keysArray.length;\n\t\t\t\tfor (var i = 0; i < keysArrayLength; i++) {\n\t\t\t\t\tthis.removeItem(keysArray[i]);\n\t\t\t\t}\n\t\t\t\tthis.length = document.cookie !== '' ? keys().length : 0;\n\t\t\t}\n\n\t\t};\n\treturn isCookieEnabled ? cookieStorage : storageFactory();\n})());\n\n/**\n* Decorate cart link with showCuponeCode parameter \n* @version 1.1.3\n* @author Ales Gabriel, Michal Langhoffer\n* @module avast.web.couponCode\n* @requires jquery\n* @requires avast.storage.cookieStorage\n*/\navm.define('avast.web.couponCode', (function () {\n 'use strict';\n\n var $ = avm.require('jquery'),\n cookieStorage = avm.require('avast.storage.cookieStorage');\n \n return {\n options: {\n regexS: '[\\\\?&]couponfield=yes([^&#]*)',\n providers:['dr-store.avast.com','store.avast.com','store.avast.ru'],\n urlQuery: '/showCouponCode=yes'\n },\n\n init: function(params){\n var root = this;\n if(params !== undefined){\n for(var param in params){\n this.options[param] = params[param];\n }\n }\n\n var regex = new RegExp(this.options.regexS,\"i\");\n var results = regex.exec(window.location.href);\n\n if(results === null){\n return 1;\n } else {\n var href;\n var couponParam = this.options.urlQuery;\n var providers = this.options.providers;\n var cookieExpirationTime = new Date();\n\n function getHostname() {\n var hostnameSplitted = window.location.hostname.split('.');\n\n if (hostnameSplitted[hostnameSplitted.length - 2] === 'avast' && hostnameSplitted[hostnameSplitted.length - 1] === 'com') {\n return '.avast.com';\n } else {\n return window.location.hostname.substring(3);\n }\n }\n\n $(\"a\").each(function(){\n href = $(this).attr('href') ? $(this).attr('href') : \"\";\n for(var i=0;i\n * @module avast.detect\n * @requires avast.storage.isCookieEnabled\n * @requires avast.storage.isStorageEnabled\n * @param {string} [userAgent]\n * @param {string} [userLanguage]\n * @param {Object} [patterns]\n * @returns {Object}\n */\navm.define('avast.detect', function(userAgent, userLanguage, patterns) {\n\t'use strict';\n\tvar isCookieEnabled = avm.require('avast.storage.isCookieEnabled'),\n\t\tisStorageEnabled = avm.require('avast.storage.isStorageEnabled'),\n\t\ttoString = Object.prototype.toString,\n\t\thasOwnProperty = Object.prototype.hasOwnProperty;\n\tuserAgent = typeof userAgent === 'undefined' ? navigator.userAgent || (typeof navigator.appCodeName === 'string' && typeof navigator.appVersion === 'string' ? navigator.appCodeName + '/' + navigator.appVersion : '') : userAgent;\n\tuserLanguage = typeof userLanguage === 'undefined' ? navigator.userLanguage || navigator.language || '' : userLanguage;\n\tpatterns = typeof patterns === 'undefined' ? {\n\t\tbrowser: {\n\t\t\tAvast: {\n\t\t\t\tname: /avastium|avast|avg/,\n\t\t\t\tversion: /(?:avastium\\s\\()(\\d+(?:\\.\\d+)+)|\\s(avast|avg)\\/\\K(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tOpera: {\n\t\t\t\tname: /opr|opera/,\n\t\t\t\tversion: /(?:opr\\/|opera(?:\\s|\\/)|version\\/)(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tEdge: {\n\t\t\t\tname: /edge/,\n\t\t\t\tversion: /(?:edge\\/(\\d+(?:\\.\\d+)+))/\n\t\t\t},\n\t\t\tEdgeChromium: {\n\t\t\t\tname: /edg/,\n\t\t\t\tversion: /(?:Edg\\/(\\d+(?:\\.\\d+)+))/\n\t\t\t},\n\t\t\tChrome: {\n\t\t\t\tname: /chrome|crios|crmo/,\n\t\t\t\tversion: /(?:chrome|crios|crmo)\\/(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tFirefox: {\n\t\t\t\tname: /firefox|iceweasel/,\n\t\t\t\tversion: /(?:firefox|iceweasel)\\/(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tInternetExplorer: {\n\t\t\t\tname: /msie|trident/,\n\t\t\t\tversion: /(?:rv:|msie\\s)(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tSafari: {\n\t\t\t\tname: /safari/,\n\t\t\t\tversion: /(?:version|safari)\\/(\\d+(?:\\.\\d+)+)/\n\t\t\t}\n\t\t},\n\t\tos: {\n\t\t\tWindowsPhone: {\n\t\t\t\tname: /windows phone/,\n\t\t\t\tversion: /windows\\sphone\\s(?:os\\s)?(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tWindows: {\n\t\t\t\tname: /windows/,\n\t\t\t\tversion: {\n\t\t\t\t\t10: /windows nt 10.0/,\n\t\t\t\t\t8.1: /windows nt 6.3/,\n\t\t\t\t\t8: /windows nt 6.2/,\n\t\t\t\t\t7: /windows nt 6.1/,\n\t\t\t\t\tVista: /windows nt 6.0/,\n\t\t\t\t\tXP: /windows nt (?:5.1|5.2)/,\n\t\t\t\t\t2000: /windows nt 5.0/\n\t\t\t\t}\n\t\t\t},\n\t\t\tAndroid: {\n\t\t\t\tname: /android/,\n\t\t\t\tversion: /android\\s(\\d+(?:\\.\\d+)+)/\n\t\t\t},\n\t\t\tIOS: {\n\t\t\t\tname: /iphone|ipad|ipod/,\n\t\t\t\tversion: /cpu\\s(?:iphone\\s)?os\\s(\\d+(?:_\\d+)+)/\n\t\t\t},\n\t\t\tMac: {\n\t\t\t\tname: /mac/,\n\t\t\t\tversion: /mac\\sos\\sx\\s(\\d+(?:_\\d+)+)/\n\t\t\t},\n\t\t\tLinux: {\n\t\t\t\tname: /linux/,\n\t\t\t\tversion: /linux\\s([^;]+)/\n\t\t\t},\n\t\t\tUnix: {\n\t\t\t\tname: /x11/,\n\t\t\t\tversion: /x11;\\s(?:u;)?([^;]+)/\n\t\t\t}\n\t\t}\n\t} : patterns;\n\tif (typeof userAgent === 'string' && typeof userLanguage === 'string' && typeof patterns === 'object' && patterns && typeof patterns.browser === 'object' && patterns.browser && typeof patterns.os === 'object' && patterns.os) {\n\t\tvar results = {\n\t\t\t\tbrowser: {\n\t\t\t\t\tuserAgent: userAgent.toLowerCase(),\n\t\t\t\t\tuserLanguage: userLanguage.toLowerCase(),\n\t\t\t\t\tisCookieEnabled: isCookieEnabled,\n\t\t\t\t\tisStorageEnabled: isStorageEnabled,\n\t\t\t\t\tname: '',\n\t\t\t\t\tversion: ''\n\t\t\t\t},\n\t\t\t\tos: {\n\t\t\t\t\tname: '',\n\t\t\t\t\tversion: ''\n\t\t\t\t}\n\t\t\t},\n\t\t\ttestRegExp = function(subPatterns, subResults) {\n\t\t\t\tvar name = '',\n\t\t\t\t\tisName = '',\n\t\t\t\t\tversion,\n\t\t\t\t\tsubversion,\n\t\t\t\t\tnameFound = false,\n\t\t\t\t\tsubversionFound = false;\n\t\t\t\tfor (var subPattern in subPatterns) {\n\t\t\t\t\tif (hasOwnProperty.call(subPatterns, subPattern)) {\n\t\t\t\t\t\tname = subPatterns[subPattern].name;\n\t\t\t\t\t\tversion = subPatterns[subPattern].version;\n\t\t\t\t\t\tisName = 'is' + subPattern;\n\t\t\t\t\t\tif (!nameFound && name.test(results.browser.userAgent)) {\n\t\t\t\t\t\t\tsubResults.name = subPattern;\n\t\t\t\t\t\t\tsubResults[isName] = true;\n\t\t\t\t\t\t\tif (toString.call(version) === '[object RegExp]' && version.test(results.browser.userAgent)) {\n\t\t\t\t\t\t\t\tsubResults.version = results.browser.userAgent.match(version)[1];\n\t\t\t\t\t\t\t} else if (toString.call(version) === '[object Object]') {\n\t\t\t\t\t\t\t\tfor (var item in version) {\n\t\t\t\t\t\t\t\t\tif (!subversionFound && hasOwnProperty.call(version, item)) {\n\t\t\t\t\t\t\t\t\t\tsubversion = version[item];\n\t\t\t\t\t\t\t\t\t\tif (toString.call(subversion) === '[object RegExp]' && subversion.test(results.browser.userAgent)) {\n\t\t\t\t\t\t\t\t\t\t\tsubResults.version = item;\n\t\t\t\t\t\t\t\t\t\t\tsubversionFound = true;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnameFound = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsubResults[isName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\ttestRegExp(patterns.browser, results.browser);\n\t\ttestRegExp(patterns.os, results.os);\n\t\treturn results;\n\t} else {\n\t\tthrow new Error('Invalid method arguments to avast.detect');\n\t}\n});\n\n/**\n * download-popup\n * @version 0.0.3\n * @author Ales Gabriel \n * @module avast.web.downloadPopup\n * @requires module:jquery|cash\n * @copyright Avast Software s.r.o ©2015\n */\navm.define('avast.web.downloadPopup', function() {\n\t'use strict';\n\n\tvar $ = avm.require('jquery');\n\n\tvar downloadPopup = {\n\t\tinit: function(conf) {\n\t\t\tvar defaults = {\n\t\t\t\t\tpopup: '[data-download-popup]',\n\t\t\t\t\topenBtn: '[data-behavior=\"download-popup\"]',\n\t\t\t\t\tcloseBtn: '[data-behavior-dismiss=\"download-popup\"]',\n\t\t\t\t\tcontext: 'body',\n\t\t\t\t\texitIntent: false\n\t\t\t\t},\n\t\t\t\tconfig = $.extend(defaults, conf),\n\t\t\t\t$popup = $(config.popup);\n\n\t\t\tdownloadPopup.config = config;\n\n\t\t\t// console.log('Popup is: %s', config.popup);\n\t\t\t// register events\n\t\t\tif ($popup.length) {\n\t\t\t\t$(config.context).on('click', config.openBtn, function(e) {\n\t\t\t\t\t$popup.css('display', ''); // default state is display none on inline styles.\n\t\t\t\t\t$popup.outerWidth(); // Reflow\n\t\t\t\t\t$popup.addClass('is-open');\n\n\t\t\t\t});\n\t\t\t\t$(config.context).on('click', config.closeBtn, function(e) {\n\t\t\t\t\t$popup.removeClass('is-open');\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Reveal browser dependent content\n\t\t\tdownloadPopup.switchBrowser();\n\n\t\t\tif (config.exitIntent) {\n\t\t\t\t$popup.on('mouseover', config.closeBtn, downloadPopup.closeBtnHandler);\n\t\t\t\t$popup.on('mouseout', downloadPopup.mouseoutHandler);\n\t\t\t}\n\n\t\t\treturn $popup.length;\n\t\t},\n\t\texitIntentHandler: function(e) {\n\t\t\tvar target = $(downloadPopup.config.popup);\n\n\t\t\tif (target) {\n\t\t\t\ttarget.addClass('is-exit-intent');\n\t\t\t}\n\t\t},\n\t\tcloseBtnHandler: function(e) {\n\t\t\tdownloadPopup.exitIntentHandler(e);\n\t\t\t$(e.currentTarget).off('mouseover', downloadPopup.closeBtnHandler);\n\t\t},\n\t\tmouseoutHandler: function(e) {\n\t\t\tif (downloadPopup.config.exitIntent && e.toElement === null && e.relatedTarget === null) {\n\t\t\t\t// Mouse reaches top of the window\n\t\t\t\tif (e.clientY <= 0) {\n\t\t\t\t\t// Run only once\n\t\t\t\t\tdownloadPopup.config.exitIntent = false;\n\t\t\t\t\tdownloadPopup.exitIntentHandler(e, downloadPopup.config.popup);\n\t\t\t\t\t$(e.currentTarget).off('mouseout', downloadPopup.mouseoutHandler);\n\t\t\t\t}\n\t\t\t\t// Mouse reaches bottom of the window\n\t\t\t\tif (e.clientY >= window.innerHeight) {\n\t\t\t\t\tdownloadPopup.config.exitIntent = false;\n\t\t\t\t\t$(e.currentTarget).off('mouseout', downloadPopup.mouseoutHandler);\n\t\t\t\t\t$(downloadPopup.config.popup).off('mouseover', downloadPopup.closeBtnHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tswitchBrowser: function(browserObj) {\n\t\t\tvar detect = avm.require('avast.detect')(),\n\t\t\t\tbrowser = browserObj || detect.browser;\n\n\t\t\tif (browser.isChrome || browser.isAvast || browser.isEdgeChromium) {\n\t\t\t\t$('[data-browser]').css('display', 'none');\n\t\t\t\t$('[data-browser=\"chrome\"]').css('display', '');\n\t\t\t} if (browser.isFirefox || browser.isOpera || browser.isSafari) {\n\t\t\t\t$('[data-browser]').css('display', 'none');\n\t\t\t\t$('[data-browser=\"firefox\"]').css('display', '');\n\t\t\t}\n\t\t\tif (browser.isEdge || browser.isInternetExplorer) {\n\t\t\t\t$('[data-browser]').css('display', 'none');\n\t\t\t\t$('[data-browser=\"ie\"]').css('display', '');\n\t\t\t}\n\n\t\t\treturn browser.name;\n\t\t}\n\t};\n\n\treturn downloadPopup;\n});\n\n/**\n * Decorate link with params\n * @version 1.1.0\n * @author Ales Gabriel \n * @module avast.web.linkdecorator\n * @requires jquery\n * @requires avast.url.unserialize\n * @param {string} selector Css selector. Matched elements will be decorated\n * @param {(string|string[])} params Name or array of names\n * @param {string} [querystring] Optionally you can set querystring parameter manually. In this case querystring from URL will be ignored.\n * @param {string} [newValue] Optionally value can be set\n * @returns {object} jQuery object of selected elements\n */\n\navm.define('avast.web.linkDecorator', function(selector, params, querystring, newValue){\n\t'use strict';\n\n\tvar $ = avm.require('jquery'),\n\t\tquery = querystring ? querystring : undefined,\n\t\tunserialize = avm.require('avast.url.unserialize'),\n\t\turlParams = unserialize(query),\n\t\tparamArr = (Object.prototype.toString.call(params) === '[object Array]') ? params : [params],\n\t\tparam = null,\n\t\t$els = null,\n\t\tresult = [];\n\n\tfor (var i = 0; i < paramArr.length; i++ ) {\n\t\tparam = paramArr[i];\n\n\t\tif(urlParams[param]){\n\t\t\t$els = $(selector).each(function () {\n\t\t\t\tvar $el = $(this),\n\t\t\t\t\tprepend = this.search && this.search.length > 0 ? '&' : '?',\n\t\t\t\t\threfParams = unserialize($el.attr('href')),\n\t\t\t\t\tvalue = newValue || urlParams[param];\n\n\t\t\t\tif(!hrefParams[urlParams[param]]){\n\t\t\t\t\t$el.attr('href', $el.attr('href') + prepend + param + '=' + value );\n\t\t\t\t}\n\t\t\t});\n\t\t\tresult.push($els)\n\t\t}\n\t}\n\n\treturn result;\n});\n/**\n * Setup tasks for elements with declared behavior (data-behavior).\n * Name of the task must much to data-behavior prefix.\n * Run Scanner with init({config}) method.\n * @version 0.0.3\n * @author Ales Gabriel \n * @module avast.web.linkScanner\n * @requires module:jquery|cash\n * @copyright Avast Software s.r.o ©2015\n */\navm.define('avast.web.linkScanner', function() {\n\t'use strict';\n\n\tvar $ = avm.require('jquery'),\n\t\tdownloadPopup = avm.require('avast.web.downloadPopup'),\n\t\tbrowserDetect = avm.require('avast.detect')();\n\tvar tasks = {\n\n\t\t/**\n\t\t * downloadPopup Update download link with direct download [data-behavior~=\"downloadPopup\"] atrribute\n\t\t * @param {HTMLElement} el element to update download link\n\t\t * @returns {Array} Array of HTMLElements\n\t\t */\n\t\tdownloadPopup: function(el) {\n\t\t\tvar downloadNames = ['FAV-'],\n\t\t\t\tdownloadName = el.dataset.downloadName || '',\n\t\t\t\tdownloadNameMatch,\n\t\t\t\trole = el.dataset.role || '',\n\t\t\t\turl,\n\t\t\t\tparams,\n\t\t\t\tdlPopup,\n\t\t\t\tpopup,\n\t\t\t\tresult;\n\n\t\t\t// Test if download name matches to suffix\n\t\t\tdownloadNames.forEach(function(needle) {\n\t\t\t\tvar match = downloadName.lastIndexOf(needle, 0) === 0;\n\n\t\t\t\tdownloadNameMatch = match;\n\t\t\t});\n\n\t\t\t// console.log('downloadNameMatch ' + downloadNameMatch);\n\n\t\t\t// Update download links for FAV-ONLINE, FAV-ONLINE-XXX to direct download.\n\t\t\tif (el.href && role === 'download-link' && downloadNameMatch) {\n\t\t\t\turl = new URL(el.href);\n\t\t\t\tparams = url ? url.searchParams : null;\n\n\t\t\t\t// Update with direct download only if popup available on page\n\n\t\t\t\t// Init download popup only for FAV-ONLINE and FAV-ONLINE-xxx download buttons\n\t\t\t\tdlPopup = downloadPopup();\n\t\t\t\tif(!browserDetect.browser.isEdge && !browserDetect.browser.isInternetExplorer) {\n\t\t\t\t\tpopup = dlPopup.init({\n\t\t\t\t\t\tpopup: '#downloadPopup',\n\t\t\t\t\t\topenBtn: 'a[data-role=\"download-link\"][data-download-name^=\"FAV-\"]:not([data-behavior=\"downloadPage\"]):not([data-download-name*=\"WEBSITE-\"])',\n\t\t\t\t\t\tcloseBtn: '.js-dtp-close' // TODO: use data attributes in DOM\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//console.log(popup);\n\t\t\t\t// Update href parameters for direct download\n\t\t\t\tif (popup > 0 && !browserDetect.browser.isEdge && !browserDetect.browser.isInternetExplorer) {\n\t\t\t\t\tparams.set('direct', 1);\n\t\t\t\t\turl.search = params.toString();\n\t\t\t\t\tresult = el.href = url.toString();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t};\n\n\tvar scanner = {\n\n\t\t/**\n\t\t * init Start scanning\n\t\t * @param {Object} [conf] Config object\n\t\t * @param {string[]} conf.tasks Define which tasks should run.\n\t\t * @param {HTMLElement|string} conf.context Set parent which child should be scanned.\n\t\t */\n\t\tinit: function(conf) {\n\n\t\t\tvar defaults = {\n\t\t\t\t\tcontext: document.body\n\t\t\t\t},\n\t\t\t\tconfig = $.extend(defaults, conf),\n\t\t\t\titems = config.tasks || Object.keys(tasks);\n\n\t\t\titems.forEach(function(task) {\n\t\t\t\t// Apply task if task's name match the data-behavior value prefix (before first -)\n\t\t\t\tvar behaviorSelector = '[data-behavior~=\"' + task + '\"]', // always run tusks for elements with behavior defined\n\t\t\t\t\tconfigSelectors = config.selectors,\n\t\t\t\t\tselector = behaviorSelector;\n\n\t\t\t\t// Additionaly run tasks for elements specified in config object\n\t\t\t\tif (configSelectors.length) {\n\t\t\t\t\tselector = behaviorSelector + ',' + configSelectors.join(',');\n\t\t\t\t}\n\n\t\t\t\t$(config.context).find(selector).each(function() {\n\t\t\t\t\tif (tasks[task] && typeof tasks[task] === 'function') {\n\t\t\t\t\t\ttasks[task](this);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\treturn scanner;\n});\n\n/**\n * Tracking for Mobile Campaigns\n * @version 1.0.2\n * @author Fedor Kušš \n * @module avast.web.mobileTracking\n * @requires jquery\n * @requires avast.url.unserialize\n */\n\n(function() {\n\t'use strict';\n\tvar urls =\n\t['index', 'free-mobile-security', 'free-ios-security', 'lp-ppc-protect-a', 'lp-ppc-protect-b', 'secureline-vpn', 'lp-ppc-secureline-vpn-buy','lp-protection','protection'],\n\t\tpathName = window.avastGlobals.web.fileName;\n\n\tif (urls.indexOf(pathName) > -1) {\n\n\t\tvar unserializedUrl = avm.require('avast.url.unserialize')(),\n\t\t\tcmpgContent = unserializedUrl.cmpg_for_af;\n\n\t\tif (typeof cmpgContent !== 'undefined' && cmpgContent.length > 0) {\n\n\t\t\tvar detected = avm.require('avast.detect')();\n\n\t\t\tif (detected.os.isAndroid || detected.os.isIOS) {\n\t\t\t\t$('body').addClass('mobile-tracking');\n\t\t\t\tvar mobileTracking = $('.mobile-tracking .bi-download-link');\n\n\t\t\t\tmobileTracking.attr('href', 'https://go.onelink.me/gM36?pid=AdWords-Web&c=' + cmpgContent + '&af_web_dp=https%3A%2F%2Fwww.avast.com%2Ffree-mobile-security');\n\n\t\t\t\tif (pathName === 'secureline-vpn') {\n\t\t\t\t\tmobileTracking.attr('href', 'https://go.onelink.me/KhNk?pid=AdWords-Web&c=' + cmpgContent + '&af_web_dp=https%3A%2F%2Fwww.avast.com%2Fsecureline-vpn');\n\n\t\t\t\t}\n\t\t\t\tif (pathName === 'lp-ppc-secureline-vpn-buy') {\n\t\t\t\t\tmobileTracking.attr('href', ' https://go.onelink.me/KhNk?pid=AdWords-Web&c=' + cmpgContent + '&af_web_dp=https%3A%2F%2Fwww.avast.com%2Fsecureline-vpn');\n\t\t\t\t}\n\t\t\t\tif (pathName === 'lp-safe-emailing') {\n\t\t\t\t\tmobileTracking.attr('href', 'https://avast.sng.link/Dp3jo/4129/jvio');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})();\n\n/**\n * Navigation - global navigation\n * @version 1.4.0\n * @author Michal Langhoffer , Ales Gabriel , Jaroslav Slaby \n * @module avast.web.navigation\n * @requires jquery\n * @requires avast.url.unserialize\n * @requires avast.web.mqMarker\n * @return {Function} Emitter constructor\n */\n\n\nvar avast = avast || {};\n\n// Disables language selector\navast.disableLanguageSelector = true;\n\n/**\n * Definiton of modules for 'avast.web.navigation'\n */\navm.define('avast.web.navigation', function (navSel) {\n\t'use strict';\n\n\t// Required modules\n\tvar $ = avm.require('jquery'),\n\t\tunserialize = avm.require('avast.url.unserialize'),\n setMqMarkers = avm.require('avast.web.mqMarker');\n\n\n//--------------------------------- Communal ---------------------------------\n\n // Universal Selectors\n\tvar $window = $(window),\n\t\t$body = $('body'),\n\t\t$navigation = navSel ? $(navSel) : $('.js-navigation-oo-19798'),\n\t\t$secondMenuBlogs = document.querySelector('.second-menu.blogs'),\n\t\t$langSelector = $('.region-selector'),\n\t\t$languageSelectorButtons = $('.js-language-selector-trigger'),\n\t\t$languageSelector = $langSelector.find('.region-selector-close');\n\n\n // Universal variables\n\tvar firstMenuClasses = getFirstMenuClasses(),\n\t\tsecondMenuClasses = getSecondMenuClasses(),\n\t\topenedThirdMenu,\n\t\tthirdMenuLinks = [],\n\t\topenedSubMenu,\n\t\tlanguageSelectorTrigger,\n\t\tavastGlobalsAvailable = typeof window.avastGlobals !== 'undefined' && typeof window.avastGlobals.web !== 'undefined',\n isDevEnv = avastGlobalsAvailable ? window.avastGlobals.web.domain.split('/').length > 1 : false,\n config = { firstMenu: false, secondMenu: false },\n navInit = { desktopNav: false, mobileNav: false };\n\n\t/**\n * Get all 1st menu classes to an array\n */\n\tfunction getFirstMenuClasses() {\n\t\tvar classes = [];\n\t\tvar firstMenuItems = document.querySelectorAll('.first-menu .item:not(.blogs)');\n\n\t\tfirstMenuItems.forEach(function (el) {\n\t\t\tvar itemData = el.getAttribute('data-first-menu');\n\n\t\t\tif (itemData) {\n\t\t\t\tvar itemClass = 'first-menu-' + itemData;\n\t\t\t\tclasses.push(itemClass);\n\t\t\t}\n\t\t});\n\n\t\treturn classes;\n\t}\n\n\t/**\n * Get all 2nd menu classes to an array\n */\n\tfunction getSecondMenuClasses() {\n\t\tvar classes = [];\n\t\tvar secondMenuItems = document.querySelectorAll('.second-menu li');\n\n\t\tsecondMenuItems.forEach(function (el) {\n\t\t\tvar itemData = el.getAttribute('data-second-menu');\n\n\t\t\tif (itemData) {\n\t\t\t\tvar itemClass = 'second-menu-' + itemData;\n\t\t\t\tclasses.push(itemClass);\n\t\t\t}\n\t\t});\n\n\t\treturn classes;\n\t}\n\n /**\n * Detects platform, compose the platform class name and insert the class name to the 'body'\n */\n\tfunction detectedPlatfromToBodyClass() {\n\t\tvar detectedPlatform = avm.require('avast.detect')().os;\n\t\t$body.addClass('platform-' + detectedPlatform.name.toLowerCase());\n\t}\n\n\tdetectedPlatfromToBodyClass();\n\n\t// Determines whether desktop / mobile navigation should be shown\n var mqMobile = window.matchMedia('(max-width: 992px)'),\n\t\tmqDesktop = window.matchMedia('(min-width: 992px)');\n\n\t/**\n\t * Extracts the value of ':before' class from the 'body' and if the navigation is viewed from desktop, returns 'navigation-desktop', if from mobile, returns 'none'\n \t */\n\tfunction isDesktop() {\n\t\tvar mq = (window.getComputedStyle) ? window.getComputedStyle(document.body, ':before').getPropertyValue('content') : '';\n\t\treturn mq.indexOf('navigation-desktop') > -1 ? true : false;\n\t}\n\n\t// Changes to desktop / mobile navigation on resize\n\tif (isDesktop()) {\n\t\t\tdesktopNav();\n\t\t\t$(window).on('resize', setDesktopNav);\n\t\t\tsetMqMarkers('mq-desktop', 'header nav');\n\t} else {\n\t\tmobileNav();\n\t\t$(window).on('resize', setMobileNav);\n\t\t$(window).on('load', setMobileNav);\n\t\tsetMqMarkers('mq-mobile', 'header nav');\n\t}\n\n\t// Communal 1st menu\n\n\t/**\n\t * Clears all 1st menu classes\n\t */\n\tfunction clearFirstMenuClasses() {\n\t\tconfig.firstMenu = false;\n\t\t$body.removeClass(firstMenuClasses.join(' '));\n\t}\n\n\t// Communal 2nd menu\n\n\t/**\n\t * Clears all 2nd menu classes\n\t */\n\tfunction clearSecondMenuClasses() {\n\t\tconfig.secondMenu = false;\n\t\t$body.removeClass(secondMenuClasses.join(' '));\n\t}\n\n\t/**\n\t * Collects all classes of the 2nd menu, composes them together with one space between and adds them to the 'body'\n\t */\n\tfunction expandSecondLevel() {\n\t\tvar classes = secondMenuClasses.join(' ');\n\t\tconfig.secondMenu = classes;\n\t\tupdateNavigation();\n\t}\n\n\t/**\n\t * Detects, on which 2nd menu item was clicked and adds its class on 'body'\n\t */\n\tfunction openSecondMenu($element, event) {\n\t\tvar cachedSecondMenu = config.secondMenu,\n\t\t\tclickedSecondMenu = 'second-menu-' + $element.data('second-menu');\n\n\n\t\tif (isDesktop()) {\n\n\t\t\tclearSecondMenuClasses();\n\n\t\t} else {\n\n\t\t\tif (cachedSecondMenu.split(' ').length > 1) {\n\n\t\t\t\t // If the class is already there, removes it\n\t\t\t\t if (cachedSecondMenu.indexOf(clickedSecondMenu) > -1) {\n\t\t\t\t config.secondMenu = removeSpaces(cachedSecondMenu.replace(clickedSecondMenu, ''));\n\t\t\t\t }\n\n\t\t\t\t // Else adds it\n\t\t\t\t else {\n\t\t\t\t\tconfig.secondMenu = removeSpaces(cachedSecondMenu + ' ' + clickedSecondMenu);\n\t\t\t\t}\n\n\t\t\t\tupdateNavigation('toggle', clickedSecondMenu);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the same menu was not clicked, then sets 2nd menu as a current menu\n\t\tif (clickedSecondMenu !== cachedSecondMenu) {\n\t\t\tconfig.secondMenu = clickedSecondMenu;\n\t\t}\n\n\t\tupdateNavigation();\n\t}\n\n\t// Communal Third menu\n\n\t/**\n\t * Collects all the links from element and if they are not hidden, creates an array from them in the 3rd menu\n\t */\n\tfunction defInnerLinks(parent) {\n\t\tvar menuLinks = parent.querySelectorAll('a');\n\n\t\tmenuLinks.forEach(function (el) {\n\t\t\tif (!isHidden(el)) {\n\t\t\t\tthirdMenuLinks.push(el)\n\t\t\t}\n\t\t});\n\n\t\topenedThirdMenu = parent;\n\t}\n\n\t/**\n\t * Removes 'aria-expanded' attribute and 'isOpen' class from the expanded 3rd menu\n\t */\n\tfunction removeExpanded() {\n\t\tvar menuOpened = document.querySelector('[aria-expanded=true]'),\n\t\t\tmenuOpenedClass = document.querySelectorAll('.second-menu .isOpen');\n\n\t\tmenuOpened !== null ? menuOpened.setAttribute('aria-expanded', false) : '';\n\t\tmenuOpenedClass.forEach(function(item) {\n\t\t\titem.classList.remove('isOpen');\n\t\t})\n\n\t}\n\n\t// Communal Regions\n\n\tfunction closeRegionModal() {\n\t\t$langSelector.removeClass('active');\n\t\t$('body').removeClass('js-language-selector-open');\n\t\t$body.removeClass('first-menu-regions');\n\n\t\tcloseSubMenus();\n\n\t\t// Sets focus on a Region selector\n\t\tlanguageSelectorTrigger.focus()\n\t}\n\n\n\t// Closes the Region selector after clicking on a language\n\t$languageSelector.on('click', closeRegionModal);\n\n\t// Closes the 'blogs-special-menus' after clicking on 'regions' and adds the 'first-menu-regions' class on the 'body'\n\t$languageSelectorButtons.on('click', function () {\n\t\t$body.removeClass('blogs-special-menu');\n\t\tlanguageSelectorTrigger = $(this)[0];\n\n\t\t// Toggles on desktop, because 1st levels are disabled\n\t\t$body.addClass('first-menu-regions');\n\t\tdocument.querySelector('.region-selector').setAttribute('aria-expanded', true);\n\t\t$langSelector.addClass('active');\n\t\t$('body').addClass('js-language-selector-open');\n\t\twindow.history.pushState({ 'avast_regions': true }, 'Avast regions', window.location.href);\n\t});\n\n\twindow.addEventListener('popstate', closeRegionModal, false);\n\n\t/**\n * Closes all the open submenus\n */\n\tfunction closeSubMenus() {\n\t\tisDesktop() ? clearSecondMenuClasses() : \"\";\n\t\tremoveExpanded();\n\t\t$body.removeClass('navigation-search-opened');\n\t\t$body.removeClass('js-language-selector-open');\n\t\t$body.removeClass('first-menu-regions');\n\t\t$body.removeClass('blogs-special-menu');\n\t\t$langSelector.removeClass('active');\n\t\topenedThirdMenu = null;\n\t}\n\n\t/**\n * Checks, if a menu item is hidden\n */\n\tfunction isHidden(el) {\n\t\twhile (el) {\n\t\t\tif (el === document) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar $style = window.getComputedStyle(el, null);\n\t\t\tif (!el) {\n\t\t\t\treturn true;\n\t\t\t} else if (!$style) {\n\t\t\t\treturn true;\n\t\t\t} else if ($style.display === 'none') {\n\t\t\t\treturn true;\n\t\t\t} else if (($style.display === 'block' || $style.display === 'inline-block') && $style.height === '0px' && $style.overflow === 'hidden') {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn $style.position === 'fixed' || isHidden(el.parentNode);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n * Update of navigation\n */\n\tfunction updateNavigation(data, toggleClass) {\n\n\t\t// Resets the navigation to the default state\n\t\tif (data === 'reset') {\n\t\t\t$body.removeClass('blogs-special-menu');\n\n\t\t\tif (!isDesktop()) {\n\t\t\t\t$body.addClass('navigation-closed');\n\n\t\t\t} else {\n\t\t\t\t$body.removeClass('first-menu-regions');\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggles adding / removing of class (which was input to second parameter) on 'body'\n\t\tif (data === 'toggle') {\n\t\t\t$body.toggleClass(toggleClass);\n\t\t}\n\n\t\tif (config.firstMenu) {\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\tif (config.secondMenu) {\n\t\t\t$body.addClass(config.secondMenu);\n\t\t}\n\n\t\t// Toggles adding / removing of 'blogs-special-menu' class on 'body' on mobile and removes all the classes of 1st menu\n\t\tif (data === 'open_blogs_special_menu') {\n\n\t\t\tif (!isDesktop()) {\n\t\t\t\tclearFirstMenuClasses();\n\t\t\t\t$body.toggleClass('blogs-special-menu');\n\t\t\t}\n\n\t\t\t$body.addClass(config.firstMenu);\n\n\t\t// If no parameter was inputed, remove the class 'blogs-special-menu'\n\t\t} else {\n\t\t\t$body.removeClass('blogs-special-menu');\n\t\t}\n\t}\n\n\t/**\n * Removes unnecessary spaces between words\n */\n\tfunction removeSpaces(str) {\n\t\tvar strSplitted = str.split(' '),\n\t\t\tresult = [];\n\n\t\tstrSplitted.map(function (value) {\n\t\t\tif (value !== '') {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t});\n\n\t\treturn result.join(' ');\n\t}\n\n//--------------------------------- Desktop ---------------------------------\n\n /**\n * Init if desktop and preselect levels only on www.avast domains\n */\n\tfunction desktopNav() {\n\t\tnavInit.desktopNav = true;\n\t\tpreSelectLevels();\n\t\t$body.addClass('navigation-for-desktop');\n\n\t\t// Desktop 2nd menu\n\n\t\t// Add and remove aria attibute\n\t\tdocument.querySelectorAll('[data-second-menu] .subcategory').forEach(function(item) {\n\t\t\titem.addEventListener('mouseenter', function() {\n\t\t\t\titem.setAttribute('aria-expanded', true);\n\t\t\t});\n\n\t\t\titem.addEventListener('mouseleave', function(e) {\n\t\t\t\tif (!$(document.elementFromPoint(e.clientX, e.clientY)).parents('.third-menu').length > 0) {\n\t\t\t\t\titem.setAttribute('aria-expanded', false);\n\t\t\t\t\titem.parentElement.classList.remove('isOpen');\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\n\t\tdocument.querySelectorAll('.third-menu').forEach(function(item) {\n\t\t\titem.addEventListener('mouseleave', function (e) {\n\t\t\t\tif (!$(document.elementFromPoint(e.clientX, e.clientY)).parents('[data-second-menu]').length > 0) {\n\t\t\t\t\titem.previousElementSibling.setAttribute('aria-expanded', false);\n\t\t\t\t\titem.previousElementSibling.parentElement.classList.remove('isOpen')\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\n // Opens up a menu item by pressing 'enter' key and closes all the open submenus\n\t\t$navigation.on('keyup', 'nav.mq-desktop [data-second-menu]', function (key) {\n\t\t\tif (key.which == 13 || key.keyCode == 13) {\n\t\t\t\tvar menuElement = this.querySelector('div.third-menu');\n\t\t\t\topenedSubMenu = document.activeElement;\n\t\t\t\tcloseSubMenus();\n\t\t\t\t$(this).children('span.subcategory').attr('aria-expanded', true);\n\t\t\t\t$(this).addClass('isOpen');\n\t\t\t\t//openSecondMenu($(this));\n\t\t\t\tsetFocus(menuElement);\n\t\t\t\tdefInnerLinks(menuElement);\n\t\t\t}\n\t\t});\n\n\t\t$(document).on('keydown', function (key) {\n\n\t\t\t// Closes menu by pressing 'esc' key\n\t\t\tif (key.which == 27 || key.keyCode == 27) {\n\t\t\t\topenedSubMenu !== null && openedSubMenu !== undefined ? openedSubMenu.focus() : '';\n\t\t\t\tremoveExpanded();\n\t\t\t\topenedSubMenu = null;\n\n\t\t\t\tif (typeof (openedThirdMenu) !== 'undefined' && openedThirdMenu !== null) {\n\t\t\t\t\topenedThirdMenu = null;\n\t\t\t\t\tthirdMenuLinks = [];\n\t\t\t\t}\n\n\t\t\t\tcloseSubMenus();\n\t\t\t}\n\n\t\t\t// Sets focus on the first element after pressing 'tab' key on the last element\n\t\t\tif (key.which === 9 || key.keyCode === 9) {\n\n\t\t\t\tif (typeof (openedThirdMenu) !== 'undefined' && openedThirdMenu !== null) {\n\t\t\t\t\tif ($(document.activeElement)[0].innerHTML === $(thirdMenuLinks.slice(-1))[0].innerHTML) {\n\t\t\t\t\t\topenedThirdMenu.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Desktop Blogs menu\n\n\t\t// Opens the 'Blogs menu' while mousehover on the 'Blogs' link\n\t\t$navigation.on('mouseenter', 'nav.mq-desktop .js-blogs', function () {\n\t\t\tupdateNavigation('open_blogs_special_menu');\n\t\t\t$body.addClass('blogs-special-menu');\n\t\t\t$body.removeClass('first-menu-regions');\n\t\t\t$secondMenuBlogs.setAttribute('aria-expanded', true);\n\t\t});\n\n\t\t// Opens up the 'Blogs menu' by pressing 'enter' key and closes all the open submenus\n\t\t$navigation.on('keydown', 'nav.mq-desktop .js-blogs', function (key) {\n\t\t\tif (key.which == 13 || key.keyCode == 13) {\n\t\t\t\topenedSubMenu = document.activeElement;\n\t\t\t\tcloseSubMenus();\n\t\t\t\t$secondMenuBlogs.setAttribute('aria-expanded', true);\n\t\t\t\tupdateNavigation('open_blogs_special_menu');\n\t\t\t\t$body.addClass('blogs-special-menu blogs-special-menu-isOpen');\n\t\t\t\tsetFocus($secondMenuBlogs);\n\t\t\t\tdefInnerLinks($secondMenuBlogs);\n\t\t\t}\n\t\t});\n\n\t\t// Closes the 'Blogs menu' on mouseleave\n\t\t$navigation.on('mouseleave', 'nav.mq-desktop .js-blogs', function (e) {\n\t\t\tif (document.elementFromPoint(e.clientX, e.clientY) === null || !document.elementFromPoint(e.clientX, e.clientY).classList.contains('second-menu', 'blogs')) {\n\t\t\t\tupdateNavigation(\"reset\");\n\t\t\t\t$secondMenuBlogs.setAttribute('aria-expanded', false);\n\t\t\t}\n\t\t})\n\n\t\t// Mouseleave not working preciselly in $cache, it's triggered in the middle of elements height.\n\t\tif ($secondMenuBlogs !== undefined && $secondMenuBlogs !== null) {\n\t\t\t$secondMenuBlogs.addEventListener('mouseleave', function (evt) {\n\n\t\t\t\tif (evt.target.matches('nav.mq-desktop .second-menu.blogs')) {\n\t\t\t\t\tupdateNavigation('reset');\n\t\t\t\t\t$secondMenuBlogs.setAttribute('aria-expanded', false);\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\n\t\t// Desktop Regions\n\n\t\t// Opens up the 'Region selector' after pressing 'enter' key and closes the 'blogs special menu'\n\t\t$languageSelectorButtons.on('keydown', function (key) {\n\t\t\tif (key.which == 13 || key.keyCode == 13) {\n\t\t\t\topenedSubMenu = document.activeElement;\n\t\t\t\tlanguageSelectorTrigger = $(this)[0];\n\t\t\t\t$body.removeClass('blogs-special-menu blogs-special-menu-isOpen');\n\n\t\t\t\t// Toggles on desktop, because 1st levels are disabled\n\t\t\t\t$body.addClass('first-menu-regions');\n\t\t\t\t$langSelector.addClass('active');\n\t\t\t\t$('body').addClass('js-language-selector-open');\n\t\t\t\tvar menuElement = document.querySelector('.region-selector');\n\t\t\t\tthirdMenuLinks = Array.from(menuElement.querySelectorAll('a'));\n\t\t\t\topenedThirdMenu = menuElement;\n\t\t\t\tmenuElement.setAttribute('aria-expanded', true);\n\n\t\t\t\t// Sets focus on the region selector\n\t\t\t\tsetFocus(menuElement);\n\n\t\t\t\twindow.history.pushState({ 'avast_regions': true }, 'Avast regions', window.location.href);\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n * Sets focus on the element\n */\n\tfunction setFocus(element) {\n\t\telement.setAttribute('tabIndex', -1);\n\t\tsetTimeout(function() {\n\t\t\telement.focus();\n\t\t}, 300);\n\t}\n\n\t/**\n * Composes an URL address\n */\n\tfunction preSelectLevels() {\n\t\tvar $navigationSecondMenuLinks = $navigation.find('.second-menu:not(.regions) a'),\n\t\t\tpageNotFound = true,\n\n\t\t\t// Path and Filename of the current page\n\t\t\tcurrentPage = window.location.pathname,\n\n\t\t\t// Part of an URL after the '?'\n\t\t\tcurrentPageParams = unserialize(window.location.search),\n\n\t\t\t// Current locale\n\t\t\tulocale = '',\n\t\t\tseparator;\n\n\t\tif (avastGlobalsAvailable) {\n\n\t\t\t// Fills up the variable with the locale and File name\n\t\t\tulocale = window.avastGlobals.web.ulocale.replace('/', '');\n\t\t\tseparator = ulocale.length > 0 ? '/' : '';\n\t\t\tcurrentPage = '/' + ulocale + separator + window.avastGlobals.web.fileName;\n\t\t}\n\n\t\t$navigationSecondMenuLinks.each(function () {\n\t\t\tdetectLink($(this));\n\t\t});\n\n\t\t// If the URL starts with the word 'web', it is a preview link ('web-preview.ff.int.avast.com..')\n\t\tif (pageNotFound && (window.location.hostname.substr(0, 3) === 'www' || window.location.hostname.substr(0, 3) === 'web')) {\n\n\t\t\t// Activates 'For home' menu\n\t\t\tconfig.firstMenu = 'first-menu-for-home';\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\t// Set press.avast.com and higlight Press center item in the First and 2nd menu\n\t\tif (window.location.hostname === 'press.avast.com') {\n\t\t\tvar $pressCenter = $(\"li[data-second-menu='press-center']\");\n\n\t\t\t// Activates 'About us' menu\n\t\t\tconfig.firstMenu = 'first-menu-about-us';\n\t\t\t$body.addClass(config.firstMenu);\n\t\t\t$pressCenter.addClass('isActive');\n\t\t}\n\n\t\t// Sets blog.avast.com and activates Blogs 2nd menu\n\t\tif (window.location.hostname === 'blog.avast.com') {\n\t\t\tvar $blogSecondMenu = $('div.second-menu.blog'),\n\t\t\t\t$blogMenu = $('li.js-blogs.blogs');\n\n\t\t\t// Activates 'Blogs' menu\n\t\t\tconfig.secondMenu = 'second-menu blog';\n\t\t\t$body.addClass(config.secondMenu);\n\t\t\t$blogSecondMenu.addClass('isActive');\n\t\t\t$blogMenu.addClass('isActive');\n\t\t}\n\n\t\t// Activates 'For partners' menu\n\t\tif (avastGlobals && avastGlobals.web && /PARTNERS/.test(avastGlobals.web.contentGroup.toUpperCase())) {\n\t\t\tclearFirstMenuClasses();\n\t\t\tconfig.firstMenu = 'first-menu-for-partners';\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\t// Activates 'For business' menu\n\t\tif (avastGlobals && avastGlobals.web && /SMB|BUSINESS/.test(avastGlobals.web.contentGroup.toUpperCase())) {\n\t\t\tclearFirstMenuClasses();\n\t\t\tconfig.firstMenu = 'first-menu-for-business';\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\t// Activates 'About Us' menu\n\t\tif (avastGlobals && avastGlobals.web && /OTHERS/.test(avastGlobals.web.contentGroup.toUpperCase())) {\n\t\t\tclearFirstMenuClasses();\n\t\t\tconfig.firstMenu = 'first-menu-about-us';\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\tfunction detectLink($element) {\n\t\t\tif (pageNotFound) {\n\t\t\t\tvar selfHref = $element.attr('href'),\n\t\t\t\t\tselfHrefParams = getParamsFromHref(selfHref);\n\n\t\t\t\t// If isDevEnv, remove first part && first symbol in link is '/'\n\t\t\t\tif (isDevEnv && selfHref.split('')[0] === '/') {\n\t\t\t\t\tselfHref = '/' + selfHref.split('/').splice(2).join('/');\n\t\t\t\t}\n\n\t\t\t\t// If selfHref contains parameters AND current page pathname is equal to link pathname AND current page contains params\n\t\t\t\tif (typeof selfHrefParams !== 'undefined' && selfHref.split('?')[0] === currentPage && !$.isEmptyObject(currentPageParams)) {\n\n\t\t\t\t\t// Checks if the current page contains those parameters\n\t\t\t\t\tfor (var key in selfHrefParams) {\n\n\t\t\t\t\t\tif (typeof currentPageParams[key] !== 'undefined' && currentPageParams[key] === selfHrefParams[key]) {\n\t\t\t\t\t\t\tpageNotFound = false;\n\t\t\t\t\t\t\tdetectParent($element);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (currentPage === selfHref) {\n\t\t\t\t\tpageNotFound = false;\n\t\t\t\t\tdetectParent($element);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n \t* Takes the closest '.second-menu' item, finds out from which 1st menu section comes from ('For home', 'For business'..) and displays relevant menu\n \t*/\n\t\tfunction detectParent($foundLinkElement) {\n\t\t\tvar $parent = $foundLinkElement.closest('.second-menu'),\n\t\t\t\t$parentWithData = $foundLinkElement.closest('[data-second-menu]'),\n\t\t\t\tparentClasses = $parent.attr('class').split(' '),\n\t\t\t\tavailableClasses = ['for-home', 'for-business', 'for-partners', 'about-us'],\n\t\t\t\tlinkFoundInNavigation = false;\n\n\t\t\t$(parentClasses).each(function () {\n\t\t\t\tif (availableClasses.indexOf(this) > -1) {\n\n\t\t\t\t\t// Sets a menu item into a variable\n\t\t\t\t\tconfig.firstMenu = 'first-menu-' + this;\n\t\t\t\t\tlinkFoundInNavigation = true;\n\n\t\t\t\t\t// Sets aria data attribut to the First level menu\n\t\t\t\t\t$('li.' + this + ' a').attr('aria-current', true);\n\n\t\t\t\t\t// current active 2nd menu, if exists\n\t\t\t\t\tif ($parentWithData.length > 0) {\n\t\t\t\t\t\t$parentWithData.addClass('isActive');\n\t\t\t\t\t}\n\n\t\t\t\t\t// current link in 2nd or 3rd menu\n\t\t\t\t\t$foundLinkElement.parent().addClass('isActive');\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If the respective 2nd menu was not found, sets to 'For home' (Adds the class 'first-menu-for-home')\n\t\t\tif (!linkFoundInNavigation) {\n\t\t\t\tconfig.firstMenu = 'first-menu-for-home';\n\t\t\t}\n\n\t\t\t$body.addClass(config.firstMenu);\n\t\t}\n\n\t\t/**\n \t* Returns an array of parameters from the URL\n \t*/\n\t\tfunction getParamsFromHref(href) {\n\t\t\tvar result;\n\n\t\t\tresult = href.split('#')[0];\n\t\t\tresult = href.split('?')[1];\n\n\t\t\treturn typeof result !== 'undefined' ? unserialize(result) : undefined;\n\t\t}\n\n\t}\n\n\t/**\n\t* setDesktopNav Switch all DOM elements to desktop navigation\n\t*/\n\tfunction setDesktopNav() {\n\t\tif (mqDesktop.matches) {\n\t\t\tvar body = document.querySelector('body');\n\n\t\t\t// Sets event listeneres for the desktop navigation\n\t\t\tif (!navInit.desktopNav) desktopNav();\n\n\t\t\t// Mark interactive elements with correct media query class. Used for proper event delegation\n\t\t\tsetMqMarkers('mq-desktop', 'header nav');\n\n\t\t\t// Rebind resize event for desktop breakpoint\n\t\t\t$(window).off('resize', setDesktopNav);\n\t\t\t$(window).on('resize', setMobileNav);\n\n\t\t\tpreSelectLevels();\n\n\t\t\t// No need to rebind secondMenu handlers, it's already on init and delegated to media query class.\n\t\t\t// Remove first level navigation.\n\t\t\tbody.classList.remove.apply(body.classList, firstMenuClasses);\n\n\t\t\t// Add correct body classes for mobile navigation\n\t\t\tbody.classList.add('navigation-for-desktop');\n\n\t\t\tif (config.firstMenu) {\n\t\t\t\tbody.classList.add(config.firstMenu);\n\n\t\t\t} else {\n\t\t\t\tbody.classList.add('first-menu-for-home');\n\t\t\t}\n\n\t\t\t// Remove second level navigation. Dropdowns are hidden on desktop by default.\n\t\t\tbody.classList.remove.apply(body.classList, secondMenuClasses);\n\n\t\t\t// Remove main mobile class and close navigation - sets only mobile state.\n\t\t\tbody.classList.remove(\n\t\t\t\t'navigation-for-mobile',\n\t\t\t\t'navigation-closed'\n\t\t\t);\n\n\t\t\t$('header nav').css('max-height', '');\n\n\t\t\t// Reset 1st menu. Prevent to display multiple first levels if switching from opened mobile navigation.\n\t\t\tconfig.firstMenu = config.firstMenu || false;\n\n\t\t\t// Reset 2nd menu. Prevent to display multiple second levels on blogs mouseover after switching from mobile navigation.\n\t\t\tconfig.secondMenu = config.firstMenu || false;\n\t\t}\n\t}\n\n\n//--------------------------------- Mobile ---------------------------------\n\n\t/**\n * Init if mobile\n */\n\tfunction mobileNav() {\n\t\tvar $toggleMenu = $navigation.find('.js-toggle-menu'),\n\t\t\t$hintToggler = $navigation.find('.js-hint-toggler'),\n\t\t\t$hintClose = $navigation.find('.js-hint-close');\n\n\t\tnavInit.mobileNav = true;\n\t\texpandSecondLevel();\n\t\t$body.addClass('navigation-for-mobile');\n\t\t$body.addClass('navigation-closed');\n\n\t\t// 'Go back' button\n\t\t$navigation.on('click', 'nav.mq-mobile .js-back', function () {\n\t\t\tclearFirstMenuClasses();\n\n\t\t\tif ($(this).hasClass('js-blog')) {\n\t\t\t\t$body.removeClass('blogs-special-menu');\n\t\t\t}\n\t\t});\n\n\t\t// 'Close' button\n\t\t$navigation.on('click', '.js-toggle-menu', function () {\n\t\t\tif ($body.hasClass('navigation-closed')) {\n\t\t\t\tvar messageBar = $('.message-line').length !== 0 ? $('.message-line').innerHeight() : 0;\n\t\t\t\tvar cookiesBanner = $('#onetrust-banner-sdk').length !== 0 ? $('#onetrust-banner-sdk').innerHeight() + 10 : 0;\n\n\t\t\t\t$('header nav').css('max-height', (window.innerHeight - messageBar - cookiesBanner) + 'px');\n\t\t\t} else {\n\t\t\t\t$('header nav').css('max-height', '')\n\t\t\t}\n\n\t\t\t$body.toggleClass('navigation-closed');\n\t\t\t$toggleMenu.attr('data-nav-mobile-toggle', $toggleMenu.attr('data-nav-mobile-toggle') === 'open' ? 'closed' : 'open');\n\t\t});\n\n\t\t// Closes the menu if clicked elsewhere\n\t\t$window.on('click', function (event) {\n\t\t\tvar $target = $(event.target);\n\n\t\t\t// If navigation clicked AND target is not special menu AND target is not Blogs item, then close special menu\n\t\t\tif ($target.closest($navigation).length > 0 ) {\n\n\t\t\t\tif (!isDesktop() && $target.is($navigation)) {\n\t\t\t\t\tupdateNavigation('reset');\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// if cookie bar clicked, region selector button in footer, do not close\n\t\t\t\tif (!($target.is('.js-cookie-bar, .select-region-button, .select-region-button *') || $target.closest('.js-cookie-bar').length > 0)) {\n\t\t\t\t\tupdateNavigation('reset');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// DataLayer push on click\n\t\t$navigation.on('click', 'nav.mq-mobile [data-bi-nav]', function () {\n\t\t\tif (typeof window.dataLayer !== \"undefined\") {\n\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\tevent: 'firstMenuClick',\n\t\t\t\t\tbutton: this.getAttribute('data-bi-nav')\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Mobile 1st menu\n\n\t\t// Redirects to the correct URL after clicking on a 1st menu item ( link is not visible on mobile version of the menu)\n\t\t$navigation.on('click', 'nav.mq-mobile [data-first-menu]', function () {\n\t\t\tvar cachedFirstMenu = config.firstMenu,\n\t\t\t\tclickedFirstMenu = 'first-menu-' + $(this).data('first-menu');\n\n\t\t\tif (this.getAttribute('data-first-menu') === 'for-business' && document.querySelector('.second-menu.for-business') === null) {\n\t\t\t\twindow.location.href = this.querySelector('a').getAttribute('href');\n\t\t\t}\n\n\t\t\tclearFirstMenuClasses();\n\n\t\t\tif (clickedFirstMenu !== cachedFirstMenu) {\n\t\t\t\tconfig.firstMenu = clickedFirstMenu;\n\t\t\t}\n\n\t\t\tupdateNavigation();\n\t\t});\n\n\t\t// Mobile 2nd menu\n\n\t\t// Detects, on which 2nd menu item was clicked and adds its class on 'body'\n\t\t$navigation.on('click', 'nav.mq-mobile [data-second-menu] span', function (event) {\n\t\t\tvar menuItem = $(this).parent('li');\n\t\t\topenSecondMenu(menuItem, event);\n\t\t});\n\n\t\t// Toggles opening and closing of submenu in 'Security' mobile menu by adding / removing the class 'show-hint'\n\t\t$hintToggler.on('click', function () {\n\t\t\t$(this).closest('.js-hint').addClass('show-hint');\n\t\t});\n\n\t\t$hintClose.on('click', function () {\n\t\t\t$(this).closest('.js-hint').removeClass('show-hint');\n\t\t});\n\n\n\t\t// Mobile Blogs menu\n\n\t\t// Opens 'special menu' after clicking on 'Blogs' menu item\n\t\t$navigation.on('click', 'nav.mq-mobile .js-blogs', function () {\n\t\t\tupdateNavigation('open_blogs_special_menu');\n\t\t});\n\n\t\t// Mobile region selector\n\n\t\t// Dropdowns control\n\t\t$('.js-regions-toggle').on('click', function () {\n\t\t\tvar $regionList = $(this).closest('.area');\n\n\t\t\t$regionList.toggleClass('isOpen');\n\t\t});\n\n\t\t// Toggles showing/hiding of login buttons\n\t\t$('.header .second-menu .subcategory.account').on('click', function () {\n\t\t\t$('.third-menu.login').toggleClass('isOpen');\n\t\t\t$('.second-menu.for-business .mobile-links-top').toggleClass('isOpen');\n\t\t});\n\n\t}\n\n\t/**\n * setMobileNav Switch all DOM elements to mobile navigation\n */\n\tfunction setMobileNav() {\n\t\tif (mqMobile.matches) {\n\t\t\tvar body = document.querySelector('body');\n\n\t\t\t// Sets event listeners for the mobile navigation\n\t\t\tif (!navInit.mobileNav) mobileNav();\n\n\t\t\t// Mark interactive elements with correct media query class. Used for proper event delegation\n\t\t\tsetMqMarkers('mq-mobile', 'header nav');\n\n\t\t\t// Rebind resize event for desktop breakpoint\n\t\t\t$(window).off('resize', setMobileNav);\n\t\t\t$(window).on('resize', setDesktopNav);\n\n\n\t\t\t// Set mobile navigation main class. Close navigation by default.\n\t\t\t// FIXME: IE11 no support for multiple arguments\n\t\t\tbody.classList.add(\n\t\t\t\t'navigation-for-mobile',\n\t\t\t\t'navigation-closed'\n\t\t\t);\n\n\t\t\t// Add second level navigation. It is unfolded by default on mobile\n\t\t\t// FIXME: Using default list of second levels include login navigation which should be closed.\n\t\t\tbody.classList.add.apply(body.classList, secondMenuClasses);\n\n\t\t\t// 1st menu is closed by default on mobile\n\t\t\tbody.classList.remove(\n\t\t\t\t'navigation-for-desktop',\n\t\t\t\t'first-menu-for-home'\n\t\t\t);\n\n\t\t\t// Reset 1st menu\n\t\t\tconfig.firstMenu = false;\n\t\t\t// FIXME: Set 2nd ,enu. There is an incorrect assumption in 'openSecondMenu' method, that there will be always some second level cached.\n\t\t\tconfig.secondMenu = secondMenuClasses.join(' ');\n\t\t}\n\t}\n\n\treturn {};\n});\n\n // Notification overlay for wrong download\n\n (function() {\n 'use strict';\n var $ = avm.require('jquery'),\n detect = avm.require('avast.detect')(),\n detectedPlatform = detect.os.name.toLowerCase(),\n $document = $(document),\n currentPageName = getCurrentPageName(),\n supportedPlatforms = {\n \"android\": {\n text: \"Android\",\n style: \"google-play.png\"\n },\n \"ios\": {\n text: \"iOS\",\n style: \"app-store.png\"\n },\n \"mac\": {\n text: \"Mac\",\n style: \"logo-mac\"\n },\n \"windows\": {\n text: \"Windows\",\n style: \"logo-win\"\n }\n },\n defaultIconName = \"google-play.png\",\n config = window.avastGlobals && typeof window.avastGlobals.web !== 'undefined' && typeof window.avastGlobals.web['notification-overlay-for-wrong-download'] !== 'undefined' ? window.avastGlobals.web['notification-overlay-for-wrong-download'] : false,\n configCurrentPage = config[currentPageName],\n pageSupportedPlatform = typeof configCurrentPage !== 'undefined' ? configCurrentPage['supported-platform'].toLowerCase() : false;\n\n $document.ready(function() {\n if (checkIfApplyPopupLogicForCurrentPage()) {\n var $body = $('body'),\n $popup = $('.js-notification-overlay-for-wrong-download'),\n $popupButton = $popup.find('.js-popup-button'),\n $platformPlaceHolderHeader = $popup.find('.detected-platform'),\n $supportedPlatformPlaceHolder = $popup.find('.supported-platform'),\n $downloadButton = $('[data-download-name=\\\"' + configCurrentPage['product-id'] + '\\\"]'),\n downloadButtonData = {\n 'data-os': $downloadButton.attr('data-os') || pageSupportedPlatform,\n 'data-download-name': $downloadButton.attr('data-download-name') || configCurrentPage['product-id'],\n 'href': $downloadButton.attr('href') || null\n },\n $close = $popup.find('.js-close'),\n bodyOverflow = $body.css('overflow');\n\n // Dynamicly update button for particular page\n $popupButton.attr('data-os', downloadButtonData['data-os']);\n $popupButton.attr('data-download-name', downloadButtonData['data-download-name']);\n $popupButton.attr('href', downloadButtonData.href);\n\n $close.on('click', function() {\n $popup.removeClass('show-popup');\n window.location.hash = '!';\n $body.css('overflow', bodyOverflow);\n });\n\n $popup.on('click', function(event) {\n if ($(event.target).is($popup)) {\n $close.trigger('click');\n }\n });\n\n $downloadButton.on('click', function(event) {\n if (detectedPlatform !== pageSupportedPlatform) {\n event.preventDefault();\n event.stopPropagation();\n $popup.addClass('show-popup');\n $platformPlaceHolderHeader.text(supportedPlatforms[detectedPlatform].text);\n $supportedPlatformPlaceHolder.text(supportedPlatforms[pageSupportedPlatform].text)\n window.location.hash = 'oops';\n $body.css('overflow', 'hidden');\n }\n });\n\n updateInsteadLinks($popup);\n applyBrandingStyle($popup);\n\n // If platform is known but alternative download is missing\n if (detectOthers($popup)) {\n $popup.addClass('detected-others');\n }\n }\n });\n\n // Checks whether current page name is listed in avastGlobals config. If not, skip popup logic\n // once localization is done to all instances , language condition can be removed\n function checkIfApplyPopupLogicForCurrentPage() {\n if (config && window.avastGlobals.web.language === 'en') { // @todo : remove right side condition when localizations imported\n // Check config if page is there\n for (var page in config) {\n if (page === currentPageName) {\n buttonSelector();\n return true;\n }\n }\n }\n\n return false;\n }\n\n // In case we are changing installers based on different locations\n function buttonSelector() {\n if ($.isArray(configCurrentPage['product-id'])) {\n $.each(configCurrentPage['product-id'], function(i, val) {\n if ($('[data-download-name=\\\"' + val + '\\\"]').length > 0)\n configCurrentPage['product-id'] = val;\n });\n }\n }\n\n\n //if android/ios device , display store button instead of icons\n function applyBrandingStyle($popup) {\n var $popupButton = $popup.find('.js-popup-button'),\n $platformIcon = typeof $popupButton.find('img') !== 'undefined' ? $popupButton.find('img') : false;\n\n if ($platformIcon.length > 0) {\n if (pageSupportedPlatform === \"ios\" || pageSupportedPlatform === \"android\") {\n $popupButton.removeClass('white');\n $popupButton.find('span').remove();\n var supportedPlatformIcon = $platformIcon.attr('src');\n $platformIcon.attr('src', supportedPlatformIcon.replace(defaultIconName, supportedPlatforms[pageSupportedPlatform].style));\n return;\n }\n }\n $popupButton.addClass(supportedPlatforms[pageSupportedPlatform].style);\n $platformIcon.remove();\n }\n\n\n function getCurrentPageName() {\n var pathnameSplitted = window.location.pathname.split('/');\n return pathnameSplitted[pathnameSplitted.length - 1];\n }\n\n\n /*\n poupulate corresponding properties with data from avastGlobals\n show .detected-{Detected OS}\n */\n function updateInsteadLinks($popup) {\n var alternativeLinks = configCurrentPage['alternative-links'],\n alternativeTracking = configCurrentPage['alternative-tracking'],\n $targetLinks = $popup.find('.detected-' + detectedPlatform).find('.js-instead-link');\n $popup.find('.detected-' + detectedPlatform).addClass('show');\n\n if (typeof alternativeLinks !== 'undefined') {\n $targetLinks.attr('href', alternativeLinks[detectedPlatform]);\n }\n\n if (typeof alternativeTracking !== 'undefined') {\n $targetLinks.attr('data-download-name', alternativeTracking[detectedPlatform]);\n }\n\n $targetLinks.attr('data-os', detectedPlatform);\n }\n\n // This function returns true if platform is known (Windows, Mac etc.), but there is no altertnative download\n function detectOthers($popup) {\n var _alternativeLinks = typeof configCurrentPage['alternative-links'] !== 'undefined' ? configCurrentPage['alternative-links'] : null;\n\n if (!$popup.hasClass('detected-unknown') && (_alternativeLinks === null || typeof _alternativeLinks[detectedPlatform] === 'undefined')) {\n return true;\n }\n\n return false;\n }\n })();\n // /Notification overlay for wrong download\n\n/**\n * Unsupported browser message\n * @version 1.0.0\n * @author Fedor Kušš\n * @requires jquery\n * @requires avast.detect\n */\n\navm.define('avast.web.notSupportedBrowser', function() {\n\t'use strict';\n\tvar $ = avm.require('jquery'),\n\t\tdetectedBrowser = avm.require('avast.detect')().browser.name.toLowerCase(),\n\t\tdetectedVersion = avm.require('avast.detect')().browser.version.toLowerCase(),\n\t\tnotSupportedBrowser = detectedBrowser + detectedVersion.split('.')[0],\n\t\t$body = $('body');\n\n\tif (notSupportedBrowser === 'internetexplorer8' || notSupportedBrowser === 'internetexplorer9') {\n\t\t$body.addClass('notSupportedBrowser');\n\t}\n\n})();\n\n/**\n * Avast Platform Switcher\n * @version 1.2.1\n * @author Michal Langhoffer \n * @module avast.web.platformSwitcher\n * @requires jquery\n * @requires avast.detect\n * @requires avast.web.router\n */\navm.define('avast.web.platformSwitcher', (function() {\n\t'use strict';\n\tvar $ = avm.require('jquery'),\n\t\tdetect = avm.require('avast.detect'),\n\t\trouter = avm.require('avast.web.router'),\n\t\tandroid = 'android',\n\t\tios = 'ios',\n\t\tmac = 'mac',\n\t\tpc = 'pc',\n\t\tplatforms = [android, ios, mac, pc],\n\t\tdisableHash = false,\n\t\t$body = $('body'),\n\t\t$jsPlatformSwitcher = $('.js-platform-switcher'),\n\t\t$popupButtons = $('.overlay-box .js-platform-switcher'),\n\t\t$overlayBoxClose = $('.overlay-box .close');\n\treturn {\n\t\tinit: function(param) {\n\t\t\tvar self = this;\n\n\t\t\tif (param && 'disableHash' in param) {\n\t\t\t\tif (param.disableHash){\n\t\t\t\t\tdisableHash = true;\n\t\t\t\t\tif (typeof window.avastGlobals !== \"undefined\" && typeof window.avastGlobals.web !== 'undefined') {\n\t\t\t\t\t\twindow.avastGlobals.web.disableHash = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof window.avastGlobals !== \"undefined\" && typeof window.avastGlobals.web !== 'undefined' && typeof window.avastGlobals.web.disableHash === true) {\n\t\t\t\tdisableHash = true;\n\t\t\t}\n\n\t\t\tself.detectPlatform();\n\t\t\tself.switcher();\n\t\t\tself.closeOverlayBox();\n\t\t\tself.showButtons();\n\t\t\tif (!disableHash) {\n\t\t\t\trouter.set({\n\t\t\t\t\t'pc': function() {\n\t\t\t\t\t\tself.addBodyClass(pc);\n\t\t\t\t\t},\n\t\t\t\t\t'mac': function() {\n\t\t\t\t\t\tself.addBodyClass(mac);\n\t\t\t\t\t},\n\t\t\t\t\t'android': function() {\n\t\t\t\t\t\tself.addBodyClass(android);\n\t\t\t\t\t},\n\t\t\t\t\t'ios': function() {\n\t\t\t\t\t\tself.addBodyClass(ios);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t// change root class and add hash to URL according to detected device\n\t\tdetectPlatform: function() {\n\t\t\tvar hash = window.location.hash,\n\t\t\t\tplatform = hash.substring(1),\n\t\t\t\trootPlatform;\n\t\t\t// add root class to body according to detected platform or detected hash from URL\n\t\t\tif (detect().os.isAndroid) {\n\t\t\t\trootPlatform = android;\n\t\t\t} else if (detect().os.isIOS) {\n\t\t\t\trootPlatform = ios;\n\t\t\t} else if (detect().os.isMac) {\n\t\t\t\trootPlatform = mac;\n\t\t\t} else {\n\t\t\t\trootPlatform = pc;\n\t\t\t}\n\n\t\t\tif (platforms.indexOf(platform) < 0) {\n\t\t\t\tplatform = rootPlatform;\n\t\t\t}\n\n\t\t\tthis.addRootClass(rootPlatform);\n\t\t\tif (disableHash) {\n\t\t\t\tthis.addBodyClass(rootPlatform)\n\t\t\t} else {\n\t\t\t\twindow.location.hash = platform;\n\t\t\t}\n\t\t},\n\t\t// add class according to used device\n\t\taddRootClass: function(platform) {\n\t\t\t$body.addClass('js-root-' + platform);\n\t\t},\n\t\t// remove platform classes\n\t\tresetPlatformClass: function() {\n\t\t\t$body.removeClass('js-pc js-android js-ios js-mac');\n\t\t},\n\t\t// remove platform classes and add class to body\n\t\taddBodyClass: function(platform) {\n\t\t\tthis.resetPlatformClass();\n\t\t\t$body.addClass('js-' + platform);\n\t\t},\n\t\t// remove platform classes and add platform class according to clicked element\n\t\tswitcher: function() {\n\t\t\t$jsPlatformSwitcher.on('click', function() {\n\t\t\t\tvar self = $(this),\n\t\t\t\t\tselectPlatform;\n\t\t\t\tif (self.hasClass('js-android')) {\n\t\t\t\t\tselectPlatform = android;\n\t\t\t\t} else if (self.hasClass('js-ios')) {\n\t\t\t\t\tselectPlatform = ios;\n\t\t\t\t} else if (self.hasClass('js-mac')) {\n\t\t\t\t\tselectPlatform = mac;\n\t\t\t\t} else {\n\t\t\t\t\tselectPlatform = pc;\n\t\t\t\t}\n\t\t\t\twindow.location.hash = selectPlatform;\n\t\t\t});\n\t\t},\n\t\t// close overlay-box when platform clicked\n\t\tcloseOverlayBox: function() {\n\t\t\t$popupButtons.on('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t$overlayBoxClose.trigger('click');\n\t\t\t});\n\t\t},\n\t\t// add class to body to show buttons, they are hidden by default to prevent showing all buttons at once on DOM load\n\t\tshowButtons: function() {\n\t\t\t$body.addClass('js-show-buttons');\n\t\t}\n\t};\n})());\n\nvar cookieStorage = avm.require('avast.storage.cookieStorage'),\n getUrlParameter = function getUrlParameter(sParam) {\n var sPageURL = decodeURIComponent(window.location.search.substring(1)),\n sURLVariables = sPageURL.split('&'),\n sParameterName,\n i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : sParameterName[1];\n }\n }\n },\n getExpirationTime = function (hours) {\n var now = new Date();\n now.setTime(now.getTime() + hours * 3600 * 1000);\n return now.toUTCString();\n };\n\nif (getUrlParameter('gclsrc') && getUrlParameter('gclid')) {\n var domainName = window.location.hostname.substring(3);\n cookieStorage.setItem('gclid-avast', getUrlParameter('gclid'), getExpirationTime(24), '/', domainName, false);\n}\n/**\n * Shared cookie - Avast locale\n * @version 1.1.0\n * @author Michal Langhoffer \n * @requires avast.storage.cookieStorage\n */\navm.define('avast.web.sharedCookieAvastLocale', (function() {\n\t'use strict';\n\tvar cookieStorage = avm.require('avast.storage.cookieStorage'),\n\t\tcookieName = 'apex__avastLocale',\n\t\tlocale = '';\n\n\tcookieStorage.removeItem(cookieName);\n\n\tif (typeof window.avastGlobals !== 'undefined' && typeof window.avastGlobals.web !== 'undefined' && typeof window.avastGlobals.web.locale !== 'undefined' && window.avastGlobals.web.locale.length > 0) {\n\t\tlocale = window.avastGlobals.web.locale;\n\t\tcookieStorage.setItem(cookieName, locale, undefined, '/', '.avast.com');\n\t}\n\n\treturn false;\n})());\n\n/**\n * Sticky nav for tabs. Sticky slide in to viewport when scrolled.\n * @version 0.7.0\n * @author Ales Gabriel , Michal Langhoffer \n * @module avast.web.tabsAnchor\n * @requires module:jquery\n * @copyright Avast Software s.r.o ©2014-2015\n */\n\navm.define('avast.web.tabsAnchor', (function() {\n\n\tvar $ = avm.require('jquery'),\n\t\t$window = $(window),\n\t\twaypoints = avm.require('avast.web.waypoints'),\n\t\tlastScrollTop = 0,\n\t\tdirection;\n\n\tvar tabsAnchor = {\n\t\tdefaults: {\n\t\t\tbehavior: 'slideIn'\n\t\t},\n\t\tinit: function(nId, options){\n\t\t\tvar opts = this.options = $.extend(true, this.defaults, options);\n\n\t\t\tif(nId && $(nId).length > 0) {\n\t\t\t\tthis.stick(nId);\n\t\t\t\tthis.highlight(nId);\n\t\t\t\tthis.handleClick(nId);\n\t\t\t\tthis.visible(nId);\n\t\t\t}\n\t\t},\n\t\tvisible: function(nId) {\n\t\t\tvar $bar = $(nId),\n\t\t\t\twindowScrollTop = $window.scrollTop(),\n\t\t\t\t$wrapper = $(nId).parent(),\n\t\t\t\twrapperOffsetTop = $wrapper.offset().top;\n\n\t\t\tif (windowScrollTop > wrapperOffsetTop) {\n\t\t\t\t$bar.addClass('sticky');\n\t\t\t} else {\n\t\t\t\t$bar.removeClass('sticky');\n\t\t\t}\n\t\t},\n\t\tstick: function(nId){\n\t\t\tif(typeof waypoints === 'function'){\n\n\t\t\t\tvar clone = $('
'),\n\t\t\t\t\t$this = $(nId),\n\t\t\t\t\tfirstItemId = $(nId + ' ul:first li:first-child').find('a').attr('href'),\n\t\t\t\t\tlastItemId = $(nId + ' ul:first li:last-child').find('a').attr('href'),\n\t\t\t\t\th = this.options.height ? this.options.height : $this.outerHeight(),\n\t\t\t\t\tp = $this.css('marginTop'),\n\t\t\t\t\tsTop = $window.scrollTop(),\n\t\t\t\t\troot = this;\n\n\t\t\t\tif(firstItemId && firstItemId.indexOf('#') !== 0){\n\t\t\t\t\tfirstItemId = '-';\n\t\t\t\t}\n\n\t\t\t\tif(lastItemId && lastItemId.indexOf('#') !== 0){\n\t\t\t\t\tlastItemId = '-';\n\t\t\t\t}\n\n\t\t\t\t// Find correct anchored element\n\t\t\t\tif($(firstItemId).length === 0){\n\t\t\t\t\t$(nId + ' ul:first li').each(function(){\n\t\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\t\tvar anchorId = $this.find('a').attr('href');\n\t\t\t\t\t\tif(anchorId){\n\t\t\t\t\t\t\tif(anchorId.indexOf('#') !== 0){\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif($(anchorId).length > 0){\n\t\t\t\t\t\t\tfirstItemId = anchorId;\n\t\t\t\t\t\t\treturn false; // stop loop with first success\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// TODO: Cure situation when item is in nav without approp section on page. Sticky bar is not hide when moved to top.\n\t\t\t\t// first tab reached\n $window.on('resize scroll', function() {\n var st = $(this).scrollTop();\n if (st > lastScrollTop){\n direction = 'down';\n } else {\n direction = 'up';\n }\n\t\t\t\t\tlastScrollTop = st;\n\t\t\t\t\t\n\t\t\t\t\tif ($this.parent().hasClass('partscreen')) {\n\t\t\t\t\t\troot.visible(nId);\n\t\t\t\t\t} else if ($(firstItemId).length > 0 && waypoints($(firstItemId), null, null, true)) {\n $this.addClass('sticky');\n if(root.options.behavior === 'static' && $('#tabs-anchor-clone').length < 1) {\n clone.height(h);\n $this.before(clone);\n }\n } else {\n $this.removeClass('sticky');\n if(root.options.behavior === 'static') {\n clone.remove();\n }\n }\n\n // last tab reached\n if ($(lastItemId).length > 0 && waypoints($(lastItemId), null, null, true)) {\n\t\t\t\t\t\t$this.addClass('sticky');\n\t\t\t\t\t\tif(root.options.behavior === 'static' && $('#tabs-anchor-clone').length < 1) {\n\t\t\t\t\t\t\tclone.height(h);\n\t\t\t\t\t\t\t$this.before(clone);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ($(lastItemId).length > 0 && $(lastItemId).offset().top + $(lastItemId).outerHeight() - $(nId).outerHeight() < $window.scrollTop()) {\n\t\t\t\t\t\t$this.removeClass('sticky');\n\t\t\t\t\t\tif(root.options.behavior === 'static') {\n\t\t\t\t\t\t\tclone.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n });\n\t\t\t}\n\t\t},\n\t\thighlight: function(nId) {\n\t\t\tvar lastSection;\n\n\t\t\t$(nId + ' ul:first').find('a').each(function(){\n\t\t\t\tvar href = $(this).attr('href');\n\t\t\t\tvar id = href.replace(/#/,'');\n\n\t\t\t\t$('#content-holder').children().each(function(index){\n\t\t\t\t\tif(id == $(this).attr('id')){\n\t\t\t\t\t\t$(this).addClass('tabs-anchor-section');\n\t\t\t\t\t\t// last child\n\t\t\t\t\t\tlastSection = $(this);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif(lastSection){\n\t\t\t\tlastSection.addClass('last-anchor-section');\n\t\t\t}\n\n\t\t\t$('.tabs-anchor-section').each(function() {\n\t\t\t\tvar $self = $(this);\n\t\t\t\tif ($self.length > 0) {\n\t\t\t\t\t$window.on('resize scroll', function() {\n\t\t\t\t\t\tif (waypoints($self, null, null, true)) {\n\t\t\t\t\t\t\tvar id;\n\t\n\t\t\t\t\t\t\t$(nId + ' ul:first').find('a').removeClass('active');\n\t\t\t\t\t\t\t\tid = $self.attr('id');\n\t\t\t\t\t\t\t\t$('[href=\"#'+ id +'\"]').addClass('active');\n\t\n\t\n\t\t\t\t\t\t\tvar el = $self;\n\t\t\t\t\t\t\tvar timeout = setTimeout(function(){\n\t\t\t\t\t\t\t\t$(el).trigger({\n\t\t\t\t\t\t\t\t\ttype: 'passed.waypoint',\n\t\t\t\t\t\t\t\t\tdirection: direction,\n\t\t\t\t\t\t\t\t\toffset: 500\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\t\t}, 100);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n });\n\t\t},\n\t\thandleClick: function(nId) {\n\t\t\tvar $item = $(nId + ' ul li a');\n\n\t\t\t$item.on('click', function(event) {\n\t\t\t\tfunction updateActiveItem() {\n\t\t\t\t\t$item.removeClass('active');\n\t\t\t\t\t$(event.target).addClass('active');\n\t\t\t\t\tclearTimeout($.data(this, 'scrollTimer'));\n\n\t\t\t\t\t// Wait until page stops scrolling\n\t\t\t\t\t$.data(this, 'scrollTimer', setTimeout(function() {\n\t\t\t\t\t\t$(event.target).addClass('active');\n\t\t\t\t\t\t$window.off('scroll', updateActiveItem)\n\t\t\t\t\t}, 50));\n\t\t\t\t}\n\n\t\t\t\t$window.on('scroll', updateActiveItem);\n\t\t\t});\n\t\t}\n\t};\n\n\treturn tabsAnchor;\n\n})());\n\n/**\n * Avast brcmpgid parameter\n * @version 1.0.0\n * @author Jaroslav Slaby \n * @module avast.web.brcmpgid\n * @requires avast.url.unserialize\n * @requires avast.web.linkDecorator\n * @copyright Avast Software s.r.o ©2021\n */\n\n(function() {\n\t'use strict';\n\n\t\tvar unserialize = avm.require('avast.url.unserialize'),\n\t\t\tlinkDecorator = avm.require('avast.web.linkDecorator'),\n\t\t\tqs = unserialize(),\n\t\t\tproductId = 'ASB',\n\t\t\tre = /^[a-z0-9]+$/i;\n\n\t\t\tif (qs && qs.brcmpgid && re.test(qs.brcmpgid) || qs && qs.pc && re.test(qs.pc)) {\n\n\t\t\t\tvar ASBLinks = document.querySelectorAll('[data-download-name*=\"' + productId + '\"]')\n\n\t\t\t\tfor (var i = 0; i < ASBLinks.length; i++) {\n\t\t\t\t\tif ('URLSearchParams' in window) {\n\t\t\t\t\t\tvar el = ASBLinks[i],\n\t\t\t\t\t\t\tdownloadURL,\n\t\t\t\t\t\t\tdownloadQueryString;\n\n\t\t\t\t\t\tif(!/ANDROID|IOS/.test(el.getAttribute('data-download-name'))) {\n\t\t\t\t\t\t\tif (el.href) {\n\t\t\t\t\t\t\t\tdownloadURL = new URL(el.href);\n\t\t\t\t\t\t\t\tdownloadQueryString = new URLSearchParams(downloadURL.search);\n\n\t\t\t\t\t\t\t\tdownloadQueryString.set('product', el.getAttribute('data-download-name') + '-CID');\n\n\t\t\t\t\t\t\t\tif (qs.brcmpgid !== undefined) {\n\t\t\t\t\t\t\t\t\tdownloadQueryString.set('tag', qs.brcmpgid);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (qs.pc !== undefined) {\n\t\t\t\t\t\t\t\tdownloadQueryString.set('pc', qs.pc);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdownloadURL.search = downloadQueryString.toString();\n\t\t\t\t\t\t\t\tel.href = downloadURL.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// IE fallback\n\t\t\t\t\t\tvar el = ASBLinks[i],\n\t\t\t\t\t\thref,\n\t\t\t\t\t\tdownloadQueryString;\n\n\t\t\t\t\t\tif(!/ANDROID|IOS/.test(el.getAttribute('data-download-name'))) {\n\t\t\t\t\t\t\tdownloadQueryString = el.search;\n\t\t\t\t\t\t\thref = el.href.replace(downloadQueryString, '');\n\n\t\t\t\t\t\t\tel.href = href + downloadQueryString.replace('=' + el.getAttribute('data-download-name') + '&', '=' + el.getAttribute('data-download-name') + '-CID&');\n\n\t\t\t\t\t\t\tlinkDecorator(el, 'tag', 'tag=null', qs.brcmpgid);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\treturn;\n\n})();\n\n/**\n * Decorate Buy Links with Campaign Marker if Present in URL\n * @version 1.0.0\n * @author Fedor Kušš \n * @module avast.web.mobileTracking\n * @requires jquery\n * @requires avast.storage.cookieStorage\n * @requires avast.url.unserialize\n */\n\navm.define('avast.web.campaignMarkerDecorator', $(document).ready(function() {\n\t'use strict';\n\tvar cookieStorage = avm.require('avast.storage.cookieStorage'),\n\t\t$cartLink = $('.bi-cart-link'),\n\t\tunserializedUrl = avm.require('avast.url.unserialize')(window.location.href),\n\t\tcmpgMarker = unserializedUrl.campaignMarker,\n\t\tCMPGNMARKER = 'campaignMarker',\n\n\t\tgetExpirationTime = function(minutes) {\n\t\t\tvar now = new Date();\n\t\t\tnow.setTime(now.getTime() + minutes * 60 * 1000);\n\t\t\treturn now.toUTCString();\n\t\t};\n\n\tif (cmpgMarker && cmpgMarker.length > 0) {\n\t\tcookieStorage.setItem('campaignMarker', cmpgMarker, getExpirationTime(30), '/', location.hostname, false);\n\t}\n\n\t$cartLink.on('click', function() {\n\t\tif (cookieStorage.getItem('campaignMarker') && cookieStorage.getItem('campaignMarker').length > 0)\t{\n\n\t\t\tvar link = $(this).attr('href'),\n\t\t\t\tisCampaignMarker = link.indexOf(CMPGNMARKER),\n\t\t\t\tupdatedLink = [],\n\t\t\t\tcampainMarker = cookieStorage.getItem(CMPGNMARKER);\n\n\t\t\t// if cartlink parameters in query param (avast)\n\t\t\t// else cartlink parameters in link (avast,avg)\n\t\t\tif (link.indexOf('?') >= 0) {\n\t\t\t\tvar linkVariables1 = link.split('&');\n\n\t\t\t\tlinkVariables1.forEach(function(item) {\n\t\t\t\t\tvar params = item.split('=');\n\t\t\t\t\tif (params[0] === 'CampaignMarker') {\n\t\t\t\t\t\tupdatedLink.push(params[0] + '=' + params[1] + '-' + campainMarker);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdatedLink.push(item);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(this).attr('href', updatedLink.join('&'));\n\t\t\t} else {\n\t\t\t\tvar linkVariables = link.split('/');\n\n\t\t\t\tlinkVariables.forEach(function(item) {\n\t\t\t\t\tvar params = item.split('.');\n\n\t\t\t\t\tif (params[0] === CMPGNMARKER) {\n\t\t\t\t\t\tupdatedLink.push(params[0] + '.' + params[1] + '-' + campainMarker);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdatedLink.push(item);\n\t\t\t\t\t}\n\t\t\t\t\tif (params[0] === 'Currency' && isCampaignMarker === -1) {\n\t\t\t\t\t\tupdatedLink.push(CMPGNMARKER + '.' + campainMarker);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t$(this).attr('href', updatedLink.join('/'));\n\t\t\t}\n\t\t}\n\t});\n}));\n\n/**\n * Avast CampaignMarker (decorate cart links and update data attributes)\n * @version 0.0.5\n * @author Ales Gabriel, Jaroslav Slaby \n * @module avast.web.campaignMarkerCookie\n * @requires module:avast.storage.cookieStorage\n * @copyright Avast Software s.r.o ©2020\n */\n\navm.define('avast.web.campaignMarkerCookie', function() {\n\n\tvar cookieStorage = avm.require('avast.storage.cookieStorage');\n\n\tvar cm = {\n\t\tcookie: '__trSrc',\n\t\tSMBCookeValue: cookieStorage.getItem('__smbChannelSrc'),\n\t\tels: document.querySelectorAll('a[data-campaign-marker]'),\n\t\tgetCampaignMarkerCookie: function(cookie) {\n\t\t\tvar cookieName = cookie,\n\t\t\t\tcookieValue = cookieStorage.getItem(cookieName),\n\t\t\t\tresult;\n\n\t\t\tif (cookieValue && encodeURIComponent) {\n\t\t\t\tcookieValue = encodeURIComponent(cookieValue);\n\t\t\t\tresult = cookieValue;\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\treplaceCookieString: function(str, cookie) {\n\t\t\tvar re = /~trSrcCookieValue/;\n\n\t\t\treturn str.replace(re, '~' + cookie);\n\t\t},\n\t\tdecorateCartLink: function(data) {\n\t\t\tvar href,\n\t\t\t\tel = data.currentTarget,\n\t\t\t\tcookieValue = cm.getCampaignMarkerCookie(cm.cookie) || '';\n\n\t\t\tif (el) {\n\t\t\t\tel.href = cm.replaceCookieString(el.href, cookieValue);\n\n\t\t\t\thref = el.href;\n\t\t\t}\n\n\t\t\treturn href;\n\t\t},\n\t\tupdateDataAttr: function(data) {\n\t\t\tvar campaignMarker,\n\t\t\t\tel = data.currentTarget,\n\t\t\t\tcookieValue = cm.getCampaignMarkerCookie(cm.cookie) || '';\n\n\t\t\tif (el.dataset && el.dataset.campaignMarker) {\n\t\t\t\tel.dataset.campaignMarker = cm.replaceCookieString(el.dataset.campaignMarker, cookieValue);\n\n\t\t\t\tcampaignMarker = el.dataset.campaignMarker;\n\t\t\t}\n\n\t\t\treturn campaignMarker;\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t * @param {HTMLElement|NodeList} els List of elements\n\t\t */\n\n\t\tsetCampaignMarkerCookie: function(els) {\n\t\t\tvar nodeList = els || cm.els,\n\t\t\t\tnodes = els instanceof HTMLElement ? [els] : Array.prototype.slice.call(nodeList),\n\t\t\t\tcookieValue = cm.getCampaignMarkerCookie(cm.cookie),\n\t\t\t\tSMBCookeValue = cm.SMBCookeValue,\n\t\t\t\tSMBRegExp = /smbChannelSrcCookieValue-/,\n\t\t\t\tlinks = [];\n\n\t\t\tif (cookieValue) {\n\t\t\t\tnodes.forEach(function(el) {\n\t\t\t\t\tvar result = {\n\t\t\t\t\t\tel: el\n\t\t\t\t\t};\n\n\t\t\t\t\tresult.link = cm.decorateCartLink({\n\t\t\t\t\t\tcurrentTarget: el\n\t\t\t\t\t});\n\t\t\t\t\tresult.dataAttr = cm.updateDataAttr({\n\t\t\t\t\t\tcurrentTarget: el\n\t\t\t\t\t});\n\n\t\t\t\t\tlinks.push(result);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Register mousedown event.\n\t\t\t\t// FIXME: Move to scanner on DOM ready.\n\t\t\t\tnodes.forEach(function(el) {\n\t\t\t\t\tel.addEventListener('mousedown', cm.decorateCartLink);\n\t\t\t\t\tel.addEventListener('mousedown', cm.updateDataAttr);\n\t\t\t\t\tel.addEventListener('focus', cm.decorateCartLink);\n\t\t\t\t\tel.addEventListener('focus', cm.updateDataAttr);\n\n\t\t\t\t\tlinks.push({\n\t\t\t\t\t\tel: el,\n\t\t\t\t\t\tevt: 'mousedown',\n\t\t\t\t\t\tcallback: cm.decorateCartLink\n\t\t\t\t\t});\n\t\t\t\t\tlinks.push({\n\t\t\t\t\t\tel: el,\n\t\t\t\t\t\tevt: 'mousedown',\n\t\t\t\t\t\tcallback: cm.updateDataAttr\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tnodes.forEach(function(el) {\n\t\t\t\tif (el.href.match(SMBRegExp) || el.getAttribute('data-campaign-marker').match(SMBRegExp)) {\n\t\t\t\t\tif (cm.SMBCookeValue !== null) {\n\t\t\t\t\t\tvar cookieValue = cm.SMBCookeValue.slice(-1) === '-' ? cm.SMBCookeValue : cm.SMBCookeValue + '-';\n\t\t\t\t\t\tel.href = el.href.replace(SMBRegExp, cookieValue);\n\t\t\t\t\t\tel.dataset.campaignMarker = el.dataset.campaignMarker.replace(SMBRegExp, cookieValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.href = el.href.replace(SMBRegExp, '');\n\t\t\t\t\t\tel.dataset.campaignMarker = el.dataset.campaignMarker.replace(SMBRegExp, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn links;\n\t\t}\n\t};\n\n\treturn cm;\n\n});\n\n/**\n * Display Chrome Offer in non-chrome browsers\n * @version 1.2.0\n * @author Ales Gabriel \n * @module avast.web.chromeBanner\n * @requires jquery\n * @requires avast.detect\n * @requires avast.url.unserialize\n * @requires avast.web.tracker\n */\navm.define('avast.web.chromeBanner', (function () {\n\t'use strict';\n\n\tvar $ = avm.require('jquery');\n\tvar detect = avm.require('avast.detect')();\n\tvar urlParams = avm.require('avast.url.unserialize')();\n\tvar tracker = avm.require('avast.web.tracker');\n\n\t// Chrome banner\n\tvar chromeBanner = {\n\t\tinit: function(){\n\t\t\tvar hasBanner = $('#offer-chrome').length;\n\t\t\tvar isChrome = detect.browser.isChrome;\n\t\t\tvar product = (typeof urlParams.product === 'string') ? urlParams.product : '';\n\t\t\tvar isMsBuild = (product.indexOf('-ONLINE-MS') > -1) ? true : false;\n\t\t\tvar isAsb = /ASB/.test(product);\n\n\t\t\tif(hasBanner){\n\t\t\t\tif(!isChrome && !isMsBuild && !isAsb){\n\t\t\t\t\tthis.show();\n\t\t\t\t\t$('#offer-chrome').on('click', '.button', this.trackClick);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshow: function(e){\n\t\t\tvar url = document.location.href,\n\t\t\t\tpExt = url.match(/[?&]p_ext=([^&]*)/),\n\t\t\t\tpExtVal = pExt ? pExt[1].toLowerCase() : '';\n\n\t\t\tif (url.indexOf('?') > -1) {\n\t\t\t\turl = url.substr(0, url.indexOf(\"?\"));\n\t\t\t}\n\n\t\t\tif(pExtVal.indexOf('chrome') == -1 && !/secure-browser/.test(url)){\n\t\t\t\t$('#offer-chrome').show();\n\t\t\t\ttracker.track('chromeOffer.view', e);\n\t\t\t}\n\t\t},\n\t\ttrackClick: function(e){\n\t\t\ttracker.track('chromeOffer.click', e);\n\t\t}\n\t};\n\n\treturn chromeBanner;\n\n})());\n\n/**\n * Cookie Consent - perform cookie consent\n * @version 1.0.0\n * @author Michal Langhoffer\n * @requires jquery\n * @requires avast.storage.cookieStorage\n */\n\navm.define('avast.web.cookieConsent', function() {\n 'use strict';\n var $ = avm.require('jquery'),\n cookieStorage = avm.require('avast.storage.cookieStorage'),\n cookieName = 'consentAccepted',\n domainName = window.location.hostname.substring(3);\n\n $(document).ready(function() {\n var CookieBar = {},\n $footer = $('#footer'),\n footerInitialPadding = $footer.css('padding-bottom'),\n footerInitialMargin = $footer.css('margin-bottom'),\n mediaQuery = function () {\n var screen = (window.getComputedStyle) ? window.getComputedStyle(document.body, ':after').getPropertyValue('content') : '';\n return screen;\n },\n mobileScreen = (mediaQuery() === '\\'mobile\\'' || mediaQuery() === \"\\\"mobile\\\"\" || mediaQuery() === \"mobile\") ? true : false;\n\n CookieBar.cookieDom = $('.js-cookie-bar');\n CookieBar.cookieCloseDom = $('.js-cookie-bar .js-close');\n\n /**\n * @description Close the cookie-bar by removing it from the DOM, and saving this preference to the local storage\n */\n CookieBar.close = function() {\n var today = new Date(),\n expire = new Date();\n\n expire.setTime(today.getTime() + 3600000 * 24 * 14); // 14 days\n\n try {\n cookieStorage.setItem(cookieName, 'true', expire.toGMTString(), '/', domainName);\n dataLayer.push({\n 'event': 'cookie-bar-consent-granted'\n });\n } catch (error) {\n console.log('Unable to store preference in local storage, cookiebar will show upon next visit', error);\n\t\t\t}\n\n CookieBar.cookieDom.remove();\n\n if (mobileScreen) {\n $footer.css('padding-bottom', footerInitialPadding);\n } else {\n $footer.css('margin-bottom', footerInitialMargin);\n }\n };\n\n /**\n * @description Initialise the CookieBar component, by binding all the event handlers\n */\n CookieBar.initialise = function() {\n // Cookiebar will be visible either when the key doesn't exist (getItem returns null) or returns another value than \"true\"\n if (cookieStorage.getItem(cookieName) !== 'true') {\n CookieBar.cookieDom.addClass('visible');\n\n CookieBar.cookieDom.on('transitionend webkitTransitionEnd oTransitionEnd', function(event) {\n if (mobileScreen) {\n $footer.css('padding-bottom', CookieBar.cookieDom.height() + 'px');\n } else {\n $footer.css('margin-bottom', CookieBar.cookieDom.height() + 'px');\n }\n });\n dataLayer.push({\n 'event': 'cookie-bar-displayed'\n });\n CookieBar.cookieCloseDom.click(CookieBar.close);\n } else {\n CookieBar.cookieDom.remove();\n if (mobileScreen) {\n $footer.css('padding-bottom', footerInitialPadding);\n }\n }\n };\n\n CookieBar.initialise();\n });\n});\n\n/**\n * Avast Config Module\n * @version 0.13.0\n * @module avast.web.config\n * @author Ales Gabriel \n * @requires module:avast.detect\n * @requires module:jquery\n * @requires module:avast.web.appendPbld\n * @requires module:avast.web.aswparam\n * @requires module:avast.web.cj\n * @requires module:avast.web.couponCode\n * @requires module:avast.hadd\n * @requires module:avast.web.navigation\n * @requires module:avast.web.tabs\n * @requires module:avast.web.tabsAnchor\n * @requires module:avast.scroll.smoothScroll\n * @requires module:avast.web.setLanguage\n * @requires module:avast.web.chromeBanner\n * @requires module:avast.web.tracker\n * @requires module:avast.web.cookieConsent\n * @requires module:avast.web.footer\n * @requires module:avast.web.campaignMarkerCookie\n * @requires module:avast.web.linkScanner\n * @copyright AVAST Software s.r.o.\n */\n\navm.define('avast.web.config', (function() {\n\t'use strict';\n\n\tvar $ = avm.require('jquery');\n\n\t// Prevent log errors on browsers without console.\n\tif (!window.console) {\n\t\twindow.console = {\n\t\t\tlog: function() {}\n\t\t};\n\t}\n\n\t// Config environment\n\tvar config = {\n\t\toptions: {},\n\n\t\t/**\n\t\t * Basic setup - init modules + legacy\n\t\t */\n\t\tinit: function() {\n\t\t\tvar opts = window.avastGlobals ? window.avastGlobals.web || {} : {};\n\t\t\tvar legacy = this.legacySettings(opts);\n\t\t\tvar boot = this.boot;\n\n\t\t\t/**\n\t\t\t * Global namespace options\n\t\t\t */\n\t\t\tthis.options = opts;\n\n\t\t\t/*\n\t\t\t * Support former avast config settings in global namespace\n\t\t\t */\n\t\t\tthis.exportLegacy(legacy, window);\n\n\t\t\t/**\n\t\t\t * Global modules\n\t\t\t *\n\t\t\t * @description Boot global modules. First param of boot function is a module name.\n\t\t\t * Second is init function. Module is passed os parameter.\n\t\t\t */\n\n\t\t\t// Init legacy free modules\n\t\t\tavm.require('avast.web.tracker');\n\n\t\t\t/*\n\t\t\t *\n\t\t\t * !!! COMMENTS WITH avm.require STATEMENT BEFORE EACH boot ARE MANDATORY !!!\n\t\t\t * CORRECT ORDER DURING CONCAT IS NOT GUARANTED WITHOUT THAT.\n\t\t\t *\n\t\t\t */\n\n\t\t\t$(document).ready(function() {\n\t\t\t\tvar disabledModules = avastGlobals.disabledModules || [];\n\n\t\t\t\t// avm.require('avast.web.appendPbld') - Add p_bld param to cart links\n\t\t\t\tboot('avast.web.appendPbld', function(module) {\n\t\t\t\t\tif (!avast.disableAppendPbld) {\n\t\t\t\t\t\tmodule.init();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.aswparam') - Pack and add ASWPARAM to cart links\n\t\t\t\tboot('avast.web.aswparam', function(module) {\n\t\t\t\t\tif (!avast.disableAswparam) {\n\t\t\t\t\t\tmodule.init();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.cj') - Set CJ cookie\n\t\t\t\tboot('avast.web.cj', function(module) {\n\t\t\t\t\tif (!avast.disableCj) {\n\t\t\t\t\t\tmodule.init();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.couponCode') - Add couponcode param to cart links\n\t\t\t\tboot('avast.web.couponCode', function(module) {\n\t\t\t\t\tif (!avast.disableShowCouponCode) {\n\t\t\t\t\t\tmodule.init();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.hadd') - Add couponcode param to cart links\n\t\t\t\tboot('avast.hadd', function(module) {\n\t\t\t\t\tif (!avast.disableHadd) {\n\t\t\t\t\t\tvar hadd = module();\n\t\t\t\t\t\thadd.init();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.navigation') - Navigation\n\t\t\t\tboot('avast.web.navigation', function(module) {\n\t\t\t\t\tvar navSel = '.js-navigation-bootstrap';\n\t\t\t\t\tif (document.querySelector(navSel)) {\n\t\t\t\t\t\tmodule(navSel);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.tabs') - Tabs in v8 style. Not initialized if tabs in sticky bar.\n\t\t\t\tboot('avast.web.tabs', function(module) {\n\t\t\t\t\tif (!avast.disableTabs && $('#tabs-anchor').hasClass('tabs-nav')) {\n\t\t\t\t\t\tmodule.init('#content-holder', {\n\t\t\t\t\t\t\ttabs: '#tabs-anchor li'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.tabsAnchor') - Tabs in v8 style. Not initialized if tabs in sticky bar.\n\t\t\t\tboot('avast.web.tabsAnchor', function(module) {\n\t\t\t\t\tvar detect = avm.require('avast.detect')();\n\t\t\t\t\tvar ie6zh = detect.browser.isInternetExplorer && detect.browser.version === '6.0' && window.avastGlobals.web.locale === 'zh-cn' ? 1 : 0;\n\n\t\t\t\t\tif (!avast.disableTabsAnchor && !ie6zh) {\n\t\t\t\t\t\t// window.avast.tabsAnchor = window.avast.tabsAnchor || module;\n\t\t\t\t\t\tmodule.init('#tabs-anchor');\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.scroll.smoothScroll') - Animate scrolls\n\t\t\t\tboot('avast.scroll.smoothScroll', function(module) {\n\t\t\t\t\tif (!avast.disableSmoothScroll) {\n\t\t\t\t\t\tmodule();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.chromeBanner') - Chrome banner visibility and tracking\n\t\t\t\tboot('avast.web.chromeBanner', function(module) {\n\t\t\t\t\tmodule.init();\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.setLanguage') - Chrome banner visibility and tracking\n\t\t\t\tboot('avast.web.setLanguage', function(module) {\n\t\t\t\t\tif (!avast.disableSetLanguage) {\n\t\t\t\t\t\tmodule(opts.locale || '');\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.slider') - BxSlider wrapper\n\t\t\t\tboot('avast.web.slider', function(slider) {\n\t\t\t\t\tvar detect = avm.require('avast.detect')();\n\t\t\t\t\tvar ie6zh = detect.browser.isInternetExplorer && detect.browser.version === '6.0' && window.avastGlobals.web.locale === 'zh-cn' ? 1 : 0;\n\n\t\t\t\t\tif (avast.disableSlider) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Product slider\n\t\t\t\t\tif ($('#features .slider-slides').length > 0) {\n\t\t\t\t\t\tslider.init('v9', '#features .slider-slides', {\n\t\t\t\t\t\t\tpager: false\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// index slider (also used on business)\n\t\t\t\t\tif ($('#top .slider-slides').length > 0 && !ie6zh) {\n\t\t\t\t\t\tslider.init('v9hp', '#top .slider-slides', {\n\t\t\t\t\t\t\tpager: true,\n\t\t\t\t\t\t\tpagerSelector: '#top .control',\n\t\t\t\t\t\t\tbuildPager: function() {\n\t\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Rum log\n\t\t\t\t\t\trum.track('error', {\n\t\t\t\t\t\t\tmessage: 'Slider #top called'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extra sliders on /index + /online-backup + /grimefighter\n\t\t\t\t\tif ($('#results .slider-slides, #whybackup .slider-slides').length > 0) {\n\t\t\t\t\t\tvar context = $('#results, #whybackup');\n\t\t\t\t\t\tvar ppBx = $('#results .slider-slides, #whybackup .slider-slides').bxSlider({\n\t\t\t\t\t\t\tauto: false,\n\t\t\t\t\t\t\tpager: true,\n\t\t\t\t\t\t\tpagerSelector: '#results .control, #whybackup .control',\n\t\t\t\t\t\t\tinfiniteLoop: true,\n\t\t\t\t\t\t\tmoveSlides: 1,\n\t\t\t\t\t\t\tminSlides: 1,\n\t\t\t\t\t\t\tmaxSlides: 1,\n\t\t\t\t\t\t\tslideWidth: 900,\n\t\t\t\t\t\t\tslideMargin: 0,\n\t\t\t\t\t\t\tcontrols: false,\n\t\t\t\t\t\t\tnextSelector: '',\n\t\t\t\t\t\t\tprevSelector: '',\n\t\t\t\t\t\t\tuseCSS: false,\n\t\t\t\t\t\t\tonSliderLoad: function() {\n\t\t\t\t\t\t\t\t$('.bx-clone').css('visibility', 'visible');\n\t\t\t\t\t\t\t\t$('#results-slides').css('visibility', 'visible');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbuildPager: function(slideIndex) {\n\t\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcontext.find('.prev').click(function(e) {\n\t\t\t\t\t\t\tppBx.goToPrevSlide();\n\t\t\t\t\t\t\te.preventDefault(); // FIXME\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcontext.find('.next').click(function(e) {\n\t\t\t\t\t\t\tppBx.goToNextSlide();\n\t\t\t\t\t\t\te.preventDefault(); // FIXME\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Rum log\n\t\t\t\t\t\trum.track('error', {\n\t\t\t\t\t\t\tmessage: 'Slider #results#whybackup called'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Sliders on /business\n\t\t\t\t\tif ($('#results-business .slider-slides').length > 0) {\n\t\t\t\t\t\t// Rum log\n\t\t\t\t\t\trum.track('error', {\n\t\t\t\t\t\t\tmessage: 'Slider #results-business called'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.cookieConsent') - Cookie consent bar\n\t\t\t\tboot('avast.web.cookieConsent', function(module) {\n\t\t\t\t\tif (!avast.disableCookieConsent) {\n\t\t\t\t\t\tmodule();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.footer') - Footer scripts (langugage selector)\n\t\t\t\tboot('avast.web.footer', function(module) {\n\t\t\t\t\tmodule();\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.campaignMarkerCookie') - Cookie consent bar\n\t\t\t\tboot('avast.web.campaignMarkerCookie', function(module) {\n\t\t\t\t\tvar cm = module();\n\t\t\t\t\tcm.setCampaignMarkerCookie();\n\t\t\t\t});\n\n\t\t\t\t// avm.require('avast.web.linkScanner') - Scan and update cart/download links\n\t\t\t\tboot('avast.web.linkScanner', function(module) {\n\t\t\t\t\tvar scanner = module();\n\n\t\t\t\t\tif (avastGlobals.web.language === 'en') {\n\t\t\t\t\t\tscanner.init({\n\t\t\t\t\t\t\ttasks: ['downloadPopup'],\n\t\t\t\t\t\t\tselectors: ['[data-download-name^=\"FAV-\"]:not([data-behavior=\"downloadPage\"])']\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t/*\n\t\t\t\t * jQuery plugins\n\t\t\t\t */\n\n\t\t\t\t// Return to the top of the page button\n\t\t\t\tif (typeof $.fn.slideTop === 'function') {\n\t\t\t\t\t$('#content-holder').slideTop();\n\t\t\t\t}\n\t\t\t\t// Initialize tooltip plugin\n\t\t\t\tif (typeof $.fn.tooltip === 'function' &&\n\t\t\t\t\tnavigator.userAgent.indexOf('aclwebview') === -1 &&\n\t\t\t\t\tArray.prototype.indexOf &&\n\t\t\t\t\tdisabledModules.indexOf('tooltip') === -1 &&\n\t\t\t\t\tavastGlobals.web.contentGroup !== 'SMB') {\n\t\t\t\t\t$('#content-holder').tooltip();\n\t\t\t\t}\n\n\t\t\t\t// Set class for comparison table cell with tick\n\t\t\t\tif ($('#comparison').length > 0) {\n\t\t\t\t\t$('#comparison table tr.feature span.yes').closest('td').addClass('cell-tick');\n\t\t\t\t}\n\t\t\t\tif ($('#compare-table').length > 0) {\n\t\t\t\t\t$('#compare-table table tr.feature span.yes').closest('td').addClass('cell-tick');\n\t\t\t\t}\n\t\t\t\tif ($('#compare').length > 0) {\n\t\t\t\t\t$('#compare table tr.feature span.yes').closest('td').addClass('cell-tick');\n\t\t\t\t}\n\n\t\t\t\t// FIX height in IE\n\t\t\t\tvar detect = avm.require('avast.detect')();\n\n\t\t\t\tif (detect.browser.isInternetExplorer) {\n\t\t\t\t\tvar topHeight = $('#top.fullscreen .AVsizer .absolute-center').height();\n\n\t\t\t\t\tif (topHeight) {\n\t\t\t\t\t\t$('#top.fullscreen .AVsizer').css({\n\t\t\t\t\t\t\tminHeight: topHeight + 25 + 'px'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Invoke global modules\n\t\t * @param {string} moduleName Module name\n\t\t * @param {Function} fn Init function\n\t\t * @returns {*} Module instance. Object is prefered\n\t\t */\n\t\tboot: function(moduleName, fn) {\n\t\t\tvar config = this;\n\t\t\tvar req = avm.require;\n\t\t\tvar module = moduleName ? req(moduleName, false) : null;\n\n\t\t\ttry {\n\t\t\t\tfn.call(config, module);\n\t\t\t} catch (e) {\n\t\t\t\t// console.log(moduleName + ': ' + e); // Send custom RUM event here?\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\treturn module;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * legacySettings Config settings in global namespace\n\t\t * @param {Object} opts Settings options\n\t\t * @returns {Object} Object equals former global namespace settings\n\t\t */\n\t\tlegacySettings: function(opts) {\n\t\t\tvar detect = avm.require('avast.detect')();\n\n\t\t\tif (opts) {\n\t\t\t\treturn {\n\t\t\t\t\tlocale: opts.locale,\n\t\t\t\t\tRootPath: opts.RootPath,\n\t\t\t\t\tavast: {\n\t\t\t\t\t\tlocale: opts.locale,\n\t\t\t\t\t\tnumberDecimalSeparator: opts.numberDecimalSeparator,\n\t\t\t\t\t\tnumberThousandSeparator: opts.numberThousandSeparator,\n\t\t\t\t\t\tresponsive: opts.responsive,\n\t\t\t\t\t\trootPath: opts.RootPath,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tlocale: opts.locale,\n\t\t\t\t\t\t\trootPath: opts.RootPath\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetOS: function() {\n\t\t\t\t\t\t\treturn detect.os.name;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetWinVersion: function() {\n\t\t\t\t\t\t\treturn detect.os.version;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttabsAnchor: (function() {\n\t\t\t\t\t\t\treturn avm.require('avast.web.tabsAnchor');\n\t\t\t\t\t\t})(),\n\t\t\t\t\t\tslider: (function() {\n\t\t\t\t\t\t\treturn avm.require('avast.web.slider');\n\t\t\t\t\t\t})(),\n\t\t\t\t\t\thadd: (function() {\n\t\t\t\t\t\t\treturn avm.require('avast.hadd')();\n\t\t\t\t\t\t})()\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Extend global namespace with avast variables\n\t\t * @param {Object} src Object to be merged\n\t\t * @param {Object} target Object to be extended\n\t\t * @returns {string} Not merged variables\n\t\t */\n\t\texportLegacy: function(src, target) {\n\t\t\tvar skipped;\n\n\t\t\tfor (var key in src) {\n\t\t\t\tif (Object.prototype.toString.call(src[key]) !== '[object Object]' && src[key] !== null) {\n\t\t\t\t\tif (!(key in target)) {\n\t\t\t\t\t\ttarget[key] = src[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tskipped = !skipped ? key : skipped + ', ' + key;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttarget[key] = target[key] || {};\n\t\t\t\t\tthis.exportLegacy(src[key], target[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// todo: log skipped\n\t\t\t// console.log('settings: %o', target);\n\t\t\treturn target;\n\t\t},\n\n\t\t/**\n\t\t * Get current config options\n\t\t * @return {Object} Config options\n\t\t */\n\t\tgetConfig: function() {\n\t\t\treturn this.options;\n\t\t}\n\t};\n\n\t// Run config\n\tconfig.init();\n\n\treturn config;\n})());\n"]}