1(function ($) { 2 if ($('form.product-calc-form').length > 0 || $('form.finishes-calc-form').length > 0) { 3 $(document).on('change', '#delivery_start', function () { 4 var current_start_date = $(this).val(); 5 var delivery_end = $('#delivery_end'); 6 if (current_start_date === '') { 7 delivery_end.find('option').prop('disabled', false); 8 } else { 9 $.each(delivery_end.find('option'), function () { 10 if ($(this).val() !== current_start_date) { 11 $(this).prop('disabled', true); 12 } else { 13 $(this).prop('selected', true); 14 delivery_end.val($(this).val()); 15 return false; 16 } 17 }); 18 } 19 }); 20 } 21})(jQuery); 22 23const FILES_MAX_SIZE = 15 * Math.pow(1024, 2); 24 25const bytes = (val) => { 26 const fmt = (n) => parseFloat(n.toFixed(2)) 27 return { 28 kb: () => fmt(Number(val) / 1024), 29 mb: () => fmt(Number(val) / Math.pow(1024, 2)), 30 } 31} 32 33const filesInit = (node) => { 34 /** @type {HTMLInputElement} */ 35 const input = node.querySelector('.c-files__input') 36 /** @type {HTMLDivElement} */ 37 const display = node.querySelector('.c-files__display') 38 /** @type {HTMLDivElement} */ 39 const sizeDisplay = node.querySelector('.c-files__current-size') 40 41 if (input === null || display === null) { 42 return 43 } 44 45 let size 46 let files = input.files 47 const render = (append = true) => { 48 if (append) { 49 appendToFileList(input, files, input.files) 50 } 51 files = input.files 52 53 display.innerHTML = '' 54 size = 0 55 for (let i = 0; i < input.files.length; i++) { 56 size += input.files[i].size 57 58 const row = document.createElement('div') 59 row.className = 'c-files__row' 60 61 const name = document.createElement('span') 62 name.className = 'c-files__name' 63 name.innerText = input.files[i].name 64 65 const sz = document.createElement('span') 66 sz.className = 'c-files__size' 67 sz.innerText = `${bytes(input.files[i].size).kb()}KB` 68 69 const remove = document.createElement('button') 70 remove.className = 'c-files__remove' 71 remove.type = 'button' 72 remove.innerHTML = '×' 73 remove.onclick = () => { 74 removeFileFromFileList(input, i) 75 render(false) 76 } 77 78 row.append(name, sz, remove) 79 display.appendChild(row) 80 } 81 82 sizeDisplay.innerText = bytes(size).mb().toString() 83 if (size > FILES_MAX_SIZE) { 84 input.dataset.ariaInvalid = 'true' 85 node.classList.add('invalid') 86 } else { 87 input.dataset.ariaInvalid = 'false' 88 node.classList.remove('invalid') 89 } 90 91 } 92 93 input.addEventListener('change', (e) => { 94 render() 95 }) 96 97 input.addEventListener('dragenter', () => { 98 input.classList.add('hover'); 99 }); 100 101 input.addEventListener('dragleave', () => { 102 input.classList.remove('hover'); 103 }); 104 105 input.addEventListener('drop', () => { 106 input.classList.remove('hover'); 107 }); 108} 109 110const removeFileFromFileList = (input, index) => { 111 const dt = new DataTransfer() 112 const {files} = input 113 114 for (let i = 0; i < files.length; i++) 115 if (index !== i) 116 dt.items.add(files[i]) 117 118 input.files = dt.files 119} 120 121const appendToFileList = (input, base, add) => { 122 const dt = new DataTransfer() 123 124 if (base) 125 for (let i = 0; i < base.length; i++) 126 dt.items.add(base[i]) 127 if (add) 128 for (let i = 0; i < add.length; i++) 129 dt.items.add(add[i]) 130 131 input.files = dt.files 132} 133 134window.addEventListener('DOMContentLoaded', () => { 135 const files = document.querySelectorAll('.c-files') 136 for (let i = 0; i < files.length; i++) { 137 filesInit(files[i]) 138 } 139}) 140 141jQuery(document).ready($ => { 142 sbjs.init() 143 144 function getQueryParam(key) { 145 const params = new URLSearchParams(window.location.search); 146 return params.get(key) || null 147 } 148 149 const a = {source: null, medium: null, campaign: null, referrer: null} 150 151 if (window.sbjs && window.sbjs.get) { 152 const current = window.sbjs.get.current || window.sbjs.get 153 if (current) { 154 a.source = current.src || null 155 a.medium = current.mdm || null 156 a.campaign = current.cmp || null 157 a.referrer = current.referrer || current.ref || null 158 } 159 } 160 161 if (!a.source) a.source = getQueryParam('utm_source') 162 if (!a.medium) a.medium = getQueryParam('utm_medium') 163 if (!a.campaign) a.campaign = getQueryParam('utm_campaign') 164 if (!a.referrer) a.referrer = document.referrer || null 165 166 window.sbjsSource = {} 167 for (const i in a) { 168 window.sbjsSource['_' + i] = a[i] 169 } 170})
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.