SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & Carry Case (2024)

SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & Carry Case (10)

by Edan

Original price List Price: $225.00

You Save: $17.65 -8%

Original price $225.00 - Original price $225.00

Original price List Price: $225.00

Current price $207.35

$207.35 - $207.35

Current price $207.35

| . /

*Must Purchase 1 for SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & Carry Case

The cart will thereforce automatically set Qty to 1 when you order this product

` : ''; const tigerCode = updateData.meta_tiger ? `

TIGER#: ${updateData.meta_tiger}

` : ''; productCodesParent.innerHTML = ` ${mfrCode} ${tigerCode} `; const productForm = document.querySelector('[data-product-form]'); const shippingBlock = document.querySelector('.product-block--shipping'); if (shippingBlock) { let leadTimeValue = ''; let backorderdate = ''; let defaultDate = false; let leadTimeEl = document.querySelector('.product-shipping'); let leadTimeProp1 = document.querySelector('[name="properties[Ships Out Within]"]'); let leadTimeProp2 = document.querySelector('[name="properties[Shipping Date By]"]'); let lowerLeadTimeValue = updateData.lead_time.toLowerCase().trim(); let priorityLeadTime = lowerLeadTimeValue === 'discontinued' || lowerLeadTimeValue === 'backorder' || lowerLeadTimeValue === 'call for availability'; if (priorityLeadTime && leadTimeEl) { if ((updateData.variant_policy === "deny" && updateData.inventory_management === "") || (updateData.inventory_management === "shopify" && updateData.variant_policy === "continue" && updateData.variant_qty < 1) || updateData.variant_qty < 1) { leadTimeEl.classList.add('product-shipping--out-of-stock'); } } else if (updateData.out_of_stock) { if (leadTimeEl) leadTimeEl.classList.add('product-shipping--out-of-stock'); } else { if (leadTimeEl) leadTimeEl.classList.remove('product-shipping--out-of-stock'); } if (updateData.lead_time && updateData.lead_time.toLowerCase().trim() === 'backorder' && updateData.backorderdate) { let components = updateData.backorderdate.split("-"); let date = new Date(components[0], components[1] - 1, components[2]); let year = date.getFullYear(); let month = (date.getMonth() + 1).toString(); let day = date.getDate().toString(); backorderdate = `${month}/${day}/${year}`; } //if (updateData.variant_policy === "continue" && updateData.variant_qty < 1) { // leadTimeValue = 'Backorder'; if (updateData.lead_time) { leadTimeValue = updateData.lead_time; } else { defaultDate = true; } const showHideAtc = (status, formGrid, profBlock) => { if (status === 'hide') { if (formGrid) formGrid.classList.add('hidden-atc'); if (profBlock) profBlock.classList.add('hidden-atc'); } else if (status === 'show') { if (formGrid) formGrid.classList.remove('hidden-atc'); if (profBlock) profBlock.classList.remove('hidden-atc'); } } const checkLeadTime = (string) => { const lowercaseString = string.toLowerCase(); let currentDate = Math.floor(Date.now()); let maxTime = Number(string.replaceAll(/[^0-9]/g, '')); let finalLeadTimeDate = false let seconds = ''; let leadTimeInStock = ''; if (string.includes('-')) { let stringArray = string.split('-'); maxTime = Number(stringArray[1].replaceAll(/[^0-9]/g, '')); } if (lowercaseString.includes('days') || lowercaseString.includes('day') || lowercaseString.includes('hours') || lowercaseString.includes('hour')) { if (lowercaseString.includes('hours') || lowercaseString.includes('hour')) { maxTime = maxTime / 24; } for (let i = 1; i <= maxTime; i++) { seconds = 86400 * i; let next_day = new Date(currentDate + seconds * 1000).getUTCDay(); if (next_day === 6 || next_day === 0) { maxTime++; } } seconds = maxTime*24*60*60*1000; } else if (lowercaseString.includes('weeks') || lowercaseString.includes('week')) { seconds = maxTime*7*24*60*60*1000; } if (lowercaseString.includes('24-48') || lowercaseString.includes('24 - 48')) { leadTimeInStock = 'IN STOCK'; } if (seconds !== '') { let final_day = new Date(currentDate + seconds).getUTCDay(); if (final_day === 6) { seconds = seconds + (2*86400000); } else if (final_day === 0) { seconds = seconds + 86400000; } const toTimestamp = currentDate + seconds; const options = { year: 'numeric', month: 'numeric', day: 'numeric' }; finalLeadTimeDate = new Date(toTimestamp).toLocaleDateString('en-US', options).replace(/\./g, '/'); } if (finalLeadTimeDate) { if (!leadTimeProp2) { leadTimeProp1.insertAdjacentHTML('afterend', ''); leadTimeProp2 = document.querySelector('[name="properties[Shipping Date By]"]'); } leadTimeProp2.value = finalLeadTimeDate; } else if (leadTimeProp2) { leadTimeProp2.remove(); } let freeShipEl = ''; if (updateData.free_shipping_tag) { freeShipEl = 'Free Shipping (USA)'; } const backorderSpan = leadTimeEl.querySelector('.backorder-span'); if (lowercaseString.includes('backorder')) { if (backorderSpan) backorderSpan.remove(); let backDate = ''; if (backorderdate) { backDate = '
Backordered until: ' + backorderdate + ''; } leadTimeEl.innerHTML = 'Ships Out Within: ' + leadTimeValue + backDate; } else if (lowercaseString.includes('discontinued')) { if (backorderSpan) backorderSpan.remove(); leadTimeEl.innerHTML = 'Discontinued'; } else if (lowercaseString.includes('call for availability')) { if (backorderSpan) backorderSpan.remove(); leadTimeEl.innerHTML = 'Call For Availability'; } else if (!lowercaseString.includes('backorder') && backorderSpan) { backorderSpan.remove(); leadTimeEl.innerHTML = leadTimeInStock + freeShipEl + ' Ships Out Within: ' + leadTimeValue; } else if (!lowercaseString.includes('backorder')) { leadTimeEl.innerHTML = leadTimeInStock + freeShipEl + ' Ships Out Within: ' + leadTimeValue; } if (finalLeadTimeDate) { leadTimeEl.insertAdjacentHTML("beforeend", `Shipping Date By: ${finalLeadTimeDate}`); } leadTimeProp1.value = leadTimeValue; } if (leadTimeValue && leadTimeValue !== '' && !leadTimeEl && !leadTimeProp1) { shippingBlock.insertAdjacentHTML('afterbegin', ''); leadTimeEl = document.querySelector('.product-shipping'); productForm.insertAdjacentHTML('afterbegin', ''); leadTimeProp1 = document.querySelector('[name="properties[Ships Out Within]"]'); if (leadTimeProp2) leadTimeProp2.remove(); checkLeadTime(leadTimeValue); } else if (leadTimeValue && leadTimeValue !== '') { checkLeadTime(leadTimeValue); } else if (parrentLeadTime !== null && leadTimeEl && leadTimeProp1) { leadTimeProp1.remove(); if (leadTimeProp2) leadTimeProp2.remove(); if (document.querySelector('.product-block--shipping')) document.querySelector('.product-block--shipping').innerHTML = parrentLeadTime; if (parrentLeadTimeProp1) productForm.insertAdjacentHTML('afterbegin', ``); if (parrentLeadTimeProp2) productForm.insertAdjacentHTML('afterbegin', ``); if (updateData.free_shipping_tag && !document.querySelector('.free-ship')) { document.querySelector('.product-block--shipping span:first-of-type').insertAdjacentHTML('afterend', 'Free Shipping (USA)'); } } else if (leadTimeEl && leadTimeProp1) { leadTimeEl.remove(); leadTimeProp1.remove(); if (leadTimeProp2) leadTimeProp2.remove(); } const formGrid = document.querySelector('.product-form__grid'); const profBlock = document.querySelector('.product-form__professional'); const lowerLeadTime = leadTimeValue.toLowerCase().trim(); if (lowerLeadTime && (lowerLeadTime === 'discontinued' || lowerLeadTime === 'backorder' || lowerLeadTime === 'call for availability')) { if (updateData.variant_policy === "deny" && updateData.inventory_management === "") { showHideAtc('hide',formGrid,profBlock); } else if (updateData.inventory_management === "shopify" && updateData.variant_policy === "continue" && updateData.variant_qty < 1) { showHideAtc('hide',formGrid,profBlock); } else if (updateData.inventory_management === "shopify" && updateData.variant_policy === "continue" && updateData.variant_qty > 0) { showHideAtc('show',formGrid,profBlock); } else if (updateData.variant_qty < 1) { showHideAtc('hide',formGrid,profBlock); } else if (updateData.variant_qty > 0) { showHideAtc('show',formGrid,profBlock); } } else { if (formGrid) formGrid.classList.remove('hidden-atc'); if (profBlock) profBlock.classList.remove('hidden-atc'); } } setTimeout(() => { variantDomInput.value = updateData.variant_id; },500) } } const base_product = { featured_media_id: "34143656804643", warranty: `<ul><li>2-Year warranty on the SD3 Series Ultrasonic Pocket Doppler main unit</li><li>1-Year warranty on the accessories or disposables</li></ul><p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>` } const productConfigurableConfig = [ { id: "8414150525219", sku: "EDASD3-Pro--02", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-pro-02.js", variant_id: "45299122831651", variant_policy: "deny", inventory_management: "", variant_qty: "-3", title: "SD3 Pro Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display, Rechargeable Battery, Audio Recorder & 2 MHz Probe w/ Carry Case", price: "35750", price_compare_at: "48978", meta_mfr: "SD3-Pro.02", meta_tiger: "TM110165", meta_min: "0", meta_max: "", lead_time: "24 - 48 Hours", backorderdate: "", meta_map: "335", meta_default: "", featured_media_id: "34143656509731", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 2 MHz Probe, Rechargeable Battery, Audio Recorder & Carry Case (SD3 Pro)", value_order: 5, color: "", image: "", }, ] },{ id: "8414145446179", sku: "EDASD3--02", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-02.js", variant_id: "45299114279203", variant_policy: "deny", inventory_management: "", variant_qty: "-7", title: "SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & 2 MHz Probe", price: "20735", price_compare_at: "22500", meta_mfr: "SD3.02", meta_tiger: "TM110155", meta_min: "0", meta_max: "", lead_time: "14 - 21 Business Days", backorderdate: "", meta_map: "195", meta_default: "", featured_media_id: "34143656771875", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 2 MHz Probe", value_order: 1, color: "", image: "", }, ] },{ id: "8414145773859", sku: "EDASD3--03", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-03.js", variant_id: "45299115032867", variant_policy: "deny", inventory_management: "", variant_qty: "-36", title: "SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & 3 MHz Probe", price: "20735", price_compare_at: "22500", meta_mfr: "SD3.03", meta_tiger: "TM110156", meta_min: "0", meta_max: "", lead_time: "14 - 21 Business Days", backorderdate: "", meta_map: "195", meta_default: "", featured_media_id: "34143656902947", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 3 MHz Probe", value_order: 2, color: "", image: "", }, ] },{ id: "8414148460835", sku: "EDASD3-Plus--02", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-plus-02.js", variant_id: "45299119227171", variant_policy: "deny", inventory_management: "", variant_qty: "-7", title: "SD3 Plus Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display, Rechargeable Battery & 2 MHz Probe w/ Carry Case", price: "27500", price_compare_at: "36575", meta_mfr: "SD3-Plus.02", meta_tiger: "TM110160", meta_min: "0", meta_max: "", lead_time: "24 - 48 Hours", backorderdate: "", meta_map: "275", meta_default: "262.5", featured_media_id: "34143656706339", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 2 MHz Probe, Rechargeable Battery & Carry Case (SD3 Plus)", value_order: 3, color: "", image: "", }, ] },{ id: "8414150820131", sku: "EDASD3-Pro--03", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-pro-03.js", variant_id: "45299123257635", variant_policy: "deny", inventory_management: "", variant_qty: "-7", title: "SD3 Pro Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display, Rechargeable Battery, Audio Recorder & 3 MHz Probe w/ Carry Case", price: "35750", price_compare_at: "48978", meta_mfr: "SD3-Pro.03", meta_tiger: "TM110166", meta_min: "0", meta_max: "", lead_time: "24 - 48 Hours", backorderdate: "", meta_map: "325", meta_default: "", featured_media_id: "34143656673571", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 3 MHz Probe, Rechargeable Battery, Audio Recorder & Carry Case (SD3 Pro)", value_order: 6, color: "", image: "", }, ] },{ id: "8414148919587", sku: "EDASD3-Plus--03", available: "true", product_url: "/products/sd3-ultrasonic-pocket-fetal-obstetric-doppler-w-oled-display-carry-case-edasd3-plus-03.js", variant_id: "45299120177443", variant_policy: "deny", inventory_management: "", variant_qty: "-28", title: "SD3 Plus Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display, Rechargeable Battery & 3 MHz Probe w/ Carry Case", price: "27500", price_compare_at: "36575", meta_mfr: "SD3-Plus.03", meta_tiger: "TM110161", meta_min: "0", meta_max: "", lead_time: "24 - 48 Hours", backorderdate: "", meta_map: "275", meta_default: "262.5", featured_media_id: "34143656444195", free_shipping_tag:false, is_kit: false, out_of_stock: false, warranty: "<p><b>Returns</b>: This is Product is not eligible for return. We take the responsibility to make sure itarrives in brand new working condition. Should your item arrive damaged, we will take full responsibility and replace the product at no cost to you.</p><p>For complete details of our return policy and process, please refer to our general <a href="/pages/return-policy" target="_blank">return policy page</a>.</p><p><b>Cancellations</b>: Items made to order, cannot be returned or canceled after production.</p>", options: [ { type: "select", name: "OPTIONS", input_order: 0, value: "Includes: 3 MHz Probe, Rechargeable Battery & Carry Case (SD3 Plus)", value_order: 4, color: "", image: "", }, ] }, ]; const rawOptions = productConfigurableConfig.map((item) => item.options).flat(2); const filteredOptions = rawOptions.reduce(function(lastValue, currentValue) { const optionGroupName = unescape(currentValue.name) let lastMapValue = lastValue.get(optionGroupName); if(lastMapValue) { lastMapValue.values[currentValue.value] = { order: currentValue.value_order, color: currentValue.color, image: currentValue.image, } lastValue.set(optionGroupName, lastMapValue); } else { lastValue.set(optionGroupName, { type: currentValue.type, name: optionGroupName, input_order: currentValue.input_order, values: { [currentValue.value]: { order: currentValue.value_order, color: currentValue.color, image: currentValue.image, } } }); } return lastValue; }, new Map()); const optionsArray = Array.from(filteredOptions).map(i=> i[1]); optionsArray.sort((a,b) => { if( a.input_order > b.input_order ) { return 1; } else { return -1 } }); function fillOptionMap(optionGroup, value) { const inputName = `${optionGroup}||${value}`; let productSet = optionsMap.get(inputName); if(!productSet) { productSet = []; } productConfigurableConfig.forEach(function(simpleProduct) { simpleProduct.options.forEach(function(opt) { if(unescape(opt.name) === optionGroup && unescape(opt.value) === value) { let isProductAvailable = true; if( simpleProduct.inventory_management === "shopify" && simpleProduct.variant_policy === "deny" && ( parseInt(simpleProduct.meta_min,10) > parseInt(simpleProduct.variant_qty,10) || parseInt(simpleProduct.variant_qty,10) < 1 ) ) { isProductAvailable = false; } if(simpleProduct.lead_time.toLowerCase() === "discontinued") { isProductAvailable = false; } productSet.push({ product: { id: simpleProduct.id, title: simpleProduct.title, options: simpleProduct.options.map((option)=> { return {...option, name: unescape(option.name), value: unescape(option.value)}; }) }, available: isProductAvailable }); } }); }); optionsMap.set(inputName, productSet); } function fillOptionMapGaps() { const allOptions = new Map(); optionsMap.forEach(function(item, name) { let inputData = name.split('||'); let inputName = inputData[0]; let inputValue = inputData[1]; const allOptionsContains = allOptions.get(inputName); if(allOptionsContains) { allOptionsContains.push(inputValue); allOptions.set(inputName, allOptionsContains); } else { allOptions.set(inputName, [inputValue]); } }); const optionsNames = Array.from(allOptions).map((i)=>i[0]); const searchingValuesSets = []; let setNumber = 0; const option1 = filteredOptions.get(optionsNames[0]); const option2 = filteredOptions.get(optionsNames[1]); const option3 = filteredOptions.get(optionsNames[2]); const option4 = filteredOptions.get(optionsNames[3]); const option5 = filteredOptions.get(optionsNames[4]); const generateList = (option) => { if (option && option.values) { for (const property in option.values) { if(option.list) { option.list.push(property); } else { option.list = [property]; } } } } generateList(option1); option2 && generateList(option2); option3 && generateList(option3); option4 && generateList(option4); option5 && generateList(option5); const fillValuesSets = (setNumber, name, value) => { if(searchingValuesSets[setNumber]) { searchingValuesSets[setNumber].push({ name: unescape(name), value: unescape(value) }); } else { searchingValuesSets[setNumber] = [{ name: unescape(name), value: unescape(value) }]; } } if (option1 && option1.list) { for (let i0 = 0; i0 < option1.list.length; i0++) { if(!option2) { fillValuesSets(setNumber, option1.name, option1.list[i0]); setNumber++; continue; } for (let i1 = 0; i1 < option2.list.length; i1++) { if(!option3) { fillValuesSets(setNumber, option1.name, option1.list[i0]); fillValuesSets(setNumber, option2.name, option2.list[i1]); setNumber++; continue; } for (let i2 = 0; i2 < option3.list.length; i2++) { if(!option4) { fillValuesSets(setNumber, option1.name, option1.list[i0]); fillValuesSets(setNumber, option2.name, option2.list[i1]); fillValuesSets(setNumber, option3.name, option3.list[i2]); setNumber++; continue; } for (let i3 = 0; i3 < option4.list.length; i3++) { if(!option5) { fillValuesSets(setNumber, option1.name, option1.list[i0]); fillValuesSets(setNumber, option2.name, option2.list[i1]); fillValuesSets(setNumber, option3.name, option3.list[i2]); fillValuesSets(setNumber, option4.name, option4.list[i3]); setNumber++; continue; } for (let i4 = 0; i4 < option5.list.length; i4++) { fillValuesSets(setNumber, option1.name, option1.list[i0]); fillValuesSets(setNumber, option2.name, option2.list[i1]); fillValuesSets(setNumber, option3.name, option3.list[i2]); fillValuesSets(setNumber, option4.name, option4.list[i3]); fillValuesSets(setNumber, option5.name, option5.list[i4]); setNumber++; } } } } } } optionsMap.forEach(function (values, key) { let inputData = key.split('||'); let inputName = inputData[0]; let inputValue = inputData[1]; const filledDataToSearch = values.map((i)=>i); searchingValuesSets.forEach(function (search) { if(search.findIndex((el) => el.name === inputName && el.value === inputValue) === -1) { return; } let isProductExists = false; filledDataToSearch.forEach(function (record) { let sameOptionProductExists = 0; search.forEach((opt)=> { if(record.product.options.findIndex((i)=> { return i.name===opt.name && i.value===opt.value }) !== -1) { sameOptionProductExists ++; } }); if(sameOptionProductExists === optionsNames.length) { isProductExists = true; } }); if(!isProductExists) { filledDataToSearch.push({ available: false, product: { id: null, options: search } }) } }); optionsMap.set(key, filledDataToSearch); }); } function updateInputStatuses() { let formOptions = product_options_form.elements; const selectedOptions = []; Array.from(formOptions).forEach((formInput)=> { if(formInput.nodeName === "SELECT") { Array.from(formInput).forEach((opt)=>{ opt.removeAttribute('is_disabled'); formInput.dispatchEvent(new Event('update')); if(opt.selected) { selectedOptions.push({ name: formInput.name, value: opt.value }); } }); } if(formInput.nodeName === "INPUT") { formInput.removeAttribute('is_disabled'); if(formInput.checked) { selectedOptions.push({ name: formInput.name, value: formInput.value }); } } }); optionsMap.forEach(function (item, name) { let inputData = name.split('||'); let inputName = inputData[0]; let input = formOptions[inputName]; if(selectedOptions.length) { const newItem = item.filter(function(el) { let validCount = selectedOptions.length; let valid = 0; let isFinished = false; selectedOptions.forEach((selectedOption)=>{ if(selectedOption.name !== inputName) { el.product.options.forEach((productOption)=>{ if(productOption.name === selectedOption.name && productOption.value === selectedOption.value) { valid++; } }); } else { isFinished = true } }); if(isFinished) { validCount--; } return valid === validCount; }); if(newItem.length) { item = newItem; } } let unavailable = item.every((i)=> { return !i.available; }); if(unavailable) { if(input.nodeName === "SELECT") { Array.from(input).forEach((selectOption) => { if(selectOption.value === unescape(inputData[1])) { selectOption.setAttribute('is_disabled', true); input.dispatchEvent(new Event('update')); } }) } if( input instanceof RadioNodeList ) { formOptions[inputData[0]].forEach((inputOption) => { if(inputOption.value === unescape(inputData[1])) { inputOption.setAttribute('is_disabled', true); } }); } } }); } optionsArray.forEach(function(optionGroup) { let itemWrapper = ''; let itemOptions = ''; const options = []; for (let [key, value] of Object.entries(optionGroup.values)) { options.push({name: key, order: value.order, color: value.color, image: value.image}); } options.sort((a,b)=>a.order - b.order); options.forEach(function(option, index) { fillOptionMap(unescape(optionGroup.name), unescape(option.name)); let bgColor = '',dataColor = '', bgImage = '',dataImage = ''; if(option.image) { dataImage = `data-image="${option.image}"`; bgImage = `background: url(${option.image}) no-repeat center center / cover;` } else if (option.color) { dataColor = `data-color="${option.color}"`; bgColor = `background-color: ${option.color};` } if(optionGroup.type === 'radio') itemOptions += `

${option.name}

`; if(optionGroup.type === 'select' || optionGroup.type === 'select-color') itemOptions += ``; if(optionGroup.type === 'radio-color') itemOptions += ``; }); if(optionGroup.type === 'radio') { itemWrapper += `

${itemOptions}

`; } if(optionGroup.type === 'select' || optionGroup.type === 'select-color') { itemWrapper += ` `; } if(optionGroup.type === 'radio-color') { itemWrapper += `

${itemOptions}

`; } optionsDom += `

${optionGroup.name}

${itemWrapper}

`; }); fillOptionMapGaps(); let productOptionGroup; if(optionsArray.length) { product_options_form.innerHTML = `

${optionsDom}

`; productOptionGroup = product_options_form.querySelectorAll('.product-info-group:not(.product-info-group_addons)'); const colorSelectList = document.querySelectorAll('[data-image-select]:not(._initialized)') if(colorSelectList) colorSelectList.forEach(function(item) { new CustomSelect(item); }); if(optionsArray.length > 1) { //Adding reset button const resetContainer = document.createElement('div'); resetContainer.classList.add('product-options__reset'); const resetButton = document.createElement('button'); resetButton.type = 'button'; resetButton.classList.add('product-options__reset-btn'); resetButton.textContent = 'Clear selection'; resetButton.addEventListener('click', function () { Array.from(product_options_form.elements).forEach((input) => { if(input.type === 'radio') { input.checked = false; input.dispatchEvent(new Event('change')); } if(input.nodeName === "SELECT") { input.value = ""; input.dispatchEvent(new Event('update')); input.dispatchEvent(new Event('change')); } }); document.querySelectorAll('.product-info-group__clear-btn').forEach(function (item) { item.classList.remove('_active'); }); const selectedImage = document.querySelector(`[data-media="${base_product.featured_media_id}"]`) const selectedImageIndex = selectedImage.dataset.galleryIndex; if(selectedImage) document.querySelector('[data-product-gallery]')?.instance?._selectMediaByIndex(selectedImageIndex, true); }); resetContainer.append(resetButton) product_options_form.append(resetContainer); } } else { product_options_form.innerHTML = ''; } const checkAllOptionGroup = () => { if (productOptionGroup) { let optionArray = []; productOptionGroup.forEach((el) => { el.querySelectorAll('input').forEach((input) => { if (input.checked === true) optionArray.push(true); }) if (el.querySelector('select') && el.querySelector('select').value !== '') optionArray.push(true); }) if (optionArray.length === productOptionGroup.length) { return true; } return false; } return true; } Array.from(product_options_form).forEach(function(field){ field.addEventListener('change', () => { updateInputStatuses(); if (checkAllOptionGroup()) { updateInfo(product_options_form, productConfigurableConfig); } if(field.nodeName === "SELECT") { if(field.classList.contains('select-picker')) { if(field.nextElementSibling) { field.nextElementSibling.classList.add('_active'); field.classList.add('_active'); } } else { if(field.parentNode.nextElementSibling) { field.parentNode.nextElementSibling.classList.add('_active'); field.classList.add('_active'); } } } }); }); updateInputStatuses(); if (querySelectedVariant && document.querySelector('.product-main_bundle')) { let selected = null; selected = productConfigurableConfig.find((i) => i.variant_id == querySelectedVariant) if (selected) { selected.options.forEach((option) => { const replacedName = unescape(option.name); if (product_options_form.elements[replacedName]) { product_options_form.elements[replacedName].value = unescape(option.value); if( product_options_form.elements[replacedName].nodeName === "SELECT" ) { product_options_form.elements[replacedName].dispatchEvent(new Event('update')); } } }) } let waitForShopify = setInterval(function() { if(Shopify && window.updatePrice) { if (prodOptions) { document.querySelector('[data-product-form] [data-bundle-atc]').classList.remove('is-disabled'); let sticky_atc = document.querySelector('.product-sticky-atc__atc .product-form--atc-button'); if(sticky_atc) { sticky_atc.classList.remove('is-disabled'); } } clearInterval(waitForShopify); updateInfo(product_options_form, productConfigurableConfig); } },100); } const product_options_group = document.querySelectorAll('.product-info-group:not(.product-info-group_addons) input, .product-info-group:not(.product-info-group_addons) select'); const dropdown_item = document.querySelectorAll('.product-info-group .image-select-dropdown__item'); const removeError = (field) => { const groupError = field.closest('.product-info-group:not(.product-info-group_addons)').querySelector('.product-info-group__error'); if (groupError) { groupError.remove(); } } product_options_group.forEach(function(field){ field.addEventListener('change', () => { removeError(field) }); }); dropdown_item.forEach(function(field){ field.addEventListener('click', () => { removeError(field) }); }); const tadioColorTabs = document.querySelectorAll('.option-colors__option'); const radioTabs = document.querySelectorAll('.option-tabs__option'); radioTabs.forEach((i)=>{ const input = i.querySelector('.option-tabs__input'); i.addEventListener('click', function(event) { event.stopPropagation(); event.preventDefault(); if(!input.disabled && !input.hasAttribute('is_disabled')) { input.checked = !input.checked; input.dispatchEvent(new Event('change')); } }); }); tadioColorTabs.forEach((i)=>{ const input = i.querySelector('.option-colors__input'); i.addEventListener('click', function(event) { event.stopPropagation(); event.preventDefault(); if(!input.disabled && !input.hasAttribute('is_disabled')) { input.checked = !input.checked; input.dispatchEvent(new Event('change')); } }); }); document.querySelectorAll('.product-info-group__clear-btn').forEach((i)=>{ const select = i.parentNode.querySelector('select'); i.addEventListener('click', function() { select.value = ''; select.dispatchEvent(new Event('change')); i.classList.remove('_active'); i.previousElementSibling.classList.remove('_active'); }); }); });

IN STOCK Ships Out Within: 24 - 48 Hours Shipping Date By: 12/3/2024

Documents

Brochure Product Video

SD3 Ultrasonic Pocket Fetal Obstetric Doppler w/ OLED Display & Carry Case (2024)

References

Top Articles
Latest Posts
Recommended Articles
Article information

Author: Kelle Weber

Last Updated:

Views: 6516

Rating: 4.2 / 5 (53 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Kelle Weber

Birthday: 2000-08-05

Address: 6796 Juan Square, Markfort, MN 58988

Phone: +8215934114615

Job: Hospitality Director

Hobby: tabletop games, Foreign language learning, Leather crafting, Horseback riding, Swimming, Knapping, Handball

Introduction: My name is Kelle Weber, I am a magnificent, enchanting, fair, joyous, light, determined, joyous person who loves writing and wants to share my knowledge and understanding with you.