// Trap and disable form submission with Enter key
function stopRKey(evt) {
	var evt  = (evt) ? evt : ((event) ? event : null);
	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
	if ((evt.keyCode == 13) && (node.type=="text")) { return false; }
}
document.onkeypress = stopRKey;

// Global variables
var nbTabs = 4;
var locked_mix = 3;
var unlockedMax = 101;
var totalPower = 0;
var totalPowerTab3 = 0;

// Main change handling routine for tab selection
function handleTab(tn) {
	// Validate fields
	if (validate()) {
		// Recalculate values
		recalculate();
		// Change to new tab
		showTab(tn);
	} else {
		// Error
		alert('Please correct the errors in the form.');
	}
}

// Function to display current tab
function showTab(tabNumber) {
	for (var t=1; t<nbTabs+1; t++) {
		if (t==tabNumber) {
			document.getElementById('t'+t).className = 'selected';
			document.getElementById('tab'+t).style.display = 'block';
		} else {
			document.getElementById('t'+t).className = '';
			document.getElementById('tab'+t).style.display = 'none';
		}
	}
}

// Function to change percentage based on currently locked menu
function changePercentage(c) {
	var otherUnlocked;
	// Get index of unselected field
	switch(c) {
		case 1:
			otherUnlocked = (locked_mix==2)? 3 : 2;
			break;
		case 2:
			otherUnlocked = (locked_mix==1)? 3 : 1;
			break;
		case 3:
			otherUnlocked = (locked_mix==1)? 2 : 1;
			break;
	}
	// Get values of unlocked fields
	c1 = document.getElementById('cc_select_pct'+c);
	c2 = document.getElementById('cc_select_pct'+otherUnlocked);
	v1 = c1.options[c1.selectedIndex].value;
	v2 = c2.options[c2.selectedIndex].value;
	c2.selectedIndex = unlockedMax - 1 - v1;
	// Update calculations
	recalculate();
}

function updateNbSets() {
	for (var t=1; t<4; t++) {
		var c = document.getElementById('cc_select_pct'+t);
		var v = c.options[c.selectedIndex].value;
		var f = document.getElementById('cc_pct'+t).innerHTML = (v*10);
	}
}

function lock(c) {
	// If user clicked on an unlocked icon
	if (c!=locked_mix) {
		// Change previous locked icon to unlocked image
		var img = document.getElementById('cc_lockimg'+locked_mix);
		img.src = 'images/unlocked.jpg';
		img.alt = 'Click to lock percentage';
		// Change current unlocked icon to locked image
		img = document.getElementById('cc_lockimg'+c);
		img.src = 'images/locked.jpg';
		img.alt = 'Percentage Locked';
		// Set new locked mix to current
		locked_mix = c;
		// Reset unlocked percentages max value to 100 minus value of locked
		unlockedMax = 100-document.getElementById('cc_select_pct'+locked_mix).value+1;
		for (var t=1; t<4; t++) {
			if (t!==c) {
				// Preserve current values
				var cc = document.getElementById('cc_select_pct'+t);
				var cv = cc.value;
				// Remove all options from unlocked items
				while (cc.options.length>0) {
					cc.options[0] = null;
				}
				// Add items from 0 to unlockedMax
				for (var r=0; r<unlockedMax; r++) {
					var newOption = document.createElement('option');
					newOption.text = r+'%';
					newOption.value = r;
					if (r==cv) newOption.selected = true;
					try {
						cc.add(newOption, null);
					}
					catch(ex) {
						cc.add(newOption);
					}
				}
			}
		}
	}
	// Disable locked pulldown
	for (var t=1; t<4; t++) {
		if (t==locked_mix) {
			document.getElementById('cc_select_pct'+t).disabled = true;
		} else {
			document.getElementById('cc_select_pct'+t).disabled = false;
		}
	}
	// Update number of sets fields
	updateNbSets();
}

function roundNumber(num, dec) {
	return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}

function validate() {
	// Error flag
	var error = false;
	
	// Validate each phone and ce field in Tab 2
	for (var f in fields) {
		var field = fields[f];
		// Clear phone and ce error fields
		document.getElementById('e'+field.name).innerHTML = '';
		var fieldValue = document.getElementById(field.name).value;
		// Check for empty field
		if (field.r && fieldValue=='') {
			error = true;
			document.getElementById('e'+field.name).innerHTML += '<span class="error">Value required.</span><br/>';
		} else
		// Check for non-integer
		if (field.i && !isPositiveInteger(fieldValue) && fieldValue!='') {
			error = true;
			document.getElementById('e'+field.name).innerHTML += '<span class="error">Value must be a number.<br/>';
		}

		// Validate each phone and ce field in Tab 3 [using .p flag (phone) from fields array objects]
		if (field.p==true) {
			// Clear phone and ce error fields
			document.getElementById('e_ph_qty_'+field.name).innerHTML = '';
			var fieldValue = document.getElementById('ph_qty_'+field.name).value;
			// Check for empty field
			if (field.r && fieldValue=='') {
				error = true;
				document.getElementById('e_ph_qty_'+field.name).innerHTML += '<span class="error">Value required.</span><br/>';
			} else
			// Check for non-integer
			if (field.i && !isPositiveInteger(fieldValue) && fieldValue!='') {
				error = true;
				document.getElementById('e_ph_qty_'+field.name).innerHTML += '<span class="error">Value must be a number.<br/>';
			}
			// Tally total power
			totalPowerTab3 += Math.round(fieldValue);
		}

		// Tally total power
		totalPower += Math.round(fieldValue);
	}

	// Return error flag
	return (!error);
}

function recalculate() {
	// Tab 1 - Customized calculations
	var nf;
	// Calculate total power
	var totalPower = 0;
	// Walk through each device field
	for (f in fields) {
		var field = fields[f];
		// Obtain quantity
		var fieldValue = document.getElementById(field.name).value;
		// Multiply quantity by watts
		var power = consumption[field.name]*fieldValue;
		// Increase total power
		totalPower += power;
	}
	// Update total power field
	document.getElementById('csetMixTotal').innerHTML = new NumberFormat(totalPower).toFormatted();
	// Power and consumption
	var kwh = totalPower / 1000;
	// CO2 emissions
	var co2kg = 0.43 * kwh * 24 * 365;
	var co2tons = co2kg / 1000;
	document.getElementById('co2tons').innerHTML = new NumberFormat(co2tons).toFormatted();
	// Cost
	var ecostindex = document.getElementById('ratesSelection1').options[document.getElementById('ratesSelection1').selectedIndex].value;
	var ecost = rates[ecostindex].rate / 100;
	var ecurrency = rates[ecostindex].currency;
	var estate = document.getElementById('ratesSelection1').options[document.getElementById('ratesSelection1').selectedIndex].text;
	var costyear = totalPower * ecost / 1000 * 24 * 365;
	document.getElementById('costyear').innerHTML = ecurrency + new NumberFormat(costyear).toFormatted();

	// Tab 2 - IP phones only

	// Variables needed for 3rd tab calculations
	var mitel_mcs = 0;
	var mitel_totalpower = 0;
	var mitel_co2tons_lifetime = 0;

	// Variables needed for 4th tab calculations
	var mitel_mcs_tab4 = 0;
	var mitel_totalpower_tab4 = 0;
	var mitel_co2tons_lifetime_tab4 = 0;

	// Walk through companies array
	for (var ci=0; ci<phonesByCompany.length; ci++) {
		// Calculate power consumption for each phone
		var cc = phonesByCompany[ci];
		cc.totalPower = 0;
		// Walk through array of sets
		for (var cs=0; cs<sets.length; cs++) {
			// Get quantity for each set from tab 1
			var setName = sets[cs];
			var setQty = document.getElementById('ph_qty_setMix'+setName).value;
			//document.getElementById('ph_qty_'+setName).innerHTML = setQty;
			var setName = sets[cs];
			// Get power consumption for each set
			var currentSetPower = cc[setName] * setQty;
			cc.totalPower += parseFloat(currentSetPower);
			// Update current power for company and set
			document.getElementById('ph_'+setName+'_'+cc.name).innerHTML = new NumberFormat(currentSetPower).toFormatted();
		}
		// Update total power for company
		document.getElementById('ph_totalpower_'+cc.name).innerHTML = new NumberFormat(cc.totalPower).toFormatted();
		
		// Power and consumption
		cc.kwh = cc.totalPower / 1000; // kwh
		cc.kwd = cc.kwh * 24; // per day
		cc.kwy = cc.kwd * 365; // per year

		// CO2 Emissions
		cc.co2kg = 0.43 * cc.kwy;
		cc.co2tons = cc.co2kg / 1000;
		// Update co2 emissions tonnes per year
		document.getElementById('ph_co2tons_'+cc.name).innerHTML = new NumberFormat(cc.co2tons).toFormatted();
		// Update co2 emissions tonnes per lifecycle (7 years)
		document.getElementById('ph_co2tons_lifetime_'+cc.name).innerHTML = new NumberFormat(cc.co2tons*7).toFormatted();
		
		// Cost
		var ccecostindex = document.getElementById('ratesSelection2').options[document.getElementById('ratesSelection2').selectedIndex].value;
		var ccecurrency = rates[ccecostindex].currency;
		var ccecost = rates[ccecostindex].rate / 100;
		//cc.costyear = cc.kwy * ccecost;
		cc.costyear = cc.totalPower * ccecost / 1000 * 24 * 365;
		// Update cost per year
		document.getElementById('ph_costyear_'+cc.name).innerHTML = ccecurrency + new NumberFormat(cc.costyear).toFormatted();

		// Savings
		cc.totalLifecycleCosts = cc.costyear;
		var curYearCost = cc.costyear;
		for (var y=2; y<8; y++) {
			curYearCost = curYearCost * annual_kwh_price_increase;
			cc.totalLifecycleCosts += curYearCost;
		}
		
		// Update total lifecycle costs
		document.getElementById('ph_lifecycle_'+cc.name).innerHTML = ccecurrency + new NumberFormat(cc.totalLifecycleCosts).toFormatted();
		
		// Cost savings and co2 emissions vs Mitel
		if (cc.name=="mitel") {
			document.getElementById('ph_savings_'+cc.name).innerHTML = "<strong>&ndash;</strong>";
			document.getElementById('ph_pctsavings_'+cc.name).innerHTML = "<strong>&ndash;</strong>";
			document.getElementById('ph_c02_savings_'+cc.name).innerHTML = "<strong>&ndash;</strong>";
			mitel_mcs = cc.totalLifecycleCosts;
			mitel_totalpower = cc.totalPower;
			mitel_co2tons_lifetime = cc.co2tons*7;
		} else {
			// Cost Savings
			document.getElementById('ph_savings_'+cc.name).innerHTML = "<strong>" + ccecurrency + new NumberFormat(cc.totalLifecycleCosts - mitel_mcs).toFormatted() + "</strong>";
			// % Energy Savings
			if (cc.totalPower==0) {
				document.getElementById('ph_pctsavings_'+cc.name).innerHTML = "<strong>&ndash;</strong>";
			} else {
				document.getElementById('ph_pctsavings_'+cc.name).innerHTML = "<strong>" + new NumberFormat((1-(mitel_totalpower/cc.totalPower))*100).toFormatted() + "%</strong>";
			}
			// co2 Emissions Saving
			document.getElementById('ph_c02_savings_'+cc.name).innerHTML = "<strong>" + new NumberFormat((cc.co2tons*7) - mitel_co2tons_lifetime).toFormatted() + "</strong>";
		}
	}

	// Tab 3 - Competitive Comparison
	
	// Update number of sets in pulldown on tab 3
	updateNbSets();
	// Get % of bid sets
	var bsElem = document.getElementById('cc_select_pct1');
	var bs = bsElem.options[bsElem.selectedIndex].value;
	// Get % of mid sets
	var msElem = document.getElementById('cc_select_pct2');
	var ms = msElem.options[msElem.selectedIndex].value;
	// Get % of premium sets
	var psElem = document.getElementById('cc_select_pct2');
	var ps = psElem.options[psElem.selectedIndex].value;
	
	// Walk through companies array
	for(c in companies) {
		// Calculate power consumption by company
		var cc = companies[c];
		cc.totalPower = (bs*10*cc.bs) + (ms*10*cc.ms) + (ps*10*cc.ps) + cc.ce;
		// Update cc_totalpower_xxx
		document.getElementById('cc_totalpower_'+cc.cname).innerHTML = new NumberFormat(cc.totalPower).toFormatted();

		// Power and consumption
		cc.kwh = cc.totalPower / 1000; // kwh
		cc.kwd = cc.kwh * 24; // per day
		cc.kwy = cc.kwd * 365; // per year

		// CO2 Emissions
		cc.co2kg = 0.43 * cc.kwy;
		cc.co2tons = cc.co2kg / 1000;
		// Update co2 emissions tonnes per year
		document.getElementById('co2tons_'+cc.cname).innerHTML = new NumberFormat(cc.co2tons).toFormatted();
		// Update co2 emissions tonnes per lifecycle (7 years)
		document.getElementById('co2tons_lifetime_'+cc.cname).innerHTML = new NumberFormat(cc.co2tons*7).toFormatted();
		
		// Cost
		var ccecostindex = document.getElementById('ratesSelection3').options[document.getElementById('ratesSelection3').selectedIndex].value;
		var ccecurrency = rates[ccecostindex].currency;
		var ccecost = rates[ccecostindex].rate / 100;
		cc.costyear = cc.kwy * ccecost;
		// Update cost per year
		document.getElementById('cc_costyear_'+cc.cname).innerHTML = ccecurrency + new NumberFormat(cc.costyear).toFormatted();

		// Savings
		cc.totalLifecycleCosts = cc.costyear;
		var curYearCost = cc.costyear;
		for (var y=1; y<8; y++) {
			curYearCost = curYearCost * annual_kwh_price_increase;
			cc.totalLifecycleCosts += curYearCost;
		}
		
		// Update total lifecycle costs
		document.getElementById('cc_lifecycle_'+cc.cname).innerHTML = ccecurrency + new NumberFormat(cc.totalLifecycleCosts).toFormatted();
		
		// Cost savings and co2 emissions vs Mitel
		if (cc.cname!="mitel") {
			// Cost Savings
			document.getElementById('cc_savings_'+cc.cname).innerHTML = '<strong>' + ccecurrency + new NumberFormat(cc.totalLifecycleCosts - mitel_mcs_tab4).toFormatted() + '</strong>';
			// % Energy Savings
			document.getElementById('cc_pctsavings_'+cc.cname).innerHTML = '<strong>' + new NumberFormat((1-(mitel_totalpower_tab4/cc.totalPower))*100).toFormatted() + '%</strong>';
			// co2 Emissions Saving
			document.getElementById('cc_c02_savings_'+cc.cname).innerHTML = '<strong>' + new NumberFormat((cc.co2tons*7) - mitel_co2tons_lifetime_tab4).toFormatted() + '</strong>';
		} else {
			document.getElementById('cc_savings_'+cc.cname).innerHTML = "&ndash;";
			document.getElementById('cc_pctsavings_'+cc.cname).innerHTML = "&ndash;";
			document.getElementById('cc_c02_savings_'+cc.cname).innerHTML = "&ndash;";
			mitel_mcs_tab4 = cc.totalLifecycleCosts;
			mitel_totalpower_tab4 = cc.totalPower;
			mitel_co2tons_lifetime_tab4 = cc.co2tons*7;
		}
	}
}

function isPositiveInteger(strValue) {
	var objRegExp = /(^\d\d*$)/;
	return objRegExp.test(strValue);
}

function isInteger(strValue) {
	var objRegExp = /(^-?\d\d*$)/;
	return objRegExp.test(strValue);
}

// Setup rates select menus
var rs1 = document.getElementById('ratesSelection1');
var rs2 = document.getElementById('ratesSelection2');
var rs3 = document.getElementById('ratesSelection3');
for (r in rates) {
	// First menu
	var newOption1 = document.createElement('option');
	newOption1.text = rates[r].state;
	newOption1.value = r;
	try {
		rs1.add(newOption1, null);
	}
	catch(ex) {
		rs1.add(newOption1);
	}
	// Second menu
	var newOption2 = document.createElement('option');
	newOption2.text = rates[r].state;
	newOption2.value = r;
	try {
		rs2.add(newOption2, null);
	}
	catch(ex) {
		rs2.add(newOption2);
	}
	// Third menu
	var newOption3 = document.createElement('option');
	newOption3.text = rates[r].state;
	newOption3.value = r;
	try {
		rs3.add(newOption3, null);
	}
	catch(ex) {
		rs3.add(newOption3);
	}
}

// Setup CC Sets Selects
var cc_bs_pct = document.getElementById('cc_select_pct1');
var cc_ms_pct = document.getElementById('cc_select_pct2');
var cc_ps_pct = document.getElementById('cc_select_pct3');
for (var r=0; r<101; r++) {
	var newOption = document.createElement('option');
	newOption.text = r+'%';
	newOption.value = r;
	var newOption2 = document.createElement('option');
	newOption2.text = r+'%';
	newOption2.value = r;
	var newOption3 = document.createElement('option');
	newOption3.text = r+'%';
	newOption3.value = r;
	try {
		cc_bs_pct.add(newOption, null);
		cc_ms_pct.add(newOption2, null);
		if (r==0) cc_ps_pct.add(newOption3, null);
	}
	catch(ex) {
		cc_bs_pct.add(newOption);
		cc_ms_pct.add(newOption2);
		if (r==0) cc_ps_pct.add(newOption3);
	}
}
cc_bs_pct.selectedIndex = 100;
cc_ps_pct.disable = true;

// Setup tabs visibility
document.getElementById('tab1').style.display = 'block';
document.getElementById('tab2').style.display = 'none';
document.getElementById('tab3').style.display = 'none';
document.getElementById('tab4').style.display = 'none';

// Update number of sets fields
handleTab(1);

