﻿(function($) {
	$.fn.fuelTypes = function(settings) {
		settings = $.extend({
			values : {},
			activeClass : 'active',
			changeEvent : 'change',
			activeEvent : 'focus',
			typeContainerClass : 'type',
			defaultUnits : 1000000,
			formulas : {
				'0' : function (target, units) {
					units = units || settings.defaultUnits;
					return (target.FuelCost / target.UnitDivisor) * (units / ((target.ApplianceEfficiency/100) * target.BtusPerUnit));
				},
				'1' : function(target, units) {
					units = units || settings.defaultUnits;
					return (target.FuelCost / target.BtusPerUnit) * (units / (target.ApplianceEfficiency/100));
				}
			}	
		}, settings);
		
		function getLength(t) {
			var cnt = 0;		
			for(var v in settings.values) {
				cnt++;
			}
			return cnt;
		}
		
		function createAllFactors() {
			var results = [];
			for(var v in settings.values) {
				var val = settings.values[v];
				var t = createFactor(val);
				results.push(t);
			}
			return results;
		}
		
		function getActiveName() {
			return $('.'+settings.activeClass).find('.name').val();
		}
		function getActiveFactor() {
			return createFactor(settings.values[getActiveName()]);
		}
		
		function createFactor(target) {
			//( (document.getElementById('WP_AE').value/100) * 8200) * document.getElementById('WP_AFU').value * 2000;
			var f = ((target.ApplianceEfficiency/100) * target.BtusPerUnit) * target.FuelUsage * target.UnitDivisor;
			return f;
		}
		
		function calculateCostPerMillion(target) {
			return settings.formulas[target.Formula](target);
		}
		
		function calculateTotalCost(pricePerUnit, fuelNeeded) {
			return pricePerUnit*fuelNeeded;
		}
		
		function calculateFuelNeeded(target, factor) {
			factor = factor || getActiveFactor();
			//t_fuel_needed += g_factors[i] / ((t_appliance_efficiency/100)*8200) / 2000;
			var result = factor / ((target.ApplianceEfficiency/100) * target.BtusPerUnit) / target.UnitDivisor;
			return result;
		}
		
		function setTotalCost(container, target) {
			var fuelNeeded = calculateFuelNeeded(target);
			var totalCost = calculateTotalCost(target.FuelCost, fuelNeeded);			
			$(".totalCost span", container).text(roundToTwoDigits(totalCost));
		}
		
		function roundToTwoDigits(input) {
			return Math.round(input*100)/100;
		}
		
		function setCostPerMillion(container, target) {
			var cost = calculateCostPerMillion(target);
			$(".calculatedCost span", container).text(roundToTwoDigits(cost));
		}
		
		function recalcAll(allTypes) {
			var activeName = getActiveName();
			var activeValue = settings.values[activeName];
			var factor = getActiveFactor();
			var baseFuel = calculateFuelNeeded(settings.values[activeName]);
			allTypes.each(function() {
				var st = $(this);
				var name = $(".name", st).val();
				var balls = settings.values[name];
				balls.FuelUsage = baseFuel;						
				var fuelUsage = calculateFuelNeeded(balls, factor);
				settings.values[name].FuelUsage = fuelUsage;
				setCostPerMillion(st, settings.values[name]);
				setTotalCost(st, settings.values[name]);
				
				if(name!=activeName) {
					$(".fuelUsage input", st).val(roundToTwoDigits(fuelUsage));
				}
			});
		}
		
		var argh = $(this);
		var allTypes = $('.' + settings.typeContainerClass, argh);
		allTypes.each(function() {
			var singleType = $(this);
			$("input", this).each(function() {
				var inputs = $(this);
				inputs.focus(function() {
					singleType.addClass(settings.activeClass);
					$('.' + settings.activeClass).not(singleType).removeClass(settings.activeClass);
				});
				inputs.keyup(function() {
					var input = $(this);
					var css = input.attr("class");
					var name = $(".name", singleType).val();
					var val = isNaN(input.val()) ? 1 : parseFloat(input.val());
					if(!settings.values[name]) {
						settings.values[name] = {};
					}
					settings.values[name][css] = val;
					recalcAll(allTypes);
				});				
			});
		});
		return argh;
	};
})(jQuery); 