// checkout_validations.js
// Questo file contiene:
// - dichiarazione variabile accordion (horizontalAccordion)
// - definizione struttura descrittiva degli step del checkout (steps)
// - dichiarazione step corrente (current_step)
// - Inizializzazione tramite observer dell'accordion vero e proprio
// - definizione delle validazioni per tutti i campi presenti nel checkout
//   (gli array *_validations)
// - funzioni di aggiornamento della preview sulla destra (le varie populate*)
// - una funzione che fa una chiamata Ajax per popolare il carrello di eventuali
//   promozioni ordine e ricarica il carrello nascosto (reloadCart)
// - la funzione che inizializza l'accordion (loadAccordion)
// - una funzione utilizzata dalla new dell'accordion per associare gli eventi
// - onclick ai relativi DOM
//

// inizializzazione variabili globali per checkout

var horizontalAccordion;      // THE accordion (global)

var steps = {
	'intro':      0,
	'billing':    1,
	'shipping':   2,
	'payment':    3,
	'review':     4
};

var headers = $$("#steps .header");

var current_step;

Event.observe(window, 'load', loadAccordion, false);

// Checkout LiveValidation definitions (se in checkout#new_order)
try {
	if ($('order_form')) {
		var billing_validations = [
		new LiveValidation('billing_address_firstname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('billing_address_lastname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('billing_address_street_address').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
//		new LiveValidation('billing_address_country_id').add( Validate.Presence, {
//			validMessage: "",
//			failureMessage: "e` richiesto"
//		} ),
		new LiveValidation('billing_address_postcode').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('billing_address_municipality').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} )
		];
	
		var privacy;
		if ($('privacy_accepted')) {
			privacy = new LiveValidation('privacy_accepted', {
				onlyOnSubmit: true
			});
			privacy.add( Validate.Acceptance, {
				validMessage: "",
				failureMessage: "e` richiesto"
			} );
		}

		var email = new LiveValidation('user_email', {
			onlyOnSubmit: true
		});
		email.add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} );
		email.add( Validate.Email, {
			validMessage: "",
			failureMessage: "non e` un indirizzo e-mail"
		} );
	
		billing_validations.push(email);
	
		var billing_state_district = [
		new LiveValidation('billing_address_district_id').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} )//,
		//	new LiveValidation('billing_address_state').add( Validate.Presence, {
		//		validMessage: "",
		//		failureMessage: "e` richiesto"
		//	} )
		];
	
		//    billing_validations.push(billing_state_district);
    
		var shipping_validations = [
		new LiveValidation('shipping_address_firstname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('shipping_address_lastname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('shipping_address_street_address').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
//		new LiveValidation('shipping_address_country_id').add( Validate.Presence, {
//			validMessage: "",
//			failureMessage: "e` richiesto"
//		} ),
		new LiveValidation('shipping_address_postcode').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('shipping_address_municipality').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ),
		new LiveValidation('shipping_address_telephone').add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} ).add( Validate.Format, {
				pattern: /^\d+$/,
				validMessage: "",
				failureMessage: "non e` un numero"
			} )
		];
	
		var shipping_state_district = [
		new LiveValidation('shipping_address_district_id', {
			onlyOnSubmit: true
		}).add( Validate.Presence, {
			validMessage: "",
			failureMessage: "e` richiesto"
		} )//,
		//	new LiveValidation('shipping_address_state', {
		//		onlyOnSubmit: true
		//	}).add( Validate.Presence, {
		//		validMessage: "",
		//		failureMessage: "e` richiesto"
		//	} )
		];

		var login;
		if (!(Element.hasClassName($('to_shipping'), 'logged_in'))) {
			login = new LiveValidation('user_login', {
				onlyOnSubmit: true
			})

			var password = new LiveValidation('user_password', {
				onlyOnSubmit: true
			});
			password.add( Validate.Presence, {
				validMessage: "",
				failureMessage: "e` richiesto"
			} );
			password.add( Validate.Length, {
				minimum: 6,
				validMessage: "",
				tooShortMessage: "usa almeno 6 caratteri"
			} );
			var password_confirmation = new LiveValidation('user_password_confirmation', {
				onlyOnSubmit: true
			});
			password_confirmation.add( Validate.Confirmation, {
				match: 'user_password',
				validMessage: "",
				failureMessage: "password e conferma non sono uguali"
			} );
			billing_user_registration_validations = [login, password, password_confirmation];
		}

		company = new LiveValidation('billing_address_company', {
			onlyOnSubmit: true
		});
		company.add( Validate.Presence, {
			failureMessage: "e` richiesto"
		});
		
		vat_number = new LiveValidation('billing_address_vat_number', {
			onlyOnSubmit: true
		})
		vat_number.add( Validate.Presence, {
			failureMessage: "e` richiesto"
		});
		tax_id_number = new LiveValidation('billing_address_tax_id_number', {
			onlyOnSubmit: true
		})
		tax_id_number.add( Validate.Presence, {
			failureMessage: "e` richiesto"
		});

		billing_company_validations = [company, vat_number, tax_id_number];
	}
}
catch(err) {
	exceptionNotify(err);
}
// END definitions

// Auxiliary methods for accordion event handlers (see accordion.js)

function populateBillingPreview()
{
	var container = $("billing_preview");
	//    Effect.BlindUp("billing_preview", {queue: 'front', duration: 1});
	//    Effect.BlindDown("billing_preview", {queue: 'end'});
	Element.show($("billing_preview"));
	container.update();
    
	Element.insert(container, "<div id='b-full_name'>" + $('billing_address_lastname').value + " " + $('billing_address_firstname').value + "</div>");
	if ($('billing_address_company').value != 'se desideri fattura') Element.insert(container, "<div id='b-company'>" + $('billing_address_company').value + "</div>");
	Element.insert(container, "<div id='b-street_address'>" + $('billing_address_street_address').value + "</div>");
	Element.insert(container, "<div id='b-postcode_municipality'>" + $('billing_address_postcode').value + " ");
	Element.insert(container, $("billing_address_municipality").value + "</div>");
	var sel = $('billing_address_district_id');
	Element.insert(container, "<div id='b-district'>" + sel.options[sel.selectedIndex].text + "</div>");
//	sel = $('billing_address_country_id');
	Element.insert(container, "<div id='b-country'>Italia</div>");
	Element.insert(container, "<div id='b-phone'>" + $('billing_address_telephone').value + "</div>");
	if ($('billing_address_vat_number').value != 'se desideri fattura') Element.insert(container, "<div id='b-vat_number'>" + $('billing_address_vat_number').value + "</div>");
	if ($('billing_address_tax_id_number').value != 'se desideri fattura') Element.insert(container, "<div id='b-tax_id'>" + $('billing_address_tax_id_number').value + "</div>");
}
    
function populateShippingPreview()
{
	var container = $("shipping_preview");
	//    Effect.BlindUp("shipping_preview", {queue: 'front', duration: 1});
	//    Effect.BlindDown("shipping_preview", {queue: 'end'});
	Element.show($("shipping_preview"));
	container.update();
    
	Element.insert(container, "<div id='s-full_name'>" + $('shipping_address_lastname').value + " " + $('shipping_address_firstname').value + "</div>");
	Element.insert(container, "<div id='s-street_address'>" + $('shipping_address_street_address').value + "</div>");
	Element.insert(container, "<div id='s-postcode_municipality'>" + $('shipping_address_postcode').value + " ");
	Element.insert(container, $("shipping_address_municipality").value + "</div>");
	var sel = $('shipping_address_district_id');
	Element.insert(container, "<div id='s-district'>" + sel.options[sel.selectedIndex].text + "</div>");
//	sel = $('shipping_address_country_id');
	Element.insert(container, "<div id='s-country'>Italia</div>");
	Element.insert(container, "<div id='s-phone'>" + $('shipping_address_telephone').value + "</div>");
}

function populateShippingMethod(s_value)
{
	//    $("shipping_type").update(s_value);
	//    Effect.BlindDown("shipping_type");
	Element.show($("shipping_type"));
}
    
function populatePaymentMethod(p_value)
{
	//	Effect.BlindUp("payment_type", {
	//		queue: 'end',
	//		duration: 1
	//	});
	$("payment_type").update(p_value);
	Element.show($("payment_type"));
//    Effect.BlindDown("payment_type", {queue: 'end'});
}

function reloadCart() {
	new Ajax.Request("/checkout/reload_cart", {
		method: 'get'
	});
}

function loadAccordion() {
	try {
		if ($('steps')) {
			Element.show($("to_billing"));
			Element.show($("use_for_shipping_box"));
        
			horizontalAccordion = new accordion('steps', {
				resizeSpeed : 5,
				classNames : {
					toggle : 'header',
					toggleActive : 'header_active',
					content : 'content'
				},
				direction : 'vertical'
			});
    
			var horizontalAccordions = $$('.header');
			horizontalAccordions.each(function(accordion) {
				$(accordion.next(0)).setStyle({
					height: '0px'
				});
			});

			//Trovo l'indice della tab attiva
			var idx = steps[document.location.hash.substring(1)];

			// se arrivo in GET con un'ancora diversa da '#intro' forzo lo step a
			// 'intro' appunto. (senno` potrei saltare gli step a piacimento)
			//if (idx > 0 && $$('#steps .activated').size() == 0) idx = 0;

			// Setto la prima tab come attiva
			Element.addClassName($$('#steps .content')[idx], 'activated');

			// la apro
			if (typeof idx == 'undefined') {
				horizontalAccordion.activate($$('#steps .buttons .next')[0]);
			}
			else {
				horizontalAccordion.activate($$('#steps .buttons .next')[idx]);
			}
			// end
        
			$$('#steps .buttons').each(function(button){
				button.show();
			});
        
			current_step = idx;
        
			stateOrDistrict();
        
			// #order_form non deve essere un LiveValidationForm!!
			email.formObj.destroy(true);
		}
	}
	catch(err) {
		exceptionNotify(err);
	}
}

function attachEventsToAccordionButtons(self) {
	try {
		var next_buttons = $$('#steps .buttons .next');
		next_buttons.each(function(button, index) {
        
			switch (Element.identify(button)) {
				case "to_billing":
					Event.observe(button, self.options.onEvent, self.toBilling.bind(self), false);
					break;
				case "to_shipping":
					Event.observe(button, self.options.onEvent, self.toShipping.bind(self), false);
					break;
				case "to_payment_method":
					Event.observe(button, self.options.onEvent, self.toPaymentMethod.bind(self), false);
					break;
			}
        
			if (self.options.onEvent == 'click') {
				button.onclick = function() {
					return false;
				};
			}

			if (self.options.direction == 'horizontal') {
				var options = {
					width: '0px'
				};
			} else {
				var options = {
					height: '0px'
				};
			}
			Object.extend(options, {
				display: 'none'
			});
			
			self.currentAccordion = $(button.up().up()).setStyle(options);
		}.bind(self));
    
		var prev_headers = $$('#steps .header');
		prev_headers.each(function(header, index) {
			Event.observe(header, self.options.onEvent, self.onlyBack.bind(self, $$('#steps .header')[index]), false);
        
			if (self.options.onEvent == 'click') {
				header.onclick = function() {
					return false;
				};
			}
		}.bind(self));
	}
	catch(err) {
		exceptionNotify(err);
	}
}

// checkbox che copia billing address in shipping address per checkout

function populateShippingForm(value) {
	if ($('use_for_shipping').checked) {
		$('shipping_address_lastname').value = $('billing_address_lastname').value;
		$('shipping_address_firstname').value = $('billing_address_firstname').value;
		$('shipping_address_street_address').value = $('billing_address_street_address').value;
		$('shipping_address_postcode').value = $('billing_address_postcode').value;
		$("shipping_address_municipality").value = $("billing_address_municipality").value;
//		if ($('billing_address_country_id').selectedIndex != 106) $('shipping_address_country_id').selectedIndex = $('billing_address_country_id').selectedIndex;
		$('shipping_address_telephone').value = $('billing_address_telephone').value;
		$('shipping_address_district_id').selectedIndex = $('billing_address_district_id').selectedIndex;
		if ($('billing_address_state').value != "") $('shipping_address_state').value = $('billing_address_state').value;
	}
	else {
		$('shipping_address_lastname').value = "";
		$('shipping_address_firstname').value = "";
		$('shipping_address_street_address').value = "";
		$('shipping_address_postcode').value = "";
		$("shipping_address_municipality").value = "";
//		$('shipping_address_country_id').selectedIndex = 106;
		$('shipping_address_telephone').value = "";
		$('shipping_address_district_id').selectedIndex = 0;
		$('shipping_address_state').value = "";
	}
}
