var LuckyNumbers = new Class(
{
	box: null,
	alreadyPulled: null,
	alreadyEnteredDetails: false,

	initialize: function(box) {
		this.box = box;
		//$('giveMeMyNumber').addEvent('click', this.giveMeNumber.bind(this));
		//$('detailsSubmit').addEvent('click', this.submitDetails.bind(this));
	},

	displayStatusMessage: function(msg, closeMsg) {
		//noMoreNumbers
		//alreadyTried
		//technicalError
		//luckyNumberEmpty
		//luckyNumberNaN
		//iHaveWon
		var el = new Element('div');
		el.set('html', msg);
		this.box.setContent(el, closeMsg);
	},

	giveMeNumber: function() {
		if (this.alreadyPulled == -1) return;
		
		if (this.alreadyPulled) { // use data from cache
			this.luckyNumberReply(this.alreadyPulled)
		} else {
			// avoid user from clicking too fast causing multiple requests
			this.alreadyPulled = -1;

			// get lucky number from webservice
			new Request.JSON({
				method: 'post',
				url: nf.baseUrl + 'win/getluckynumber',
				onSuccess: this.luckyNumberReply.bind(this),
				onFailure: this.luckyNumberFailure.bind(this),
				noCache: true
			}).send();
		}
	},

	luckyNumberFailure: function(result)
	{
		alert(_("An error occured. Please try again."));
	},

	luckyNumberReply: function(result) {

		this.alreadyPulled = result;

		switch(result.status) {
			case 'webHeresYourLuckyNumber':
				this.gotLuckyNumber(result.luckyNumber, _('webHeresYourLuckyNumberClose'));
				break;

			case 'webAlreadyDrew':
			case 'webNoMoreNumbers':
				this.box.fadeIn('loading');
				this.displayStatusMessage(_(result.status), _('webClose'));
				break;

			default:
				this.box.fadeIn('loading');
				this.displayStatusMessage(_('webUnknownError'), _('webClose'));
				break;
		}
	},

	gotLuckyNumber: function(luckyNumber) {
		this.gotLuckyNumberBlackBoxClose(luckyNumber);
		//this.box.nextCloseFunc = this.gotLuckyNumberBlackBoxClose.bind(this,luckyNumber);
		//this.displayStatusMessage(_('webHeresYourLuckyNumber').substitute({'yourNumber':luckyNumber}), _('webClose'));
	},

	// animate inserting the number into the input-field
	gotLuckyNumberBlackBoxClose: function(luckyNumber) {
		$('myNumber').set('value', "");
		$('myNumberFadeIn').fade('hide');
		$('myNumberFadeIn').setStyle('display', 'block');
		$('myNumberFadeIn').set("html", "<div>"+luckyNumber+"</div>");
		$('myNumber').setStyle('color', 'white');
		$('myNumber').set('value', luckyNumber);
		var fx = new Fx.Morph($('myNumberFadeIn'), {
			complete: function() {
				$('myNumber').setStyle('color', 'black');
				$('myNumberFadeIn').setStyle('display', 'none');
			}.bind(this,luckyNumber),
			duration: 'long'
		});

		fx.start({
			width: [366,133],
			left: [-100,10],
			top: [-25,-6],
			opacity: [0,1],
			fontSize: [60,18],
			color: ['red','black']
		});
	},

	haveIWon: function() {

		if (!$('myNumber').get('value') || $('myNumber').get('value').length < 1 || (this.alreadyPulled && !this.alreadyPulled.luckyNumber))  {
			this.box.fadeIn();
			return this.displayStatusMessage(_('webNoNumberPulled'), _('webClose'));
		}

		if (this.alreadyEnteredDetails) {
			this.box.fadeIn();
			return this.displayStatusMessage(_('webAlreadyDrew'), _('webClose'));
		}

		this.box.fadeIn(null, 'showForm');
		switch(this.alreadyPulled.hasWon) {
			case 'true':
				this.displayStatusMessage(_('webYouHaveWon'));
				break;

			case 'false':
				this.displayStatusMessage(_('webYouHaveNotWon'));
				break;
		}
	},

	/**
	 * User has entered data into the form and has clicked submit
	 */
	submitDetails: function() {
		var phone = $('detailsPhone').value;
		var email = $('detailsEmail').value;

		if (email.length > 0 && new RegExp(".+@.+\\..+").test(email) == false) {
			alert(_('Invalid e-mail address'));
			return false;
		}
		if (phone.length > 0 && (phone.length != 8 || new RegExp("^\\d+$").test(phone) == false)) {
			alert(_('Invalid phone number'));
			return false;
		}
		if (email.length == 0 && phone.length == 0) {
			alert(_("You must supply either your e-mail address or your phone number"));
			return false;
		}
		new Request.JSON({
			method: 'post',
			url: nf.baseUrl + 'win/acceptluckynumber',
			onSuccess: this.submitDetailsReply.bind(this),
			data: {
				phone: phone,
				email: email
			}
		}).send();
		// change the box to loading
		this.box.setContentLoading();
	},

	submitDetailsReply: function(reply) {
		this.alreadyEnteredDetails = true;
		this.displayStatusMessage(_(reply.status), _('webClose'));
	}
});