/**
 * Paginacion automatica
 * @author Monoku Team <http://www.monoku.com>
 */
var Pagination = (function($){
	
	/**
	 * Define si la paginacion automatica esta activada
	 * @private
	 * @see #disable
	 * @see #enable
	 */
	var _status = false,
	
	/**
	 * Define si la se esta realizando una request
	 * @private
	 */
	_isLoading = false,
	
	/**
	 * Decimal para dispara el evento
	 * @private
	 */
	_trigger = 500,
	
	/**
	 * Elemento para disparar el evento
	 * @private
	 */
	_handler = null,
	
	/**
	 * Funcion para ejecutar con el evento
	 * @private
	 */
	_callback = $.noop,
	
	_paused = false,
	
	/**
	 * Hash de eventos
	 * @private
	 */
	_evts = {
		onPlay: $.noop,
		onStop: $.noop,
		onPause: $.noop,
		onScrollStart: $.noop,
		onScrollEnd: $.noop,
		onScrollLoad: $.noop
	};
	
	return {
		/**
		 * Inicializa el objeto
		 * 
		 * @param {HTMLElement|String|jQuery} hwnd Elemento para disparar el evento livescroll}
		 * @param {Number} pin Valor que debe devolver la formula para hacer la request
		 * @param {Function} callback Funcion para ejecutar con el evento
		 * @param {Number} page Pagina para iniciar
		 */
		setUp: function(hwnd, pin, callback, evts){
			_trigger = typeof pin !== 'undefined' || pin !== null ? pin : _trigger;
			_callback = callback || _callback;
			_handler = $(hwnd);
			
			evts = evts || {};			
			_evts.onPlay = evts.onPlay || _evts.onPlay;
			_evts.onStop = evts.onStop || _evts.onStop;
			_evts.onPause = evts.onPause || _evts.onPause;
			_evts.onScrollStart = evts.onScrollStart || _evts.onScrollStart;
			_evts.onScrollEnd = evts.onScrollEnd || _evts.onScrollEnd;
			_evts.onScrollLoad = evts.onScrollLoad || _evts.onScrollLoad;
			
			
			//Event attaching
			_handler.click((function(that){ return function(){
				var toPos = $('.pagination-controls').height();
				
				that.enable();
				jQuery(window).trigger('livescroll', [true]);				
				$('.pagination-controls').animate({ bottom: '+='+ toPos +'px'}, 'normal');
				return false;
			};})(this));
			
			
			//evento para el scroll
			$(window).scroll(function(){
				jQuery(window).trigger('livescroll');
				return true;
			});
			
			//Agregando el evento personalizado
			$(window).bind('livescroll', $.proxy(this.resolve, this));
			return this;
		},
		
		/**
		 * Desactiva la paginacion automatica
		 * @see #enable
		 */
		disable: function(stop){
			if(_status){
				if(!stop){
					$.proxy(_evts.onPause, this)();
				}
				else{
					$.proxy(_evts.onStop, this)();
				}
			}
			
			_status = false;
			return this;
		},
		
		/**
		 * Activa la paginacion
		 * @see #disable
		 */
		enable: function(){
			$.proxy(_evts.onPlay, this)();
			_paused = false;
			_status = true;			
			return this;
		},
		
		/**
		 * Pausa la paginacion
		 */
		pause: function(){
			_paused = true;
			this.disable();
			return this;
		},
		
		/**
		 * Devuelve si esta activa la paginacion
		 * @return esta o no esta activa
		 * @type Boolean
		 */
		isEnabled: function(){
			return _status;
		},	
		
		isPaused: function(){
			return _paused;
		},	
		
		/**
		 * Devuelve la posicion actual del usuario en el documento
		 * @return Posicion del usuario en el scroll del documento
		 * @type Number
		 */
		getUserPosition: function(){			
			return ($(window).scrollTop() + $(window).height());
		},
		
		resolve: function(e, initial){
			if( !this.isEnabled() || _isLoading ){return;}
			
			var point = this.getUserPosition(),
				indx = 0,
				nextPage = null,
				page = this.getPage(),
				totalPages = this.getPagesCount();
			
			if(!parseInt(page) && abcdario.indexOf(page) !== -1 && abcdario.indexOf(page) === (abcdario.length - 1)){ return false;}
			
			if(parseInt(page) && page >= totalPages){ return false;}
		
			if( point >= ($(document).height() - _trigger) || initial ){
				
				_isLoading = true;
				$.proxy(_evts.onScrollStart, this)();
				
				indx = abcdario.indexOf(page);
				//si las paginacion es alfabetica
				if( indx !== -1 ){
					nextPage = abcdario.charAt( (++indx) );
				}
				else if((page = parseInt(page)).constructor === Number){
					nextPage = (page + 1);
				}
				
				nextPage = this.setPage( nextPage, initial );
				
				_callback( nextPage );
				$.proxy(_evts.onScrollEnd, this)(nextPage);
			}
			
			return true;
		},
	
		xhr: function(){
			_isLoading = false;
			if(_status){
				$.proxy(_evts.onScrollLoad, this)();
			}
			return true;
		},
		
		/**
		 * Placeholder. Debe ser sobreescrita posteriormente
		 */
		getPage: function(){return;},
		
		/**
		 * Placeholder. Debe ser sobreescrita posteriormente
		 */
		setPage: function(value, firstLoad){return;},
		
		/**
		 * Placeholder. Debe ser sobreescrita posteriormente
		 */
		getPagesCount: function(){return;}
	};
})(jQuery);


jQuery.extend(Pagination, {
	getPage: function(){
		return ($('.paginas-disponibles .active:last').text() || HManager.page);
	},
	
	setPage: function(value, firstLoad){
		if( firstLoad){
			if(value === 'B'){
				value = 'A';
			}
			else if(value === 2){
				value = 1;
			}
			HManager.appendMode = pushToList.REPLACE;
		}
		else{
			HManager.appendMode = pushToList.APPEND;
		}
		
		HManager.page = value;
		return value;
	},
	
	getPagesCount: function(){
		//si no se han cargado resultados a traves de un request o si no hay paginas dentro del html, devuelve la pagina 2 por defecto
		return (HManager.avaliablePages || jQuery('.paginas-disponibles').eq(0).find('> a').length || 2);
	}
});

jQuery(document).ready(function(){
	var events = {
		onPlay: function(){
			$('.letra').hide();
			$('#seeall_button').hide();
			$('#pag-spinner span').removeClass('pausebutton');
			
//			if( abcdario.indexOf(HManager.page) > -1 ){
//				HManager.page = 'A';
//			}
//			else{
//				HManager.page = 1;				
//			}
			
			if(!Pagination.isPaused()){
				$('.paginas-disponibles .active').removeClass('active');
				$('.paginas-disponibles a:first').addClass('active');
			}
			return true;
		},
		
		onPause: function(){
			$('#pag-spinner span').removeClass('spinner').addClass('pausebutton');
			return true;
		},
		
		onScrollStart: function(){
			$('#pag-spinner span').addClass('spinner');
			return true;
		},
		
		onScrollLoad: function(){
			$('#pag-spinner span').removeClass('spinner');
			return true;
		},
		onStop: function(){
			var toPos = $('.pagination-controls').height();
			$('#seeall_button').show();
			$('.letra').fadeIn();
			HManager.disposeVar('page');
			HManager.page = 1;
			HManager.appendMode = pushToList.REPLACE;
			$('#pag-pause a').each(function(){
				$(this).html('<span id="pag-indicator"></span>Detener carga autom&aacute;tica').addClass('pag-pressed');
				this.$action = 0;
			});
			$('.pagination-controls').animate({ bottom: '-='+ toPos +'px'}, 'normal');
			return true;
		}
	};
	
	Pagination.setUp('#seeall_button', 1050, function( nextPage ){
		HManager.setVar('page', nextPage);
		gwtHistoryReceiver( HManager.hash );
		return true;
	}, events);
});

