window.addEvent('domready', function() {
	var link = $E('a.signup');
	if (link) {
		link.addEvent('click', function(e) {
			$E('.intro').addClass('hidden');
			$E('.signup-form').removeClass('hidden');
		});
	}
});

var SignupForm = new Class({
	options: {
		'form': false,
		'validate': 'multiple',
		'redirect': '/u/fase1/amici'
	},

	initialize: function(options) {
		this.setOptions(options);

		if (!this.options.form) {
			return false;
		}

		this.form = $(this.options.form);
		this.error = $ES('div.error-msg p', this.form);
		this.progress = $ES('div.progress-submit', this.form);
		this.submit = $ES('div.submit input[type=submit]', this.form);

		this.submit.addEvent('click', function(e) {
			new Event(e).stop();
			this.form.send({'onComplete': this.onComplete.bind(this)});
			this.progress.removeClass('hidden');
		}.bind(this));

		$E('div.submit a.back').addEvent('click', function(e) {
			if (e) new Event(e).stop();

			$E('div.signup-form').removeClass('hidden');
			$E('div.signup-form2').addClass('hidden');
		});
	},

	clearErrors: function() {
		if (this.options.validate == 'multiple') {
			$ES('div.input', this.form).each(function(el) {
				Form.removeError(el);
			});
		} else {
			$ES('div.input', this.form).removeClass('error');
			this.error.addClass('hidden');
		}
	},

	onComplete: function(resp) {
		resp = Json.evaluate(resp);

		this.progress.addClass('hidden');
		this.clearErrors();

		if (resp.status == 'error') {
			var message = false;
			for (field in resp.errors) {
				if (this.options.validate == 'single') {
					if (!message) {
						this.error.setText(resp.errors[field]).removeClass('hidden');
						break;
					}
					$E('div.' + field).addClass('error');
				} else {
					Form.error($E('div.' + field), resp.errors[field]);
				}
			}

			if ($E('div.signup-form2').hasClass('hidden')) {
				var hash = new Hash(resp.errors);

				['name', 'email', 'password1'].each(function(field) {
					hash.remove(field);
				});

				if (hash.length == 0) {
					$E('div.signup-form').addClass('hidden');
					$E('div.signup-form2').removeClass('hidden');
					this.clearErrors();
				}
			}
		}

		if (resp.status == 'ok') {
			window.location = this.options.redirect;
		}
	}
});

SignupForm.implement(new Options);