var FormHandler = new Class({
															
	initialize: function(form, errors) {
		this.form = $(form);
		this.errors = errors;
		
		this.cleanup();
	},
	
	cleanup: function() {
		this.form.getElements('.form-error').each(function(elem) {
			elem.removeClass('form-error');
			elem.getElement('div.error').dispose();
		});
	},
	
	showErrors: function() {
		for (field in this.errors) {
			var elem = $('field-' + field);
			if (!elem) continue;
			
			elem
				.addClass('form-error')
				.adopt(new Element('div').addClass('error').set('html', this.errors[field]));
		}
	}
	
});

var AjaxSubmit = new Class({
	
	Extends: Options,
	options: {
		url: '',
		button: null,
		onSuccess: null,
		onFailure: null
	},
	
	initialize: function(form, options) {
		this.form = $(form);
		this.setOptions(options);
		this.in_progress = false;
	},
	
	send: function() {
		if (this.in_progress) return;
		
		this.options.button.val = this.options.button.value;
		this.options.button.value = 'please wait...';
		this.options.button.disabled = true;
		
		this.form
			.set('send', {
				method: 'post',
				url: this.options.url,
				onComplete: this.onComplete.bind(this)
			})
			.send();
			
		this.in_progress = true;
	},
	
	onComplete: function(response) {
		this.in_progress = false;
		
		this.options.button.value = this.options.button.val;
		this.options.button.disabled = false;
		
		response = JSON.decode(response);
		var fh = new FormHandler(this.form, response.errors);
		if (response.status == 'failed') {
			fh.showErrors();
			if (this.options.onFailure)
				this.options.onFailure(response);
		}
		else {
			if (this.options.onSuccess)
				this.options.onSuccess(response);
		}
	}
	
});

function preload() {
	var k = document.images.length;
	for (var i = 0; i < arguments.length; i++) {
		var img = new Image();
		img.src = arguments[i];
		document.images[k + i] = img;
	}
}

function leveledHeight(selector) {
	var maxHeight = 0;
	$$(selector).each(function(elem) {
		if (maxHeight < elem.getSize().y)
			maxHeight = elem.getSize().y;
	});
	$$(selector).setStyle('height', maxHeight);
}

function ajaxLoading(id) {
	if ($(id) != null)
		$(id).set('html', '<img src="images/ajax-loader.gif" alt="loading...">');
}
