function roundNum(inValue, numPlaces) {
	var retVal = inValue;
	if (!isNaN(parseFloat(inValue)))
		retVal = Math.round(inValue * (Math.pow(10,numPlaces))) / (Math.pow(10,numPlaces));
	return retVal;
}
						
function calculate(blendingMethodObj, blendingMethod, c1RawCrudeDensity, c1DilutantDensity, c1PurchasePrice, c1TransportCost, c1TerminalCost, c2DilutantDensity, c2PurchasePrice, c2TransportCost, c2TerminalCost) {
							
	var C16, C17, C18, C20, C21, C22, C23, C24, C25, C26, C27, C28, C29, C30;
	var grav16, grav17, grav18;
						
	var runningSumRow22 = 0;
	var I6 = 0;
	var I8 = 0;
						
	C16 = c1DilutantDensity;
	C17 = c1RawCrudeDensity;
	C18 = c2DilutantDensity;
						
	C29 = 1.0; //Dry Crude Volume
						
	for (var i=1; i <= 6; i++) {
		grav16 = 141.5/(C16/1000)-131.5;
		grav17 = 141.5/(C17/1000)-131.5;
		grav18 = 141.5/(C18/1000)-131.5;
								
		C20 = C29;
		C21 = C17*C20;
		C22 = C20*((C17-C18)/(C18-C16));
		C23 = C22*C16;
		C24 = C21+C23;
		C25 = C22/(C22+C20)*100;
		C26 = 0.0000214*(Math.pow(C25,(-0.0704)))*(Math.pow((grav16-grav17),(1.76)));
		C27 = C22-(C26*C22);
		C28 = C20+C22;
		C29 = C20+C27;
		C30 = C24/C29;
		
								
		//New value for C17
		C17 = C30;
								
		runningSumRow22 += C22;
	}
							
	I6 = runningSumRow22;
	I8 = C29;
							
	var netDilutentCost = 0;
	var netProductionRevenue = 0;
	var netback = 0;
	netDilutentCost = (I6)*(c1PurchasePrice + c1TransportCost + c1TerminalCost);
	netProductionRevenue = (I8)*(c2PurchasePrice - c2TransportCost - c2TerminalCost);
							
	netback = netProductionRevenue - netDilutentCost;
	if (blendingMethod == "fractal") {
		netback -= 4.6546; // 4.6546=Fractal Opex
	}
							
	blendingMethodObj.volRequired = roundNum( I6, 3 );
	blendingMethodObj.blendRatio = roundNum( (I6/I8*100), 1 );
	blendingMethodObj.netback = roundNum( netback, 2 );
							
	return false;
}
						
function checkValuesAndCalculate() {
							
	// User Inputs
							
	var c1RawCrudeDensity = parseFloat( $("#c1RawCrudeDensity").val() );
	var c1DilutantDensity = parseFloat( $("#c1DilutantDensity").val() );
	var c1PurchasePrice = parseFloat( $("#c1PurchasePrice").val() );
	var c1TransportCost = parseFloat( $("#c1TransportCost").val() );
	var c1PipelineTariff = parseFloat( $("#c1PipelineTariff").val() );
	var c1TerminalCost = parseFloat( $("#c1TerminalCost").val() );
						
	var c2DilutantDensity = parseFloat( $("#c2DilutantDensity").val() );
	var c2PurchasePrice = parseFloat( $("#c2PurchasePrice").val() );
	var c2PipelineTariff = parseFloat( $("#c2PipelineTariff").val() );
	var c2TransportCost = parseFloat( $("#c2TransportCost").val() );
	var c2TerminalCost = parseFloat( $("#c2TerminalCost").val() );
				
	if ( isNaN(c1PipelineTariff) ) {
		c1PipelineTariff = 0;
		 $("#c1PipelineTariff").val("0.00");
	}
	if ( isNaN(c1TransportCost) ) {
		c1TransportCost = 0;
		 $("#c1TransportCost").val("0.00");
	}
	if ( isNaN(c1TerminalCost) ) {
		c1TerminalCost = 0;
		 $("#c1TerminalCost").val("0.00");
	}
	if ( isNaN(c2PipelineTariff) ) {
		c1PipelineTariff = 0;
		 $("#c2PipelineTariff").val("0.00");
	}
	if ( isNaN(c2TransportCost) ) {
		c2TransportCost = 0;
		 $("#c2TransportCost").val("0.00");	 
	}
	if ( isNaN(c2TerminalCost) ) {
		c2TerminalCost = 0;
		 $("#c2TerminalCost").val("0.00");
	}
	if ( isNaN(c1PurchasePrice) ) {
		c1PurchasePrice = 0;
		 $("#c1PurchasePrice").val("0.00");
	}
	if ( isNaN(c2PurchasePrice) ) {
		c2PurchasePrice = 0;
		 $("#c2PurchasePrice").val("0.00");
	}
	
	// Note: We're only going to use the Transport Cost (Trucking Cost) in our calculations
	// since values from Pipeline Cost will be copied to Trucking Cost and vice versa
	if ( c1PurchasePrice < 0 || c1TransportCost < 0 || c1TerminalCost < 0 || c2PurchasePrice < 0 || c2TransportCost < 0 || c2TerminalCost < 0 ) {
		alert("All input values must be greater than zero.");
	}
	else if ( (c1PurchasePrice - c2PurchasePrice) < 10 ) {
		alert("The Diluent Purchase Price must be $10 greater than the Dilbit Blend Sales Price.");
	}
	else
	{
		// Perform calculations to get these desired values						
		var api2059Obj = { volRequired:0, blendRatio:0, netback:0 };
		var fractalObj = { volRequired:0, blendRatio:0, netback:0 };
								
		calculate(api2059Obj, "api2059", c1RawCrudeDensity, c1DilutantDensity, c1PurchasePrice, c1TransportCost, c1TerminalCost, (c2DilutantDensity-2), c2PurchasePrice, c2TransportCost, c2TerminalCost);
		calculate(fractalObj, "fractal", c1RawCrudeDensity, c1DilutantDensity, c1PurchasePrice, c1TransportCost, c1TerminalCost, (c2DilutantDensity+20), c2PurchasePrice, c2TransportCost, c2TerminalCost);
									
		 $("#api2059Volume").val(api2059Obj.volRequired);
		 $("#api2059BlendRatio").val(api2059Obj.blendRatio + "%");
		 $("#api2059Netback").val("$" + formatNumber(api2059Obj.netback));
									
		 $("#fractalVolume").val(fractalObj.volRequired);
		 $("#fractalBlendRatio").val(fractalObj.blendRatio + "%");
		 $("#fractalNetback").val("$" + formatNumber(fractalObj.netback));
									
		var netValueJetshear = fractalObj.netback - api2059Obj.netback;
		netValueJetshear = formatNumber(netValueJetshear);
		 $("#net_value_jetshear").html("$" + netValueJetshear);
								
		showNetValue();
	}
	
	return false;
}
						
function showNetValue() {
	$("#hidden_on_calculate").hide();
	$("#savings_calculator").addClass("results_shown");
	$("#results_form").show("slow");
}
						
// Formats number to 2 decimal places
// Obtained publicly from "google groups" with minor modifications
function formatNumber(inputString) {
	number = inputString.toString().replace(/\$|\,/g,'');
	if(isNaN(number))
		inputString = "0";		
	sign = (number == (number = Math.abs(number)));
	number = Math.floor(number*100+0.50000000001);
	decimalNumber = number%100;
	wholeNumber = Math.floor(number/100).toString();
								
	if(decimalNumber < 10)
		decimalNumber = "0" + decimalNumber;
									
	for (var i = 0; i < Math.floor((wholeNumber.length-(1+i))/3); i++)
		wholeNumber = wholeNumber.substring(0,wholeNumber.length-(4*i+3))+','+wholeNumber.substring(wholeNumber.length-(4*i+3));
								
	return (((sign)?'':'-') + wholeNumber + '.' + decimalNumber);	
}	
						
function resetForm(keepUserValues) {

	if (!keepUserValues) {
		$("#c1DilutantDensity").val("");
		$("#c1PurchasePrice").val("");
		$("#c1PipelineTariff").val("");
		$("#c1TransportCost").val("");
		$("#c1TerminalCost").val("");
		$("#c2DilutantDensity").val("");
		$("#c2PurchasePrice").val("");
		$("#c2PipelineTariff").val("");
		$("#c2TransportCost").val("");
		$("#c2TerminalCost").val("");
	}
							
	$("#api2059Volume").val("");
	$("#api2059BlendRatio").val("");
	$("#api2059Netback").val("");
	$("#fractalVolume").val("");
	$("#fractalBlendRatio").val("");
	$("#fractalNetback").val("");
							
	$("#net_value_jetshear").html("");

	$("#input_form").show();
	$("#hidden_on_calculate").show();
	$("#results_form").hide();
				
	$("#savings_calculator").removeClass("results_shown");
}
			
function copyField(sourceElement, targetElement) {
	targetElement.value = sourceElement.value;
	return false; 
}
						
$(document).ready( function() {
				
	// Preload 2 Background Images required
	var bg1 = new Image();
	var bg2 = new Image();
	bg1.src = "images/jetshear-calc-bg-01.jpg";
	bg2.src = "images/jetshear-calc-bg-02.jpg";

	// Javascript works so, re-show background image
	$("#savings_calculator").removeClass("no_javascript");
	$("#javascript_enabled").show();

	// Initialize the form
	resetForm(false);
				
	// Initialize Combo Boxes with Data
	var cboC1RawCrudeDensity = document.getElementById("c1RawCrudeDensity");
	for (var i=950; i<=1020; i+=10) {
		var newOption = new Option(i, i);
		cboC1RawCrudeDensity.options.add(newOption);
	}
							
	var cboC1DilutantDensity = document.getElementById("c1DilutantDensity");
	for (var i=650; i<=730; i+=5) {
		var newOption = new Option(i, i);
		cboC1DilutantDensity.options.add(newOption);
	}
							
	var cboC2DilutantDensity = document.getElementById("c2DilutantDensity");
	for (var i=925; i<=940; i+=5) {
		var newOption = new Option(i, i);
		cboC2DilutantDensity.options.add(newOption);
	}
});
