1const state = { 2 layersQuantity: null, 3 layersPosition: null, 4 currentLayerId: null, 5 previousIds: [], 6 selectedOptions: {}, //[layer_id]: optin_id || [...optoin_id] 7 preSelectedOptions: {}, 8 multiple: false, 9 questionNumber: null, 10 debug: false 11}; 12 13let swiperTopPagination = null; 14let swiperNewseedFinderProducts = null; 15let lazyInstanceNsf = null; 16 17function initSeedfinder() { 18 swiperTopPagination = new Swiper('.newSeedfinder-navigation', { 19 slidesPerView: 'auto', 20 loop: false, 21 speed: 400 22 }); 23 24 state.layersQuantity = $('.seedfinder-swiper-slide').data('layers-quantity'); 25 state.layersPosition = $('.seedfinder-swiper-slide').data('layers-position'); 26 state.currentLayerId = $('.seedfinder-swiper-slide').data('layerid'); 27 state.multiple = $('.seedfinder-swiper-slide').data('multiple'); 28 state.questionNumber = $('.seedfinder-swiper-slide').data('question-number'); 29 if (typeof $('.seedfinder-swiper-slide').data('selected-options') == 'object') { 30 state.selectedOptions = $('.seedfinder-swiper-slide').data('selected-options'); 31 for (let i in state.selectedOptions) { 32 state.previousIds.push(i); 33 } 34 } 35 36 if (typeof preselectedOptionsJson !== 'undefined' && preselectedOptionsJson) { 37 state.preSelectedOptions = JSON.parse(preselectedOptionsJson); 38 } 39 40 if (state.debug) { 41 console.log('state on init') 42 console.log(state) 43 } 44 45 if ($('.seedfinder-products__wrap#product_list').length) { 46 decorateRenderedProductsView(); 47 } 48 49 if ($('#noProducts-wrap').length) { 50 decorateRenderedNoProductsView(); 51 } 52 53 assignPaginationClickEvent(); 54 assignOptionClickEvent(); 55 updateNavigationButtonsAvailability(); 56 57 assignResetButtonClickEvent(); 58 59 $('.seedfinder-next').click(function () { 60 if ($('.seedfinder-next button').hasClass('disabled')) { 61 return false; 62 } 63 changeLayer('next'); 64 }); 65 assignBackButtonClickEvent(); 66} 67 68function changeLayer(direction, numberQuestion = 0, idLayer = 0, reset = false) { 69 $('.seedfinder-body').addClass('loading'); 70 let data = {}; 71 if (direction === 'next') { 72 data = state; 73 } else if (direction == 'back' || direction == 'number') { 74 state.questionNumber = numberQuestion; 75 state.layersPosition = numberQuestion; 76 if (reset) { 77 state.selectedOptions = {}; 78 state.previousIds = []; 79 } 80 data = { ...state, back: idLayer} 81 if (reset) { 82 data = { ...data, actionRestart: 1} 83 } 84 } 85 $.ajax({ 86 type: 'post', 87 data, 88 url: baseDir + 'modules/newseedfinder/ajax.php', 89 success: (data) => { 90 var data_result = JSON.parse(data); 91 92 if (data_result.products) { 93 updateProgressBar('last') 94 renderProducts(data_result.products) 95 return; 96 } 97 98 if (data_result.noProducts) { 99 updateProgressBar('last') 100 renderNoProducts(data_result.noProducts) 101 return; 102 } 103 104 if (direction === 'next') { 105 const previousIds = state.previousIds; 106 let index = previousIds.findIndex(($id) => $id == state.currentLayerId); 107 if (index === -1) { 108 state.previousIds.push(state.currentLayerId); 109 } 110 if (data_result.position) { 111 state.questionNumber = data_result.position; 112 } else { 113 state.questionNumber++; 114 } 115 } else if (direction == 'back' || direction == 'number') { 116 state.layersPosition = data_result.position; 117 } 118 119 state.currentLayerId = data_result.id; 120 state.multiple = Boolean(data_result.multiple === '1'); 121 state.layersPosition = Number(data_result.position); 122 $('#nsf-wrapper').removeClass('showProducts') 123 $('#nsf-wrapper').removeClass('noProducts') 124 $('.seedfinder-wrap').removeClass('showProducts') 125 $('.seedfinder-wrap').removeClass('noProducts') 126 $('.seedfinder-pagination').show() 127 128 updateProgressBar(data_result.position, data_result.id, reset); 129 updateNavigationButtonsAvailability(); 130 assignBackButtonClickEvent(); 131 assignResetButtonClickEvent(); 132 133 $('.seedfinder-swiper-slide').html(data_result.optionsHTML).fadeIn(250); 134 135 updateOptionSelectedStatus(); 136 assignOptionClickEvent(); 137 138 }, 139 error: () => { 140 console.log('Technical error'); 141 } 142 }); 143 $('.seedfinder-body').removeClass('loading'); 144 145 if (state.debug) { 146 console.log('state after change layer') 147 console.log(state) 148 } 149} 150 151function updateOptionSelectedStatus() { 152 if (typeof state.selectedOptions[state.currentLayerId] !== 'undefined' && state.selectedOptions[state.currentLayerId].length) {
153 state.selectedOptions[state.currentLayerId].forEach(function (e) { 154 $('.seedfinder-layer-element[data-optionid='+e+']').addClass('selected') 155 }) 156 } 157} 158 159function updateNavigationButtonsAvailability() { 160 if (typeof state.selectedOptions[state.currentLayerId] !== 'undefined' && state.selectedOptions[state.currentLayerId].length) { 161 $('.seedfinder-next button').removeClass('disabled'); 162 } else { 163 $('.seedfinder-next button').addClass('disabled'); 164 } 165 if (state.layersPosition > 1) { 166 $('.seedfinder-reset').removeClass('deactivated'); 167 $('.seedfinder-back button').removeClass('disabled'); 168 } else { 169 $('.seedfinder-reset').addClass('deactivated'); 170 $('.seedfinder-back button').addClass('disabled'); 171 } 172 if (state.layersPosition == state.layersQuantity) { 173 $('.seedfinder-next button').hide(); 174 $('.seedfinder-next button#show_results').show(); 175 } else { 176 $('.seedfinder-next button').hide(); 177 if (window.innerWidth > 767) { 178 $('.seedfinder-next button#desktop_next').show(); 179 } else { 180 $('.seedfinder-next button#mobile_next').show(); 181 } 182 } 183} 184 185function getDoneElements() 186{ 187 let doneElements = Array(); 188 $('.element-done').each(function (e) { 189 doneElements.push($(this).attr('data-number')) 190 }) 191 return doneElements; 192} 193 194function assignResetButtonClickEvent() 195{ 196 $('.seedfinder-reset').unbind('click'); 197 const doneElements = getDoneElements(); 198 let realFirstStep = null; 199 200 doneElements.every(v => { 201 if (state.selectedOptions[v]) { 202 realFirstStep = v; 203 return false; 204 } 205 return true; 206 }); 207 if (realFirstStep) { 208 $('.seedfinder-reset').click(function () { 209 if ($('.seedfinder-reset').hasClass('deactivated')) { 210 return; 211 } 212 changeLayer('number', parseInt($('.bar-element[data-number='+realFirstStep+']').attr('data-quest')), realFirstStep, true); 213 }); 214 } else { 215 $('.seedfinder-reset').addClass('deactivated'); 216 } 217 218} 219 220function assignBackButtonClickEvent() 221{ 222 $('.seedfinder-back').unbind('click'); 223 $('.seedfinder-back').click(function () { 224 225 const reversedDoneElements = getDoneElements().reverse(); 226 let backTo = null; 227 reversedDoneElements.every(v => { 228 if (state.selectedOptions[v]) { 229 backTo = v; 230 return false; 231 } 232 return true; 233 }); 234 235 if (backTo) { 236 changeLayer('back', $('.bar-element[data-number='+backTo+']').attr('data-quest'), backTo); 237 } 238 239 }); 240} 241 242function assignPaginationClickEvent() 243{ 244 $('.bar-element').unbind('click'); 245 $('.element-done').click(function () { 246 changeLayer('number', parseInt($(this).attr('data-quest')), parseInt($(this).attr('data-number'))); 247 }); 248} 249 250function assignBackRestartButtonClickEvent() 251{ 252 const doneElements = getDoneElements(); 253 const reversedDoneElements = getDoneElements().reverse(); 254 let realFirstStep = null; 255 let realLastStep = null; 256 257 reversedDoneElements.every(v => { 258 if (state.selectedOptions[v]) { 259 realLastStep = v; 260 return false; 261 } 262 return true; 263 }); 264 doneElements.every(v => { 265 if (state.selectedOptions[v]) { 266 realFirstStep = v; 267 return false; 268 } 269 return true; 270 }); 271 272 $('#back-to-first-step').click(function () { 273 changeLayer('number', parseInt($('.bar-element[data-number='+realFirstStep+']').attr('data-quest')), realFirstStep, true); 274 }); 275 276 $('#back-to-last-step').click(function () { 277 changeLayer('number', parseInt($('.bar-element[data-number='+realLastStep+']').attr('data-quest')), realLastStep); 278 }); 279} 280 281function assignOptionClickEvent() 282{ 283 $('.seedfinder-layer-element').click(function () { 284 const selectedOptionId = String($(this).data('optionid')); 285 const noPreferenceOption = Boolean($(this).data('nochoice')); 286 const noPreferenceId = $(document).find('.seedfinder-layer-element[data-nochoice=1]').attr('data-optionid'); 287 288 if (!state.selectedOptions[state.currentLayerId]) { 289 state.selectedOptions[state.currentLayerId] = []; 290 } 291 292 const stateOptions = state.selectedOptions[state.currentLayerId]; 293 294 let index = stateOptions.findIndex(($id) =>
294 $id == selectedOptionId); 295 296 if (index === -1) { 297 if (state.multiple == 0) { 298 state.selectedOptions[state.currentLayerId] = []; 299 } 300 if (state.multiple == 1) { 301 state.selectedOptions[state.currentLayerId] = stateOptions.filter(($id) => $id != noPreferenceId); 302 } 303 state.selectedOptions[state.currentLayerId].push(selectedOptionId) 304 } else { 305 state.selectedOptions[state.currentLayerId] = stateOptions.filter(($id) => $id != selectedOptionId); 306 } 307 308 if (state.multiple == 0) { 309 $(document).find('.seedfinder-layer-element').removeClass('selected'); 310 if (index !== -1) { 311 updateNavigationButtonsAvailability(); 312 return; 313 } 314 $(this).addClass('selected'); 315 } else { 316 317 if (noPreferenceOption) { 318 $(document).find('.seedfinder-layer-element').removeClass('selected'); 319 state.selectedOptions[state.currentLayerId] = [selectedOptionId]; 320 } else { 321 $(document).find('.seedfinder-layer-element[data-nochoice=1]').removeClass('selected'); 322 } 323 324 if (index === -1) { 325 $(this).addClass('selected'); 326 } else { 327 $(this).removeClass('selected'); 328 } 329 } 330 331 updateNavigationButtonsAvailability(); 332 if (state.debug) { 333 console.log('state after option click') 334 console.log(state) 335 } 336 }); 337} 338 339function updateProgressBar(pos, id = null) { 340 341 if (pos === 'last') { 342 $('.element-current').addClass('element-done') 343 return; 344 } 345 346 $('.steps-counter-current-step').html(pos) 347 348 for (i = 1; i <= state.layersQuantity; i++) { 349 if (i < state.questionNumber) { 350 classAdd = 'element-done'; 351 classRemove = 'element-not-done'; 352 if ($('.main-progress #bar-element' + (i)).hasClass('element-current')) { 353 classRemove = 'element-current'; 354 } 355 } 356 else if (i == state.questionNumber) { 357 classAdd = 'element-current'; 358 if (id) { 359 $('.main-progress #bar-element' + (i)).attr('data-number', id); 360 } 361 if ($('.main-progress #bar-element' + (i)).hasClass('element-not-done')) { 362 classRemove = 'element-not-done'; 363 } else { 364 classRemove = 'element-done'; 365 } 366 } 367 else { 368 classAdd = 'element-not-done'; 369 classRemove = 'element-done'; 370 if ($('.main-progress #bar-element' + (i)).hasClass('element-current')) { 371 classRemove = 'element-current'; 372 } 373 } 374 $('.main-progress #bar-element' + (i)).addClass(classAdd); 375 $('.main-progress #bar-element' + (i)).removeClass(classRemove); 376 if ($('.main-progress #bar-element' + (i)).hasClass('element-not-done')) { 377 $('.main-progress #bar-element' + (i)).removeClass('element-done'); 378 } 379 } 380 381 assignPaginationClickEvent(); 382 383 if (typeof swiperTopPagination !== 'undefined') { 384 if (state.questionNumber > 2) { 385 swiperTopPagination.slideTo(state.questionNumber - 2); 386 } 387 if (state.questionNumber <= 2) { 388 swiperTopPagination.slideTo(0); 389 } 390 } 391} 392 393function renderNoProducts(noProducts) { 394 $('.seedfinder-swiper-slide').html(noProducts); 395 decorateRenderedNoProductsView(); 396} 397 398function renderProducts(products) { 399 $('.seedfinder-swiper-slide').fadeOut(250, () => { 400 $('.seedfinder-swiper-slide').html(products).fadeIn(250, function () { 401 decorateRenderedProductsView(); 402 }); 403 }); 404} 405 406function decorateRenderedNoProductsView() 407{ 408 $('#nsf-wrapper').addClass('noProducts'); 409 $('.seedfinder-wrap').addClass('noProducts') 410 assignBackRestartButtonClickEvent(); 411} 412 413function decorateRenderedProductsView() 414{ 415 $('#nsf-wrapper').addClass('showProducts') 416 $('.seedfinder-wrap').addClass('showProducts') 417 418 let defaultNumberPerView = 5.2; 419 let numberPerView767 = 2.2; 420 let numberPerView1199 = 3.2; 421 let numberPerView1599 = 4.2; 422 if (!$('#nsf-wrapper').length) { 423 defaultNumberPerView = 4.2; 424 } 425 426 if ($('#newseedfinder.newseedfinderPage').length) { 427 defaultNumberPerView = 5.5; 428 numberPerView1199 = 4.5; 429 numberPerView1599 = 5.5; 430 } 431 432 swiperNewseedFinderProducts = new Swiper('.newSeedfinder-productList', { 433 slidesPerView: defaultNumberPerView, 434 loop: false, 435 spaceBetween: 20, 436 speed: 400, 437 nextButton: '.seedfinder-products__list-head .swiper-button-next', 438 prevButton: '.seedfinder-products__list-head .swiper-button-prev', 439 breakpoints: { 440 767: { 441 slidesPerView: numberPerView767 442 }, 443 1199: { 444 slidesPerView: numberPerView1199 445 }, 446 1599: { 447 slidesPerView: numberPerView1599 448 } 449 }, 450 onTransitionStart: function () { 451 if (typeof(lazyInstanceNsf) != 'undefined' && typeof lazyInstanceNsf.update === 'function') {
452 lazyInstanceNsf.update(); 453 } 454 } 455 }); 456 457 if ($('.productCardWrap img.lazy').length) { 458 lazyInstanceNsf = $('.productCardWrap img.lazy').Lazy({ 459 chainable: false, 460 afterLoad: function (element) { 461 let productCardWrap = $('.productCardWrap'); 462 if (productCardWrap) { 463 productCardWrap.equalHeights(); 464 } 465 } 466 }); 467 } 468 469 ajaxCart.overrideButtonsInThePage(); 470 equalHeightsProductCardBottom(); 471 assignBackRestartButtonClickEvent(); 472 displayProductsRating(); 473 initNiceCombinationsSelect(); 474 475 $('.show_more').click(function () { 476 $(this).hide(); 477 $(this).parent().find('.hidden-features').show(); 478 $(this).parent().find('.show_less').show(); 479 }) 480 $('.show_less').click(function () { 481 $(this).hide(); 482 $(this).parent().find('.hidden-features').hide(); 483 $(this).parent().find('.always_show').show(); 484 $(this).parent().find('.show_more').show(); 485 }) 486} 487 488function resetSeedfinder() { 489 $('#nsf-wrapper').removeClass('showProducts') 490 state.layersQuantity = null 491 state.layersPosition = null 492 state.currentLayerId = null 493 state.previousIds = [] 494 state.selectedOptions = {} 495 state.preSelectedOptions = {} 496 state.multiple = false 497 state.questionNumber = null 498} 499 500$(document).ready(function() { 501 initSeedfinder(); 502});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.