﻿// custom reverse plugin
(function($){
	$.fn.reverse = [].reverse;
})(jQuery);

var Wizard = {
	init: function ()
	{
		// hide the loading image
		$('#img_loading').css({'opacity': '0'});
		
		// fade all other tireguru select boxes
		$('div .tire-guru:first').nextAll('.tire-guru').fadeTo("fast", ".25");
		
		// call preload (preload tire-guru values)
		Wizard.preload();
		
		// call event bindings
		Wizard.bind();
	},
	
	bind: function ()
	{
		// tire-guru AJAX select boxes
		$('.tire-guru select').unbind('change', Wizard.Events.changeSelection).bind('change', Wizard.Events.changeSelection);
		
		$(document).unbind('cbox_complete', Wizard.init).bind('cbox_complete', Wizard.init);
	},
	
	preload: function ()
	{
		$('.tire-guru').each(function () {
			var request = Wizard.buildQuery($(this));
			
			if (request)
			{
				var self = $(this).find('select');
				
				// request json for next select box
				$.ajax({
					url: request,
					dataType: 'json',
					success: function (data) { Wizard.Events.loadValues(self, data, true); }
				});
			}
		});
	},
	
	buildQuery: function ($elem)
	{
		var str = '';
		$prev = $elem.prev();
		if ($prev.find('.selected').text() != 0 || $prev.find('select').val() != 0)
		{
			$elem.prevAll('.tire-guru').reverse().each(function ()
			{
				var $selected = $(this).find('.selected');
				var $select = $(this).find('select');
				
				if ($select.val() != '0')
				{
					str += '/' + $select.attr('id') + '/' + $select.val();
				}
				else if ($selected.text() != 0)
				{
					str += '/' + $select.attr('id') + '/' + $selected.text();
				}
			});
		}
		
		return str;
	}
};

Wizard.Events = {
	
	// Tire-Guru AJAX select boxes
	changeSelection: function (e)
	{
		var self = this;
		var request = '';
		
		// remove values of succeding selects
		$(self).parent().nextAll('.tire-guru').fadeTo('fast', .25).find('select').find('option:not(:first)').remove();
		
		// build the request string
		$('.tire-guru select').each(function () {
			if ($(this).val() != '0')
			{
				request += '/' + $(this).attr('id') + '/' + $(this).val();
			}
		});
		
		// request json for next select box
		$.ajax({
			url: request,
			dataType: 'json',
			success: function (data) { Wizard.Events.loadValues(self, data); }
		});
		
		// show the loading image
		$('#img_loading').fadeTo('fast', 1);
	},
	
	// load data into successive Tire-Guru AJAX select boxes
	loadValues: function(element, data, preload)
	{
		if (preload)
		{
			$next = $(element);
		}
		else
		{
			// find the next select box
			$next = $(element).parent().next().find('select');
		}
		
		// add the options to the $next select box
		$.each(data, function(key,value) {
			$('<option />').val(value).text(key).appendTo($next);
		});
		
		$next.parent().fadeTo('fast', 1);
		$('#img_loading').fadeTo('fast', 0);
		
		$selected = $next.parent().find('.selected');
		if ($selected.text() != 0)
		{
			$next.val($selected.text())
			$selected.text('0');
		}
	}
};
