//products
var prodDesktopArchive = "Desktop Archive";
var prodPersonalArchive = "Personal Archive";
var prodDynamicArchiveGV10 = "Dynamic Archive: GV-10";
var prodDynamicArchiveGV100 = "Dynamic Archive: GV-100";

//define array of GenVault products
var genvaultProducts = new Array(3);
genvaultProducts[0] = prodDesktopArchive;
genvaultProducts[1] = prodPersonalArchive;
genvaultProducts[2] = prodDynamicArchiveGV10;
genvaultProducts[3] = prodDynamicArchiveGV100;

//define attribute indexes
var unitCost = 0;
var unitCapacity = 1;
var unitEnergyConsumption = 2;
var unitLifetime = 3;

//define Desktop Archive attribute values
var dtaAttributes = new Array(4);
dtaAttributes[unitCost] = 1195;
dtaAttributes[unitCapacity] = 38400;
dtaAttributes[unitEnergyConsumption] = 0;
dtaAttributes[unitLifetime] = 5;

//define Personal Archive attribute values
var paAttributes = new Array(4);
paAttributes[unitCost] = 17595;
paAttributes[unitCapacity] = 460800;
paAttributes[unitEnergyConsumption] = 1095;
paAttributes[unitLifetime] = 5;

//define Dynamic Archive: GV-10 attribute values
var gv10Attributes = new Array(4);
gv10Attributes[unitCost] = 777000;
gv10Attributes[unitCapacity] = 14929920;
gv10Attributes[unitEnergyConsumption] = 28032;
gv10Attributes[unitLifetime] = 5;

//define Dynamic Archive: GV-100 attribute values
var gv100Attributes = new Array(4);
gv100Attributes[unitCost] = 1246000;
gv100Attributes[unitCapacity] = 39191040;
gv100Attributes[unitEnergyConsumption] = 28032;
gv100Attributes[unitLifetime] = 5;

//define Freezer attribute values
var freezerUnitCost = 15081;
var freezerUnitCapacity = 40000;
var freezerUnitEnergyConsumption = 7665;
var freezerUnitLifetime = 5;

var lastValidNumOfAliquots;
var lastValidElectricityRate;
var lastFreezerUnitCost = freezerUnitCost;
var lastFreezerUnitCapacity = freezerUnitCapacity;

function init() {
    //set select options for GenVault products
    document.getElementById("optDesktopArchive").text=prodDesktopArchive;
    document.getElementById("optPersonalArchive").text=prodPersonalArchive;
    document.getElementById("optDynamicArchiveGV10").text=prodDynamicArchiveGV10;
    document.getElementById("optDynamicArchiveGV100").text=prodDynamicArchiveGV100;
    //set product view
    document.getElementById("fzUnitCost").value=addCommas(freezerUnitCost);
    document.getElementById("fzCapacity").value=addCommas(freezerUnitCapacity);
    document.getElementById("fzEnergyConsumption").innerHTML=addCommas(freezerUnitEnergyConsumption);
    document.getElementById("fzLifetime").innerHTML=addCommas(freezerUnitLifetime);
    document.getElementById("inputElectricityRate").value=0.14;
    updateGVSystemSummary();
}

function updateGVSystemSummary() {
    var selectedProduct = getSelectedGVProduct();
    document.getElementById("systemSummaryProduct").innerHTML=selectedProduct;
    document.getElementById("gvUnitCost").innerHTML="$" + addCommas(getProductAttribute(selectedProduct, unitCost));
    document.getElementById("gvCapacity").innerHTML=addCommas(getProductAttribute(selectedProduct, unitCapacity));
    document.getElementById("gvEnergyConsumption").innerHTML=addCommas(getProductAttribute(selectedProduct, unitEnergyConsumption));
    document.getElementById("gvLifetime").innerHTML=addCommas(getProductAttribute(selectedProduct, unitLifetime));
    
}

function onAliquotChanged() {
    var aliquots = parseInteger(document.getElementById("inputAliquots").value);
     if (isNaN(aliquots)) {
        alert("Entered value for \"Number of Aliquots\" is invalid.  Please enter an integer value for this field."); 
     } else {
        lastValidNumOfAliquots = aliquots;
        updateGVProductSelection();
        updateGVSystemSummary();
        updateCalcResults();
    }
    document.getElementById("inputAliquots").value = addCommas(lastValidNumOfAliquots);
}

function onElectricityRateChanged() {
    var electricityRate = parseFloat(document.getElementById("inputElectricityRate").value);
    if (isNaN(electricityRate)) {
        alert("Entered value for \"Electricity\" is invalid.  Please enter a numeric value for this field."); 
     } else {
        lastValidElectricityRate = electricityRate;
        updateCalcResults();
    }
    document.getElementById("inputElectricityRate").value = lastValidElectricityRate;
}

function onProductChanged() {
    updateGVSystemSummary();
    updateCalcResults();
}

function onFreezerUnitCostChanged() {
    var fzUnitCost = parseInteger(document.getElementById("fzUnitCost").value);
     if (isNaN(fzUnitCost)) {
        alert("Entered value for \"Freezer Cost/Unit\" is invalid.  Please enter an integer value for this field."); 
     } else {
        lastFreezerUnitCost = fzUnitCost;
        updateCalcResults();
    }
    document.getElementById("fzUnitCost").value = addCommas(lastFreezerUnitCost);
}

function onFreezerUnitCapacityChanged() {
    var fzCapacity = parseInteger(document.getElementById("fzCapacity").value);
     if (isNaN(fzCapacity)) {
        alert("Entered value for \"Freezer Capacity/Unit\" is invalid.  Please enter an integer value for this field."); 
     } else {
        lastFreezerUnitCapacity = fzCapacity;
        updateCalcResults();
    }
    document.getElementById("fzCapacity").value = addCommas(lastFreezerUnitCapacity);
}

function updateCalcResults() {
    if (hasValidInput()) {
        updateCalcResultsForGVProduct(getSelectedGVProduct());
    } else {
        clearCalcResults();
    }
}

function updateCalcResultsForGVProduct(prod) {
    if (!hasValidInput())
        return;
    
    //do calculations
    var aliquots = parseInteger(document.getElementById("inputAliquots").value);
    var electricityRate = parseFloat(document.getElementById("inputElectricityRate").value);
    
    freezerUnitCost = parseInteger(document.getElementById("fzUnitCost").value);
    freezerUnitCapacity = parseInteger(document.getElementById("fzCapacity").value);

    var gvNumUnitsRequired = Math.ceil(aliquots/getProductAttribute(prod, unitCapacity));
    var fzNumUnitsRequired = Math.ceil(aliquots/freezerUnitCapacity);
    var gvEquipmentCost = Math.round(gvNumUnitsRequired * getProductAttribute(prod, unitCost));
    var fzEquipmentCost = Math.round(fzNumUnitsRequired * freezerUnitCost);
    var gvConsumableCost = Math.round(Math.ceil(aliquots/384) * 51.84);
    var fzConsumableCost = Math.round(aliquots * 0.61);
    var gvAnnualEnergyCost = Math.round(electricityRate * gvNumUnitsRequired * getProductAttribute(prod, unitEnergyConsumption));
    var fzAnnualEnergyCost = Math.round(electricityRate * fzNumUnitsRequired * freezerUnitEnergyConsumption);
    var gvLifetimeEnergyCost = gvAnnualEnergyCost * getProductAttribute(prod, unitLifetime);
    var fzLifetimeEnergyCost = fzAnnualEnergyCost * freezerUnitLifetime;
    var gvSavings = fzLifetimeEnergyCost - gvLifetimeEnergyCost;
    
    var envEnergySaved = (fzNumUnitsRequired * freezerUnitEnergyConsumption * freezerUnitLifetime) - (gvNumUnitsRequired * getProductAttribute(prod, unitEnergyConsumption) * getProductAttribute(prod, unitLifetime));
    var envPollutionReduction = Math.round(envEnergySaved * 1.43);
    var envCarReduction = envPollutionReduction/11560;
    var envForestReduction = envPollutionReduction/7333;
    
    //display results
    document.getElementById("costSummaryProduct").innerHTML = prod;
    document.getElementById("gvNumUnitsRequired").innerHTML = addCommas(gvNumUnitsRequired);
    document.getElementById("fzNumUnitsRequired").innerHTML = addCommas(fzNumUnitsRequired);
    document.getElementById("gvEquipmentCost").innerHTML = "$" + addCommas(gvEquipmentCost);
    document.getElementById("fzEquipmentCost").innerHTML = "$" + addCommas(fzEquipmentCost);
    document.getElementById("gvConsumableCost").innerHTML = "$" + addCommas(gvConsumableCost);
    document.getElementById("fzConsumableCost").innerHTML = "$" + addCommas(fzConsumableCost);
    document.getElementById("gvAnnualEnergyCost").innerHTML = "$" + addCommas(gvAnnualEnergyCost);
    document.getElementById("fzAnnualEnergyCost").innerHTML = "$" + addCommas(fzAnnualEnergyCost);
    document.getElementById("gvLifetimeEnergyCost").innerHTML = "$" + addCommas(gvLifetimeEnergyCost);
    document.getElementById("fzLifetimeEnergyCost").innerHTML = "$" + addCommas(fzLifetimeEnergyCost);
    document.getElementById("gvSavings").innerHTML = "$" + addCommas(gvSavings);
    
    document.getElementById("envEnergySaved").innerHTML = addCommas(envEnergySaved);
    document.getElementById("envPollutionReduction").innerHTML = addCommas(envPollutionReduction);
    document.getElementById("envCarReduction").innerHTML = addCommas(envCarReduction.toFixed(2));
    document.getElementById("envForestReduction").innerHTML = addCommas(envForestReduction.toFixed(2));
    
} 

function clearCalcResults() {
    
    document.getElementById("costSummaryProduct").innerHTML = "GenVault Archive";
    document.getElementById("gvNumUnitsRequired").innerHTML = "";
    document.getElementById("fzNumUnitsRequired").innerHTML = "";
    document.getElementById("gvAnnualEnergyCost").innerHTML = "";
    document.getElementById("fzAnnualEnergyCost").innerHTML = "";
    document.getElementById("gvLifetimeEnergyCost").innerHTML = "";
    document.getElementById("fzLifetimeEnergyCost").innerHTML = "";
    document.getElementById("gvSavings").innerHTML = "";
    
    document.getElementById("envEnergySaved").innerHTML = "";
    document.getElementById("envPollutionReduction").innerHTML = "";
    document.getElementById("envCarReduction").innerHTML = "";
    document.getElementById("envForestReduction").innerHTML = "";
    
}

function getSelectedGVProduct() {
    var selectProdControl = document.getElementById("inputProduct");
    return selectProdControl.options[selectProdControl.selectedIndex].text;
}

function parseInteger(input) {
    input += ""; //change to string just in case input in non-string type
    var intVal = "";
    var x = input.split(",");
    for (i=0; i<x.length; i++) {
        intVal += x[i];    
    }
    return parseInt(intVal);
}
function hasValidInput() {
    var aliquots = parseInteger(document.getElementById("inputAliquots").value);
    var electricityRate = parseFloat(document.getElementById("inputElectricityRate").value);
    freezerUnitCost = parseInteger(document.getElementById("fzUnitCost").value);
    freezerUnitCapacity = parseInteger(document.getElementById("fzCapacity").value);
    if (isNaN(aliquots) || isNaN(electricityRate) || isNaN(freezerUnitCost) || isNaN(freezerUnitCapacity))
        return false;
    else
        return true;
}

function getProductAttribute(prod, attrIndex) {
    if (prod == prodDesktopArchive) {
        return dtaAttributes[attrIndex];
    } else if (prod == prodPersonalArchive) {
        return paAttributes[attrIndex];
    } else if (prod == prodDynamicArchiveGV10) {
        return gv10Attributes[attrIndex];
    } else if (prod == prodDynamicArchiveGV100) {
        return gv100Attributes[attrIndex];
    }
}

function updateGVProductSelection() {
    var aliquots =parseInteger(document.getElementById("inputAliquots").value);
    var selectProdControl = document.getElementById("inputProduct");
    
    if (aliquots <= 268800) {
        // selectProduct = prodDesktopArchive;
        selectProdControl.selectedIndex = 0;
    } else if (aliquots>268800 && aliquots<=4032000) {
        // selectProduct = prodPersonalArchive;
        selectProdControl.selectedIndex = 1;
    } else if (aliquots>4032000 && aliquots<=14929920) {
        // selectProduct = prodDynamicArchiveGV10;
        selectProdControl.selectedIndex = 2;
    } else {
        // selectProduct = prodDynamicArchiveGV100;
        selectProdControl.selectedIndex = 3;
    }
    
   
}

function addCommas(nStr) {
    nStr += "";
    x = nStr.split(".");
    x1 = x[0];
    x2 = x.length > 1 ? "." + x[1] : "";
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, "$1" + "," + "$2");
    }
    return x1 + x2;
}
