﻿( function($) {
	
    $.fn.APS_Scroll = function(opciones){

				var porDefecto = {  
						inicioScroll:2,
						desacelerarScroll:10,
						manoScroll:false,
						botonesScroll:false,
						botonPausa:3,
						botonVelocidad:10,
						botonArriba:"SCR_BOTON_arriba",
						botonAbajo:"SCR_BOTON_abajo"
				};  
				
				var opc = $.extend(porDefecto, opciones );
				
				var detenerScroll=1;
				var pausaScroll=1; 
				var velocidadTemp=detenerScroll;
				var pausaVelocidad=(pausaScroll==0)? velocidadTemp : 0;
				var scrollAlturaActual=0;
				var interval="";
				var timeout="";
				var pausaTimeout="";
				var arribaInterval="";
				var abajoInterval="";
				var estilo="";
				
        return this.each( function(){
        	
        		if(opc.manoScroll==true){
        			$(this).css("cursor","pointer");
        		}
        		
        		if(opc.desacelerarScroll==0){
        			opc.desacelerarScroll=1;
        		}
        		
        		pausa=opc.desacelerarScroll*10;
        		inicio=opc.inicioScroll*1000;
        		
        		var id_temp=this.className.substr(0);

        		$(this).children().attr("id","APS_"+id_temp)
        		
				id_scroll=document.getElementById($(this).children().attr("id"));

				$(this).children().css("top",0);
				
				scrollAltura=$(this).height();
				
				scrollAlturaActual=$(this).children().height();
				
				function activarTimeout(){
					timeout=setTimeout(activarInterval,inicio);
				}
				
				function eliminarTimeout(){
					clearTimeout(timeout);
					delete timeout;
				}
				
				function activarInterval(){
				    if(timeout=="") eliminarTimeout();
				    
					if(interval==""){
					     eliminarInterval();            
					     interval=setInterval(activarScroll,pausa);
					}
				}
				
				function eliminarInterval(){
					clearInterval(interval);
					delete interval;
				}
				
				function activarScroll(){
					if (parseInt(id_scroll.style.top)>(scrollAlturaActual*(-1)+0)){
						id_scroll.style.top=parseInt(id_scroll.style.top)-velocidadTemp+"px";
					}else{
						id_scroll.style.top=parseInt(scrollAltura)+0+"px";
					}
				}
				
				if(opc.botonesScroll==true){
					
					if(opc.botonVelocidad<=0){
						opc.botonVelocidad=1;
					}		
					
					velocidad=opc.botonVelocidad*1;
					
					$("."+opc.botonArriba).mousedown(scrollArriba).mouseup(scrollDetener)
					$("."+opc.botonAbajo).mousedown(scrollAbajo).mouseup(scrollDetener)

				}
				
				function eliminarTimers(){
				    eliminarTimeout();
					eliminarInterval();
					eliminarBotonesTimeout();     
				}
				
				function scrollArriba(){
					eliminarTimers();
					if(arribaInterval==""){
                        detenerArriba();
                        arribaInterval=setInterval(moverArriba,10);
					}
					this.className=this.className+"_ON";
				}	
				
				function scrollAbajo(){
					eliminarTimers();
					if(abajoInterval==""){
					     detenerAbajo();              
                         abajoInterval=setInterval(moverAbajo,10);
					}
					this.className=this.className+"_ON";
				}	
				
				function moverArriba(){
					if (parseInt(id_scroll.style.top)>(scrollAlturaActual*(-1)+0)){
						id_scroll.style.top=parseInt(id_scroll.style.top)-velocidadTemp-velocidad+"px";
					}else{
						if (parseInt(id_scroll.style.top)<(-scrollAltura)){
							id_scroll.style.top=parseInt(scrollAltura)+0+"px";
						}
					}
				}

				function moverAbajo(){
					if (parseInt(id_scroll.style.top)<(scrollAlturaActual*(-1)+0)){
						id_scroll.style.top=parseInt(scrollAltura)-1+"px";
					}else{
						if (parseInt(id_scroll.style.top)<(scrollAltura)){
								if(parseInt(id_scroll.style.top)>(scrollAltura-6)){
									id_scroll.style.top=(-scrollAlturaActual+0)+"px";
								}else{
									id_scroll.style.top=parseInt(id_scroll.style.top)+velocidadTemp+velocidad+"px";
								}
						}
					}
				}
				
				function detenerArriba(){
					clearInterval(arribaInterval);
					delete arribaInterval;
				}
				
				function detenerAbajo(){
					clearInterval(abajoInterval);
					delete abajoInterval;
				}
				
				function scrollDetener(){
				    velocidadTemp=detenerScroll;    
				    detenerBotonesInterval();     
					eliminarBotonesTimeout();
					pausaBotonesTimeout();
					estilo= this.className.split("_ON");
					this.className=estilo[0];
				}				
				
				function detenerBotonesInterval(){
				    detenerArriba();
					detenerAbajo();     
				}
				
				function pausaBotonesTimeout(){
				    arribaInterval="";
				    abajoInterval="";
				    interval="";
					pausaTimeout=setTimeout(activarInterval,opc.botonPausa*1000);
				}
				
				function eliminarBotonesTimeout(){
					clearTimeout(pausaTimeout);
				}
				
				activarTimeout();
				
				$(this).bind('mouseover',function(){
				    if(opc.botonesScroll==true) detenerBotonesInterval();                                
					velocidadTemp=pausaVelocidad;
				}).bind('mouseout',function(){
					if(opc.botonesScroll==true) detenerBotonesInterval(); 
                    velocidadTemp=detenerScroll;
				});
						
        });
    };
    
})(jQuery);