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

	,activate: function ()
	{
		this.autoStepLocked = true;

		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 ();

			if (i.get('deliveryMethod') != 'PICKUP')
				date.setTime (date.getTime () + 86400000);
		}
		
		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.$('confirm-agency').disabled = disable;
		this.$('confirm-delivery').disabled = disable;
		this.$('confirm-pickup').disabled = disable;
	}

	,onConfirmClick: function ()
	{
		this.disableButtons (true);
	
		var query = 'CALL basketConfigure (#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-agency']
	,pickupSteps: ['method', 'date', 'address', 'pickup', 'confirm-pickup']
	
	,stepFunc: function (stepIndex)
	{
		var isDelivery = this.$('rg-method').value == 'AGENCY';
		var steps = isDelivery ? this.agencySteps : this.pickupSteps;
		var stepId = steps[stepIndex];
		
		if (!stepId)
			return null;

		switch (stepId)
		{
			case 'date':
				Vn.Node.setText (this.$('date-question'), isDelivery ?
					_('OrderDateDeliveryQuestion'):
					_('OrderDatePickupQuestion'));
				this.$('calendar').goToSelectedMonth ();
				break;
			case 'address':
				Vn.Node.setText (this.$('address-question'), isDelivery ?
					_('AddressQuestion'):
					_('AddressQuestionPickup'));
				break;
			case 'agency':
				this.$('agencies').refresh ();
				break;
			case 'pickup':
				this.$('warehouses').refresh ();
				break;
		}
		
		return this.$(stepId +'-step');
	}
	
	,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 && model.numRows == 0)
			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 ();
	}
});

