var ITCMeltingCalculator=(function(){
'use strict';
var config={};
var materials={};
var lastResults=null;
var STANDARD_POWER_SIZES=[2.4, 5, 10, 15, 25, 50, 75, 100, 150, 200, 250, 300, 400, 500, 750, 1000];
function init(){
config=window.itcCalcConfig||{};
materials=config.materials||{};
var form=document.getElementById('itc-calc-form');
if(!form) return;
populateMaterialDropdown();
setDefaultValues();
bindEvents();
}
function bindEvents(){
document.getElementById('itc-material').addEventListener('change', onMaterialChange);
var weightRadios=document.querySelectorAll('input[name="itc-weight-unit"]');
for (var i=0; i < weightRadios.length; i++){
weightRadios[i].addEventListener('change', onWeightUnitChange);
}
var tempRadios=document.querySelectorAll('input[name="itc-temp-unit"]');
for (var i=0; i < tempRadios.length; i++){
tempRadios[i].addEventListener('change', onTempUnitChange);
}
document.getElementById('itc-calc-form').addEventListener('submit', function(e){
e.preventDefault();
calculate();
});
document.getElementById('itc-efficiency').addEventListener('input', function(e){
document.getElementById('itc-efficiency-value').textContent=e.target.value + '%';
});
var debouncedCalc=debounce(function(){
if(hasValidInputs()) calculate();
}, 400);
var inputs=document.querySelectorAll('#itc-calc-form input[type="number"], #itc-calc-form select');
for (var i=0; i < inputs.length; i++){
inputs[i].addEventListener('input', debouncedCalc);
}
document.getElementById('itc-efficiency').addEventListener('input', debouncedCalc);
}
function populateMaterialDropdown(){
var select=document.getElementById('itc-material');
if(!select) return;
var categories={};
for (var key in materials){
if(!materials.hasOwnProperty(key)) continue;
var mat=materials[key];
if(!categories[mat.category]){
categories[mat.category]=[];
}
categories[mat.category].push({ key: key, name: mat.name });
}
var order=['Ferrous', 'Non-Ferrous', 'Precious', 'Low-Melt'];
for (var i=0; i < order.length; i++){
var cat=order[i];
if(!categories[cat]) continue;
var optgroup=document.createElement('optgroup');
optgroup.label=cat;
for (var j=0; j < categories[cat].length; j++){
var opt=document.createElement('option');
opt.value=categories[cat][j].key;
opt.textContent=categories[cat][j].name;
optgroup.appendChild(opt);
}
select.appendChild(optgroup);
}}
function setDefaultValues(){
var effSlider=document.getElementById('itc-efficiency');
if(config.defaultEfficiency){
effSlider.value=config.defaultEfficiency;
document.getElementById('itc-efficiency-value').textContent=config.defaultEfficiency + '%';
}
var ctaBtn=document.getElementById('itc-request-quote-btn');
if(ctaBtn&&config.ctaButtonColor){
ctaBtn.style.backgroundColor=config.ctaButtonColor;
}
if(ctaBtn&&config.ctaButtonText){
ctaBtn.textContent=config.ctaButtonText;
}}
function onMaterialChange(){
var key=document.getElementById('itc-material').value;
var infoEl=document.getElementById('itc-material-info');
if(!key||!materials[key]){
infoEl.innerHTML='';
infoEl.style.display='none';
return;
}
var mat=materials[key];
var isFahrenheit=getSelectedTempUnit()==='F';
var meltDisplay=isFahrenheit
? Math.round(ITCUnitConverter.celsiusToFahrenheit(mat.melting_point)) + '&deg;F'
: mat.melting_point + '&deg;C';
infoEl.innerHTML =
'<span class="itc-calc__info-item">Melting Point: <strong>' + meltDisplay + '</strong></span>' +
'<span class="itc-calc__info-item">Density: <strong>' + mat.density.toLocaleString() + ' kg/m&sup3;</strong></span>' +
'<span class="itc-calc__info-item">Typical Efficiency: <strong>' + mat.typical_efficiency + '%</strong></span>';
infoEl.style.display='flex';
var targetInput=document.getElementById('itc-temp-target');
if(!targetInput.value){
var suggestedTarget=mat.melting_point + 75;
targetInput.value=isFahrenheit
? Math.round(ITCUnitConverter.celsiusToFahrenheit(suggestedTarget))
: suggestedTarget;
}
var effSlider=document.getElementById('itc-efficiency');
effSlider.value=mat.typical_efficiency;
document.getElementById('itc-efficiency-value').textContent=mat.typical_efficiency + '%';
}
function onWeightUnitChange(){
var weightInput=document.getElementById('itc-weight');
var val=parseFloat(weightInput.value);
if(isNaN(val)) return;
var newUnit=getSelectedWeightUnit();
if(newUnit==='lbs'){
weightInput.value=roundTo(ITCUnitConverter.kgToLbs(val), 2);
}else{
weightInput.value=roundTo(ITCUnitConverter.lbsToKg(val), 2);
}}
function onTempUnitChange(){
var startInput=document.getElementById('itc-temp-start');
var targetInput=document.getElementById('itc-temp-target');
var unitLabel=document.getElementById('itc-temp-unit-label');
var newUnit=getSelectedTempUnit();
unitLabel.innerHTML='&deg;' + newUnit;
var startVal=parseFloat(startInput.value);
var targetVal=parseFloat(targetInput.value);
if(newUnit==='F'){
if(!isNaN(startVal)) startInput.value=Math.round(ITCUnitConverter.celsiusToFahrenheit(startVal));
if(!isNaN(targetVal)) targetInput.value=Math.round(ITCUnitConverter.celsiusToFahrenheit(targetVal));
}else{
if(!isNaN(startVal)) startInput.value=Math.round(ITCUnitConverter.fahrenheitToCelsius(startVal));
if(!isNaN(targetVal)) targetInput.value=Math.round(ITCUnitConverter.fahrenheitToCelsius(targetVal));
}
onMaterialChange();
}
function calculate(){
hideError();
var materialKey=document.getElementById('itc-material').value;
var mat=materials[materialKey];
if(!mat){
showError('Please select a material.');
return;
}
var weightRaw=parseFloat(document.getElementById('itc-weight').value);
var isLbs=getSelectedWeightUnit()==='lbs';
var massKg=isLbs ? ITCUnitConverter.lbsToKg(weightRaw):weightRaw;
var tStartRaw=parseFloat(document.getElementById('itc-temp-start').value);
var tTargetRaw=parseFloat(document.getElementById('itc-temp-target').value);
var isFahrenheit=getSelectedTempUnit()==='F';
var tStart=isFahrenheit ? ITCUnitConverter.fahrenheitToCelsius(tStartRaw):tStartRaw;
var tTarget=isFahrenheit ? ITCUnitConverter.fahrenheitToCelsius(tTargetRaw):tTargetRaw;
var efficiency=parseFloat(document.getElementById('itc-efficiency').value) / 100;
var tMelt=mat.melting_point;
if(isNaN(massKg)||massKg <=0){
showError('Please enter a valid weight greater than zero.');
return;
}
if(isNaN(tStart)||isNaN(tTarget)){
showError('Please enter valid temperatures.');
return;
}
if(tStart >=tTarget){
showError('Target temperature must be higher than starting temperature.');
return;
}
if(tStart < -273.15){
showError('Starting temperature cannot be below absolute zero (-273.15\u00B0C).');
return;
}
var Q_total_kJ=0;
var phaseChange=false;
var phaseNote='';
if(tStart >=tMelt){
Q_total_kJ=massKg * mat.specific_heat_liquid * (tTarget - tStart);
phaseNote='Starting temperature is above the melting point \u2014 calculating superheat energy only.';
}else if(tTarget <=tMelt){
Q_total_kJ=massKg * mat.specific_heat_solid * (tTarget - tStart);
phaseNote='Target temperature is below the melting point \u2014 no phase change occurs.';
}else{
var Q_heat_solid=massKg * mat.specific_heat_solid * (tMelt - tStart);
var Q_fusion=massKg * mat.latent_heat_fusion;
var Q_heat_liquid=massKg * mat.specific_heat_liquid * (tTarget - tMelt);
Q_total_kJ=Q_heat_solid + Q_fusion + Q_heat_liquid;
phaseChange=true;
phaseNote='';
}
var Q_actual_kJ=Q_total_kJ / efficiency;
var Q_actual_kWh=ITCUnitConverter.kjToKwh(Q_actual_kJ);
var Q_theoretical_kWh=ITCUnitConverter.kjToKwh(Q_total_kJ);
var recommendedPowerKW=estimatePowerRating(massKg, Q_actual_kWh);
var meltTimeMinutes=(Q_actual_kWh / recommendedPowerKW) * 60;
var furnaceSize=recommendFurnaceSize(massKg, mat);
var costPerMelt=Q_actual_kWh * config.electricityCost;
lastResults={
material: mat.name,
materialKey: materialKey,
massKg: roundTo(massKg, 2),
massLbs: roundTo(ITCUnitConverter.kgToLbs(massKg), 2),
tStartC: roundTo(tStart, 1),
tTargetC: roundTo(tTarget, 1),
tMeltC: tMelt,
phaseChange: phaseChange,
energyTheoreticalKwh: roundTo(Q_theoretical_kWh, 2),
energyActualKwh: roundTo(Q_actual_kWh, 2),
efficiencyPercent: roundTo(efficiency * 100, 0),
meltTimeMinutes: roundTo(meltTimeMinutes, 1),
recommendedPowerKW: recommendedPowerKW,
furnaceProductLine: furnaceSize.productLine,
furnaceDescription: furnaceSize.description,
costPerMelt: roundTo(costPerMelt, 2),
};
displayResults(lastResults, phaseNote);
}
function estimatePowerRating(massKg, Q_actual_kWh){
var targetHours=0.5;
if(massKg > 500) targetHours=0.75;
if(massKg > 2000) targetHours=1.0;
var rawPowerKW=Q_actual_kWh / targetHours;
for (var i=0; i < STANDARD_POWER_SIZES.length; i++){
if(STANDARD_POWER_SIZES[i] >=rawPowerKW){
return STANDARD_POWER_SIZES[i];
}}
return Math.ceil(rawPowerKW);
}
function recommendFurnaceSize(massKg, mat){
var steelEquivKg=massKg * (7832 / mat.density);
var recommendation={ productLine: '', description: '' };
if(steelEquivKg <=2){
recommendation.productLine='UltraMelt Tabletop';
recommendation.description='Tabletop Induction Melting Furnace (up to 2 kg steel)';
}else if(steelEquivKg <=20){
recommendation.productLine='UltraMelt 4/5 or 10/15';
recommendation.description='Compact Melting Furnace (up to 20 kg steel)';
}else if(steelEquivKg <=100){
recommendation.productLine='Compact Power Cube';
recommendation.description='Compact Power Cube Furnace (up to 100 kg steel)';
}else if(steelEquivKg <=900){
recommendation.productLine='Cube Induction Melting Furnace';
recommendation.description='Cube Furnace (20\u2013900 kg steel / up to 1300 kg brass)';
}else{
recommendation.productLine='Steel Shell Melting Furnace';
recommendation.description='Steel Shell Coreless Induction Furnace (large capacity)';
}
return recommendation;
}
function displayResults(results, phaseNote){
var panel=document.getElementById('itc-results-panel');
panel.style.display='block';
document.getElementById('itc-result-energy').textContent=results.energyActualKwh;
document.getElementById('itc-result-theoretical').textContent=results.energyTheoreticalKwh + ' kWh';
document.getElementById('itc-result-cost').textContent='$' + results.costPerMelt;
var timeStr;
if(results.meltTimeMinutes < 60){
timeStr=results.meltTimeMinutes + ' min';
}else{
var hours=Math.floor(results.meltTimeMinutes / 60);
var mins=Math.round(results.meltTimeMinutes % 60);
timeStr=hours + ' hr ' + mins + ' min';
}
document.getElementById('itc-result-time').textContent=timeStr;
document.getElementById('itc-result-power').textContent=results.recommendedPowerKW + ' kW';
document.getElementById('itc-furnace-badge').textContent=results.furnaceProductLine;
document.getElementById('itc-furnace-desc').textContent=results.furnaceDescription;
var noteEl=document.getElementById('itc-phase-note');
if(phaseNote){
noteEl.textContent=phaseNote;
noteEl.style.display='block';
}else{
noteEl.style.display='none';
}
if(window.innerWidth < 768){
panel.scrollIntoView({ behavior: 'smooth', block: 'start' });
}}
function showError(msg){
var el=document.getElementById('itc-calc-error');
el.textContent=msg;
el.style.display='block';
document.getElementById('itc-results-panel').style.display='none';
}
function hideError(){
document.getElementById('itc-calc-error').style.display='none';
}
function hasValidInputs(){
var mat=document.getElementById('itc-material').value;
var w=document.getElementById('itc-weight').value;
var ts=document.getElementById('itc-temp-start').value;
var tt=document.getElementById('itc-temp-target').value;
return mat&&w && ts&&tt;
}
function getSelectedWeightUnit(){
var checked=document.querySelector('input[name="itc-weight-unit"]:checked');
return checked ? checked.value:'kg';
}
function getSelectedTempUnit(){
var checked=document.querySelector('input[name="itc-temp-unit"]:checked');
return checked ? checked.value:'C';
}
function roundTo(num, decimals){
var factor=Math.pow(10, decimals);
return Math.round(num * factor) / factor;
}
function debounce(func, wait){
var timeout;
return function(){
var context=this;
var args=arguments;
clearTimeout(timeout);
timeout=setTimeout(function(){
func.apply(context, args);
}, wait);
};}
return {
init: init,
calculate: calculate,
getLastResults: function(){ return lastResults; }};})();
document.addEventListener('DOMContentLoaded', ITCMeltingCalculator.init);