﻿/// <reference path="utility.js" />
(function ($) {
	$.fn.temperatureConverter = function (options) {
		var settings = jQuery.extend({
			definitionsUrl: null,
			inputTypeId: null,
			inputValueId: null,
			outputTypeId: null,
			outputId: null
		}, options);

		$.ajax({
			async: true,
			cache: true,
			context: { element: this, settings: settings },
			dataType: 'xml',
			error: temperatureConverter_ajaxError,
			success: temperatureConverter_ajaxSuccess,
			url: settings.definitionsUrl
		});

		return this;
	};

	function temperatureConverter_ajaxError(request, status, error) {
		alert('Status: ' + status + '\nError: ' + error);
	}

	function temperatureConverter_ajaxSuccess(data, request, status) {
		var context = this;

		var rootElement = this.element;
		var settings = this.settings;

		var inputValue = $('#' + settings.inputValueId)
				.change(function () { calculateTemperature(context); });
		var inputTypes = $('#' + settings.inputTypeId)
				.empty()
				.change(function () { calculateTemperature(context); });
		var outputTypes = $('#' + settings.outputTypeId)
				.empty()
				.change(function () { calculateTemperature(context); });

		appendOptionToSelect(inputTypes, '', '');
		appendOptionToSelect(outputTypes, '', '');

		$(data).find('temperature').each(function () {
			var tempType = $(this);
			appendOptionToSelect(inputTypes, tempType.attr('name'), tempType.attr('to'));
			appendOptionToSelect(outputTypes, tempType.attr('name'), tempType.attr('from'));
		});
	}

	function calculateFormula(formula, variable, value) {
		var paramName = '{' + variable + '}';
		var indexOfParam = formula.indexOf(paramName);
		var populatedFormula =
				formula.substring(0, indexOfParam) +
				value +
				formula.substring(indexOfParam + paramName.length, formula.length);

		return eval(populatedFormula).toFixed(3);
	}

	function calculateTemperature(context) {
		var inputFormula = $('#' + context.settings.inputTypeId).val();
		var outputFormula = $('#' + context.settings.outputTypeId).val();
		var inputValue = $('#' + context.settings.inputValueId).val();

		var outputElement = $('#' + context.settings.outputId);

		if (inputFormula != null && inputFormula.length > 0 &&
			outputFormula != null && outputFormula.length > 0 &&
			inputValue != null && inputValue.length > 0) {
			// outputElement.html('success');
			var kelvins = calculateFormula(inputFormula, 'input', inputValue);
			var output = calculateFormula(outputFormula, 'kelvin', kelvins);

			outputElement.html(output + ' degrees');
		}
		else {
			// outputElement.html('failure');
		}
	}
})(jQuery);
