Skip to content
// Rebuilt on 2026-07-17 // Includes: HK master script + pneumatic 3000 + pneumatic 4000 + pneumatic 5000 // ===== START APC PRODUCT PAGES SCRIPT.js ===== function initApProductPage(wrap) { if (!wrap || wrap.dataset.apInit === 'true') return false; var pageKey = wrap.getAttribute('data-ap-page') || 'hk-steel'; var PAGE_CONFIGS = { 'hk-steel': { socketMap: {'1H11':['1H11','1H11118','1H11143','1H11192','1H11NV','1H11SL','1H11VAA'],'1H4':['1H4','1H4143','1H4192','1H4VAA143'],'2H16':['2H16','2H16115','2H16118','2H16143','2H16146','2H16192','2H16235','2H16HVS118','2H16HVS143','2H16HVS146','2H16NV','2H16NV143','2H16S14','2H16SL','2H16VAA'],'2H16BS':['2H16BS','2H16BS115','2H16BS118','2H16BS143','2H16BS192'],'2H6':['2H6','2H6118','2H6143','2H6192'],'3H21':['3H21','3H21115','3H21118','3H21143','3H21192','3H21AA','3H21C','3H21C143','3H21NKS','3H21NV','3H21SL'],'3H21BS':['3H21BS','3H21BS143','3H21BS192','3H21BS236'],'3H8':['3H8','3H8118','3H8C','3H8C143'],'4HP10':['4HP10','4HP10143'],'4HP26':['4HP26','4HP26118','4HP26143','4HP26192','4HP26NV','4HP26NV143','4HP26S13','4HP26S14','4HP26SL','4HP26VAA'],'4HP26BS':['4HP26BS','4HP26BS143','4HP26BS192','4HP26BS236','4HP26BSSL143','4HP26BSVAA','4HP26VAASL236'],'6HP12':['6HP12','6HP12143'],'6HP31':['6HP31','6HP31118','6HP31143','6HP31146','6HP31192','6HP31NV','6HP31S1','6HP31S12','6HP31S14','6HP31SL','6HP31VAA'],'6HP31BS':['6HP31BS','6HP31BS143','6HP31BS192','6HP31BSSL'],'8HP16':['8HP16','8HP16192','8HP16AA','8HP16NV'],'8HP36':['8HP36','8HP36115','8HP36143','8HP36146','8HP36192','8HP36NV','8HP36SL','8HP36SL143','8HP36VAA'],'8HP36BS':['8HP36BS','8HP36BS143','8HP36BS192','8HP36BSSL']}, plugMap: {'1K11':['1K11','1K11118','1K11143','1K11192','1K11BS','1K11VAA'],'1K4':['1K4','1K4143','1K4192','1K4VAA'],'2K16':['2K16','2K16115','2K16118','2K16143','2K16146','2K16192','2K16C','2K16C146','2K16CLLVHVS143','2K16HVS118','2K16HVS143','2K16HVS146','2K16NV','2K16VAA'],'2K16BS':['2K16BS','2K16BS115','2K16BS118','2K16BS143','2K16BS192','2K16BS235','2K16BSVAA'],'3K21':['3K21','3K21115','3K21118','3K21143','3K21192','3K21C','3K21C143','3K21CVAA','3K21NV','3K21VAA'],'3K21BS':['3K21BS','3K21BS118','3K21BS143','3K21BS192','3K21BS236'],'3K8':['3K8','3K8C143'],'4KP10':['4KP10','4KP10143'],'4KP26':['4KP26','4KP26115','4KP26118','4KP26143','4KP26146','4KP26192','4KP26NV','4KP26S6','4KP26SF','4KP26VAA','4KP26VB'],'4KP26BS':['4KP26BS','4KP26BS115','4KP26BS143','4KP26BS192','4KP26BS236'],'6KP12':['6KP12','6KP12143','6KP12192'],'6KP31':['6KP31','6KP31118','6KP31143','6KP31192','6KP31AA','6KP31NV','6KP31S1','6KP31S2','6KP31SF','6KP31VAA','6KP31VB'],'6KP31BS':['6KP31BS','6KP31BS115','6KP31BS143','6KP31BS192','6KP31BSHVS','6KP31BSHVS143'],'8KP16':['8KP16','8KP16192','8KP16AA'],'8KP36':['8KP36','8KP36115','8KP36143','8KP36146','8KP36192','8KP36NV','8KP36VAA'],'8KP36BS':['8KP36BS','8KP36BS115','8KP36BS129','8KP36BS143','8KP36BS192']}, largeSocketMap: {'10H41':['10H41','10H41143','10H41NV143','10H41SL'],'10H41BS':['10H41BS','10H41BS143','10H41BSSL'],'12H41':['12H41','12H41146','12H41C','12H41CSL','12H41LLV'],'12H46':['12H46','12H46143','12H46146','12H46C','12H46LLV242'],'20H51':['20H51'],'20H56':['20H56','20H56143','20H56NV236'],'20H61':['20H61','20H61NV']}, largePlugMap: {'10K41':['10K41'],'10K41BS':['10K41BS','10K41BS143','10K41BS192'],'12K41':['12K41','12K41143','12K41146','12K41C','12K41LLV'],'12K46':['12K46','12K46143','12K46C','12K46VAA146'],'12K46BS':['12K46BS'],'20K51':['20K51','20K51143'],'20K56':['20K56','20K56143'],'20K61':['20K61','20K61NV']}, socketSpecialValueFor: function(part){ if (part.indexOf('AA') > -1 && part.indexOf('VAA') === -1) return 'AA'; if (hasExactSpecialSuffix(part, ['S14'])) return 'S14'; if (hasExactSpecialSuffix(part, ['S13'])) return 'S13'; if (hasExactSpecialSuffix(part, ['S12'])) return 'S12'; if (hasExactSpecialSuffix(part, ['S1'])) return 'S1'; return ''; }, plugSpecialValueFor: function(part){ if (part.indexOf('AA') > -1 && part.indexOf('VAA') === -1) return 'AA'; if (hasExactSpecialSuffix(part, ['SF'])) return 'SF'; if (hasExactSpecialSuffix(part, ['S6'])) return 'S6'; if (hasExactSpecialSuffix(part, ['S2'])) return 'S2'; if (hasExactSpecialSuffix(part, ['S1'])) return 'S1'; return ''; } }, 'hk-brass': { socketMap: {'B1H11':['B1H11','B1H11118','B1H11143','B1H11192','B1H11NK','B1H11NKS','B1H11NV','B1H11SL'],'B1H4':['B1H4','B1H4NK192'],'B2H16':['B2H16','B2H16115','B2H16118','B2H16143','B2H16146','B2H16192','B2H16EN','B2H16HVS146','B2H16LLV','B2H16LLV146','B2H16NK','B2H16NV','B2H16SL','B2H16SL146','B2H16VAA','B2H16VAASL118','B2H16VAASL146'],'B2H16BS':['B2H16BS','B2H16BS115','B2H16BS143','B2H16BS146','B2H16BS192'],'B3H21':['B3H21','B3H21118','B3H21143','B3H21192','B3H21LLV146','B3H21NV','B3H21SL','B3H21Y','B3H21YSL'],'B3H21BS':['B3H21BS','B3H21BS115','B3H21BS143','B3H21BS146','B3H21BS192'],'B4HP26':['B4HP26','B4HP26118','B4HP26143','B4HP26146','B4HP26192','B4HP26236','B4HP26NK','B4HP26NV','B4HP26OC','B4HP26SL','B4HP26SL192','B4HP26VAA'],'B4HP26BS':['B4HP26BS','B4HP26BS115','B4HP26BS118','B4HP26BS143','B4HP26BS192','B4HP26BSSL'],'B6HP31':['B6HP31','B6HP31143','B6HP31192','B6HP31236','B6HP31NV','B6HP31OC','B6HP31SL','B6HP31SL192'],'B6HP31BS':['B6HP31BS','B6HP31BS143','B6HP31BS192'],'B8HP36':['B8HP36','B8HP36143','B8HP36146','B8HP36192','B8HP36236','B8HP36NVSL','B8HP36SL192','B8HP36VAA'],'B8HP36BS':['B8HP36BS','B8HP36BS143','B8HP36BS192','B8HP36BSSL143']}, plugMap: {'B1K11':['B1K11','B1K11118','B1K11143','B1K11192','B1K11NK','B1K11NKS','B1K11NV'],'B1K4':['B1K4'],'B2K16':['B2K16','B2K16115','B2K16118','B2K16143','B2K16146','B2K16192','B2K16EN','B2K16HVS118','B2K16HVS146','B2K16LLV','B2K16LLV146','B2K16LLV192','B2K16NK','B2K16NV','B2K16VB'],'B2K16BS':['B2K16BS','B2K16BS115','B2K16BS143','B2K16BSVB'],'B3K21':['B3K21','B3K21118','B3K21143','B3K21192','B3K21LLV146','B3K21NV','B3K21OC'],'B3K21BS':['B3K21BS','B3K21BS115','B3K21BS143','B3K21BS146','B3K21BS192'],'B4KP26':['B4KP26','B4KP26118','B4KP26143','B4KP26146','B4KP26192','B4KP26236','B4KP26NV','B4KP26OC','B4KP26VAA'],'B4KP26BS':['B4KP26BS','B4KP26BS115','B4KP26BS143','B4KP26BS192','B4KP26BS236'],'B6KP31':['B6KP31','B6KP31143','B6KP31192','B6KP31236','B6KP31NV'],'B6KP31BS':['B6KP31BS','B6KP31BS143','B6KP31BS192'],'B8KP36':['B8KP36','B8KP36143','B8KP36146','B8KP36192','B8KP36NV'],'B8KP36BS':['B8KP36BS','B8KP36BS143','B8KP36BS192']}, largeSocketMap: {'B10H41':['B10H41','B10H41143'],'B10H41BS':['B10H41BS'],'B12H41':['B12H41','B12H41SL'],'B12H46':['B12H46','B12H46143','B12H46146','B12H46192','B12H46VAASL'],'B12H46BS':['B12H46BS'],'B20H51':['B20H51','B20H51143','B20H51SL146'],'B20H56':['B20H56'],'B20H61':['B20H61']}, largePlugMap: {'B10K41':['B10K41','B10K41143'],'B10K41BS':['B10K41BS'],'B12K41':['B12K41'],'B12K46':['B12K46','B12K46143','B12K46192','B12K46VAA'],'B12K46BS':['B12K46BS'],'B20K51':['B20K51','B20K51143'],'B20K56':['B20K56'],'B20K61':['B20K61']}, socketSpecialValueFor: function(part){ part = String(part || ''); if (part.indexOf('NKS') > -1) return 'NKS'; if (part.indexOf('NK') > -1) return 'NK'; if (part.indexOf('EN') > -1) return 'EN'; if (hasExactSpecialSuffix(part, ['Y']) || part.indexOf('YSL') > -1) return 'Y'; if (part.indexOf('OC') > -1) return 'OC'; return ''; }, plugSpecialValueFor: function(part){ part = String(part || ''); if (part.indexOf('NKS') > -1) return 'NKS'; if (part.indexOf('NK') > -1) return 'NK'; if (part.indexOf('EN') > -1) return 'EN'; if (part.indexOf('OC') > -1) return 'OC'; return ''; } }, 'hk-stainless': { socketMap: {'LL1H11':['LL1H11','LL1H11143','LL1H11NV','LL1H11SL'],'LL1H4':['LL1H4','LL1H4143'],'LL2H16':['LL2H16','LL2H16115','LL2H16143','LL2H16146','LL2H16192','LL2H16NV','LL2H16SL','LL2H16SL138','LL2H16SL143','LL2H16SL192','LL2H16VAA','LL2H16VAASL146'],'LL2H16BS':['LL2H16BS','LL2H16BS115','LL2H16BS143','LL2H16BS143OC','LL2H16BS192'],'LL2H6':['LL2H6','LL2H6192','LL2H6S5','LL2H6SL','LL2H6SL192'],'LL3H21':['LL3H21','LL3H21115','LL3H21118','LL3H21143','LL3H21192','LL3H21NV','LL3H21S11','LL3H21SL','LL3H21VAA143'],'LL3H21BS':['LL3H21BS','LL3H21BS115','LL3H21BS118','LL3H21BS143','LL3H21BS192','LL3H21BSSL','LL3H21BSVAA'],'LL3H8':['LL3H8','LL3H8115','LL3H8192'],'LL4HP10':['LL4HP10','LL4HP10SL192'],'LL4HP26':['LL4HP26','LL4HP26115','LL4HP26143','LL4HP26192','LL4HP26NV','LL4HP26NV143','LL4HP26OC','LL4HP26SL'],'LL4HP26BS':['LL4HP26BS','LL4HP26BS115','LL4HP26BS143','LL4HP26BS192','LL4HP26BS236','LL4HP26BS242','LL4HP26BS292'],'LL6HP12':['LL6HP12'],'LL6HP31':['LL6HP31','LL6HP31143','LL6HP31192','LL6HP31235','LL6HP31236','LL6HP31NV','LL6HP31SL','LL6HP31SL192'],'LL6HP31BS':['LL6HP31BS','LL6HP31BS115','LL6HP31BS143','LL6HP31BS192','LL6HP31BS235','LL6HP31BSVAASL143'],'LL8HP16':['LL8HP16','LL8HP16192','LL8HP16NVSL'],'LL8HP36':['LL8HP36','LL8HP36115','LL8HP36143','LL8HP36192','LL8HP36235','LL8HP36236','LL8HP36NV','LL8HP36NVSL','LL8HP36SL','LL8HP36SL143','LL8HP36SL192','LL8HP36VAA'],'LL8HP36BS':['LL8HP36BS','LL8HP36BS115','LL8HP36BS143','LL8HP36BS192']}, plugMap: {'LL1K11':['LL1K11','LL1K11143','LL1K11NV','LL1K11VAA'],'LL1K11BS':['LL1K11BS','LL1K11BS143'],'LL1K4':['LL1K4'],'LL2K16':['LL2K16','LL2K16115','LL2K16138','LL2K16143','LL2K16146','LL2K16192','LL2K16235','LL2K16NV','LL2K16VAA','LL2K16VB'],'LL2K16BS':['LL2K16BS','LL2K16BS118','LL2K16BS143','LL2K16BS192','LL2K16BSVAA'],'LL2K6':['LL2K6','LL2K6192'],'LL3K21':['LL3K21','LL3K21115','LL3K21143','LL3K21192','LL3K21NV','LL3K21VAA'],'LL3K21BS':['LL3K21BS','LL3K21BS115','LL3K21BS143','LL3K21BS192','LL3K21BSVAA'],'LL3K8':['LL3K8','LL3K8192'],'LL4KP10':['LL4KP10','LL4KP10143','LL4KP10VAA'],'LL4KP26':['LL4KP26','LL4KP26115','LL4KP26118','LL4KP26143','LL4KP26192','LL4KP26NV','LL4KP26OC','LL4KP26VAA'],'LL4KP26BS':['LL4KP26BS','LL4KP26BS115','LL4KP26BS143','LL4KP26BS192','LL4KP26BS236','LL4KP26BS242'],'LL6KP12':['LL6KP12','LL6KP12VAA'],'LL6KP31':['LL6KP31','LL6KP31143','LL6KP31192','LL6KP31235','LL6KP31236','LL6KP31NV','LL6KP31OC','LL6KP31S3','LL6KP31VAA'],'LL6KP31BS':['LL6KP31BS','LL6KP31BS115','LL6KP31BS143','LL6KP31BS192'],'LL8KP16':['LL8KP16','LL8KP16143','LL8KP16NV'],'LL8KP36':['LL8KP36','LL8KP36115','LL8KP36143','LL8KP36192','LL8KP36235','LL8KP36236','LL8KP36NV','LL8KP36VAA'],'LL8KP36BS':['LL8KP36BS','LL8KP36BS115','LL8KP36BS143','LL8KP36BS192','LL8KP36BS236']}, mlSocketMap: {'ML1H11':['ML1H11','ML1H11115','ML1H11143','ML1H11NV','ML1H11S1'],'ML2H16':['ML2H16','ML2H16115','ML2H16143','ML2H16146','ML2H16192','ML2H16235','ML2H16S1','ML2H16SL'],'ML2H16BS':['ML2H16BS','ML2H16BS143','ML2H16BS192','ML2H16BSNV'],'ML3H21':['ML3H21','ML3H21115','ML3H21118OC','ML3H21143','ML3H21146'],'ML3H21BS':['ML3H21BS','ML3H21BS115','ML3H21BS143'],'ML4HP26':['ML4HP26','ML4HP26143','ML4HP26192','ML4HP26235','ML4HP26NV','ML4HP26OC','ML4HP26VAA143'],'ML4HP26BS':['ML4HP26BS','ML4HP26BS115','ML4HP26BS143','ML4HP26BS192','ML4HP26BS242','ML4HP26BS292'],'ML6HP31':['ML6HP31','ML6HP31115','ML6HP31118','ML6HP31143','ML6HP31146','ML6HP31192'],'ML6HP31BS':['ML6HP31BS','ML6HP31BS115','ML6HP31BS143','ML6HP31BS192'],'ML8HP36':['ML8HP36','ML8HP36115','ML8HP36143','ML8HP36192','ML8HP36SL'],'ML8HP36BS':['ML8HP36BS','ML8HP36BS115','ML8HP36BS143','ML8HP36BS192','ML8HP36BSLLVAA143']}, mlPlugMap: {'ML1K11':['ML1K11'],'ML1K4':['ML1K4143'],'ML2K16':['ML2K16','ML2K16115','ML2K16143','ML2K16192','ML2K16235','ML2K16LLVAA','ML2K16S1'],'ML2K16BS':['ML2K16BS','ML2K16BS115','ML2K16BS143','ML2K16BS192'],'ML2K6':['ML2K6143'],'ML3K21':['ML3K21','ML3K21115','ML3K21118OC','ML3K21143','ML3K21192'],'ML3K21BS':['ML3K21BS','ML3K21BS115','ML3K21BS143'],'ML4KP26':['ML4KP26','ML4KP26143','ML4KP26192','ML4KP26NV','ML4KP26VAA'],'ML4KP26BS':['ML4KP26BS','ML4KP26BS115','ML4KP26BS143','ML4KP26BS192','ML4KP26BS242'],'ML6KP31':['ML6KP31','ML6KP31115','ML6KP31118','ML6KP31143','ML6KP31192','ML6KP31VAA'],'ML6KP31BS':['ML6KP31BS','ML6KP31BS115','ML6KP31BS143','ML6KP31BS192'],'ML8KP36':['ML8KP36','ML8KP36115','ML8KP36143','ML8KP36192'],'ML8KP36BS':['ML8KP36BS','ML8KP36BS115','ML8KP36BS143','ML8KP36BS146','ML8KP36BS192']}, largeSocketMap: {'LL10H41':['LL10H41','LL10H41192','LL10H41236'],'LL10H41BS':['LL10H41BS'],'LL12H41':['LL12H41','LL12H41VAA143','LL12H41VAA235'],'LL12H41BS':['LL12H41BS'],'LL12H46':['LL12H46','LL12H46143','LL12H46192'],'LL12H46BS':['LL12H46BS'],'LL20H51':['LL20H51','LL20H51143','LL20H51192','LL20H51236','LL20H51NV143','LL20H51NV143OC','LL20H51SL'],'LL20H56':['LL20H56NV143OC'],'LL20H61':['LL20H61']}, largePlugMap: {'LL10K41':['LL10K41','LL10K41192','LL10K41236'],'LL10K41BS':['LL10K41BS','LL10K41BS143'],'LL12K41':['LL12K41','LL12K41VAA235'],'LL12K41BS':['LL12K41BS'],'LL12K46':['LL12K46','LL12K46143','LL12K46192'],'LL12K46BS':['LL12K46BS','LL12K46BS143'],'LL20K51':['LL20K51','LL20K51236','LL20K51NV143','LL20K51VAA','LL20K51VAA143OC'],'LL20K56':['LL20K56NV143OC'],'LL20K61':['LL20K61']}, socketSpecialValueFor: function(part){ part = String(part || ''); if (part.indexOf('OC') > -1) return 'OC'; if (hasExactSpecialSuffix(part, ['S11'])) return 'S11'; if (hasExactSpecialSuffix(part, ['S5'])) return 'S5'; return ''; }, plugSpecialValueFor: function(part){ part = String(part || ''); if (hasExactSpecialSuffix(part, ['S3'])) return 'S3'; if (part.indexOf('OC') > -1) return 'OC'; return ''; }, mlSocketSpecialValueFor: function(part){ part = String(part || ''); if (part.indexOf('OC') > -1) return 'OC'; if (hasExactSpecialSuffix(part, ['S1'])) return 'S1'; return ''; }, mlPlugSpecialValueFor: function(part){ part = String(part || ''); if (part.indexOf('OC') > -1) return 'OC'; return ''; } } }; var config = PAGE_CONFIGS[pageKey] || PAGE_CONFIGS['hk-steel']; wrap.dataset.apInit = 'true'; var buttons = wrap.querySelectorAll('.ap-toggle-btn'); var panels = wrap.querySelectorAll('.ap-toggle-panel'); buttons.forEach(function(btn) { btn.addEventListener('click', function() { var target = this.getAttribute('data-target'); buttons.forEach(function(b) { b.classList.remove('is-active'); }); panels.forEach(function(p) { p.classList.remove('is-active'); }); this.classList.add('is-active'); var panel = wrap.querySelector('#' + target); if (panel) panel.classList.add('is-active'); }); }); var sealCodes = ['115','118','143','146','192','235','236','242','292','503']; function hasSeal(part) { part = String(part || ''); return sealCodes.some(function(code) { return part.slice(-code.length) === code || part.slice(-(code.length + 2)) === code + 'OC'; }); } function urlFor(part) { return 'https://airproductsusa.com/hansen-' + String(part).toLowerCase() + '/'; } function prep(sel) { var tbody = wrap.querySelector(sel); var rows = tbody ? Array.from(tbody.querySelectorAll('tr')).filter(function(r) { return r.dataset.part; }) : []; return { tbody: tbody, rows: rows.map(function(r) { return { part:r.dataset.part || '', body:r.dataset.body || '', thread:r.dataset.thread || '', html:r.outerHTML }; }) }; } function makeRow(base, part) { var temp = document.createElement('tbody'); temp.innerHTML = base.html; var row = temp.querySelector('tr'); var td = row ? row.querySelector('td') : null; if (td) td.innerHTML = '' + part + ''; return row; } function render(target, rows, matcher, showVars) { if (!target) return; var frag = document.createDocumentFragment(); rows.forEach(function(base) { var matches = matcher(base); if (!matches.length) return; var vars = showVars ? matches.filter(function(v) { return v !== base.part; }) : []; if (showVars && vars.length) vars.forEach(function(v) { frag.appendChild(makeRow(base, v)); }); else frag.appendChild(makeRow(base, base.part)); }); target.innerHTML = ''; target.appendChild(frag); } function getOptionMeta(select) { return select ? Array.from(select.options).map(function(option) { return { value: option.value, text: option.textContent }; }) : []; } function syncSelectOptions(select, meta, allowedValues) { if (!select || !meta || !meta.length) return; var allowed = new Set(['']); (allowedValues || []).forEach(function(value) { if (value !== undefined && value !== null && value !== '') allowed.add(String(value)); }); var current = select.value; select.innerHTML = ''; meta.forEach(function(item) { if (allowed.has(String(item.value || ''))) { var option = document.createElement('option'); option.value = item.value; option.textContent = item.text; select.appendChild(option); } }); if (allowed.has(String(current || ''))) select.value = current; else select.value = ''; var activeChoices = Array.from(allowed).filter(function(value) { return value !== ''; }); select.disabled = activeChoices.length <= 1; } function uniqueValues(items) { return Array.from(new Set(items.filter(function(item) { return item !== undefined && item !== null && item !== ''; }).map(String))); } function collectBaseValues(rows, matcher, omitKey, field) { var values = []; rows.forEach(function(base) { if (matcher(base, omitKey).length) values.push(base[field]); }); return uniqueValues(values); } function collectVariantValues(rows, matcher, omitKey, extractor) { var values = []; rows.forEach(function(base) { matcher(base, omitKey).forEach(function(part) { var value = extractor(part, base); if (Array.isArray(value)) values = values.concat(value); else values.push(value); }); }); return uniqueValues(values); } function sealValueFor(part, base) { if (part === base.part || !hasSeal(part)) return 'standard'; var match = sealCodes.find(function(code) { return String(part).endsWith(code) || String(part).endsWith(code + 'OC'); }); return match || ''; } function hasExactSpecialSuffix(part, suffixes) { part = String(part || ''); var seal = sealValueFor(part, { part: '' }); var core = seal && seal !== 'standard' ? part.slice(0, -seal.length) : part; return suffixes.some(function(suffix) { return core.slice(-suffix.length) === suffix; }); } function hasHighImpulseCode(part) { part = String(part || ''); var seal = sealValueFor(part, { part: '' }); var core = seal && seal !== 'standard' ? part.slice(0, -seal.length) : part; return core.slice(-1) === 'C' && core.slice(-2) !== 'OC'; } var socketSpecialValueFor = config.socketSpecialValueFor; var plugSpecialValueFor = config.plugSpecialValueFor; var socketMap = config.socketMap; var plugMap = config.plugMap; var largeSocketMap = config.largeSocketMap; var largePlugMap = config.largePlugMap; var sockets = prep('#ap-socket-tbody'); var plugs = prep('#ap-plug-tbody'); var largeSockets = prep('#ap-large-socket-tbody'); var largePlugs = prep('#ap-large-plug-tbody'); var s = wrap.querySelector('#ap-search'), b = wrap.querySelector('#ap-body'), t = wrap.querySelector('#ap-thread'), se = wrap.querySelector('#ap-seal'), sl = wrap.querySelector('#ap-sl'), hc = wrap.querySelector('#ap-c'), vv = wrap.querySelector('#ap-valve'), sp = wrap.querySelector('#ap-special'), sr = wrap.querySelector('#ap-reset'); var socketOptionMeta = { body: getOptionMeta(b), thread: getOptionMeta(t), seal: getOptionMeta(se), sl: getOptionMeta(sl), c: getOptionMeta(hc), valve: getOptionMeta(vv), special: getOptionMeta(sp) }; function socketMatches(base, omitKey) { var v = (socketMap[base.part] || [base.part]).slice(); var q = ((s && s.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && b && b.value && base.body !== b.value) v = []; if (omitKey !== 'thread' && t && t.value && base.thread !== t.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && se && se.value) v = se.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(se.value); }); if (omitKey !== 'sl' && sl && sl.value === 'yes') v = v.filter(function(x) { return x.indexOf('SL') > -1; }); if (omitKey !== 'sl' && sl && sl.value === 'no') v = v.filter(function(x) { return x.indexOf('SL') === -1; }); if (omitKey !== 'c' && hc && hc.value === 'yes') v = v.filter(function(x) { return hasHighImpulseCode(x); }); if (omitKey !== 'c' && hc && hc.value === 'no') v = v.filter(function(x) { return !(hasHighImpulseCode(x)); }); if (omitKey !== 'valve' && vv && vv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV') === -1 && x.indexOf('VAA') === -1 && x.indexOf('LLV') === -1 && x.indexOf('HVS') === -1; }); if (omitKey !== 'valve' && vv && vv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && vv && vv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); if (omitKey !== 'valve' && vv && vv.value === 'LLV') v = v.filter(function(x) { return x.indexOf('LLV') > -1; }); if (omitKey !== 'valve' && vv && vv.value === 'HVS') v = v.filter(function(x) { return x.indexOf('HVS') > -1; }); if (omitKey !== 'special' && sp && sp.value === 'AA') v = v.filter(function(x) { return x.indexOf('AA') > -1 && x.indexOf('VAA') === -1; }); if (omitKey !== 'special' && sp && sp.value === 'S1') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S1']); }); if (omitKey !== 'special' && sp && sp.value === 'S12') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S12']); }); if (omitKey !== 'special' && sp && sp.value === 'S13') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S13']); }); if (omitKey !== 'special' && sp && sp.value === 'S14') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S14']); }); if (omitKey !== 'special' && sp && sp.value === 'NK') v = v.filter(function(x) { return x.indexOf('NK') > -1 && x.indexOf('NKS') === -1; }); if (omitKey !== 'special' && sp && sp.value === 'NKS') v = v.filter(function(x) { return x.indexOf('NKS') > -1; }); if (omitKey !== 'special' && sp && sp.value === 'EN') v = v.filter(function(x) { return x.indexOf('EN') > -1; }); if (omitKey !== 'special' && sp && sp.value === 'Y') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['Y']) || x.indexOf('YSL') > -1; }); if (omitKey !== 'special' && sp && sp.value === 'OC') v = v.filter(function(x) { return x.indexOf('OC') > -1; }); return v; } function updateSocketSelects() { syncSelectOptions(b, socketOptionMeta.body, collectBaseValues(sockets.rows, socketMatches, 'body', 'body')); syncSelectOptions(t, socketOptionMeta.thread, collectBaseValues(sockets.rows, socketMatches, 'thread', 'thread')); syncSelectOptions(se, socketOptionMeta.seal, collectVariantValues(sockets.rows, socketMatches, 'seal', sealValueFor)); syncSelectOptions(sl, socketOptionMeta.sl, collectVariantValues(sockets.rows, socketMatches, 'sl', function(part) { return part.indexOf('SL') > -1 ? 'yes' : 'no'; })); if (hc) syncSelectOptions(hc, socketOptionMeta.c, collectVariantValues(sockets.rows, socketMatches, 'c', function(part) { return (hasHighImpulseCode(part)) ? 'yes' : 'no'; })); syncSelectOptions(vv, socketOptionMeta.valve, collectVariantValues(sockets.rows, socketMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('VAA') > -1) return 'VAA'; if (part.indexOf('LLV') > -1) return 'LLV'; if (part.indexOf('HVS') > -1) return 'HVS'; return 'standard'; })); syncSelectOptions(sp, socketOptionMeta.special, collectVariantValues(sockets.rows, socketMatches, 'special', socketSpecialValueFor)); } function filterSockets() { updateSocketSelects(); render(sockets.tbody, sockets.rows, socketMatches, !!(((s&&s.value)||'').trim() || (se&&se.value) || (sl&&sl.value) || (hc&&hc.value) || (vv&&vv.value) || (sp&&sp.value))); } if (sr) sr.addEventListener('click', function() { [s,b,t,se,sl,hc,vv,sp].forEach(function(el) { if(el) el.value=''; }); filterSockets(); }); [b,t,se,sl,hc,vv,sp].forEach(function(el) { if(el) el.addEventListener('change', filterSockets); }); if (s) s.addEventListener('input', filterSockets); var ps = wrap.querySelector('#ap-plug-search'), pb = wrap.querySelector('#ap-plug-body'), pt = wrap.querySelector('#ap-plug-thread'), pse = wrap.querySelector('#ap-plug-seal'), pc = wrap.querySelector('#ap-plug-c'), pv = wrap.querySelector('#ap-plug-valve'), psp = wrap.querySelector('#ap-plug-special'), pr = wrap.querySelector('#ap-plug-reset'); var plugOptionMeta = { body: getOptionMeta(pb), thread: getOptionMeta(pt), seal: getOptionMeta(pse), c: getOptionMeta(pc), valve: getOptionMeta(pv), special: getOptionMeta(psp) }; function plugMatches(base, omitKey) { var v = (plugMap[base.part] || [base.part]).slice(); var q = ((ps && ps.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && pb && pb.value && base.body !== pb.value) v = []; if (omitKey !== 'thread' && pt && pt.value && base.thread !== pt.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && pse && pse.value) v = pse.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(pse.value); }); if (omitKey !== 'c' && pc && pc.value === 'yes') v = v.filter(function(x) { return hasHighImpulseCode(x); }); if (omitKey !== 'c' && pc && pc.value === 'no') v = v.filter(function(x) { return !(hasHighImpulseCode(x)); }); if (omitKey !== 'valve' && pv && pv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV')===-1 && x.indexOf('LLV')===-1 && x.indexOf('VB')===-1 && x.indexOf('VAA')===-1 && x.indexOf('HVS')===-1; }); if (omitKey !== 'valve' && pv && pv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && pv && pv.value === 'LLV') v = v.filter(function(x) { return x.indexOf('LLV') > -1; }); if (omitKey !== 'valve' && pv && pv.value === 'VB') v = v.filter(function(x) { return x.indexOf('VB') > -1; }); if (omitKey !== 'valve' && pv && pv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); if (omitKey !== 'valve' && pv && pv.value === 'HVS') v = v.filter(function(x) { return x.indexOf('HVS') > -1; }); if (omitKey !== 'special' && psp && psp.value === 'AA') v = v.filter(function(x) { return x.indexOf('AA') > -1 && x.indexOf('VAA') === -1; }); if (omitKey !== 'special' && psp && psp.value === 'S1') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S1']); }); if (omitKey !== 'special' && psp && psp.value === 'S2') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S2']); }); if (omitKey !== 'special' && psp && psp.value === 'S6') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S6']); }); if (omitKey !== 'special' && psp && psp.value === 'SF') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['SF']); }); if (omitKey !== 'special' && psp && psp.value === 'NK') v = v.filter(function(x) { return x.indexOf('NK') > -1 && x.indexOf('NKS') === -1; }); if (omitKey !== 'special' && psp && psp.value === 'NKS') v = v.filter(function(x) { return x.indexOf('NKS') > -1; }); if (omitKey !== 'special' && psp && psp.value === 'EN') v = v.filter(function(x) { return x.indexOf('EN') > -1; }); if (omitKey !== 'special' && psp && psp.value === 'OC') v = v.filter(function(x) { return x.indexOf('OC') > -1; }); return v; } function updatePlugSelects() { syncSelectOptions(pb, plugOptionMeta.body, collectBaseValues(plugs.rows, plugMatches, 'body', 'body')); syncSelectOptions(pt, plugOptionMeta.thread, collectBaseValues(plugs.rows, plugMatches, 'thread', 'thread')); syncSelectOptions(pse, plugOptionMeta.seal, collectVariantValues(plugs.rows, plugMatches, 'seal', sealValueFor)); if (pc) syncSelectOptions(pc, plugOptionMeta.c, collectVariantValues(plugs.rows, plugMatches, 'c', function(part) { return (hasHighImpulseCode(part)) ? 'yes' : 'no'; })); syncSelectOptions(pv, plugOptionMeta.valve, collectVariantValues(plugs.rows, plugMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('LLV') > -1) return 'LLV'; if (part.indexOf('VB') > -1) return 'VB'; if (part.indexOf('VAA') > -1) return 'VAA'; if (part.indexOf('HVS') > -1) return 'HVS'; return 'standard'; })); syncSelectOptions(psp, plugOptionMeta.special, collectVariantValues(plugs.rows, plugMatches, 'special', plugSpecialValueFor)); } function filterPlugs() { updatePlugSelects(); render(plugs.tbody, plugs.rows, plugMatches, !!(((ps&&ps.value)||'').trim() || (pse&&pse.value) || (pc&&pc.value) || (pv&&pv.value) || (psp&&psp.value))); } if (pr) pr.addEventListener('click', function() { [ps,pb,pt,pse,pc,pv,psp].forEach(function(el) { if(el) el.value=''; }); filterPlugs(); }); [pb,pt,pse,pc,pv,psp].forEach(function(el) { if(el) el.addEventListener('change', filterPlugs); }); if (ps) ps.addEventListener('input', filterPlugs); var mlSockets = prep('#ap-ml-socket-tbody'); var ms = wrap.querySelector('#ap-ml-search'), mb = wrap.querySelector('#ap-ml-body'), mt = wrap.querySelector('#ap-ml-thread'), mse = wrap.querySelector('#ap-ml-seal'), msl = wrap.querySelector('#ap-ml-sl'), mvv = wrap.querySelector('#ap-ml-valve'), msp = wrap.querySelector('#ap-ml-special'), msr = wrap.querySelector('#ap-ml-reset'); var mlSocketOptionMeta = { body: getOptionMeta(mb), thread: getOptionMeta(mt), seal: getOptionMeta(mse), sl: getOptionMeta(msl), valve: getOptionMeta(mvv), special: getOptionMeta(msp) }; function mlSocketMatches(base, omitKey) { var v = ((config.mlSocketMap && config.mlSocketMap[base.part]) || [base.part]).slice(); var q = ((ms && ms.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && mb && mb.value && base.body !== mb.value) v = []; if (omitKey !== 'thread' && mt && mt.value && base.thread !== mt.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && mse && mse.value) v = mse.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(mse.value); }); if (omitKey !== 'sl' && msl && msl.value === 'yes') v = v.filter(function(x) { return x.indexOf('SL') > -1; }); if (omitKey !== 'sl' && msl && msl.value === 'no') v = v.filter(function(x) { return x.indexOf('SL') === -1; }); if (omitKey !== 'valve' && mvv && mvv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV') === -1 && x.indexOf('VAA') === -1; }); if (omitKey !== 'valve' && mvv && mvv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && mvv && mvv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); if (omitKey !== 'special' && msp && msp.value === 'S1') v = v.filter(function(x) { return hasExactSpecialSuffix(x, ['S1']); }); if (omitKey !== 'special' && msp && msp.value === 'OC') v = v.filter(function(x) { return x.indexOf('OC') > -1; }); return v; } function updateMlSocketSelects() { syncSelectOptions(mb, mlSocketOptionMeta.body, collectBaseValues(mlSockets.rows, mlSocketMatches, 'body', 'body')); syncSelectOptions(mt, mlSocketOptionMeta.thread, collectBaseValues(mlSockets.rows, mlSocketMatches, 'thread', 'thread')); syncSelectOptions(mse, mlSocketOptionMeta.seal, collectVariantValues(mlSockets.rows, mlSocketMatches, 'seal', sealValueFor)); syncSelectOptions(msl, mlSocketOptionMeta.sl, collectVariantValues(mlSockets.rows, mlSocketMatches, 'sl', function(part) { return part.indexOf('SL') > -1 ? 'yes' : 'no'; })); syncSelectOptions(mvv, mlSocketOptionMeta.valve, collectVariantValues(mlSockets.rows, mlSocketMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('VAA') > -1) return 'VAA'; return 'standard'; })); syncSelectOptions(msp, mlSocketOptionMeta.special, collectVariantValues(mlSockets.rows, mlSocketMatches, 'special', config.mlSocketSpecialValueFor || function() { return ''; })); } function filterMlSockets() { updateMlSocketSelects(); var q = ((ms && ms.value) || '').trim().toLowerCase(); render(mlSockets.tbody, mlSockets.rows, mlSocketMatches, !!(q || (mse&&mse.value) || (msl&&msl.value) || (mvv&&mvv.value) || (msp&&msp.value)), function(base) { return !!q && q === String(base.part || '').toLowerCase(); }); } if (msr) msr.addEventListener('click', function() { [ms,mb,mt,mse,msl,mvv,msp].forEach(function(el) { if(el) el.value=''; }); filterMlSockets(); }); [mb,mt,mse,msl,mvv,msp].forEach(function(el) { if(el) el.addEventListener('change', filterMlSockets); }); if (ms) ms.addEventListener('input', filterMlSockets); var mlPlugs = prep('#ap-ml-plug-tbody'); var mps = wrap.querySelector('#ap-ml-plug-search'), mpb = wrap.querySelector('#ap-ml-plug-body'), mpt = wrap.querySelector('#ap-ml-plug-thread'), mpse = wrap.querySelector('#ap-ml-plug-seal'), mpv = wrap.querySelector('#ap-ml-plug-valve'), mpsp = wrap.querySelector('#ap-ml-plug-special'), mpr = wrap.querySelector('#ap-ml-plug-reset'); var mlPlugOptionMeta = { body: getOptionMeta(mpb), thread: getOptionMeta(mpt), seal: getOptionMeta(mpse), valve: getOptionMeta(mpv), special: getOptionMeta(mpsp) }; function mlPlugMatches(base, omitKey) { var v = ((config.mlPlugMap && config.mlPlugMap[base.part]) || [base.part]).slice(); var q = ((mps && mps.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && mpb && mpb.value && base.body !== mpb.value) v = []; if (omitKey !== 'thread' && mpt && mpt.value && base.thread !== mpt.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && mpse && mpse.value) v = mpse.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(mpse.value); }); if (omitKey !== 'valve' && mpv && mpv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV')===-1 && x.indexOf('VB')===-1 && x.indexOf('VAA')===-1; }); if (omitKey !== 'valve' && mpv && mpv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && mpv && mpv.value === 'VB') v = v.filter(function(x) { return x.indexOf('VB') > -1; }); if (omitKey !== 'valve' && mpv && mpv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); if (omitKey !== 'special' && mpsp && mpsp.value === 'OC') v = v.filter(function(x) { return x.indexOf('OC') > -1; }); return v; } function updateMlPlugSelects() { syncSelectOptions(mpb, mlPlugOptionMeta.body, collectBaseValues(mlPlugs.rows, mlPlugMatches, 'body', 'body')); syncSelectOptions(mpt, mlPlugOptionMeta.thread, collectBaseValues(mlPlugs.rows, mlPlugMatches, 'thread', 'thread')); syncSelectOptions(mpse, mlPlugOptionMeta.seal, collectVariantValues(mlPlugs.rows, mlPlugMatches, 'seal', sealValueFor)); syncSelectOptions(mpv, mlPlugOptionMeta.valve, collectVariantValues(mlPlugs.rows, mlPlugMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('VB') > -1) return 'VB'; if (part.indexOf('VAA') > -1) return 'VAA'; return 'standard'; })); syncSelectOptions(mpsp, mlPlugOptionMeta.special, collectVariantValues(mlPlugs.rows, mlPlugMatches, 'special', config.mlPlugSpecialValueFor || function() { return ''; })); } function filterMlPlugs() { updateMlPlugSelects(); var q = ((mps && mps.value) || '').trim().toLowerCase(); render(mlPlugs.tbody, mlPlugs.rows, mlPlugMatches, !!(q || (mpse&&mpse.value) || (mpv&&mpv.value) || (mpsp&&mpsp.value)), function(base) { return !!q && q === String(base.part || '').toLowerCase(); }); } if (mpr) mpr.addEventListener('click', function() { [mps,mpb,mpt,mpse,mpv,mpsp].forEach(function(el) { if(el) el.value=''; }); filterMlPlugs(); }); [mpb,mpt,mpse,mpv,mpsp].forEach(function(el) { if(el) el.addEventListener('change', filterMlPlugs); }); if (mps) mps.addEventListener('input', filterMlPlugs); var ls = wrap.querySelector('#ap-large-search'), lb = wrap.querySelector('#ap-large-body'), lt = wrap.querySelector('#ap-large-thread'), lse = wrap.querySelector('#ap-large-seal'), lsl = wrap.querySelector('#ap-large-sl'), lc = wrap.querySelector('#ap-large-c'), lv = wrap.querySelector('#ap-large-valve'), lr = wrap.querySelector('#ap-large-reset'); var largeSocketOptionMeta = { body: getOptionMeta(lb), thread: getOptionMeta(lt), seal: getOptionMeta(lse), sl: getOptionMeta(lsl), c: getOptionMeta(lc), valve: getOptionMeta(lv) }; function largeSocketMatches(base, omitKey) { var v = (largeSocketMap[base.part] || [base.part]).slice(); var q = ((ls && ls.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && lb && lb.value && base.body !== lb.value) v = []; if (omitKey !== 'thread' && lt && lt.value && base.thread !== lt.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && lse && lse.value) v = lse.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(lse.value); }); if (omitKey !== 'sl' && lsl && lsl.value === 'yes') v = v.filter(function(x) { return x.indexOf('SL') > -1; }); if (omitKey !== 'sl' && lsl && lsl.value === 'no') v = v.filter(function(x) { return x.indexOf('SL') === -1; }); if (omitKey !== 'c' && lc && lc.value === 'yes') v = v.filter(function(x) { return hasHighImpulseCode(x); }); if (omitKey !== 'c' && lc && lc.value === 'no') v = v.filter(function(x) { return !(hasHighImpulseCode(x)); }); if (omitKey !== 'valve' && lv && lv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV')===-1 && x.indexOf('LLV')===-1 && x.indexOf('VAA')===-1; }); if (omitKey !== 'valve' && lv && lv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && lv && lv.value === 'LLV') v = v.filter(function(x) { return x.indexOf('LLV') > -1; }); if (omitKey !== 'valve' && lv && lv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); return v; } function updateLargeSocketSelects() { syncSelectOptions(lb, largeSocketOptionMeta.body, collectBaseValues(largeSockets.rows, largeSocketMatches, 'body', 'body')); syncSelectOptions(lt, largeSocketOptionMeta.thread, collectBaseValues(largeSockets.rows, largeSocketMatches, 'thread', 'thread')); syncSelectOptions(lse, largeSocketOptionMeta.seal, collectVariantValues(largeSockets.rows, largeSocketMatches, 'seal', sealValueFor)); syncSelectOptions(lsl, largeSocketOptionMeta.sl, collectVariantValues(largeSockets.rows, largeSocketMatches, 'sl', function(part) { return part.indexOf('SL') > -1 ? 'yes' : 'no'; })); syncSelectOptions(lc, largeSocketOptionMeta.c, collectVariantValues(largeSockets.rows, largeSocketMatches, 'c', function(part) { return (hasHighImpulseCode(part)) ? 'yes' : 'no'; })); syncSelectOptions(lv, largeSocketOptionMeta.valve, collectVariantValues(largeSockets.rows, largeSocketMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('LLV') > -1) return 'LLV'; if (part.indexOf('VAA') > -1) return 'VAA'; return 'standard'; })); } function filterLargeSockets() { updateLargeSocketSelects(); render(largeSockets.tbody, largeSockets.rows, largeSocketMatches, !!(((ls&&ls.value)||'').trim() || (lse&&lse.value) || (lsl&&lsl.value) || (lc&&lc.value) || (lv&&lv.value))); } if (lr) lr.addEventListener('click', function() { [ls,lb,lt,lse,lsl,lc,lv].forEach(function(el) { if(el) el.value=''; }); filterLargeSockets(); }); [lb,lt,lse,lsl,lc,lv].forEach(function(el) { if(el) el.addEventListener('change', filterLargeSockets); }); if (ls) ls.addEventListener('input', filterLargeSockets); var lps = wrap.querySelector('#ap-large-plug-search'), lpb = wrap.querySelector('#ap-large-plug-body'), lpt = wrap.querySelector('#ap-large-plug-thread'), lpse = wrap.querySelector('#ap-large-plug-seal'), lpc = wrap.querySelector('#ap-large-plug-c'), lpv = wrap.querySelector('#ap-large-plug-valve'), lpr = wrap.querySelector('#ap-large-plug-reset'); var largePlugOptionMeta = { body: getOptionMeta(lpb), thread: getOptionMeta(lpt), seal: getOptionMeta(lpse), c: getOptionMeta(lpc), valve: getOptionMeta(lpv) }; function largePlugMatches(base, omitKey) { var v = (largePlugMap[base.part] || [base.part]).slice(); var q = ((lps && lps.value) || '').trim().toLowerCase(); if (omitKey !== 'body' && lpb && lpb.value && base.body !== lpb.value) v = []; if (omitKey !== 'thread' && lpt && lpt.value && base.thread !== lpt.value) v = []; if (q) v = v.filter(function(x) { return x.toLowerCase().indexOf(q) > -1; }); if (omitKey !== 'seal' && lpse && lpse.value) v = lpse.value === 'standard' ? v.filter(function(x) { return x === base.part || !hasSeal(x); }) : v.filter(function(x) { return String(x).endsWith(lpse.value); }); if (omitKey !== 'c' && lpc && lpc.value === 'yes') v = v.filter(function(x) { return hasHighImpulseCode(x); }); if (omitKey !== 'c' && lpc && lpc.value === 'no') v = v.filter(function(x) { return !(hasHighImpulseCode(x)); }); if (omitKey !== 'valve' && lpv && lpv.value === 'standard') v = v.filter(function(x) { return x.indexOf('NV')===-1 && x.indexOf('LLV')===-1 && x.indexOf('VAA')===-1; }); if (omitKey !== 'valve' && lpv && lpv.value === 'NV') v = v.filter(function(x) { return x.indexOf('NV') > -1; }); if (omitKey !== 'valve' && lpv && lpv.value === 'LLV') v = v.filter(function(x) { return x.indexOf('LLV') > -1; }); if (omitKey !== 'valve' && lpv && lpv.value === 'VAA') v = v.filter(function(x) { return x.indexOf('VAA') > -1; }); return v; } function updateLargePlugSelects() { syncSelectOptions(lpb, largePlugOptionMeta.body, collectBaseValues(largePlugs.rows, largePlugMatches, 'body', 'body')); syncSelectOptions(lpt, largePlugOptionMeta.thread, collectBaseValues(largePlugs.rows, largePlugMatches, 'thread', 'thread')); syncSelectOptions(lpse, largePlugOptionMeta.seal, collectVariantValues(largePlugs.rows, largePlugMatches, 'seal', sealValueFor)); syncSelectOptions(lpc, largePlugOptionMeta.c, collectVariantValues(largePlugs.rows, largePlugMatches, 'c', function(part) { return (hasHighImpulseCode(part)) ? 'yes' : 'no'; })); syncSelectOptions(lpv, largePlugOptionMeta.valve, collectVariantValues(largePlugs.rows, largePlugMatches, 'valve', function(part) { if (part.indexOf('NV') > -1) return 'NV'; if (part.indexOf('LLV') > -1) return 'LLV'; if (part.indexOf('VAA') > -1) return 'VAA'; return 'standard'; })); } function filterLargePlugs() { updateLargePlugSelects(); render(largePlugs.tbody, largePlugs.rows, largePlugMatches, !!(((lps&&lps.value)||'').trim() || (lpse&&lpse.value) || (lpc&&lpc.value) || (lpv&&lpv.value))); } if (lpr) lpr.addEventListener('click', function() { [lps,lpb,lpt,lpse,lpc,lpv].forEach(function(el) { if(el) el.value=''; }); filterLargePlugs(); }); [lpb,lpt,lpse,lpc,lpv].forEach(function(el) { if(el) el.addEventListener('change', filterLargePlugs); }); if (lps) lps.addEventListener('input', filterLargePlugs); filterSockets(); filterPlugs(); filterMlSockets(); filterMlPlugs(); filterLargeSockets(); filterLargePlugs(); return true; } (function() { function bootApProductPages() { var wraps = Array.from(document.querySelectorAll('.ap-hk-steel-page[data-ap-page]')); if (!wraps.length) return false; wraps.forEach(function(wrap) { initApProductPage(wrap); }); return true; } var attempts = 0; function retryBoot() { attempts += 1; if (bootApProductPages()) return; if (attempts < 20) window.setTimeout(retryBoot, 250); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', retryBoot); } else { retryBoot(); } window.addEventListener('load', retryBoot); })(); function initApFFSeriesPage() { var sealSuffixes = ['143','192','242','503','507']; function splitParts(text){ return text.split(',').map(function(part){ return part.trim(); }).filter(Boolean); } function partToUrl(part){ return 'https://airproductsusa.com/hansen-' + part.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') + '/'; } function linkifyParts(parts){ return parts.map(function(part){ var clean = part.trim(); return '' + clean + ''; }).join(', '); } function uniqueSorted(values){ return Array.from(new Set(values.filter(Boolean))).sort(function(a,b){ return a.localeCompare(b, undefined, {numeric:true, sensitivity:'base'}); }); } function getSealLabel(code){ return { base: 'Standard', '143': '143 - FKM', '192': '192 - EPDM', '507': '507 - HNBR', '503': '503 - FFKM', '242': '242 - Kalrez' }[code] || code; } function partMatchesSeal(part, seal){ var clean = part.trim(); if (seal === 'base') { return !sealSuffixes.some(function(code){ return clean.endsWith(code); }); } return clean.endsWith(seal); } function getFigIndex(table){ var headers = Array.from(table.tHead.rows[0].cells).map(function(cell){ return cell.textContent.replace(/\s+/g, ' ').trim(); }); return headers.indexOf('Fig.'); } function getBodyText(row){ return row.cells[1] ? row.cells[1].textContent.replace(/\s+/g, ' ').trim() : ''; } function getThreadText(row, figIndex){ var values = []; for (var i = 4; i < figIndex; i++) { var value = row.cells[i] ? row.cells[i].textContent.replace(/\s+/g, ' ').trim() : ''; if (value && value !== '-') values.push(value); } return values.join(' | '); } function collectOptions(group){ var tables = document.querySelectorAll('.ap-ff-filter-table[data-ff-group="' + group + '"]'); var bodyValues = []; var threadValues = []; tables.forEach(function(table){ var figIndex = getFigIndex(table); Array.from(table.tBodies[0].rows).forEach(function(row){ bodyValues.push(getBodyText(row)); getThreadText(row, figIndex).split('|').map(function(val){ return val.trim(); }).filter(Boolean).forEach(function(val){ threadValues.push(val); }); }); }); return { bodies: uniqueSorted(bodyValues), threads: uniqueSorted(threadValues) }; } function populateSelect(select, items, firstLabel){ if (!select) return; var current = select.value; select.innerHTML = ''; var first = document.createElement('option'); first.value = ''; first.textContent = firstLabel; select.appendChild(first); items.forEach(function(item){ var option = document.createElement('option'); option.value = item; option.textContent = item; select.appendChild(option); }); if (Array.from(select.options).some(function(option){ return option.value === current; })) { select.value = current; } } function populateSealSelect(select, codes){ if (!select) return; var current = select.value; select.innerHTML = ''; codes.forEach(function(code){ var option = document.createElement('option'); option.value = code; option.textContent = getSealLabel(code); select.appendChild(option); }); if (Array.from(select.options).some(function(option){ return option.value === current; })) { select.value = current; } else { select.value = codes[0] || 'base'; } } function collectAvailableOptions(group, state, excludeKey){ var tables = document.querySelectorAll('.ap-ff-filter-table[data-ff-group="' + group + '"]'); var bodyValues = []; var threadValues = []; var sealValues = []; tables.forEach(function(table){ var figIndex = getFigIndex(table); Array.from(table.tBodies[0].rows).forEach(function(row){ var cell = row.cells[0]; if (!cell.dataset.ffParts) { cell.dataset.ffParts = cell.textContent.replace(/\s+/g, ' ').trim(); } if (!row.dataset.ffBody) { row.dataset.ffBody = getBodyText(row); } if (!row.dataset.ffThread) { row.dataset.ffThread = getThreadText(row, figIndex); } var allParts = splitParts(cell.dataset.ffParts); var candidateParts = allParts.filter(function(part){ return !state.seal || excludeKey === 'seal' ? true : partMatchesSeal(part, state.seal); }); if (state.search) { var search = state.search.toLowerCase(); candidateParts = candidateParts.filter(function(part){ return part.toLowerCase().indexOf(search) !== -1; }); if (!candidateParts.length && row.textContent.toLowerCase().indexOf(search) !== -1) { candidateParts = allParts.filter(function(part){ return !state.seal || excludeKey === 'seal' ? true : partMatchesSeal(part, state.seal); }); } } var bodyMatches = !state.body || excludeKey === 'body' || row.dataset.ffBody === state.body; var threadMatches = !state.thread || excludeKey === 'thread' || row.dataset.ffThread.indexOf(state.thread) !== -1; if (!candidateParts.length || !bodyMatches || !threadMatches) return; bodyValues.push(row.dataset.ffBody); row.dataset.ffThread.split('|').map(function(val){ return val.trim(); }).filter(Boolean).forEach(function(val){ threadValues.push(val); }); if (allParts.some(function(part){ return !sealSuffixes.some(function(code){ return part.trim().endsWith(code); }); })) { sealValues.push('base'); } sealSuffixes.forEach(function(code){ if (allParts.some(function(part){ return part.trim().endsWith(code); })) { sealValues.push(code); } }); }); }); var orderedSeals = ['base','143','192','507','503','242'].filter(function(code){ return sealValues.indexOf(code) !== -1; }); return { bodies: uniqueSorted(bodyValues), threads: uniqueSorted(threadValues), seals: orderedSeals }; } function updateControlState(select, optionCount){ if (!select) return; select.disabled = optionCount <= 1; select.style.opacity = optionCount <= 1 ? '0.55' : '1'; select.style.cursor = optionCount <= 1 ? 'not-allowed' : ''; } function refreshGroupControls(group, refs){ var bodyOptions = collectAvailableOptions(group, { body: refs.body.value || '', thread: refs.thread.value || '', seal: refs.seal.value || 'base', search: (refs.search.value || '').trim() }, 'body'); populateSelect(refs.body, bodyOptions.bodies, 'All Body Sizes'); updateControlState(refs.body, refs.body.options.length - 1); var threadOptions = collectAvailableOptions(group, { body: refs.body.value || '', thread: refs.thread.value || '', seal: refs.seal.value || 'base', search: (refs.search.value || '').trim() }, 'thread'); populateSelect(refs.thread, threadOptions.threads, 'All Threads'); updateControlState(refs.thread, refs.thread.options.length - 1); var sealOptions = collectAvailableOptions(group, { body: refs.body.value || '', thread: refs.thread.value || '', seal: refs.seal.value || 'base', search: (refs.search.value || '').trim() }, 'seal'); populateSealSelect(refs.seal, sealOptions.seals.length ? sealOptions.seals : ['base']); updateControlState(refs.seal, refs.seal.options.length); } function renderGroup(group, state){ var tables = document.querySelectorAll('.ap-ff-filter-table[data-ff-group="' + group + '"]'); tables.forEach(function(table){ var figIndex = getFigIndex(table); Array.from(table.tBodies[0].rows).forEach(function(row){ var cell = row.cells[0]; if (!cell.dataset.ffParts) { cell.dataset.ffParts = cell.textContent.replace(/\s+/g, ' ').trim(); } if (!row.dataset.ffBody) { row.dataset.ffBody = getBodyText(row); } if (!row.dataset.ffThread) { row.dataset.ffThread = getThreadText(row, figIndex); } var allParts = splitParts(cell.dataset.ffParts); var sealMatchedParts = allParts.filter(function(part){ return partMatchesSeal(part, state.seal); }); var visibleParts = sealMatchedParts.slice(); if (state.search) { var search = state.search.toLowerCase(); var searchMatchedParts = allParts.filter(function(part){ return part.toLowerCase().indexOf(search) !== -1; }); if (searchMatchedParts.length) { visibleParts = searchMatchedParts; } else if (row.textContent.toLowerCase().indexOf(search) !== -1) { visibleParts = sealMatchedParts; } else { visibleParts = []; } } var bodyMatches = !state.body || row.dataset.ffBody === state.body; var threadMatches = !state.thread || row.dataset.ffThread.indexOf(state.thread) !== -1; if (!visibleParts.length || !bodyMatches || !threadMatches) { row.style.display = 'none'; return; } cell.innerHTML = linkifyParts(visibleParts); row.style.display = ''; }); }); } function linkifyStaticPartCells(){ document.querySelectorAll('.ap-ff-filter-table:not([data-ff-group]) tbody tr td:first-child').forEach(function(cell){ var text = cell.textContent.replace(/\s+/g, ' ').trim(); if (!text) return; cell.innerHTML = linkifyParts(splitParts(text)); }); document.querySelectorAll('.ap-accessory-table [data-link-parts]').forEach(function(cell){ var text = cell.textContent.replace(/\s+/g, ' ').trim(); if (!text) return; cell.innerHTML = linkifyParts(splitParts(text)); }); } function setupGroup(group){ var wrapper = document.querySelector('[data-ff-controls="' + group + '"]'); if (!wrapper) return; var body = wrapper.querySelector('[data-ff-body]'); var thread = wrapper.querySelector('[data-ff-thread]'); var seal = wrapper.querySelector('[data-ff-seal]'); var search = wrapper.querySelector('[data-ff-search]'); var reset = wrapper.querySelector('[data-ff-reset]'); var options = collectOptions(group); populateSelect(body, options.bodies, 'All Body Sizes'); populateSelect(thread, options.threads, 'All Threads'); var refs = { body: body, thread: thread, seal: seal, search: search }; function render(){ refreshGroupControls(group, refs); renderGroup(group, { body: body.value || '', thread: thread.value || '', seal: seal.value || 'base', search: (search.value || '').trim() }); } body.addEventListener('change', render); thread.addEventListener('change', render); seal.addEventListener('change', render); search.addEventListener('input', render); reset.addEventListener('click', function(){ body.value = ''; thread.value = ''; seal.value = 'base'; search.value = ''; render(); }); render(); } function setupPanels(){ var buttons = document.querySelectorAll('[data-ff-panel-target]'); var panels = document.querySelectorAll('[data-ff-panel]'); function activate(target){ buttons.forEach(function(btn){ btn.classList.toggle('is-active', btn.getAttribute('data-ff-panel-target') === target); }); panels.forEach(function(panel){ panel.classList.toggle('is-active', panel.getAttribute('data-ff-panel') === target); }); } buttons.forEach(function(btn){ btn.addEventListener('click', function(){ activate(btn.getAttribute('data-ff-panel-target')); }); }); activate('sockets'); } setupPanels(); linkifyStaticPartCells(); setupGroup('socket'); setupGroup('plug'); return true; } (function() { function bootApFFSeriesPages() { var wraps = Array.from(document.querySelectorAll('.ap-ff-page')); if (!wraps.length) return false; if (window.__apFFInitDone) return true; window.__apFFInitDone = true; initApFFSeriesPage(); return true; } var attempts = 0; function retryBootFF() { attempts += 1; if (bootApFFSeriesPages()) return; if (attempts < 20) window.setTimeout(retryBootFF, 250); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', retryBootFF); } else { retryBootFF(); } window.addEventListener('load', retryBootFF); })(); // ===== END APC PRODUCT PAGES SCRIPT.js ===== // ===== START AP PNEUMATIC SERIES ADDON.js ===== (function(){ function initApPneumatic3000Page(seriesPage){ if (!seriesPage || seriesPage.dataset.apPneumatic3000Init === 'true') return false; var connectionFilter = seriesPage.querySelector('#ap3000-connection-filter'); if (!connectionFilter) return false; seriesPage.dataset.apPneumatic3000Init = 'true'; var buttons = seriesPage.querySelectorAll('.ap-toggle-btn'); var panels = seriesPage.querySelectorAll('.ap-toggle-panel'); var subsections = seriesPage.querySelectorAll('.ap-subsection'); var threadFilter = seriesPage.querySelector('#ap3000-thread-filter'); var barbFilter = seriesPage.querySelector('#ap3000-barb-filter'); var barbFilterWrap = seriesPage.querySelector('#ap3000-barb-filter-wrap'); var hoseIdFilter = seriesPage.querySelector('#ap3000-hose-id-filter'); var hoseIdFilterWrap = seriesPage.querySelector('#ap3000-hose-id-filter-wrap'); var hoseOdFilter = seriesPage.querySelector('#ap3000-hose-od-filter'); var hoseOdFilterWrap = seriesPage.querySelector('#ap3000-hose-od-filter-wrap'); var searchFilter = seriesPage.querySelector('#ap3000-search-filter'); var sleeveFilter = seriesPage.querySelector('#ap3000-sleeve-filter'); var valveFilter = seriesPage.querySelector('#ap3000-valve-filter'); var elastomerFilter = seriesPage.querySelector('#ap3000-elastomer-filter'); var specialFilter = seriesPage.querySelector('#ap3000-special-filter'); var resetFilter = seriesPage.querySelector('#ap3000-filter-reset'); var filterSummary = seriesPage.querySelector('#ap3000-filter-summary'); var buildSummary = seriesPage.querySelector('#ap3000-build-summary'); var currentView = 'sockets'; var basePartSet = { '2800': true, '2900': true, '3000': true, '3000S24': true, '3100E': true, '3200': true, '3300E': true, '3600': true, '3600P': true, '3700E': true, '3700P': true, '3800': true, '10': true, '10C': true, '10G': true, '12E': true, '12G': true, '14': true, '14G': true, 'B10': true, 'LL10': true, '10NK': true, '11': true, '11G': true, '13': true, '15E': true, '11B': true, 'LL11': true, '11NK': true, '16': true, '16P': true, '16NK': true, '17': true, '17G': true, '17P': true, '17NK': true, '18E': true, 'B17': true, '3SA0': true, '3SB1': true, '3SB3': true, '3SB5': true, '3SB7': true, '3SC5': true, '3SC7': true, '3SC9': true, '3SD5': true, '3SD7': true, '3SD9': true, '3SD11': true, '3PB1': true, '3PB3': true, '3PB5': true, '3PB7': true, '3PC5': true, '3PC7': true, '3PD5': true, '3PD7': true, '3PD9': true, '3PD11': true }; var assembledVariantParts = {}; var socketVariantProfiles = { '2800': { root: '2800', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '2900': { root: '2900', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3000': { root: '3000', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3100E': { root: '3100', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3200': { root: '3200', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3300E': { root: '3300', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3600': { root: '3600', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3600P': { root: '3600P', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3700E': { root: '3700', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3700P': { root: '3700P', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }, '3800': { root: '3800', valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true } }; if (!buttons.length || !panels.length) return; function getPartCode(text){ return (text || '').replace(/\s+/g, ' ').trim().replace(/[*\u00A7\u2020\u2021]+$/g, ''); } function getDisplayPartText(text){ return (text || '').replace(/\s+/g, ' ').trim(); } function getSlug(text){ return getPartCode(text) .replace(/[\u00A7\u2020\u2021*]/g, '') .replace(/[^A-Za-z0-9-]/g, '') .toLowerCase(); } function getSanitizedPart(text){ return getPartCode(text).replace(/[\u00A7\u2020\u2021*]/g, ''); } function buildSocketVariantCode(profile, valve, hasSleeve, elastomer){ var code = profile.root; if (valve) code += valve; if (hasSleeve) code += 'SL'; if (elastomer) code += elastomer; return code; } function buildSocketVariantList(profile){ var variants = []; var seen = {}; [''].concat(profile.valves || []).forEach(function(valve){ var sleeveOptions = profile.sleeve ? [false, true] : [false]; sleeveOptions.forEach(function(hasSleeve){ [''].concat(profile.elastomers || []).forEach(function(elastomer){ if (!valve && !hasSleeve && !elastomer) return; var code = buildSocketVariantCode(profile, valve, hasSleeve, elastomer); if (seen[code]) return; seen[code] = true; variants.push(code); }); }); }); return variants; } function collectSocketVariantProfiles(){ seriesPage.querySelectorAll('#ap3000-hose-clamp-panel .ap-table tbody tr').forEach(function(row){ var firstCell = row.cells[0]; var couplingCell = row.cells[1]; if (!firstCell || !couplingCell) return; var part = getPartCode(firstCell.textContent); var couplingType = couplingCell.textContent.replace(/\s+/g, ' ').trim(); if (!/socket\/female/i.test(couplingType)) return; if (!socketVariantProfiles[part]) { socketVariantProfiles[part] = { root: part, valves: ['BV', 'LLV', 'NV'], elastomers: ['143', '192'], sleeve: true }; } }); } function seedAssembledVariantParts(){ Object.keys(socketVariantProfiles).forEach(function(basePart){ buildSocketVariantList(socketVariantProfiles[basePart]).forEach(function(code){ assembledVariantParts[getSanitizedPart(code)] = true; }); }); } function generateSocketVariants(){ var existingParts = {}; seriesPage.querySelectorAll('#ap3000-threaded-male-panel .ap-table tbody tr, #ap3000-threaded-female-panel .ap-table tbody tr, #ap3000-hose-stem-panel .ap-table tbody tr, #ap3000-hose-clamp-panel .ap-table tbody tr').forEach(function(row){ if (!row.cells[0]) return; existingParts[getSanitizedPart(row.cells[0].textContent)] = true; }); Object.keys(socketVariantProfiles).forEach(function(basePart){ var profile = socketVariantProfiles[basePart]; var baseCell = Array.from(seriesPage.querySelectorAll('#ap3000-threaded-male-panel .ap-table tbody tr td:first-child, #ap3000-threaded-female-panel .ap-table tbody tr td:first-child, #ap3000-hose-stem-panel .ap-table tbody tr td:first-child, #ap3000-hose-clamp-panel .ap-table tbody tr td:first-child')).find(function(cell){ return getPartCode(cell.textContent) === basePart; }); if (!baseCell) return; var baseRow = baseCell.parentElement; var insertAfter = baseRow; buildSocketVariantList(profile).forEach(function(code){ var sanitized = getSanitizedPart(code); if (existingParts[sanitized]) return; var clone = baseRow.cloneNode(true); clone.cells[0].textContent = code; insertAfter.parentNode.insertBefore(clone, insertAfter.nextSibling); insertAfter = clone; existingParts[sanitized] = true; }); }); } function getThreadValue(row){ return row.dataset.thread || ''; } function getConnectionType(row){ return row.dataset.connectionType || ''; } function isVariantPart(part){ return !basePartSet[getSanitizedPart(part)]; } function detectSleeveLock(part){ return /SL/i.test(part) ? 'yes' : 'no'; } function detectValveType(part, material){ if (/NV/i.test(part)) return 'no-valve'; if (/^3000S24$/i.test(part)) return 'brass-valve'; if (/SLOC/i.test(part)) return 'brass-valve'; if (/LLV/i.test(part) || /^LL/i.test(part)) return 'stainless-steel-valve'; if (/BV/i.test(part) || /^B/i.test(part)) return 'brass-valve'; return 'standard-steel'; } function detectElastomer(part){ if (/143\b/.test(part)) return 'fkm'; if (/192\b/.test(part)) return 'epdm'; if (/138\b/.test(part)) return 'silicone'; return 'buna-n'; } function detectSpecial(part){ if (/SLOC/i.test(part)) return 'oxygen-cleaned'; return ''; } function detectSource(part){ if (assembledVariantParts[getSanitizedPart(part)]) return 'assembled'; if (/^3100BV143$/i.test(part)) return 'assembled'; return 'factory'; } function detectConnectionType(table, row){ var headers = Array.from(table.querySelectorAll('thead tr:first-child th')).map(function(th){ return th.textContent.replace(/\s+/g, ' ').trim(); }); if (headers.indexOf('Thread Type') !== -1) return 'threaded'; if (headers.indexOf('Hose O.D.') !== -1) return 'hose-clamp'; if (headers.indexOf('Hose I.D.') !== -1) return 'hose-stem'; return ''; } collectSocketVariantProfiles(); seedAssembledVariantParts(); generateSocketVariants(); seriesPage.querySelectorAll('.ap-toggle-panel .ap-table').forEach(function(table){ var headerCells = Array.from(table.querySelectorAll('thead tr:first-child th')); var couplingIndex = headerCells.findIndex(function(th){ return th.textContent.replace(/\s+/g, ' ').trim() === 'Coupling Type'; }); var threadIndex = headerCells.findIndex(function(th){ return th.textContent.replace(/\s+/g, ' ').trim() === 'Thread Type'; }); var hoseIdIndex = headerCells.findIndex(function(th){ return th.textContent.replace(/\s+/g, ' ').trim() === 'Hose I.D.'; }); var hoseOdIndex = headerCells.findIndex(function(th){ return th.textContent.replace(/\s+/g, ' ').trim() === 'Hose O.D.'; }); var materialIndex = headerCells.findIndex(function(th){ return th.textContent.replace(/\s+/g, ' ').trim() === 'Material'; }); Array.from(table.tBodies[0].rows).forEach(function(row){ var part = getPartCode(row.cells[0] ? row.cells[0].textContent : ''); var couplingType = couplingIndex > -1 && row.cells[couplingIndex] ? row.cells[couplingIndex].textContent.replace(/\s+/g, ' ').trim() : ''; var material = materialIndex > -1 && row.cells[materialIndex] ? row.cells[materialIndex].textContent.replace(/\s+/g, ' ').trim() : ''; row.dataset.part = part; row.dataset.variant = isVariantPart(part) ? 'yes' : 'no'; row.dataset.couplingType = couplingType; row.dataset.connectionType = detectConnectionType(table, row); row.dataset.thread = threadIndex > -1 && row.cells[threadIndex] ? row.cells[threadIndex].textContent.replace(/\s+/g, ' ').trim() : ''; row.dataset.hoseId = hoseIdIndex > -1 && row.cells[hoseIdIndex] ? row.cells[hoseIdIndex].textContent.replace(/\s+/g, ' ').trim() : ''; row.dataset.hoseOd = hoseOdIndex > -1 && row.cells[hoseOdIndex] ? row.cells[hoseOdIndex].textContent.replace(/\s+/g, ' ').trim() : ''; row.dataset.sleeveLock = detectSleeveLock(part); row.dataset.valveType = detectValveType(part, material); row.dataset.elastomer = detectElastomer(part); row.dataset.special = detectSpecial(part); row.dataset.source = detectSource(part); }); }); function activate(target){ currentView = target; if (seriesPage) { seriesPage.setAttribute('data-current-view', target); } buttons.forEach(function(button){ button.classList.toggle('is-active', button.getAttribute('data-target') === target); }); panels.forEach(function(panel){ if (target === 'dust') { panel.classList.toggle('is-active', panel.id === 'ap3000-dust-panel'); } else if (target === 'replacement') { panel.classList.toggle('is-active', panel.id === 'ap3000-replacement-panel'); } else { panel.classList.toggle('is-active', panel.id !== 'ap3000-dust-panel' && panel.id !== 'ap3000-replacement-panel'); } }); refreshSocketSizeOptions(); refreshThreadOptions(); renderFilters(); } function getActivePanel(){ return seriesPage.querySelector('.ap-toggle-panel.is-active'); } function getActiveRows(){ if (currentView === 'dust' || currentView === 'replacement') return []; return Array.from(seriesPage.querySelectorAll('.ap-toggle-panel.is-active .ap-table tbody tr')); } function anyFilterSelected(){ return !!(connectionFilter.value || searchFilter.value || threadFilter.value || barbFilter.value || hoseIdFilter.value || hoseOdFilter.value || sleeveFilter.value || valveFilter.value || elastomerFilter.value || specialFilter.value); } function rowMatches(row, excludeKey){ var searchTerm = (searchFilter.value || '').replace(/\s+/g, ' ').trim().toLowerCase(); var searchMatches = !searchTerm || excludeKey === 'search' || row.textContent.toLowerCase().indexOf(searchTerm) !== -1 || (row.dataset.part || '').toLowerCase().indexOf(searchTerm) !== -1; var connectionMatches = !connectionFilter.value || excludeKey === 'connection' || row.dataset.connectionType === connectionFilter.value; var threadMatches = !threadFilter.value || excludeKey === 'thread' || row.dataset.thread === threadFilter.value; var barbMatches = !barbFilter.value || excludeKey === 'barb' || row.dataset.hoseId === barbFilter.value; var hoseIdMatches = !hoseIdFilter.value || excludeKey === 'hoseId' || row.dataset.hoseId === hoseIdFilter.value; var hoseOdMatches = !hoseOdFilter.value || excludeKey === 'hoseOd' || row.dataset.hoseOd === hoseOdFilter.value; var sleeveMatches = !sleeveFilter.value || excludeKey === 'sleeve' || row.dataset.sleeveLock === sleeveFilter.value; var valveMatches = !valveFilter.value || excludeKey === 'valve' || row.dataset.valveType === valveFilter.value; var elastomerMatches = !elastomerFilter.value || excludeKey === 'elastomer' || row.dataset.elastomer === elastomerFilter.value; var specialMatches = !specialFilter.value || excludeKey === 'special' || row.dataset.special === specialFilter.value; return searchMatches && connectionMatches && threadMatches && barbMatches && hoseIdMatches && hoseOdMatches && sleeveMatches && valveMatches && elastomerMatches && specialMatches; } function populateSimpleSelect(select, values, placeholder){ var current = select.value; select.innerHTML = ''; values.forEach(function(value){ var option = document.createElement('option'); option.value = value; option.textContent = value; select.appendChild(option); }); if (values.indexOf(current) !== -1) { select.value = current; } else { select.value = ''; } primeOptionLabels(select); } function populateThreadOptions(values){ var current = threadFilter.value; threadFilter.innerHTML = ''; values.forEach(function(value){ var option = document.createElement('option'); option.value = value; option.textContent = value; threadFilter.appendChild(option); }); if (values.indexOf(current) !== -1) { threadFilter.value = current; } else { threadFilter.value = ''; } var hasThreads = values.length > 0; threadFilter.disabled = !hasThreads; threadFilter.style.opacity = hasThreads ? '1' : '0.55'; threadFilter.style.cursor = hasThreads ? '' : 'not-allowed'; } function primeOptionLabels(select){ Array.from(select.options).forEach(function(option){ if (!option.dataset.baseLabel) { option.dataset.baseLabel = option.textContent.replace(/\s+\(\d+\)\s*$/, '').replace(/\s+\(Unavailable\)\s*$/, ''); } }); } function refreshThreadOptions(){ var rows = getActiveRows(); var values = []; rows.forEach(function(row){ var value = getThreadValue(row); if (value && values.indexOf(value) === -1) values.push(value); }); values.sort(); populateThreadOptions(values); primeOptionLabels(threadFilter); } function refreshSocketSizeOptions(){ var rows = getActiveRows(); var barbValues = []; var hoseIdValues = []; var hoseOdValues = []; rows.forEach(function(row){ if (row.dataset.hoseId && barbValues.indexOf(row.dataset.hoseId) === -1) barbValues.push(row.dataset.hoseId); if (row.dataset.hoseId && hoseIdValues.indexOf(row.dataset.hoseId) === -1) hoseIdValues.push(row.dataset.hoseId); if (row.dataset.hoseOd && hoseOdValues.indexOf(row.dataset.hoseOd) === -1) hoseOdValues.push(row.dataset.hoseOd); }); barbValues.sort(); hoseIdValues.sort(); hoseOdValues.sort(); populateSimpleSelect(barbFilter, barbValues, 'All Barb Sizes'); populateSimpleSelect(hoseIdFilter, hoseIdValues, 'All Hose I.D. Sizes'); populateSimpleSelect(hoseOdFilter, hoseOdValues, 'All Hose O.D. Sizes'); } function updateConnectionDrivenState(){ var inSocketView = currentView === 'sockets'; var inPlugView = currentView === 'plugs'; var inPartView = inSocketView || inPlugView; var connectionType = connectionFilter.value || ''; var threadedEnabled = inPartView && (!connectionType || connectionType === 'threaded'); var barbEnabled = inPartView && connectionType === 'hose-stem'; var hoseIdEnabled = inPartView && connectionType === 'hose-clamp'; var hoseOdEnabled = inPartView && connectionType === 'hose-clamp'; var sleeveControl = sleeveFilter ? sleeveFilter.closest('.ap-filter-control') : null; var valveControl = valveFilter ? valveFilter.closest('.ap-filter-control') : null; var elastomerControl = elastomerFilter ? elastomerFilter.closest('.ap-filter-control') : null; var specialControl = specialFilter ? specialFilter.closest('.ap-filter-control') : null; [threadFilter, barbFilter, hoseIdFilter, hoseOdFilter].forEach(function(select){ if (!select) return; select.style.cursor = ''; }); threadFilter.closest('.ap-filter-control').style.display = threadedEnabled ? '' : (inPartView ? 'none' : ''); if (barbFilterWrap) barbFilterWrap.style.display = barbEnabled ? '' : 'none'; if (hoseIdFilterWrap) hoseIdFilterWrap.style.display = hoseIdEnabled ? '' : 'none'; if (hoseOdFilterWrap) hoseOdFilterWrap.style.display = hoseOdEnabled ? '' : 'none'; if (sleeveControl) sleeveControl.style.display = inSocketView ? '' : 'none'; if (valveControl) valveControl.style.display = inSocketView ? '' : 'none'; if (elastomerControl) elastomerControl.style.display = inSocketView ? '' : 'none'; if (specialControl) specialControl.style.display = inSocketView ? '' : 'none'; threadFilter.disabled = !threadedEnabled || Array.from(threadFilter.options).length <= 1; threadFilter.style.opacity = threadFilter.disabled ? '0.55' : '1'; barbFilter.disabled = !barbEnabled || Array.from(barbFilter.options).length <= 1; barbFilter.style.opacity = barbFilter.disabled ? '0.55' : '1'; hoseIdFilter.disabled = !hoseIdEnabled || Array.from(hoseIdFilter.options).length <= 1; hoseIdFilter.style.opacity = hoseIdFilter.disabled ? '0.55' : '1'; hoseOdFilter.disabled = !hoseOdEnabled || Array.from(hoseOdFilter.options).length <= 1; hoseOdFilter.style.opacity = hoseOdFilter.disabled ? '0.55' : '1'; if (sleeveFilter) { sleeveFilter.disabled = !inSocketView || Array.from(sleeveFilter.options).length <= 1; sleeveFilter.style.opacity = sleeveFilter.disabled ? '0.55' : '1'; } if (valveFilter) { valveFilter.disabled = !inSocketView || Array.from(valveFilter.options).length <= 1; valveFilter.style.opacity = valveFilter.disabled ? '0.55' : '1'; } if (elastomerFilter) { elastomerFilter.disabled = !inSocketView || Array.from(elastomerFilter.options).length <= 1; elastomerFilter.style.opacity = elastomerFilter.disabled ? '0.55' : '1'; } if (specialFilter) { specialFilter.disabled = !inSocketView || Array.from(specialFilter.options).length <= 1; specialFilter.style.opacity = specialFilter.disabled ? '0.55' : '1'; } if (threadFilter.disabled) threadFilter.value = ''; if (barbFilter.disabled) barbFilter.value = ''; if (hoseIdFilter.disabled) hoseIdFilter.value = ''; if (hoseOdFilter.disabled) hoseOdFilter.value = ''; if (sleeveFilter && sleeveFilter.disabled) sleeveFilter.value = ''; if (valveFilter && valveFilter.disabled) valveFilter.value = ''; if (elastomerFilter && elastomerFilter.disabled) elastomerFilter.value = ''; if (specialFilter && specialFilter.disabled) specialFilter.value = ''; connectionFilter.disabled = !inPartView; connectionFilter.style.opacity = inPartView ? '1' : '0.55'; if (!inPartView) connectionFilter.value = ''; } function updateSelectAvailability(select, counts){ primeOptionLabels(select); Array.from(select.options).forEach(function(option, index){ if (index === 0) { option.textContent = option.dataset.baseLabel || option.textContent; option.disabled = false; return; } var available = !!counts[option.value]; option.disabled = !available; option.textContent = available ? option.dataset.baseLabel : (option.dataset.baseLabel + ' (Unavailable)'); }); var enabledOptions = Array.from(select.options).filter(function(option, index){ return index === 0 || !option.disabled; }); var hasChoices = enabledOptions.length > 1; select.disabled = !hasChoices; select.style.opacity = hasChoices ? '1' : '0.55'; select.style.cursor = hasChoices ? '' : 'not-allowed'; if (select.value && select.selectedOptions[0] && select.selectedOptions[0].disabled) { select.value = ''; } } function refreshFilterAvailability(){ var rows = getActiveRows(); var connectionCounts = {}; var threadCounts = {}; var barbCounts = {}; var hoseIdCounts = {}; var hoseOdCounts = {}; var sleeveCounts = {}; var valveCounts = {}; var elastomerCounts = {}; var specialCounts = {}; rows.forEach(function(row){ if (rowMatches(row, 'connection') && row.dataset.connectionType) connectionCounts[row.dataset.connectionType] = (connectionCounts[row.dataset.connectionType] || 0) + 1; if (rowMatches(row, 'thread') && row.dataset.thread) threadCounts[row.dataset.thread] = (threadCounts[row.dataset.thread] || 0) + 1; if (rowMatches(row, 'barb') && row.dataset.hoseId) barbCounts[row.dataset.hoseId] = (barbCounts[row.dataset.hoseId] || 0) + 1; if (rowMatches(row, 'hoseId') && row.dataset.hoseId) hoseIdCounts[row.dataset.hoseId] = (hoseIdCounts[row.dataset.hoseId] || 0) + 1; if (rowMatches(row, 'hoseOd') && row.dataset.hoseOd) hoseOdCounts[row.dataset.hoseOd] = (hoseOdCounts[row.dataset.hoseOd] || 0) + 1; if (rowMatches(row, 'sleeve') && row.dataset.sleeveLock) sleeveCounts[row.dataset.sleeveLock] = (sleeveCounts[row.dataset.sleeveLock] || 0) + 1; if (rowMatches(row, 'valve') && row.dataset.valveType) valveCounts[row.dataset.valveType] = (valveCounts[row.dataset.valveType] || 0) + 1; if (rowMatches(row, 'elastomer') && row.dataset.elastomer) elastomerCounts[row.dataset.elastomer] = (elastomerCounts[row.dataset.elastomer] || 0) + 1; if (rowMatches(row, 'special') && row.dataset.special) specialCounts[row.dataset.special] = (specialCounts[row.dataset.special] || 0) + 1; }); updateSelectAvailability(connectionFilter, connectionCounts); updateSelectAvailability(threadFilter, threadCounts); updateSelectAvailability(barbFilter, barbCounts); updateSelectAvailability(hoseIdFilter, hoseIdCounts); updateSelectAvailability(hoseOdFilter, hoseOdCounts); updateSelectAvailability(sleeveFilter, sleeveCounts); updateSelectAvailability(valveFilter, valveCounts); updateSelectAvailability(elastomerFilter, elastomerCounts); updateSelectAvailability(specialFilter, specialCounts); updateConnectionDrivenState(); } function renderFilters(){ var rows = getActiveRows(); updateConnectionDrivenState(); var visibleCount = 0; var filteredMode = anyFilterSelected(); var hasAssembledVisible = false; var showSockets = currentView === 'sockets'; var showPlugs = currentView === 'plugs'; rows.forEach(function(row){ var filterMatches = rowMatches(row); var typeMatches = (showSockets && /socket\/female/i.test(row.dataset.couplingType || '')) || (showPlugs && /plug\/male/i.test(row.dataset.couplingType || '')); var visible = typeMatches && filterMatches && (filteredMode || row.dataset.variant !== 'yes'); row.style.display = visible ? '' : 'none'; if (visible) { visibleCount += 1; if (row.dataset.source === 'assembled') hasAssembledVisible = true; } }); subsections.forEach(function(section){ if (currentView === 'dust') { section.style.display = section.closest('#ap3000-dust-panel') ? '' : 'none'; return; } if (currentView === 'replacement') { section.style.display = section.closest('#ap3000-replacement-panel') ? '' : 'none'; return; } if (section.closest('#ap3000-dust-panel') || section.closest('#ap3000-replacement-panel')) { section.style.display = 'none'; return; } section.querySelectorAll('.ap-table-wrap').forEach(function(wrap){ var tableRows = Array.from(wrap.querySelectorAll('tbody tr')); var hasVisibleRows = tableRows.some(function(row){ return row.style.display !== 'none'; }); wrap.style.display = hasVisibleRows ? '' : 'none'; }); section.querySelectorAll('.ap-note').forEach(function(note){ note.style.display = currentView === 'plugs' ? '' : 'none'; }); var visibleRows = Array.from(section.querySelectorAll('tbody tr')).filter(function(row){ return row.style.display !== 'none'; }); section.style.display = visibleRows.length ? '' : 'none'; }); if (filterSummary) { if (currentView === 'dust') { filterSummary.textContent = 'Showing the dust cap and accessory section.'; } else if (currentView === 'replacement') { filterSummary.textContent = 'Showing the replacement parts section.'; } else { filterSummary.textContent = filteredMode ? 'Showing ' + visibleCount + ' filtered rows in the active panel.' : 'Showing ' + visibleCount + ' base rows in the active panel. Variants appear when filters are applied.'; } } if (buildSummary) { buildSummary.style.display = currentView !== 'dust' && currentView !== 'replacement' && hasAssembledVisible ? '' : 'none'; } refreshFilterAvailability(); } buttons.forEach(function(button){ button.addEventListener('click', function(){ activate(button.getAttribute('data-target')); }); }); function linkifyPartCell(cell){ var displayText = getDisplayPartText(cell.textContent); var text = getPartCode(displayText); if (!text || cell.querySelector('a')) return; var slug = getSlug(text); if (!slug) return; cell.innerHTML = '' + displayText + ''; } seriesPage.querySelectorAll('.ap-toggle-panel .ap-table tbody tr td:first-child').forEach(function(cell){ if (cell.closest('#ap3000-dust-panel')) return; linkifyPartCell(cell); }); seriesPage.querySelectorAll('#ap3000-dust-panel .ap-table tbody tr td:not(:first-child)').forEach(function(cell){ var displayText = getDisplayPartText(cell.textContent); if (!displayText || displayText === '—' || displayText === '-') return; linkifyPartCell(cell); }); [threadFilter, sleeveFilter, valveFilter, elastomerFilter, specialFilter].forEach(function(control){ if (!control) return; primeOptionLabels(control); control.addEventListener('change', renderFilters); }); if (searchFilter) { searchFilter.addEventListener('input', renderFilters); } [connectionFilter, barbFilter, hoseIdFilter, hoseOdFilter].forEach(function(control){ if (!control) return; primeOptionLabels(control); control.addEventListener('change', renderFilters); }); if (resetFilter) { resetFilter.addEventListener('click', function(){ connectionFilter.value = ''; threadFilter.value = ''; barbFilter.value = ''; hoseIdFilter.value = ''; hoseOdFilter.value = ''; searchFilter.value = ''; sleeveFilter.value = ''; valveFilter.value = ''; elastomerFilter.value = ''; specialFilter.value = ''; refreshSocketSizeOptions(); refreshThreadOptions(); renderFilters(); }); } refreshSocketSizeOptions(); activate('sockets'); return true; } function bootApPneumaticSeriesPages(){ var wraps = Array.from(document.querySelectorAll('.ap-pneumatic-page[data-ap-pneumatic-series="3000"]')); if (!wraps.length) return false; wraps.forEach(function(wrap){ initApPneumatic3000Page(wrap); }); return true; } var attempts = 0; function retryBootApPneumaticSeriesPages(){ attempts += 1; if (bootApPneumaticSeriesPages()) return; if (attempts < 20) window.setTimeout(retryBootApPneumaticSeriesPages, 250); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', retryBootApPneumaticSeriesPages); } else { retryBootApPneumaticSeriesPages(); } window.addEventListener('load', retryBootApPneumaticSeriesPages); })(); // ===== END AP PNEUMATIC SERIES ADDON.js ===== // ===== START HANSEN 4000 SERIES WORDPRESS ADDON.js ===== (function(){ function initApPneumatic4000Page(seriesPage){ if (!seriesPage || seriesPage.dataset.apPneumatic4000Init === 'true') return false; var wrap = seriesPage; var connectionFilter = wrap.querySelector('#ap4000-connection-filter'); if (!connectionFilter) return false; wrap.dataset.apPneumatic4000Init = 'true'; var buttons = Array.from(wrap.querySelectorAll('[data-target]')); var panels = Array.from(wrap.querySelectorAll('.ap-panel')); var searchFilter = wrap.querySelector('#ap4000-search-filter'); var threadFilter = wrap.querySelector('#ap4000-thread-filter'); var hoseIdFilter = wrap.querySelector('#ap4000-hose-id-filter'); var hoseOdFilter = wrap.querySelector('#ap4000-hose-od-filter'); var hoseIdLabel = wrap.querySelector('#ap4000-hose-id-label'); var sleeveFilter = wrap.querySelector('#ap4000-sleeve-filter'); var valveFilter = wrap.querySelector('#ap4000-valve-filter'); var elastomerFilter = wrap.querySelector('#ap4000-elastomer-filter'); var specialFilter = wrap.querySelector('#ap4000-special-filter'); var threadWrap = wrap.querySelector('#ap4000-thread-wrap'); var hoseIdWrap = wrap.querySelector('#ap4000-hose-id-wrap'); var hoseOdWrap = wrap.querySelector('#ap4000-hose-od-wrap'); var sleeveWrap = wrap.querySelector('#ap4000-sleeve-wrap'); var valveWrap = wrap.querySelector('#ap4000-valve-wrap'); var elastomerWrap = wrap.querySelector('#ap4000-elastomer-wrap'); var specialWrap = wrap.querySelector('#ap4000-special-wrap'); var resetBtn = wrap.querySelector('#ap4000-filter-reset'); function sanitizePartNumber(part){ return (part || '').replace(/†|§|‡|‡/gi, '').replace(/[†‡§*]/g, '').replace(/\s+/g, ''); } function partHref(part){ return 'https://airproductsusa.com/hansen-' + sanitizePartNumber(part).toLowerCase() + '/'; } function linkifyPartCells(){ wrap.querySelectorAll('[data-part-table="true"] tbody tr td:first-child').forEach(function(cell){ var displayText = cell.textContent.trim(); if (!displayText) return; if (!cell.dataset.basePart) { cell.dataset.basePart = displayText; } cell.innerHTML = '' + displayText + ''; }); } function renderPartCell(cell, partNumber){ if (!cell || !partNumber) return; cell.innerHTML = '' + partNumber + ''; } function uniqueSorted(values){ return Array.from(new Set(values.filter(Boolean))).sort(function(a,b){ return a.localeCompare(b, undefined, { numeric:true, sensitivity:'base' }); }); } function currentView(){ return wrap.getAttribute('data-current-view') || 'sockets'; } function normalizeConnection(value){ if (!value) return ''; if (value === 'threaded') return ['threaded','threaded-female']; return [value]; } function collectOptions(){ var view = currentView(); var currentConnection = connectionFilter.value || ''; var allowedConnections = normalizeConnection(currentConnection); var search = (searchFilter.value || '').toLowerCase().trim(); var buildFiltersActive = !!(sleeveFilter.value || valveFilter.value || elastomerFilter.value || specialFilter.value); var currentFilters = { sleeve: sleeveFilter.value || '', valve: valveFilter.value || '', elastomer: elastomerFilter.value || '', special: specialFilter.value || '', connection: currentConnection }; var threadValues = []; var hoseIdValues = []; var hoseOdValues = []; panels.forEach(function(panel){ if (panel.getAttribute('data-view') !== view) return; var panelConnection = panel.getAttribute('data-connection'); if (allowedConnections.length && allowedConnections.indexOf(panelConnection) === -1) return; if (view === 'sockets' && buildFiltersActive && !currentConnection && panelConnection === 'hose-clamp') return; panel.querySelectorAll('tbody tr').forEach(function(row){ if (view === 'sockets') { var partCell = row.cells[0]; var basePart = partCell && partCell.dataset.basePart ? partCell.dataset.basePart : (partCell ? partCell.textContent.trim() : ''); var rowText = row.textContent.toLowerCase(); var variantMatch = getSocketSearchVariant(basePart, panelConnection, search); var matchesSearch = !search || rowText.indexOf(search) !== -1 || !!variantMatch; var displayPart = getSocketVariantForFilters(basePart, panelConnection, currentFilters); var matchesSocketBuild = !!displayPart && rowSupportsSocketFiltersForFilters(row, currentFilters); if (!(matchesSearch && matchesSocketBuild)) return; } if (row.dataset.thread) threadValues.push(row.dataset.thread); if (row.dataset.hoseId) hoseIdValues.push(row.dataset.hoseId); if (row.dataset.hoseOd) hoseOdValues.push(row.dataset.hoseOd); }); }); return { threads: uniqueSorted(threadValues), hoseIds: uniqueSorted(hoseIdValues), hoseOds: uniqueSorted(hoseOdValues) }; } function populateSelect(select, values, label){ var current = select.value; select.innerHTML = ''; values.forEach(function(value){ var option = document.createElement('option'); option.value = value; option.textContent = value; select.appendChild(option); }); if (values.indexOf(current) !== -1) { select.value = current; } } function updateControlState(select, optionCount){ if (!select) return; select.disabled = optionCount <= 1; select.style.opacity = optionCount <= 1 ? '0.55' : '1'; select.style.cursor = optionCount <= 1 ? 'not-allowed' : ''; } function setStaticOptionAvailability(select, availableValues){ if (!select) return; var available = {}; availableValues.forEach(function(value){ available[value] = true; }); Array.from(select.options).forEach(function(option, index){ if (index === 0) return; option.disabled = !available[option.value]; }); if (select.value && !available[select.value]) { select.value = ''; } var enabledCount = Array.from(select.options).filter(function(option, index){ return index === 0 || !option.disabled; }).length; updateControlState(select, enabledCount - 1); } function updateFilterControlVisibility(){ var connection = connectionFilter.value; var view = currentView(); if (currentView() === 'dust' || currentView() === 'replacement') { threadWrap.style.display = 'none'; hoseIdWrap.style.display = 'none'; hoseOdWrap.style.display = 'none'; sleeveWrap.style.display = 'none'; valveWrap.style.display = 'none'; elastomerWrap.style.display = 'none'; specialWrap.style.display = 'none'; threadFilter.value = ''; hoseIdFilter.value = ''; hoseOdFilter.value = ''; sleeveFilter.value = ''; valveFilter.value = ''; elastomerFilter.value = ''; specialFilter.value = ''; return; } threadWrap.style.display = !connection || connection === 'hose-stem' || connection === 'hose-clamp' ? 'none' : ''; hoseIdWrap.style.display = connection === 'hose-stem' || connection === 'hose-clamp' ? '' : 'none'; hoseOdWrap.style.display = connection === 'hose-clamp' ? '' : 'none'; sleeveWrap.style.display = view === 'sockets' ? '' : 'none'; valveWrap.style.display = view === 'sockets' ? '' : 'none'; elastomerWrap.style.display = view === 'sockets' ? '' : 'none'; specialWrap.style.display = view === 'sockets' && connection !== 'hose-stem' && connection !== 'hose-clamp' ? '' : 'none'; if (hoseIdLabel) { hoseIdLabel.textContent = connection === 'hose-stem' ? 'Barb Size' : 'Hose I.D.'; } if (threadWrap.style.display === 'none') threadFilter.value = ''; if (hoseIdWrap.style.display === 'none') hoseIdFilter.value = ''; if (hoseOdWrap.style.display === 'none') hoseOdFilter.value = ''; if (sleeveWrap.style.display === 'none') sleeveFilter.value = ''; if (valveWrap.style.display === 'none') valveFilter.value = ''; if (elastomerWrap.style.display === 'none') elastomerFilter.value = ''; if (specialWrap.style.display === 'none') specialFilter.value = ''; } function updateOptions(){ if (currentView() === 'dust' || currentView() === 'replacement') { populateSelect(threadFilter, [], 'All Thread Sizes'); populateSelect(hoseIdFilter, [], 'All Hose I.D. Sizes'); populateSelect(hoseOdFilter, [], 'All Hose O.D. Sizes'); updateControlState(threadFilter, 0); updateControlState(hoseIdFilter, 0); updateControlState(hoseOdFilter, 0); return; } var options = collectOptions(); populateSelect(threadFilter, options.threads, 'All Thread Sizes'); populateSelect(hoseIdFilter, options.hoseIds, 'All Hose I.D. Sizes'); populateSelect(hoseOdFilter, options.hoseOds, 'All Hose O.D. Sizes'); updateControlState(threadFilter, options.threads.length); updateControlState(hoseIdFilter, options.hoseIds.length); updateControlState(hoseOdFilter, options.hoseOds.length); } function updateVariantMatrix(){ var hoseClampPanel = wrap.querySelector('.ap-panel[data-view="sockets"][data-connection="hose-clamp"]'); if (!hoseClampPanel) return 0; var matrix = hoseClampPanel.querySelector('table:not([data-part-table="true"])'); if (!matrix) return 0; var note = hoseClampPanel.querySelector('.ap-note'); if (note) note.style.display = 'none'; if (matrix.parentElement) matrix.parentElement.style.display = 'none'; return 0; } function rowSupportsSocketFilters(row){ return rowSupportsSocketFiltersForFilters(row, { sleeve: sleeveFilter.value || '', valve: valveFilter.value || '', elastomer: elastomerFilter.value || '', special: specialFilter.value || '', connection: connectionFilter.value || '' }); } function rowSupportsSocketFiltersForFilters(row, filters){ var part = (row.cells[0] && row.cells[0].dataset.basePart) ? row.cells[0].dataset.basePart : (row.cells[0] ? row.cells[0].textContent.trim() : ''); var connection = (filters && filters.connection) || connectionFilter.value || ''; var sleeveValue = (filters && filters.sleeve) || ''; var valveValue = (filters && filters.valve) || ''; var elastomerValue = (filters && filters.elastomer) || ''; var specialValue = (filters && filters.special) || ''; var supportsSleeve = { '4000': true, '4100': true, '4200': true, '4300': true, '4400': true, '4500E': true, '4SB3': true, '4SB7': true, '4SD7': true, '4SD9': true, '4SD11': true, '4SP13': true, '4SP15': true }; var supportsBrassValve = { '4000': true, '4100': true, '4200': true, '4300': true, '4500E': true }; var supportsStainlessValve = { '4200': true }; var supportsNoValve = { '4000A': true, '4000': true, '4100': true, '4200': true, '4300': true, '4400': true, '4500E': true, '40400E': true, '40600': true, '40800': true, '4SB3': true, '4SB7': true, '4SD7': true, '4SD9': true, '4SD11': true, '4SP13': true, '4SP15': true }; var supportsFkm = { '4000A': true, '4000': true, '4100': true, '4200': true, '4300': true, '4400': true, '4500E': true, '40400E': true, '40600': true, '40800': true, '4SB3': true, '4SB7': true, '4SD7': true, '4SD9': true, '4SD11': true, '4SP13': true, '4SP15': true }; var supportsEpdm = { '4000A': true, '4000': true, '4200': true, '4300': true, '4400': true, '40400E': true, '40600': true, '40800': true, '4SB3': true, '4SB7': true, '4SD7': true, '4SD9': true, '4SD11': true, '4SP13': true, '4SP15': true }; var supportsSpecial = { '4400': 'oxygen-cleaned' }; var matchesSleeve = !sleeveValue || (sleeveValue === 'yes' ? !!supportsSleeve[part] : true); var matchesValve = !valveValue || (valveValue === 'standard-steel') || (valveValue === 'no-valve' ? !!supportsNoValve[part] : false) || (valveValue === 'brass-valve' ? !!supportsBrassValve[part] : false) || (valveValue === 'stainless-steel-valve' ? !!supportsStainlessValve[part] : false); var matchesElastomer = !elastomerValue || (elastomerValue === 'buna-n') || (elastomerValue === 'fkm' ? !!supportsFkm[part] : false) || (elastomerValue === 'epdm' ? !!supportsEpdm[part] : false); var matchesSpecial = !specialValue || supportsSpecial[part] === specialValue; if (connection === 'hose-clamp') { matchesSpecial = !specialValue; } if (connection === 'hose-stem') { matchesSpecial = !specialValue; } return matchesSleeve && matchesValve && matchesElastomer && matchesSpecial; } function getSocketVariantList(basePart, connection){ if (connection === 'hose-clamp') { var hoseClampVariants = { '4SB3': ['4SB3','4SB3NV','4SB3143','4SB3192','4SB3NV143','4SB3NV192','4SB3SL','4SB3SL143','4SB3SL192','4SB3NVSL','4SB3NVSL143','4SB3NVSL192'], '4SB7': ['4SB7','4SB7NV','4SB7143','4SB7192','4SB7NV143','4SB7NV192','4SB7SL','4SB7SL143','4SB7SL192','4SB7NVSL','4SB7NVSL143','4SB7NVSL192'], '4SD7': ['4SD7','4SD7NV','4SD7143','4SD7192','4SD7NV143','4SD7NV192','4SD7SL','4SD7SL143','4SD7SL192','4SD7NVSL','4SD7NVSL143','4SD7NVSL192'], '4SD9': ['4SD9','4SD9NV','4SD9143','4SD9192','4SD9NV143','4SD9NV192','4SD9SL','4SD9SL143','4SD9SL192','4SD9NVSL','4SD9NVSL143','4SD9NVSL192'], '4SD11': ['4SD11','4SD11NV','4SD11143','4SD11192','4SD11NV143','4SD11NV192','4SD11SL','4SD11SL143','4SD11SL192','4SD11NVSL','4SD11NVSL143','4SD11NVSL192'], '4SP13': ['4SP13','4SP13NV','4SP13143','4SP13192','4SP13NV143','4SP13NV192','4SP13SL','4SP13SL143','4SP13SL192','4SP13NVSL','4SP13NVSL143','4SP13NVSL192'], '4SP15': ['4SP15','4SP15NV','4SP15143','4SP15192','4SP15NV143','4SP15NV192','4SP15SL','4SP15SL143','4SP15SL192','4SP15NVSL','4SP15NVSL143','4SP15NVSL192'] }; return hoseClampVariants[basePart] || [basePart]; } if (connection === 'hose-stem') { var hoseStemVariants = { '40400E': ['40400E','40400ENV','40400E143','40400E192','40400ENV143','40400ENV192'], '40600': ['40600','40600NV','40600143','40600192','40600NV143','40600NV192','40600BVSL143'], '40800': ['40800','40800NV','40800143','40800192','40800NV143','40800NV192'] }; return hoseStemVariants[basePart] || [basePart]; } var threadedVariants = { '4000A': ['4000A','4000ANV','4000A143','4000A192','4000ANV143','4000ANV192'], '4100': ['4100','4100NV','4100143','4100NV143','4100SL','4100SL143','4100NVSL','4100NVSL143','4100BVSL143'], '4000': ['4000','4000NV','4000143','4000192','4000NV143','4000NV192','4000SL','4000SL143','4000SL192','4000NVSL','4000NVSL143','4000NVSL192','4000BV143','4000BVSL143'], '4200': ['4200','4200NV','4200143','4200192','4200NV143','4200NV192','4200SL','4200SL143','4200SL192','4200NVSL','4200NVSL143','4200NVSL192','4200BV143','4200BVSL143','4200LLV'], '4300': ['4300','4300NV','4300143','4300192','4300NV143','4300NV192','4300SL','4300SL143','4300NVSL','4300NVSL143','4300NVSL192','4300BVSL143'], '4400': ['4400','4400NV','4400143','4400192','4400NV143','4400NV192','4400SL','4400SL143','4400SL192','4400NVSL','4400NVSL143','4400NVSL192','4400SLOC'], '4500E': ['4500E','4500ENV','4500E143','4500ENV143','4500SL','4500SL143','4500ENVSL','4500ENVSL143','4500BVSL143'] }; return threadedVariants[basePart] || [basePart]; } function getSocketSearchVariant(basePart, connection, search){ if (!search) return ''; var searchText = search.toLowerCase().trim(); if (!searchText) return ''; var variants = getSocketVariantList(basePart, connection); for (var i = 0; i < variants.length; i++) { if (variants[i].toLowerCase().indexOf(searchText) !== -1) { return variants[i]; } } return ''; } function getSocketVariant(basePart, connection){ return getSocketVariantForFilters(basePart, connection, { sleeve: sleeveFilter.value || '', valve: valveFilter.value || '', elastomer: elastomerFilter.value || '', special: specialFilter.value || '' }); } function getSocketVariantForFilters(basePart, connection, filters){ var sleeve = (filters && filters.sleeve) || ''; var valve = (filters && filters.valve) || ''; var elastomer = (filters && filters.elastomer) || ''; var special = (filters && filters.special) || ''; var wantsSleeve = sleeve === 'yes'; var wantsNoSleeve = sleeve === 'no' || !sleeve; var effectiveValve = valve === 'standard-steel' ? '' : valve; var wantsNoValve = effectiveValve === 'no-valve'; var explicitBunaN = elastomer === 'buna-n'; var effectiveElastomer = elastomer === 'buna-n' ? '' : elastomer; if (connection === 'hose-clamp') { if (special || effectiveValve === 'brass-valve' || effectiveValve === 'stainless-steel-valve') return null; if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? (basePart + 'NVSL143') : (basePart + 'NV143'); if (effectiveElastomer === 'epdm') return wantsSleeve ? (basePart + 'NVSL192') : (basePart + 'NV192'); if (wantsSleeve) return basePart + 'NVSL'; return basePart + 'NV'; } if (effectiveElastomer === 'fkm') return wantsSleeve ? (basePart + 'SL143') : (basePart + '143'); if (effectiveElastomer === 'epdm') return wantsSleeve ? (basePart + 'SL192') : (basePart + '192'); if (wantsSleeve) return basePart + 'SL'; return basePart; } if (connection === 'hose-stem') { if (special || effectiveValve === 'brass-valve' || effectiveValve === 'stainless-steel-valve') return null; if (basePart === '40600' && !wantsNoValve && wantsSleeve && effectiveElastomer === 'fkm') return '40600BVSL143'; if (wantsSleeve) return null; if (wantsNoValve) { if (effectiveElastomer === 'fkm') return basePart + 'NV143'; if (effectiveElastomer === 'epdm') return basePart + 'NV192'; return basePart + 'NV'; } if (effectiveElastomer === 'fkm') return basePart + '143'; if (effectiveElastomer === 'epdm') return basePart + '192'; return basePart; } if (connection === 'threaded' || connection === 'threaded-female') { if (basePart === '4000A') { if (effectiveValve === 'brass-valve' || effectiveValve === 'stainless-steel-valve' || special) return null; if (wantsSleeve) return null; if (wantsNoValve) { if (effectiveElastomer === 'fkm') return '4000ANV143'; if (effectiveElastomer === 'epdm') return '4000ANV192'; return wantsNoSleeve ? '4000ANV' : null; } if (effectiveElastomer === 'fkm') return '4000A143'; if (effectiveElastomer === 'epdm') return '4000A192'; return wantsNoSleeve ? basePart : null; } if (basePart === '4100') { if (special || effectiveElastomer === 'epdm' || effectiveValve === 'stainless-steel-valve') return null; if (effectiveValve === 'brass-valve') { if (!wantsSleeve) return null; if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4100BVSL143'; return null; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4100NVSL143' : '4100NV143'; if (wantsSleeve && !effectiveElastomer) return '4100NVSL'; if (wantsNoSleeve && !effectiveElastomer) return '4100NV'; return null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4100SL143' : '4100143'; } if (wantsSleeve && !effectiveValve && !effectiveElastomer) return '4100SL'; if (wantsNoSleeve && !effectiveValve && !effectiveElastomer) return '4100'; return null; } if (basePart === '4000') { if (special || effectiveValve === 'stainless-steel-valve') return null; if (effectiveValve === 'brass-valve') { if (wantsSleeve) { if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4000BVSL143'; return null; } if (!wantsNoSleeve) return null; if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4000BV143'; return null; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4000NVSL143' : '4000NV143'; if (effectiveElastomer === 'epdm') return wantsSleeve ? '4000NVSL192' : '4000NV192'; if (wantsSleeve) return '4000NVSL'; return wantsNoSleeve ? '4000NV' : null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4000SL143' : '4000143'; } if (effectiveElastomer === 'epdm') { return wantsSleeve ? '4000SL192' : '4000192'; } if (wantsSleeve && !effectiveValve && !effectiveElastomer) return '4000SL'; if (wantsNoSleeve && !effectiveValve && !effectiveElastomer) return '4000'; return null; } if (basePart === '4200') { if (special) return null; if (effectiveValve === 'brass-valve') { if (wantsSleeve) { if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4200BVSL143'; return null; } if (!wantsNoSleeve) return null; if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4200BV143'; return null; } if (effectiveValve === 'stainless-steel-valve') { if (wantsSleeve || effectiveElastomer) return null; return '4200LLV'; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4200NVSL143' : '4200NV143'; if (effectiveElastomer === 'epdm') return wantsSleeve ? '4200NVSL192' : '4200NV192'; if (wantsSleeve) return '4200NVSL'; return wantsNoSleeve ? '4200NV' : null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4200SL143' : '4200143'; } if (effectiveElastomer === 'epdm') { return wantsSleeve ? '4200SL192' : '4200192'; } if (wantsSleeve && !effectiveValve && !effectiveElastomer) return '4200SL'; if (wantsNoSleeve && !effectiveValve && !effectiveElastomer) return '4200'; return null; } if (basePart === '4300') { if (special || effectiveValve === 'stainless-steel-valve') return null; if (effectiveValve === 'brass-valve') { if (!wantsSleeve) return null; if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4300BVSL143'; return null; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4300NVSL143' : '4300NV143'; if (effectiveElastomer === 'epdm') return wantsSleeve ? '4300NVSL192' : '4300NV192'; if (wantsSleeve) return '4300NVSL'; return wantsNoSleeve ? '4300NV' : null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4300SL143' : '4300143'; } if (wantsSleeve && !effectiveValve && !effectiveElastomer) return '4300SL'; if (wantsNoSleeve && !effectiveValve && effectiveElastomer === 'epdm') return '4300192'; if (wantsNoSleeve && !effectiveValve && !effectiveElastomer) return '4300'; return null; } if (basePart === '4400') { if (effectiveValve === 'brass-valve' || effectiveValve === 'stainless-steel-valve') return null; if (special === 'oxygen-cleaned') { if (wantsNoValve) return null; return wantsSleeve ? '4400SLOC' : null; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4400NVSL143' : '4400NV143'; if (effectiveElastomer === 'epdm') return wantsSleeve ? '4400NVSL192' : '4400NV192'; if (wantsSleeve) return '4400NVSL'; return wantsNoSleeve ? '4400NV' : null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4400SL143' : '4400143'; } if (effectiveElastomer === 'epdm') { return wantsSleeve ? '4400SL192' : '4400192'; } if (wantsSleeve) return '4400SL'; if (wantsNoSleeve && !special && !effectiveElastomer) return '4400'; return null; } if (basePart === '4500E') { if (special || effectiveElastomer === 'epdm' || effectiveValve === 'stainless-steel-valve') return null; if (effectiveValve === 'brass-valve') { if (!wantsSleeve) return null; if (explicitBunaN) return null; if (!effectiveElastomer || effectiveElastomer === 'fkm') return '4500BVSL143'; return null; } if (wantsNoValve) { if (effectiveElastomer === 'fkm') return wantsSleeve ? '4500ENVSL143' : '4500ENV143'; if (wantsSleeve && !effectiveElastomer) return '4500ENVSL'; if (wantsNoSleeve && !effectiveElastomer) return '4500ENV'; return null; } if (effectiveElastomer === 'fkm') { return wantsSleeve ? '4500SL143' : '4500E143'; } if (wantsSleeve && !effectiveValve && !effectiveElastomer) return '4500SL'; if (wantsNoSleeve && !effectiveValve && !effectiveElastomer) return '4500E'; return null; } } return basePart; } function collectSocketBuildAvailability(){ var availability = { sleeve: [], valve: [], elastomer: [], special: [] }; if (currentView() !== 'sockets') return availability; var connection = connectionFilter.value || ''; var allowedConnections = normalizeConnection(connection); var search = (searchFilter.value || '').toLowerCase().trim(); var optionValues = { sleeve: ['yes','no'], valve: ['standard-steel','no-valve','brass-valve','stainless-steel-valve'], elastomer: ['buna-n','fkm','epdm'], special: ['oxygen-cleaned'] }; function hasMatchForFilters(testFilters){ var matched = false; panels.forEach(function(panel){ if (matched) return; if (panel.getAttribute('data-view') !== 'sockets') return; var panelConnection = panel.getAttribute('data-connection'); var panelMatchesConnection = !allowedConnections.length || allowedConnections.indexOf(panelConnection) !== -1; if (!panelMatchesConnection) return; panel.querySelectorAll('[data-part-table="true"] tbody tr').forEach(function(row){ if (matched) return; var matchesThread = !threadFilter.value || row.dataset.thread === threadFilter.value; var matchesHoseId = !hoseIdFilter.value || row.dataset.hoseId === hoseIdFilter.value; var matchesHoseOd = !hoseOdFilter.value || row.dataset.hoseOd === hoseOdFilter.value; var part = (row.cells[0] && row.cells[0].dataset.basePart) ? row.cells[0].dataset.basePart : (row.cells[0] ? row.cells[0].textContent.trim() : ''); var rowText = row.textContent.toLowerCase(); var variantMatch = getSocketSearchVariant(part, panelConnection, search); var matchesSearch = !search || rowText.indexOf(search) !== -1 || !!variantMatch; if (!(matchesSearch && matchesThread && matchesHoseId && matchesHoseOd)) return; var simulatedFilters = { sleeve: testFilters.sleeve, valve: testFilters.valve, elastomer: testFilters.elastomer, special: testFilters.special, connection: connection }; var displayPart = getSocketVariantForFilters(part, panelConnection, simulatedFilters); var rowMatches = !!displayPart && rowSupportsSocketFiltersForFilters(row, simulatedFilters); if (rowMatches) matched = true; }); }); return matched; } var currentFilters = { sleeve: sleeveFilter.value || '', valve: valveFilter.value || '', elastomer: elastomerFilter.value || '', special: specialFilter.value || '' }; ['sleeve','valve','elastomer','special'].forEach(function(key){ availability[key] = []; optionValues[key].forEach(function(optionValue){ var testFilters = { sleeve: currentFilters.sleeve, valve: currentFilters.valve, elastomer: currentFilters.elastomer, special: currentFilters.special }; testFilters[key] = optionValue; if (hasMatchForFilters(testFilters)) { availability[key].push(optionValue); } }); }); return availability; } function render(){ var view = currentView(); var connection = connectionFilter.value; var allowedConnections = normalizeConnection(connection); var search = (searchFilter.value || '').toLowerCase().trim(); var rowsShown = 0; updateFilterControlVisibility(); updateOptions(); var socketAvailability = collectSocketBuildAvailability(); setStaticOptionAvailability(sleeveFilter, socketAvailability.sleeve); setStaticOptionAvailability(valveFilter, socketAvailability.valve); setStaticOptionAvailability(elastomerFilter, socketAvailability.elastomer); setStaticOptionAvailability(specialFilter, socketAvailability.special); panels.forEach(function(panel){ var panelView = panel.getAttribute('data-view'); var panelConnection = panel.getAttribute('data-connection'); var panelMatchesView = panelView === view; var panelMatchesConnection = (view === 'dust' || view === 'replacement') ? panelConnection === view : (!allowedConnections.length || allowedConnections.indexOf(panelConnection) !== -1); var panelShouldShow = panelMatchesView && panelMatchesConnection; var panelRowsShown = 0; panel.querySelectorAll('tbody tr').forEach(function(row){ var matchesThread = !threadFilter.value || row.dataset.thread === threadFilter.value; var matchesHoseId = !hoseIdFilter.value || row.dataset.hoseId === hoseIdFilter.value; var matchesHoseOd = !hoseOdFilter.value || row.dataset.hoseOd === hoseOdFilter.value; var partCell = row.cells[0]; var basePart = partCell && partCell.dataset.basePart ? partCell.dataset.basePart : (partCell ? partCell.textContent.trim() : ''); var displayPart = basePart; var matchesSocketBuild = true; var rowText = row.textContent.toLowerCase(); var searchVariant = ''; if (view === 'sockets') { displayPart = getSocketVariant(basePart, panelConnection); searchVariant = getSocketSearchVariant(basePart, panelConnection, search); if ((!sleeveFilter.value && !valveFilter.value && !elastomerFilter.value && !specialFilter.value) && searchVariant) { displayPart = searchVariant; } matchesSocketBuild = !!displayPart && rowSupportsSocketFilters(row); if (partCell) { renderPartCell(partCell, displayPart || basePart); } } var matchesSearch = !search || rowText.indexOf(search) !== -1 || (!!displayPart && displayPart.toLowerCase().indexOf(search) !== -1) || !!searchVariant; var showRow = panelShouldShow && matchesSearch && matchesThread && matchesHoseId && matchesHoseOd && matchesSocketBuild; row.style.display = showRow ? '' : 'none'; if (showRow) panelRowsShown++; }); panel.classList.toggle('is-active', panelShouldShow && panelRowsShown > 0); if (panelShouldShow) rowsShown += panelRowsShown; }); updateVariantMatrix(); if (view !== 'sockets' || connection !== 'hose-clamp') { var hoseClampPanel = wrap.querySelector('.ap-panel[data-view="sockets"][data-connection="hose-clamp"]'); if (hoseClampPanel) { var hoseClampNote = hoseClampPanel.querySelector('.ap-note'); var hoseClampMatrix = hoseClampPanel.querySelector('table:not([data-part-table="true"])'); if (hoseClampNote) hoseClampNote.style.display = 'none'; if (hoseClampMatrix && hoseClampMatrix.parentElement) hoseClampMatrix.parentElement.style.display = 'none'; } } filterCard.style.display = (view === 'dust' || view === 'replacement') ? 'none' : ''; } buttons.forEach(function(button){ button.addEventListener('click', function(){ buttons.forEach(function(btn){ btn.classList.remove('is-active'); }); button.classList.add('is-active'); wrap.setAttribute('data-current-view', button.getAttribute('data-target')); render(); }); }); [connectionFilter, threadFilter, hoseIdFilter, hoseOdFilter, sleeveFilter, valveFilter, elastomerFilter, specialFilter].forEach(function(control){ control.addEventListener('change', render); }); searchFilter.addEventListener('input', render); resetBtn.addEventListener('click', function(){ connectionFilter.value = ''; searchFilter.value = ''; threadFilter.value = ''; hoseIdFilter.value = ''; hoseOdFilter.value = ''; sleeveFilter.value = ''; valveFilter.value = ''; elastomerFilter.value = ''; specialFilter.value = ''; render(); }); linkifyPartCells(); render(); return true; } function bootApPneumatic4000(){ var pages = document.querySelectorAll('.ap-pneumatic-page[data-ap-pneumatic-series="4000"]'); if (!pages.length) return false; var activated = false; pages.forEach(function(seriesPage){ if (initApPneumatic4000Page(seriesPage)) activated = true; }); return activated; } function retryBootApPneumatic4000(){ if (bootApPneumatic4000()) return; setTimeout(bootApPneumatic4000, 150); setTimeout(bootApPneumatic4000, 600); setTimeout(bootApPneumatic4000, 1500); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', retryBootApPneumatic4000); } else { retryBootApPneumatic4000(); } window.addEventListener('load', retryBootApPneumatic4000); })(); // ===== END HANSEN 4000 SERIES WORDPRESS ADDON.js ===== // ===== START HANSEN 5000 SERIES SCRIPT CLEAN.js ===== (function(){ var wrap = document.querySelector('.ap-pneumatic-page[data-ap-pneumatic-series="5000"]'); if (!wrap || wrap.dataset.apInit === 'true') return; wrap.dataset.apInit = 'true'; var buttons = Array.from(wrap.querySelectorAll('[data-target]')); var panels = Array.from(wrap.querySelectorAll('.ap-panel')); var filterCard = wrap.querySelector('.ap-filter-card'); var connectionFilter = wrap.querySelector('#ap5000-connection-filter'); var searchFilter = wrap.querySelector('#ap5000-search-filter'); var threadFilter = wrap.querySelector('#ap5000-thread-filter'); var barbFilter = wrap.querySelector('#ap5000-barb-filter'); var hoseIdFilter = wrap.querySelector('#ap5000-hose-id-filter'); var hoseOdFilter = wrap.querySelector('#ap5000-hose-od-filter'); var sleeveFilter = wrap.querySelector('#ap5000-sleeve-filter'); var valveFilter = wrap.querySelector('#ap5000-valve-filter'); var elastomerFilter = wrap.querySelector('#ap5000-elastomer-filter'); var resetBtn = wrap.querySelector('#ap5000-filter-reset'); var threadWrap = wrap.querySelector('#ap5000-thread-wrap'); var barbWrap = wrap.querySelector('#ap5000-barb-wrap'); var hoseIdWrap = wrap.querySelector('#ap5000-hose-id-wrap'); var hoseOdWrap = wrap.querySelector('#ap5000-hose-od-wrap'); var sleeveWrap = wrap.querySelector('#ap5000-sleeve-wrap'); var valveWrap = wrap.querySelector('#ap5000-valve-wrap'); var elastomerWrap = wrap.querySelector('#ap5000-elastomer-wrap'); var socketBases = { '50100': true, '5100E': true, '5300E': true, '5500': true, '5000A': true, '5000': true, '5200': true, '5400E': true, '50400': true, '5700E': true, '5800E': true, '5900': true, '5SD5': true, '5SD7': true, '5SD9': true, '5SD11': true, '5SP13': true, '5SP15': true, '5SR23': true, '5SR25': true, '5SR27': true }; var priceListLimited = { '5000': { sl: true }, '5000A': { sl: true, fkm: true, epdm: true }, '5200': { sl: true, fkm: true, epdm: true }, '5300E': { sl: true, fkm: true, epdm: true }, '5500': { sl: true, fkm: true }, '5700E': { sl: true, fkm: true }, '5800E': { fkm: true }, '5900': { sl: true }, '5SD9': { fkm: true }, '5SP13': { fkm: true }, '5SR25': { sl: true } }; function sanitizePartNumber(part){ return (part || '').replace(/†|§|‡|‡|†|‡/gi, '').replace(/[†‡§*]/g, '').replace(/\s+/g, ''); } function partHref(part){ return 'https://airproductsusa.com/hansen-' + sanitizePartNumber(part).toLowerCase() + '/'; } function uniqueSorted(values){ return Array.from(new Set(values.filter(Boolean))).sort(function(a,b){ return a.localeCompare(b, undefined, { numeric:true, sensitivity:'base' }); }); } function currentView(){ return wrap.getAttribute('data-current-view') || 'sockets'; } function normalizeConnection(value){ if (!value) return []; if (value === 'threaded') return ['threaded','threaded-female']; return [value]; } function isSocketView(){ return currentView() === 'sockets'; } function shouldShowSleeve(basePart){ return !!(priceListLimited[basePart] && priceListLimited[basePart].sl); } function shouldShowFkm(basePart){ return !!(priceListLimited[basePart] && priceListLimited[basePart].fkm); } function shouldShowEpdm(basePart){ return !!(priceListLimited[basePart] && priceListLimited[basePart].epdm); } function getSocketVariant(basePart, filters){ if (!socketBases[basePart]) return basePart; var sleeve = (filters && filters.sleeve) || ''; var valve = (filters && filters.valve) || ''; var elastomer = (filters && filters.elastomer) || ''; if (sleeve === 'yes' && !shouldShowSleeve(basePart)) return ''; if (elastomer === 'fkm' && !shouldShowFkm(basePart)) return ''; if (elastomer === 'epdm' && !shouldShowEpdm(basePart)) return ''; var part = basePart; if (valve === 'no-valve') part += 'NV'; if (valve === 'brass-valve') part += 'BV'; if (valve === 'stainless-steel-valve') part += 'LLV'; if (sleeve === 'yes') part += 'SL'; if (elastomer === 'fkm') part += '143'; if (elastomer === 'epdm') part += '192'; return part; } function getSocketVariantCandidates(basePart){ if (!socketBases[basePart]) return [basePart]; var variants = {}; ['', 'standard-steel', 'no-valve', 'brass-valve', 'stainless-steel-valve'].forEach(function(valve){ ['', 'no', 'yes'].forEach(function(sleeve){ ['', 'buna-n', 'fkm', 'epdm'].forEach(function(elastomer){ var part = getSocketVariant(basePart, { valve: valve === 'standard-steel' ? '' : valve, sleeve: sleeve === 'no' ? '' : sleeve, elastomer: elastomer === 'buna-n' ? '' : elastomer }); if (part) variants[part] = true; }); }); }); return Object.keys(variants); } function renderPartCell(cell, partNumber){ if (!cell || !partNumber) return; cell.innerHTML = '' + partNumber + ''; } function getBasePartFromRow(row){ var cell = row.cells[0]; return cell && cell.dataset.basePart ? cell.dataset.basePart : (cell ? cell.textContent.trim() : ''); } function rowMatchesConnectionFilters(row, connection){ if (connection === 'threaded' || connection === 'threaded-female') { return !threadFilter.value || row.dataset.thread === threadFilter.value; } if (connection === 'hose-stem') { return !barbFilter.value || row.dataset.hoseId === barbFilter.value; } if (connection === 'hose-clamp') { var hoseIdMatch = !hoseIdFilter.value || row.dataset.hoseId === hoseIdFilter.value; var hoseOdMatch = !hoseOdFilter.value || row.dataset.hoseOd === hoseOdFilter.value; return hoseIdMatch && hoseOdMatch; } return true; } function activeSocketFilters(){ return { sleeve: sleeveFilter.value || '', valve: valveFilter.value || '', elastomer: elastomerFilter.value || '' }; } function populateSelect(select, values, label){ var current = select.value; select.innerHTML = ''; values.forEach(function(value){ var option = document.createElement('option'); option.value = value; option.textContent = value; select.appendChild(option); }); if (values.indexOf(current) !== -1) { select.value = current; } else { select.value = ''; } } function updateControlState(select){ if (!select) return; select.disabled = select.options.length <= 1; select.style.opacity = select.disabled ? '0.55' : '1'; select.style.cursor = select.disabled ? 'not-allowed' : ''; } function setStaticOptionAvailability(select, allowedValues){ if (!select) return; var allowed = {}; (allowedValues || []).forEach(function(value){ allowed[value] = true; }); Array.from(select.options).forEach(function(option){ if (!option.value) { option.disabled = false; option.hidden = false; return; } var show = !!allowed[option.value]; option.disabled = !show; option.hidden = false; }); if (select.value && !allowed[select.value]) { select.value = ''; } } function collectRowOptions(){ var view = currentView(); var selectedConnection = connectionFilter.value || ''; var allowedConnections = normalizeConnection(selectedConnection); var search = (searchFilter.value || '').toLowerCase().trim(); var threads = []; var barbs = []; var hoseIds = []; var hoseOds = []; panels.forEach(function(panel){ var panelView = panel.getAttribute('data-view'); var panelConnection = panel.getAttribute('data-connection'); if (panelView !== view) return; if (allowedConnections.length && allowedConnections.indexOf(panelConnection) === -1) return; panel.querySelectorAll('[data-part-table="true"] tbody tr').forEach(function(row){ var basePart = getBasePartFromRow(row); var candidates = view === 'sockets' ? getSocketVariantCandidates(basePart) : [basePart]; var rowText = row.textContent.toLowerCase(); var matchesSearch = !search || rowText.indexOf(search) !== -1 || candidates.some(function(part){ return part.toLowerCase().indexOf(search) !== -1; }); if (!matchesSearch) return; if (view === 'sockets' && !getSocketVariant(basePart, activeSocketFilters())) return; if (panelConnection === 'threaded' || panelConnection === 'threaded-female') { if (row.dataset.thread) threads.push(row.dataset.thread); } if (panelConnection === 'hose-stem') { if (row.dataset.hoseId && (!barbFilter.value || row.dataset.hoseId === barbFilter.value || !barbFilter.value)) { barbs.push(row.dataset.hoseId); } } if (panelConnection === 'hose-clamp') { var matchesSelectedHoseId = !hoseIdFilter.value || row.dataset.hoseId === hoseIdFilter.value; var matchesSelectedHoseOd = !hoseOdFilter.value || row.dataset.hoseOd === hoseOdFilter.value; if (row.dataset.hoseId && matchesSelectedHoseOd) hoseIds.push(row.dataset.hoseId); if (row.dataset.hoseOd && matchesSelectedHoseId) hoseOds.push(row.dataset.hoseOd); } }); }); return { threads: uniqueSorted(threads), barbs: uniqueSorted(barbs), hoseIds: uniqueSorted(hoseIds), hoseOds: uniqueSorted(hoseOds) }; } function collectSocketAvailability(){ var availability = { sleeve: [], valve: [], elastomer: [] }; if (!isSocketView()) return availability; var selectedConnection = connectionFilter.value || ''; var allowedConnections = normalizeConnection(selectedConnection); var search = (searchFilter.value || '').toLowerCase().trim(); var options = { sleeve: ['yes','no'], valve: ['standard-steel','no-valve','brass-valve','stainless-steel-valve'], elastomer: ['buna-n','fkm','epdm'] }; function hasMatch(testFilters){ var matched = false; panels.forEach(function(panel){ if (matched) return; if (panel.getAttribute('data-view') !== 'sockets') return; var panelConnection = panel.getAttribute('data-connection'); if (allowedConnections.length && allowedConnections.indexOf(panelConnection) === -1) return; panel.querySelectorAll('[data-part-table="true"] tbody tr').forEach(function(row){ if (matched) return; if (!rowMatchesConnectionFilters(row, panelConnection)) return; var basePart = getBasePartFromRow(row); var displayPart = getSocketVariant(basePart, testFilters); if (!displayPart) return; var rowText = row.textContent.toLowerCase(); var candidates = getSocketVariantCandidates(basePart); var matchesSearch = !search || rowText.indexOf(search) !== -1 || candidates.some(function(part){ return part.toLowerCase().indexOf(search) !== -1; }); if (matchesSearch) matched = true; }); }); return matched; } var current = activeSocketFilters(); ['sleeve','valve','elastomer'].forEach(function(key){ options[key].forEach(function(value){ var test = { sleeve: current.sleeve, valve: current.valve, elastomer: current.elastomer }; test[key] = (value === 'no' && key === 'sleeve') ? '' : (value === 'buna-n' && key === 'elastomer' ? '' : (value === 'standard-steel' && key === 'valve' ? '' : value)); if (hasMatch(test)) availability[key].push(value); }); }); return availability; } function updateFilterVisibility(){ var view = currentView(); var selectedConnection = connectionFilter.value || ''; filterCard.style.display = (view === 'dust' || view === 'replacement') ? 'none' : ''; threadWrap.style.display = 'none'; barbWrap.style.display = 'none'; hoseIdWrap.style.display = 'none'; hoseOdWrap.style.display = 'none'; sleeveWrap.style.display = view === 'sockets' ? '' : 'none'; valveWrap.style.display = view === 'sockets' ? '' : 'none'; elastomerWrap.style.display = view === 'sockets' ? '' : 'none'; if (!selectedConnection) return; if (selectedConnection === 'threaded') threadWrap.style.display = ''; if (selectedConnection === 'hose-stem') barbWrap.style.display = ''; if (selectedConnection === 'hose-clamp') { hoseIdWrap.style.display = ''; hoseOdWrap.style.display = ''; } } function updateOptionLists(){ var rowOptions = collectRowOptions(); populateSelect(threadFilter, rowOptions.threads, 'All Thread Sizes'); populateSelect(barbFilter, rowOptions.barbs, 'All Barb Sizes'); populateSelect(hoseIdFilter, rowOptions.hoseIds, 'All Hose I.D. Sizes'); populateSelect(hoseOdFilter, rowOptions.hoseOds, 'All Hose O.D. Sizes'); updateControlState(threadFilter); updateControlState(barbFilter); updateControlState(hoseIdFilter); updateControlState(hoseOdFilter); var availability = collectSocketAvailability(); setStaticOptionAvailability(sleeveFilter, availability.sleeve); setStaticOptionAvailability(valveFilter, availability.valve); setStaticOptionAvailability(elastomerFilter, availability.elastomer); } function render(){ updateFilterVisibility(); updateOptionLists(); var view = currentView(); var selectedConnection = connectionFilter.value || ''; var allowedConnections = normalizeConnection(selectedConnection); var search = (searchFilter.value || '').toLowerCase().trim(); panels.forEach(function(panel){ var panelView = panel.getAttribute('data-view'); var panelConnection = panel.getAttribute('data-connection'); var panelMatchesView = panelView === view; var panelMatchesConnection = (view === 'dust' || view === 'replacement') ? panelConnection === view : (!allowedConnections.length || allowedConnections.indexOf(panelConnection) !== -1); var shownRows = 0; panel.querySelectorAll('[data-part-table="true"] tbody tr').forEach(function(row){ var basePart = getBasePartFromRow(row); var displayPart = view === 'sockets' ? getSocketVariant(basePart, activeSocketFilters()) : basePart; var candidates = view === 'sockets' ? getSocketVariantCandidates(basePart) : [basePart]; var rowText = row.textContent.toLowerCase(); var matchesSearch = !search || rowText.indexOf(search) !== -1 || candidates.some(function(part){ return part.toLowerCase().indexOf(search) !== -1; }); var matchesConnection = rowMatchesConnectionFilters(row, panelConnection); var show = panelMatchesView && panelMatchesConnection && matchesSearch && matchesConnection && !!displayPart; row.style.display = show ? '' : 'none'; if (show) { shownRows++; renderPartCell(row.cells[0], displayPart); } }); panel.classList.toggle('is-active', (view === 'dust' || view === 'replacement') ? panelMatchesView && panelMatchesConnection : panelMatchesView && panelMatchesConnection && shownRows > 0); }); } wrap.querySelectorAll('[data-part-table="true"] tbody tr td:first-child').forEach(function(cell){ if (!cell.dataset.basePart) cell.dataset.basePart = cell.textContent.trim(); }); buttons.forEach(function(button){ button.addEventListener('click', function(){ buttons.forEach(function(btn){ btn.classList.remove('is-active'); }); button.classList.add('is-active'); wrap.setAttribute('data-current-view', button.getAttribute('data-target')); render(); }); }); [connectionFilter, threadFilter, barbFilter, hoseIdFilter, hoseOdFilter, sleeveFilter, valveFilter, elastomerFilter].forEach(function(control){ control.addEventListener('change', render); }); searchFilter.addEventListener('input', render); resetBtn.addEventListener('click', function(){ connectionFilter.value = ''; searchFilter.value = ''; threadFilter.value = ''; barbFilter.value = ''; hoseIdFilter.value = ''; hoseOdFilter.value = ''; sleeveFilter.value = ''; valveFilter.value = ''; elastomerFilter.value = ''; render(); }); render(); })(); // ===== END HANSEN 5000 SERIES SCRIPT CLEAN.js =====