
function $(id) { return document.getElementById(id); }

function getEvent(e) {
    if(!e) {
        e = window.event;
    }
    
    return e;
}

/* 
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
    if(element) {
        if (element.addEventListener) {
            element.addEventListener(eventType, lamdaFunction, useCapture);
            return true;
        }
        else if (element.attachEvent) {
            var r = element.attachEvent('on' + eventType, lamdaFunction);
            return r;
        }
    } 

    return false;
}

/* 
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
    if (eventObject && eventObject.stopPropagation) {
        eventObject.stopPropagation();
    }
    
    if (window.event && window.event.cancelBubble ) {
        window.event.cancelBubble = true;
    }
    
    if (eventObject && eventObject.preventDefault) {
        eventObject.preventDefault();
    }
    
    if (window.event) {
        window.event.returnValue = false;
    }
}

function getOffsetTop(object)
{
    var top = object.offsetTop;
    var parentNode = object.offsetParent;
    while(parentNode)
    {
        top += parentNode.offsetTop;
        parentNode = parentNode.offsetParent;
    }
    
    return top;
}

var windowInnerWidth  = 800;
var windowInnerHeight = 600;
var xMousePos         = 0; 
var yMousePos         = 0;
var xMouseCap         = 0; 
var yMouseCap         = 0;
var mouseIsDown       = 0;
var scrollCap         = 0;
var lastYMousePos     = -1;

var contentTable;
var scrollUp;
var scrollDown;
var scrollBar;
var scrollBarTable;
var main;
var main_;

function captureMousePosition(e) {
    knackerEvent(e);
    xMousePos = e.clientX;
    yMousePos = e.clientY;
        
    if(mouseIsDown) {
        if(yMouseCap != yMousePos && lastYMousePos != yMousePos) {
            var pos = scrollCap - 117 + yMousePos - yMouseCap;
            
            if(pos < 11) {
                pos = 11;
            }
            if(pos + scrollBar.offsetHeight > main_.offsetHeight - 11) {
                pos = main_.offsetHeight - 11 - scrollBar.offsetHeight;
            }

            scrollBar.style.top = pos + 'px';
            main.style.top      = (-1 * (pos - 11) * main.offsetHeight / (main_.offsetHeight - 22)) + 'px';
            lastYMousePos       = yMousePos;
        }
    }
}

function init() {
    if(window.innerWidth) {
        windowInnerWidth  = window.innerWidth;
        windowInnerHeight = window.innerHeight;
    }
    else if(document.documentElement.clientWidth) {
        windowInnerWidth  = document.documentElement.clientWidth;
        windowInnerHeight = document.documentElement.clientHeight;
    }
    else if(document.body.clientWidth) {
        windowInnerWidth  = document.body.clientWidth;
        windowInnerHeight = document.body.clientHeight;
    }

    contentTable     = $('contentTable');
    scrollUp         = $('scrollUp');
    scrollDown       = $('scrollDown');
    scrollBar        = $('scrollBar');
    scrollBarTable   = $('scrollBarTable');
    main             = $('main');
    main_            = $('main_');

    var parent       = contentTable.offsetParent;
    var offsetTop    = contentTable.offsetTop;

    while(parent) {
        offsetTop += parent.offsetTop;
        parent     = parent.offsetParent;
    }

    var height                        = windowInnerHeight - offsetTop - 51;
    contentTable.rows[1].style.height = height + 'px';
    main_.style.height                = height + 'px';

    updateScrollBar();
    addEvent(scrollDown, 'click',     scrollingDown,        false);
    addEvent(scrollDown, 'dblclick',  scrollingDown,        false);
    addEvent(scrollUp,   'click',     scrollingUp,          false);
    addEvent(scrollUp,   'dblclick',  scrollingUp,          false);
    addEvent(scrollBar,  'mousedown', mouseDown,            false);
    addEvent(document,   'mouseup',   mouseUp,              false);
    addEvent(document,   'mousemove', captureMousePosition, false);
}

function mouseDown(e) {
    knackerEvent(e);
    mouseIsDown = 1;
    xMouseCap   = xMousePos;
    yMouseCap   = yMousePos;
    scrollCap   = scrollBar.offsetTop;
}

function mouseUp(e) {
    knackerEvent(e);
    mouseIsDown = 0;
    xMouseCap   = 0;
    yMouseCap   = 0;
}

function scrollingUp(e) {
    knackerEvent(e);
    main.style.top = (main.offsetTop + 75) + 'px';
    if(main.offsetTop > 0) {
        main.style.top = '0px';
    }
    updateScrollBar();
}

function scrollingDown(e) {
    knackerEvent(e);
    main.style.top = (main.offsetTop - 75) + 'px';
    if(main.offsetHeight + main.offsetTop < main_.offsetHeight) {
        main.style.top = (main_.offsetHeight - main.offsetHeight) + 'px';
    }
    updateScrollBar();
}

function updateScrollBar() {
    var height                          = (main_.offsetHeight - 22) * main_.offsetHeight / main.offsetHeight;
    scrollBar.style.height              = height + 'px';
    scrollBarTable.rows[1].style.height = (height - 16) + 'px';
    scrollBar.style.top                 = (11 + (main_.offsetHeight - 22) * main.offsetTop * -1 / main.offsetHeight) + 'px';
}

addEvent(window, 'load', init, false);

