/* Gueltig fuer Netscape ab Version 6, Mozilla, Internet Explorer ab Version 4 */

// Scroll aktiv
var scroll_activate = true;

// Das Objekt, das gerade bewegt wird.
var dragobjekt = null;

// Position, an der das Objekt angeklickt wurde.
var dragy = 0;

// Mausposition
var posy = 0;

// Scrollerposition
var scroller_pos = 0;
var last_pos = 0;

// Scrollbar Range
var min_range = 0;
var max_range;

var range;

var position = 0;
var hover = false;
var interval = false;
var isMozilla5 = false;

// object names
var scroll;
var content;
var scrollbar;
var scroller;

// scroll movement horizontal
var horizontal_scroll = false;
var vArea = 0;

function draginit(sl, ct, sb, slr, ho) {
    // Initialisierung der Überwachung der Events
    scroll = sl;
    content = ct;
    scrollbar = sb;
    scroller = slr;
    
    // Minus 22 because the scroller have 22 height and width
    max_range = document.getElementById(scrollbar).offsetHeight - 22;

    if (ho != null) {
        horizontal_scroll = true;
        max_range = document.getElementById(scrollbar).offsetWidth - 22;
        var classes = my_getelementsbyclassname("album_picture_frame");
        for (var i = 0; i < classes.length; ++i) {
            vArea += classes[i].offsetWidth;
        }
        //vArea -= 10;
        if (vArea <= (max_range + 22)) {
            document.getElementById("album_picture").style.width = max_range + 22 + "px";
        } else {
            document.getElementById("album_picture").style.width = vArea + "px";
        }
    }

    document.onmousemove = drag;
    document.onmouseup = dragstop;
    checkForScrollbar();

    if (navigator.userAgent.indexOf('Mozilla/5.0') != -1) {
        isMozilla5 = true;
    }

    if (scroll_activate) {
        var parent = document.getElementById('main');
        parent.onmouseover = activeFieldScroll;
        parent.onmouseout = deactiveFieldScroll;

        var childs = parent.getElementsByTagName('div');
        for (var i = 0; i < childs.length; ++i) {
            childs[i].onmouseover = activeFieldScroll;
            childs[i].onmouseout = deactiveFieldScroll;
        }
    }
}

function dragstart(element) {
    if (scroll_activate) {
        // Wird aufgerufen, wenn ein Objekt bewegt werden soll.
        dragobjekt = element;
        dragy = posy - last_pos;
    }
}

function dragstop() {
    // Wird aufgerufen, wenn ein Objekt nicht mehr bewegt werden soll.
    dragobjekt = null;
}

function drag(ereignis) {
    // Wird aufgerufen, wenn die Maus bewegt wird und bewegt bei Bedarf das Objekt.
    if (horizontal_scroll) {
        posy = document.all ? window.event.clientX : ereignis.pageX;
    } else {
        posy = document.all ? window.event.clientY : ereignis.pageY;
    }

    if(dragobjekt != null) {
        scroller_pos = posy - dragy;
        if (scroller_pos >= min_range && scroller_pos <= max_range) {
            if (horizontal_scroll) {
                dragobjekt.style.left = scroller_pos + "px";
            } else {
                dragobjekt.style.top = scroller_pos + "px";
            }
            last_pos = scroller_pos;
            range = scroller_pos * 100 / max_range;
            // Text markierung verhindern
            disableSelection();

            hover = true;
            scrolli();
        } else {
            dragstop;
        }
    }
}

function dragMouseRoll(dragobjekt, delta) {
    if (scroll_activate) {
        if (horizontal_scroll) {
            scroller_pos -= (delta * 100);
        } else {
            scroller_pos -= (delta * 30);
        }
    }

    if (scroller_pos > max_range) {
        scroller_pos = max_range;
    }

    if (scroller_pos < min_range) {
        scroller_pos = min_range;
    }

    if (scroller_pos >= min_range && scroller_pos <= max_range) {
        if (horizontal_scroll) {
            dragobjekt.style.left = scroller_pos + "px";
        } else {
            dragobjekt.style.top = scroller_pos + "px";
        }
        last_pos = scroller_pos;
        range = scroller_pos * 100 / max_range;

        hover = true;
        scrolli();
    }
}

function scrolli() {
    if (horizontal_scroll) {
        // get height of outer div
        vArea = document.getElementById(content).offsetWidth;
        // get height of scroll div
        var vCont = document.getElementById(scroll).offsetWidth;
        position = (vArea - vCont) * range / 100;
        document.getElementById(content).style.right = position + "px";
    } else {
        // get height of outer div
        var hArea = document.getElementById(content).offsetHeight;
        // get height of scroll div
        var hCont = document.getElementById(scroll).offsetHeight;
        position = (hArea - hCont + 5) * range / 100; // deleted + 20 in hArea - hCont
        document.getElementById(content).style.bottom = position + "px";
    }
}

// Text markieren während des scrollens verhindern
function disableSelection() {
    // IE
    if(document.attachEvent) document.attachEvent("onselectstart",function () { return false; });

    // rest
    if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

function checkForScrollbar() {
    if (horizontal_scroll) {
        if (document.getElementById(content).offsetWidth <= max_range + 22) {
            document.getElementById(scrollbar).style.backgroundImage = "none";
            document.getElementById(scroller).style.display = "none";
            scroll_activate = false;
        }
    } else {
        if (document.getElementById(content).offsetHeight <= max_range + 20) {
            document.getElementById(scrollbar).style.backgroundImage = "none";
            document.getElementById(scroller).style.display = "none";
            scroll_activate = false;
        }
    }
}

/** This is high-level function.
 * It must react to delta being more/less than zero.
 */
function handle(delta) {
    if (delta < 0)
        dragMouseRoll(document.getElementById(scroller), delta);
    else
        dragMouseRoll(document.getElementById(scroller), delta);
}

/** Event handler for mouse wheel event.
 */
function wheel(event){
    var delta = 0;
    if (!event) /* For IE. */
        event = window.event;
    if (event.wheelDelta) { /* IE/Opera. */
        delta = event.wheelDelta/120;
        /** In Opera 9, delta differs in sign as compared to IE.
         */
        if (window.opera) {
            //delta = -delta;
        }
    } else if (event.detail) { /** Mozilla case. */
        /** In Mozilla, sign of delta is different than in IE.
         * Also, delta is multiple of 3.
         */
        delta = -event.detail/3;
    }
    /** If delta is nonzero, handle it.
     * Basically, delta is now positive if wheel was scrolled up,
     * and negative, if wheel was scrolled down.
     */
    if (delta)
        handle(delta);
    /** Prevent default actions caused by mouse wheel.
     * That might be ugly, but we handle scrolls somehow
     * anyway, so don't bother here..
     */
    if (event.preventDefault)
        event.preventDefault();
    event.returnValue = false;
}

function activeFieldScroll() {
    /** Initialization code.
     * If you use your own event management code, change it as required.
     */
    if (window.addEventListener) {
        /** DOMMouseScroll is for mozilla. */
        window.addEventListener('DOMMouseScroll', wheel, false);
    }
    /** IE/Opera. */
    window.onmousewheel = document.onmousewheel = wheel;
}

function deactiveFieldScroll() {
    /** Initialization code.
     * If you use your own event management code, change it as required.
     */
    if (window.addEventListener) {
        /** DOMMouseScroll is for mozilla. */
        window.removeEventListener('DOMMouseScroll', wheel, false);
    }
    /** IE/Opera. */
    window.onmousewheel = document.onmousewheel = null;
}

// own getElementsByClassname because IE doesnt support the official function
function getelementsbyclassname(className, obj) {
    var regex = new RegExp("(^| )" + className + "($| )");
    var allTags = document.getElementsByTagName("*");
    var classes = new Array();
    var i;

    for (i=0; i < allTags.length; i++) {
        if (allTags[i] && allTags[i].className && allTags[i].className != "") {
            if (allTags[i].className.match(regex))
                classes[classes.length] = allTags[i];
        }
    }

    return classes;
}