/*
	Class: Wizard

	Javascript Client Side Class
	
	Requires:
		Mootools <http://mootools.net>
		
	Implements: 
		Options - Mootools Options class
		Event - Mootools Event class
*/
var Wizard = new Class({
	options: {
	},

	/*
		Constructor: initialize
		
		Parameters: 
			options - pass options to the object
	*/
	initialize: function( options ) {
		this.setOptions(this.options, options);
		$$('#Wizard select').each(function(sel,i) {
			sel.onchange = Class.empty;
			sel.setProperty('tabindex', i).addEvents({
				'change' : function(event) { this.onUpdate(event); }.bindWithEvent(this),
				'keyup' : function(event) { 
					if(event.code != 9 && event.code != 13)
						this.onUpdate(event);
					if(event.code == 13) {
						event.target.form.action = 'next';
						event.target.form.submit();
					}
				}.bindWithEvent(this)
			});
		}, this);
		
		if($E('#Wizard form')) {
			$E('#Wizard form').addEvent(
				'submit' , function(event) {
					this.onSubmit(event);
				}.bindWithEvent(this)
			);
		}
	},
	
	onSubmit: function(event) {
		event.stop();
		var scroll = new Fx.Scroll(window, {
				wait: false,
				duration: 0
		});
		
		new Ajax(
			'query/ValidateForm',
			{
				method: 'post',
				data: event.target.toQueryString(),
				onRequest: function(r) {
					$(document.body).setStyle('cursor', 'wait');
				},
				onComplete: function(r) {
					var response = Json.evaluate(r);
					if(response != '1') {
						var scrollIsDone = false;
						$$('div.error').each(function(el){el.remove()});
						$H(response).each( function(value, index) {	
							$$('.required').each(function(field) {
								var fieldContainer = field.getElement(index) || field.getElement('*[name='+index+']');
								if(fieldContainer) {
									if(!scrollIsDone) {
										scroll.toElement(fieldContainer.getParent().getParent());
										scrollIsDone = true;
									}
									new Element('div',{'class' : 'message error'}).setHTML(value).injectInside(field.getParent());
								}
							});
						});
						$(document.body).setStyle('cursor', '');
					} else {
						this.submit();
					}
					
				}.bind(event.target)
			}
		).request();
	},
	
	onUpdate: function(event) {
		var obj = event.target.getParent().getParent().getElement('.ProductDetail');
		var div = (obj ? obj: new Element('div').addClass('ProductDetail').injectAfter(event.target.getParent()));
		
		var updateList = (event.target.value != "" ?
			new Ajax(
				'query/ProductDetail',{
					method: 'get',
					data: 'component=' + event.target.id + '&value=' + event.target.value,
					update: div, 
					onComplete: function() {
						var fieldContainer = event.target.getParent().getParent().getElement('div.message'); 
						if(fieldContainer) 
							fieldContainer.remove();
					}
				}
			) : 
			new Ajax( 'query/ProductRemove&component=' + event.target.id ,{ onComplete : function(){div.remove();} })
		);
		
		var updateDependencies = new Ajax(
			'query/UpdateDependencies',{
				method: 'get',
				data: 'component=' + event.target.id + '&value=' + event.target.value,
				onComplete: function(r) {
					var components = Json.evaluate(r);
					if($type(components)) {
						$H(components).each( function(el){ $(el.id).disabled = true; } );
						$H(components).each(function(comp) {
							if( $(comp.id) != false) {
							
								if(comp.required == "1") $(comp.id).getParent().addClass('required');
								if(comp.required == "0") $(comp.id).getParent().removeClass('required');
								
								var cValue = $(comp.id).value;
								$(comp.id).empty();
								
								new Element('option').injectInside($(comp.id));
								
								var marque = -1;
								var optgroup = null;

								if( comp.options.length == 0 ) {
									var help = $(comp.id).getParent().getParent();
									if( help && !$E('div.info', help)) {
										help.adopt(
											new Element('div', { 'class' : 'message info'} )
										);
									}

									$E('div.info', help).setHTML(
										 'Désolé mais aucun produit correspondant à vos critères n\'est disponible actuellement.<br/>'
										+'Cependant n\'hésitez pas à faire <a href="/horscat.html" target="_blank">une demande hors catalogue</a>.'
									);

								} else {
									if( notice = $E('div.info', $(comp.id).getParent().getParent() ) )
										notice.remove();

									comp.options.each( function(opt) {
										if(marque != opt.marque) {
											optgroup = new Element('optgroup', {label : opt.marque}).injectInside($(comp.id));
											marque = opt.marque;
										}
										var option = new Element('option',{value: opt.numkey_prod}).setHTML(opt.label + ' - ' + opt.prix).injectInside(optgroup);
										if(cValue == opt.numkey_prod) 
											option.selected = true;
									});
								}

							}
						});
						$H(components).each( function(el){ $(el.id).disabled = false; } );
					}
				}
			}
		);
		
		var updateTotal = new Ajax(
			'query/UpdateTotal',{
				method: 'get',
				onComplete: function(r) {
					var total = Json.evaluate(r);
					if($type(total)) {
						$('total').setHTML(total + ' &euro;');
					}
				}
			}
		);
		 
		 var group = new Group( 
			updateList,
			updateTotal,
			updateDependencies
		).addEvent('onComplete' , function() { 
			$$('select').each(function(sel) { sel.disabled=false; }); 
			$(document.body).setStyle('cursor', '');
		});
		
		$(document.body).setStyle('cursor', 'wait');
		$$('select').each(function(sel) { sel.disabled=true; });
		
		[updateList, updateTotal , updateDependencies].each( function(xhr) { xhr.request(); });
		
	}
});

Wizard.implement( new Options);
Wizard.implement( new Events);

Window.addEvent('domready', function() { new Wizard() });