{"version":3,"sources":["src/js/modules/filter-bar.js","src/js/modules/tyreselector-4.js","src/js/modules/tyreselector-4-license.js","src/js/modules/tyreselector-4-model.js","src/js/modules/tyreselector-4-size.js","src/js/modules/tyreselector-4-bundle.js"],"names":["filterBar","filterBarEl","$","language","document","body","data","filterBarUpdatedFor","updateFilterBar","formName","this","form","length","results","find","tsViewId","parents","attr","newResultsEl","sizesData","each","i","result","input","sizeString","val","selected","is","disabled","defaultSize","splitted","split","width","height","rim","path","window","tsSettings","targetUrl","_data","size","push","sizesDataByRim","lastSize","groupedSizesArr","s","sizesHtml","Mustache","render","filter_bar_sizes_template","sizesByRim","html","show","select2","minimumResultsForSearch","Infinity","init","console","log","on","e","value","location","href","cookieObj","preventDefault","setTyreCookie","tyreselector","tsEl","toggleTsViews","self","tsViews","toggler","closeStr","openStr","doClosing","storeState","closeSearchOnLoad","hide","toggleClass","tsViewsState","hasClass","slideToggle","notEditorInit","tsViewNavItems","itemWidth","Math","floor","toFixed","hash","tsViewNavItem","css","initView","parseResults","target","substring","indexOf","fadeIn","storeSessionData","paramObj","key","prop","Object","prototype","hasOwnProperty","call","sessionStorage","setItem","JSON","stringify","getSessionData","returnDefaultSizeData","storage","session","warn","vehicle","getItem","parse","modifyTsSubmitButton","$button","addSecondaryAction","btnText","addClass","removeClass","nodeName","resetTyreSelectorForms","formNames","reseted","license","model","licenseForm","resetLicenseForm","modelForm","resetModelForm","refreshVehicleData","sizeForm","resetSizeForm","updateTsHeader","viewKey","headerText","version","productListHeading","filterHtml","filter","innerHTML","loc","tyreselector_slogan","headerHtml","wrapNodeName","wrapEl","append","attachEventListeners","option","id","productInfo","productName","select","formSubmitted","scrollToProducts","headerHeight","resultFilters","useEasing","easing","easeInOutQuad","scrollToPos","offset","top","animate","scrollTop","undefined","manufacturer","year","licenseText","licenseCountry","licenseObj","text","toUpperCase","country","firstNumberIndex","search","newString","slice","licenseInput","getLicenseResults","populateForm","stopPropagation","fadeOut","tsResultsError","errorHtml","parentEl","productList","el","before","remove","licenseKnown","vehicleKnown","modelKnown","sizeKnown","licenseSearchAvailable","licenseSearchInUse","defaultTsView","currentTsView","st","tsPos","redirectToResult","load_index","speed_rating","sizeParameterMatch","documentElement","filterGroup","filterGroupSlug","season","getSeason","filterGroups","productGroupFilters","byTyreSizeCategorySlug","tyresPage","sizeParameter","join","slug","currentFilterSlug","pgf","p","productPage","ref","fg","product_page","error","redirectionTarget","requestSizeParameter","getUrlParameter","separator","separators","values","w","h","r","name","replace","RegExp","exec","decodeURIComponent","geoSeason","getSizeData","tyreSizes","sizeData","localStorage","url","request","XMLHttpRequest","open","send","status","responseText","tyrePage","sizeLinks","loadIndex","speedRating","sizesEl","trs","sizeStr","Number","updateSizeList","getQueryStringParam","param","pair","params","tyreData","eventAction","dataLayer","dlObject","event","eventCategory","eventLabel","removeAttr","tyreselectorLicense","missingLicenseData","resultsContainer","resetSubmit","submitBtn","resetClear","visible","btn","not","slideDown","slideUp","resetForm","$form","reset","errorEl","resultsEl","storageKey","licenseResult","populateResults","ajax","jqXHR","textStatus","errorThrown","errorMsg","tyreselector_try_again_later","success","splitTyreInfoToValues","str","match","hr","hrLetters","splitter","parseInt","isNaN","ii","activateSize","contents","resultArray","atLeastOneIsAvailable","defaultIsAvailable","tyres","sorted","splittedKey","sourceObj","splittedProp","newResult","inputEl","widthEl","heightEl","rimEl","availableEl","defaultEl","available","keys","inputs","selectedSizeStr","matchedInput","eq","focus","countryCodeForStageLanguage","clearBtn","tyreselectorModel","drModes","unwantedParameters","missingModelData","dataUrl","initValues","countryId","driveRightCountryCode","countryCode","driveRightLangCode","selectValues","selectKeys","$select","x","j","manufVal","selects","noResults","initObj","tyreSelectorVersion","mode","getDataAndPopulate","selectChange","curSelect","index","region","cookie","resetBtn","serializeArray","_","kv","checkSubmitState","disableSelect","populateOnly","doNextSelect","resultsParamObj","extend","doResults","nextSelect","ei","populateSelect","loadingSelect","lang","cache","sort","a","b","psCallBack","sizesForVehicle","vehicleChosen","xhr","ajaxOptions","thrownError","tyreselector_please_choose_engine","tyreselector_no_size_data","resArr","txtCount","splice","selectEl","callback","optGroups","targetEl","htmlStr","selectedStr","textType","textStr","extraData","enableSelect","optIndex","selectName","mostCommonCtype","mostCommonCtypeCount","cTypes","cType","constuctionType","vehicleTypes","$select2","defaultSizeData","minLI","minSP","curLI","curSP","curSPindex","minSPindex","firstResult","LIs","SPs","speedRatings","Array","sortByRim","sizeLabels","defaultSizeLabels","sizeLabel","default","defaultSizeDataAppended","split1","split2","toString","defaultSizeCheck","li","selectedSizeIsFromQueryString","querySize","splittedVal","parsedStr","errorMessage","current","state","resetCookieValues","removeResults","caller","trigger","tyreselector_clear","getVehicleData","after","drCC","cookieData","drCountries","selectedCountry","resultArr","storeObj","localeCompare","len","itemKey","placeholder","curMenu","showAllEl","nowShowingAll","extraMenuItem","tyreselector_show_common_manufacturers","tyreselector_show_all_manufacturers","td_obj","local","tyreselectorSize","sortValues","initialKey","populateSelects","refreshResults","selectIndex","keyIndex","curKey","storedVal","selectedKeys","definedCount","nextKey","curVal","options","nothingSelected","readyToSubmit","submitEls","valid","valCheck","selectedKeysMatched","addOption","visibility"],"mappings":"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","file":"hashed/nt-tyreselector-v4.f122699a.chunk.js","sourcesContent":["'use strict';\n\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport 'select2';\n\n/**\n * filterBar\n * separate logic for filterBar event listener\n * also update-function tyreSelector can call to update filterBar based on results tyreSelector got\n */\n\nlet filterBar = {\n filterBarEl: $('#filter-bar:first'),\n language: $(document.body).data('language'),\n filterBarUpdatedFor: null,\n\n // Depends on tyreSelector results\n updateFilterBar: function(formName) {\n // This function\n // 1) updates the results-list inside .filter-bar. It creates new links () from radio-button-results inside license/model forms.\n // 2) builds a )\n\n // add change event for mobile select\n $(document).on('change', 'select[name=\"mobileTyreSize\"]', function(e) {\n const value = $(this).val();\n const option = $(this).find('option[value=\"' + value + '\"]');\n\n // store selected size\n\n let size = option && option.length ? option.attr('data-size') : '';\n if (size && value && window.cookieObj) {\n size = size.split(',');\n delete window.cookieObj.id;\n delete window.cookieObj.productInfo;\n delete window.cookieObj.productName;\n window.cookieObj.width = ~~size[0]; // convert to integer\n window.cookieObj.height = ~~size[1]; // convert to integer\n window.cookieObj.rim = ~~size[2]; // convert to integer\n window.setTyreCookie();\n }\n\n // move to new size\n if (value) document.location.href = value;\n else console.log('value missing !');\n });\n\n // add change event for radio buttons\n $(document).on('change', 'input[type=\"radio\"][name=\"tyreSize\"]', function(\n e\n ) {\n var form = $(this).parents('form'),\n value = $(this).val(),\n select = $(form).find('select[name=\"mobileTyreSize\"]'),\n selectValue = select.length ? $(select).val() : null;\n\n if (selectValue !== value) {\n $(select).val(value);\n // refresh select2 if it's in use;\n $(select).select2();\n }\n });\n\n // ------------------------------------------\n // FORM SUBMITS\n // ------------------------------------------\n\n $('#tyreselector_4 form').on('submit', function(e) {\n self.formSubmitted = true; // this is detected by redirectToResult function and it only redirects user if this is true.\n\n // We do not actually submit anything. This function only stores user's choises and\n // then user is either scrolled to results or moved to \"tyres\" page by JS\n e.preventDefault();\n\n var formName = $(this).attr('name');\n\n // check if we stay on current page or not\n var submitBtn = $(this).find('[type=\"submit\"]'),\n //closeSearch = submitBtn.hasClass('toggle'),\n scrollToProducts =\n submitBtn.hasClass('scrollPage') &&\n self.tsEl.hasClass('by-tyre-size'),\n headerHeight = $('header.header:first').height(),\n resultFilters = $('.resultFilters:first');\n\n // close ts search forms\n if (!resultFilters.length) {\n window.cookieObj.closeSearchOnLoad = true;\n }\n\n // scroll to results\n if (scrollToProducts && headerHeight && resultFilters.length) {\n // New feature: close search on next reload\n // Example: user clicks button -> gets scrolled to results (and search remains open) -> goes to tyre-page -> comes back: now search must be closed, since the size is chosen\n // This feature is accomplished by using a new flag \"closeSearchOnLoad\" in stored data that makes element closed on next reload.\n window.cookieObj.closeSearchOnLoad = true;\n\n window.setTyreCookie();\n\n var useEasing =\n $.easing && $.easing.easeInOutQuad ? 'easeInOutQuad' : 'swing',\n // Desktop: scroll to resultFilters. Mobile: leave space for fixed top bar.\n scrollToPos =\n $(window).width() < 992\n ? $('.resultFilters:first').offset().top - headerHeight\n : $('.resultFilters:first').offset().top;\n\n $('html, body').animate(\n {\n scrollTop: scrollToPos\n },\n 500,\n useEasing\n );\n } else {\n if (formName === 'licenseSearchForm') {\n // reset other forms\n if (window.cookieObj) {\n window.cookieObj.width = undefined;\n window.cookieObj.height = undefined;\n window.cookieObj.rim = undefined;\n if (window.cookieObj.manufacturer)\n delete window.cookieObj.manufacturer;\n if (window.cookieObj.year) delete window.cookieObj.year;\n if (window.cookieObj.model) delete window.cookieObj.model;\n if (window.cookieObj.vehicle) delete window.cookieObj.vehicle;\n if (window.cookieObj.id) delete window.cookieObj.id;\n if (window.cookieObj.productInfo)\n delete window.cookieObj.productInfo;\n if (window.cookieObj.productName)\n delete window.cookieObj.productName;\n }\n\n if (typeof self.resetTyreSelectorForms === 'function') {\n self.resetTyreSelectorForms(['modelSearchForm', 'sizeSearchForm']);\n }\n\n var licenseText = $(this)\n .find('[name=\"license\"]')\n .val(),\n licenseCountry = $(this)\n .find('[name=\"country\"]')\n .val();\n\n if (licenseText && typeof window.cookieObj !== 'undefined') {\n var licenseObj = {\n text: licenseText.toUpperCase(),\n country: licenseCountry\n };\n window.cookieObj.license = licenseObj;\n\n window.setTyreCookie();\n }\n\n // on Finnish site only: Check that the license has a dash character (-) between letters and numbers. If it's not there, add it.\n if (\n licenseCountry === 'FI' &&\n typeof window.cookieObj !== 'undefined' &&\n window.cookieObj.license &&\n window.cookieObj.license.text &&\n window.cookieObj.license.text.indexOf('-') === -1\n ) {\n // search first instance of number\n var firstNumberIndex = window.cookieObj.license.text.search(/\\d/);\n // there must be at least 1 letter before number, so this value must be bigger than zero\n if (firstNumberIndex > 0) {\n var newString =\n window.cookieObj.license.text.slice(0, firstNumberIndex) +\n '-' +\n window.cookieObj.license.text.slice(firstNumberIndex);\n window.cookieObj.license.text = newString;\n const licenseInput = $('input[name=license]:first');\n if (licenseInput.length) licenseInput.val(newString);\n\n window.setTyreCookie();\n }\n }\n\n if (licenseText && licenseCountry) {\n self.licenseForm.getLicenseResults(\n window.cookieObj.license.text,\n window.cookieObj.license.country\n );\n }\n } // licenseSearchForm\n\n if (formName === 'modelSearchForm') {\n // reset other forms\n if (window.cookieObj) {\n window.cookieObj.width = undefined;\n window.cookieObj.height = undefined;\n window.cookieObj.rim = undefined;\n if (window.cookieObj.license) delete window.cookieObj.license;\n if (window.cookieObj.id) delete window.cookieObj.id;\n if (window.cookieObj.productInfo)\n delete window.cookieObj.productInfo;\n if (window.cookieObj.productName)\n delete window.cookieObj.productName;\n }\n\n if (typeof self.resetTyreSelectorForms === 'function') {\n self.resetTyreSelectorForms([\n 'licenseSearchForm',\n 'sizeSearchForm'\n ]);\n }\n\n self.modelForm.populateForm();\n } // modelSearchForm\n\n if (formName === 'sizeSearchForm') {\n // reset other forms\n if (window.cookieObj) {\n if (window.cookieObj.license) delete window.cookieObj.license;\n if (window.cookieObj.manufacturer)\n delete window.cookieObj.manufacturer;\n if (window.cookieObj.year) delete window.cookieObj.year;\n if (window.cookieObj.model) delete window.cookieObj.model;\n if (window.cookieObj.vehicle) delete window.cookieObj.vehicle;\n if (window.cookieObj.id) delete window.cookieObj.id;\n if (window.cookieObj.productInfo)\n delete window.cookieObj.productInfo;\n if (window.cookieObj.productName)\n delete window.cookieObj.productName;\n }\n\n if (typeof self.resetTyreSelectorForms === 'function') {\n self.resetTyreSelectorForms([\n 'licenseSearchForm',\n 'modelSearchForm'\n ]);\n }\n } // sizeSearchForm\n } // else\n });\n\n $(document)\n .on('click', '#tyreselector_4 .select2-container--disabled', function(\n e\n ) {\n e.stopPropagation();\n // add a nice fadeout/fadein click effect for disabled select2 elements.\n $(this)\n .fadeOut(200)\n .fadeIn(200);\n return false;\n })\n .on('click', '.tyres-nav a', function(e) {\n // campaign-hero on tyres-page has anchor links. scroll nicely.\n e.preventDefault();\n var that = $(this),\n href = that.attr('href');\n\n if (href && href.indexOf('#') === 0 && $(href).length) {\n $('html, body').animate(\n {\n scrollTop:\n $(href).offset().top + ($(window).width() < 960 ? -48 : 0) // leave room for floating top bar when it's visible\n },\n 500,\n 'swing',\n function() {\n document.location.hash = href;\n }\n );\n }\n });\n }, // attachEventListeners()\n\n tsResultsError: function(errorHtml) {\n // this function hides/shows error message on top of result list, if chosen size is not available in current group\n var parentEl = $('.product-list-background:first'),\n productList = parentEl.find('main.product-list:first'),\n el = parentEl.find('.error');\n\n if (!parentEl.length) {\n console.warn('tsResultsError(): no parentEl found, exiting...');\n return false;\n }\n\n if (!el.length && errorHtml) {\n productList.before($(errorHtml));\n } else if (el.length && errorHtml) {\n el.remove();\n productList.before($(errorHtml));\n } else if (el.length) {\n el.remove();\n }\n }, // tsResultsError()\n\n // v3.1 this function changes ts-header\n parseResults: function(updateTsHeader) {\n var self = this;\n updateTsHeader = updateTsHeader === true ? true : false;\n\n // check what we know.\n var licenseKnown =\n window.cookieObj &&\n window.cookieObj.license &&\n window.cookieObj.license.data &&\n window.cookieObj.license.data.id\n ? true\n : false,\n vehicleKnown =\n window.cookieObj &&\n window.cookieObj.vehicle &&\n window.cookieObj.vehicle.value\n ? true\n : false,\n modelKnown =\n window.cookieObj &&\n window.cookieObj.model &&\n window.cookieObj.model.value\n ? true\n : false,\n sizeKnown =\n window.cookieObj &&\n window.cookieObj.width &&\n window.cookieObj.height &&\n window.cookieObj.rim\n ? true\n : false,\n licenseSearchAvailable =\n typeof window.licenseSearchInUse !== 'undefined'\n ? window.licenseSearchInUse\n : false,\n defaultTsView = licenseSearchAvailable\n ? '#filterLicense'\n : $(document.body).hasClass('language-ru_RU')\n ? '#filterSizes'\n : '#filterModels',\n currentTsView =\n window.cookieObj && window.cookieObj.tsViewNavItem\n ? window.cookieObj.tsViewNavItem\n : defaultTsView;\n // loadingClassTimer;\n\n if (\n window.cookieObj.tsViewNavItem === 'undefined' ||\n (!licenseSearchAvailable && currentTsView === '#filterLicense')\n ) {\n window.cookieObj.tsViewNavItem = defaultTsView;\n window.setTyreCookie();\n }\n\n // if user has searched, user is on top of page, and tsviews are visible, then user should be scrolled to tyreselector.\n if (\n window.cookieObj.tsViews &&\n window.cookieObj.tsViews !== 'hidden' &&\n (licenseKnown || vehicleKnown || modelKnown || sizeKnown)\n ) {\n $('#tyreselector_4').toggleClass('scrollToThis', true);\n }\n\n // if we've detected that user should be scrolled to tyreselector to view results. then do the scroll. Note that this should only be done in 'tyres' page where results are shown.\n if ($('#tyreselector_4').hasClass('scrollToThis')) {\n $('#tyreselector_4').toggleClass('scrollToThis', false);\n var st = $(document).scrollTop(),\n tsPos = $('#tyreselector_4').length\n ? $('#tyreselector_4').offset().top\n : 0;\n if (st === 0 && tsPos > 0)\n $('html, body').animate(\n { scrollTop: $('#tyreselector_4').offset().top - 48 },\n 500\n );\n }\n\n // choose which user data should be used\n if (licenseKnown && sizeKnown) {\n if (updateTsHeader) {\n self.updateTsHeader('vehicle');\n }\n self.redirectToResult(\n window.cookieObj.width,\n window.cookieObj.height,\n window.cookieObj.rim,\n null,\n null\n );\n }\n // vehicle known\n else if ((vehicleKnown || modelKnown) && sizeKnown) {\n if (updateTsHeader) {\n self.updateTsHeader('model');\n }\n self.redirectToResult(\n window.cookieObj.width,\n window.cookieObj.height,\n window.cookieObj.rim,\n null,\n null\n );\n }\n // Size known\n else if (sizeKnown) {\n self.filterBarUpdatedFor = 'size';\n if (updateTsHeader) {\n self.updateTsHeader('size');\n }\n self.redirectToResult(\n window.cookieObj.width,\n window.cookieObj.height,\n window.cookieObj.rim,\n null,\n null\n );\n }\n // fallback\n else {\n if (updateTsHeader) {\n self.updateTsHeader(); // without viewKey this changes view to default\n }\n // redirectToResult();\n }\n\n }, // parseResults()\n\n /**\n * redirectToResult\n * @description\n * This function needs to determine where to redirect the user:\n * 1) choose the correct filterGroup by season (geoIP season or site's active season)\n * 2) add the chosen tyresize to the query parameter \"s\".\n * end result should be something like this: /tyres/by-tyre-size/summer-tyres/205-55-16\n * finally, redirect user to that address.\n * @param {Number} width - tyre width in millimeters\n * @param {Number} height - tyre height (aspect ratio) in millimeters\n * @param {Number} rim - rim size in inches\n * @param {Number} load_index - load index value\n * @param {String} speed_rating - speed rating class\n * @returns {Boolean}\n */\n redirectToResult: function(width, height, rim, load_index, speed_rating) {\n const self = this;\n if (\n typeof width === 'undefined' ||\n !width ||\n typeof height === 'undefined' ||\n !height ||\n typeof rim === 'undefined' ||\n !rim\n ) {\n return false;\n }\n\n // if\n // 1) we are at the 'by-tyre-size' view and\n // 2) form was submitted\n // 3) submitted size matches with size in page's querystring\n // then just scroll to results\n const scrollToResults =\n self.formSubmitted &&\n self.tsEl.hasClass('by-tyre-size') &&\n self.sizeParameterMatch(~~width, ~~height, ~~rim);\n\n if (scrollToResults) {\n self.formSubmitted = false;\n $([document.documentElement, document.body]).animate(\n {\n scrollTop: $('main.product-list').offset().top\n },\n 500\n );\n }\n\n // this function gets triggered a lot. this seemed the quickest way to filter out all but the form submits.\n if (!self.formSubmitted) {\n return false;\n }\n self.formSubmitted = false;\n\n // set throbber on since we are redirecting!\n self.tsEl.toggleClass('loading', true);\n // set loading status also for filter-bar, if it's there\n $('.product-list-background .filter-bar').toggleClass('loading', true);\n\n const season = self.getSeason();\n const filterGroups = window.filterGroups;\n const productGroupFilters = window.productGroupFilters;\n const byTyreSizeCategorySlug = window.tsSettings\n ? window.tsSettings.byTyreSizeCategorySlug\n : false;\n const tyresPage = window.tsSettings ? window.tsSettings.tyresPage : false;\n\n let filterGroup,\n filterGroupSlug,\n sizeParameter = [width, height, rim].join('-');\n\n // choose what filtergroup to use in redirection\n // 1) if there's a filterGroup object in window, use it. user may have changed filterGroup.\n // 2) choose by current filtergroup.\n // 3) fallback to current season.\n if (window.filterGroup && window.filterGroup.slug) {\n // 1)\n filterGroup = window.filterGroup;\n filterGroupSlug = window.filterGroup.slug;\n } else {\n if (\n productGroupFilters &&\n window.tsSettings &&\n window.tsSettings.currentFilterSlug\n ) {\n let pgf = productGroupFilters.find(\n p => p.slug === window.tsSettings.currentFilterSlug\n );\n // 2) choose by current filtergroup.\n if (pgf && pgf.productPage && pgf.productPage.ref) {\n // pgf.productPage.ref = product page\n for (let fg of filterGroups) {\n if (fg.product_page === pgf.productPage.ref) {\n filterGroup = fg;\n filterGroupSlug = filterGroup.slug;\n break;\n }\n }\n }\n }\n if (!filterGroupSlug) {\n // 3) fallback to current season.\n for (let fg of filterGroups) {\n if (fg.id === season) {\n filterGroup = fg;\n filterGroupSlug = filterGroup.slug;\n break;\n }\n }\n }\n }\n\n if (!season || !filterGroup || !byTyreSizeCategorySlug /* !tyreSizes */) {\n console.error('Season or filterGroup or categorySlug missing. Exiting.');\n self.tsEl.toggleClass('loading', false);\n\n return false;\n }\n\n const redirectionTarget =\n tyresPage +\n byTyreSizeCategorySlug /* tyreSizes.productGroupSlug */ +\n '/' +\n filterGroupSlug +\n '/' +\n sizeParameter +\n '/';\n\n window.location.href = redirectionTarget;\n\n return true;\n }, // redirectToResult()\n\n /**\n * sizeParameterMatch\n * @description compares \"s\" query parameter's value with width, height and rim. deconstructs \"s\" parameter value to w, h and r values by splitting value by any of the found separators: '-','+','%20',' '\n * @param {Number} width Must be integer\n * @param {Number} height Must be integer\n * @param {Number} rim Must be integer\n * @returns {boolean} true if sizes matched\n */\n sizeParameterMatch: function(width, height, rim) {\n const self = this;\n\n // check if form submit must be changed to scoll to results\n const requestSizeParameter = self.getUrlParameter('s');\n\n // check if this page was requested with the same size as this function was called.\n // if so, then there's no need to redirect, only scroll to results.\n if (requestSizeParameter) {\n // parameter may contain multiple separators. Check'em all\n const separators = ['-', '+', '%20', ' '];\n let separator;\n\n // choose first found separator\n for (let i = 0; i < separators.length; i++) {\n if (requestSizeParameter.indexOf(separators[i]) > -1) {\n separator = separators[i];\n break;\n }\n }\n\n if (!separator) return false;\n\n const values = requestSizeParameter.split(separator),\n w = ~~values[0], // convert to integer with ~~\n h = ~~values[1], // convert to integer with ~~\n r = ~~values[2]; // convert to integer with ~~\n\n if (w === width && h === height && r === rim) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * getUrlParameter\n * @param {sting} name - parameter to fetch\n * @returns {string} parameter value if found, otherwise an empty string.\n */\n getUrlParameter: function(name) {\n name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\"); // eslint-disable-line\n var regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n var results = regex.exec(location.search);\n return results === null\n ? ''\n : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n },\n\n /**\n * Get current season\n * @description This method determines what season should be used with current user.\n * 1) Check if GeoIP rules have chosen the season, use it if available\n * 2) Use site's active season\n * @return {(string|boolean)} season - false if could not choose season, otherwise any of the filter group id's summer/winter/studded/non-studded...\n */\n getSeason: function() {\n let season = false;\n // first check if geo_season has selected a season for current user. This feature is in use @ US/CA sites.\n if (storage.session) {\n const geoSeason = sessionStorage.getItem('geo_season');\n if (geoSeason) season = geoSeason.split('_').join('-');\n }\n // if no geoSeason, then use site's active season. Tyreselector adds it to window.\n if (!season && window.season) season = window.season;\n\n if (!season) {\n // we should never end up here\n console.warn('Tyreselector could not choose season!');\n }\n\n return season;\n },\n\n /**\n * Get size data\n * @description This method fetches new filterGroups and their tyre sizes from sessionStorage or with ajax from /stage-ajax/product-sizes-by-filter-groups/\n * That data is stored to tyreselector.sizeData\n * @returns {(object|boolean)} false if failed to fetch size data.\n */\n getSizeData: function() {\n const self = this;\n\n let tyreSizes = self.sizeData || false;\n\n // do we have HTML5 storage support?\n if (!tyreSizes && storage.session) {\n tyreSizes =\n sessionStorage.getItem('tyreSizes') ||\n localStorage.getItem('tyreSizes');\n try {\n tyreSizes = JSON.parse(tyreSizes);\n } catch (e) {\n tyreSizes = false;\n console.warn('failed to parse tyreSizes');\n }\n }\n\n // get'em with a synchronous request\n if (!tyreSizes) {\n const url =\n '/stage-ajax/product-sizes-by-filter-groups/?stage-language=' +\n self.language;\n const request = new XMLHttpRequest();\n request.open('GET', url, false); // `false` makes the request synchronous. We must have this data before moving on.\n request.send(null);\n\n if (request.status === 200) {\n try {\n tyreSizes = JSON.parse(request.responseText);\n } catch (e) {\n tyreSizes = false;\n }\n }\n }\n\n // store'em for session\n if (storage.session && tyreSizes && !self.sizeData) {\n sessionStorage.setItem('tyreSizes', JSON.stringify(tyreSizes));\n }\n\n // store to tyreselector for quick access\n if (tyreSizes && !self.sizeData) {\n self.sizeData = tyreSizes;\n }\n\n return tyreSizes;\n },\n\n /* =============================\n TYRE PAGE (product page)\n ============================= */\n\n tyrePage: function() {\n var self = this;\n\n if (!window.cookieObj) {\n self.tsEl.hide();\n return false;\n }\n\n // check what we know.\n var licenseKnown =\n window.cookieObj &&\n window.cookieObj.license &&\n window.cookieObj.license.data &&\n window.cookieObj.license.data.id\n ? true\n : false,\n vehicleKnown =\n window.cookieObj &&\n window.cookieObj.vehicle &&\n window.cookieObj.vehicle.value\n ? true\n : false,\n modelKnown =\n window.cookieObj &&\n window.cookieObj.model &&\n window.cookieObj.model.value\n ? true\n : false,\n sizeKnown =\n window.cookieObj &&\n window.cookieObj.width &&\n window.cookieObj.height &&\n window.cookieObj.rim\n ? true\n : false,\n licenseSearchAvailable =\n typeof window.licenseSearchInUse !== 'undefined'\n ? window.licenseSearchInUse\n : false,\n defaultTsView = licenseSearchAvailable\n ? '#filterLicense'\n : $(document.body).hasClass('language-ru_RU')\n ? '#filterSizes'\n : '#filterModels',\n currentTsView =\n window.cookieObj && window.cookieObj.tsViewNavItem\n ? window.cookieObj.tsViewNavItem\n : defaultTsView;\n\n if (\n window.cookieObj.tsViewNavItem === 'undefined' ||\n (!licenseSearchAvailable && currentTsView === '#filterLicense')\n ) {\n window.cookieObj.tsViewNavItem = defaultTsView;\n\n window.setTyreCookie();\n }\n\n // update header\n if (licenseKnown && sizeKnown) {\n self.updateTsHeader('vehicle');\n }\n\n // vehicle known\n else if ((vehicleKnown || modelKnown) && sizeKnown) {\n self.updateTsHeader('model');\n }\n\n // Size known\n else if (sizeKnown) {\n self.updateTsHeader('size');\n }\n\n // fallback\n else {\n self.updateTsHeader(); // without viewKey this changes view to default\n }\n\n self.tsEl.find('form').on('reset', function(e) {\n //updateSizeList(); // without params this just resets size-view\n });\n\n var sizeLinks = $('ul.wsts-size-links:first').find('a');\n\n $(document).on('click', '.wsts-size-links a', function() {\n $('ul.wsts-size-links [data-rimfilter]').removeClass('ts-active');\n });\n\n function updateSizeList(width, height, rim, loadIndex, speedRating) {\n var sizesEl = $('.tyre-size-data:first'),\n trs = sizesEl.length ? $(sizesEl).find('tr.rim-row-item') : [];\n\n if (!width || !height || !rim) {\n $(sizeLinks).toggleClass('active', false);\n $(trs).hide();\n } else if (sizeKnown) {\n sizesEl.show();\n var sizeStr = width + ',' + height + ',' + rim;\n // open only matching sizes from table\n $(trs).each(function() {\n if ($(this).attr('data-size-values') === sizeStr)\n $(this).css('display', '');\n else $(this).hide();\n });\n // set link to active state\n $(sizeLinks).each(function() {\n if (Number($(this).attr('data-rimfilter')) === window.cookieObj.rim)\n $(this).toggleClass('ts-active', true);\n else $(this).toggleClass('ts-active', false);\n });\n }\n } // updateSizeList()\n\n if (sizeKnown) {\n updateSizeList(\n window.cookieObj.width,\n window.cookieObj.height,\n window.cookieObj.rim,\n window.cookieObj.load_index,\n window.cookieObj.speed_rating\n );\n }\n }, // tyrePage()\n\n /* =============================\n Get query string parameter\n ============================= */\n\n getQueryStringParam: function(param) {\n // this function returns requested query string parameter or an empty string\n\n if (typeof param === 'undefined' || !param || !window.location.search)\n return '';\n\n const qs = window.location.search.substring(1);\n const params = qs.split('&');\n let i = 0,\n pair;\n\n for (i = 0; i < params.length; i++) {\n pair = params[i].split('=');\n if (decodeURIComponent(pair[0]) === param) {\n return decodeURIComponent(pair[1]);\n }\n }\n\n return '';\n }, // getQueryStringParam()\n\n // =========================================\n // INIT FUNCTION\n // =========================================\n\n init: function() {\n console.log('TS4: tyreselector.init()');\n\n var self = this;\n\n // push tyreSearch event to dataLayer (GTM) IF we know user's tyre size. (onload)\n if (self.tsEl.length) {\n $(window).on('load', function() {\n let tyreData, sizeKnown;\n\n // do we have HTML5 storage support?\n if (storage.session) {\n tyreData =\n sessionStorage.getItem('tyreData') ||\n localStorage.getItem('tyreData');\n try {\n tyreData = JSON.parse(tyreData);\n sizeKnown =\n tyreData.width && tyreData.height && tyreData.rim ? true : false;\n } catch (e) {\n tyreData = null;\n }\n }\n\n if (tyreData && sizeKnown) {\n const eventActions = {\n '#filterLicense': 'License Search',\n '#filterModels': 'Model search',\n '#filterSizes': 'Size Search'\n },\n eventAction = tyreData.tsViewNavItem\n ? eventActions[tyreData.tsViewNavItem]\n : '';\n\n if (eventAction) {\n if (window.dataLayer) {\n const dlObject = {\n event: 'tyreSearch',\n eventCategory: 'Tyre Selector',\n eventAction: eventAction,\n eventLabel:\n tyreData.width + '/' + tyreData.height + 'R' + tyreData.rim\n };\n window.dataLayer.push(dlObject);\n } // window.dataLayer\n else console.warn('Tyreselector init: window.dataLayer missing');\n } else console.warn('Tyreselector init: eventAction missing');\n }\n }); // window.load\n } // add window.load\n\n // Enable submits. They will be disabled later if needed.\n if (self.tsEl.length) self.tsEl.find(':submit').removeAttr('disabled');\n\n // setup views\n self.toggleTsViews();\n\n // do extra if we're not @ editor mode\n if (self.tsEl.length && !self.tsEl.hasClass('editor')) self.notEditorInit();\n\n // attach event listeners\n self.attachEventListeners();\n\n filterBar.init();\n\n self.tsEl.show();\n\n // -----------------------------------------------------------------------\n // results | Tyres page\n // -----------------------------------------------------------------------\n\n if (self.tsEl.hasClass('tyres')) {\n self.parseResults(true);\n }\n\n /*\n ------------------------------------------\n TYRE page\n ------------------------------------------\n */\n\n if (self.tsEl.hasClass('tyre')) self.tyrePage();\n } // init()\n};\n\nexport default tyreselector;\n","'use strict';\n\nimport $ from 'jquery';\nimport storage from './storage';\nimport tyreselector from './tyreselector-4';\nimport filterBar from './filter-bar';\nimport 'select2';\n\nlet tyreselectorLicense = {\n\n form: $('form[name=\"licenseSearchForm\"]'),\n missingLicenseData: false,\n get submitBtn (){ return $(this.form).find('[type=\"submit\"]'); },\n get resultsContainer (){ return $(this.form).find('.licenseResults'); },\n get clonedResultsContainer () { return $('.filter-bar .sizes.license:first'); },\n get resultsEl (){ return $(this.resultsContainer).find('.results'); },\n get clearBtn (){ return $(this.form).find('.clearBtn'); },\n get errorEl (){ return $(this.form).find('.errorMessage:first'); },\n storage: ( storage.session ? sessionStorage : null),\n\n resetSubmit: function(){\n var self = this;\n if( !$(self.form).find('[name=\"license\"]').length ) return false;\n var value = $(self.form).find('[name=\"license\"]').val();\n if( !value || value.length <= 2 ) $(self.submitBtn).prop('disabled',true);\n else $(self.submitBtn).prop('disabled',false);\n\n if( $(self.form).find('[name=\"license\"]').val() ) self.resetClear(true);\n else self.resetClear(false);\n\n }, // resetSubmit()\n\n resetClear: function(visible){\n var self = this;\n var btn = $(self.form).find('.clearBtn:first');\n if( visible && $(btn).not(':visible') ) $(btn).slideDown('fast');\n else if( !visible && $(btn).is(':visible') ) $(btn).slideUp('fast');\n },\n\n resetForm: function(){\n var self = this;\n var $form = $(self.form);\n\n // Return if no license plate form\n if(!$form.length) {\n return;\n }\n\n $form[0].reset();\n self.resetSubmit();\n self.resetClear(false);\n self.missingLicenseData = false;\n $(self.errorEl).hide();\n\n // if we're on tyres page then set default action and text as well\n if( $(tyreselector.tsEl).hasClass('tyres') ){\n tyreselector.modifyTsSubmitButton($(self.submitBtn),false);\n }\n if( window.cookieObj && window.cookieObj.license ){\n delete window.cookieObj.license;\n if( window.cookieObj.id ) delete window.cookieObj.id;\n if( window.cookieObj.productInfo ) delete window.cookieObj.productInfo;\n if( window.cookieObj.productName ) delete window.cookieObj.productName;\n\n window.setTyreCookie();\n if( typeof tyreselector.parseResults !== 'undefined' ) tyreselector.parseResults(); // this updates header as well\n }\n $(self.resultsContainer).slideUp('fast',function(){\n self.resultsEl.html('').show();\n });\n },\n\n resetLicenseForm: function(){\n var self = this;\n self.resetForm();\n return true;\n },\n\n getLicenseResults: function(license,country){\n var self = this;\n if( typeof license === 'undefined' || !license || typeof country === 'undefined' || !country ) return false;\n var storageKey = 'license_' + ( window.cookieObj && window.cookieObj.license && window.cookieObj.license.country ? window.cookieObj.license.country + '_' : '' ) + license.replace(/\\W/g, '_');\n var licenseResult = null;\n\n // check if we have pre-fetched license results for current license\n if( self.storage ){\n licenseResult = sessionStorage.getItem(storageKey);\n if( licenseResult ){\n try{\n licenseResult = JSON.parse(licenseResult);\n if( typeof licenseResult.data !== 'undefined' ){\n window.cookieObj.license.data = licenseResult.data;\n\n window.setTyreCookie();\n }\n }\n catch(e){ licenseResult = null; }\n }\n }\n\n if( !licenseResult ){\n $(self.resultsContainer).toggleClass('loading',true);\n if( $(self.resultsContainer).not(':visible') ) $(self.resultsContainer).slideDown('fast');\n\n $.ajax({\n url: '/stage-ajax/searchLicense',\n data: {\n license: license,\n country: country\n },\n error: function(jqXHR, textStatus, errorThrown) {\n $(self.resultsContainer).toggleClass('loading',false);\n var errorMsg;\n errorMsg = errorThrown ? 'Error: ' + errorThrown + '. ' : 'Error. ';\n errorMsg += window.loc && window.loc.tyreselector_try_again_later ? window.loc.tyreselector_try_again_later : ' Please try again later. Sorry for the inconvenience.';\n self.populateResults( errorMsg );\n console.error(textStatus, errorThrown);\n },\n success: function(data){\n // do not store error strings, only object data\n if( self.storage && data && typeof data.data === 'object' ){\n self.storage.setItem(storageKey,JSON.stringify(data));\n }\n if( window.cookieObj && window.cookieObj.license && data && typeof data.data === 'object' ){\n window.cookieObj.license.data = data.data;\n\n window.setTyreCookie();\n }\n self.populateResults( data );\n }\n });\n }\n else self.populateResults( licenseResult );\n }, // getLicenseResults\n\n splitTyreInfoToValues: function(str){\n // this function takes a tyre info string and tries to extract width/height/rim infos into an object\n // examples of different tyre markings: http://www.tirerack.com/tires/tiretech/techpage.jsp?techid=46\n if( typeof str === 'undefined' || !str ) return null;\n if( (str.match(/\\//g) || []).length !== 1 ) return null; // only one '/' character\n\n var hr = str.indexOf('/')!==-1 ? str.split('/')[1] : null,\n hrLetters = hr ? hr.replace(/[0-9]/g,'') : null, // get all letters from hr string\n splitter = hrLetters ? hrLetters.substring(0,1) : 'R', // choose first letter to be the string splitting point\n w,\n h,\n r;\n\n w = parseInt(str.split('/')[0].replace(/\\D/g,'')); // remove all but numbers and convert to number\n h = parseInt(str.split('/')[1].split(splitter)[0]); // characters after '/' up to splitter character define height (tyre's aspect ratio)\n r = parseInt(str.split(splitter)[1].replace(/\\D/g,'')); // remove all but numbers and convert to number\n\n if( isNaN(w) || isNaN(h) || isNaN(r) ) return null;\n\n return {'str': str,'width': w,'height': h,'rim': r};\n }, // splitTyreInfoToValues()\n\n populateResults: function(data){\n\n // populate results from license search\n var self = this;\n self.missingLicenseData = false;\n\n var i,\n ii;\n\n function activateSize(input){\n $(input).attr('checked','checked').parents('.result').toggleClass('active',true);\n // store selection to cookie, if it has none\n if( window.cookieObj && window.cookieObj.tsViewNavItem === '#filterLicense'/* (!window.cookieObj.width || !window.cookieObj.height || !window.cookieObj.rim ) */ ){\n var value = input.val(),\n splitted = value ? value.split(',') : false;\n\n if( value ) {\n /* remove other searches results by customer request */\n if( window.cookieObj.manufacturer ) delete window.cookieObj.manufacturer;\n if( window.cookieObj.year ) delete window.cookieObj.year;\n if( window.cookieObj.model ) delete window.cookieObj.model;\n if( window.cookieObj.vehicle ) delete window.cookieObj.vehicle;\n if( window.cookieObj.id ) delete window.cookieObj.id;\n if( window.cookieObj.productInfo ) delete window.cookieObj.productInfo;\n if( window.cookieObj.productName ) delete window.cookieObj.productName;\n\n window.cookieObj.width = ~~splitted[0];\n window.cookieObj.height = ~~splitted[1];\n window.cookieObj.rim = ~~splitted[2];\n\n window.setTyreCookie();\n if( typeof tyreselector.parseResults !== 'undefined' ) tyreselector.parseResults(); // this updates header as well\n\n input.parents('form').find('[type=\"submit\"]').each(function(){\n tyreselector.modifyTsSubmitButton($(this),true);\n });\n\n }\n }\n } // activateSize()\n\n // first check what kind of result should be shown.\n // hide results if no data\n if( !data ){\n if( $(self.resultsContainer).is(':visible') ){\n $(self.resultsContainer).hide();\n $(self.resultsContainer).toggleClass('loading',false);\n $(self.resultsEl).contents().remove();\n }\n // update results and mobile dropdown in .filter-bar\n filterBar.updateFilterBar('licenseSearchForm');\n\n }\n // driveright data is missing, show string containing message\n else if( typeof( data ) === 'string' ){\n if( $(self.resultsContainer).not(':visible') ) $(self.resultsContainer).slideDown('fast');\n $(self.resultsContainer).toggleClass('loading',false);\n $(self.resultsEl).contents().remove();\n $(self.resultsEl).append(''+data+'');\n\n $(self.errorEl).contents().remove();\n $(self.errorEl).append(data).show();\n self.missingLicenseData = true;\n\n // update results and mobile dropdown in .filter-bar\n filterBar.updateFilterBar('licenseSearchForm');\n\n if( $(self.resultsEl).not(':visible') ){\n $(self.resultsEl).show();\n }\n }\n else {\n\n if( $(self.resultsContainer).not(':visible') ) $(self.resultsContainer).slideDown('fast');\n $(self.resultsContainer).toggleClass('loading',false);\n\n // choosing by license should delete other search values and reset forms\n if( typeof tyreselector.resetTyreSelectorForms === 'function' ) tyreselector.resetTyreSelectorForms(['modelSearchForm','sizeSearchForm']);\n\n $(self.resultsEl).contents().remove();\n\n var resultArray = [],\n atLeastOneIsAvailable = false,\n defaultIsAvailable = false;\n\n // loop result tyres and push them to resultArray as compatible objects\n if( data && data.data && data.data.tyres ){\n // check if we have sorted keys. if so, use them to build resultArray\n if( data.data.sorted ){\n $(data.data.sorted).each(function(i,key){\n // split prop into an object with parsed values\n var splittedKey = self.splitTyreInfoToValues(key);\n if( splittedKey ){\n resultArray.push({value: key,text: [splittedKey.width,splittedKey.height,splittedKey.rim],'default': data.data.tyres[key]});\n } // splittedKey\n });\n }\n // no sorted keys available, use tyres as-is\n else {\n var sourceObj = data.data.tyres;\n for( var prop in sourceObj ){\n if( Object.prototype.hasOwnProperty.call(sourceObj, prop) ){\n // split prop into an object with parsed values\n var splittedProp = self.splitTyreInfoToValues(prop);\n if( splittedProp ){\n resultArray.push({value: prop,text: [splittedProp.width,splittedProp.height,splittedProp.rim],'default': sourceObj[prop]});\n } // splittedProp\n }\n }\n }\n }\n\n // loop thru results and create html elements\n for( i=0;i 2 && window.cookieObj.tsViewNavItem==='#filterLicense'){\n window.cookieObj.width = ~~splitted[0];\n window.cookieObj.height = ~~splitted[1];\n window.cookieObj.rim = ~~splitted[2];\n\n window.setTyreCookie();\n }\n }\n\n if( typeof tyreselector.parseResults !== 'undefined' ) tyreselector.parseResults(); // this updates header as well\n\n });\n\n // update header & results if we already have license\n if( typeof tyreselector.parseResults !== 'undefined' ) {\n tyreselector.parseResults(); // this updates header as well\n }\n\n self.resetSubmit();\n\n } // init()\n\n};\n\nexport default tyreselectorLicense;\n","'use strict';\n\nimport $ from 'jquery';\nimport storage from './storage';\nimport tyreselector from './tyreselector-4';\nimport filterBar from './filter-bar';\nimport 'select2';\n\nlet tyreselectorModel = {\n\n form: $('form[name=\"modelSearchForm\"]'),\n drModes: ['years', 'models', 'vehicles', 'tyres'], // note: \"manufacurers\" is _not_ on this list. It has it's own functions.\n unwantedParameters: ['tyreSize', 'mobileTyreSize'], // these form element names should not be added to ajax requests or cache keys.\n missingModelData: false,\n get selects() { return this.form.find('select'); },\n get submitBtn() { return $(this.form).find('button[type=\"submit\"]'); },\n get resultsContainer() { return $(this.form).find('.modelSizes:first'); }, // this also has the title element\n get clonedResultsContainer() { return $('.filter-bar .sizes.model:first'); },\n get resultsEl() { return $(this.form).find('.modelSizes:first').find('.results'); },\n get errorEl() { return $(this.form).find('.errorMessage:first'); },\n dataUrl: '/stage-ajax/driveRight',\n\n initValues: {\n countryId: window.driveRightCountryCode,\n countryCode: window.driveRightLangCode,\n selectValues: [],\n selectKeys: []\n },\n\n minimumResultsForSearch: function ($select) {\n return 3;\n },\n\n populateForm: function () {\n var self = this;\n var x, j;\n\n // check what values have been set\n self.initValues.selectValues = [];\n self.initValues.selectKeys = [];\n\n if (window.cookieObj && window.cookieObj.manufacturer && window.cookieObj.manufacturer.value) { self.initValues.selectValues.push(window.cookieObj.manufacturer.value); self.initValues.selectKeys.push('manufacturer'); }\n if (window.cookieObj && window.cookieObj.year && window.cookieObj.year.value) { self.initValues.selectValues.push(window.cookieObj.year.value); self.initValues.selectKeys.push('year'); }\n if (window.cookieObj && window.cookieObj.model && window.cookieObj.model.value) { self.initValues.selectValues.push(window.cookieObj.model.value); self.initValues.selectKeys.push('model'); }\n if (window.cookieObj && window.cookieObj.vehicle && window.cookieObj.vehicle.value) { self.initValues.selectValues.push(window.cookieObj.vehicle.value); self.initValues.selectKeys.push('vehicle'); }\n\n // if values were found, start populating selects and results\n for (x = 0; x < self.initValues.selectValues.length; x++) {\n\n // first select ('manufacturer') gets it's values straight from HTML, so we only have to select correct value for it here.\n // other selects are dynamically updated and they get their \"selected\" values during population\n if (x === 0 && window.cookieObj && window.cookieObj.manufacturer && window.cookieObj.manufacturer.value) {\n var manufVal = window.cookieObj.manufacturer.value;\n\n $(self.selects).eq(0).find('option[value=\"' + manufVal + '\"]:first').prop('selected', true);\n\n // refresh select2\n var $select = $(self.selects).eq(0);\n $select.eq(0).select2({\n minimumResultsForSearch: self.minimumResultsForSearch($(self.selects).eq(0)),\n language: {\n noResults: function() {\n return $select.data('no-results') || 'No results found';\n }\n }\n });\n }\n\n var populateOnly = true; // do not disable selects during population and do not modify cookie data.\n\n // selects are populated by using settings objects.\n var initObj = {\n countryId: self.initValues.countryId,\n countryCode: self.initValues.countryCode,\n tyreSelectorVersion: typeof window.tyreSelectorVersion !== 'undefined' ? window.tyreSelectorVersion : 3,\n mode: self.drModes[x]\n };\n\n for (j = 0; j <= x; j++) {\n initObj[self.initValues.selectKeys[j]] = self.initValues.selectValues[j];\n }\n // settings done, now populate selects\n self.getDataAndPopulate(x, initObj, populateOnly);\n }\n\n }, // populateForm\n\n selectChange: function (curSelect) {\n var self = this;\n var key = $(curSelect).attr('name'),\n value = $(curSelect).val(),\n text = $(curSelect).find('option[value=\"' + value + '\"]:first').text(),\n index = parseInt($(curSelect).attr('data-index')),\n paramObj = {\n countryId: window.driveRightCountryCode,\n /* NOTE: in ajax request 'countryCode' actually means language */\n countryCode: window.driveRightLangCode,\n tyreSelectorVersion: typeof window.tyreSelectorVersion !== 'undefined' ? window.tyreSelectorVersion : 3\n };\n\n // US/CA may use new parameter \"region\"\n if (self.initValues.region) paramObj.region = self.initValues.region;\n\n // override initial country value if user has changed manufacturer list to show all.\n if (document.cookie.indexOf('driveRightCountryCode=ALL') !== -1) {\n paramObj.countryId = 'ALL';\n }\n\n if (!value) {\n if (index === 0) {\n // disable reset btn;\n self.resetBtn(false);\n }\n\n if (window.cookieObj && window.cookieObj[key]) delete window.cookieObj[key];\n self.checkSubmitState();\n\n if (window.cookieObj.tsViewNavItem && window.cookieObj.tsViewNavItem === '#filterModels') {\n // Change stored values only be done if we're actually dealing with 'Models' form.\n // This selectChange() was triggered when form was reset and size form's values got overwritten.\n window.cookieObj.width = undefined;\n window.cookieObj.height = undefined;\n window.cookieObj.rim = undefined;\n\n window.setTyreCookie();\n }\n\n // disable next selects\n $(self.selects).each(function () {\n var thisIndex = parseInt($(this).attr('data-index'));\n if (thisIndex > index) {\n self.disableSelect($(this));\n }\n });\n\n // last dropdown, no value... repopulate form\n if (index === 3) {\n self.populateForm();\n }\n\n }\n // value set, get data\n else {\n // store value to cookie instantly;\n window.cookieObj[key] = {\n value: value,\n text: text\n };\n\n window.setTyreCookie();\n // enable reset btn;\n self.resetBtn(true);\n // set ajax parameters\n paramObj.mode = self.drModes[index];\n // add parameters by current form values.\n $.each($(self.form).serializeArray(), function (_, kv) {\n // only add parameters that are not yet defined and not found in the list of unwanted parameters.\n if (typeof (paramObj[kv.name]) === 'undefined' && self.unwantedParameters.indexOf(kv.name) === -1) {\n paramObj[kv.name] = kv.value;\n }\n });\n\n self.getDataAndPopulate(index, paramObj);\n\n } // else\n }, // selectChange\n\n getDataAndPopulate: function (index, paramObj, populateOnly) {\n\n var self = this;\n\n // by default, next select should be disabled. Only if we're populating selects after page refresh shoud they remain active\n if (typeof populateOnly === 'undefined') populateOnly = false;\n\n // ----------------------------------------------------------------------------------------------------------------\n // if it's the MODEL select, populate 'vehicles' select and then get ALL vehicles' tyres\n // ----------------------------------------------------------------------------------------------------------------\n if (index === 2) {\n // populate 'vehicles' dropdown\n doNextSelect(paramObj);\n // create new param object with different 'mode' setting to get results for all vehicles\n var resultsParamObj = $.extend(true, {}, paramObj);\n // modify params for tyre query\n resultsParamObj.mode = 'tyres';\n doResults(resultsParamObj);\n }\n // --------------------------------------------\n // if it's the last select POPULATE RESULTS\n // --------------------------------------------\n else if (index === 3) {\n doResults(paramObj);\n }\n // --------------------------------------------\n // enable + populate NEXT SELECT\n // --------------------------------------------\n else {\n doNextSelect(paramObj);\n } // else\n\n // ---------------------\n // do next select\n // ---------------------\n\n function doNextSelect(paramObj) {\n var nextSelect = $(self.selects).eq(index + 1);\n\n if (!populateOnly) {\n self.populateResults(); // without data this hides results;\n } // !populateOnly\n\n // disable all following selects, clear their cookie values\n $(self.selects).each(function (ei) {\n // if we're populating the first select, check it's value and enable/disable Clear-button accordingly.\n if ($(this).attr('id') === 'manufacturer' && $(this).val() !== '') {\n self.resetBtn(true);\n }\n else if ($(this).attr('id') === 'manufacturer' && $(this).val() === '') {\n self.resetBtn(false);\n self.resetForm();\n }\n\n if (parseInt($(this).attr('data-index')) > index) {\n self.disableSelect($(this));\n if (!populateOnly) {\n var key = $(this).attr('name');\n // delete previous choises from paramObj.\n delete paramObj[key];\n // delete previous choises from cookie\n delete window.cookieObj[key];\n\n window.setTyreCookie();\n }\n }\n });\n\n // check sessionstorage for pre-loaded data, if it's not prevented by request.\n var data = document.location.href.indexOf('flushCache') !== -1 ? false : tyreselector.getSessionData(paramObj);\n if (data) {\n self.populateSelect(nextSelect, data);\n }\n // if data was not found in sessionstorage, then get it with ajax\n else {\n // show throbber on next select\n self.loadingSelect(nextSelect, true);\n // add lang parameter into paramObj\n paramObj.lang = $('html').attr('lang');\n\n // load data\n $.ajax({\n url: self.dataUrl,\n cache: false,\n data: paramObj,\n success: function (data) {\n if (data === null) {\n self.populateSelect(nextSelect); // without data this just clears next select\n }\n else {\n // success with data\n if (index === 0) {\n // we're dealing with years. We want them descending. sort it out!\n var byYear = data.data;\n byYear.sort(function (a, b) {\n if (a.text < b.text) { return 1; }\n else { return -1; }\n });\n }\n // if we have sessionStorage support, let's store results there\n if (storage.session) {\n tyreselector.storeSessionData(data, paramObj);\n }\n // choose if select should be opened or not\n // do not open if we're only populating or next select is \"vehicle\";\n var psCallBack = populateOnly || $(nextSelect).attr('name') === 'vehicle' ? function () { } : function () { nextSelect.select2('open'); };\n self.populateSelect(nextSelect, data, psCallBack);\n }\n },\n error: function () {\n self.populateSelect(nextSelect); // without data this just clears next select\n } // error\n }); // ajax\n } // !data\n } // doNextSelect();\n\n // ------------------\n // do results\n // ------------------\n\n function doResults(paramObj) {\n\n var sizesForVehicle;\n\n function vehicleChosen(paramObj) {\n if (paramObj && paramObj.vehicle) return true;\n if (paramObj && !paramObj.vehicle) return false;\n else return (window.cookieObj && window.cookieObj.vehicle ? true : false);\n }\n\n // hide visible results if any\n $(self.resultsContainer).show('fast');\n $(self.submitBtn).prop('disabled', true);\n $(self.resultsEl).slideUp('fast');\n $('.modelSizes h2:first span.text span.extra').remove();\n\n // check sessionstorage for pre-loaded data, if it's not prevented by request.\n var data = document.location.href.indexOf('flushCache') !== -1 ? false : tyreselector.getSessionData(paramObj);\n\n if (data) {\n // do not parse model's tyresizes if user has chosen a vehicle\n if (!vehicleChosen(paramObj) && vehicleChosen()) {\n console.warn('skipping model\\'s sizes');\n }\n else {\n self.populateResults(data, null, paramObj);\n }\n }\n // if data was not found in sessionstorage, then get it with ajax\n else {\n $(self.resultsContainer).toggleClass('loading', true);\n // add lang parameter into paramObj\n paramObj.lang = $('html').attr('lang');\n\n $.ajax({\n url: self.dataUrl,\n cache: false,\n data: paramObj,\n error: function (xhr, ajaxOptions, thrownError) {\n // remove loading throbber\n $(self.resultsContainer).toggleClass('loading', false);\n\n // get localized error msgs if any\n var errorMsg;\n\n // If model request takes too long (over 20 sec), a Gateway Timeout (504) occours.\n // This seems to be common if model has not been previously requested and it has many engine options.\n // Each engine (vehicle) must be requested from DriveRight, and it takes plenty of time to finish with the results.\n // We do not want to scare users away with an error message, so let's just instruct them to continue by choosing an engine.\n // NOTE: only do this, if user has not yet chosen a vehicle.\n if (!vehicleChosen() && xhr && xhr.status && xhr.status === 504) {\n // try to get localized message...\n errorMsg = window.loc && window.loc.tyreselector_please_choose_engine ? window.loc.tyreselector_please_choose_engine : 'Please choose engine.';\n } // model search\n // more generic errors\n else {\n errorMsg = thrownError ? 'Error: ' + thrownError + '. ' : 'Error. ';\n errorMsg += window.loc && window.loc.tyreselector_try_again_later ? window.loc.tyreselector_try_again_later : ' Please try again later. Sorry for the inconvenience.';\n }\n\n sizesForVehicle = errorMsg ? '

' + errorMsg + '

' : '';\n self.populateResults(sizesForVehicle, null, paramObj);\n\n },\n success: function (data) {\n\n sizesForVehicle = data;\n\n // NO RESULTS AT ALL\n // replace result object with htmlsting containing text 'tyre sizes not available'\n if (sizesForVehicle === null || (typeof (sizesForVehicle) === 'object' && sizesForVehicle.data && sizesForVehicle.data.length === 0)) {\n // search document for pre-defined error html\n if (typeof window.noResults === 'function') sizesForVehicle = window.noResults();\n else sizesForVehicle = '

' + (window.loc && window.loc.tyreselector_no_size_data ? window.loc.tyreselector_no_size_data : 'No tyre size data available for this vehicle.') + '

';\n }\n\n // REMOVE INVALID RESULTS\n // Driveright can actually send this kind of result: \"145/R10\" (from: Austin/1978/Mini(1958-1993)/Cooper S(55kW))\n // We do not need such nonsense, so loop thru results and check if any of width/height/rim/loadIndex/speedRating info is missing, and remove that result.\n if (typeof (sizesForVehicle) === 'object' && typeof (sizesForVehicle.data) !== 'undefined' && sizesForVehicle.data.length) {\n var resArr = sizesForVehicle.data;\n var i,\n j;\n\n for (i = 0; i < resArr.length; i++) {\n var txtCount = typeof (resArr[i].text) !== 'undefined' ? resArr[i].text.length : 0;\n\n // check that we have correct number of values in array\n if (paramObj.mode === 'tyres' && txtCount !== 5) {\n resArr.splice(i, 1);\n }\n else {\n // loop thru texts, check that they have values.\n for (j = 0; j < txtCount; j++) {\n if (!resArr[i] || !resArr[i].text || !resArr[i].text[j]) {\n // value is missing, ditch this result!\n console.warn('ditching invalid ajax result. some of the required texts are missing:', resArr[i]);\n resArr.splice(i, 1);\n }\n }\n }\n } // end loop\n\n // No valid results left after removing invalid results:\n // replace result object with htmlsting containing text 'tyre sizes not available'\n if (!resArr.length) {\n // search document for pre-defined error html\n if (typeof window.noResults === 'function') sizesForVehicle = window.noResults();\n else sizesForVehicle = '

No tyre size data available for this vehicle.

';\n }\n else {\n // store valid results\n sizesForVehicle.data = resArr;\n }\n }\n\n // if we have sessionStorage support and valid data, let's store results\n if (storage.session && typeof sizesForVehicle !== 'string') {\n tyreselector.storeSessionData(sizesForVehicle, paramObj);\n }\n\n // If current request was for all model's tyresizes, and user has after that chosen a specific vehicle, then do not parse results.\n // This check is done to prevent a situation where model request populates results AFTER user has chosen a vechile: user gets wrong results.\n\n if (!vehicleChosen(paramObj) && vehicleChosen()) {\n void (0); // do nuthin\n }\n else {\n // new on tyreselector v3\n // populate results, sizesforVechicle contains data of default sizes, so no need for separate ajax query\n self.populateResults(sizesForVehicle, null, paramObj);\n }\n }\n }); // ajax\n }\n } // doResults();\n }, // getDataAndPopulate()\n\n populateSelect: function (selectEl, data, callback) {\n\n /*\n Check if selectEl contains optgroups. This is possible at least in 'manufacturers' selectEl on some sales regions.\n if no elements are not found, then targetEl is the selectEl, otherwise it's the 2nd optgroup.\n */\n var self = this;\n var optGroups = $(selectEl).find('optgroup'),\n targetEl = optGroups.length > 1 ? $(optGroups).eq(1) : $(selectEl);\n\n if (!data) {\n // remove old options if any\n $(selectEl).find('option').not(':first').remove();\n self.loadingSelect(selectEl, false);\n // enable select\n self.enableSelect(selectEl, true);\n // refresh select2 values\n var $select = $(selectEl);\n $select.select2({\n minimumResultsForSearch: self.minimumResultsForSearch($(selectEl)),\n language: {\n noResults: function() {\n return $select.data('no-results') || 'No results found';\n }\n }\n });\n }\n else {\n\n var htmlStr = '';\n if (typeof data === 'string') {\n try { data = JSON.parse(data); }\n catch (e) { return false; }\n }\n $(data.data).each(function (i) {\n var selectedStr = '';\n\n if (isNaN(parseInt(this.value))) {\n console.warn('populateSelect():data failed', this);\n return false;\n }\n\n if (typeof (window.cookieObj) !== 'undefined') {\n var key = $(selectEl).attr('name');\n // make it selected if value matches with value in cookie.\n if (window.cookieObj[key] && window.cookieObj[key].value && window.cookieObj[key].value === this.value) {\n selectedStr = 'selected=\"selected\" ';\n }\n }\n // \"text\" might be just a string or an array of info.\n // for example: on \"engine\" dropdown \"text\" is an array. It also contains info about vehicle type.\n // if such data exists, write it to ';\n });\n // remove old options if any\n if (targetEl.prop('tagName') === 'SELECT') {\n $(targetEl).find('option').not(':first').remove();\n }\n else {\n $(targetEl).find('option').remove();\n }\n // insert new options\n $(targetEl).append(htmlStr);\n // hide throbber\n self.loadingSelect(selectEl, false);\n // enable next select\n self.enableSelect(selectEl, true);\n\n // it's possible to have 2 selected values on \"manufacturers\", since there may be common manufacturers first.\n // in such case remove \"selected\" attribute from the 2nd selected option. Only the first matching option should be selected (the one in common manufacturers)\n $(selectEl).find(':selected').each(function (optIndex) {\n if (optIndex !== 0) $(this).prop('selected', false);\n });\n\n // NOTE:\n // ts3 needs to have constructionType value in \"models\" selection\n // if we are populating engines, add constructionType info to select and window.cookieObj\n\n var selectName = $(selectEl).attr('name');\n if (selectName && selectName === 'vehicle') {\n var cTypes = {};\n // loop vehicles, store count of constructionType occourences\n $(selectEl).find('option[data-extra]').each(function () {\n var cType = $(this).attr('data-extra');\n if (!cTypes[cType]) cTypes[cType] = 1;\n else cTypes[cType]++;\n });\n\n // What was the most common constructionType?\n var mostCommonCtype,\n mostCommonCtypeCount;\n for (var prop in cTypes) {\n if (!Object.prototype.hasOwnProperty.call(cTypes, prop)) continue;\n if (!mostCommonCtypeCount || cTypes[prop] > mostCommonCtypeCount) {\n mostCommonCtype = prop;\n mostCommonCtypeCount = cTypes[prop];\n }\n }\n\n // if we know the most common constructionType, store info\n if (window.cookieObj && window.cookieObj.model) {\n window.cookieObj.model.constuctionType = mostCommonCtype;\n\n if (window.vehicleTypes) {\n $(window.vehicleTypes).each(function () {\n if ($(this).prop('k') === mostCommonCtype) {\n window.cookieObj['model']['ntProdGroupPid'] = $(this).prop('v');\n }\n });\n }\n\n window.setTyreCookie();\n self.checkSubmitState();\n }\n }\n\n // refresh select2 if it's in use\n var $select2 = $(selectEl);\n $select2.select2({\n minimumResultsForSearch: self.minimumResultsForSearch($(selectEl)),\n language: {\n noResults: function() {\n return $select2.data('no-results') || 'No results found';\n }\n }\n });\n }\n\n if (typeof (callback) === 'function') {\n callback();\n }\n }, // populateSelect()\n\n populateResults: function (data, defaultSizeData, paramObj) {\n\n // populate results of model search\n var self = this;\n self.missingModelData = false;\n $(self.errorEl).contents().remove();\n $(self.errorEl).hide();\n\n function activateSize(input) {\n // things to do when activating a size\n // modify parent element's class\n $(input).attr('checked', 'checked').parents('.result').toggleClass('active', true);\n\n // store selection to cookie, if it has none\n if (window.cookieObj) { /* && (!window.cookieObj.width || !window.cookieObj.height || !window.cookieObj.rim ) */\n\n var value = input.val(),\n splitted = value ? value.split(',') : false;\n\n if (value && window.cookieObj.tsViewNavItem === '#filterModels') {\n\n /* remove license search results if any */\n if (window.cookieObj.license) delete window.cookieObj.license;\n\n window.cookieObj.width = ~~splitted[0];\n window.cookieObj.height = ~~splitted[1];\n window.cookieObj.rim = ~~splitted[2];\n\n window.setTyreCookie();\n if (typeof tyreselector.parseResults === 'function') tyreselector.parseResults('model.populateResults()');\n\n // on tyres page: change submit button's text and action\n input.parents('form').find('[type=\"submit\"]').each(function () {\n tyreselector.modifyTsSubmitButton($(this), true);\n });\n\n }\n }\n } // activateSize\n\n // first check what kind of result should be shown.\n // hide results if no data\n if (!data) {\n if ($(self.resultsContainer).is(':visible')) {\n $(self.resultsContainer).hide();\n self.checkSubmitState();\n }\n }\n // driveright data is missing, show string containing message\n else if (typeof (data) === 'string' || !data.data) {\n var errorMessage = '';\n if (typeof (data) === 'string') {\n errorMessage = data;\n } else {\n errorMessage = (window.loc && window.loc.tyreselector_no_size_data ? window.loc.tyreselector_no_size_data : 'No tyre size data available for this vehicle.');\n }\n $(self.errorEl).contents().remove();\n $(self.errorEl).append(errorMessage).show();\n self.missingModelData = true;\n\n $(self.resultsEl).contents().remove();\n self.checkSubmitState();\n $(self.resultsEl).append(errorMessage);\n if ($(self.resultsEl).not(':visible')) {\n $(self.resultsEl).show();\n }\n $(self.resultsContainer).toggleClass('loading', false);\n }\n else {\n if (typeof tyreselector.resetTyreSelectorForms === 'function') tyreselector.resetTyreSelectorForms(['licenseSearchForm', 'sizeSearchForm']);\n\n $(self.resultsEl).contents().remove();\n self.checkSubmitState();\n\n var resultArray = data.data,\n atLeastOneIsAvailable = false,\n defaultIsAvailable = false,\n firstResult = false,\n minLI, // lowest Load Index value of DR resultset\n minSP, // lowest Speed Range value of DR resultset\n curLI,\n curSP,\n curSPindex,\n minSPindex,\n LIs = [],\n SPs = [],\n i;\n\n // set loadIndex & speedRating settings to lowest found in DR resultset\n for (i = 0; i < resultArray.length; i++) {\n curLI = parseInt(resultArray[i].text[3]);\n curSP = resultArray[i].text[4];\n curSPindex = window.speedRatings.indexOf(curSP);\n\n // LOAD INDEX\n LIs.push(curLI);\n if (typeof (minLI) === 'undefined' || minLI > curLI) minLI = curLI;\n\n // SPEED RATING\n SPs.push(curSP);\n // set initial value if result was found in window.speedRatings\n if (curSPindex !== -1 && typeof (minSP) === 'undefined') {\n minSP = curSP;\n minSPindex = curSPindex;\n }\n // compare against current value\n else if (curSPindex !== -1 && curSPindex < minSPindex) {\n minSP = curSP;\n minSPindex = curSPindex;\n }\n } // end dr results loop\n\n // Sort resultArray by sort by RIM\n Array.prototype.sortByRim = function (p) {\n return this.sort(function (a, b) {\n return (a[p][2] > b[p][2]) ? 1 : (a[p][2] < b[p][2]) ? -1 : 0;\n });\n };\n resultArray.sortByRim('text');\n\n /* These days DriveRight returns also M+S tyres as separate sizes.\n sizeLabels array is used to strip duplicate sizes from results */\n var sizeLabels = [],\n defaultSizeLabels = [];\n\n // default size info may not be in defaultSizeData. It may be a part of resultArray.\n // if so, do initial result loop to find all sizes that are manufacturer defaults.\n if (!defaultSizeData) {\n for (i = 0; i < resultArray.length; i++) {\n (function () {\n var width = parseInt(resultArray[i].text[0]),\n height = parseInt(resultArray[i].text[1]),\n rim = parseInt(resultArray[i].text[2]),\n defaultSizeDataAppended = typeof resultArray[i].default !== 'undefined', // default size info _may_ be a part of size data\n sizeLabel = width + '/' + height + 'R' + rim;\n if (defaultSizeDataAppended && resultArray[i].default === true) defaultSizeLabels.push(sizeLabel);\n })();\n }\n }\n\n // Loop result array\n for (i = 0; i < resultArray.length; i++) {\n var newResult = $(window.newResult()),\n width = parseInt(resultArray[i].text[0]),\n height = parseInt(resultArray[i].text[1]),\n rim = parseInt(resultArray[i].text[2]),\n defaultSizeDataAppended = typeof resultArray[i].default !== 'undefined', // default size info _may_ be a part of size data\n sizeLabel = width + '/' + height + 'R' + rim,\n value = width + ',' + height + ',' + rim + ',' + minLI + ',' + minSP,\n inputEl = newResult.find('input'),\n widthEl = newResult.find('.width'),\n heightEl = newResult.find('.height'),\n rimEl = newResult.find('.rim'),\n availableEl = newResult.find('.availabilityTxt'),\n defaultEl = newResult.find('.defaultTxt'),\n defaultSizeCheck = function () {\n if (defaultSizeDataAppended) {\n if (defaultSizeLabels.length && defaultSizeLabels.indexOf(sizeLabel) !== -1) return true;\n else return resultArray[i].default;\n }\n else if (defaultSizeData) {\n var str = defaultSizeData.data[0].text,\n w = undefined,\n h = undefined,\n r = undefined;\n if (!str) { console.error('defaultSizeData is invalid:'); console.warn(defaultSizeData); console.warn(JSON.stringify(defaultSizeData)); return false; }\n // try to extract data from string\n if (str.indexOf('/') !== -1 && str.indexOf('R') !== -1) {\n var split1 = str.split('/'),\n split2 = split1[1].toString().split('R');\n w = parseInt(split1[0]);\n h = parseInt(split2[0]);\n r = parseInt(split2[1]);\n // finally if values match, it's factory default, jei!\n if (width === w && height === h && rim === r) return true;\n }\n }\n return false;\n },\n defaultSize = defaultSizeCheck(),\n available = false,\n keys = ['width', 'height', 'rim', 'li', 'sp'];\n\n // Store first size from result list to a varilable. This is needed for redirection in case there are no available sizes in results.\n if (!firstResult && width && height && rim) firstResult = [width, height, rim];\n\n // Check availability by comparing to sizeData\n for (var ii = 0; ii < window.sizeData.length; ii++) {\n if (window.sizeData[ii][keys.indexOf('width')] === width && window.sizeData[ii][keys.indexOf('height')] === height && window.sizeData[ii][keys.indexOf('rim')] === rim) {\n // size matches, do additional filtering:\n\n if (minLI && minSPindex && minSP) {\n\n // Is this tyre's Load Index value smaller than the lowest Load Index value in DriveRight's vehicle results?\n // If so, then this tyre is not allowed to the current vehicle. Do nothing.\n if (minLI > window.sizeData[ii].li) {\n console.warn('load index too low: ', window.sizeData[ii]);\n }\n // Is this tyre's Speed Rating value lower than the lowest Speed Rating value in DriveRight's vehicle results?\n // If so, then this tyre is not allowed to the current vehicle.\n else if (1 === 2 && window.season !== 'winter' && minSPindex > window.speedRatings.indexOf(window.sizeData[ii].sp)) {\n console.warn('speed rating too low: ', minSPindex, window.sizeData[ii]);\n }\n // otherwise make it available!\n else {\n available = true;\n atLeastOneIsAvailable = true;\n if (defaultSize) defaultIsAvailable = true;\n break;\n }\n }\n } // sizeMatch\n } // end availability loop\n\n // set values\n $(inputEl).val(value);\n $(widthEl).text(width);\n $(heightEl).text(height);\n $(rimEl).text(rim);\n\n if (!defaultSize) defaultEl.remove();\n else $(inputEl).attr('data-manufacturer-default', 'true');\n\n if (!available) {\n $(defaultEl).remove(); // no need to show it if the tyre is not available.\n $(newResult).toggleClass('notAvailable', true);\n $(inputEl).prop('disabled', true);\n }\n else {\n // it is available, so must remove text 'not available'\n $(availableEl).remove();\n }\n\n $(newResult).on('click', function (e) {\n if (!$(this).hasClass('notAvailable')) {\n $('.result').toggleClass('active', false);\n $(this).toggleClass('active', true);\n }\n });\n\n // finally, check if matching label has been appended already. Without this check M+S tyres may create duplicate results.\n if (sizeLabels.indexOf(sizeLabel) === -1) {\n sizeLabels.push(sizeLabel);\n $(self.resultsEl).append(newResult);\n }\n\n } // end result loop\n\n // set active size\n if (atLeastOneIsAvailable || defaultIsAvailable) {\n // get active radio inputs\n var inputs = $(self.form).find('input[type=\"radio\"]').not(':disabled');\n\n // choose the selected size.\n var selectedSizeStr = false,\n matchedInput = false,\n selectedSizeIsFromQueryString;\n\n const querySize = tyreselector.getUrlParameter('s');\n\n // if we are on tyres page and in 'by-tyre-size' view, then search for a match in querystring's \"s\" (size) parameter value\n if (querySize && tyreselector.tsEl.hasClass('by-tyre-size') && tyreselector.tsEl.hasClass('use-filter-groups')) {\n const separators = ['-', '+', '%20', ' '];\n let separator;\n\n // choose first found separator (in querystring) from separators.\n for (let i = 0; i < separators.length; i++) {\n if (querySize.indexOf(separators[i]) > -1) {\n separator = separators[i];\n break;\n }\n }\n\n if (separator) {\n const values = querySize.split(separator),\n w = ~~values[0], // convert to integer with ~~\n h = ~~values[1], // convert to integer with ~~\n r = ~~values[2]; // convert to integer with ~~\n\n selectedSizeStr = w + ',' + h + ',' + r;\n selectedSizeIsFromQueryString = true;\n }\n\n }\n // if window.cookieObj contains info about selected size, and that size happens to be available, select that size.\n else {\n selectedSizeStr = (window.cookieObj.width && window.cookieObj.height && window.cookieObj.rim) ? window.cookieObj.width + ',' + window.cookieObj.height + ',' + window.cookieObj.rim : false;\n }\n\n // check if any of the input sizes match the selectedSizeStr\n if (selectedSizeStr) {\n $(inputs).each(function () {\n var splittedVal = $(this).val().split(','),\n parsedStr = splittedVal.length > 2 ? splittedVal[0] + ',' + splittedVal[1] + ',' + splittedVal[2] : '';\n if ($(this).val() === selectedSizeStr) matchedInput = $(this);\n else if (selectedSizeStr === parsedStr) matchedInput = $(this);\n });\n }\n\n // Choose what size to activate\n //\n // we have selectedSizeStr and a matching size\n if (selectedSizeStr && matchedInput) {\n activateSize(matchedInput);\n }\n\n // \"by-tyre-size\" view, scene 1:\n // 1) There is a size in querysting, but no matching input found AND user has clicked the submit button\n // In this case we must choose a size.\n else if (selectedSizeIsFromQueryString && tyreselector.formSubmitted && !matchedInput) {\n // else if manufacturers default size is available, choose it.\n if (defaultIsAvailable) {\n activateSize($(inputs).filter('[data-manufacturer-default=\"true\"]:first'));\n }\n // at least, choose the first option\n else {\n activateSize($(inputs).eq(0));\n }\n }\n\n // \"by-tyre-size\" view, scene 2:\n // 2) there is no size matching querystring\n else if (selectedSizeIsFromQueryString) {\n // Do not select any size.\n // Now user must choose the size by clicking the size link or let tyreselector choose automatically by clicking submit button\n }\n\n // else if manufacturers default size is available, choose it.\n else if (defaultIsAvailable) {\n activateSize($(inputs).filter('[data-manufacturer-default=\"true\"]:first'));\n }\n // at least, choose the first option\n else {\n activateSize($(inputs).eq(0));\n }\n } // atLeastOneIsAvailable || defaultIsAvailable\n //\n // new tyreselector v3.1\n // no sizes available, choose first size from driveright results even if it's not available\n else if (firstResult && firstResult.length === 3) {\n\n if (window.cookieObj.tsViewNavItem === '#filterModels') {\n\n /* remove license search results if any */\n if (window.cookieObj.license) delete window.cookieObj.license;\n\n window.cookieObj.width = ~~firstResult[0];\n window.cookieObj.height = ~~firstResult[1];\n window.cookieObj.rim = ~~firstResult[2];\n\n window.setTyreCookie();\n if (typeof tyreselector.parseResults === 'function') tyreselector.parseResults('model.populateResults() 1011');\n\n }\n\n } // choose first size whatever\n\n if ($(self.resultsEl).not(':visible')) {\n $(self.resultsEl).slideDown('fast', function () {\n self.checkSubmitState();\n });\n }\n\n $(self.resultsContainer).toggleClass('loading', false);\n\n if (atLeastOneIsAvailable) {\n $(self.resultsEl).find('input:checked').focus();\n }\n\n // update results and mobile dropdown in .filter-bar\n filterBar.updateFilterBar('modelSearchForm');\n\n\n } // we have data\n }, // populateResults\n\n checkSubmitState: function () {\n var self = this;\n if ($(self.form).attr('name') === 'modelSearchForm' && window.cookieObj && window.cookieObj.model && !self.missingModelData) {\n $(self.submitBtn).prop('disabled', false);\n }\n else {\n $(self.submitBtn).prop('disabled', true);\n }\n },\n\n disableSelect: function (el, current) {\n\n if (!current) current = false;\n $(el).find('option').not(':first').remove();\n $(el).select2();\n $(el).prop('disabled', true);\n $(el).parents('label')\n .toggleClass('disabled', true)\n .toggleClass('active', false)\n .toggleClass('current', current);\n\n }, // disableSelect\n\n enableSelect: function (el, current) {\n if (!current) current = false;\n $(el).prop('disabled', false);\n $(el).parents('label')\n .toggleClass('disabled', false)\n .toggleClass('active', true)\n .toggleClass('current', current);\n\n }, // enableSelect()\n\n loadingSelect: function (el, state) {\n if (!state) state = false;\n el.parents('label').toggleClass('loading', state);\n }, // loadingSelect()\n\n resetModelForm: function (resetCookieValues, removeResults) {\n var self = this;\n if (typeof resetCookieValues === 'undefined') resetCookieValues = false;\n self.resetForm(resetCookieValues, removeResults, 'model.resetModelForm()');\n return true;\n },\n\n resetForm: function (resetCookieValues, removeResults, caller) {\n var self = this;\n\n if (resetCookieValues) {\n delete window.cookieObj.manufacturer;\n delete window.cookieObj.model;\n delete window.cookieObj.vehicle;\n delete window.cookieObj.year;\n if (window.cookieObj.id) delete window.cookieObj.id;\n if (window.cookieObj.productInfo) delete window.cookieObj.productInfo;\n if (window.cookieObj.productName) delete window.cookieObj.productName;\n\n window.setTyreCookie(); // write window.cookieObj to storage\n }\n\n if (removeResults) {\n $(self.resultsContainer).hide();\n $(self.resultsEl).html('');\n }\n\n $(self.selects).each(function () {\n $(this).parents('label').toggleClass('disabled', true);\n $(this).val('').trigger('change').prop('disabled', true);\n });\n\n self.resetBtn(false); // hide\n\n // reset submit button's default action and text\n tyreselector.modifyTsSubmitButton($(self.submitBtn), false);\n\n self.populateResults(); // without data this hides any visible results in search area\n if (typeof tyreselector.parseResults === 'function') tyreselector.parseResults('model.resetForm()'); // update product list and tyreselector header\n return true;\n },\n\n resetBtn: function (show) {\n var self = this;\n var clearBtn = $(self.form).find('.clearBtn');\n // insert button if it's not there yet\n if (!clearBtn.length) {\n clearBtn = $('
' + window.loc.tyreselector_clear + '');\n }\n\n clearBtn.on('click', function (e) {\n e.preventDefault();\n if (window.cookieObj) {\n window.cookieObj = {\n width: undefined,\n height: undefined,\n rim: undefined,\n tsViewNavItem: '#filterModels'\n };\n\n window.setTyreCookie();\n self.checkSubmitState();\n if (typeof tyreselector.parseResults === 'function') tyreselector.parseResults('model.resetBtn()');\n }\n if (typeof tyreselector.resetTyreSelectorForms === 'function') {\n tyreselector.resetTyreSelectorForms();\n }\n else {\n self.resetForm();\n }\n self.getVehicleData();\n });\n $(self.submitBtn).after(clearBtn);\n\n // if we only want to toggle visibility, then pass this\n if (typeof show !== 'undefined') {\n if (show && $(clearBtn).not(':visible')) { $(clearBtn).slideDown('fast');/*.toggleClass('active',true);*/ /*.fadeIn('fast');*/ }\n else if ($(clearBtn).is(':visible')) { $(clearBtn).slideUp('fast');/*.toggleClass('active',false);*/ /*.fadeOut('fast');*/ }\n }\n }, // resetBtn();\n\n getVehicleData: function () {\n // this function checks cookie for what set of manufacturers (if any) user has requested.\n // If data is available in sessionStorage, it it used. If not, an ajax call is made.\n var self = this;\n var drCC = false,\n data = false,\n paramObj = {},\n selectEl = $(self.selects).eq(0),\n i;\n\n // check if cookie contains info about what results to get\n if (document.cookie.indexOf('driveRightCountryCode') !== -1) {\n var cookieData = document.cookie.split('; ');\n for (i = 0; i < cookieData.length; i++) {\n if (cookieData[i].indexOf('driveRightCountryCode') === 0) {\n drCC = cookieData[i].toString().split('=')[1];\n }\n }\n }\n\n if (!drCC) {\n // if there was no data in cookie, then choose what manufacturer data to get : \"country specific\" list or \"all manufacturers\"\n // is current country available in driveRight countries?\n if (typeof (window.drCountries) !== 'undefined' && typeof (window.selectedCountry) !== 'undefined' && window.drCountries.indexOf(window.selectedCountry) !== -1) {\n drCC = window.selectedCountry;\n }\n else {\n drCC = 'ALL';\n }\n } // !drCC\n\n // now we have a valid code to load with\n // check if data is in sessionStorage\n paramObj = {\n countryId: drCC,\n /* NOTE: in ajax request \"countryCode\" means language */\n countryCode: typeof (window.driveRightLangCode) !== 'undefined' ? window.driveRightLangCode : 'en',\n mode: 'manufacturers',\n tyreSelectorVersion: typeof window.tyreSelectorVersion !== 'undefined' ? window.tyreSelectorVersion : 3\n };\n\n // check sessionstorage for pre-loaded data, if cache use is not prevented by request.\n data = document.location.href.indexOf('flushCache') !== -1 ? false : tyreselector.getSessionData(paramObj);\n if (data) {\n self.populateSelect(selectEl, data);\n }\n // if data was not found in sessionstorage, then get it with ajax\n else {\n // show throbber on next select\n self.loadingSelect(selectEl, true);\n // add lang parameter into paramObj\n paramObj.lang = $('html').attr('lang');\n\n // load data\n $.ajax({\n url: self.dataUrl,\n cache: false,\n data: paramObj,\n success: function (data) {\n // remove data from object for alphabetical sorting\n var resultArr = data.data,\n storeObj = {};\n\n // manufacturers need to be sorted alphabetically. sort'em!\n resultArr.sort(function (a, b) {\n if (!a || !b || typeof (a.text) === 'undefined' || typeof (b.text) === 'undefined') {\n console.warn('sorting failed!', a, b, paramObj);\n return 0;\n }\n return a.text.localeCompare(b.text);\n });\n // remove dem pesky motorcyclez\n var len = resultArr.length;\n while (len--) {\n var itemKey = parseInt(resultArr[len].value);\n if (!isNaN(itemKey) && (itemKey > 4047 && itemKey < 4088)) {\n resultArr.splice(len, 1);\n }\n }\n storeObj.data = resultArr;\n\n // store to browser sessionData\n tyreselector.storeSessionData(storeObj, paramObj);\n\n // populate select + trigger change\n self.populateSelect(selectEl, storeObj, function () {\n self.selectChange(selectEl);\n });\n\n },\n error: function (jqXHR, textStatus, errorThrown) {\n console.error(jqXHR);\n console.error('Error ' + jqXHR.status + ': ' + errorThrown + '\\nFailed to get manufacturer data. Resetting.');\n document.cookie = 'driveRightCountryCode=ALL';\n window.driveRightCountryCode = 'ALL';\n self.resetForm();\n self.getVehicleData();\n }\n\n\n }); // ajax\n } // !data\n\n }, // getNewVehicleData\n\n refreshVehicleData: function () {\n this.getVehicleData();\n },\n\n init: function () {\n console.log('TS4 : tyreselectorModel.init()');\n\n var self = this;\n\n tyreselector.modelForm = self;\n\n $(self.selects).each(function (index) {\n var $select = $(this);\n var placeholder = $(this).find('option:first').text();\n $(this).attr('placeholder', placeholder).attr('data-index', index);\n\n $(this).select2({\n placeholder: placeholder,\n minimumResultsForSearch: self.minimumResultsForSearch($(this)),\n language: {\n noResults: function() {\n return $select.data('no-results') || 'No results found';\n }\n }\n });\n\n // if selected country is listed in \"drCountries\" array, it means that driveRight has a separate manufacturers list for this country.\n // in this case we must add an extra link to toggle what manufacturers list is shown in the first element\n $(selectEl).find('option').not(':first').remove();\n\n // populate select\n $(selectEl).append(options);\n }); // selects\n\n if( refreshResults ){\n if( typeof tyreselector.parseResults !== 'undefined' ) tyreselector.parseResults('size.populateSelects()'); // this updates header as well\n }\n\n // check if tyre size data is stored in cookie\n // and that the size is found in sizeData\n // and that user has not chosen model or license\n // if all are true, then pre-select values to select-elements.\n if( init && window.cookieObj && !window.cookieObj.license && !window.cookieObj.model ){\n\n if( self.data && (typeof( window.cookieObj.width ) !== 'undefined' || typeof( window.cookieObj.height ) !== 'undefined' || typeof( window.cookieObj.rim ) !== 'undefined') ) {\n\n for( var i=0;i