// checkout_validations.js
// Questo file contiene:
// - dichiarazione variabile accordion (accordion)
// - dichiarazione step del checkout (steps)
// - Inizializzazione tramite observer dell'accordion vero e proprio
// - definizione delle validazioni per tutti i campi presenti nel checkout
//   (CheckoutValidations)
// - funzioni di aggiornamento della preview sulla destra (Fillers)
// - 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)
//

// inizializzazione variabili globali per checkout

var accordion;      // THE accordion (global)
var steps;
// var global declarations:

var CheckoutValidations = {};
var Clickables = {};
var Fillers = {};

//var billing_validations;
//var email;
//var billing_state_district;
//var company;
//var vat_number;
//var tax_id_number;
//var billing_company_validations;
//var shipping_validations;
//var shipping_state_district;
//
//var headers;
//var buttons;

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

function loadAccordion() {
	try {
		if ($("steps")) {
			$('to_billing').disable();
			//			Element.show($("accordion_loader"));
			
			Element.show($("use_for_shipping"));
			CheckoutValidations.createPrivacyValidation('privacy_accepted');
			CheckoutValidations.createLoginValidations();
			accordion = new Accordion('steps', steps, {});

			//			Element.hide($("accordion_loader"));
			$('to_billing').enable();
		}
	}
	catch(err) {
		exceptionNotify(err);
		return false;
	}
}

//document.observe('dom:loaded', );

Element.observe(window, "load", function() {

	if ($("order_form")) {

		// Namespace che racchiude i DOM cliccabili dell'accordion del checkout
		//		Clickables = {
		Clickables.headers = $$('#steps .header');
		Clickables.buttons = $$('#steps .buttons .next');
		//		};

		// Namespace che contiene le istanze di LiveValidation per i form del
		// checkout.
		// Le prime due proprieta` sono funzioni che creano o meno istanze di
		// LiveValidation a seconda dello stato server-side
		// ( ad esempio: Element.hasClassName($('to_shipping'), 'logged_in') )
		//		CheckoutValidations = {

		CheckoutValidations.createLoginValidations = function() {
			try {
				if (!(Element.hasClassName($('to_shipping'), 'logged_in'))) {
					var password = new LiveValidation('user_password', {
						onlyOnSubmit: true
					});
					password.add( Validate.Presence, {
						validMessage: "",
						failureMessage: mandatory
					} );
					password.add( Validate.Length, {
						minimum: 6,
						validMessage: "",
						tooShortMessage: use_at_least_6
					} );
					var password_confirmation = new LiveValidation('user_password_confirmation', {
						onlyOnSubmit: true
					});
					password_confirmation.add( Validate.Confirmation, {
						match: 'user_password',
						validMessage: "",
						failureMessage: password_not_equal
					} );
					CheckoutValidations.billing_user_registration_validations = [password, password_confirmation];
					return true;
				}
				return false;
			}
			catch(err) {
				exceptionNotify(err);
				return false;
			}
		};

		//		CheckoutValidations.getLogin = function() {
		//			return CheckoutValidations.billing_user_registration_validations[0];
		//		};

		CheckoutValidations.createPrivacyValidation = function(dom_id) {
			try {
				if ($(dom_id)) {
					this.privacy = new LiveValidation(dom_id, {
						onlyOnSubmit: true
					});
					this.privacy.add( Validate.Acceptance, {
						validMessage: "",
						failureMessage: mandatory
					} );
					return true;
				}
				return false;
			}
			catch(err) {
				exceptionNotify(err);
				return false;
			}
		};

		CheckoutValidations.checkBillingData = function() {
			var aux = ($('billing_address_company').value != "");
			aux = aux || ($('billing_address_vat_number').value != "");
			return aux;

		};

		CheckoutValidations.email = new LiveValidation('user_email').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ).add( Validate.Email, {
			validMessage: "",
			failureMessage: not_an_email
		} );

		//		CheckoutValidations.getEmail = function() {
		//			return CheckoutValidations.email;
		//		};

		CheckoutValidations.billing_validations = [
		new LiveValidation('billing_address_firstname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('billing_address_lastname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('billing_address_street_address').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('billing_address_country_id').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('billing_address_postcode').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('billing_address_municipality').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		CheckoutValidations.email
		];

		CheckoutValidations.billing_state_district = [
		new LiveValidation('billing_address_district_id').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} )
		];
		
		CheckoutValidations.company = new LiveValidation('billing_address_company', {
			onlyOnSubmit: true
		}).add( Validate.Presence, {
			failureMessage: mandatory
		})

		CheckoutValidations.vat_number = new LiveValidation('billing_address_vat_number', {
			onlyOnSubmit: true
		}).add( Validate.Presence, {
			failureMessage: mandatory
		});

		CheckoutValidations.tax_id_number = new LiveValidation('billing_address_tax_id_number', {
			onlyOnSubmit: true
		}).add( Validate.Presence, {
			failureMessage: mandatory
		});

		CheckoutValidations.billing_company_validations = [CheckoutValidations.company, CheckoutValidations.vat_number, CheckoutValidations.tax_id_number];

		CheckoutValidations.shipping_validations = [
		new LiveValidation('shipping_address_firstname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('shipping_address_lastname').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('shipping_address_street_address').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('shipping_address_country_id').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('shipping_address_postcode').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} ),
		new LiveValidation('shipping_address_municipality').add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} )
		];

		CheckoutValidations.shipping_state_district = [
		new LiveValidation('shipping_address_district_id', {
			onlyOnSubmit: true
		}).add( Validate.Presence, {
			validMessage: "",
			failureMessage: mandatory
		} )
		];
		//		};
		// END definitions

		// Questo namespace racchiude tutte le funzioni preposte al riempimento della
		// preview laterale dell'ordine.

		//		Fillers = {

		Fillers.fillBillingPreview = function() {
			var container = $("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 country = $('billing_address_country_id');			
			var dist_state = $('billing_address_district_id');
			if (dist_state && country.selectedIndex == 106) {
				Element.insert(container, "<div id='b-district'>" + dist_state.options[dist_state.selectedIndex].text + "</div>");
			}
			else {
				Element.insert(container, "<div id='b-state'>" + $('billing_address_state').value + "</div>");
			}
			Element.insert(container, "<div id='b-country'>" + country.options[country.selectedIndex].text + "</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>");

			Element.show($("billing_preview"));
		};

		Fillers.fillShippingPreview = function() {
			var container = $("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 country = $('shipping_address_country_id');
			var dist_state = $('shipping_address_district_id');
			if (dist_state && country.selectedIndex == 106) {
				Element.insert(container, "<div id='s-district'>" + dist_state.options[dist_state.selectedIndex].text + "</div>");
			}
			else {
				Element.insert(container, "<div id='s-state'>" + $('shipping_address_state').value + "</div>");
			}
			Element.insert(container, "<div id='s-country'>" + country.options[country.selectedIndex].text + "</div>");
			Element.insert(container, "<div id='s-phone'>" + $('shipping_address_telephone').value + "</div>");

			Element.show($("shipping_preview"));
		};

		Fillers.fillShippingMethod = function(s_value) {
			$("shipping_type").update(s_value);
			Element.show($("shipping_type"));
		};

		Fillers.fillPaymentMethod = function(p_value) {
			$("payment_type").update(p_value);
			Element.show($("payment_type"));
		};

		// checkbox che copia billing address in shipping address per checkout
		Fillers.fillShippingForm = function(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 = "";
			}
		};
		//		};


		steps = new Hash({
			'billing' :		new Step('billing', 1, Step.shipping, Clickables.buttons[0], Clickables.headers[0]),
			'shipping' :	new Step('shipping', 2, Step.payment_method, Clickables.buttons[1], Clickables.headers[1]),
			'payment' :		new Step('payment', 3),
			'review' :		new Step('review', 4)
		});

		loadAccordion();
	}
}, false);
	