String.prototype.capitalize = function() {
 return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
};

jQuery.fn.ajaxifyForm = function(param) {
	if (param == 'replace') {
		this.attr('rel','replace');
	}
	
	this.submit(function() {
		var error = false;
		var form = jQuery(this);
		
		form.find(':input').each(function(index,element) {
			var elementObj = jQuery(element);
			if (elementObj.attr('name').length == 0 || elementObj.attr('id').length == 0) return;
			
			var selector = '';
			if (elementObj.attr('type') == 'text') {
				selector = 'div.input.text';
			} else if (elementObj.attr('type') == 'textarea') {
				selector = 'div.input.textarea';
			}
			
			if (elementObj.val().length == 0 || elementObj.val() == elementObj.attr('alt')) {
				elementObj.closest(selector).addClass('error');
				error = true;
			} else {
				elementObj.closest(selector).removeClass('error');
			}
		});
		
		if (error == true) {
			return;
		}
		
		form.find(':submit').closest('.button').hide();
		form.find('.loader').show();
		
		jQuery.ajax({
			type: 'POST',
			url: form.attr('action'),
			data: form.serializeArray(),
			success: handleContactForm_callback,
			dataType: 'json',
			context: form
		});
	});
	
	return this.each(function(){});
};


function handleContactForm_callback(data,txt) {
	var form = $(this.context);
	if (data.errors == null) {
		if (form.attr('rel') == 'replace') {
			form.closest('div').replaceWith(form.siblings('.form-replacement').html());
		} else {
			form.closest('div').html(form.siblings('.form-replacement').html());
		}
		
		return;
	}
		
	form.find('.loader').hide();
	form.find(':submit').closest('.button').show();
	
	jQuery.each(data.errors,function(index,value) {
		var inputObj = form.find(":input[name='data[" + index + "]']");
		
		var selector = '';
		if (inputObj.attr('type') == 'text') {
			selector = 'div.input.text';
		} else if (inputObj.attr('type') == 'textarea') {
			selector = 'div.input.textarea';
		}
		
		inputObj.closest(selector).addClass('error');
	});
};