/*

Copyright (C) 2007 by Marian Meravy

*/

var g_scrollers=new Array();

var g_down=null;
var g_scroll_by=0;
var g_scroll_drag=null;
var g_scroll_drag_y=null;
var g_scroll_drag_y_start=null;

var g_min_middle_height=30.0;

function do_move(el,s)
{
    if(s.scroll.y>=s.scrollSize.y)
        s.scroll.y=s.scrollSize.y-1;
    if(s.scroll.y<0)
        s.scroll.y=0;

    el.scrollTo(0,s.scroll.y);
    s=el.getSize();

    var hide=s.scrollSize.y<=s.size.y;

	var arrow_up_y_size=10;
    var arrow_down_y_size=10;

    var dim_y=1.*s.size.y - arrow_up_y_size - arrow_down_y_size - 20;
    var pos_y=1.*s.scroll.y/s.scrollSize.y;

    if(!el.my_up || !el.my_middle || !el.my_down)
        return;

    var m1=1.*s.scroll.y/s.scrollSize.y * dim_y - g_min_middle_height/2 + 10;
    var m2=g_min_middle_height;
	var m3=dim_y - (m1 + m2);

    if(!hide) {
        el.my_middle.style.marginTop=String(Math.floor(m1))+"px";
        el.my_middle.style.height=String(Math.floor(m2))+"px";
        el.my_middle.style.marginBottom=String(Math.floor(m3))+"px";
    }

    el.my_up.style.visibility=hide ? "hidden" : "visible";
    el.my_middle.style.visibility=hide ? "hidden" : "visible";
    el.my_down.style.visibility=hide ? "hidden" : "visible";
}

function arrow_up_down(el,by)
{
    var s=el.getSize();
    s.scroll.y+=by*10;
    do_move(el,s);
}

function arrow_auto()
{
    if(g_down)
        arrow_up_down(g_down,g_scroll_by);

    setTimeout("arrow_auto();",100);
}

function arrow_do_drag(el,diff_y)
{
    var s=el.getSize();
    if(!g_scroll_drag_y_start)
        g_scroll_drag_y_start=s.scroll.y;
    s.scroll.y=g_scroll_drag_y_start+1.*diff_y/s.size.y*(s.scrollSize.y+s.size.y);
    do_move(el,s);
}

function arrow_drag(e)
{
    if(g_scroll_drag_y!==null) {
        arrow_do_drag(g_scroll_drag,e.page.y-g_scroll_drag_y);
    } else {
        g_scroll_drag_y=e.page.y;
    }
}

function bind_wheel_on_children(base,el)
{
    el.removeEvents('mousewheel');
    el.addEvent('mousewheel',function(event) {
        event=new Event(event);
        event.stop();
        arrow_up_down(this,-event.wheel*4);
    }.bind(base));

    for(var i1=0; i1<el.getChildren().length; ++i1) {
        bind_wheel_on_children(base,el.getChildren()[i1]);
    }
}

var g_scroll_processed=false;

function process_scrollers()
{
    var els;

    els=document.getElementsByTagName('div');
    for(i1=0; i1<els.length; ++i1) {
        var el=els[i1];
        {
            var last=null;
            if(el.className=='scrolling1')
                last=g_scrollers[1]=el;
            else if(el.className=='scrolling2')
                last=g_scrollers[2]=el;
            else if(el.className=='scrolling3')
                last=g_scrollers[3]=el;
            else if(el.className=='scrolling4')
                last=g_scrollers[4]=el;
            if(last) {
                //if(!$defined(el.my_offset))
                el.my_offset=0;
                if(false && window.ie7) {
                    // FIXME: !
                    // workaround for ie7's bug
                    bind_wheel_on_children(el,el);
                } else {
                    last.removeEvents('mousewheel');
                    last.addEvent('mousewheel',function(event) {
                        event=new Event(event);
                        event.stop();
                        arrow_up_down(this,-event.wheel*4);
                    }.bind(last));
                }
            }
        }

        {
            var last=null;
            if(el.className=='arrow_middle1')
                last=g_scrollers[1];
            else if(el.className=='arrow_middle2')
                last=g_scrollers[2];
            else if(el.className=='arrow_middle3')
                last=g_scrollers[3];
            else if(el.className=='arrow_middle4')
                last=g_scrollers[4];
            if(last) {
                last.my_middle=el;
                el.my_base=last;

                el.removeEvents('mousedown');
                el.addEvent('mousedown',function(event) {
                    event=new Event(event);
                    event.stop();

                    g_scroll_drag_y=null;
                    g_scroll_drag_y_start=null;
                    g_scroll_drag=this.my_base;

                    document.removeEvents('mouseup');
                    document.addEvent('mouseup',function(event) {
                        new Event(event).stop();
                        document.removeEvents('mouseup');
                        document.removeEvents('mousemove');
                        g_scroll_drag=null;
                    });

                    document.removeEvents('mousemove');
                    document.addEvent('mousemove',function(event) {
                        var e=new Event(event);
                        e.stop();
                        if(g_scroll_drag)
                            arrow_drag(e);
                    });
                }.bind(el));
            }
        }
    }

    els=document.getElementsByTagName('img');
    for(i1=0; i1<els.length; ++i1) {
        el=els[i1];
        {
            var last=null;
            if(el.className=='arrow_up1')
                last=g_scrollers[1];
            else if(el.className=='arrow_up2')
                last=g_scrollers[2];
            else if(el.className=='arrow_up3')
                last=g_scrollers[3];
            else if(el.className=='arrow_up4')
                last=g_scrollers[4];
            if(last) {
                last.my_up=el;

                el.my_base=last;

                el.removeEvents('mousedown');
                el.addEvent('mousedown',function() { g_down=this; g_scroll_by=-1; }.bind(last));

                el.removeEvents('mouseup');
                el.addEvent('mouseup',function() { g_down=null; });

                el.removeEvents('mouseout');
                el.addEvent('mouseout',function() { g_down=null; });
            }
        }

        {
            var last=null;
            if(el.className=='arrow_down1')
                last=g_scrollers[1];
            else if(el.className=='arrow_down2')
                last=g_scrollers[2];
            else if(el.className=='arrow_down3')
                last=g_scrollers[3];
            else if(el.className=='arrow_down4')
                last=g_scrollers[4];
            if(last) {
                last.my_down=el;
                el.my_base=last;

                el.removeEvents('mousedown');
                el.addEvent('mousedown',function() { g_down=this; g_scroll_by=1; }.bind(last));

                el.removeEvents('mouseup');
                el.addEvent('mouseup',function() { g_down=null; });

                el.removeEvents('mouseout');
                el.addEvent('mouseout',function() { g_down=null; });
            }
        }
    }

    if(g_scrollers[1])
        do_move(g_scrollers[1],g_scrollers[1].getSize());
    if(g_scrollers[2])
        do_move(g_scrollers[2],g_scrollers[2].getSize());
    if(g_scrollers[3])
        do_move(g_scrollers[3],g_scrollers[3].getSize());
    if(g_scrollers[4])
        do_move(g_scrollers[4],g_scrollers[4].getSize());

    arrow_auto();
}

