(function($) {

	// Nom du Plugin
	$.fn.ajaxPagination = function(method) {

		// Méthodes publiques
		//
		// Elles peuvent être appelées depuis l'extérieur par
		// element.zoomPhoto('methodName', arg1, arg2, ... argn)
		// où "element" est un objet du DOM auquel on attache la méthode
		//
		// ou, de l'intérieur par
		// methods.methodName(arg1, arg2, ... argn)
		var methods = {

			// Constructeur
			init: function(options) {

				// the plugin's final properties are the merged default and user-provided properties (if any)
				// this has the advantage of not polluting the defaults, making them re-usable
				this.ajaxPagination.settings = $.extend({}, this.ajaxPagination.defaults, options);

				// Boucle sur les éléments attachés au plugin
				return this.each( function() {
					var $element = $(this), // reference to the jQuery version of the current DOM element
					element = this;  // reference to the actual DOM element

					// On stocke les options dans l'objet pour éviter les confusions si le plugin est appelé plusieurs fois
					$element.data('settings', $.fn.ajaxPagination.settings);

					var start = $element.data('settings').row * $element.data('settings').page - $element.data('settings').row;
					var limit = start + ',' + $element.data('settings').row;

					$element.click( function(event) {						
						
						event.preventDefault();
						
						$('.exposant-categorie.active').removeClass('active');
						$(this).addClass('active');
						var id = $(this).attr('id').replace('id', '');
						
						// On récupère le nombre d'enregistrement de la requête
						$.ajax({ 
							url : $element.data('settings').url,
							data: 'count_id=' + id,
							async: false,
							beforeSend: function(){			
								$element.data('settings').container.html('');
								$element.data('settings').container.append($('<table class="loader" width="620" height="550"><tr><td valign="middle" align="center"><img src="' + $element.data('settings').container.data('loader') + '" alt="Chargement..."/></td></tr></table>'))
							},
							success: function(length) {
							
								// On affiche la pagination
								var nb_pages   = Math.ceil(length / $element.data('settings').row);
								var html_pages = '<div class="ajax-pagination">';
								for(var i = 1; i <= nb_pages; i++)
									html_pages += '<a href="#page' + i + '" class="ajax-pagination-page' + (i == 1 ? ' active' : '') + '" id="ajax-pagination-page' + i + '">' + i + '</a>' + (i != nb_pages ? '&nbsp;|&nbsp;' : '');
								html_pages += '</div>';
								
								$element.data('settings').container.find('.loader').remove();
								$element.data('settings').container.append($(html_pages));
								
								// Lorsque l'on clique sur un numéro de page
								$element.data('settings').container.find('.ajax-pagination-page').click( function() {
									
									$element.data('settings').container.find('.ajax-pagination-page.active').removeClass('active');
									$(this).addClass('active');
									var start = $element.data('settings').row * parseInt($(this).attr('id').replace('ajax-pagination-page', '')) - $element.data('settings').row;
									var limit = start + ',' + $element.data('settings').row;
									
									// On récupère les enregistrements de la page courante
									$.ajax({
										url: $element.data('settings').url,
										data: 'id=' + id + '&limit=' + limit,
										dataType: 'json',
										beforeSend: function(){
											$element.data('settings').container.find('.exposant-liste').remove();
											$element.data('settings').container.append($('<table class="loader" width="620" height="550"><tr><td valign="middle" align="center"><img src="' + $element.data('settings').container.data('loader') + '" alt="Chargement..."/></td></tr></table>'))
										},
										success: function(json) {										
											
											var ul = $('<ul class="exposant-liste"></ul>');
											$element.data('settings').container.find('.loader').remove();
											$element.data('settings').container.append(ul);
											$.each(json, function(key, object) {
												var li = '<li><span class="exposant-coordonnees">';
												
												if($element.data('settings').container.data('admin') == 1)
													li += '<a class="categorie-editer" style="position: relative; float: right" href="?exposant=editer&id=' + object.exp_id + '"></a><a class="categorie-supprimer" style="position: relative; float: right" href="?exposant=supprimer&id=' + object.exp_id + '"></a>';
												
												if(object.exp_company != '')
													li += '<span class="color1 bold size15">' + object.exp_company + '</span><br/>';
												if(object.exp_address != '')
													li += '<span><i>' + object.exp_address + '</i></span><br/>';
												if(object.exp_phone != '')
													li += '<span>' + object.exp_phone + '</span><br/>';
												if(object.exp_url != '')
													li += '<span><a href="http://' + object.exp_url + '" target="_blank">' + object.exp_url + '</a></span><br/>';
												if(object.exp_mail != '')
													li += '<span><a href="mailto:' + object.exp_mail + '" target="_blank">' + object.exp_mail + '</a></span><br/>';
												li += '</span>';
												if(object.exp_description != '')
													li += '<span class="exposant-description">' + object.exp_description + '</span>';
												li += '</li>';
												ul.append($(li));
											});
										}
									});
								});
								
								$element.data('settings').container.find('.ajax-pagination-page').first().trigger('click');	
							}
						});
					});
				});
			}
		}

		// Méthodes privées
		// Elles ne peuvent être appelées que depuis l'intérieur du Plugin par
		// helpers.methodName(arg1, arg2, ... argn)
		var helpers = {

		}

		// if a method as the given argument exists
		if (methods[method]) {
			// call the respective method
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
			// if an object is given as method OR nothing is given as argument
		} else if (typeof method === 'object' || !method) {
			// call the initialization method
			return methods.init.apply(this, arguments);
			// otherwise
		} else {
			// trigger an error
			$.error('Method "' + method + '" does not exist in pagination plugin!');
		}

	}
	// Options par défaut
	$.fn.ajaxPagination.defaults = {
		url: '',
		row: 1,
		page: 1,
		container: null
	}

	// this will hold the merged default and user-provided options
	// you will have access to these options like:
	// this.pluginName.settings.propertyName from inside the plugin or
	// element.pluginName.settings.propertyName from outside the plugin, where "element" is the element the
	// plugin is attached to;
	$.fn.ajaxPagination.settings = {}

})(jQuery);
