(function($) {
	$.extend({
		tablesorterPager: new function() {


			function updatePageDisplay(c) {

				var nbPages = c.totalPages;
				var pageEncours = (c.page + 1);
				var nbPagesStr = nbPages.toString();
				var pageEncoursStr = pageEncours.toString();

				$(c.cssPageDisplay).html(c.motPage + '&nbsp;<span>' + pageEncoursStr + '</span>&nbsp;' + c.seperator + '&nbsp;<span>' + nbPagesStr + '</span>');

				// Restaurer les etats par defaut
//				$(c.cssFirst).show();
				$(c.cssPrev).show();
				$(c.cssPipePagePrecedente).show();
				$(c.cssPipePageSuivante).show();
				$(c.cssNext).show();
//				$(c.cssLast).show();

				$(c.cssPage1).hide();
				$(c.cssPage2).hide();
				$(c.cssPage3).hide();
				$(c.cssPage4).hide();
				$(c.cssPage5).hide();
				$(c.cssPage6).hide();
				$(c.cssPage7).hide();
				$(c.cssPage8).hide();
				$(c.cssPage9).hide();
				$(c.cssPage10).hide();

				if (nbPages < 2) {
					$(c.cssFirst).hide();
					$(c.cssPrev).hide();
					$(c.cssPipePagePrecedente).hide();
					$(c.cssPipePageSuivante).hide();
					$(c.cssNext).hide();
					$(c.cssLast).hide();
				}

				if (pageEncours == 1 && nbPages > 1) {
					$(c.cssFirst).hide();
					$(c.cssPrev).hide();
					$(c.cssPipePagePrecedente).hide();
				}

				if (pageEncours > 1 && nbPages == pageEncours) {
					$(c.cssNext).hide();
					$(c.cssLast).hide();
					$(c.cssPipePageSuivante).hide();
				}

				var seriePage = Math.floor(pageEncours / 10);

				var premierePageSerie = seriePage == 0 ? 1 : (seriePage * 10) + 1;

				//Ajouter la liste des pages accessibles
				var numOption = 1;

				for (var numeroPage = premierePageSerie; numeroPage <= nbPages && (numeroPage <= premierePageSerie + 9); numeroPage++) {

					if (numOption == 1) {
						$(c.cssPage1).html(numeroPage.toString());
						$(c.cssPage1).show();
					}
					else if (numOption == 2) {
						$(c.cssPage2).html(numeroPage.toString());
						$(c.cssPage2).show();

					}
					else if (numOption == 3) {
						$(c.cssPage3).html(numeroPage.toString());
						$(c.cssPage3).show();

					}
					else if (numOption == 4) {
						$(c.cssPage4).html(numeroPage.toString());
						$(c.cssPage4).show();
					}
					else if (numOption == 5) {
						$(c.cssPage5).html(numeroPage.toString());
						$(c.cssPage5).show();

					}
					else if (numOption == 6) {
						$(c.cssPage6).html(numeroPage.toString());
						$(c.cssPage6).show();

					}
					else if (numOption == 7) {
						$(c.cssPage7).html(numeroPage.toString());
						$(c.cssPage7).show();

					}
					else if (numOption == 8) {
						$(c.cssPage8).html(numeroPage.toString());
						$(c.cssPage8).show();

					}
					else if (numOption == 9) {
						$(c.cssPage9).html(numeroPage.toString());
						$(c.cssPage9).show();

					}
					else if (numOption == 10) {
						$(c.cssPage10).html(numeroPage.toString());
						$(c.cssPage10).show();

					}

					numOption++;
				}

				// Si, meme avec la plus petite valeur, on a 1 seule page de resultats
				// alors cacher le paginateur car il ne sert a rien
				var selectList = $(".selecteurNbItemsPage select").get(0);
				var selectOptions = $(selectList).find("option");
				var selectedPageSize = $(selectList).val();
				var lowestValue = 0;

				// Trouver la plus petite valeur de la liste (pourrait eventuellement ne pas etre en premier)
				var arrVals = [];
				selectOptions.each
				(
					function() {
						arrVals.push($(this).val());
					}
				);
				arrVals.sort()
				lowestValue = arrVals[0];

				if (selectedPageSize == lowestValue && nbPages == 1) {
					$(".paginateur").hide();
					$(".selecteurNbItemsPage").hide();
				}

			}

			function setPageSize(table, size) {

				var c = table.config;
				c.size = size;
				c.totalPages = Math.ceil(c.totalRows / c.size);
				c.pagerPositionSet = false;
				moveToPage(table);
				fixPosition(table);

				// Modifier les 2 paginateurs relies a cette table
				$(".pagesize option").removeAttr("selected");
				$(".pagesize option[@value='" + size + "']").attr("selected", "selected");
				$(".pagesize").prev(".select-text").html(size);



			}

			function fixPosition(table) {
				var c = table.config;
				if (!c.pagerPositionSet && c.positionFixed) {
					var c = table.config, o = $(table);
					if (o.offset) {
						c.container.css({
							top: o.offset().top + o.height() + 'px',
							position: 'absolute'
						});
					}
					c.pagerPositionSet = true;
				}
			}

			function moveToFirstPage(table) {
				var c = table.config;
				c.page = 0;
				moveToPage(table);
			}

			function moveToLastPage(table) {
				var c = table.config;
				c.page = (c.totalPages - 1);
				moveToPage(table);
			}

			function moveToNextPage(table) {
				var c = table.config;
				c.page++;
				if (c.page >= (c.totalPages - 1)) {
					c.page = (c.totalPages - 1);
				}
				moveToPage(table);
			}

			function moveToPrevPage(table) {
				var c = table.config;
				c.page--;
				if (c.page <= 0) {
					c.page = 0;
				}
				moveToPage(table);
			}

			function moveToSpecificPage(table, page) {
				var c = table.config;
				c.page = page;
				c.page--;
				moveToPage(table);
			}


			function moveToPage(table) {
			    
				var c = table.config;
				if (c.page < 0 || c.page > (c.totalPages - 1)) {
					c.page = 0;
				}

				renderTable(table, c.rowsCopy);
				$('html, body').scrollTop(0);
			}

			function renderTable(table, rows) {

				var c = table.config;
				var l = rows.length;
				var s = (c.page * c.size);
				var e = (s + c.size);
				if (e > rows.length) {
					e = rows.length;
				}


				var tableBody = $(table.tBodies[0]);

				// clear the table body

				$.tablesorter.clearTableBody(table);

				for (var i = s; i < e; i++) {

					//tableBody.append(rows[i]);

					var o = rows[i];
					var l = o.length;
					for (var j = 0; j < l; j++) {

						tableBody[0].appendChild(o[j]);

					}
				}

				fixPosition(table, tableBody);

				$(table).trigger("applyWidgets");

				if (c.page >= c.totalPages) {
					moveToLastPage(table);
				}

				updatePageDisplay(c);
			}

			this.appender = function(table, rows) {

				var c = table.config;

				c.rowsCopy = rows;
				c.totalRows = rows.length;
				c.totalPages = Math.ceil(c.totalRows / c.size);

				renderTable(table, rows);
			};

			this.defaults = {
				size: 10,
				offset: 0,
				page: 0,
				totalRows: 0,
				totalPages: 0,
				container: null,
				cssNext: '.paginateur .next',
				cssPrev: '.paginateur .prev',
				cssFirst: '.paginateur .first',
				cssLast: '.paginateur .last',
				cssPipePagePrecedente: '.paginateur .pipePagePrecedente',
				cssPage1: '.paginateur .page1',
				cssPage2: '.paginateur .page2',
				cssPage3: '.paginateur .page3',
				cssPage4: '.paginateur .page4',
				cssPage5: '.paginateur .page5',
				cssPage6: '.paginateur .page6',
				cssPage7: '.paginateur .page7',
				cssPage8: '.paginateur .page8',
				cssPage9: '.paginateur .page9',
				cssPage10: '.paginateur .page10',
				cssPipePageSuivante: '.paginateur .pipePageSuivante',
				cssPageDisplay: '.pagedisplay',
				cssPageSize: '.pagesize',
				seperator: _lblPaginationDe,
				motPage: _lblPaginationPage,
				positionFixed: true,
				appender: this.appender
			};

			this.construct = function(settings) {

				return this.each(function() {

					config = $.extend(this.config, $.tablesorterPager.defaults, settings);

					var table = this, pager = config.container;

					$(this).trigger("appendCache");

					config.size = parseInt($(".pagesize", pager).val());

					$(config.cssFirst, pager).click(function() {
						moveToFirstPage(table);
						return false;
					});
					$(config.cssNext, pager).click(function() {
						moveToNextPage(table);
						return false;
					});

					$(config.cssPage1, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage1).html());
						return false;
					});

					$(config.cssPage2, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage2).html());
						return false;
					});

					$(config.cssPage3, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage3).html());
						return false;
					});

					$(config.cssPage4, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage4).html());
						return false;
					});

					$(config.cssPage5, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage5).html());
						return false;
					});

					$(config.cssPage6, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage6).html());
						return false;
					});

					$(config.cssPage7, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage7).html());
						return false;
					});

					$(config.cssPage8, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage8).html());
						return false;
					});

					$(config.cssPage9, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage9).html());
						return false;
					});

					$(config.cssPage10, pager).click(function() {
						moveToSpecificPage(table, $(config.cssPage10).html());
						return false;
					});

					$(config.cssPrev, pager).click(function() {
						moveToPrevPage(table);
						return false;
					});
					$(config.cssLast, pager).click(function() {
						moveToLastPage(table);
						return false;
					});
					$(config.cssPageSize, pager).change(function() {
						setPageSize(table, parseInt($(this).val()));
						return false;
					});
				});
			};
		}
	});
	// extend plugin scope
	$.fn.extend({
		tablesorterPager: $.tablesorterPager.construct
	});



})(jQuery);				



