﻿(function ($) {
	$.fn.unitConverter = function (options) {
		var settings = jQuery.extend({
			sourceUnitsId: null,
			sourceTypeId: null,
			destinationUnitsId: null,
			destinationTypeId: null,
			definitionsUrl: null,
			definitionType: null
		}, options);

		$.ajax({
			async: true,
			cache: true,
			context: { element: this, settings: settings },
			dataType: 'xml',
			error: unitConverter_ajaxError,
			success: unitConverter_ajaxSuccess,
			url: settings.definitionsUrl
		});

		return this;
	};

	function unitConverter_ajaxError(request, status, error) {
		alert('Status: ' + status + '\nError: ' + error);
	}
	function unitConverter_ajaxSuccess(data, request, status) {
		var rootElement = this.element;
		var settings = this.settings;

		var sourceTypes = $('#' + this.settings.sourceTypeId).empty();
		var destinationTypes = $('#' + this.settings.destinationTypeId).empty();
		var sourceUnits = $('#' + this.settings.sourceUnitsId);

		$(data).find("measurements[type=" + this.settings.definitionType + "] convert").each(function () {
			var convert = $(this);
			appendOptionToSelect(sourceTypes, convert.attr('plural'), convert.attr('units'));
			appendOptionToSelect(destinationTypes, convert.attr('plural'), convert.attr('units'));
		});

		sourceTypes.change(function () {
			recalculateDestinationUnits(rootElement, settings);
		});

		destinationTypes.change(function () {
			recalculateDestinationUnits(rootElement, settings);
		});

		sourceUnits.keyup(function () {
			recalculateDestinationUnits(rootElement, settings);
		});
	}

	function recalculateDestinationUnits(rootElement, settings) {
		var sourceTypesElement = $('#' + settings.sourceTypeId);
		var destinationTypesElement = $('#' + settings.destinationTypeId);
		var sourceUnitsElement = $('#' + settings.sourceUnitsId);
		var destinationUnitsElement = $('#' + settings.destinationUnitsId);

		var sourceUnits = parseFloat(sourceUnitsElement.val());
		var sourceConversionRate = parseFloat(sourceTypesElement.val());
		var destinationConversionRate = parseFloat(destinationTypesElement.val());

		if (isNaN(sourceUnits)) {
			destinationUnitsElement.text('please enter a valid number');
		}
		else {
			destinationUnitsElement.text(
				sourceUnits + ' ' + sourceTypesElement.find('option:selected').text() + ' = ' +
				(sourceUnits * sourceConversionRate / destinationConversionRate) +
				' ' + destinationTypesElement.find('option:selected').text());
		}
	}

})(jQuery);
