1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17<!DOCTYPE html> 18<html> 19 <head> 20 <title>Login / Register Account - Duracell Direct com</title> 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!-- AWS intelligent threat integration sdk --> 36
36<script type="text/javascript" src="null" defer></script>
36 37 <!-- 2. Wait until the window/DOM is ready and the SDK is loaded --> 38
38<script type="text/javascript" data-aws-waf-integration="1"> 39 window.addEventListener('DOMContentLoaded', async () => { 40 try { 41 // Ensure the SDK exists on the window object 42 if (typeof AwsWafIntegration !== 'undefined') { 43 const token = await AwsWafIntegration.getToken(); 44 } else { 45 console.error('AWS WAF Integration SDK failed to load.'); 46 } 47 } catch (error) { 48 console.error('Error initializing AWS WAF Integration:', error); 49 } 50 }); 51 </script>
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257<!-- Requested by John --> 258 259 <meta name="google-site-verification" content="btYh-0dl2Br_bJu8UatWTMAS-ZXFRDxNlFZDQuY1f48" /> 260 261<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 262<meta name="ROBOTS" content="ALL"> 263 264<link id="altMobileUrl" rel="alternate" media="only screen" href=""> 265 266 267 268
269<script src="/lib/js/browser-redirect1.js" type="text/javascript"></script>
269 270 271 272 273 <link href="/apple-touch-icon.ico" rel="apple-touch-icon" /> 274 <link href="/apple-touch-icon-152x152.ico" rel="apple-touch-icon" sizes="152x152" /> 275 <link href="/apple-touch-icon-167x167.ico" rel="apple-touch-icon" sizes="167x167" /> 276 <link href="/apple-touch-icon-180x180.ico" rel="apple-touch-icon" sizes="180x180" /> 277 <link href="/favicon.ico" rel="icon" sizes="192x192" /> 278 <link href="/icon-normal.ico" rel="icon" sizes="128x128" /> 279 280 281 282 283 284<link href="https://api.fonts.coollabs.io/css?family=Poppins:400,500&display=swap" rel="stylesheet"> 285<link rel="stylesheet" type="text/css" href="/skin002/common/lib/css/dd_v59.css?v=1.0.9" async> 286 287<link rel="stylesheet" type="text/css" href="/skin002/distinct/usa/lib/css/dd-dsk-skin-distinct-v5.css" async> 288
289<script> 290//Implement includes 291if (!String.prototype.includes) { 292 String.prototype.includes = function() { 293 'use strict'; 294 return String.prototype.indexOf.apply(this, arguments) !== -1; 295 }; 296} 297// Implement indexOf for arrays 298if (!Array.prototype.indexOf) { 299 Array.prototype.indexOf = function(searchElement, fromIndex) { 300 var k; 301 if (this == null) { 302 throw new TypeError('"this" is null or not defined'); 303 } 304 var o = Object(this); 305 var len = o.length >>> 0; 306 if (len === 0) { 307 return -1; 308 } 309 var n = +fromIndex || 0; 310 if (Math.abs(n) === Infinity) { 311 n = 0; 312 } 313 if (n >= len) { 314 return -1; 315 } 316 k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); 317 while (k < len) { 318 if (k in o && o[k] === searchElement) { 319 return k; 320 } 321 k++; 322 } 323 return -1; 324 }; 325} 326// Production steps of ECMA-262, Edition 5, 15.4.4.18 327// Reference: http://es5.github.io/#x15.4.4.18 328if (!Array.prototype.forEach) { 329 330 Array.prototype.forEach = function(callback/*, thisArg*/) { 331 332 var T, k; 333 334 if (this == null) { 335 throw new TypeError('this is null or not defined'); 336 } 337 338 // 1. Let O be the result of calling toObject() passing the 339 // |this| value as the argument. 340 var O = Object(this); 341 342 // 2. Let lenValue be the result of calling the Get() internal 343 // method of O with the argument "length". 344 // 3. Let len be toUint32(lenValue). 345 var len = O.length >>> 0; 346 347 // 4. If isCallable(callback) is false, throw a TypeError exception. 348 // See: http://es5.github.com/#x9.11 349 if (typeof callback !== 'function') { 350 throw new TypeError(callback + ' is not a function'); 351 } 352 353 // 5. If thisArg was supplied, let T be thisArg; else let 354 // T be undefined. 355 if (arguments.length > 1) { 356 T = arguments[1]; 357 } 358 359 // 6. Let k be 0. 360 k = 0; 361 362 // 7. Repeat while k < len. 363 while (k < len) { 364 365 var kValue; 366 367 // a. Let Pk be ToString(k). 368 // This is implicit for LHS operands of the in operator. 369 // b. Let kPresent be the result of calling the HasProperty 370 // internal method of O with argument Pk. 371 // This step can be combined with c. 372 // c. If kPresent is true, then 373 if (k in O) { 374 375 // i. Let kValue be the result of calling the Get internal 376 // method of O with argument Pk. 377 kValue = O[k]; 378 379 // ii. Call the Call internal method of callback with T as 380 // the this value and argument list containing kValue, k, and O. 381 callback.call(T, kValue, k, O); 382 } 383 // d. Increase k by 1. 384 k++; 385 } 386 // 8. return undefined. 387 }; 388} 389// Production steps of ECMA-262, Edition 6, 22.1.2.1 390if (!Array.from) { 391 Array.from = (function () { 392 var toStr = Object.prototype.toString; 393 var isCallable = function (fn) { 394 return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; 395 }; 396 var toInteger = function (value) { 397 var number = Number(value); 398 if (isNaN(number)) { return 0; } 399 if (number === 0 || !isFinite(number)) { return number; } 400 return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); 401 }; 402 var maxSafeInteger = Math.pow(2, 53) - 1; 403 var toLength = function (value) { 404 var len = toInteger(value); 405 return Math.min(Math.max(len, 0), maxSafeInteger); 406 }; 407 408 // The length property of the from method is 1. 409 return function from(arrayLike/*, mapFn, thisArg */) { 410 // 1. Let C be the this value. 411 var C = this; 412 413 // 2. Let items be ToObject(arrayLike). 414 var items = Object(arrayLike); 415 416 // 3. ReturnIfAbrupt(items). 417 if (arrayLike == null) { 418 throw new TypeError('Array.from requires an array-like object - not null or undefined'); 419 } 420 421 // 4. If mapfn is undefined, then let mapping be false. 422 var mapFn = arguments.length > 1 ? arguments[1] : void undefined; 423 var T; 424 if (typeof mapFn !== 'undefined') { 425 // 5. else 426 // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. 427 if (!isCallable(mapFn)) { 428 throw new TypeError('Array.from: when provided, the second argument must be a function'); 429 } 430 431 // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. 432 if (arguments.length > 2) { 433 T = arguments[2]; 434 } 435 } 436 437 // 10. Let lenValue be Get(items, "length"). 438 // 11. Let len be ToLength(lenValue). 439 var len = toLength(items.length); 440 441 // 13. If IsConstructor(C) is true, then 442 // 13. a. Let A be the result of calling the [[Construct]] internal method 443 // of C with an argument list containing the single item len. 444 // 14. a. Else, Let A be ArrayCreate(len). 445 var A = isCallable(C) ? Object(new C(len)) : new Array(len); 446 447 // 16. Let k be 0. 448 var k = 0; 449 // 17. Repeat, while k < len⦠(also steps a - h) 450 var kValue; 451 while (k < len) { 452 kValue = items[k]; 453 if (mapFn) { 454 A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); 455 } else { 456 A[k] = kValue; 457 } 458 k += 1; 459 } 460 // 18. Let putStatus be Put(A, "length", len, true). 461 A.length = len; 462 // 20. Return A. 463 return A; 464 }; 465 }()); 466} 467// Includes Polyfill 468if (!Array.prototype.includes) { 469 Object.defineProperty(Array.prototype, "includes", { 470 enumerable: false, 471 value: function(obj) { 472 var newArr = this.filter(function(el) { 473 return el == obj; 474 }); 475 return newArr.length > 0;
476 } 477 }); 478 } 479</script>
479 480 481 482<link href="https://api.fonts.coollabs.io/css?family=Open+Sans:400,600,700" rel="stylesheet"> 483<!--
483<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js" async></script>
483 --> 484
485<script src="/lib/js/jquery-1.9.1.min.js"></script>
485 486
487<script type="text/javascript"> 488function showCountryList3(start, selected) { 489 document.writeln('<SELECT '+start+'>'); 490 var countries = ['US','USA','United States of America', 491'AD','AND', 'Andorra', 492'AT','AUT','Austria', 493'BE','BEL','Belgium', 494'BG','BGR','Bulgaria', 495'CA','CAN','Canada', 496'IC','0IC','Canary Islands', 497'CY','CYP','Cyprus', 498'CZ','CZE','Czech Republic', 499'DK','DNK','Denmark', 500'FI','FIN','Finland', 501'FR','FRA','France', 502'DE','DEU','Germany', 503'GR','GRC','Greece', 504'HU','HUN','Hungary', 505'IE','IRL','Ireland', 506'IT','ITA','Italy', 507'LV','LVA','Latvia', 508'LT','LTU','Lithuania', 509'LU','LUX','Luxembourg', 510'MT','MLT','Malta', 511'MC','MCO','Monaco', 512'NL','NLD','Netherlands', 513'NO','NOR','Norway', 514'PL','POL','Poland', 515'PT','PRT','Portugal', 516'RO','ROU','Romania', 517'SK','SVK','Slovakia', 518'SI','SVN','Slovenia', 519'IC', '0IC','Spain (Canary Islands)', 520'ES','ESP','Spain', 521'SE','SWE','Sweden', 522'GB','GBR','United Kingdom', 523'GG','GGY','United Kingdom (Guernsey)', 524'JE','JEY','United Kingdom (Jersey)']; 525 for(var i = 0; i < countries.length; i = i+3) { 526 if(countries[i].charAt(0)!='-') { 527 var html = '<OPTION value="' + countries[i] + '" iso3="'+countries[i+1]+'"'; 528 if(countries[i] == selected) 529 html += ' selected'; 530 html += '>' + countries[i+2] + '</OPTION>'; 531 document.writeln(html); 532 } 533 } 534 document.writeln('</SELECT>'); 535} 536 537function showRegionList(start, selected) { 538 document.writeln('<SELECT '+start+'>'); 539 var regions = [ ]; 540 for(var i = 0; i < regions.length; i = i+2) { 541 if(regions[i].charAt(0)!='-') { 542 var html = '<OPTION value="' + regions[i] + '"'; 543 544 if(regions[i].toLowerCase() == selected.toLowerCase()) 545 html += ' selected'; 546 html += '>' + regions[i+1] + '</OPTION>'; 547 document.writeln(html); 548 } 549 } 550 document.writeln('</SELECT>'); 551} 552 553</script>
553 554 555 556<style> 557.issue-message { 558 display:block; 559 color:red; 560 padding:10px; 561} 562span.issue-message a { 563 color:red; 564} 565body.info #main span.issue-message a { 566 color:red; 567} 568.dd-alert { 569 position: relative; 570 padding: 1em; 571 margin-bottom: 1rem; 572 border: 1px solid transparent; 573 border-radius: .25rem; 574 background: #f1de9d; 575} 576 577.nav-message .convid19-message { 578 font-weight: bold; 579 color: white; 580} 581 582.nav-message .convid19-message span { 583 color: #c98959; 584 font-weight: bold; 585} 586 587</style> 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
614<script> 615 window.isLoadStandAloneGa4 = ('false' == 'true') 616 617 var dataLayer = dataLayer || []; 618 // This is the object that we pushed stuff to the old google analytics. 619 // This should not be used anymore, but initialize it just in case. 620 var _gaq = _gaq || []; 621 622 window.gtag = function() { 623 dataLayer.push(arguments); 624 }; 625 626 if(window.isLoadStandAloneGa4){ 627 gtag('js', new Date()); 628 gtag('config', 'G-9J8M6VGLCD'); 629 } 630 631 dataLayer.push({ 632 'ga4_conversion_id':"G-9J8M6VGLCD", 633 'gads_conversion_id':"AW-827913445", 634 'gads_conversion_id_simple':'827913445', 635 'gads_create_account_label':"", 636 'gads_purchase_label':"T9IUCKOJq3oQ5enjigM", 637 'gads_profit_label':"7dH0CJuHq3oQ5enjigM", 638 'bing_tracking_id':"6027249", 639 'siteTag':'ddus' 640 }); 641 642 643 const defaultConsent={ 644 advanced_analytics:'denied', 645 advanced_ads:'denied', 646 functionality_storage: 'granted', 647 security_storage: 'granted', 648 ad_personalization: 'denied', 649 ad_storage: 'denied', 650 ad_user_data: 'denied', 651 analytics_storage: 'denied', 652 personalization_storage: 'denied', 653 } 654 655 656 //initialize consent mode v2 657 gtag('consent', 'default', { 658 ...defaultConsent, 659 wait_for_update: 500, 660 }) 661 662 663 664 665 gtag('set', 'ads_data_redaction', true) 666 667 668 gtag('set', 'url_passthrough', false) 669 670 function onCheckoutOption(step, checkoutOption) { 671 672 console.warn("Deprecated:onCheckoutOption", {step, checkoutOption}) 673 /* 674 try{ 675 cookiesManager.onCheckoutOption(step,checkoutOption); 676 }catch(error){ 677 console.log(error); 678 } */ 679 } 680</script>
680 681 682 683 684<!-- adwordsCreateAccountLabel: --> 685<!-- googleTagManagerId: GTM-WXM2QB6 --> 686<!-- Google Tag Manager -->
687<script> 688function loadGoogleTagManager(){ 689 console.log("loadGoogleTagManager");
vendor: 338 bytes, lines 689-694
689 690 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 691 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 692 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 693 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 694 })(window,document,'script','dataLayer','
694GTM-MXKR7QN4
vendor: 5 bytes, line 694
694');
695} 696</script>
696 697<!-- End Google Tag Manager --> 698<!-- Google Analytics 4 -->
699<script> 700function loadStandAloneGa4(){ 701 console.log("loadStandAloneGa4"); 702 const script = document.createElement('script'); 703 script.async = true; 704 script.src = "https://www.googletagmanager.com/gtag/js?id=G-9J8M6VGLCD"; 705 document.head.appendChild(script); 706} 707</script>
707 708<!-- Google Analytics 4 --> 709 710<!-- End Google Tag Manager --> 711 712 713 714 715 716 717
717<script type="text/javascript"> 718 gtag('set', 'url_passthrough', true) 719 gtag('consent', 'update', { 720 advanced_analytics:'granted', 721 advanced_ads:'granted',} 722 ) 723 dataLayer.push({'event':'consent_updated'}); // this will trigger the tags to load 724 if(!window.isLoadStandAloneGa4){ 725 loadGoogleTagManager(); 726 } 727 </script>
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
750<script src="/lib/js/js-cookie.js" ></script>
750 751
752<script type="text/javascript"> 753 document.addEventListener("DOMContentLoaded", function(){ 754 755 const psaConsentToDefaultConsentMap={ 756 essential: ['security_storage','functionality_storage'], 757 traffic_analytics: ['analytics_storage','advanced_analytics'], 758 advert_effectiveness: ['ad_storage','ad_user_data','ad_personalization','advanced_ads'], 759 settings: ['personalization_storage'] 760 } 761 762 const cookieConsentPopup = document.querySelector('[data-cookie-role="cookie-consent-wrapper"]') 763 const acceptSelectedBtn = document.querySelector('[data-cookie-role="cookie-consent-btn-accept-selected"]') 764 const acceptAllBtn = document.querySelector('[data-cookie-role="cookie-consent-btn-accept-all"]') 765 const declineAllBtn = document.querySelector('[data-cookie-role="cookie-consent-btn-decline-all"]') 766 const consentCheckboxes = document.querySelectorAll('[data-cookie-role="cookie-consent-checkbox"]') 767 const editCookieConsents = document.querySelectorAll('[data-cookie-role="edit-cookie-consent"]') 768 769 const consentCheckboxesArray = Array.from(consentCheckboxes);
770 const editCookieConsentsArray = Array.from(editCookieConsents); 771 const cookieConsentOldName = 'psa_cookie_consent' 772 const cookieConsentName= 'psa_cookie_consent_v2'; 773 const cookieConsentExpiryDays = 90; 774 let storedCookieConsent = readCookieConsent(); 775 776 777 function deleteAllCookies() { 778 const cookies = document.cookie.split(";"); 779 780 for (let i = 0; i < cookies.length; i++) { 781 const cookie = cookies[i]; 782 const cookieParts= cookie.split('='); 783 const name = cookieParts[0]; 784 console.log("delete cookie", name); 785 786 // Remove cookie on current path and root path 787 document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=.duracelldirect.com"; 788 document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;"; 789 document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT;"; 790 } 791 } 792 793 794 795 function handleLoadGTM(){ 796 if(storedCookieConsent === undefined){ 797 return; 798 } 799 800 const psaConsentNames = storedCookieConsent.psa; 801 802 803 if(psaConsentNames.indexOf('advert_effectiveness') > -1){ 804 gtag('set', 'ads_data_redaction', false) 805 } 806 807 if(psaConsentNames.indexOf('traffic_analytics') > -1 || psaConsentNames.indexOf('advert_effectiveness') > -1){ 808 // enable url_passthrough 809 gtag('set', 'url_passthrough', true) 810 if(!window.isLoadStandAloneGa4){ 811 loadGoogleTagManager(); 812 } 813 } 814 815 if(psaConsentNames.indexOf('traffic_analytics') > -1){ 816 if(window.isLoadStandAloneGa4){ 817 loadStandAloneGa4(); 818 } 819 } 820 821 } 822 823 function updateConsent(consent){ 824 console.log('updateConsent', consent) 825 gtag('consent', 'update', consent) 826 dataLayer.push({'event':'consent_updated'}); 827 } 828 829 function hideCookiePopup(){ 830 cookieConsentPopup.style.display="none"; 831 } 832 833 function showCookiePopup(){ 834 cookieConsentPopup.style.display="flex"; 835 836 if(storedCookieConsent === undefined){ 837 return; 838 } 839 840 consentCheckboxesArray.forEach(function(checkbox){ 841 const name = checkbox.value; 842 if(storedCookieConsent.psa.indexOf(name) > -1){ 843 checkbox.checked=true; 844 } 845 }) 846 847 }; 848 849 window.showCookiePopup = showCookiePopup; 850 851 function initializeCookieConsent(){ 852 if(storedCookieConsent === undefined){ 853 showCookiePopup(); 854 return; 855 } 856 handleLoadGTM(); 857 updateConsent(storedCookieConsent.ga4) 858 859 } 860 861 initializeCookieConsent(); 862 863 function readCookieConsent(){ 864 // remove old consent cookie if exists 865 Cookies.remove(cookieConsentOldName); 866 867 var cookieConsent = Cookies.getJSON(cookieConsentName); 868 // if cookieConsent doesn't exist the show popup and return 869 if(!cookieConsent){ 870 return undefined; 871 } 872 873 var enabledConsentsNames = cookieConsent.enabled; 874 const ga4Consent = createGA4Consent(enabledConsentsNames); 875 876 return { 877 ga4: ga4Consent, 878 psa: enabledConsentsNames 879 } 880 } 881 882 function setConsentCookie(psaConsentNames) { 883 884 var dateOfConsentUTC = new Date().toISOString(); 885 var consentMessage = $(".cookie-container .content").text(); 886 887 888 var cookieObj={ 889 'enabled': psaConsentNames, 890 'dateOfConsent':dateOfConsentUTC 891 } 892 893 var cookieSettings = { 894 'sameSite':'Lax' 895 } 896 897 cookieSettings.expires = cookieConsentExpiryDays; 898 899 Cookies.set(cookieConsentName , JSON.stringify(cookieObj), cookieSettings); 900 901 902 903 var dateOfConsent = "2026-10-08T23-56-16Z"; 904 var values= [...psaConsentNames] // make copy 905 values.push(dateOfConsent); 906 907 var d = new Date(); 908 d.setTime(d.getTime() + (cookieConsentExpiryDays*24*60*60*1000)); 909 var expires = ";expires="+ d.toUTCString(); 910 document.cookie = "COOKIECONSENT=" + values.join("|") + expires + ";path=/;sameSite=Lax"; 911 912 } 913 914 915 function storeCookieConsent(consent){ 916 storedCookieConsent= consent; 917 const {ga4, psa} = consent; 918 setConsentCookie(psa); 919 updateConsent(ga4) 920 handleLoadGTM(); 921 fetch("/e/Account?_action=UPDATE_COOKIE_CONSENT_STATEMENTS",{ 922 method:'POST' 923 }) 924 } 925 926 927 // psaConsent should contain an array of allowed consent names 928 function createGA4Consent(psaConsent){ 929 console.log("psaConsent", psaConsent); 930 const consentsArray = psaConsent.map(function(consent){ 931 const consents = psaConsentToDefaultConsentMap[consent].map(function(consent){ 932 return { 933 [consent]: 'granted' 934 } 935 }); 936 return consents; 937 }).flat(); 938 939 const consent = consentsArray.reduce(function(prev,curr){ 940 return {...prev,...curr} 941 },{}) 942 943 return { 944 ...defaultConsent, 945 ...consent 946 }; 947 } 948 949 950 function getConsent(){ 951 952 const psaConsent = consentCheckboxesArray.map(function(consentCheckbox){ 953 const checked = consentCheckbox.checked; 954 const value = consentCheckbox.value; 955 return {name:value, status:checked} 956 }) 957 958 const psaConsentNames = psaConsent.filter(function(consent){ 959 return consent.status === true; 960 }).map(function(consent){ 961 return consent.name; 962 }) 963 964 const ga4Consent = createGA4Consent(psaConsentNames); 965 966 return { 967 ga4: ga4Consent, 968 psa: psaConsentNames 969 } 970 } 971 972 // Add click event listener 973 acceptSelectedBtn.addEventListener("click", function() { 974 // reset cookies 975 deleteAllCookies(); 976 const consent = getConsent(); 977 storeCookieConsent(consent);
978 hideCookiePopup(); 979 }); 980 981 982 acceptAllBtn.addEventListener("click", function() { 983 consentCheckboxesArray.forEach(function(checkbox){ 984 checkbox.checked = true; 985 }) 986 987 const consent = getConsent(); 988 storeCookieConsent(consent); 989 990 hideCookiePopup(); 991 }); 992 993 994 declineAllBtn.addEventListener("click", function() { 995 consentCheckboxesArray.forEach(function(checkbox){ 996 if(checkbox.value == 'essential'){ 997 return; 998 } 999 checkbox.checked = false; 1000 }) 1001 // reset cookies 1002 deleteAllCookies(); 1003 1004 const consent = getConsent(); 1005 storeCookieConsent(consent); 1006 1007 hideCookiePopup(); 1008 }); 1009 1010 editCookieConsentsArray.forEach(function(editCookieConsent){ 1011 editCookieConsent.addEventListener("click", function(e) { 1012 e.preventDefault(); 1013 showCookiePopup(); 1014 }) 1015 }) 1016 }); 1017</script>
1017 1018 1019 1020 1021 1022 1023 1024
1024<script type="text/javascript"> 1025 1026 function showCountryList(start, selected) { 1027 document.writeln('<SELECT '+start+'>'); 1028 var countries = [ 'US','United States of America' ]; 1029 for(var i = 0; i < countries.length; i = i+2) { 1030 if(countries[i].charAt(0)!='-') { 1031 var html = '<OPTION value="' + countries[i] + '"'; 1032 if(countries[i] == selected) 1033 html += ' selected'; 1034 html += '>' + countries[i+1] + '</OPTION>'; 1035 document.writeln(html); 1036 } 1037 } 1038 document.writeln('</SELECT>'); 1039 } 1040 1041 function submitExistingCustomerLogin() { 1042 var f = document.forms.EXISTING_USER_LOGIN; 1043 if(!isValidEmail(f.elements['login'].value)){ 1044 alert("The email address is invalid\u002e\n It should be similar to\u003a\n\n yourname\u0040yourcompany\u002ecom\n\nWith no spaces\u002e Please enter it again\u002e"); 1045 return; 1046 } 1047 var plainPasswordField= $("#password"); 1048 var hashedPasswordField = $("#hashedPasswordLogin"); 1049 1050 var result = tryToHashPasswordIfEmpty(plainPasswordField, hashedPasswordField); 1051 if(result === false) 1052 return false; 1053 1054 _gaq.push(['_trackEvent', 'LoginType', 'Account login as existing', '', 0, true]); 1055 f.submit(); 1056 } 1057 1058 function retrievePassword() { 1059 var f = document.forms.EXISTING_USER_LOGIN; 1060 f.action='Account'; 1061 f.elements._storeForm.value='NONE'; 1062 f.elements._action.value='DISPLAY_PASSWORD_REMINDER_REQUEST'; 1063 f.submit(); 1064 } 1065 1066 function resetPassword() { 1067 var f = document.forms.EXISTING_USER_LOGIN; 1068 f.action='Account'; 1069 f.elements._storeForm.value='NONE'; 1070 f.elements._action.value='DISPLAY_PASSWORD_RESET_REQUEST'; 1071 f.submit(); 1072 } 1073 1074 // Check if the Enter/Return key was pressed. If so, submit the form. 1075 document.onkeypress = function(e) { 1076 var targ; 1077 if (!e) var e = window.event; 1078 if (e.target) targ = e.target; 1079 else if (e.srcElement) targ = e.srcElement; 1080 if (targ.nodeType == 3) // defeat Safari bug 1081 targ = targ.parentNode; 1082 try { 1083 if(e.keyCode == 13) 1084 submitExistingCustomerLogin(); 1085 } catch(er) {} 1086 } 1087 </script>
1087 1088 1089 1090 1091 1092 1093
1093<script src="/lib/cryptojs/3.1.9-1/crypto-js.min.js"></script>
1093 1094 1095 1096
1096<script> 1097 var hashSettings = null; 1098 1099 function hashPassword(password){ 1100 if(hasCrypoJsLoaded()){ 1101 if(hashSettings == null){ 1102 hashSettings = { 1103 salt:'KMz0CfqMU8EMKaFojbFQcnvpqKMgg7cb', 1104 settings:{ 1105 keySize: parseInt('4', 10), 1106 hasher: CryptoJS.algo.SHA512, 1107 iterations: parseInt('1', 10) 1108 } 1109 } 1110 } 1111 1112 return CryptoJS.PBKDF2(password, hashSettings.salt, hashSettings.settings).toString(); 1113 }else{ 1114 // Log library has not been loaded. 1115 var message = "Crypto library has not been loaded"; 1116 console.log("DEBUG ", message); 1117 logInfo(message); 1118 } 1119 } 1120 1121 function hasCrypoJsLoaded(){ 1122 return typeof CryptoJS != "undefined"; 1123 } 1124 1125 function logInfo(message){ 1126 $.ajax({ 1127 url: "/e/Account", 1128 type: "Post", 1129 async: true, 1130 data: {'_action': 'LOG_INFO', 'message':message, 'browserName':get_browser().name , 'browserVersion':get_browser().version}, 1131 beforeSend: function( xhr ) { 1132 xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); 1133 } 1134 }); 1135 } 1136 1137 function get_browser() { 1138 var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; 1139 if(/trident/i.test(M[1])){ 1140 tem=/\brv[ :]+(\d+)/g.exec(ua) || []; 1141 return {name:'IE',version:(tem[1]||'')}; 1142 } 1143 if(M[1]==='Chrome'){ 1144 tem=ua.match(/\bOPR|Edge\/(\d+)/) 1145 if(tem!=null) {return {name:'Opera', version:tem[1]};} 1146 } 1147 M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; 1148 if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} 1149 return { 1150 name: M[0], 1151 version: M[1] 1152 }; 1153 } 1154 1155 function reloadCryptoJs() { 1156 var src = '/lib/cryptojs/3.1.9-1/crypto-js.min.js?v=1'; 1157 $('
1157<script>').attr('src', src).appendTo('head'); 1158 } 1159 1160 function tryToHashPasswordIfEmpty(plainPasswordField, hashedPasswordField){ 1161 var passwordHashed = true; 1162 if(plainPasswordField.val().trim() !== ""){ 1163 hashedPasswordField.val(hashPassword(plainPasswordField.val())); 1164 1165 if(hashedPasswordField.val() == ""){ 1166 reloadCryptoJs(); 1167 hashedPasswordField.val(hashPassword(plainPasswordField.val())); 1168 1169 if(hashedPasswordField.val() == ""){ 1170 alert("We are sorry\u002c there was a problem submitting the form\u002e Please reload this page\u002e"); 1171 passwordHashed = false; 1172 } 1173 } 1174 } 1175 return passwordHashed; 1176 }; 1177 1178 $(document).ready(function(){ 1179 // Record page load 1180 (function(){ 1181 var message = "Page: LoginEntrance.jsp, hasCryptoJsLoaded: " + hasCrypoJsLoaded(); 1182 logInfo(message); 1183 })(); 1184 1185 $('input.toHash').on('input',function(){ 1186 var password = $(this).val(); 1187 var target = $(this).attr('target'); 1188 var targetInput = $("#"+target); 1189 targetInput.val(hashPassword(password)); 1190 }); 1191 1192 }); 1193 </script>
1193 1194 1195 </head> 1196 <body class="auth"> 1197 <div id="ctn"> 1198 <div class="page-top-bg"></div> 1199 <div class="grid-1 content-start"> 1200 <h2 class="breadcrumb"> 1201 1202 1203 <a href="https://www.duracelldirect.com/" title="Duracell Direct Homepage">Home</a> > 1204 Login 1205 </h2> 1206 <div> 1207 <div id="main"> 1208 1209 1210 1211 1212 1213 1214 <div style="position: relative; margin-top: -20px"> 1215 <img src="/i/icons/padlock.png" style="margin-top: -20px; position: absolute; top:-5px; left:750px"/> 1216 <div id="login"> 1217 <h2 class="exist-customer"> 1218 Login 1219 </h2> 1220 <form class="panel box-shadow login-form" name="EXISTING_USER_LOGIN" method="post" action="Account" onsubmit="javascript:submitExistingCustomerLogin(); return false;"> 1221 <input type="hidden" name="_storeForm" value="EXISTING_USER_LOGIN"> 1222 <input type="hidden" name="_action" value="LOGIN_EXISTING_USER"> 1223 <input type="hidden" name="passwordReminderDestinationUri" value="/e/Account"/> 1224 <input type="hidden" name="passwordReminderDestinationCmsTag" value="returnBtn-account"/> 1225 <input type="hidden" name="passwordReminderDestinationCmsGroup" value="accountHome"/> 1226 1227 1228<table> 1229 <tr> 1230 <td style="width:200px;"> 1231 1232 <label for="login" class="block py-05">Email address:</label> 1233 <input id="login" name="login" class="text short login-user" value="" type="text" pattern="^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,16})+$" size="30" placeholder="Email address" style="margin-top: 0" required/> 1234 </td> 1235 <td style="width:200px"> 1236 1237 <label for="password" class="block py-05">Password:</label> 1238 <input id="password" class="text short toHash" target="hashedPasswordLogin" type="password" size="30" placeholder="Password" style="margin-top: 0"/> 1239 <input name="hashedPassword" id="hashedPasswordLogin" type="hidden"/> 1240 1241 <p style="line-height:11px; height: 11px; margin:3px 0 0 0; padding:0"> 1242 1243 1244 <a class="dd-btn btn-link pt-0" href="javascript:resetPassword()" title=""> 1245 Forgot your password? 1246 </a> 1247 </p> 1248 </td> 1249 <td class="btn" style="background: none; margin:0; padding:0; vertical-align: middle"> 1250 1251 <a href="javascript:submitExistingCustomerLogin();" title="Sign in" class="dd-btn btn-primary btn-sm mt-1"> 1252 Sign in 1253 </a> 1254 </td> 1255 </tr> 1256 <tr> 1257 <td colspan="3" class="bottom btn"> </td> 1258 </tr> 1259</table> 1260 1261 </form> 1262 </div> 1263 </div> 1264 1265 1266 <div style="position: relative; margin-top: -20px" class="new-account"> 1267 1268 1269 1270 1271 1272<form class="panel box-shadow new-account-form needs-validation" id="newAccountSignup" name="NEW_ACCOUNT_SIGNUP" method="post" action="Account" novalidate> 1273 <input type="hidden" name="_storeForm" value="NEW_ACCOUNT_SIGNUP"> 1274 <input type="hidden" name="_action" value="SIGNUP_NEW_ACCOUNT"> 1275 <h2 class="exist-customer">New Customers</h2> 1276 <table class="new-account-table"> 1277 <tr> 1278 <th ><b>Email address</b>:</th> 1279 <td class="text"> 1280 <input type="email" name="contactEmail" id="contactEmail" class="text form-control" maxlength="50" type="text" size="30" 1281 required> 1282 <div class="invalid-feedback"> 1283 <span>The email address is invalid.<br> It should be similar to:<br><br> [email protected]<br><br>With no spaces. Please enter it again.</span> 1284 </div> 1285 </td> 1286 <td class="optional"></td> 1287 </tr> 1288 1289 <tr> 1290 <th><b>First Name</b>:</th> 1291 <td class="text"> 1292 <input id="firstName" name="firstName" class="text form-control" type="text" 1293 pattern="[a-zA-Z 0-9',.-]{2,}$" char-compatibility="courier" required> 1294 <div class="invalid-feedback"> 1295 <span>You must enter a First Name</span> 1296 1297 <span class="secondary-text">Please do not use accented, Greek, Cyrillic, Chinese or other non-Latin characters.</span> 1298 </div> 1299 </td> 1300 <td class="optional"></td> 1301 </tr> 1302 <tr> 1303 <th><b>Family Name</b>:</th> 1304 <td class="text"> 1305 <input type="hidden" id="contactName" name="contactName" value=""> 1306 <input id="familyName" name="familyName" class="text form-control" type="text" 1307 pattern="[a-zA-Z 0-9',.-]{2,}$" char-compatibility="courier" required> 1308 <div class="invalid-feedback"> 1309 <span>You must enter a Family Name</span> 1310 1311 <span class="secondary-text">Please do not use accented, Greek, Cyrillic, Chinese or other non-Latin characters.</span> 1312 </div> 1313 </td> 1314 <td class="optional"></td> 1315 </tr> 1316 <tr> 1317 <th> 1318 <label for="newPassword"><b>Create a password</b>:</label> 1319 </th> 1320 <td> 1321 <input id="newPassword" class="text toHash form-control" target="hashedPasswordSignup" type="password" autocomplete="off" size="30" 1322 onchange="form.confirmPassword.pattern = form.newPassword.value;" pattern="^[A-Za-z0-9\-#*!+_]{10,24}$" required> 1323 <div class="invalid-feedback"> 1324 <span>
1324The Password you supplied was invalid. Passwords must be between 10 and 24 characters and can not contain white-space or (&, ', @, <, ", >) characters.</span> 1325 </div> 1326 <input name="hashedPassword" id="hashedPasswordSignup" type="hidden"/> 1327 </td> 1328 <td></td> 1329 </tr> 1330 <tr> 1331 <th> 1332 <label for="confirmPassword"><b>Re-type the password</b>:</label> 1333 </th> 1334 <td> 1335 <input id="confirmPassword" class="text form-control" type="password" autocomplete="off" size="30" 1336 pattern="^[A-Za-z0-9\-#*!+_]{10,24}$" required> 1337 <div class="invalid-feedback"> 1338 <span>Password does not match the confirm password.</span> 1339 </div> 1340 </td> 1341 <td></td> 1342 </tr> 1343 <tr style="display:none;"> 1344 <th> 1345 <label for="invoiceCountryCode"><b>Country</b>:</label> 1346 </th> 1347 <td> 1348 1349 1350 <select name="invoiceCountryCode" id="invoiceCountryCode" class="edit js_handleOnChange" on-change="copy-text" target="#invoiceCountry"> 1351 1352 <option value="US" iso3="USA" selected>United States of America</option> 1353 1354 <option value="AD" iso3="AND" >Andorra</option> 1355 1356 <option value="AT" iso3="AUT" >Austria</option> 1357 1358 <option value="BE" iso3="BEL" >Belgium</option> 1359 1360 <option value="BG" iso3="BGR" >Bulgaria</option> 1361 1362 <option value="CA" iso3="CAN" >Canada</option> 1363 1364 <option value="IC" iso3="0IC" >Canary Islands</option> 1365 1366 <option value="CY" iso3="CYP" >Cyprus</option> 1367 1368 <option value="CZ" iso3="CZE" >Czech Republic</option> 1369 1370 <option value="DK" iso3="DNK" >Denmark</option> 1371 1372 <option value="FI" iso3="FIN" >Finland</option> 1373 1374 <option value="FR" iso3="FRA" >France</option> 1375 1376 <option value="DE" iso3="DEU" >Germany</option> 1377 1378 <option value="GR" iso3="GRC" >Greece</option> 1379 1380 <option value="HU" iso3="HUN" >Hungary</option> 1381 1382 <option value="IE" iso3="IRL" >Ireland</option> 1383 1384 <option value="IT" iso3="ITA" >Italy</option> 1385 1386 <option value="LV" iso3="LVA" >Latvia</option> 1387 1388 <option value="LT" iso3="LTU" >Lithuania</option> 1389 1390 <option value="LU" iso3="LUX" >Luxembourg</option> 1391 1392 <option value="MT" iso3="MLT" >Malta</option> 1393 1394 <option value="MC" iso3="MCO" >Monaco</option> 1395 1396 <option value="NL" iso3="NLD" >Netherlands</option> 1397 1398 <option value="NO" iso3="NOR" >Norway</option> 1399 1400 <option value="PL" iso3="POL" >Poland</option> 1401 1402 <option value="PT" iso3="PRT" >Portugal</option> 1403 1404 <option value="RO" iso3="ROU" >Romania</option> 1405 1406 <option value="SK" iso3="SVK" >Slovakia</option> 1407 1408 <option value="SI" iso3="SVN" >Slovenia</option> 1409 1410 <option value="IC" iso3="0IC" >Spain (Canary Islands)</option> 1411 1412 <option value="ES" iso3="ESP" >Spain</option> 1413 1414 <option value="SE" iso3="SWE" >Sweden</option> 1415 1416 <option value="GB" iso3="GBR" >United Kingdom</option> 1417 1418 <option value="GG" iso3="GGY" >United Kingdom (Guernsey)</option> 1419 1420 <option value="JE" iso3="JEY" >United Kingdom (Jersey)</option> 1421 1422 </select> 1423 <input type="hidden" name="invoiceCountry" id="invoiceCountry" value=""> 1424 </td> 1425 <td></td> 1426 </tr> 1427 1428 1429 <tr id="next-btn-container"> 1430 <td></td> 1431 <td > 1432 1433 <button type="submit" class="dd-btn btn-primary btn-sm block mt-1 mr-4" > 1434 Next 1435 </button> 1436 </td> 1437 <td></td> 1438 </tr> 1439 <tr> 1440 <td colspan="3" class="btm"> 1441 </td> 1442 </tr> 1443 </table> 1444</form> 1445<br><br>
1446<script type="text/javascript"> 1447$("#newAccountSignup").submit(function(){ 1448 $("#contactName").val($('#firstName').val().trim() + " " + $('#familyName').val().trim()); 1449 $("#invoiceCountry").val($("#invoiceCountryCode").find(':selected').text()) 1450}); 1451</script>
1451 1452 </div> 1453 1454 </div> 1455 1456 <p class="secure" style="margin-bottom: 20px"> 1457 1458 1459 <a href="/info/security.html" target="security" title="Privacy and Security"> 1460 <img class="infL" src="/i/icons/padlock.gif" alt="Privacy and Security" style="margin-top: 0"> 1461 </a> 1462 If you are a new customer, please enter your email address as your login name and create a memorable password. Your login ensures your details remain private. We will not send you Junk emails, or sell your details to other companies. See our <a href="/info/security.html" target="security" title="Privacy and Security">⢠Privacy & Security information</a> 1463 </p> 1464 1465 1466 1467 </div> 1468 </div> 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 <div id="header"> 1489 <div class="container nav-container"> 1490 1491 1492 <div class="nav-left"> 1493 <a class="logo" href="/" title="" > 1494 <img src="/skin002/i/logo/duracelldirect.png" alt=""/> 1495 </a> 1496 </div> 1497 <div class="nav-center"> 1498 <ul class="top-links"> 1499 <li style="display:none;"> 1500 1501 <a href="/" title="Duracell Direct Homepage">Home</a> 1502 </li> 1503 <li> 1504 1505 <a href="/info/contact.html" title="Contact Duracell Direct">Contact Us</a> 1506 </li> 1507 <li> 1508 1509 <a href="/info/about.html" title="About Us">About Us</a> 1510 </li> 1511 1512 1513 <li> 1514 1515 <a href="/info/" title="Duracell Direct Help Center">Help</a> 1516 </li> 1517 1518 1519 1520 1521 <li class="no-border" style="color:#fff"> 1522 <a href="https://www.duracelldirect.com/e/Account">Sign in</a> 1523 </li> 1524 1525 1526 1527 <li> 1528 <span class="lang-selection">US <img src="/i/flag/64/us.png"> </span> 1529 </li> 1530 1531 </ul> 1532 1533 1534 <div class="search-wrapper" style=""> 1535 <form action="/info/search.html" id="searchFormTop" method="get" class="search-form-top"> 1536 1537 <div class="search-wrapper-input"> 1538 <input type="text" id="search-box-top" class="search-box input input-sm input-rou
1538nd" name="search" value="" placeholder="Start Searching ..." autocomplete="off"/> 1539 <button type="submit"> </button> 1540 </div> 1541 </form> 1542 1543 1544 1545 1546<div id="dropdown-search-container"> 1547 <div class="dropdown-search-wrapper" id="dropdown-search-wrapper"> 1548 <span class="close" id="close-dropdown-search">❌</span> 1549 <!-- dropdown search aside --> 1550 <div class="dropdown-search-aside has-bg"> 1551 <div class="wrapper flex border-r"> 1552 <!-- Refine search --> 1553 <div class="dropdown-search-block"> 1554 <span class="dropdown-search-block-heading">Include in search</span> 1555 <div class="dropdown-search-block-body search-filters"> 1556 <span class="filter-item"> 1557 <label class="switch"> 1558 <input type="checkbox" class="filter-item-chk checkbox-large" filter="filterModels" id="search-models" checked> 1559 <span class="slider-toggle round"></span> 1560 </label> 1561 <label for="search-models">Models</label> 1562 </span> 1563 <span class="filter-item"> 1564 <label class="switch"> 1565 <input type="checkbox" class="filter-item-chk checkbox-large" filter="filterProducts" id="search-products" checked> 1566 <span class="slider-toggle round"></span> 1567 </label> 1568 <label for="search-products">Products</label> 1569 </span> 1570 </div> 1571 </div> 1572 <!-- Recent searches --> 1573 <div class="dropdown-search-block hide" id="recent-searches-block"> 1574 <div class="dropdown-search-block-heading flex">Recent searches <span id="clear-recent-searches" class="hide">Clear</span></div> 1575 <div class="dropdown-search-block-body"> 1576 <ul class="recent-searches" id="recent-searches-list"> 1577 </ul> 1578 <span class="view-more hide" id="more-recent-searches">View More</span> 1579 </div> 1580 </div> 1581 1582 </div> <!-- end wrapper --> 1583 </div> 1584 1585 <!-- dropdown search main --> 1586 <div class="dropdown-search-main"> 1587 <div class="dropdown-search-block"> 1588 <span class="dropdown-search-block-heading" id="search-result-heading-block"> 1589 <span id="search-result-heading"> Search Results</span> 1590 <!-- Loading --> 1591 <img src="/i/icon/load-circle-dark.gif" class="hide" id="loading-icon"/> 1592 </span> 1593 <!-- Search results --> 1594 <div class="dropdown-search-block-body hide" id="search-results-block"> 1595 <ul class="result-list" id="search-result-list"> 1596 </ul> 1597 <!-- bottom action --> 1598 <div class="bottom-action"> 1599 <span id="searchSeeMore" class="hide">More results (<span id="searchSeeMoreCount">0</span>)</span> 1600 </div> 1601 </div> 1602 <!-- Repeat last search --> 1603 <div class="dropdown-search-block-body mb-1 hide" id="repeat-last-search-block"> 1604 <a href="#" class="text-info" id="repeat-last-search">Repeat last search "<span class="bold" id="last-search"></span>"</a> 1605 </div> 1606 <!-- Error message --> 1607 <div class="dropdown-search-block-body mb-1 hide" id="error-message-block"> 1608 <span class="text-info"><b>We are sorry, but an error has occured.</b> This may be because our system is unusually busy, or because one of our servers is temporarily offline. Please try again in a few minutes.</span> 1609 </div> 1610 <!-- No Result found --> 1611 <div class="dropdown-search-block-body mb-1 hide" id="not-found-searchTerm-block"> 1612 <span class="text-info">Sorry, no results were found for "<span class="bold text-dark" id="not-found-search-term-placeholder"></span>"</span> 1613 </div> 1614 <!-- Loading large --> 1615 <div class="dropdown-search-block-body mb-1 hide" id="loading-block"> 1616 <img src="/i/icon/load-circle-dark.gif" height="38px" /> 1617 </div> 1618 </div> 1619 <div class="dropdown-search-block mt-auto hide" id="how-to-search-block">
1620 <span class="dropdown-search-block-heading hide" >Search suggestions</span> 1621 <!-- How to search --> 1622 <div class="dropdown-search-block-body"> 1623 The recommended ways to search our site are to: 1624 <ul> 1625 <li>Enter a <b>Device Manufacturer and Model</b> (e.g. "Acer Acernote 3350")</li> 1626<li>Enter a <b>Manufacturer's Part Number</b> (e.g. "CP033616-01")</li> 1627<li>Enter a <b>Duracell or 2-Power Part Number</b> (e.g. "DRC511")</li> 1628 </ul> 1629 </div> 1630 </div> 1631 1632 </div> 1633 <!-- end dropdown search wrapper --> 1634 </div> 1635</div> 1636
1637<script> 1638 // Add visible and invisible funtionality to jquery 1639 (function($) { 1640 $.fn.invisible = function() { 1641 return this.each(function() { 1642 $(this).css("visibility", "hidden"); 1643 }); 1644 }; 1645 $.fn.visible = function() { 1646 return this.each(function() { 1647 $(this).css("visibility", "visible"); 1648 }); 1649 }; 1650 }(jQuery)); 1651 1652 1653 var liveSearch = { 1654 ui:{ 1655 closeBtn: $("#close-dropdown-search"), 1656 searchForm: $("#searchFormTop"), 1657 clearRecentSearchesLink: $("#clear-recent-searches"), 1658 dropDownSearch: $("#dropdown-search-container"), 1659 dropDownSearchWrapper: $("#dropdown-search-wrapper"), 1660 searchResultsHeading: $("#search-result-heading"), 1661 recentSearches: $("#recent-searches-block"), 1662 recentSearchesList: $("#recent-searches-list"), 1663 repeatLastSearch: $("#repeat-last-search-block"), 1664 lastSearchPhrase: $("#last-search"), 1665 repeatLastSearchLink: $("#repeat-last-search"), 1666 notFoundSearchTermBlock: $("#not-found-searchTerm-block"), 1667 notFoundSearchTermPlaceHolder: $("#not-found-search-term-placeholder"), 1668 errorMessageBlock: $("#error-message-block"), 1669 loadingIcon: $("#loading-icon"), 1670 loadingBlock: $("#loading-block"), 1671 howToSearch: $("#how-to-search-block"), 1672 searchResults: $("#search-results-block"), 1673 resultList: $("#search-result-list"), 1674 moreRecentBtn: $("#more-recent-searches"), 1675 searchBox: $(".search-box"), 1676 seeMoreBtn: $("#searchSeeMore"), 1677 seeMoreCount: $("#searchSeeMoreCount"), 1678 searchTermLink: $(".search-term"), 1679 filetItemChk: $(".filter-item-chk"), 1680 searchFiltersContainer: $(".search-filters"), 1681 resultItem: $(".result-list-item") 1682 }, 1683 settings:{ 1684 actions:{ 1685 search: "SEARCH", 1686 log:"LOG_SEARCH_ERROR" 1687 }, 1688 timeDuration:{ 1689 long:{ 1690 timeout: 1500, 1691 timeInterval:1510 1692 }, 1693 normal:{ 1694 timeout: 600, 1695 timeInterval: 900 1696 }, 1697 short:{ 1698 timeout: 380, 1699 timeInterval: 400 1700 }, 1701 timeIntervalThresholdTimeoutTimer: 900 1702 }, 1703 isDebugEnabled: false, 1704 debugMode: 0, 1705 resultLimit: 5, 1706 focusOutDelay: 20, 1707 focusInDelay:20, 1708 recentSearchPhrasesCount: 6, 1709 recentSearchesLimit: 6, 1710 searchTokenLength: 10, 1711 timeIntervalCharThreshold: 4, 1712 ajaxRequestTimeout:18000 1713 }, 1714 state:{ 1715 doneTypingTimer: 600, 1716 timeIntervalTimer: 900, 1717 testTimers: false, 1718 originalSearchPhrase:"", 1719 searchPhrase: "", 1720 lastSearchPhrase:"", 1721 searchToken: null, 1722 lastSearchToken: null, 1723 typingTimer: null, 1724 timeInterval: null, 1725 hideSearchPopUpTimer:null, 1726 showSearchResults: false, 1727 resultFound: false, 1728 isSearchResultLoading: false,
1729 isSearchPopUpOpen:false, 1730 lastEndWordIndex: 0, 1731 splitedSearchPhrase: [], 1732 searchResult:undefined, 1733 recentSearches: undefined, 1734 visibleRecentSearchPhrases:0, 1735 error:false, 1736 filterModels: true, 1737 filterProducts: true 1738 }, 1739 initialize: function(){ 1740 if(this.settings.isDebugEnabled){ 1741 if(this.settings.debugMode == 10) 1742 console.log("DEBUG, liveSearch.initialize ========================"); 1743 } 1744 1745 this.state.recentSearches = this.getRecentSearchesFromLocalStorage("initialize"); 1746 this.renderBlocks("initialize"); 1747 this.renderRecentSearchesAndRepeatSearch("initialize"); 1748 }, 1749 execute: function(searchPhrase, debugCaller){ 1750 if(this.settings.isDebugEnabled){ 1751 var caller = "execute"; 1752 if(this.settings.debugMode == 10){ 1753 console.log("DEBUG, ============= liveSearch.execute,", searchPhrase ," =============", searchPhrase); 1754 } 1755 } 1756 this.state.originalSearchPhrase = searchPhrase.trim(); 1757 var lastSearchPhrase = this.state.lastSearchPhrase; 1758 // if search term has been edited by removing any char. 1759 var searchPhraseEdited = searchPhrase.trim().length < lastSearchPhrase.trim().length || ( searchPhrase.trim().length == lastSearchPhrase.trim().length && searchPhrase.trim() != lastSearchPhrase.trim() ); 1760 1761 if(searchPhraseEdited){ 1762 this.state.lastSearchPhrase = searchPhrase + "-1"; 1763 } 1764
1765 if(this.state.isSearchPopUpOpen == false){ 1766 this.showSearchPopUp(caller); 1767 } 1768 1769 var processedSearchPhrase = this.processSearchPhrase(caller); 1770 if(!processedSearchPhrase.validSearchTerm){ 1771 if(this.settings.isDebugEnabled){ 1772 if(this.settings.debugMode == 10){ 1773 console.log("--- DEBUG, liveSearch.execute <=1 "); 1774 } 1775 } 1776 // Clear search result and timers if if the search term is not valid 1777 this.clearSearch(caller); 1778 }else{ 1779 this.state.isSearchResultLoading = true; 1780 this.renderBlocks(); 1781 if(this.settings.isDebugEnabled){ 1782 if(this.settings.debugMode == 10){ 1783 console.log("--- DEBUG, liveSearch.execute else "); 1784 } 1785 } 1786 1787 // reset typing timer 1788 this.resetTypingTimer(caller); 1789 1790 // Start time interval if it has not already started 1791 if(this.state.timeInterval == null){ 1792 if(processedSearchPhrase.runTimeInterval){ 1793 this.startTimeIntervalAndBeginSearch(caller); 1794 } 1795 } 1796 } 1797 }, 1798 processSearchPhrase: function(debugCaller){ 1799 if(this.settings.isDebugEnabled){ 1800 var caller = "processSearchPhrase"; 1801 if(this.settings.debugMode == 10 ){ 1802 console.log("DEBUG, liveSearch.processSearchPhrase, called from ", debugCaller); 1803 } 1804 } 1805 var result = { 1806 validSearchTerm: false, 1807 runTimeInterval: false 1808 } 1809 var searchPhrase = this.state.originalSearchPhrase; 1810 //this.state.searchPhrase = searchPhrase; 1811 var searchTerms = []; 1812 1813 if(!this.isSearchPhraseEmpty(caller) && !this.hasSearchPhraseWhiteSpace(caller)){ 1814 this.state.searchPhrase = searchPhrase; 1815 searchTerms = searchPhrase.split(/\s+/); 1816 var lastSearchTermIndex = searchTerms.length -1; 1817 1818 // if last search term has only one char then set timers to long 1819 // else 1820 // if search phrase has less then 4 chars then set runTimeInterval to false and timeout to timeIntervalThresholdTimeoutTimer 1821 // else set runTimeInterval to true and timers to normal 1822 1823 result.validSearchTerm = true; 1824 if(searchTerms[lastSearchTermIndex].length === 1){ 1825 this.setTimerBetweenSearches('long'); 1826 }else{ 1827 if(searchPhrase.length < this.settings.timeIntervalCharThreshold){ 1828 result.runTimeInterval = false; 1829 this.setTimerBetweenSearches('normal', this.settings.timeDuration.timeIntervalThresholdTimeoutTimer); 1830 }else{ 1831 result.runTimeInterval = true; 1832 this.setTimerBetweenSearches('normal'); 1833 } 1834 } 1835 1836 }else{ 1837 // if the search phrase is white space don't fire search 1838 result.validSearchTerm = false; 1839 } 1840 1841 if(this.settings.isDebugEnabled){ 1842 if(this.settings.debugMode > 1 ){ 1843 console.log("DEBUG, liveSearch.processSearchPhrase, set timers. timeout:", this.state.doneTypingTimer, ", timeInterval:", this.state.timeIntervalTimer); 1844 } 1845 } 1846 return result; 1847 }, 1848 setTimerBetweenSearches:function(timeBetweenSearches, timeoutTimer, timeIntervalTimer){ 1849 var timeDuration = this.settings.timeDuration; 1850 this.state.doneTypingTimer = timeoutTimer || timeDuration[timeBetweenSearches].timeout; 1851 this.state.timeIntervalTimer = timeIntervalTimer || timeDuration[timeBetweenSearches].timeInterval; 1852 }, 1853 doSearch: function(debugCaller){ 1854 var searchPhrase = this.state.searchPhrase; 1855 var lastSearchPhrase = this.state.lastSearchPhrase; 1856 var fireSearch = searchPhrase !== lastSearchPhrase; 1857 1858 if(this.settings.isDebugEnabled){ 1859 var caller = "doSearch"; 1860 if(this.settings.debugMode > 0 ){ 1861 console.log("DEBUG, liveSearch.doSearch, called from ", debugCaller,", original search phrase:'"+this.state.originalSearchPhrase+"', search phrase:'"+searchPhrase+"', last search term:'"+lastSearchPhrase+"', fireSearch: ", fireSearch); 1862 } 1863 } 1864 // this will prevent same search to fire twice in a row. 1865 if(fireSearch){
1866 // Genereate token to send with request 1867 this.generateToken(this.settings.searchTokenLength, caller); 1868 this.addLastSearchToken(caller); 1869 this.state.lastSearchPhrase = searchPhrase; 1870 1871 this.renderBlocks(); 1872 var that = this; 1873 $.ajax({ 1874 url: "/e/Search", 1875 type: "GET", 1876 async: true, 1877 headers: { 1878 'Accept': 'application/json', 1879 'Content-Type': 'application/json;charset=UTF-8' 1880 }, 1881 data: {'_action': that.settings.actions.search, 'search': searchPhrase, 'resultLimit':that.settings.resultLimit, 'token': that.state.searchToken}, 1882 timeout: that.settings.ajaxRequestTimeout 1883 }).done(function(response) { 1884 that.state.error = false; 1885 that.state.showSearchResults = true; 1886 that.state.isSearchResultLoading = false; 1887 if(response != null){ 1888 if(that.getObjectType(response) == "string") 1889 respose = JSON.parse(response); 1890 that.state.searchResult = response; 1891 that.renderResult(caller); 1892 }else{ 1893 that.state.searchResult = undefined; 1894 that.state.resultFound= false; 1895 that.renderBlocks(caller); 1896 } 1897 that.clearTimeIntervalTimer(caller); 1898 }).error(function(err, textStatus) { 1899 if(textStatus === 'timeout'){ 1900 that.log(textStatus); 1901 } 1902 that.state.isSearchResultLoading = false; 1903 that.state.searchResult = undefined; 1904 that.state.error= true; 1905 that.state.resultFound= false; 1906 that.clearTimers(caller); 1907 that.renderBlocks(caller); 1908 }); 1909 }else{ 1910 if(this.state.isSearchResultLoading){ 1911 this.clearTimeIntervalTimer(caller); 1912 return; 1913 } 1914 1915 this.renderBlocks(caller); 1916 this.clearTimeIntervalTimer(caller); 1917 } 1918 }, 1919 getObjectType: function(obj){ 1920 if (Array.isArray(obj)) return 'array'; 1921 else if (typeof obj == 'string') return 'string'; 1922 else if (obj != null && typeof obj == 'object') return 'object'; 1923 else return 'other'; 1924 }, 1925 log: function(debugCaller, errorCode){ 1926 if(this.settings.isDebugEnabled){ 1927 var caller = "logError"; 1928 if(this.settings.debugMode == 10 ){ 1929 console.log(" ---- DEBUG, liveSearch.logError, called from ", debugCaller); 1930 } 1931 } 1932 $.ajax({
1933 url: "/e/Search", 1934 type: "Post", 1935 async: true, 1936 data: {'_action': that.settings.actions.log, 'error':errorCode}, 1937 beforeSend: function( xhr ) { 1938 xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); 1939 } 1940 }); 1941 }, 1942 renderBlocks: function(debugCaller){ 1943 if(this.settings.isDebugEnabled){ 1944 var caller = "renderBlocks"; 1945 if(this.settings.debugMode == 10 ){ 1946 console.log(" ---- DEBUG, liveSearch.renderBlocks, called from ", debugCaller); 1947 } 1948 } 1949 var isSearchResultLoading = this.state.isSearchResultLoading; 1950 var isSearchPhraseEmpty = this.isSearchPhraseEmpty(caller) ; 1951 var untickedAllFilter = this.state.filterModels == false && this.state.filterProducts == false; 1952 var showSearchResults = this.state.showSearchResults && this.state.resultFound; 1953 var showLoadingIcon = isSearchResultLoading; 1954 var showLoadingBlock = false;//isSearchResultLoading && showSearchResults == false; 1955 if( 1956 (this.state.filterModels == false && this.state.searchResult && this.state.searchResult.matchingOemPartNumbers.length == 0 ) || 1957 (this.state.filterProducts == false && this.state.searchResult && this.state.searchResult.matchingDevices.length ==0) 1958 ){ 1959 showSearchResults= false; 1960 } 1961 var showResultList = isSearchPhraseEmpty === false && showSearchResults == true && untickedAllFilter == false; 1962 var showMoreResultsBtn = this.state.searchResult && this.state.searchResult.moreResultsCount > 0; 1963 var showRecentSearches = this.state.recentSearches != undefined; 1964 //var showNotFoundMessage = (isSearchResultLoading == false && showResultList == false && isSearchPhraseEmpty == false && this.state.searchPhrase.length > 1) || ( isSearchResultLoading == false && showResultList == false && untickedAllFilter == true && isSearchPhraseEmpty == false); 1965 var showSearchErrorMessage = (isSearchResultLoading == false && showResultList == false && isSearchPhraseEmpty == false ) && this.state.error == true; 1966 var showNotFoundMessage = ((isSearchResultLoading == false && showResultList == false && isSearchPhraseEmpty == false ) || ( isSearchResultLoading == false && showResultList == false && untickedAllFilter == true && isSearchPhraseEmpty == false) ) && showSearchErrorMessage == false; 1967 var showRepeatLastSearch = showResultList == false && isSearchResultLoading == false && showNotFoundMessage == false && this.state.recentSearches ; 1968 var showHowToSearch = showResultList == false; 1969 var showSearchFiltersWarning = untickedAllFilter; 1970 var showSearchResultHeading = showResultList || showNotFoundMessage || showLoadingIcon; 1971 1972 1973 // loading / loading icon 1974 if(showLoadingIcon){ 1975 this.ui.loadingIcon.removeClass('hide'); 1976 this.ui.resultList.addClass('item-fade'); 1977 this.ui.seeMoreBtn.addClass('item-fade'); 1978 }else{ 1979 this.ui.resultList.removeClass('item-fade'); 1980 this.ui.seeMoreBtn.removeClass('item-fade'); 1981 this.ui.loadingIcon.addClass('hide'); 1982 } 1983 1984 // Error message 1985 if(showSearchErrorMessage){ 1986 this.ui.errorMessageBlock.removeClass('hide'); 1987 }else{ 1988 this.ui.errorMessageBlock.addClass('hide'); 1989 } 1990 1991 1992 // View more results btn and search results 1993 if(showResultList){ 1994 this.ui.searchResults.removeClass('hide'); 1995 1996 if(showMoreResultsBtn){ 1997 this.ui.seeMoreCount.html(this.state.searchResult.moreResultsCount); 1998 this.ui.seeMoreBtn.removeClass('hide'); 1999 }else{ 2000 this.ui.seeMoreBtn.addClass('hide'); 2001 } 2002 }else{ 2003 this.ui.searchResults.addClass('hide'); 2004 this.ui.seeMoreBtn.addClass('hide'); 2005 } 2006 2007 // Not found 2008 if(showNotFoundMessage){ 2009 this.ui.notFoundSearchTermBlock.removeClass('hide'); 2010 this.ui.notFoundSearchTermPlaceHolder.html(this.state.searchPhrase); 2011 }else{ 2012 this.ui.notFoundSearchTermBlock.addClass('hide'); 2013 } 2014 2015 // Search result heading 2016 if(showSearchResultHeading){ 2017 this.ui.searchResultsHeading.visible(); 2018 }else{ 2019 this.ui.searchResultsHeading.invisible(); 2020 } 2021 2022 // Recent searches 2023 if(showRecentSearches){ 2024 this.ui.recentSearches.removeClass('hide'); 2025 }else{ 2026 this.ui.recentSearches.addClass('hide'); 2027 } 2028 2029 // Repeat last search 2030 if(showRepeatLastSearch){ 2031 this.ui.repeatLastSearch.removeClass('hide'); 2032 // Render last recent search 2033 }else{ 2034 this.ui.repeatLastSearch.addClass('hide'); 2035 } 2036 2037 // loading block 2038 if(showLoadingBlock){ 2039 //console.log(" ---- SHOW loading block, debugCaller", debugCaller, " isLoading ", this.state.isSearchResultLoading, " date ", new Date()); 2040 this.ui.loadingBlock.removeClass('hide'); 2041 }else{ 2042 //console.log(" ---- Hide loading block, debugCaller", debugCaller, " isLoading ", this.state.isSearchResultLoading, " date ", new Date()); 2043 this.ui.loadingBlock.addClass('hide'); 2044 } 2045 2046 // How to search 2047 if(showHowToSearch){ 2048 this.ui.howToSearch.removeClass('hide'); 2049 }else{ 2050 this.ui.howToSearch.addClass('hide'); 2051 } 2052
2053 // Search filters 2054 if(showSearchFiltersWarning){ 2055 this.ui.searchFiltersContainer.addClass('warning'); 2056 }else{ 2057 this.ui.searchFiltersContainer.removeClass('warning'); 2058 } 2059 2060 }, 2061 renderResult: function(debugCaller){ 2062 var result = this.state.searchResult; 2063 var renderResultList = true; 2064 var responseToken; 2065 if(result){ 2066 responseToken= result.token; 2067 renderResultList = this.state.lastSearchToken == responseToken; 2068 } 2069 2070 2071 if(this.settings.isDebugEnabled){ 2072 var caller = "renderResult"; 2073 if(this.settings.debugMode == 10 ){ 2074 console.log("DEBUG, liveSearch.renderResult, called from ", debugCaller); 2075 console.log("DEBUG, --- liveSearch.renderResult Response token: ", responseToken , ", Current token: ", this.state.searchToken ); 2076 console.log("DEBUG, --- liveSearch.renderResult renderResultList: ", renderResultList); 2077 } 2078 } 2079 2080 if(renderResultList){ 2081 //console.log(" ---- Render results, debugCaller", debugCaller, new Date()); 2082 this.ui.resultList.html(''); 2083 if(result == undefined || (result.matchingDevices.length == 0 && result.matchingOemPartNumbers.length == 0) ){ 2084 this.state.resultFound = false; 2085 this.renderBlocks(caller); 2086 return; 2087 } 2088 2089 this.state.resultFound = true; 2090 var that = this; 2091 // populate matching devices 2092 if(result.matchingDevices && result.matchingDevices.length > 0){ 2093 $.each(result.matchingDevices, function(index, device) { 2094 //resultList 2095 var li = document.createElement("li"); 2096 li.className = that.state.filterModels == false? "result-list-item dev hide":"result-list-item dev" ; 2097 2098 var div1 = document.createElement("div"); 2099 div1.className= 'flex-row'; 2100 2101 var spanHighlightedTitle = document.createElement("span"); 2102 spanHighlightedTitle.innerHTML = device.highlightedTitle; 2103 spanHighlightedTitle.className = 'search-result-text'; 2104 var spanRange = document.createElement("span"); 2105 spanRange.innerHTML = " - "+device.matchingManufacturerText +""; 2106 spanRange.className = 'match-man-text'; 2107 2108 //div1.appendChild(spanHighlightedTitle); 2109 //div1.appendChild(spanRange); 2110 2111 //var div2 = document.createElement("div"); 2112 //div2.className= 'flex-column'; 2113 2114 var href; 2115 2116 if(device.siteSections.length > 1){ 2117 //Display or site sections 2118 device.siteSections.map(function(siteSection){ 2119 href= document.createElement("a"); 2120 href.setAttribute("class", "result-item"); 2121 href.setAttribute("href", siteSection.url); 2122 href.setAttribute("title", siteSection.title.trim()); 2123 //href.innerHTML = '• '+ siteSection.title.trim(); 2124 //div2.appendChild(href); 2125 }); 2126 }else{ 2127 href= document.createElement("a"); 2128 href.setAttribute("class", "result-item"); 2129 href.setAttribute("href", device.url); 2130 href.setAttribute("title", device.title); 2131 //href.innerHTML = '• '+ device.sectionTag.trim(); 2132 //div2.appendChild(href); 2133 } 2134 href.appendChild(spanHighlightedTitle); 2135 href.appendChild(spanRange); 2136 div1.appendChild(href); 2137 2138 2139 li.appendChild(div1); 2140 //li.appendChild(div2); 2141 that.ui.resultList.append(li); 2142 }) 2143 } 2144 2145 // populate matching oem part numbers 2146 if(result.matchingOemPartNumbers && result.matchingOemPartNumbers.length > 0){ 2147 $.each(result.matchingOemPartNumbers, function(index, matchingOemPartNumber) { 2148 //resultList 2149 var li = document.createElement("li"); 2150 li.className = that.state.filterProducts == false ? "result-list-item oem hide":"result-list-item oem" ; 2151 2152 var href = document.createElement("a"); 2153 href.setAttribute("href", matchingOemPartNumber.url); 2154 href.setAttribute("title", matchingOemPartNumber.title); 2155 href.className= 'flex-row align-items-center result-item'; 2156 2157 // add icon if exists 2158 /* if(matchingOemPartNumber.oemPartNumber){
2159 var spanOemImage = document.createElement("span"); 2160 spanOemImage.className = 'search-oem-icon'; 2161 spanOemImage.style.backgroundImage = "url(/i/products_stamp/vpns/'"+ matchingOemPartNumber.icon+"'.jpg)"; 2162 href.appendChild(spanOemImage); 2163 } */ 2164 2165 var spanHighlightedTitle = document.createElement("span"); 2166 spanHighlightedTitle.innerHTML = matchingOemPartNumber.highlightedTitle; 2167 spanHighlightedTitle.className = 'search-result-text'; 2168 var spanRange = document.createElement("span"); 2169 spanRange.innerHTML = " ("+ matchingOemPartNumber.matchingManufacturerText +")"; 2170 spanRange.className = 'match-man-text'; 2171 href.appendChild(spanHighlightedTitle); 2172 href.appendChild(spanRange); 2173 li.appendChild(href); 2174 that.ui.resultList.append(li); 2175 }); 2176 } 2177 2178 this.renderBlocks(caller); 2179 addEventListeners(); 2180 } 2181 }, 2182 renderRecentSearchesAndRepeatSearch: function(debugCaller){ 2183 2184 if(this.settings.isDebugEnabled){ 2185 var caller = "renderRecentSearchesAndRepeatSearch"; 2186 if(this.settings.debugMode == 10 ){ 2187 console.log("DEBUG, liveSearch.renderRecentSearchesAndRepeatSearch, called from ", debugCaller); 2188 } 2189 } 2190 2191 2192 if(this.state.recentSearches && this.state.recentSearches.searchPhrases){ 2193 // Render repeat search 2194 this.ui.lastSearchPhrase.html(this.state.recentSearches.searchPhrases[0]); 2195 2196 // Render recent searches 2197 var recentSearchPhrasesCount = this.state.recentSearches.searchPhrases.length; 2198 var searchPhraseToRender = this.state.visibleRecentSearchPhrases === 0 ? this.settings.recentSearchPhrasesCount : this.state.visibleRecentSearchPhrases; 2199 // Empty ul 2200 this.ui.recentSearchesList.html(''); 2201 2202 if(recentSearchPhrasesCount <= searchPhraseToRender){ 2203 2204 this.ui.moreRecentBtn.addClass('hide'); 2205 // Render all available search terms 2206 for(var i=0; i < recentSearchPhrasesCount; i++){ 2207 var searchPhraseLi = document.createElement("li"); 2208 var searchPhraseSpan= document.createElement("span"); 2209 searchPhraseSpan.className = "search-term"; 2210 searchPhraseSpan.setAttribute('index',i); 2211 searchPhraseSpan.innerHTML = this.state.recentSearches.searchPhrases[i]; 2212 searchPhraseLi.append(searchPhraseSpan); 2213 this.ui.recentSearchesList.append(searchPhraseLi); 2214 } 2215 }else{ 2216 // Render search terms 2217 this.state.visibleRecentSearchPhrases = searchPhraseToRender; 2218 for(var i=0; i < searchPhraseToRender; i++){ 2219 var searchPhraseLi = document.createElement("li"); 2220 var searchPhraseSpan= document.createElement("span"); 2221 searchPhraseSpan.className = "search-term"; 2222 searchPhraseSpan.setAttribute('index',i); 2223 searchPhraseSpan.innerHTML = this.state.recentSearches.searchPhrases[i]; 2224 searchTesearchPhraseLirmLi.append(searchPhraseSpan); 2225 this.ui.recentSearchesList.append(searchPhraseLi); 2226 } 2227 } 2228 } 2229 addEventListeners(); 2230 }, 2231 viewMoreRecentSearches: function(debugCaller){ 2232 if(this.settings.isDebugEnabled){ 2233 var caller = "viewMoreRecentSearches"; 2234 if(this.settings.debugMode == 10 ){ 2235 console.log("DEBUG, liveSearch.viewMoreRecentSearches, called from ", debugCaller); 2236 } 2237 } 2238 2239 2240 var recentSearchPhrasesCount = this.state.recentSearches.searchPhrases.length; 2241 var searchPhrasesToRender = this.state.visibleRecentSearchPhrases + this.settings.recentSearchPhrasesCount; 2242 if(recentSearchPhrasesCount < searchPhrasesToRender){ 2243 this.state.visibleRecentSearchPhrases = recentSearchPhrasesCount; 2244 }else { 2245 this.state.visibleRecentSearchPhrases = searchPhrasesToRender; 2246 } 2247 2248 this.renderRecentSearchesAndRepeatSearch(caller); 2249 }, 2250 resetTypingTimer: function(debugCaller){ 2251 if(this.settings.isDebugEnabled){ 2252 var caller = "resetTypingTimer"; 2253 if(this.settings.debugMode == 10 ){ 2254 console.log("DEBUG, liveSearch.resetTypingTimer, called from ", debugCaller); 2255 } 2256 } 2257 // Clear timeout timer 2258 this.clearTypingTimer(caller); 2259 var that = this; 2260 // Start timeout timer 2261 this.state.typingTimer = setTimeout(function(){ 2262 // After the timeout, clear the time interval timer 2263 // and do a final search 2264 that.clearTimeIntervalTimer(caller); 2265 that.doSearch(caller + " final"); 2266 that.clearTypingTimer(caller +" final"); 2267 }, this.state.doneTypingTimer); 2268 2269 }, 2270 startTimeIntervalAndBeginSearch: function(debugCaller){ 2271 if(this.settings.isDebugEnabled){ 2272 var caller = "startTimeIntervalAndBeginSearch"; 2273 if(this.settings.debugMode == 10 ){ 2274 console.log("DEBUG, liveSearch.startTimeIntervalAndBeginSearch, called from ", debugCaller); 2275 } 2276 } 2277 var that = this; 2278 this.state.timeInterval = setInterval(function(){ 2279 that.doSearch(caller); 2280 },this.state.timeIntervalTimer); 2281 }, 2282 clearTypingTimer: function(debugCaller){ 2283 if(this.settings.isDebugEnabled){ 2284 var caller = "clearTypingTimer"; 2285 if(this.settings.debugMode == 10 ){ 2286 console.log("DEBUG, liveSearch.clearTypingTimer, called from ", debugCaller); 2287 } 2288 } 2289 2290 clearTimeout(this.state.typingTimer, caller); 2291 this.state.typingTimer = null; 2292 }, 2293 clearTimeIntervalTimer:function(debugCaller){ 2294 if(this.settings.isDebugEnabled){ 2295 var caller = "clearTimeIntervalTimer"; 2296 if(this.settings.debugMode == 10 ){ 2297 console.log("DEBUG, liveSearch.clearTimeIntervalTimer,
2297called from ", debugCaller); 2298 } 2299 } 2300 2301 clearInterval(this.state.timeInterval); 2302 this.state.timeInterval = null; 2303 }, 2304 clearTimers: function(debugCaller){ 2305 if(this.settings.isDebugEnabled){ 2306 var caller = "clearTimers"; 2307 if(this.settings.debugMode == 10 ){ 2308 console.log("DEBUG, liveSearch.clearTimers, called from ", debugCaller); 2309 } 2310 } 2311 2312 clearInterval(this.state.timeInterval); 2313 clearTimeout(this.state.typingTimer); 2314 this.state.typingTimer = null; 2315 this.state.timeInterval = null; 2316 }, 2317 clearHideSearchPopUpTimer: function(debugCaller){ 2318 if(this.settings.isDebugEnabled && debugCaller){ 2319 var caller = "clearHideSearchPopUpTimer"; 2320 if(this.settings.debugMode == 10 ){ 2321 console.log("DEBUG, liveSearch.clearHideSearchPopUpTimer, called from ", debugCaller); 2322 } 2323 } 2324 2325 clearTimeout(this.state.hideSearchPopUpTimer, caller); 2326 this.state.hideSearchPopUpTimer = null; 2327 }, 2328 clearSearch: function(debugCaller){ 2329 if(this.settings.isDebugEnabled){ 2330 var caller = "clearSearch"; 2331 if(this.settings.debugMode == 10 ){ 2332 console.log("DEBUG, liveSearch.clearSearch, called from ", debugCaller); 2333 } 2334 } 2335 2336 this.clearTimers(caller); 2337 this.state.isSearchResultLoading = false; 2338 this.state.showSearchResults = false; 2339 this.state.resultFound = false; 2340 this.state.lastEndWordIndex = 0; 2341 this.state.splitedSearchPhrase = []; 2342 //this.hideSearchPopUp(); 2343 this.renderBlocks(caller); 2344 }, 2345 clearRecentSearches: function(debugCaller){ 2346 if(this.settings.isDebugEnabled){ 2347 var caller = "clearRecentSearches"; 2348 if(this.settings.debugMode == 10 ){ 2349 console.log("DEBUG, liveSearch.clearRecentSearches, called from ", debugCaller); 2350 } 2351 } 2352 2353 localStorage.removeItem(caller); 2354 this.state.visibleRecentSearchPhrases=0; 2355 this.state.recentSearches = undefined; 2356 this.renderRecentSearchesAndRepeatSearch(caller); 2357 this.renderBlocks(caller); 2358 }, 2359 repeatSearch: function(index, debugCaller){ 2360 if(this.settings.isDebugEnabled){ 2361 var caller = "repeatSearch"; 2362 if(this.settings.debugMode == 10 ){ 2363 console.log("DEBUG, liveSearch.repeatSearch, called from ", debugCaller); 2364 } 2365 } 2366 var searchPhrase =""; 2367 if(index === undefined){ 2368 searchPhrase = this.state.recentSearches.searchPhrases[0]; 2369 this.execute(searchPhrase, caller); 2370 }else{ 2371 searchPhrase = this.state.recentSearches.searchPhrases[index]; 2372 this.execute(searchPhrase, caller); 2373 } 2374 this.ui.searchBox.val(searchPhrase); 2375 }, 2376 refineSearch: function(filterItem, isChecked, debugCaller){ 2377 if(this.settings.isDebugEnabled){ 2378 var caller = "refineSearch"; 2379 if(this.settings.debugMode == 10 ){ 2380 console.log("DEBUG, liveSearch.refineSearch, called from ", debugCaller); 2381 } 2382 } 2383 2384 this.state[filterItem] = isChecked; 2385 2386 if(filterItem == 'filterModels'){ 2387 if(isChecked){ 2388 this.ui.resultList.find('.result-list-item.dev').removeClass('hide'); 2389 }else{ 2390 this.ui.resultList.find('.result-list-item.dev').addClass('hide'); 2391 } 2392 2393 } 2394 if(filterItem == 'filterProducts'){ 2395 if(isChecked){ 2396 this.ui.resultList.find('.result-list-item.oem').removeClass('hide'); 2397 }else{ 2398 this.ui.resultList.find('.result-list-item.oem').addClass('hide'); 2399 } 2400 } 2401 2402 this.renderBlocks(caller); 2403 }, 2404 checkForEndOfWord: function(debugCaller){ 2405 if(this.settings.isDebugEnabled){ 2406 var caller = "checkForEndOfWord"; 2407 if(this.settings.debugMode == 10 ){ 2408 console.log("DEBUG, liveSearch.checkForEndOfWord, called from ", debugCaller); 2409 } 2410 } 2411 // Rewrite this function 2412 var isEndOfWord=false; 2413 var separators = [' ']; //, '\\\.' 2414 var searchPhrase = this.state.searchPhrase; 2415 var splitedSearchPhrase = searchPhrase.replace(/\s\s+/g, ' ').split(new RegExp(separators.join('|'), 'g')); 2416 if(splitedSearchPhrase.length > 1 && this.state.lastEndWordIndex < splitedSearchPhrase.length){ 2417 this.state.lastEndWordIndex = splitedSearchPhrase.length; 2418 } 2419 return isEndOfWord; 2420 }, 2421 isSearchPhraseEmpty: function(debugCaller){ 2422 if(this.settings.isDebugEnabled){ 2423 var caller = "isSearchPhraseEmpty"; 2424 if(this.settings.debugMode == 10 ){ 2425 console.log("DEBUG, liveSearch.isSearchPhraseEmpty, called from ", debugCaller); 2426 } 2427 } 2428 2429 return this.state.originalSearchPhrase.trim() === ''; 2430 }, 2431 hasSearchPhraseWhiteSpace: function(debugCaller){ 2432 if(this.settings.isDebugEnabled){ 2433 var caller = "isSearchPhraseEmpty"; 2434 if(this.settings.debugMode == 10 ){ 2435 console.log("DEBUG, liveSearch.isSearchPhraseEmpty, called from ", debugCaller); 2436 } 2437 } 2438 var whitespaceRegex = /^\s+$/; 2439 return whitespaceRegex.test(this.state.originalSearchPhrase); 2440 }, 2441 addSearchPhrase: function(debugCaller){ 2442 if(this.settings.isDebugEnabled){ 2443 var caller = "addSearchPhrase"; 2444 if(this.settings.debugMode == 10 ){ 2445 console.log("DEBUG, liveSearch.addSearchPhrase, called from ", debugCaller); 2446 } 2447 } 2448 2449 // add item to array only if search term is not empty and it has results 2450 if(this.isSearchPhraseEmpty(caller) === false && this.state.resultFound){ 2451 // if recentSearches is undefined 2452 if(this.state.recentSearches === undefined){ 2453 // initialise recentSearches object and add search term 2454 this.state.recentSearches = {}; 2455 this.state.recentSearches.searchPhrases = []; 2456 this.state.recentSearches.searchPhrases.push(this.state.searchPhrase); 2457 } else { 2458 2459 if(!this.state.recentSearches.searchPhrases){ 2460 this.state.recentSearches.searchPhrases = []; 2461 } else { 2462 // find if search terms already exists in the array or not 2463 if(this.state.recentSearches.searchPhrases.includes(this.state.searchPhrase) === false){ 2464 // Add search term to the beginning 2465 this.state.recentSearches.searchPhrases.unshift(this.state.searchPhrase); 2466 }else { 2467 // Remove item from current position and add it to the beginning 2468 var index = this.state.recentSearches.searchPhrases.indexOf(this.state.searchPhrase); 2469 this.state.recentSearches.searchPhrases.splice(index, 1); 2470 this.state.recentSearches.searchPhrases.unshift(this.state.searchPhrase); 2471 } 2472 } 2473 } 2474 2475 if(this.state.recentSearches.searchPhrases.length == this.settings.recentSearchesLimit) 2476 this.state.recentSearches.searchPhrases.pop(); 2477 this.addRecentSearchesToLocalStorage(caller); 2478 } 2479 }, 2480 addRecentSearchesToLocalStorage: function(debugCaller){ 2481 if(this.settings.isDebugEnabled){ 2482 var caller = "addRecentSearchesToLocalStorage"; 2483 if(this.settings.debugMode == 10 ){ 2484 console.log("DEBUG, liveSearch.addRecentSearchesToLocalStorage, called from ", debugCaller); 2485 } 2486 } 2487 2488 localStorage.recentSearches = JSON.stringify(this.state.recentSearches); 2489 }, 2490 getRecentSearchesFromLocalStorage: function(debugCaller){ 2491 if(this.settings.isDebugEnabled){ 2492 var caller = "getRecentSearchesFromLocalStorage"; 2493 if(this.settings.debugMode == 10 ){ 2494 console.log("DEBUG, liveSearch.getRecentSearchesFromLocalStorage, called from ", debugCaller); 2495 } 2496 } 2497 2498 if(localStorage.recentSearches === undefined) 2499 return undefined; 2500 2501 return JSON.parse(localStorage.recentSearches); 2502 }, 2503 hideSearchPopUp: function(debugCaller){ 2504 if(this.settings.isDebugEnabled && debugCaller){ 2505 var caller = "hideSearchPopUp"; 2506 if(this.settings.debugMode == 10 ){ 2507 console.log("DEBUG, liveSearch.hideSearchPopUp, called from ", debugCaller); 2508 } 2509 } 2510 2511 var that = this; 2512 this.state.hideSearchPopUpTimer = setTimeout(function(){
2513 that.state.isSearchPopUpOpen = false; 2514 that.ui.searchBox.removeClass('open'); 2515 that.ui.dropDownSearch.removeClass('open'); 2516 }, that.settings.focusOutDelay); 2517 }, 2518 showSearchPopUp: function(debugCaller){ 2519 if(this.settings.isDebugEnabled && debugCaller){ 2520 var caller = "showSearchPopUp"; 2521 if(this.settings.debugMode == 10 ){ 2522 console.log("DEBUG, liveSearch.showSearchPopUp, called from ", debugCaller); 2523 } 2524 } 2525 2526 this.clearHideSearchPopUpTimer(); 2527 var that = this; 2528 this.state.hideSearchPopUpTimer = setTimeout(function(){ 2529 that.state.isSearchPopUpOpen = true; 2530 that.ui.searchBox.addClass('open'); 2531 that.ui.dropDownSearch.addClass('open'); 2532 }, that.settings.focusInDelay); 2533 }, 2534 generateToken: function(n, debugCaller) { 2535 var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 2536 var token = ''; 2537 for(var i = 0; i < n; i++) { 2538 token += chars[Math.floor(Math.random() * chars.length)]; 2539 } 2540 this.state.searchToken = token; 2541 if(this.settings.isDebugEnabled){ 2542 var caller = "generateToken"; 2543 if(this.settings.debugMode == 10 ){ 2544 console.log("DEBUG, liveSearch.generateToken, Token: ", token , ", called from ", debugCaller); 2545 } 2546 } 2547 return token; 2548 }, 2549 addLastSearchToken: function(debugCaller){ 2550 var token = this.state.searchToken; 2551 2552 if(this.settings.isDebugEnabled){ 2553 var caller = "addLastSearchToken"; 2554 if(this.settings.debugMode == 10 ){ 2555 console.log("DEBUG, liveSearch.addLastSearchToken, Token: ", this.state.searchToken , ", called from ", debugCaller); 2556 } 2557 } 2558 // Add token to the list 2559 this.state.lastSearchToken = token; 2560 }, 2561 setDebugMode: function( enabled, mode ){ 2562 this.settings.isDebugEnabled = enabled; 2563 this.settings.debugMode = mode; 2564 } 2565 }; 2566 2567 liveSearch.initialize(); 2568 2569 liveSearch.ui.searchBox.on("input", function(e) { 2570 var searchPhrase = $(this).val(); 2571 liveSearch.execute(searchPhrase); 2572 }); 2573 2574 liveSearch.ui.searchBox.on("click", function(e) { 2575 liveSearch.showSearchPopUp(); 2576 }); 2577 2578 liveSearch.ui.searchForm.on("mouseenter", function(){ 2579 if($(this).attr("class").includes("open")){ 2580 liveSearch.showSearchPopUp(); 2581 } 2582 }); 2583 2584 /* liveSearch.ui.searchForm.on("mouseleave", function(){ 2585 liveSearch.hideSearchPopUp(); 2586 }); */ 2587 2588 liveSearch.ui.dropDownSearch.on( "mouseenter", function() { 2589 liveSearch.showSearchPopUp(); 2590 }); 2591 liveSearch.ui.dropDownSearch.on( "mouseleave", function() { 2592 liveSearch.hideSearchPopUp(); 2593 }); 2594 2595 // liveSearch.ui.searchBox.focusin(function(){ 2596 // liveSearch.showSearchPopUp(); 2597 // }); 2598 2599 liveSearch.ui.closeBtn.click(function(){ 2600 liveSearch.hideSearchPopUp(); 2601 }); 2602 2603 liveSearch.ui.clearRecentSearchesLink.click(function(){ 2604 liveSearch.clearRecentSearches(); 2605 }); 2606 2607 liveSearch.ui.seeMoreBtn.click(function(e){ 2608 liveSearch.ui.searchForm.submit(); 2609 }); 2610 2611 liveSearch.ui.searchForm.submit(function(e){ 2612 liveSearch.addSearchPhrase(); 2613 }); 2614 2615 liveSearch.ui.repeatLastSearchLink.click(function(e){ 2616 e.preventDefault(); 2617 liveSearch.repeatSearch(); 2618 liveSearch.ui.searchBox.focus(); 2619 }); 2620 2621 liveSearch.ui.filetItemChk.change(function(e){ 2622 var filter = $(this).attr('filter'); 2623 var isChecked = $(this).is(':checked'); 2624 liveSearch.refineSearch(filter, isChecked); 2625 }); 2626 2627 // liveSearch.ui.moreRecentBtn.click(function(){ 2628 // liveSearch.viewMoreRecentSearches(); 2629 // }); 2630 2631 function addEventListeners(){ 2632 liveSearch.ui.recentSearchesList.find('.search-term').click(function(e){ 2633 var index = $(this).attr("index"); 2634 liveSearch.repeatSearch(index); 2635 liveSearch.ui.searchBox.focus(); 2636 });
2637 2638 liveSearch.ui.resultList.find('.result-item').click(function(e){ 2639 e.preventDefault(); 2640 var href = $(this).attr("href"); 2641 liveSearch.addSearchPhrase(); 2642 window.location.href = href; 2643 }); 2644 } 2645 2646 // $("#searchFrequency").change(function(){ 2647 // doneTypingTimer = 100 * $(this).val(); 2648 // $("#searchFrequencyLabel").html(doneTypingTimer); 2649 // }); 2650 2651</script>
2651 2652 2653 2654 </div> 2655 2656 </div> 2657 2658 2659 <div class="nav-right"> 2660 2661 2662 2663 2664 2665 2666 <div id="trusted-brand"> 2667 2668 </div> 2669 2670 </div> 2671 2672 2673 </div> 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703<nav class="navbar"> 2704 <div class="navbar-container"> 2705 <ul class="navbar-nav"> 2706 2707 <li class="nav-tab dropdown-fluid on-hover" id="1"> 2708 <a class="nav-tab-link icon-right" href="#">Batteries & Chargers by Device</a> 2709 <div class="nav-tab-item-panel"> 2710 <div class="nav-columns"> 2711 <div class="col"> 2712 <ul class="nav-column "> 2713 2714 2715 2716 2717 2718 2719 <li class="nav-item"> 2720 <a href="/laptop-notebook-battery-adapter-charger.html" class="nav-link" title="Laptop & Ultrabook <i>Battery or Adapter</i>">Laptop & Ultrabook <i>Battery or Adapter</i></a> 2721 </li> 2722 2723 2724 2725 2726 2727 2728 <li class="nav-item"> 2729 <a href="/digital-camera-battery-adapter-charger.html" class="nav-link" title="Digital Camera <i>Battery or Charger</i>">Digital Camera <i>Battery or Charger</i></a> 2730 </li> 2731 2732 2733 2734 2735 2736 2737 <li class="nav-item"> 2738 <a href="/camcorder-battery-adapter-charger.html" class="nav-link" title="Camcorder <i>Battery or Charger</i>">Camcorder <i>Battery or Charger</i></a> 2739 </li> 2740 2741 </ul> 2742 2743 2744 2745 </div> 2746 2747 <div class="col"> 2748 <ul class="nav-column "> 2749 2750 </ul> 2751 </div> 2752 2753 <div class="col"> 2754 <ul class="nav-column "> 2755 2756 </ul> 2757 </div> 2758 2759 <div class="col"> 2760 <ul class="nav-column "> 2761 2762 </ul> 2763 </div> 2764 </div> 2765 </div> 2766 </li> 2767 2768 2769 2770 <li class="nav-tab dropdown-fluid on-hover" id="2"> 2771 <a class="nav-tab-link icon-right" href="#">Household Batteries</a> 2772 <div class="nav-tab-item-panel"> 2773 <div class="nav-columns"> 2774 2775 <div class="col"> 2776 <ul class="nav-column "> 2777 <li class="nav-header"> 2778 <span>Alkaline Batteries</span> 2779 </li> 2780 2781 2782 2783 2784 2785 <!-- test 2 --> 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 <li class="nav-item"> 2796 <a href="/multi-purpose/aaa-alkaline-batteries.html" class="nav-link" title="AAA Alkaline">AAA Alkaline</a> 2797 </li> 2798 2799 2800 2801 2802 <!-- test 1 --> 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 <li class="nav-item"> 2813 <a href="/multi-purpose/aa-alkaline-batteries.html" class="nav-link" title="AA Alkaline">AA Alkaline</a> 2814 </li> 2815 2816 2817 2818 2819 <!-- test 8 --> 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 <li class="nav-item"> 2830 <a href="/multi-purpose/c-alkaline-batteries.html" class="nav-link" title="C Alkaline">C Alkaline</a> 2831 </li> 2832 2833 2834 2835 2836 <!-- test 9 --> 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 <li class="nav-item"> 2847 <a href="/multi-purpose/d-alkaline-batteries.html" class="nav-link" title="D Alkaline">D Alkaline</a> 2848 </li> 2849 2850 2851 2852 2853 <!-- test 11 --> 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 <li class="nav-item"> 2864 <a href="/multi-purpose/9v-alkaline-batteries.html" class="nav-link" title="9V Alkaline">9V Alkaline</a> 2865 </li> 2866 2867 2868 2869 2870 <!-- test --> 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 <li class="nav-item"> 2881 <a href="/multi-purpose/miscellaneous-alkaline-batteries.html" class="nav-link" title="Other Alkaline">Other Alkaline</a> 2882 </li> 2883 2884 2885 </ul> 2886 </div> 2887 2888 2889 2890 2891 2892 2893 2894 <div class="col"> 2895 <ul class="nav-column "> 2896 <li class="nav-header"> 2897 <span>Search by battery code or type</span> 2898 </li> 2899 <li class="nav-item"> 2900 <form action="/info/search.html" method="get" class="search-form-nav" autocomplete="off"> 2901 <div class="search-wrapper-input"> 2902 <input type="text" id="search-box-nav" class="input input-sm input-dark input-rou
2902nd" name="search" style="width:250px" autocomplete="off" placeholder="Example, DL2032"> 2903 <button type="submit" class="search-icon"> </button> 2904 </div> 2905 </form> 2906 </li> 2907 </ul> 2908 </div> 2909 2910 </div> 2911 </div> 2912 </li> 2913 2914 2915 2916 2917 2918 <!-- --> 2919 2920 2921 <li class="nav-tab dropdown-fluid country-tab toggle" id="5"> 2922 <a class="nav-tab-link" href="#">US</a> 2923 <div class="nav-tab-item-panel"> 2924 2925 <div class="nav-panel-top"> 2926 <span class="nav-panel-top-heading">Select your region and language</span> <span class="nav-panel-top-close" target="5">✖</span> 2927 </div> 2928 <div class="nav-columns"> 2929 <div class="col"> 2930 <ul class="nav-column "> 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941<!-- uriPrefix: --> 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 <!-- countryCode: GB --> 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 <li class="nav-item"> 3060 <a href="https://www.duracelldirect.co.uk/" class="nav-link" title="English"><span class="flag"><img src="/i/flag/64/gb.png"></span> <span class="currency">£</span> <span>English</span></a> 3061 </li> 3062 3063 <!-- countryCode: IT --> 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 <li class="nav-item"> 3091 <a href="https://www.duracelldirect.it/" class="nav-link" title="Italiano"><span class="flag"><img src="/i/flag/64/it.png"></span> <span class="currency">â¬</span> <span>Italiano</span></a> 3092 </li> 3093 3094 <!-- countryCode: FR --> 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 <li class="nav-item"> 3122 <a href="https://www.duracelldirect.fr/" class="nav-link" title="Français"><span class="flag"><img src="/i/flag/64/fr.png"></span> <span class="currency">â¬</span> <span>Français</span></a> 3123 </li> 3124 3125 <!-- countryCode: ES --> 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 <li class="nav-item"> 3153 <a href="https://www.duracelldirect.es/" class="nav-link" title="Español"><span class="flag"><img src="/i/flag/64/es.png"></span> <span class="currency">â¬</span> <span>Español</span></a> 3154 </li> 3155 3156 </ul> 3157 </div> 3158 3159 <div class="col"> 3160 <ul class="nav-column "> 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171<!-- uriPrefix: --> 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 <!-- countryCode: PT --> 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 <li class="nav-item"> 3290 <a href="https://www.duracelldirect.com.pt/" class="nav-link" title="Português"><span class="flag"><img src="/i/flag/64/pt.png"></span> <span class="currency">â¬</span> <span>Português</span></a> 3291 </li> 3292 3293 <!-- countryCode: IE --> 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 <li class="nav-item"> 3321 <a href="https://www.duracelldirect.ie/" class="nav-link" title="English"><span class="flag"><img src="/i/flag/64/ie.png"></span> <span class="currency">â¬</span> <span>English</span></a> 3322 </li> 3323 3324 <!-- countryCode: DE --> 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 <li class="nav-item"> 3352 <a href="https://www.duracelldirect.de/" class="nav-link" title="Deutsch"><span class="flag"><img src="/i/flag/64/de.png"></span> <span class="currency">â¬</span> <span>Deutsch</span></a> 3353 </li> 3354 3355 <!-- countryCode: NL --> 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 <li class="nav-item"> 3383 <a href="https://www.duracelldirect.nl/" class="nav-link" title="Nederlands"><span class="flag"><img src="/i/flag/64/nl.png"></span> <span class="currency">â¬</span> <span>Nederlands</span></a> 3384 </li> 3385 3386 </ul> 3387 </div> 3388 3389 <div class="col"> 3390 <ul class="nav-column "> 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401<!-- uriPrefix: --> 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 <!-- countryCode: FI --> 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 <li class="nav-item"> 3520 <a href="https://www.duracelldirect.fi/" class="nav-link" title="Suomeksi"><span class="flag"><img src="/i/flag/64/fi.png"></span> <span class="currency">â¬</span> <span>Suomeksi</span></a> 3521 </li> 3522 3523 <!-- countryCode: CHDE --> 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 <li class="nav-item"> 3551 <a href="https://www.duracelldirect.ch/de/" class="nav-link" title="Switzerland DE"><span class="flag"><img src="/i/flag/64/chde.png"></span> <span class="currency">CHF</span> <span>Switzerland DE</span></a> 3552 </li> 3553 3554 <!-- countryCode: CHFR --> 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 <li class="nav-item"> 3582 <a href="https://www.duracelldirect.ch/fr/" class="nav-link" title="Switzerland FR"><span class="flag"><img src="/i/flag/64/chfr.png"></span> <span class="currency">CHF</span> <span>Switzerland FR</span></a> 3583 </li> 3584 3585 <!-- countryCode: CHIT --> 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 <li class="nav-item"> 3613 <a href="https://www.duracelldirect.ch/it/" class="nav-link" title="Switzerland IT"><span class="flag"><img src="/i/flag/64/chit.png"></span> <span class="currency">CHF</span> <span>Switzerland IT</span></a> 3614 </li> 3615 3616 </ul> 3617 </div> 3618 3619 <div class="col"> 3620 <ul class="nav-column "> 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631<!-- uriPrefix: --> 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 <!-- countryCode: SE --> 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 <li class="nav-item"> 3750 <a href="https://www.duracelldirect.se/" class="nav-link" title="Svenska"><span class="flag"><img src="/i/flag/64/se.png"></span> <span class="currency">Kr</span> <span>Svenska</span></a> 3751 </li> 3752 3753 <!-- countryCode: CZ --> 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 <li class="nav-item"> 3781 <a href="https://www.duracelldirect.cz/" class="nav-link" title="ÄeÅ¡tina"><span class="flag"><img src="/i/flag/64/cz.png"></span> <span class="currency">KÄ</span> <span>ÄeÅ¡tina</span></a> 3782 </li> 3783 3784 <!-- countryCode: DK --> 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 <li class="nav-item"> 3812 <a href="https://www.duracelldirect.dk/" class="nav-link" title="Dansk"><span class="flag"><img src="/i/flag/64/dk.png"></span> <span class="currency">Kr</span> <span>Dansk</span></a> 3813 </li> 3814 3815 <!-- countryCode: NO --> 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 <li class="nav-item"> 3843 <a href="https://www.duracelldirect.no/" class="nav-link" title="Norsk"><span class="flag"><img src="/i/flag/64/no.png"></span> <span class="currency">Kr</span> <span>Norsk</span></a> 3844 </li> 3845 3846 </ul> 3847 </div> 3848 <div class="col"> 3849 <ul class="nav-column "> 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860<!-- uriPrefix: --> 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 <!-- countryCode: PL --> 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 <li class="nav-item"> 3979 <a href="https://www.duracelldirect.pl/" class="nav-link" title="Polski"><span class="flag"><img src="/i/flag/64/pl.png"></span> <span class="currency">ZÅ</span> <span>Polski</span></a> 3980 </li> 3981 3982 <!-- countryCode: AU --> 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 <li class="nav-item"> 4010 <a href="https://www.duracelldirect.com.au/" class="nav-link" title="Australia"><span class="flag"><img src="/i/flag/64/au.png"></span> <span class="currency">AU$</span> <span>Australia</span></a> 4011 </li> 4012 4013 </ul> 4014 </div> 4015 </div>
4016 </div> 4017 </li> 4018 4019 </ul> 4020 </div> 4021</nav> 4022
4023<script> 4024 4025 var navPanel = $(".nav-tab-item-panel.active"); 4026 var navTab = $(".nav-tab"); 4027 var navbar = $(".navbar"); 4028 var hideNavPanelTimeout = null; 4029 4030 $(".nav-panel-top-close").click(function(){ 4031 var tabId= $(this).attr("target"); 4032 $(".nav-tab#"+tabId).removeClass("active"); 4033 toggleHoverClass(); 4034 }); 4035 4036 $(".lang-selection").click(function(){ 4037 $(".nav-tab.country-tab").toggleClass("active"); 4038 toggleHoverClass(); 4039 }); 4040 4041 4042 4043 $(".nav-tab.toggle .nav-tab-link").click(function(){ 4044 cancelHideNavPanel("nav-tab-link"); 4045 var parent = $(this).parent(); 4046 var tabId = parent.attr("id"); 4047 $(".nav-tab").each(function(tab){ 4048 var tmpTabId = $(this).attr("id"); 4049 if(tmpTabId != tabId){ 4050 $(this).removeClass("active"); 4051 } 4052 }); 4053 parent.toggleClass("active"); 4054 }); 4055 4056 navPanel.mouseenter(function(){ 4057 cancelHideNavPanel("navPanel.mouseenter"); 4058 }); 4059 4060 navbar.mouseenter(function(){ 4061 cancelHideNavPanel("navbar.mouseenter"); 4062 }); 4063 4064 navPanel.mouseleave(function(){ 4065 hideNavPanel("navPanel.mouseleave"); 4066 }); 4067 4068 navbar.mouseleave(function(){ 4069 hideNavPanel("navbar.mouseleave"); 4070 }); 4071 4072 4073 $(".nav-tab").click(function(){ 4074 hideNavPanel("nav-tab.off-hover "); 4075 }); 4076 4077 function toggleHoverClass(){ 4078 $(".nav-tab.off-hover, .nav-tab.on-hover").each(function(){ 4079 $(this).toggleClass("on-hover off-hover"); 4080 }); 4081 } 4082 4083 function addHoverClass(){ 4084 $(".nav-tab.off-hover").each(function(){ 4085 $(this).removeClass("off-hover"); 4086 $(this).addClass("on-hover"); 4087 }); 4088 } 4089 4090 function hideNavPanel(caller){ 4091 hideNavPanelTimeout = setTimeout(function(){ 4092 navTab.removeClass("active"); 4093 addHoverClass(); 4094 }, 100); 4095 } 4096 4097 function cancelHideNavPanel(caller){ 4098 clearTimeout(hideNavPanelTimeout); 4099 } 4100 4101 4102 4103</script>
4103 4104 4105 4106 4107 4108 </div> 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132<div id="footer" class="mt-1"> 4133 <span class="dd-ruler"></span> 4134 <div class="bg-lighter-dark pb-2 "> 4135 <div class="container d-flex flex-row footer-top"> 4136 4137 <div class="flex-fill ml-3"> 4138 <h3 class="footer-title-top no-left-border">Follow Us</h3> 4139 <ul class="footer-ul-list" style="width: 150px;"> 4140 4141 4142 4143 4144 <li><a href="http://www.youtube.com/DuracellDirect" target="youtube" title="Duracell Youtube videos">Duracell Youtube videos</a></li> 4145 <!-- 4146 <li><a href="http://www.myspace.com/duracelldirect" target="myspace" title="Duracell Direct on MySpace">Duracell Direct on MySpace</a></li> --> 4147 4148 </ul> 4149 </div> 4150 <div class="flex-fill"> 4151 <h3 class="footer-title-top">Information</h3> 4152 <ul class="footer-ul-list"> 4153 4154 <li><a href="/info/about.html" title="About Duracell Direct">About Duracell Direct</a></li> 4155 4156 4157 <li><a href="/info/delivery.html#delivery" title="Delivery Information">Delivery Information</a></li> 4158 4159 <li><a href="/info/payment.html" title="Payment Options">Payment Options</a></li> 4160 4161 <li><a href="/info/cookie-policy.html" title="Cookie Policy">Cookie Policy</a></li> 4162 <li><a href="#" data-cookie-role="edit-cookie-consent">Change Cookie Settings</a></li> 4163 4164 <li><a href="#" data-cookie-role="edit-cookie-consent">Do Not Sell or Share My Personal Information</a></li> 4165 4166 <li> 4167 4168 4169 <a href="/info/privacy.html" title="Privacy Policy">Privacy Policy</a> 4170 </li> 4171 <li class="switchToMobile" style="display:none;"><a href="#" class="goToMobileSite" >View Our Mobile Site</a></li> 4172 </ul> 4173 </div> 4174 <div class="flex-fill"> 4175 <h3 class="footer-title-top">Customer Services</h3> 4176 <ul class="footer-ul-list"> 4177 4178 <li><a href="/info/contact.html" title="Contact Duracell Direct">Contact Duracell Direct</a></li> 4179 4180 <li><a href="/info/delivery.html#returns" title="Returns procedure">Returns procedure</a></li> 4181 4182 <li><a href="/info/terms.html" title="Terms and Conditions">Terms and Conditions</a></li> 4183 4184 <li><a href="/info/security.html" title="Secure Shopping">Secure Shopping</a></li> 4185 4186 <li><a href="/info/security.html" title="Privacy and Security">Privacy and Security</a></li> 4187 </ul> 4188 </div> 4189 <div class="flex-fill"> 4190 4191 <h3 class="footer-title-top">Advice Center</h3> 4192 <ul class="footer-ul-list" style="width: 130px;"> 4193 4194 <li><a href="/info/battery-recycling.html" title="Recycling Rechargeable Batteries">Recycling Rechargeable Batteries</a></li> 4195 </ul> 4196 4197 </div> 4198 </div> 4199 </div> 4200 4201 <div class=" bg-dark container-fluid"> 4202 <div class="container d-flex flex-row pt-1 pb-3"> 4203 <div class="flex-fill pl-3 pr-3" style="width:45%;"> 4204 4205 <h2 class="footer-title-bottom mb-05">Newsletter Sign Up</h2> 4206 <p class="text-white">Join our monthly newsletter to receive our latest promo codes and product offers.</p> 4207 4208 <input type="text" class="newsletter-signup-footer input input-rou
4208nd input-dark input-sm" style="width:360px;" placeholder="Enter your email" id="newsletter-signup-footer" readonly/> 4209 <!-- Begin MailChimp Signup Form --> 4210 4211 <div class="overlay overlay-popup for-mailchimp hidden" id="for-mailchimp"> 4212 <div class="popup-container dark pb-3"> 4213 <div id="mc_embed_signup" class="newsletter-signup-form-bottom clearfix"> 4214 <span id="subscribeClose" class="cancel_btn close-x" target="for-mailchimp" >X</span> 4215 <div class="mailchimp-form"> 4216 <div id="mailchimp-form-wrapper"> 4217 <p class="text mt-1">Please enter your email address and click the 'Sign Up' button.</p> 4218 <br> 4219 <div class="clearfix"> 4220 <div class="tooltip block" style="width:100%"> 4221 <input type="email" style="width:95%" name="EMAIL" class="required email input input-round input-dark" id="mce-EMAIL" placeholder="Email address" status="idle" field="email" validate="true"> 4222 <span class="tooltiptext left">The email address is invalid.<br> It should be similar to:<br><br> [email protected]<br><br>With no spaces. Please enter it again.</span> 4223 </div> 4224 </div> 4225 <div class="clearfix mt-2 mb-2" > 4226 <div class="tooltip block" style="width:50%"> 4227 <input type="text" style="width:90%" name="FNAME" class="input input-rou
4227nd input-dark float-left" id="mce-FNAME" placeholder="First Name" status="idle" field="email" validate="true"> 4228 <span class="tooltiptext left" style="top:35px;">You must enter a First Name</span> 4229 </div> 4230 <input type="text" style="width:42%" name="LNAME" class="input input-round input-dark float-right" id="mce-LNAME" placeholder="Family Name"> 4231 </div> 4232 <div class="mc-field-group mb-1" style="border:1px solid transparent; padding-top:.2em;"> 4233 4234 4235 4236 <div class="tooltip block d-flex"> 4237 <div class="mr-2"> 4238 <label class="switch"> 4239 <input type="checkbox" name="marketingEmailConsentValue" purpose="email_marketing" class="checkbox-large order-summary-checkboxes" id="footer-marketingEmailConsentPurpose" unchecked/> 4240 <span class="slider-toggle round"></span> 4241 <span class="on hidden">Yes</span> 4242 <span class="off">No</span> 4243 </label> 4244 </div> 4245 <div> 4246 <p style="font-size:13px;"> 4247 <span class="footer_email_marketing">Keep me updated by email about DuracellDirect discounts, promotions, competitions and more.</span> <a href="/info/privacy.html" class="dd-btn btn-link py-0" title="Privacy Policy">Privacy Policy</a> 4248 </p> 4249 </div> 4250 <span class="tooltiptext left" style="top:25px;">Please indicate that you accept the Terms and Conditions.</span> 4251 </div> 4252 </div> <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--> 4253 <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_4f39727ffcfa51d5e81a4eebd_5c37e7f37f" id="b_4f39727ffcfa51d5e81a4eebd_5c37e7f37f" tabindex="-1" value=""></div> 4254 <div class="subscribe_btn_wrapper clearfix"> 4255 4256 <input type="button" name="subscribe" style="width:46%;" class="dd-btn btn-secondary bold float-right" id="subscribe-btn" value="Sign Up"> 4257 </div> 4258 </div> 4259 </div> 4260 <div id="mailchimpResponse"> 4261 Thank you for subscribing! 4262 </div> 4263 </div> 4264 </div> 4265 </div> 4266 4267 </div> 4268 <div class="flex-fill pr-3"> 4269 4270 <h2 class="footer-title-bottom mb-05">Payment Methods</h2> 4271 <p class="text-white">We accept the following payment methods:</p> 4272 4273 <a href="/info/payment.html" title="Payment Options"> 4274 <span class="payments-footer"></span> 4275 </a> 4276 </div> 4277 </div> 4278 </div> 4279 4280 <div class="bg-lighter-dark pb-2"> 4281 4282 <p class="copyright"> 4283 DuracellDirect.com is operated by: PSA Parts Inc. 3500 South Dupont Highway, Dover, Delaware 19901, USA. Owned by the Duracell license: PSA Parts Ltd. London, SW19 2PX, UK.<br> 4284<small>Duracell is a registered trademark of Duracell U.S. Operations Inc., used under license. All rights reserved</small> 4285 </p> 4286 </div> 4287</div> 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 <div class="cookie-wrapper" id="cookieWrapperWithSettings" style="display:none;" data-cookie-role="cookie-consent-wrapper"> 4302 <div class="cookie-container" data-cookie-role="cookie-consent-container"> 4303 <div class="cookie-body row m-0"> 4304 4305 <div class="col-12 p-0"> 4306 <h2 class="cookie-heading">Your privacy settings</h2> 4307 </div> 4308 <div class="col-12 p-0"> 4309 4310 4311 4312 4313 4314 4315 4316 <p>This website uses cookies to perform essential website functions, improve user experience, tailor content and advertising, provide social sharing features, and to pay referrers as described in our <a href="/info/cookie-policy.html" target="_blank">Cookie Policy</a> and <a href="/info/privacy.html" target="_blank">Privacy Policy</a>.</p> 4317 <p>You can update your choices at any time via our <a href="/info/security.html" target="_blank">Privacy & Security</a> page.</p> 4318 4319 4320 <div class="cookie-settings mt-3"> 4321 <div class="cookie-control"> 4322 <div class="switch-wrapper"> 4323 <label class="switch"> 4324 <input type="checkbox" name="cookies-functional" class="checkbox-large cookie-consent-chck" value="essential" data-cookie-role="cookie-consent-checkbox" checked disabled> 4325 <span class="slider-toggle round disabled"></span> 4326 <span class="off">Req</span> 4327 </label> 4328 </div> 4329 <div> 4330 <b>Essential cookies</b> 4331 <p>Some technologies are required for core functions like user authentication, shopping checkout, site security, privacy, maintenance, and to make the site work correctly for browsing and payments. Without these cookies our services can not work correctly.</p> 4332 4333 </div> 4334 </div> 4335 <div class="cookie-control"> 4336 <div class="switch-wrapper"> 4337 <label class="switch"> 4338 <input type="checkbox" name="cookies-analytics" class="checkbox-large cookie-consent-chck" value="traffic_analytics" data-cookie-role="cookie-consent-checkbox" > 4339 <span class="slider-toggle round"></span> 4340 </label> 4341 </div> 4342 <div> 4343 <b>Performance/Analytics</b> 4344 <p>These cookies help us understand how visitors reach and interact with our website, products, and services on an individual basis. They allow us to analyze site usage, manage traffic, enable features like live chat, and tailor c
4344ontent to better meet your needs.</p> 4345 </div> 4346 </div> 4347 <div class="cookie-control"> 4348 <div class="switch-wrapper"> 4349 <label class="switch"> 4350 <input type="checkbox" name="cookies-advert" class="checkbox-large cookie-consent-chck" value="advert_effectiveness" data-cookie-role="cookie-consent-checkbox" > 4351 <span class="slider-toggle round"></span> 4352 </label> 4353 </div> 4354 <div> 4355 <b>Selling, Sharing, Targeted Advertising</b> 4356 <p style="white-space: pre-line;">This allows us and our advertising providers to show adverts more relevant to you, limit how often you see an advert and build a profile of your interests. Also to enable you to share our content socially if you wish. Our advertising providers may combine activity information they collect from our website with information they have collected elsewhere. Without this, the adverts you see will be less relevant. 4357 4358Disabling this option also ensures that your personal information is not shared or sold with third parties for advertising or retargeting purposes, in accordance with the California Consumer Privacy Act (CCPA).</p> 4359 </div> 4360 </div> 4361 4362 4363 <div class="mt-4"> 4364 <button id="cookies-accept-selected" class="dd-btn btn-sm btn-outline-secondary btn-padding-x cookie-accept-btn mr-1" data-type="selected" data-cookie-role="cookie-consent-btn-accept-selected">Accept selected</button> 4365 4366 4367 <button class="dd-btn btn-sm btn-outline-secondary btn-padding-x cookie-accept-btn mr-1" data-type="selected" data-cookie-role="cookie-consent-btn-decline-all">Decline All</button> 4368 4369 </div> 4370 </div> 4371 </div> 4372 4373 4374 </div> 4375 <div class="cookie-footer"> 4376 <a href="/info/cookie-policy.html" title="Cookie Policy" class="dd-btn-link btn-sm btn-outline-secondary btn-padding-x mr-1">Learn More</a> 4377 4378 <button id="cookies-accept-all" class="dd-btn btn-sm btn-primary btn-padding-x cookie-accept-btn" data-type="all" data-cookie-role="cookie-consent-btn-accept-all">Accept all</button> 4379 </div> 4380 </div> 4381</div> 4382 4383 4384 4385 4386 4387
4388<script> 4389 //console.log("User email : "); 4390 if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { 4391 $(".switchToMobile").show(); 4392 } 4393 4394 if(window.innerWidth < 1000){ 4395 $(".switchToMobile").show(); 4396 } 4397 4398 var marketingPermToken; 4399 var validUserSurrogate= "false"; 4400 var linkRoot = 'https://www.duracelldirect.com/'; 4401 var UIEmailInput= $("#mce-EMAIL"); 4402 var UIfooterEmailConsent= $("#footer-marketingEmailConsentPurpose"); 4403 var userData; 4404 4405 $(".goToMobileSite").on("tap click", function(e) { 4406 e.preventDefault(); 4407 setCookie("mobile", 1); 4408 window.location = document.getElementById('altMobileUrl').href; 4409 }); 4410 4411 function setCookie(key, value, timeToExpire) { 4412 var expires = new Date(); 4413 var time = timeToExpire || 31536000000; 4414 expires.setTime(expires.getTime() + time); 4415 document.cookie = key + '=' + value + '; expires=' + expires.toUTCString() + "; path=/"; 4416 } 4417 4418 $(".target-popup").click(function(){ 4419 var target = $(this).attr('target-popup'); 4420 $("#"+target).removeClass("hidden"); 4421 }); 4422 4423 $(".close-x").click(function(){ 4424 var target = $(this).attr('target-popup'); 4425 $("#"+target).addClass("hidden"); 4426 }); 4427 4428 $("#subscribeClose").click(function() { 4429 $(".overlay.for-mailchimp").addClass("hidden"); 4430 $("#mce-success-response").hide(); 4431 UIfooterEmailConsent.parent().parent().parent().find(".tooltiptext").css("display","none"); 4432 UIfooterEmailConsent.parent().parent().parent().parent().css("border","1px solid transparent") 4433 UIEmailInput.parent().find(".tooltiptext").css("display","none"); 4434 $("#mailchimp-form-wrapper").css("visibility" ,"visible"); 4435 $("#mailchimpResponse").hide(); 4436 $("#footer-marketingEmailConsentPurpose").parent().show(); 4437 resetSubsctiptionForm(); 4438 }); 4439 4440 function resetSubsctiptionForm(){ 4441 $("#mce-EMAIL").val(""); 4442 $("#mce-FNAME").val(""); 4443 $("#mce-LNAME").val(""); 4444 4445 if(UIfooterEmailConsent.prop("checked")){ 4446 toggleCheckbox(UIfooterEmailConsent); 4447 } 4448 } 4449 4450 $(".newsletter-signup-footer, #newsletterPromo").click(function(){ 4451 $(".overlay.for-mailchimp").removeClass("hidden"); 4452 getMarketingPermissionToken(); 4453 }); 4454 4455 4456 $("#subscribe-btn").click(function(){ 4457 if($("#b_4f39727ffcfa51d5e81a4eebd_5c37e7f37f").val() == ""){ 4458 $("#mce-success-response").hide(); 4459 $("#mce-error-response").hide(); 4460 //if email is incorect 4461 if(isValidEmail(UIEmailInput.val())){ 4462 //if name is not empty empty 4463 if($('#mce-FNAME').val() != "" ){ 4464 //if email marketing consent is cheched 4465 4466 if(UIfooterEmailConsent.prop("checked")){ 4467 //Subscribe 4468 var email=UIEmailInput.val(); 4469 var fname= $("#mce-FNAME").val(); 4470 var lname= $("#mce-LNAME").val(); 4471 var fullName=fname + " " + lname; 4472 4473 4474 mailchimpSubscribeAttempt(email,fname,lname,fullName); 4475 4476 if(validUserSurrogate == "true" && "" == $("#mce-EMAIL").val()){ 4477 //console.log(validUserSurrogate , "0"); 4478 sendConsentRequest("email_marketing","Keep me updated by email about DuracellDirect discounts, promotions, competitions and more.",true); 4479 } 4480 resetSubsctiptionForm(); 4481 $("#footer-marketingEmailConsentPurpose").parent().hide(); 4482 $("#mailchimp-form-wrapper").css("visibility" ,"hidden"); 4483 $("#mailchimpResponse").show(); 4484 }else{ 4485 //display message 4486 UIfooterEmailConsent.parent().parent().parent().find(".tooltiptext").css("display","block"); 4487 UIfooterEmailConsent.parent().parent().parent().parent().css("border","1px solid #d83f24cc") 4488 } 4489 }else{ 4490 $('#mce-FNAME').parent().find(".tooltiptext").css("display","block"); 4491 } 4492 }else{ 4493 //display message 4494 UIEmailInput.parent().find(".tooltiptext").css("display","block"); 4495 } 4496 } 4497 }); 4498 4499 4500 function makeMailchimpRequest(){ 4501 //console.log("makeMailchimpRequest called", userData); 4502 $.ajax({ 4503 url: "/e/Account?_action=UPDATE_SUBSCRIPTION_STATUS", 4504 type: "POST", 4505 async: true, 4506 data: userData 4507 }).done(function(response) { 4508 mailchimpResponse= JSON.parse(response); 4509 //console.log("Request success :" ,mailchimpResponse); 4510 }).error(function(response) { 4511 //console.log("Create error :" ,response); 4512 }); 4513 } 4514 4515 function setUserData(token,action,mcSubscription,mcPsaGpdr){ 4516 userData={ 4517 "marketing_permissionToken":marketingPermissionToken, 4518 "token":token, 4519 "email":"", 4520 "status":mcSubscription, 4521 "fname":"", 4522 "lname":"", 4523 "marketingPref":mcPsaGpdr, 4524 "site_name":"Duracell Direct USA", 4525 "cc":"21", 4526 "full_name":" ", 4527 "update_date":getDateAndTime(), 4528 "consent_message":"Keep me updated by email about DuracellDirect discounts, promotions, competitions and more.", 4529 "action":action 4530 } 4531 } 4532 4533 function getLatestUpdate(d1,d2,d3){ 4534 var mailchUpdateDate = new Date(d1); 4535 var mailchLastChange= new Date(d2); 4536 var dbLatestChange = new Date(d3); 4537 if(d3 != ""){ 4538 // if(d1 != ""){ 4539 // if(mailchUpdateDate > dbLatestChange){ 4540 // return "mailchimp" 4541 // }else{ 4542 // //compare mailchimp latest change to dbLatest change 4543 // if(mailchLastChange > dbLatestChange) 4544 // return "mailchimp" 4545 // return "localDB" 4546 // } 4547 // }else{ 4548 // //compare mailchimp latest change to dbLatest change 4549 // if(mailchLastChange > dbLatestChange) 4550 // return "mailchimp" 4551 // return "localDB" 4552 // } 4553 if(d2 !=""){ 4554 if(mailchLastChange > dbLatestChange) 4555 return "mailchimp"; 4556 return "localDB"; 4557 } 4558 return "localDB" 4559 } 4560 return "mailchimp"; 4561 } 4562 4563 function getCurrentConsentVal(){ 4564 return UImarketingEmailChk.prop("checked"); 4565 } 4566 4567 function toggleCheckbox(chk,active){ 4568 if(active){ 4569 chk.prop('checked', true); 4570 chk.parent().find(".on").removeClass("hidden"); 4571 chk.parent().find(".off").addClass("hidden"); 4572 }else if(!active){ 4573 chk.prop('checked', false); 4574 chk.parent().find(".on").addClass("hidden"); 4575 chk.parent().find(".off").removeClass("hidden"); 4576 } 4577 } 4578 4579 function getMarketingPermissionToken(){ 4580 $.ajax({
4581 url: "/e/Account?_action=GET_MARKETING_PERMISSION_TOKEN", 4582 type: "POST", 4583 async: true, 4584 data: {'marketingPermissionLabel':'Marketing Permission'} 4585 }).done(function(response) { 4586 marketingPermToken=response; 4587 //console.log(response); 4588 }).error(function(response) { 4589 //console.log(response); 4590 }); 4591 } 4592 4593 function mailchimpSubscribeAttempt(email,fname,lname,full_name){ 4594 4595 var dataRequest={ 4596 "marketing_permissionToken":marketingPermToken, 4597 "token":"", 4598 "email":email, 4599 "status":"subscribed", 4600 "fname":fname, 4601 "lname":lname, 4602 "marketingPref":true, 4603 "site_name":"Duracell Direct USA", 4604 "cc":"21", 4605 "full_name":full_name, 4606 "update_date":getDateAndTime(), 4607 "consent_message":"Keep me updated by email about DuracellDirect discounts, promotions, competitions and more.", 4608 "action":"CREATE" 4609 } 4610 //console.log("mailchimpSubscribeAttempt called", dataRequest); 4611 $.ajax({ 4612 url: "/e/Account?_action=UPDATE_SUBSCRIPTION_STATUS", 4613 type: "POST", 4614 async: true, 4615 data: dataRequest 4616 }).done(function(response) { 4617 requestOk = JSON.parse(response).requestOk; 4618 }).error(function(response) { 4619 requestOk = JSON.parse(response).requestOk; 4620 }); 4621 } 4622 4623 4624 4625 4626 UIEmailInput.focusout(function(){ 4627 UIEmailInput.parent().find(".tooltiptext").css("display","none"); 4628 }); 4629 UIfooterEmailConsent.change(function(){ 4630 UIfooterEmailConsent.parent().parent().parent().find(".tooltiptext").css("display","none"); 4631 UIfooterEmailConsent.parent().parent().parent().parent().css("border","1px solid transparent"); 4632 }); 4633
4634 $("#mce-FNAME").focusout(function(){ 4635 $('#mce-FNAME').parent().find(".tooltiptext").css("display","none"); 4636 }); 4637 4638 4639 function sendConsentRequest(purposeVal,consentStatementVal,consentVal) { 4640 //console.log("DEBUG sendConsentRequest:" , " purposeVal " + purposeVal + " consentStatementVal " + consentStatementVal + " consentVal " + consentVal); 4641 $.ajax({ 4642 url: "/e/Account?_action=UPDATE_CONSENT", 4643 type: "POST", 4644 async: true, 4645 data: {'purpose': purposeVal, 'consentStatement': consentStatementVal, 'consentValue': consentVal,'consentMethod':'website_checkbox'} 4646 }).done(function(response) { 4647 //console.log("Localdb status has been updated", response); 4648 4649 }).error(function(response) { 4650 }); 4651 } 4652 4653 function getDateAndTime(){ 4654 var d = new Date(); 4655 var date = (d.getMonth()+1) +"/"+ d.getDate() +"/"+d.getFullYear(); 4656 var time = d.getHours() + ":"+d.getMinutes(); 4657 return date + " " + time; 4658 } 4659 4660 function showCompetition() { 4661 $("#compFrame").load('/e/jsp/competition2/Competition.jsp'+ 4662 '?man='+encodeURIComponent('')+'&displayName='+encodeURIComponent('')); 4663 $("#compFrame").show(); 4664 } 4665</script>
4665 4666 4667 4668 4669 </div> 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680<noscript> 4681 <div class="noscript"> 4682 <div class="ctn"> 4683 <img src="/i/icons/alert.png" alt="Warning" width="93" height="130"/> 4684 <p><b>Javascript is disabled in your browser.</b></p> 4685 <p>It appears that you have JavaScript disabled. Our website requires JavaScript to function correctly. Please enable JavaScript to experience our website.</p> 4686 </div> 4687 </div> 4688</noscript> 4689
4690<script> 4691$(function() { 4692 if(document.URL.indexOf("enter=comp2")>-1) 4693 showCompetition(); 4694}); 4695</script>
4695 4696
4697<script type="text/javascript" src="/lib/js/dd-v18.js?v=1.0.4" ></script>
4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710<!-- BEGIN GCR Badge Code --> 4711 4712 4713 4714 4715<!-- END GCR Badge Code --> 4716 4717 4718 </body> 4719</html>
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.