

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;
}

// **** ---------------------------------------------------------------------------- ****
// Functions and procedures below this line Copyright 2008 Corebox Online Services Inc.  
// All Rights Reserved
// **** ---------------------------------------------------------------------------- ****

function nameChange() {
	// when user changes the name of the property / deposit
	// this function updates the hidden inputs
	var deposit = document.getElementById('property_name').value;
	document.getElementById('hidden_property_name').value = deposit;
}

function punch() { 
	// This function crunches numbers for the Corebox Calculator
	
	// inputs
	var res_tonnes=parseFloat(document.getElementById('res_tonnes').value);
	var tonnes_per_day=parseFloat(document.getElementById('tonnes_per_day').value);
	var strip=parseFloat(document.getElementById('strip').value);
	var processing_cost =parseFloat(document.getElementById('processing_cost').value);
	var mining_cost =parseFloat(document.getElementById('mining_cost').value);
	var operating_days=parseFloat(document.getElementById('operating_days').value);
	var royalties=parseFloat(document.getElementById('royalties').value);
	var refiners_fee=parseFloat(document.getElementById('refiners_fee').value);
	var capital1=parseFloat(document.getElementById('capital1').value);
	
	// declarations
	var recovered_value_per_tonne;
	var insitu;
	var i; // loop counter
	
	// update commodity table; loop through following once for each grade (3)
	for (i = 1; i <= 3; i++) {
		// inputs
		var spot_price = parseFloat(document.getElementById('grade' + i  + '_spot').value).toFixed(6);
		var spot_units = document.getElementById('grade' + i  + '_spot_units').innerHTML;
		var grade = parseFloat(document.getElementById('grade' + i  + '_grade').value).toFixed(6);
		var grade_units = document.getElementById('grade' + i  + '_grade_units').innerHTML;
		var recovery = parseFloat(document.getElementById('grade' + i  + '_recovery').value).toFixed(6);
		
		// updated hidden values for save and share function
		document.getElementById('hidden_'+ 'grade' + i  +'_spot').value= spot_price;
		document.getElementById('hidden_'+ 'grade' + i  +'_spot_units').value= spot_units;
		document.getElementById('hidden_'+ 'grade' + i  +'_grade').value= grade;
		document.getElementById('hidden_'+ 'grade' + i  +'_grade_units').value= grade_units;
		document.getElementById('hidden_'+ 'grade' + i  +'_recovery').value = recovery;
		
		// convert spot unit price to dollars per gram
		switch (spot_units) {
			case '/oz':
				// convert price per troy ounce to price per gram
				spot_price = spot_price / 31.103;
			break;
			case '/lb':
				// convert price per pound to price per gram
				spot_price = spot_price / 453.592;
			break;
			case '/mtu':
				// convert price per mtu to price per gram
				spot_price = spot_price / 10000;
			break;
			case '/ct':
				// convert price per mtu to price per gram
				spot_price = spot_price ;
			break;
			default:
				// for safety set spot_price to zero if no specific case
				spot_price = 0;
			break;
		}
		
		switch (grade_units) {
			case 'g/t':
			case 'ct/t':
				// no change required
			break;
			case '%':
				grade = grade * 10000;
			break;
			default:
				// for safety set spot_price to zero if no specific case
				grade = 0;
			break;
		}
		
		insitu = parseFloat(spot_price * grade * recovery / 100).toFixed(12);

		switch (i) {
			case 1:
				var grade1_insitu = insitu;
			break;
			case 2:
				var grade2_insitu = insitu;
			break;
			case 3:
				var grade3_insitu = insitu;
			break;
		}
		document.getElementById('grade' + i  +'_insitu').innerHTML= parseFloat(insitu).toFixed(2);
		
		// updated hidden value for save and share function
		document.getElementById('hidden_'+ 'grade' + i  +'_insitu').value = parseFloat(insitu).toFixed(2);
	
	} // end for loop
	
	// calculations     
	
	var recovered_value_per_tonne = parseFloat(grade1_insitu) + parseFloat(grade2_insitu) + parseFloat(grade3_insitu);
	var daily_processing_costs = parseInt(tonnes_per_day * processing_cost);
	var daily_mining_costs = parseInt((tonnes_per_day * mining_cost * strip) + (tonnes_per_day * mining_cost));
	var annual_costs = parseInt((daily_processing_costs + daily_mining_costs) * operating_days);
	var annual_revenue = parseInt(recovered_value_per_tonne * tonnes_per_day * operating_days);
	var annual_refiners_fee = parseInt(annual_revenue * refiners_fee / 100);
	var annual_royalties = parseInt((annual_revenue - annual_refiners_fee)* royalties / 100);
	
	var annual_margin = parseInt(annual_revenue - annual_costs - annual_royalties - annual_refiners_fee);
	var capital_3yr = parseInt((capital1) * 1000000);
	var payback = parseFloat(capital_3yr / annual_margin);
	var mine_life = parseFloat(res_tonnes * 1000000 / tonnes_per_day / operating_days).toFixed(3);
	var effective_cost_per_tonne = parseFloat((daily_processing_costs + daily_mining_costs) / tonnes_per_day).toFixed(4);	

	// outputs with formatting
	document.getElementById('recovered_value_per_tonne').innerHTML= '$'+ parseFloat(recovered_value_per_tonne).toFixed(2);
	document.getElementById('annual_revenue').innerHTML= '$'+ addCommas(parseInt(annual_revenue));
	document.getElementById('annual_costs').innerHTML= '('+ addCommas(parseInt(annual_costs))+')';
	document.getElementById('annual_royalties').innerHTML= '('+ addCommas(parseInt(annual_royalties))+')';
	document.getElementById('annual_margin').innerHTML= '$'+ addCommas(parseInt(annual_margin));
	document.getElementById('annual_refiners_fee').innerHTML= '('+ addCommas(parseInt(annual_refiners_fee))+')';
	document.getElementById('mine_life').innerHTML= parseFloat(mine_life).toFixed(1);
	document.getElementById('effective_cost_per_tonne').innerHTML= '$'+ parseFloat(effective_cost_per_tonne).toFixed(2);
	
	// payback cannot go negative
	if (payback < 0) {
		document.getElementById('payback').innerHTML= '(never)';
	} else {
		document.getElementById('payback').innerHTML= parseFloat(payback).toFixed(1);
	}
	
	// update hidden input fields for 'save and share' posting
	document.getElementById('hidden_res_tonnes').value = res_tonnes;
	document.getElementById('hidden_strip').value = strip;
	document.getElementById('hidden_tonnes_per_day').value = tonnes_per_day;
	document.getElementById('hidden_processing_cost').value = processing_cost;
	document.getElementById('hidden_mining_cost').value = mining_cost;
	document.getElementById('hidden_operating_days').value = operating_days;
	document.getElementById('hidden_royalties').value = royalties;
	document.getElementById('hidden_refiners_fee').value = refiners_fee;
	document.getElementById('hidden_capital1').value = capital1;
	
	// format then update for display of detailed calculations
	grade1_insitu = parseFloat(grade1_insitu).toFixed(3);
	grade2_insitu = parseFloat(grade2_insitu).toFixed(3);
	grade3_insitu = parseFloat(grade3_insitu).toFixed(3);
	recovered_value_per_tonne = parseFloat(recovered_value_per_tonne).toFixed(3);
	document.getElementById('details_mine_life').innerHTML = res_tonnes + ' X 1,000,000 / ' + addCommas(tonnes_per_day) + ' / ' + operating_days;
	document.getElementById('details_recovered_value').innerHTML = grade1_insitu + ' + ' + grade2_insitu + ' + ' + grade3_insitu;
	document.getElementById('details_annual_revenue').innerHTML = recovered_value_per_tonne + ' X ' + addCommas(tonnes_per_day) + ' X ' + operating_days;
	document.getElementById('details_daily_processing_costs').innerHTML = processing_cost + ' * ' + addCommas(tonnes_per_day);
	document.getElementById('details_daily_mining_costs').innerHTML = '( ' + addCommas(tonnes_per_day) + ' * ' + strip + '  * ' + mining_cost + ' ) + ( ' + addCommas(tonnes_per_day) + ' * ' + mining_cost + ' )';
	document.getElementById('details_annual_op_costs').innerHTML = '( ' + addCommas(daily_processing_costs) + ' + ' + addCommas(daily_mining_costs) + ' ) * ' + operating_days;
	document.getElementById('details_refiners_fee').innerHTML = addCommas(annual_revenue) + ' * ' + refiners_fee + ' / 100';
	document.getElementById('details_royalties').innerHTML = '( ' + addCommas(annual_revenue) + ' - ' + addCommas(annual_refiners_fee) + ' ) * ' + royalties +' / 100';
	document.getElementById('details_margin').innerHTML = addCommas(annual_revenue) + ' - ' + addCommas(annual_costs) + ' - ' + addCommas(annual_refiners_fee) + ' - ' + addCommas(annual_royalties);
	document.getElementById('details_payback').innerHTML = addCommas(capital1) + ' * 1,000,000 / ' + addCommas(annual_margin);
	document.getElementById('details_effective_cost_tonne').innerHTML = '( ' + addCommas(daily_processing_costs) + ' + ' + addCommas(daily_mining_costs) + ' ) / ' + addCommas(tonnes_per_day);
}

function commod_defaults(commod_row) {
	
	var commod = parseInt(document.getElementById(commod_row +'_commod').selectedIndex);
	var spot_price = 0;
	var spot_units = 0;
	var grade = 0;
	var grade_units = 0;
	var recovery = 100;
	

	switch (commod) {
		case 1: //Gold
			spot_price = 600;
			spot_units = '/oz';
			grade = 1.5;
			grade_units = 'g/t';
			
		break;	
		case 2: // Silver
			spot_price = 8.0;
			spot_units = '/oz';
			grade = 22;
			grade_units = 'g/t';
		break;
		case 3: // Copper
			spot_price = 3.0;
			spot_units = '/lb';
			grade = 0.3;
			grade_units = '%';
		break;
		case 4: // Lead
			spot_price = 5.0;
			spot_units = '/lb';
			grade = 1.00;
			grade_units = '%';
		break;
		case 5:  // Zinc
			spot_price = 5.0;
			spot_units = '/lb';
			grade = 1.00;
			grade_units = '%';
		break;
		case 6:  // Moly (Mo)
			spot_price = 20.0;
			spot_units = '/lb';
			grade = 0.50;
			grade_units = '%';
		break;
		case 7:  // Nickel
			spot_price = 5;
			spot_units = '/lb';
			grade = 0.10;
			grade_units = '%';
		break;
		case 8:  // Tungsten (WO3)
			spot_price = 200;
			spot_units = '/mtu';
			grade = 0.10;
			grade_units = '%';
		break;
		case 9:  // Diamonds
			spot_price = 100;
			spot_units = '/ct';
			grade = 1;
			grade_units = 'ct/t';
		break;
		default:
			spot_price = 0;
			spot_units = '';
			grade = 0;
			grade_units = '';
		break;
		
	}
	// display default values
	document.getElementById(commod_row +'_spot').value= spot_price;
	document.getElementById(commod_row +'_spot_units').innerHTML= spot_units;
	document.getElementById(commod_row +'_grade').value= grade;
	document.getElementById(commod_row +'_grade_units').innerHTML= grade_units;
	document.getElementById(commod_row +'_recovery').value = recovery;
	
	// updated hidden values for save and share function                      
	document.getElementById('hidden_'+ commod_row +'_commod').value = commod;
	
	punch();

}


function show_hide(id_name,show_note,hide_note) {
	// toggle show / hide details
	
	// get the current status of the DIV element (block or none)
	var show_or_hide = document.getElementById(id_name).style.display;
	
	if (show_or_hide == 'none') {
		// show calculation details
		document.getElementById(id_name).style.display = 'block';
		// change the link wording to 'hide details'
		document.getElementById(id_name + '_link').innerHTML = '<< ' + hide_note;
		
	} else {
		// hide calculation details
		document.getElementById(id_name).style.display = 'none';
		// change the link wording to 'show details'
		document.getElementById(id_name + '_link').innerHTML = '>> ' + show_note;
	}
}