Hedera.Checkout = new Class({
	Extends: Hedera.Form,

	activate: function() {
		this.autoStepLocked = true;
		this.$('assistant').stepsIndex = this.agencySteps;

		this.today = new Date();
		this.today.setHours(0, 0, 0, 0);
	},

	onValuesReady: function() {
		var orderForm = this.$('order-form');
		var defaultsForm = this.$('defaults');

		if (!(orderForm.ready && defaultsForm.ready))
			return;

		var date;

		if (orderForm.numRows > 0) {
			var i = orderForm;
			date = i.get('sent');
		} else
			var i = defaultsForm;
		
		if (!date || date.getTime() < (new Date()).getTime()) {
			date = new Date();
			date.setHours(0, 0, 0, 0);

			var addDays = 0;

			switch(date.getDay()) {
				case 6: // Saturday
					addDays += 2;
					break;
				case 0: // Sunday
					addDays++;
					break;
			}

			if (i.get('deliveryMethod') != 'PICKUP')
				addDays++;

			date.setDate(date.getDate() + addDays);
		}
		
		this.$('date').value = date;
		this.$('method').value = i.get('deliveryMethod');
		this.$('agency').value = i.get('agencyModeFk');
		this.$('address').value = i.get('addressFk');

		this.autoStepLocked = false;
	},
	
	disableButtons: function(disable) {
		this.$('assistant-bar').disabled = disable;
	},

	onConfirmClick: function() {
		this.disableButtons(true);
	
		var query = 'CALL myBasket_configure(#date, #method, #agency, #address)';
	
		var batch = new Sql.Batch();
		batch.addParam('method', this.$('method'));
		batch.addParam('date', this.$('date'));
		batch.addParam('agency', this.$('agency'));
		batch.addParam('address', this.$('address'));
	
		this.conn.execQuery(query,
			this.onBasketConfigured.bind(this), batch);
	},

	onBasketConfigured: function(resultSet) {
		this.disableButtons(false);

		if (!resultSet.fetchResult())
			return;
	
		if (this.$('order-form').numRows > 0)
			Htk.Toast.showMessage(_('OrderUpdated'));
		else
			Htk.Toast.showMessage(_('OrderStarted'));

		this.hash.set({form: 'ecomerce/catalog'});
	},

	onCancelClick: function() {
		if (this.$('order-form').numRows > 0)
			window.history.back();
		else
			this.hash.set({form: 'ecomerce/orders'});
	},
	
	agencySteps: ['method', 'date', 'address', 'agency', 'confirm-delivery'],
	pickupSteps: ['method', 'date', 'address', 'pickup', 'confirm-pickup'],

	isDelivery: function() {
		return this.$('rg-method').value != 'PICKUP';
	},

	onMethodChange: function() {
		this.$('assistant').stepsIndex = this.isDelivery() ?
			this.agencySteps : this.pickupSteps;
		this.onFieldChange();
	},

	methodValidate: function() {
		if (!this.$('rg-method').isSelected())
			throw new Error(_('Please select an option'));
	},

	dateShow: function() {
		Vn.Node.setText(this.$('date-question'), this.isDelivery() ?
			_('OrderDateDeliveryQuestion'):
			_('OrderDatePickupQuestion'));
		this.$('calendar').goToSelectedMonth();
	},

	dateValidate: function() {
		if (!this.$('calendar').value)
			throw new Error(_('Please select a date'));
	},

	addressShow: function() {
		Vn.Node.setText(this.$('address-question'), this.isDelivery() ?
			_('AddressQuestion'):
			_('AddressQuestionPickup'));
	},

	addressValidate: function() {
		if (this.$('address-form').row == -1)
			throw new Error(_('Please select an address'));
	},

	agencyShow: function() {
		this.$('agencies').refresh();
	},

	agencyValidate: function() {
		if (this.$('agency-combo').row == -1 && this.isDelivery())
			throw new Error(_('Please select an agency'));
	},

	pickupShow: function() {
		this.$('warehouses').refresh();
	},

	pickupValidate: function() {
		if (this.$('warehouse-combo').row == -1)
			throw new Error(_('Please select a store'));
	},
	
	onFieldChange: function() {
		if (!this.autoStepLocked)
			this.$('assistant').moveNext();
	},
	
	goNextStep: function() {
		this.$('assistant').moveNext();
	},
	
	addressRenderer: function(builder, form) {
		builder.$('address').addEventListener('click',
			this.onAddressClick.bind(this, form.get('id')));
	},
	
	onAddressClick: function(addressId) {
		this.$('address').value = addressId;
		this.goNextStep();
	},
	
	onAddressChange: function() {
		if (this.selectedNode)
			Vn.Node.removeClass(this.selectedNode, 'selected');

		var row = this.$('addresses').search('id', this.$('address').value);

		if (row != -1) {
			var builder = this.$('repeater').getBuilder(row);
		
			this.selectedNode = builder.$('address');
			Vn.Node.addClass(this.selectedNode, 'selected');
		}

		this.$('address-form').row = row;
	},
	
	onAgenciesReady: function(model) {
		if (!model.ready) return;

		if (model.numRows > 0) {
			var agency;
			var defaults = [
				this.$('order-form').get('agencyModeFk'),
				this.$('defaults').get('agencyModeFk'),
				this.$('defaults').get('defaultAgencyFk')
			];

			for (var i = 0; i < defaults.length; i++) {
				agency = defaults[i];
				if (model.search('id', agency) !== -1)
					break;
			}

			this.autoStepLocked = true;
			this.$('agency').value = agency;
			this.autoStepLocked = false;
		} else
			Htk.Toast.showError(_('NoAgeciesAvailableForDate'));
	},
	
	onWarehousesReady: function(model) {
		if (model.ready && model.numRows == 0)
			Htk.Toast.showError(_('NoWarehousesAvailableForDate'));
	},
	
	calendarRestrict: function(date) {
		return date.getTime() >= this.today.getTime();
	}
});