﻿(function($) {

    $.fn.APS_Scroll = function(opciones) {

        var porDefecto = {
            inicioScroll: 2,
            desacelerarScroll: 2,
            manoScroll: false,
            botonesScroll: false,
            botonPausa: 3,
            botonVelocidad: 2,
            botonArriba: "WEB_BOTON_arriba",
            botonAbajo: "WEB_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);
            }

            function activarInterval() {
                interval = setInterval(activarScroll, pausa)
            }

            function eliminarInterval() {
                clearInterval(interval);
            }

            function activarScroll() {
                if (parseInt(id_scroll.style.top) > (scrollAlturaActual * (-1) + 8)) {
                    id_scroll.style.top = parseInt(id_scroll.style.top) - velocidadTemp + "px";
                } else {
                    id_scroll.style.top = parseInt(scrollAltura) + 8 + "px";
                }
            }

            if (opc.botonesScroll == true) {

                if (opc.botonVelocidad <= 0) {
                    opc.botonVelocidad = 1;
                }

                velocidad = opc.botonVelocidad;

                $("." + opc.botonArriba).mousedown(scrollArriba).mouseup(scrollDetener).mouseout(scrollDetener);
                $("." + opc.botonAbajo).mousedown(scrollAbajo).mouseup(scrollDetener).mouseout(scrollDetener);

            }

            function scrollArriba() {
                eliminarTimeout();
                eliminarInterval();
                eliminarBotonesTimeout();
                arribaInterval = setInterval(moverArriba, 1)
                this.className = this.className + "_ON"
            }

            function scrollAbajo() {
                eliminarTimeout();
                eliminarInterval();
                eliminarBotonesTimeout();
                abajoInterval = setInterval(moverAbajo, 1)
                this.className = this.className + "_ON"
            }

            function moverArriba() {
                if (parseInt(id_scroll.style.top) > (scrollAlturaActual * (-1) + 20)) {
                    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) + 1 + "px";
                    }
                }
            }

            function moverAbajo() {
                if (parseInt(id_scroll.style.top) < (scrollAlturaActual * (-1) + 20)) {
                    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 + 20) + "px";
                        } else {
                            id_scroll.style.top = parseInt(id_scroll.style.top) + velocidadTemp + velocidad + "px";
                        }
                    }
                }
            }

            function detenerArriba() {
                clearInterval(arribaInterval);
            }

            function detenerAbajo() {
                clearInterval(abajoInterval);
            }

            function scrollDetener() {
                eliminarBotonesTimeout();
                pausaBotonesTimeout();
                detenerArriba();
                detenerAbajo();
                estilo = this.className.split("_ON");
                this.className = estilo[0];
            }

            function pausaBotonesTimeout() {
                pausaTimeout = setTimeout(activarInterval, opc.botonPausa * 1000);
            }

            function eliminarBotonesTimeout() {
                clearTimeout(pausaTimeout);
            }

            activarTimeout();

            $(this).bind('mouseover', function() {
                velocidadTemp = pausaVelocidad;
            }).bind('mouseout', function() {
                velocidadTemp = detenerScroll;
            });

        });
    };

})(jQuery);
