(function($) {

$.fn.submitForm = function(returnFunc,isHideSuccess){
	subFunc = function(){
		var self = this;
		var config = new Object();
		config.data = $(self).getFormParams();
		config.complete = function(data, ok){
			$(self).formComplete(data.responseText, ok=='success', returnFunc, isHideSuccess);
		};
		config.type = this.method.toUpperCase();
		config.url = this.action;
		
		$(this).prepareToSend();
		
		$.ajax(config);
	}
	this.each(subFunc);
	return false;
};

$.fn.showFormOverlay = function(){

	var overlay = this.find('.form_overlay');
	if(!overlay.length){
		var divEl = document.createElement('div');
		this.prepend(divEl);
		overlay = $(divEl);
		overlay.addClass('form_overlay');
	
		var html = '<table cellpadding="0" cellspacing="0" border="0">';
		html += '<tr><td>';
		html += '<div class="form_loader">Envoi des donn&eacute;es en cours...</div>';
		html += '</td></tr>';
		html += '</table>';
		
		overlay.hide();
		overlay.html(html);
		
		this.css('position', 'relative');
	}
	overlay.css('width', this.width());
	overlay.css('height', this.height());
	
	overlay.fadeIn('slow');
	
};

$.fn.getFormParams = function(){
	var params = new Object();
	autoCheckName = function(name){
		if(!params[name]){
			params[name] = new Array();
		}
	}
	getInput = function(){
		if(this.name){
			autoCheckName(this.name);
			switch(this.type.toLowerCase()){
				case 'text' :
				case 'hidden' :
				case 'password' :
					params[this.name].push(this.value);
					break;
				case 'checkbox' :
				case 'radio' :
					if(this.checked){
						params[this.name].push(this.value ? this.value : 1);
					}
					break;
			}
		}
	}
	getOptions = function(){
		if(this.parentNode.name){
			autoCheckName(this.parentNode.name);
			params[this.parentNode.name].push(this.value ? this.value : $(this).html())
		}
	}
	getTextarea = function(){
		if(this.name){
			autoCheckName(this.name);
			params[this.name].push($(this).val());
		}
	}
	this.find('input').each(getInput);
	this.find('select option:selected').each(getOptions);
	this.find('textarea').each(getTextarea);
	return params;
};

$.fn.formComplete = function(data, ok, returnFunc, isHideSuccess){
	var self = this;
	subFunc = function(){
		if(ok){
			self.formSuccess(data, returnFunc, isHideSuccess);
		}
		else{
			self.formError(data);
		}
	}
	this.endOfSend(subFunc);
};

$.fn.prepareToSend = function(){
	if(!this.parent().hasClass('form_contener')){
		var divContener = document.createElement('div');
		this.wrap(divContener);
		this.parent().addClass('form_contener');
	}
	this.showFormOverlay();
	this.parent().find('.form_error').hide('slow');
	this.parent().find('.form_success').hide('slow');
};

$.fn.endOfSend = function(){
	this.find('.form_overlay').fadeOut('slow', subFunc);
};
		
$.fn.formSuccess = function(data, returnFunc, isHideSuccess){
	var div = this.parent().find('.form_success');
	if(!div.length){
		var divEl = document.createElement('div');
		this.parent().prepend(divEl);
		div = $(divEl);
		div.addClass('form_success');
	}
	var arr = data.split('\n');
	if(arr.length && arr[0].match('^done.')){
		var done = arr.shift();
		if(arr[0]){
			div.html(arr.join('<br/>'));
		}
		else{
			div.html('Les donn&eacute;es ont &eacute;t&eacute; envoy&eacute;es avec succ&egrave;s.');
		}
		if(isHideSuccess == false){
			div.show('slow');
		}
		
		if(returnFunc){
			var obj = new Object();
			arr = done.split('|');
			for(var i=0; i<arr.length; i++){
				var tmp = arr[i].split('=');
				if(tmp.length==2){
					obj[tmp[0]] = tmp[1];
				}
			}
			eval(returnFunc+'(obj);');
		}
		
	}
	else{
		this.formError(data);
	}
};

$.fn.formError = function(data){
	var div = this.find('.form_error');
	if(!div.length){
		var divEl = document.createElement('div');
		this.prepend(divEl);
		div = $(divEl);
		div.addClass('form_error');
	}
	var arr = data.split('\n');
	if(arr[0]){
		div.html(arr.join('<br/>'));
	}
	else{
		div.html('Une erreur s\'est produite : les donn&eacute;es n\'ont pas &eacute;t&eacute; envoy&eacute;es.');
	}
	div.show('slow');
};

})(jQuery);