(function($) {
	/**
	 * Fonction to validate a form in ajax
	 * @param _urlSelector: jquery selector of hidden field with url to call
	 * @param _loader: img src of the loader
	 * @param _before: function to execute before the ajax call
	 * @param _success: function to execute on ajax success
	 * @param _complete: function to execute on ajax complete
	 * @param _error: function to call on ajax error
	 * @param _dataType: type of the data send in ajax
	 * @param _container: jquery selector of the container of the form element validated
	 * @param _onBlur: if true, add validation on the field blur
	 */
	jQuery.fn.zdgForm = function(options) {

		// default values
		var defaults = {
			_urlSelector: '#hUrl',
			_loader: '/img/ajax-loader.gif',
			_before: null,
			_success: null,
			_complete: null,
			_error: null,
			_dataType: 'json',
			_container: 'p',
			_onBlur: true
		};

		var settings = $.extend({}, defaults, options);

		return this.each(function() {
			jQuery.zdgForm.init($(this), settings);
		});
	};

	jQuery.zdgForm = {

		init : function(f, settings){
			// set vars
			jQuery.zdgForm.urlString = settings._urlSelector;
			jQuery.zdgForm.loaderString = settings._loader;
			jQuery.zdgForm.beforeFunction = settings._before;
			jQuery.zdgForm.successFunction = settings._success;
			jQuery.zdgForm.completeFunction = settings._complete;
			jQuery.zdgForm.errorFunction = settings._error;
			jQuery.zdgForm.dataTypeString = settings._dataType.toString();
			jQuery.zdgForm.containerString = settings._container.toString();
			jQuery.zdgForm.onBlurBool = settings._onBlur;

			url = f.find(jQuery.zdgForm.urlString).val();

			// call validation on blur
			if(jQuery.zdgForm.onBlurBool === true){
				f.find('input, textarea, select').not(':disabled').blur(function(){
					var fEleId = $(this).closest(jQuery.zdgForm.containerString).find('label').attr('for');
					jQuery.zdgForm.validate(f, fEleId, url);
				});
			}

			// call validation on submit
			f.submit(function(){
				jQuery.zdgForm.submit(f);
				return false;
			});
		},



		// post form elements value on submit
		submit : function(f){
			var url = f.attr('action');
			var data = {};
			f.find('input, textarea, select').not(':disabled').each(function(){
				data[$(this).attr('name')] = $(this).val();
			});
			var type = f.attr('method');

			if(typeof jQuery.zdgForm.beforeFunction === 'function'){
				jQuery.zdgForm.beforeFunction(f);
			}else{
				jQuery.zdgForm.before(f);
			}

			$.ajax({
				type: type,
				url: url,
				data: data,
				success: function(resp) {
					if(typeof jQuery.zdgForm.successFunction === 'function'){
						jQuery.zdgForm.successFunction(f, resp);
					}else{
						jQuery.zdgForm.success(f, resp);
					}
				},
				complete: function() {
					if(typeof jQuery.zdgForm.completeFunction === 'function'){
						jQuery.zdgForm.completeFunction(f);
					}else{
						jQuery.zdgForm.complete(f);
					}
				},
				error: function(resp) {
					if(typeof jQuery.zdgForm.errorFunction === 'function'){
						jQuery.zdgForm.errorFunction(f, resp);
					}else{
						jQuery.zdgForm.error(f, resp);
					}
				},
				dataType: jQuery.zdgForm.dataTypeString
			});
		},



		// post form elements value on blur
		validate : function(f, fEleId, url){

			var data = {};
			f.find('input, textarea, select').not(':disabled').each(function(){
				data[$(this).attr('name')] = $(this).val();
			});

			$.post(url, data, function(resp){
				$('#'+fEleId).closest(jQuery.zdgForm.containerString).find('.errors').remove();
				if(resp){
					$('#'+fEleId).parent().append(jQuery.zdgForm.getErrors(resp[fEleId], fEleId));
				}
			}, 'json');
		},




		// create a error message list
		getErrors : function(formErrors, id){
			var o = '<ul id="errors-'+id+'" class="errors">';
			for(errorKeys in formErrors){
				o+= '<li>'+ formErrors[errorKeys] +'</li>';
			}
			o+= '</ul>';
			return o;
		},

		// function called before the data is received
		before : function(f){
			f.find('.submit').prepend(jQuery.zdgForm.loader).find('button, a').hide();
		},

		// function called if call successful
		success : function(f, resp){
			f.find('.submit').find('button, a').show();
			f.find('.loader').remove();
			// if errors
			if(resp.success == false){
				if(resp.errorElements){
					f.find('.errors').remove();
					for(k in resp.errorElements){

						o = '\n<ul class="errors">\n';
						if(resp.errorElements[k] == '[object Object]'){
							for(x in resp.errorElements[k]){
								o += '<li><label for="'+ k + '">'+resp.errorElements[k][x]+ '</label></li>\n';
							}
						}else{
							o += '<li><label for="'+ k + '">'+resp.errorElements[k]+ '</label></li>\n';
						}
						o += '</ul>';

						f.find('#'+k).parent().append(o);
					}
				}else{
					f.prepend(resp.msg);
				}
			}else{
				f.html(resp.msg);
			}
		},

		// function called once called complete
		complete : function(f){
			ajax.init();
		},


		// function called if call erronus
		error : function(f, resp){
			f.prepend(resp.msg);
		},


		// loader replacing the submit buttons
		loader : function(){
			return '<span class="loader"><img src="'+ jQuery.zdgForm.loaderString +'" alt="" /></span>';
		}
	};





	/**
	 * Fonction to change a navigation in ajax
	 * @param _container: jquery selector of where the content and pagination will be loaded
	 * @param _element: leave as is
	 * @param _loader: img src of the loader img
	 */
	jQuery.fn.zdgPaginAjax = function(options) {

		// default values
		var defaults = {
			_container: '#content',
			_element: $(this).selector,
			_loader: '/img/ajax-loader.gif'
		};

		var settings = $.extend({}, defaults, options);

		return this.each(function() {
			jQuery.zdgPaginAjax.init($(this), settings);
		});

	};


	jQuery.zdgPaginAjax = {

		init: function(n, settings){
			jQuery.zdgPaginAjax.container = settings._container.toString();
			jQuery.zdgPaginAjax.element = settings._element.toString();
			jQuery.zdgPaginAjax.loaderString = settings._loader.toString();

			n.find('a').each(function(){
				var url = $(this).attr("href");

				$(this).click(function(){
					jQuery.zdgPaginAjax.goTo(url, n);
					return false;
				});
			});

		},

		goTo: function(_url, n){

			var url = _url;
			var data;

			var height = parseInt($(jQuery.zdgPaginAjax.container).height(), 10);
			$(jQuery.zdgPaginAjax.container).html(jQuery.zdgPaginAjax.loader);
			$(jQuery.zdgPaginAjax.container).height(height);
			$(jQuery.zdgPaginAjax.container + ' .loader').css({'display':'block', 'paddingTop': height/2});

			$.ajax({
				type: 'post',
				url: url,
				data: data,
				success: function(resp) {
					$(jQuery.zdgPaginAjax.container).attr('style', '').html(resp);
				},
				complete: function() {
					jQuery.zdgPaginAjax.onComplete();
				},
				error: function(resp) {

				}
			});

		},

		onComplete: function(){

			$(jQuery.zdgPaginAjax.element).zdgPaginAjax({
				_container: jQuery.zdgPaginAjax.container
			});
		},

		
		loader : function(){
			return '<span class="loader"><img src="'+ jQuery.zdgPaginAjax.loaderString +'" alt="" /></span>'
		}

	};

})(jQuery);

