/* 
   Filename: scroll.js
   Author:   Falko Zander, falko@falko-zander.de
   Created:  2007-06-07
   Update:   2007-11-13
   
   Abstract: scroll texts in div-boxes without using browser built-in scrollbars.
   optionally use drag and drop or certain objects (images, ...) for scrolling.
   
   Notes:
*/

var scroll_objects = new Array();

function addScrollObject(name, elem_id, parent_id, up_id, down_id, speed, mouse_scroll, wheel_scroll, wheel_speed, time) {
    var cur = new Object();
    scroll_objects.push(cur);
    cur.name = name;

    if (speed == null) speed = 1;
    if (mouse_scroll == null) mouse_scroll = false;
    if (wheel_scroll == null) wheel_scroll = false;
    if (wheel_speed == null) wheel_speed = 10;
    if (time == null) time = 1;
    if (speed < 1) speed = 1;
    if (wheel_speed < 1) wheel_speed = 1;
    if (time < 1) time = 1;
       
    cur.elem = $(elem_id);
    cur.parent_elem = $(parent_id);
    cur.up_elem = $(up_id);
    cur.down_elem = $(down_id);    
    if (cur.elem != null && cur.parent_elem != null &&
        cur.up_elem != null && cur.down_elem != null) {
        cur.elem_top = cur.elem.offsetTop;
     
        var idx = scroll_objects.length-1;
        //up_elem.onmousedown = function() { beginScroll(idx, 0-speed, time); }
        cur.up_elem.onmouseover = function() { beginScroll(idx, 0-speed, time); }
        cur.up_elem.onmouseup = function() { endScroll(idx); }
        cur.up_elem.onmouseout = function() { endScroll(idx); }
        cur.up_elem.style.cursor = "pointer";
        //down_elem.onmousedown = function() { beginScroll(idx, speed, time); }
        cur.down_elem.onmouseover = function() { beginScroll(idx, speed, time); }
        cur.down_elem.onmouseup = function() { endScroll(idx); }
        cur.down_elem.onmouseout = function() { endScroll(idx); }
        cur.down_elem.style.cursor = "pointer";
        
        if (mouse_scroll) {
            cur.elem.onmousedown = function(e) { beginDragScroll(e, idx); }
            cur.elem.onmouseup = function() { endDragScroll(idx); }
            cur.elem.onselectstart = function() { return false; }
            cur.elem.onmouseout = function() { endDragScroll(idx); }
            cur.on_drag = false;
            cur.elem.style.top = cur.elem_top;
            cur.elem.style.cursor = "pointer";
        }
        
        if (wheel_scroll) {
            cur.elem.onmousewheel = function(e) { doWheelScroll(e, idx, wheel_speed); }
            if (cur.elem.addEventListener) {
                cur.elem.addEventListener('DOMMouseScroll', function(e) { doWheelScroll(e, idx, wheel_speed); }, false);
            } else if (cur.elem.attachEvent) {
                cur.elem.attachEvent('onDOMMouseScroll', function(e) { doWheelScroll(e, idx, wheel_speed); });
            }
        }
    }
}

function beginScroll(idx, movement, time) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
    
    cur.interval = window.setInterval(function() { doScroll(idx, movement); }, time);
}

function doScroll(idx, movement) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
        
    scroll_size = cur.elem.offsetHeight - cur.parent_elem.offsetHeight;

    if ((movement > 0 && cur.elem_top < 0) ||
        (movement < 0 && Math.abs(cur.elem_top) < scroll_size)) {
        cur.elem_top += movement;
        cur.elem.style.top = cur.elem_top + "px";
    }
}

function endScroll(idx) {
    var cur = scroll_objects[idx];
    if(cur == null) return;
    
    window.clearInterval(cur.interval);
}

function beginDragScroll(e, idx) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
    
    if (e) {
    	if (typeof e.preventDefault != 'undefined') {
            e.preventDefault();
        }
    }
    
    if (!e) {
        e = window.event;
        document.onmousemove = function(e) { doDragScroll(e, idx); }
    } else {
        window.onmousemove = function(e) { doDragScroll(e, idx); }
    }
            
    cur.last_y = e.clientY;
    cur.on_drag = true;
}

function doDragScroll(e, idx) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
    if (!cur.on_drag) return;
 
    if (!e) e = window.event;
    var movement = e.clientY - cur.last_y;
    
    scroll_size = cur.elem.offsetHeight - cur.parent_elem.offsetHeight;

    if ((movement > 0 && cur.elem_top < 0) ||
        (movement < 0 && Math.abs(cur.elem_top) < scroll_size)) {
        cur.elem_top += movement;
        cur.elem.style.top = cur.elem_top + "px";
    }
    
    cur.last_y = e.clientY;
}

function endDragScroll(idx) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
    
    cur.on_drag = false;
}

function endDragAll() {
    for (var i=0; i<scroll_objects.length; i++) {
        scroll_objects[i].on_drag = false;
    }
}

function doWheelScroll(e, idx, wheel_speed) {
    var cur = scroll_objects[idx];
    if (cur == null) return;
    
    var movement = 0;
    if (!e) e = window.event;
    if (e.wheelDelta) {
        movement = e.wheelDelta / 120;
    } else if (e.detail) {
        movement = -e.detail / 3;
    }
    
    scroll_size = cur.elem.offsetHeight - cur.parent_elem.offsetHeight;

    if ((movement > 0 && cur.elem_top < 0) ||
        (movement < 0 && Math.abs(cur.elem_top) < scroll_size)) {
        cur.elem_top += (movement > 0) ? wheel_speed : -wheel_speed;
        cur.elem.style.top = cur.elem_top + "px";
    }
}

/*
   Copyright Notice:
  
   Copyright 2007, Falko Zander
   ALL RIGHTS RESERVED
   
   UNPUBLISHED -- Use of a copyright notice is precautionary only and
   does not imply publication or disclosure.
   
   THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
   INFORMATION OF FALKO ZANDER. ANY DUPLICATION, MODIFICATION,
   DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS
   STRICTLY PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF
   FALKO ZANDER.
*/
