/*
 * var apiPaginador = $('.paginador').paginador({
 *                  callback: function (pagina) {
 *						
 *                  }
 *              });
 */
$(function() {
	function Paginador($el, opt)
	{
		var self = this;
		
		// función llamada por manejador cuando se hace un click sobre un link. Esta llama a la función pasada por opt (si es que se ha pasado una)
		function gotopage(pagina, evt)
		{
			opt.pagina = pagina;
			dibujar_links();
			var continuePropagation = opt.callback(pagina);
			if (!continuePropagation) {
				if (evt.stopPropagation) {
					evt.stopPropagation();
				}
				else {
					evt.cancelBubble = true;
				}
			}
			return continuePropagation;
		}

		// Redibuja los links
		function dibujar_links()
		{
			// manejador del clic sobre un link
			var clickhandler = function (pagina)
			{
				return function(evt) { return gotopage(pagina, evt); }
			}

			// agrega link con número o texto (siguiente o atrás)
			var addElement = function (pagina, texto)
			{
				var elemento;
				if (pagina == opt.pagina || pagina <= 0 || pagina > opt.paginas)
				{
					elemento = $('<span class="current">'+texto+'</span>');
				} else {
					elemento = $('<a>'+texto+'</a>')
						.attr('href',  opt.href+'&pagina='+pagina)
						.bind('click', clickhandler(pagina));
				}
				$el.append(elemento);
				$el.append(' ');
			}

			$el.empty();

			// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
			// * * * * * * * * * * LOGICA TOMADA DE paginador.class.php --> getHtml()
			// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

			// quito cantidad de forma inteligente (por numeros grandes)
			var digitos = String(opt.pagina).length;
			var links = opt.links;
			if (digitos > 2)
				links = links - digitos + 2;

			// establezdo desde y hasta donde generar links (links centrales)
			var inicio = Math.floor(opt.pagina-(links/2))+1;
			if(inicio <= opt.links_extremos) inicio = parseInt(opt.links_extremos) + 1;
			var fin = inicio + parseInt(links) - 1;
			if (fin > opt.paginas)
			{
				fin = opt.paginas;
				inicio = fin - links + 1;
				if (inicio < 1) inicio = 1;
			}

			// atras
			addElement(opt.pagina-1, '&laquo;  Atr&aacute;s');

			var freno, i;
			// links inicio
			if (inicio > 1 && opt.links_extremos > 0)
			{

				if (inicio > opt.links_extremos)
					freno = opt.links_extremos;
				else
					freno = inicio;

				for (i = 1; i <= freno; i++)
					addElement(i, i);

				if (inicio > opt.links_extremos + 1)
					$el.append('<span>...</span> ');
			}

			// links centro
			for (i = inicio; i <= fin; i++)
				addElement(i, i);

			// links fin
			if (fin < opt.paginas && opt.links_extremos > 0)
			{
				if (fin < (opt.paginas - opt.links_extremos))
				{
					$el.append('<span>...</span> ');
					freno = opt.paginas - opt.links_extremos + 1;
				} else
					freno = fin + 1;

				for (i = freno; i <= opt.paginas; i++)
					addElement(i, i);
			}

			// siguiente
			addElement(opt.pagina+1, 'Siguiente &raquo;');

			//	* * * * * * * * * * FIN LOGICA
		}

		// API methods
		$.extend(self,
		{
			setPaginas: function(paginas, redibujar)
			{
				opt.paginas = paginas;
				if (redibujar !== false)
					dibujar_links();
				return self;
			}
		}); 

		// obtiene datos
		var datos = $el.find('div').html();
		datos = datos.split(',');
		opt.pagina = parseInt(datos[1]);
		opt.paginas = parseInt(datos[2]);
		opt.links = parseInt(datos[3]);
		opt.links_extremos = parseInt(datos[4]);
		opt.href = datos[5];

		dibujar_links();
	}

	jQuery.fn.paginador = function(opt)
	{
		// ¿el objeto ya está creado? --> return API
		var el = this.eq(typeof opt == 'number' ? opt : 0).data('paginador');
		if (el) { return el; }
		
		opt = $.extend({
			pagina: 1,
			paginas: 1,
			links: 10,
			links_extremos: 2,
			href: '',
			callback:function(){ return false; }
		},opt||{});

		this.each(function() {
			el = new Paginador($(this), opt);
			//instances.push(el);
			$(this).data('paginador', el);
		});

		return el;
	}

});

