/*
* Скрипт реализующий вертикальный скроллер бар
* обрататывает события перемещения скроллера мышью,
* клик по линнии скролла
* прокрутка колесом мыши.
* Автоподгон ширины скроллера
*/

VerticalScroll = function (scroller, scroller_bar, menu)
{
	this.mouseWheelSpeed = 5; // change this to change wheeling speed

    this.canDrag = false;
    this.prepared = false;

    this.shift_y;
    this.delta;

    this.scroller = scroller;
    this.scrollerBar = scroller_bar;
    this.menu = menu;

    this.scrollerStartShift;
    this.menuStartShift;

    this.scrollerTrackWidth = 363;
    this.menuTrackWidth;

    this.scrollerWidth;
    this.menuWidth = 0;

    this.step;

    this.dontmove = false;

    this.a = false;

    this.prepare = function()
    {
        if(get(this.scroller) && get(this.menu))
        {
            this.scroller = get(this.scroller);
            this.scrollerBar = get(this.scroller_bar);
            this.menu = get(this.menu);
            
            this.scrollerStartShift = parseInt(this.scroller.style.top);
            this.menuStartShift = parseInt(this.menu.style.marginTop);
	
            this.menuTrackWidth = this.menu.offsetHeight - 355 + this.menuStartShift;
            
            this.scrollerWidth = Math.round( (this.menuWidth * this.scrollerTrackWidth) / this.menuTrackWidth );

            
            // 8 px - ширина стрелки => минимальная ширина скроллера 16px        
            this.scrollerWidth = (this.scrollerWidth < 16) ?  16 : this.scrollerWidth;
            
            // максимальная ширина скроллера - ширина трэка
            this.scrollerWidth = (this.scrollerWidth > this.scrollerTrackWidth) ?  this.scrollerTrackWidth : this.scrollerWidth;
            
            // устанавливаем ширину скроллера 
            this.scroller.style.paddingBottom = this.scrollerWidth - 8 + "px";
            
            // теперь принимаем за скроллер точку (его левую границу), все расчеты будем производить относительно нее
            // задаем ширину трэка скроллера и меню
            this.scrollerTrackWidth -= this.scrollerWidth;
            this.menuTrackWidth -= this.menuWidth;
            
            // рассчитываем коэффициэнт
            this.delta = this.menuTrackWidth / this.scrollerTrackWidth;

            this.prepared = true;
        }
        return false;
    }

    this.fixForBrowsers = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if(event.stopPropagation) event.stopPropagation();
        else event.cancelBubble = true;
        if(event.preventDefault) event.preventDefault();
        event.returnValue = false;
    }

    this.setStep = function()
    {
        this.step = Math.round(this.scrollerWidth / 5);
        //this.step = Math.round(this.menu.getElementsByTagName("td")['0'].offsetHeight * this.scrollerTrackWidth / this.menuTrackWidth);    
    }

    this.setPosition = function(newPosition)
    {
        if(newPosition <= this.scrollerTrackWidth + this.scrollerStartShift && newPosition >= this.scrollerStartShift)
        {
            this.scroller.style.top = newPosition + "px";
        }
        else
        {
            if(newPosition >= this.scrollerTrackWidth + this.scrollerStartShift)
            {        
                this.scroller.style.top = this.scrollerTrackWidth + this.scrollerStartShift + "px";
            }
            if(newPosition <= this.scrollerStartShift)
            {
                this.scroller.style.top = this.scrollerStartShift + "px";
            }
        }
        this.menu.style.marginTop = Math.round( (parseInt(this.scroller.style.top) - this.scrollerStartShift) * this.delta * (-1) ) + this.menuStartShift + "px";
        return false;
    }

    this.drag = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared)
        {
            this.canDrag = true;
            this.shift_y = event.clientY - parseInt(this.scroller.style.top);
            this.fixForBrowsers(event);
        }    
        return false;
    }

    this.movescroller = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared && !this.dontmove)
        {
            this.setStep();
            var clickY = event.layerY ? event.layerY : event.offsetY;
            var currentPosition = parseInt(this.scroller.style.top);               
            var i = (clickY > currentPosition) ? 1 : -1;
            var newPosition = currentPosition + 5*i*this.step; 
            this.setPosition(newPosition);
            this.fixForBrowsers(event);
        }
        else
        {
            this.dontmove = false;
        }
        return false;
    }

    this.move = function(event)
    {
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (this.prepared && this.canDrag)
        {
            this.setPosition(event.clientY-this.shift_y);
            this.fixForBrowsers(event);
        }
        return false;
    }

    this.drop = function()
    {
        this.canDrag=false; 
    }
    
    this.scrollerClickHandler = function()
    {
        this.dontmove=true;    
    }    

    this.handle = function(delta, event) 
    {        
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        var i = (delta < 0) ? 1 : -1;
        this.setStep();
        var currentPosition = parseInt(this.scroller.style.top);	
        var newPosition = this.mouseWheelSpeed*i*this.step + currentPosition;
        this.setPosition(newPosition);        
        this.fixForBrowsers(event);        
    }

    this.cancelWheelAction = function(event)
    {
        /*
        Отменяем действие колеса
        */
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (event.preventDefault)
        {
            event.preventDefault();
        }
        event.returnValue = false;
    }

    this.wheel = function(event)
    {
        var delta = 0;
        if (!event)
        {
            // For IE.
            event = window.event;
        }
        if (event.wheelDelta) 
        {
            // IE и Safari значения delta всегда строго 120, вне зависимости от настроек пользователя.
            //alert(event.wheelDelta);
            delta = event.wheelDelta/120;
            
            // В Opera 9, значение delta равна 40*количество строк установленных пользователем в настройках
            // Не отличается по знаку от IE
            if (window.opera)
            {
                delta = event.wheelDelta/40;
            }
        } 
        else if (event.detail) 
        {
            /* 
            Заточка под Mozilla
            В Mozilla, значение delta отличается по знаку от значения в IE.
            по модулю delta строго совпадает со значением в пользовательких настройках
            */    
            //alert(-event.detail);
            delta = -event.detail;
        }
        /*
        Если delta отлична от 0 - юзаем ее
        Если скроллить вверх, то delta > 0
        Если скролить вниз - delta < 0
        */
        if (delta)
        {
            this.handle(delta, event);
            //this.cancelWheelAction(event);
            this.fixForBrowsers(event);
            return false;
        }
    }
}

function get(id)
{
    return document.getElementById(id);
}

function handleOnMouseUp(event)
{
    vertical.drop(event);
}
function handleOnMouseMove(event)
{
    vertical.move(event);
}
function handleOnClickBarVertical(event) 
{
    vertical.movescroller(event);
}
function handleOnMouseDownVertical(event)
{
    vertical.drag(event);
}
function handleOnClickVertical(event) 
{
    vertical.scrollerClickHandler(event);
}
function handleOnMouseWheelVertical(event)
{
    vertical.wheel(event);
}

var vertical;

function initScrolling()
{

    vertical = new VerticalScroll('scroller_v', 'scroller_bar_v', 'movemenu_v');
    vertical.prepare();
    document.onmousemove = handleOnMouseMove;
    window.onmouseup = handleOnMouseUp;

    get('scroller_v').onmousedown = handleOnMouseDownVertical;
    get('scroller_v').onmouseup = handleOnMouseUp;
    get('scroller_v').onclick = handleOnClickVertical;
	
	if (get('withscript_v').addEventListener)
        get('withscript_v').addEventListener('DOMMouseScroll', handleOnMouseWheelVertical, false);
    get('withscript_v').onmousewheel = handleOnMouseWheelVertical;
	
	//get('scroller_bar_v').onclick = handleOnClickBarVertical;
}

