﻿/// <reference path="utility.js" />
(function ($) {
	var resultsId = 'results'
	$.fn.xmlLookup = function (options) {
		var settings = jQuery.extend({
			definitionsUrl: null,
			lookup: []
		}, options);

		$.ajax({
			async: true,
			cache: true,
			context: { element: this, settings: settings },
			dataType: 'xml',
			error: xmlLookup_ajaxError,
			success: xmlLookup_ajaxSuccess,
			url: settings.definitionsUrl
		});

		return this;
	};

	function xmlLookup_ajaxError(request, status, error) {
		alert('Status: ' + status + '\nError: ' + error);
	}

	function xmlLookup_ajaxSuccess(data, request, status) {
		var rootElement = this.element;
		var settings = this.settings;
		this.data = $(data);

		if (settings.lookup.length == 0) {
			return;
		}

		var index = 0;

		setupLookupTier(this, index);
	}

	function setupLookupTier(context, lookupIndex) {
		var lookup = context.settings.lookup[lookupIndex];

		var select = context.element
				.append('<div class="xml-lookup-filter tier_' + lookupIndex + '">' +
							'<label>' + lookup.prompt + '</label>' +
							'<select></select>' +
							'<div class="display_values"></div>' +
						'</div>')
				.find('.xml-lookup-filter.tier_' + lookupIndex + ' select');

		var newDataContext = context.data.find(lookup.selector);

		appendOptionToSelect(select, '', '');

		newDataContext.each(function () {
			var value = $(this).attr(lookup.valueAttribute);
			appendOptionToSelect(select, value, value);
		});

		select.change(function () { selectChanged(context, lookupIndex, this); });
	}

	function selectChanged(context, lookupIndex, selector) {
		var selectedValue = $(selector).val();
		var lookup = context.settings.lookup[lookupIndex];

		for (var tempIndex = lookupIndex + 1; tempIndex < context.settings.lookup.length; tempIndex++) {
			var selector = '.xml-lookup-filter.tier_' + tempIndex
			context.element.find(selector).remove();
		}

		var selectedData = context.data.find(lookup.selector + '[' + lookup.valueAttribute + '=' + selectedValue + ']');

		var placeHolderElement = $(context.element).find('.tier_' + lookupIndex + ' .display_values').empty();

		for (var displayIndex = 0; displayIndex < lookup.display.length; displayIndex++) {
			var display = lookup.display[displayIndex];

			var value = selectedData.attr(display.valueAttribute);
			if (value != undefined) {
				placeHolderElement.append(
				'<div class="xml-lookup-display">' +
					'<span class="xml-lookup-display-prompt">' + display.prompt + '</span>' +
					'<span class="xml-lookup-display-value">' + value + '</span>' +
				'</div>');
			}
		}

		if (context.settings.lookup.length > lookupIndex + 1) {
			setupLookupTier({ element: context.element, data: selectedData, settings: context.settings }, lookupIndex + 1);
		}
	}
})(jQuery);
