// ═══════════════════════════════════════════════════════ // CONFIGURATION // ═══════════════════════════════════════════════════════ const CONFIG = { companyName: 'Vulcan Mechanical Services' // password and apiKey have been moved to Cloudflare environment variables // Set PASSWORD and OPENAI_API_KEY in your Cloudflare Pages dashboard }; // ═══════════════════════════════════════════════════════ // DATA // ═══════════════════════════════════════════════════════ const EQUIPMENT = {"Package Unit":[{"assetType":"Package DX with Gas Heat","unitDesc":"PKG"},{"assetType":"Package DX with Electric Heat","unitDesc":"PKG"},{"assetType":"Package DX with HW Coils","unitDesc":"PKG"},{"assetType":"Package DX Cooling Only","unitDesc":"PKG"},{"assetType":"Package Water-Coils Heat Cool","unitDesc":"PKG"},{"assetType":"Package Water-Coils Cooling Only","unitDesc":"PKG"},{"assetType":"PTAC (Package Terminal Air Conditioner)","unitDesc":"PTAC"},{"assetType":"Unit Ventilator","unitDesc":"VENTILATOR"}],"Split Unit Condenser":[{"assetType":"Split System Condenser Air","unitDesc":"SPLITCND"},{"assetType":"Split System Condenser Water","unitDesc":"SPLITCND"},{"assetType":"Split Ductless Condenser","unitDesc":"DSCU"}],"Air Handler":[{"assetType":"AHU Gas Heat","unitDesc":"AHU"},{"assetType":"AHU Electric Heat","unitDesc":"AHU"},{"assetType":"AHU Cooling Only","unitDesc":"AHU"},{"assetType":"AHU Water Cooled Heat/ Cool","unitDesc":"AHU"},{"assetType":"AHU Water Cooled Cooling Only","unitDesc":"AHU"},{"assetType":"Split System AHU","unitDesc":"AHU"},{"assetType":"Split Ductless AHU","unitDesc":"DSAH"}],"VRF":[{"assetType":"Split System VRF/VRV (Variable Refrigerant Flow) Condensing Unit","unitDesc":"VRF CU"},{"assetType":"Split System VRF/VRV (Variable Refrigerant Flow) Indoor Unit","unitDesc":"Cassette"}],"Chiller":[{"assetType":"Reciprocating Chiller Air Cooled","unitDesc":"CHILLER"},{"assetType":"Reciprocating Chiller Water Cooled","unitDesc":"CHILLER"},{"assetType":"Screw Chiller Air Cooled","unitDesc":"CHILLER"},{"assetType":"Screw Chiller Water Cooled","unitDesc":"CHILLER"},{"assetType":"Scroll Chiller Air Cooled","unitDesc":"CHILLER"},{"assetType":"Scroll Chiller Water Cooled","unitDesc":"CHILLER"},{"assetType":"Centrifugal Chiller","unitDesc":"CHILLER"},{"assetType":"Absorption Chiller","unitDesc":"CHILLER"}],"Boiler":[{"assetType":"Boiler Gas- Fired Hot Water","unitDesc":"BOILER"},{"assetType":"Boiler Oil- Fired Hot Water","unitDesc":"BOILER"},{"assetType":"Boiler Electric Hot Water","unitDesc":"BOILER"},{"assetType":"Boiler Gas- Fired Steam","unitDesc":"BOILER"},{"assetType":"Boiler Oil- Fired Steam","unitDesc":"BOILER"},{"assetType":"Boiler Electric Steam","unitDesc":"BOILER"}],"Tower":[{"assetType":"Cooling Tower","unitDesc":"TOWER"},{"assetType":"Dry Cooler","unitDesc":"TOWER"}],"CRAC":[{"assetType":"CRAC DX Evaporator with Compressor Inside","unitDesc":"CRAC"},{"assetType":"CRAC DX Evaporator/ Compressor Outside","unitDesc":"CRAC"},{"assetType":"CRAC CW Coil/Building Condenser Loop","unitDesc":"CRAC"}],"Water Source":[{"assetType":"Water Source Heat Pump","unitDesc":"WSHP"},{"assetType":"Geothermal Water Source Heat Pump","unitDesc":"WSHP"}],"Make Up Air":[{"assetType":"MAU","unitDesc":"MAU"},{"assetType":"MAU","unitDesc":"MAU"},{"assetType":"MAU","unitDesc":"MAU"}],"Energy Recovery":[{"assetType":"ERV (Energy Recovery Unit)","unitDesc":"ERV"}],"Heater":[{"assetType":"Gas Infrared Heater","unitDesc":"HEATER"},{"assetType":"Unit Heater Electric Boost","unitDesc":"HEATER"},{"assetType":"Unit Heater Electric Radiator","unitDesc":"HEATER"},{"assetType":"Unit Heater Gas Fired","unitDesc":"HEATER"},{"assetType":"Unit Heater With Coils","unitDesc":"HEATER"},{"assetType":"Zone Heater","unitDesc":"HEATER"}],"VAV":[{"assetType":"VAV Box no ReHeat","unitDesc":"VAV"},{"assetType":"VAV Box with ReHeat","unitDesc":"VAV"}],"VFD":[{"assetType":"VFD - Variable Frequency Drive","unitDesc":"VFD"}],"Fans":[{"assetType":"Exhaust Fan","unitDesc":"EF"},{"assetType":"Kitchen Fan","unitDesc":"EF"},{"assetType":"General Purpose Fan","unitDesc":"SPFAN"},{"assetType":"Special Use Fan","unitDesc":"SPFAN"}],"Pumps":[{"assetType":"Chilled Water Pump","unitDesc":"Chilled Water Pump"},{"assetType":"Condenser Water Pump","unitDesc":"Condenser Water Pump"},{"assetType":"Hot Water Pump","unitDesc":"Hot Water Pump"},{"assetType":"General Purpose Pump","unitDesc":"General Purpose Pump"},{"assetType":"Sump Pump","unitDesc":"Sump Pump"},{"assetType":"Special Use Pump","unitDesc":"Special Use Pump"}],"Misc":[{"assetType":"Miscellaneous Equipment","unitDesc":"MISC"}]}; const ASSET_CODES = {"AHU Gas Heat":"AHU-GAS","AHU Electric Heat":"AHU-ELC","AHU Cooling Only":"AHU-CLG","AHU Water Cooled Heat/ Cool":"AHU-WT-HC","AHU Water Cooled Cooling Only":"AHU-WT-CLG","AHU Furnace":"AHU-FURNANCE","Boiler Gas- Fired Hot Water":"BLR-GAS-HW","Boiler Oil- Fired Hot Water":"BLR-OIL-HW","Boiler Electric Hot Water":"BLR-ELC-HW","Boiler Gas- Fired Steam":"BLR-GAS-STM","Boiler Oil- Fired Steam":"BLR-OIL-STM","Boiler Electric Steam":"BLR-ELC-STM","Reciprocating Chiller Air Cooled":"CHLR-REC-AC","Reciprocating Chiller Water Cooled":"CHLR-REC-WC","Screw Chiller Air Cooled":"CHLR-SCRW-AC","Screw Chiller Water Cooled":"CHLR-SCRW-WC","Scroll Chiller Air Cooled":"CHLR-SCRL-AC","Scroll Chiller Water Cooled":"CHLR-SCRL-WC","Centrifugal Chiller":"CHLR-CENT","Absorption Chiller":"CHLR-ABS","Cooling Tower":"TOWER-CLG","Dry Cooler":"TOWER-DRY","CRAC DX Evaporator with Compressor Inside":"CRAC-DX-IN","CRAC DX Evaporator/ Compressor Outside":"CRAC-DX-OUT","CRAC CW Coil/Building Condenser Loop":"CRAC-CW","Water Source Heat Pump":"WSHP","Geothermal Water Source Heat Pump":"GSHP","MAU":"MAU","ERV (Energy Recovery Unit)":"ERV","Gas Infrared Heater":"HTR-GAS-IR","Unit Heater Electric Boost":"HTR-ELC-BST","Unit Heater Electric Radiator":"HTR-ELC-RAD","Unit Heater Gas Fired":"HTR-GAS","Unit Heater With Coils":"HTR-COIL","Zone Heater":"HTR-ZONE","VAV Box no ReHeat":"VAV-NRH","VAV Box with ReHeat":"VAV-RH","VFD - Variable Frequency Drive":"VFD","Exhaust Fan":"EF","Kitchen Fan":"EF-KTCHN","General Purpose Fan":"SPFAN-GP","Special Use Fan":"SPFAN-SU","Chilled Water Pump":"PMP-CHW","Condenser Water Pump":"PMP-CDW","Hot Water Pump":"PMP-HW","General Purpose Pump":"PMP-GP","Sump Pump":"PMP-SUMP","Special Use Pump":"PMP-SU","Package DX with Gas Heat":"PKG-GAS","Package DX with Electric Heat":"PKG-ELC","Package DX with HW Coils":"PKG-HW","Package DX Cooling Only":"PKG-CLG","Package Water-Coils Heat Cool":"PKG-WT-HC","Package Water-Coils Cooling Only":"PKG-WT-CLG","PTAC (Package Terminal Air Conditioner)":"PTAC","Unit Ventilator":"VENTILATOR","Split System Condenser Air":"SPLITCND-AC","Split System Condenser Water":"SPLITCND-WC","Split Ductless Condenser":"DSCU","Split System AHU":"AHU-SPLT","Split Ductless AHU":"DSAH","Split System VRF/VRV (Variable Refrigerant Flow) Condensing Unit":"VRF-CU","Split System VRF/VRV (Variable Refrigerant Flow) Indoor Unit":"VRF-AH"}; const LOCATIONS = ["Rooftop","Mechanical Room","Ground Outside","Basement","Floor Mounted","Above Ceiling","Flush w/ Ceiling","Wall Mounted","Lift Needed"]; const FILTER_TYPES_ORDER = ["Pleated Merv 8","Washable","Bag","Box","Pleated Merv 10","Pleated Merv 11","Pleated Merv 13","Poly Pad","HEPA","Fiberglass"]; const NO_NUMBER_CATS = ["VAV","Fans","Pumps"]; const NO_FILTER_CATS = ["Split Unit Condenser","VRF","Chiller","Boiler","Heater","VFD"]; const NO_BELT_CATS = ["Split Unit Condenser","VRF","Chiller","Boiler","Heater","VFD"]; const BELT_OK_NO_FILTER = ["Tower"]; const BRAND_LIST = ["Trane","American Standard","Carrier","York","Aaon","Addison","Aircoil","Amana","Baltimore Aircoil","Bryant","Captive Aire","Climacool","Comfortmaker","Daikin","Data Aire","Desert Aire","Dunham Bush","Evapco","Frigel","Fujitsu","Goodman","Greenheck","Heil","Johnson Controls","Ice Western","Lennox","Lg","Liebert","Marley","Mcquay","Mitsubishi","Payne","Poolpak","Rheem","Ruud","Samsung","Stulz","Tempstar","Vertiv"]; const REFRIGERANT_LIST = ["R410A","R22","R454B","R32","R134A","R407C","R404A","Other"]; const AHU_CATS = ["Air Handler"]; const CONDENSER_CATS = ["Split Unit Condenser","VRF"]; // Filter catalog const FILTER_CATALOG = {"Pleated Merv 8":["1X9.25x21.75 Pleated MERV 8","1X9.25x23.5 Pleated MERV 8","1X9.25x31 Pleated MERV 8","1X9.25x43.5 Pleated MERV 8","1x10x20 Pleated MERV 8","1x10x24 Pleated MERV 8","1x12x16 Pleated MERV 8","1x12x18 Pleated MERV 8","1x12x20 Pleated MERV 8","1x12x24 Pleated MERV 8","1x12x25 Pleated MERV 8","1x12x30 5/8 Pleated MERV 8","1x14x14 Pleated MERV 8","1x14x20 Pleated MERV 8","1X14X22 Pleated MERV 8","1x14x24 Pleated MERV 8","1x14x25 Pleated MERV 8","1x14x30 Pleated MERV 8","1x15x20 Pleated MERV 8","1x15x25 Pleated MERV 8","1x16x16 Pleated MERV 8","1x16x20 Pleated MERV 8","1X16.25X21.5 Pleated MERV 8","1x16x22.25 Pleated MERV 8","1x16x24 Pleated MERV 8","1x16x25 Pleated MERV 8","1x16x30 Pleated MERV 8","1x18x18 Pleated MERV 8","1x18x20 Pleated MERV 8","1X18X22 Pleated MERV 8","1x18x24 Pleated MERV 8","1x18x25 Pleated MERV 8","1x19x27 Pleated MERV 8","1x20x20 Pleated MERV 8","1x20x22 Pleated MERV 8","1x20x25 Pleated MERV 8","1x20x30 Pleated MERV 8","1X21.5X23.5 Pleated MERV 8","1x22x22 Pleated MERV 8","1x23.5x25 Pleated Merv 8","1x24x24 Pleated MERV 8","1x24x30 Pleated MERV 8","1x25x25 Pleated MERV 8","1x30x30 Pleated MERV 8","2x10x20 Pleated MERV 8","2x12x20 Pleated MERV 8","2x12x24 Pleated MERV 8","2X14X14 Pleated MERV 8","2x14x20 Pleated MERV 8","2x14x25 Pleated MERV 8","2x15x20 Pleated MERV 8","2x16x16 Pleated MERV 8","2x16x20 Pleated MERV 8","2x16x24 Pleated MERV 8","2x16x25 Pleated MERV 8","2x18x20 Pleated MERV 8","2x18x22 Pleated MERV 8","2x18x24 Pleated MERV 8","2x18x25 Pleated MERV 8","2x20x20 Pleated MERV 8","2x20x24 Pleated MERV 8","2x20x25 Pleated MERV 8","2x20x30 Pleated MERV 8","2X20X35 Pleated MERV 8","2x24x24 Pleated MERV 8","2X24X30 Pleated MERV 8","2X25X25 Pleated MERV 8","4x12x24 Pleated MERV 8","4x16x20 Pleated MERV 8","4x16x25 Pleated MERV 8","4x18x24 Pleated MERV 8","4x20x20 Pleated MERV 8","4x20x24 Pleated MERV 8","4x20x25 Pleated MERV 8","4X20X30 Pleated MERV 8","4x24x24 Pleated MERV 8","4x25x25 Pleated MERV 8","4x28.5x29.5 Pleated MERV 8"],"Washable":["Washable"],"Bag":["12x12x24 Pocket Synthetic Bag Filter","12x20x20 Pocket Synthetic Bag Filter","12x24x24 Pocket Synthetic Bag Filter","14x20x20 Pocket Synthetic Bag Filter","14x24x24 Pocket Synthetic Bag Filter","15x12x24 Pocket Synthetic Bag Filter","15x20x24 Pocket Synthetic Bag Filter","15x24x24 Pocket Synthetic Bag Filter","18x12x24 Pocket Synthetic Bag Filter","18x24x24 Pocket Synthetic Bag Filter","21x20x20 Pocket Synthetic Bag Filter","21x24x24 Pocket Synthetic Bag Filter","22x12x24 Pocket Synthetic Bag Filter","22x20x24 Pocket Synthetic Bag Filter","22x24x24 Pocket Synthetic Bag Filter","29x12x24 Pocket Synthetic Bag Filter","29x24x24 Pocket Synthetic Bag Filter","36x12x24 Pocket Synthetic Bag Filter","36x24x24 Pocket Synthetic Bag Filter","24x24x24 Pocket Synthetic Bag Filter"],"Box":["12x12x24 Cartridge Filter 95%","12x20x20 Cartridge Filter 95%","12x20x24 Cartridge Filterb 95%","12x24x24 Cartridge Filter 95%","6x24x24 Cartridge Filter","12x12x24 Rigid Cell 95%","12x20x20 Rigid Cell 95%","12x24x24 Rigid Cell 95%","3.75 x 18.5 x 37 Box Filter MERV 8","AprilAire Model 2400 16X25X6","Aprilaire Model 1210 MERV 11 #210/#213"],"Pleated Merv 10":["2X12X24 Pleated MERV 10"],"Pleated Merv 11":["2X12X24 Pleated MERV 11","2X16X25 Pleated MERV 11","2X20X25 Pleated MERV 11","2X24X24 Pleated MERV 11","2X20X24 Pleated MERV 11"],"Pleated Merv 13":["1x16x20 Pleated MERV 13","1x16x25 Pleated MERV 13","1x20X20 Pleated MERV 13","1X20X35 Pleated MERV 13","2x14x25 Pleated MERV 13","2x16x20 Pleated MERV 13","2x16x25 Pleated MERV 13","2x20x20 Pleated MERV 13","2x20x24 Pleated MERV 13","2x20x25 Pleated MERV 13"],"Poly Pad":["1x9.25x21.75 Media Pad Polyester","1x9.25x23.75 Media Pad Polyester","1x9.25x28 Media Pad Polyester","1x9.25x31.5 Media Pad Polyester","1X9.25x32.75 Media Pad Polyester","1x9.25x32.75 Media Pad Polyester","1x9.25x43.50 Media Pad Polyester","1x15x29 Media Pad Polyester","1X16X20 Media Pad Polyester","1X16X21 Media Pad Polyester","1X16x25 Media Pad Polyester","1X19X20 Media Pad Polyester","1X20x20 Media Pad Polyester","1X20x25 Media Pad Polyester","2X11.5x23x Media Pad Polyester","2X15.5X19.5 Media Pad Polyester","2X15.5X39 Media Pad Polyester","2X15.5x49 Media Pad Polyester","2X16.0x20 Media Pad Polyester","2X16X16 Media Pad Polyester","2X16x25 Media Pad Polyester","2X16X30 Media Pad Polyester","2X19.5x23 Media Pad Polyester","2X19.5X24.5 Media Pad Polyester","2X19.5X25.75 Media Pad Polyester","2X19.5x34 Media Pad Polyester","2X19.5x36 Media Pad Polyester","2X19.5x37 Media Pad Polyester","2X19.5X39 Media Pad Polyester","2X19.5x49 Media Pad Polyester","2X20X20 Media Pad Polyester","2X20x30 Media Pad Polyester","2X22X42 Media Pad Polyester","2X23.5x23 Media Pad Polyester","2X23.5x41 Media Pad Polyester","2X24.0x20 Media Pad Polyester","2X24.0x24 Media Pad Polyester","2X24.5x39 Media Pad Polyester","2X28X48 Media Pad Polyester","2X34X86 Media Pad Polyester","2X35X83 Media Pad Polyester","2X38X38 Media Pad Polyester","2X47.5X47.5 Media Pad Polyester","2X48X50 Media Pad Polyester"],"HEPA":["11.5x12x24 HEPA Microfiber","12X24X12 98% 4V SINGLE HEADER HEPA","12X24X24 98% 4V SINGLE HEADER HEPA","23 3/8 x 23 3/8 x 11 1/2 HEPA","24x24x11.5 HEPA Microfiber","12x24x11.5 HEPA 99.99%","24x24x11.5 HEPA 99.99%"],"Fiberglass":["1x10x14 Fiberglass","1x10x20 Fiberglass","1x10x24 Fiberglass","1x10x30 Fiberglass","1x12x12 Fiberglass","1x12x16 Fiberglass","1x12x20 Fiberglass","1x12x24 Fiberglass","1x14x14 Fiberglass","1x14x20 Fiberglass","1x14x24 Fiberglass","1x14x25 Fiberglass","1x14x30 Fiberglass","1x15x20 Fiberglass","1x15x30 Fiberglass","1x16x16 Fiberglass","1x16x20 Fiberglass","1x16x22.25 Fiberglass","1x16x24 Fiberglass","1x16x25 Fiberglass","1x18x18 Fiberglass","1x18x20 Fiberglass","1x18x24 Fiberglass","1x19x27 Fiberglass","1x20x20 Fiberglass","1x20x22.25 Fiberglass","1x20x25 Fiberglass","1x20x30 Fiberglass","1x22x22 Fiberglass","1x22x24.25 Fiberglass","1x24x24 Fiberglass","1x8x30 Fiberglass","2x12x24 Fiberglass","2x14x20 Fiberglass","2x14x25 Fiberglass","2x15x20 Fiberglass","2x16x20 Fiberglass","2x16x24 Fiberglass","2x16x25 Fiberglass","2x18x24 Fiberglass","2x20x20 Fiberglass","2x20x25 Fiberglass","2x24x24 Fiberglass"]}; const BELT_CATALOG = {"A":["A21","A24","A25","A26","A27","A29","A31","A32","A33","A34","A35","A36","A37","A38","A39","A40","A41","A42","A43","A44","A45","A46","A47","A48","A49","A50","A51","A52","A53","A54","A55","A57","A58","A60","A61","A62","A77"],"Ax":["Ax32","Ax35","Ax36","Ax37","Ax38","Ax39","Ax40","Ax43","Ax44","Ax45","Ax46","Ax47","Ax48","Ax49","Ax50","Ax52","Ax60","Ax63"],"B":["B21","B35","B40","B42","B45","B46","B47","B48","B49","B50","B51","B52","B53","B55","B56","B57","B58","B59","B61","B62","B63","B64","B65","B66","B67","B68","B71","B73","B75","B76","B77","B78","B81","B90","B93","B95","B96","B97","B100","B101","B108","B120","B140","B158"],"Bx":["Bx38","Bx40","Bx42","Bx44","Bx46","Bx49","Bx50","Bx51","Bx52","Bx53","Bx55","Bx56","Bx57","Bx60","Bx62","Bx63","Bx64","Bx65","Bx67","Bx68","Bx70","Bx71","Bx75","Bx77","Bx78","Bx80","Bx81","Bx82","Bx83","Bx85","Bx90","Bx96","Bx97","Bx100","Bx103","Bx108"],"C":["C97","C105","C112","C158"],"3Vx":["3Vx710"],"5Vx":["5Vx530","5Vx550","5Vx600","5VX630","5VX730","5VX780","5VX740","5VX1000","5VX1060","5VX1120","5VX1320"],"4L":["4L360","4L370","4L400","4L460","4L510","4L540","4L380"],"Va":["Va103"]}; const FILTER_PRICES = {"1X9.25x21.75 Pleated MERV 8":1.5,"1X9.25x23.5 Pleated MERV 8":6.372,"1X9.25x31 Pleated MERV 8":10.56,"1X9.25x43.5 Pleated MERV 8":11.148,"1x10x20 Pleated MERV 8":4.686,"1x10x24 Pleated MERV 8":6.732,"1x12x16 Pleated MERV 8":8.508,"1x12x18 Pleated MERV 8":3.84,"1x12x20 Pleated MERV 8":4.53,"1x12x24 Pleated MERV 8":4.602,"1x12x25 Pleated MERV 8":7.734,"1x12x30 5/8 Pleated MERV 8":3.66,"1x14x14 Pleated MERV 8":5.172,"1x14x20 Pleated MERV 8":4.632,"1X14X22 Pleated MERV 8":9.756,"1x14x24 Pleated MERV 8":5.298,"1x14x25 Pleated MERV 8":4.884,"1x14x30 Pleated MERV 8":6.51,"1x15x20 Pleated MERV 8":4.68,"1x15x25 Pleated MERV 8":3.72,"1x16x16 Pleated MERV 8":7.596,"1x16x20 Pleated MERV 8":4.098,"1X16.25X21.5 Pleated MERV 8":5.5,"1x16x22.25 Pleated MERV 8":5.37,"1x16x24 Pleated MERV 8":5.172,"1x16x25 Pleated MERV 8":4.326,"1x16x30 Pleated MERV 8":6.474,"1x18x18 Pleated MERV 8":5.862,"1x18x20 Pleated MERV 8":5.88,"1X18X22 Pleated MERV 8":6.14,"1x18x24 Pleated MERV 8":5.538,"1x18x25 Pleated MERV 8":5.454,"1x19x27 Pleated MERV 8":11.0,"1x20x20 Pleated MERV 8":3.75,"1x20x22 Pleated MERV 8":7.116,"1x20x25 Pleated MERV 8":5.064,"1x20x30 Pleated MERV 8":8.35,"1X21.5X23.5 Pleated MERV 8":5.75,"1x22x22 Pleated MERV 8":10.254,"1x23.5x25 Pleated Merv 8":12.12,"1x24x24 Pleated MERV 8":6.132,"1x24x30 Pleated MERV 8":8.68,"1x25x25 Pleated MERV 8":6.942,"1x30x30 Pleated MERV 8":17.82,"2x10x20 Pleated MERV 8":5.202,"2x12x20 Pleated MERV 8":5.232,"2x12x24 Pleated MERV 8":4.554,"2X14X14 Pleated MERV 8":6.51,"2x14x20 Pleated MERV 8":5.316,"2x14x25 Pleated MERV 8":5.91,"2x15x20 Pleated MERV 8":5.148,"2x16x16 Pleated MERV 8":6.624,"2x16x20 Pleated MERV 8":3.72,"2x16x24 Pleated MERV 8":5.06,"2x16x25 Pleated MERV 8":4.25,"2x18x20 Pleated MERV 8":6.39,"2x18x22 Pleated MERV 8":6.34,"2x18x24 Pleated MERV 8":5.112,"2x18x25 Pleated MERV 8":7.02,"2x20x20 Pleated MERV 8":4.01,"2x20x24 Pleated MERV 8":6.108,"2x20x25 Pleated MERV 8":5.664,"2x20x30 Pleated MERV 8":9.978,"2X20X35 Pleated MERV 8":21.522,"2x24x24 Pleated MERV 8":8.22,"2X24X30 Pleated MERV 8":10.5,"2X25X25 Pleated MERV 8":7.92,"4x12x24 Pleated MERV 8":8.436,"4x16x20 Pleated MERV 8":8.436,"4x16x25 Pleated MERV 8":9.09,"4x18x24 Pleated MERV 8":11.442,"4x20x20 Pleated MERV 8":9.762,"4x20x24 Pleated MERV 8":11.7,"4x20x25 Pleated MERV 8":11.052,"4X20X30 Pleated MERV 8":28.52,"4x24x24 Pleated MERV 8":11.652,"4x25x25 Pleated MERV 8":36.24,"4x28.5x29.5 Pleated MERV 8":52.266,"2X12X24 Pleated MERV 10":4.97,"2X12X24 Pleated MERV 11":8.14,"2X16X25 Pleated MERV 11":10.37,"2X20X25 Pleated MERV 11":12.51,"2X24X24 Pleated MERV 11":15.3,"2X20X24 Pleated MERV 11":13.57,"1x16x20 Pleated MERV 13":8.052,"1x16x25 Pleated MERV 13":9.0,"1x20X20 Pleated MERV 13":8.268,"1X20X35 Pleated MERV 13":15.12,"2x14x25 Pleated MERV 13":12.564,"2x16x20 Pleated MERV 13":0,"2x16x25 Pleated MERV 13":13.212,"2x20x20 Pleated MERV 13":12.516,"2x20x24 Pleated MERV 13":21.26,"2x20x25 Pleated MERV 13":15.12,"1x9.25x21.75 Media Pad Polyester":1.5,"1x9.25x23.75 Media Pad Polyester":1.8,"1x9.25x28 Media Pad Polyester":1.92,"1x9.25x31.5 Media Pad Polyester":2.4,"1X9.25x32.75 Media Pad Polyester":2.22,"1x9.25x32.75 Media Pad Polyester":2.28,"1x9.25x43.50 Media Pad Polyester":3.0,"1x15x29 Media Pad Polyester":3.132,"1X16X20 Media Pad Polyester":2.46,"1X16X21 Media Pad Polyester":2.457,"1X16x25 Media Pad Polyester":2.88,"1X19X20 Media Pad Polyester":2.736,"1X20x20 Media Pad Polyester":2.88,"1X20x25 Media Pad Polyester":3.6,"2X11.5x23x Media Pad Polyester":1.946,"2X15.5X19.5 Media Pad Polyester":2.28,"2X15.5X39 Media Pad Polyester":4.44,"2X15.5x49 Media Pad Polyester":5.468,"2X16.0x20 Media Pad Polyester":2.304,"2X16X16 Media Pad Polyester":1.843,"2X16x25 Media Pad Polyester":2.88,"2X16X30 Media Pad Polyester":3.456,"2X19.5x23 Media Pad Polyester":3.299,"2X19.5X24.5 Media Pad Polyester":3.48,"2X19.5X25.75 Media Pad Polyester":3.72,"2X19.5x34 Media Pad Polyester":4.844,"2X19.5x36 Media Pad Polyester":5.054,"2X19.5x37 Media Pad Polyester":5.265,"2X19.5X39 Media Pad Polyester":5.52,"2X19.5x49 Media Pad Polyester":6.88,"2X20X20 Media Pad Polyester":2.88,"2X20x30 Media Pad Polyester":4.32,"2X22X42 Media Pad Polyester":6.653,"2X23.5x23 Media Pad Polyester":3.976,"2X23.5x41 Media Pad Polyester":6.937,"2X24.0x20 Media Pad Polyester":3.456,"2X24.0x24 Media Pad Polyester":4.147,"2X24.5x39 Media Pad Polyester":6.88,"2X28X48 Media Pad Polyester":9.677,"2X34X86 Media Pad Polyester":21.053,"2X35X83 Media Pad Polyester":20.916,"2X38X38 Media Pad Polyester":10.397,"2X47.5X47.5 Media Pad Polyester":16.245,"2X48X50 Media Pad Polyester":17.28,"12x12x24 Pocket Synthetic Bag Filter":26.34,"12x20x20 Pocket Synthetic Bag Filter":30.82,"12x24x24 Pocket Synthetic Bag Filter":33.72,"14x20x20 Pocket Synthetic Bag Filter":33.12,"14x24x24 Pocket Synthetic Bag Filter":34.5,"15x12x24 Pocket Synthetic Bag Filter":28.75,"15x20x24 Pocket Synthetic Bag Filter":30.24,"15x24x24 Pocket Synthetic Bag Filter":31.44,"18x12x24 Pocket Synthetic Bag Filter":21.54,"18x24x24 Pocket Synthetic Bag Filter":34.39,"21x20x20 Pocket Synthetic Bag Filter":35.04,"21x24x24 Pocket Synthetic Bag Filter":40.14,"22x12x24 Pocket Synthetic Bag Filter":41.14,"22x20x24 Pocket Synthetic Bag Filter":37.15,"22x24x24 Pocket Synthetic Bag Filter":56.58,"29x12x24 Pocket Synthetic Bag Filter":31.05,"29x24x24 Pocket Synthetic Bag Filter":44.85,"36x12x24 Pocket Synthetic Bag Filter":34.5,"36x24x24 Pocket Synthetic Bag Filter":48.3,"24x24x24 Pocket Synthetic Bag Filter":49.08,"12x12x24 Cartridge Filter 95%":60.01,"12x20x20 Cartridge Filter 95%":102.0,"12x20x24 Cartridge Filterb 95%":111.55,"12x24x24 Cartridge Filter 95%":97.2,"6x24x24 Cartridge Filter":64.59,"12x12x24 Rigid Cell 95%":71.88,"12x20x20 Rigid Cell 95%":102.0,"12x24x24 Rigid Cell 95%":71.88,"3.75 x 18.5 x 37 Box Filter MERV 8":5.22,"AprilAire Model 2400 16X25X6":189.936,"Aprilaire Model 1210 MERV 11 #210/#213":144.684,"11.5x12x24 HEPA Microfiber":81.61,"12X24X12 98% 4V SINGLE HEADER HEPA":71.88,"12X24X24 98% 4V SINGLE HEADER HEPA":301.3,"23 3/8 x 23 3/8 x 11 1/2 HEPA":301.33,"24x24x11.5 HEPA Microfiber":153.68,"12x24x11.5 HEPA 99.99%":552.2,"24x24x11.5 HEPA 99.99%":455.07,"1x10x14 Fiberglass":2.52,"1x10x20 Fiberglass":2.292,"1x10x24 Fiberglass":2.4,"1x10x30 Fiberglass":2.856,"1x12x12 Fiberglass":2.04,"1x12x16 Fiberglass":2.34,"1x12x20 Fiberglass":2.34,"1x12x24 Fiberglass":2.4,"1x14x14 Fiberglass":2.16,"1x14x20 Fiberglass":2.292,"1x14x24 Fiberglass":2.568,"1x14x25 Fiberglass":2.448,"1x14x30 Fiberglass":3.192,"1x15x20 Fiberglass":2.532,"1x15x30 Fiberglass":5.388,"1x16x16 Fiberglass":2.376,"1x16x20 Fiberglass":2.4,"1x16x22.25 Fiberglass":2.772,"1x16x24 Fiberglass":2.568,"1x16x25 Fiberglass":2.4,"1x18x18 Fiberglass":2.496,"1x18x20 Fiberglass":2.604,"1x18x24 Fiberglass":2.808,"1x19x27 Fiberglass":3.936,"1x20x20 Fiberglass":2.4,"1x20x22.25 Fiberglass":2.844,"1x20x25 Fiberglass":2.616,"1x20x30 Fiberglass":3.504,"1x22x22 Fiberglass":6.972,"1x22x24.25 Fiberglass":3.92,"1x24x24 Fiberglass":3.204,"1x8x30 Fiberglass":2.856,"2x12x24 Fiberglass":3.384,"2x14x20 Fiberglass":3.468,"2x14x25 Fiberglass":3.708,"2x15x20 Fiberglass":3.396,"2x16x20 Fiberglass":3.468,"2x16x24 Fiberglass":3.636,"2x16x25 Fiberglass":3.804,"2x18x24 Fiberglass":3.636,"2x20x20 Fiberglass":4.176,"2x20x25 Fiberglass":4.176,"2x24x24 Fiberglass":4.416,"Washable":0}; const BELT_PRICES = {"A21":9.5146,"A24":9.7406,"A25":9.8875,"A26":10.0457,"A27":10.4073,"A29":10.4977,"A31":10.8254,"A32":11.0514,"A33":11.187,"A34":11.4243,"A35":11.5825,"A36":11.8085,"A37":12.1362,"A38":12.3396,"A39":12.5882,"A40":12.7351,"A41":12.9611,"A42":13.2888,"A43":13.5148,"A44":13.673,"A45":13.7069,"A46":13.899,"A47":14.0459,"A48":14.2154,"A49":14.3736,"A50":14.5092,"A51":14.6787,"A52":14.8256,"A53":14.9838,"A54":15.2211,"A55":15.3793,"A57":15.6618,"A58":15.9104,"A60":16.4415,"A61":16.6562,"A62":16.5884,"A77":23.0972,"Ax32":13.4922,"Ax35":14.1589,"Ax36":14.4414,"Ax37":14.8256,"Ax38":15.1081,"Ax39":15.3906,"Ax40":15.6844,"Ax43":16.5206,"Ax44":16.5545,"Ax45":16.7579,"Ax46":16.9952,"Ax47":17.176,"Ax48":17.3681,"Ax49":17.4811,"Ax50":17.8314,"Ax52":18.1252,"Ax60":20.2948,"Ax63":21.5152,"B21":11.0062,"B35":15.2776,"B40":17.3342,"B42":18.1139,"B45":19.4586,"B46":19.6055,"B47":19.9106,"B48":20.2044,"B49":20.5208,"B50":20.8259,"B51":21.1084,"B52":21.357,"B53":21.4926,"B55":21.8655,"B56":22.035,"B57":22.1706,"B58":22.3288,"B59":22.4757,"B61":22.9164,"B62":23.2328,"B63":23.8204,"B64":23.8204,"B65":24.1255,"B66":24.4306,"B67":24.973,"B68":24.8826,"B71":25.877,"B73":27.1087,"B75":27.1426,"B76":28.1822,"B77":28.2387,"B78":28.6003,"B81":29.4026,"B90":32.4197,"B93":34.7475,"B95":35.5046,"B96":35.482,"B97":36.2843,"B100":37.064,"B101":42.2055,"B108":40.7026,"B120":44.7932,"B140":53.0761,"B158":67.9469,"Bx38":21.018,"Bx40":21.922,"Bx42":22.6678,"Bx44":23.7074,"Bx46":24.5436,"Bx49":26.3177,"Bx50":26.0465,"Bx51":26.4307,"Bx52":27.0296,"Bx53":27.2217,"Bx55":27.3799,"Bx56":27.5607,"Bx57":28.0805,"Bx60":28.6455,"Bx62":29.0862,"Bx63":30.1484,"Bx64":29.8207,"Bx65":30.8151,"Bx67":31.6061,"Bx68":31.1541,"Bx70":32.3745,"Bx71":32.77,"Bx75":33.9678,"Bx77":35.3464,"Bx78":36.2504,"Bx80":37.855,"Bx81":36.8154,"Bx82":38.6573,"Bx83":38.9511,"Bx85":39.6065,"Bx90":41.0755,"Bx96":44.9401,"Bx97":44.8949,"Bx100":46.3978,"Bx103":46.7933,"Bx108":51.0534,"C97":54.1835,"C105":86.9309,"C112":83.2358,"C158":126.8199,"3Vx710":29.8659,"5Vx530":50.172,"5Vx550":52.206,"5Vx600":27.8093,"5VX630":28.6342,"5VX730":32.2502,"5VX780":74.3766,"5VX740":70.3651,"5VX1000":96.4003,"5VX1060":87.01,"5VX1120":95.3042,"5VX1320":100.0502,"4L360":11.9328,"4L370":11.9441,"4L400":12.7803,"4L460":15.1985,"4L510":16.498,"4L540":17.2551,"4L380":12.204,"Va103":8.1021}; // Serial number decode patterns const SERIAL_PATTERNS = { carrier: { brands: ['carrier','bryant','payne','day & night'], decode: s => { const m = s.match(/^(\d{4})/); if(!m) return null; const wk=parseInt(m[1].substring(0,2)), yr=parseInt(m[1].substring(2,4)); if(wk<1||wk>53) return null; return `${yr<50?'20':'19'}${String(yr).padStart(2,'0')}`; }}, trane: { brands: ['trane','american standard'], decode: s => { const letters='0123456789ABCDEFGHJKLMNPRSTUVWXY'; if(s.length<4) return null; const yc=s[3]; const yi=letters.indexOf(yc.toUpperCase()); if(yi<0) return null; const yr = yi < 10 ? 2000+yi : 1994+(yi-10); return String(yr); }}, lennox: { brands: ['lennox'], decode: s => { const m = s.match(/^[A-Z]{4}(\d{2})/i); if(!m) return null; const yr=parseInt(m[1]); return `${yr<50?'20':'19'}${String(yr).padStart(2,'0')}`; }}, goodman: { brands: ['goodman','amana','daikin','janitrol'], decode: s => { const m = s.match(/^[A-Z0-9]{4}(\d{4})/i); if(!m) return null; const yr=m[1].substring(0,2); return `${parseInt(yr)<50?'20':'19'}${yr}`; }}, york: { brands: ['york','luxaire','champion','coleman','fraser'], decode: s => { const letters='ABCDEFGHJKLMNPRSTUVWXYZ'; if(s.length<6) return null; const yc=s[5]; const yi=letters.indexOf(yc.toUpperCase()); if(yi<0) return null; return String(1971+yi); }}, rheem: { brands: ['rheem','ruud','weatherking'], decode: s => { const m = s.match(/^[A-Z]{2}(\d{2})/i); if(!m) return null; const yr=parseInt(m[1]); return `${yr<50?'20':'19'}${String(yr).padStart(2,'0')}`; }}, mcquay: { brands: ['mcquay','daikin applied'], decode: s => { const m = s.match(/(\d{2})(\d{2})\d+/); if(!m) return null; const yr=parseInt(m[1]); return `${yr<50?'20':'19'}${String(yr).padStart(2,'0')}`; }}, liebert: { brands: ['liebert','vertiv'], decode: s => { const m = s.match(/(\d{4})\d+/); if(!m) return null; const yr=m[1].substring(0,2); return `${parseInt(yr)<50?'20':'19'}${yr}`; }} };