(function($){	
	$.fn.formValidate = function(params)
	{
		var params = $.extend({
			ajaxAction : '/default/index/index',
			loader : true,
			loaderReference : '.submit',
			loaderImage : '/medias/images/content/ajax-loader.gif',
			replacement : false,
			replaceTxt : '<p>some text ...</p>',
			displayErrors : false,
			errorPosition : 'top',
			redirect : false,
			redirectUrl : '/default/index/index'
		}, params);
		
		$(this).submit(function(e)
		{
			e.preventDefault();
			
			// form id selector as reference
			var id = '#' + $(this).attr('id');
			
			// retrieve form data
			var data = $(this).serialize();
			var url = params.ajaxAction;
			
			if(params.loader === true)
			{
				loader($(params.loaderReference, this), params.loaderImage);
			}
			
			$.ajax({
				url: url,
			    data: data,
			    type: 'post',
			    dataType: 'json',
			    error: function(msg){
			    	
			    },
			    success: function(data){
			    	$('.loader').remove();
			    	$('.error').removeClass('error');
			    	
			    	var response = $.parseJSON(data.response);
												    	
			    	if(response === true)
			    	{
			    		$('input:not(:submit), textarea', id).val('');
			    		
			    		if(params.replacement === true)
			    		{
							$(id).replaceWith(params.replaceTxt);
			    		}
			    		
			    		if(data.confirm)
						{
							var confirm = $('<div class="confirmContainer"><p>' + data.confirm + '</p></div>').css({
								fontSize : 10,
								left : ($(id).offset().left),
								position:  'absolute',
								width : $(id).width(),
								zIndex : 99
							}).click(function(){
								$(this).remove();
							});
							
							$(id).after(confirm);
							$('.confirmContainer').css({
								top : ($(id).offset().top - $('.confirmContainer').outerHeight()) - 5
							});
						}
			    		
			    		if(params.redirect === true)
			    		{
			    			window.location.href = params.redirectUrl;
			    		}
			    	}
			    	else
			    	{
			    		$.each(response, function(field){
			    			$('input[name="' + field + '"], textarea[name="' + field + '"]', id).addClass('error');
			    		});
						
						if(params.displayErrors === true)
						{
							buildErrors(response, $(id), params.errorPosition);
						}
			    	}
			    }
			});
		});
	};
	
	function loader(reference, image)
	{
		var loader = $('<div class="loader"></div>').css({
			backgroundImage : 'url("' + image + '")',
			backgroundPosition : 'center',
			backgroundRepeat : 'no-repeat',
			height : 16,
			left : (reference.offset().left + reference.width()) + 5,
			position : 'absolute',
			top : reference.offset().top,
			width : 16
		});
		
		reference.after(loader);
	};
	
	function buildErrors(response, form, pos)
	{
		if($('.errorContainer').length > 0)
		{
			$('.errorContainer').remove();
		}
		
		var container = $('<div class="errorContainer"></div>').css({
			left : (form.offset().left),
			position:  'absolute',
			width : form.width(),
			zIndex : 99
		}).click(function(){
			$(this).remove();
		});
		
		var errorList = $('<ul></ul>').appendTo(container);
		
		$.each(response, function(field){
			for(key in response[field]) break;
			
			$('<li>' + response[field][key] + '</li>').appendTo(errorList);
		});
		
		form.after(container);
		
		var position = (pos == 'top') ? (form.offset().top - $('.errorContainer').outerHeight()) - 5 : (form.offset().top + form.height()) + 5;
		$('.errorContainer').css({top : position});
	}
	
})(jQuery);
