/* Horizontal Tiny Scrolling - a smooth scrolling script for horizontal websites
 (the brother of the vertical "Tiny Scrolling")
 by Marco Rosella - http://www.centralscrutinizer.it/en/design/js-php/horizontal-tiny-scrolling
 v0.1 - March 31, 2006
 */
window.onload = function(){
    HtinyScrolling.init();
    scrollTips.init();
}

var HtinyScrolling = {
    speed: 40, //set here the scroll speed: when this value increase, the speed decrease.
    maxStep: 50, //set here the "uniform motion" step for long distances
    brakeK: 3, //set here the coefficient of slowing down
    hash: null,
    currentBlock: null,
    requestedX: 0,
    init: function(){
        if (navigator.appVersion.indexOf('AppleWebKit') > 0) {
            document.getElementById('scroller').style.display = 'none';
        }
        var lnks = document.getElementsByTagName('a');
        for (var i = 0, lnk; lnk = lnks[i]; i++) {
            if ((lnk.href && lnk.href.indexOf('#') != -1) &&
            ((lnk.pathname == location.pathname) ||
            ('/' + lnk.pathname == location.pathname)) &&
            (lnk.search == location.search)) {
                lnk.onclick = this.initScroll;
            }
        }
    },
    getElementXpos: function(el){
        var x = 0;
        while (el.offsetParent) {
            x += el.offsetLeft;
            el = el.offsetParent;
        }
        return x;
    },
    getScrollLeft: function(){
        if (document.all) 
            return (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;
        else 
            return window.pageXOffset;
    },
    getWindowWidth: function(){
        if (window.innerWidth) 
            return window.innerWidth;
        if (document.documentElement && document.documentElement.clientWidth) 
            return document.documentElement.clientWidth;
    },
    getDocumentWidth: function(){
        if (document.width) 
            return document.width;
        if (document.body.offsetWidth) 
            return document.body.offsetWidth;
    },
    initScroll: function(e){
        var targ;
        if (!e) 
            var e = window.event;
        if (e.target) 
            targ = e.target;
        else 
            if (e.srcElement) 
                targ = e.srcElement;
        HtinyScrolling.hash = targ.href.substr(targ.href.indexOf('#') + 1, targ.href.length);
        HtinyScrolling.currentBlock = document.getElementById(HtinyScrolling.hash);
        if (!HtinyScrolling.currentBlock) 
            return;
        HtinyScrolling.requestedX = HtinyScrolling.getElementXpos(HtinyScrolling.currentBlock);
        HtinyScrolling.scroll(targ);
        return false;
    },
    scroll: function(targ){
        var left = HtinyScrolling.getScrollLeft();
        if (HtinyScrolling.requestedX > left) {
            var endDistance = Math.round((HtinyScrolling.getDocumentWidth() - (left + HtinyScrolling.getWindowWidth())) / HtinyScrolling.brakeK);
            endDistance = Math.min(Math.round((HtinyScrolling.requestedX - left) / HtinyScrolling.brakeK), endDistance);
            var offset = Math.max(2, Math.min(endDistance, HtinyScrolling.maxStep));
        }
        else {
            var offset = -Math.min(Math.abs(Math.round((HtinyScrolling.requestedX - left) / HtinyScrolling.brakeK)), HtinyScrolling.maxStep);
        }
        window.scrollTo(left + offset, 0);
        if (Math.abs(left - HtinyScrolling.requestedX) <= 1 || HtinyScrolling.getScrollLeft() == left) {
            window.scrollTo(HtinyScrolling.requestedX, 0);
            if (typeof XULDocument != 'undefined') {
                location.hash = HtinyScrolling.hash;
            }
            if (window.opera) {
                mark.change_colors(HtinyScrolling.hash, 30, 3500, '#aaaaaa', '#fffbea');
            }
            mark.change_opacity(HtinyScrolling.hash);
            HtinyScrolling.hash = null;
        }
        else 
            setTimeout(HtinyScrolling.scroll, HtinyScrolling.speed);
    }
}

/* the mouse scrolling doesn't work with Opera, that hasn't a event associated to the mouse wheel */

var scrollTips = {
    dx: null,
    init: function(){
        if (window.addEventListener) {
            window.addEventListener("DOMMouseScroll", this.mouseScroll, false);
        }
        else 
            window.onmousewheel = document.onmousewheel = this.mouseScroll;
        var right = document.getElementById('scroll-r');
        right.onmouseover = function(){
            this.dx = setInterval('scrollTips.arrowScroll(1)', 30);
            return false;
        }
        right.onmouseout = function(){
            clearInterval(this.dx);
            return false;
        }
        var left = document.getElementById('scroll-l');
        left.onmouseover = function(){
            this.dx = setInterval('scrollTips.arrowScroll(0)', 30);
            return false;
        }
        left.onmouseout = function(){
            clearInterval(this.dx);
            return false;
        }
    },
    
    mouseScroll: function(e){
        if (!e) 
            var e = window.event;
        if (window.opera) {
            delta = event.wheelDelta / 120;
            delta = -delta;
        }
        if (e.wheelDelta <= 0 || e.detail >= 0) {
            window.scrollBy(30, 0);
        }
        else 
            window.scrollBy(-30, 0);
    },
    
    arrowScroll: function(val){
        if (val == 1) {
            window.scrollBy(30, 0);
        }
        else {
            window.scrollBy(-30, 0)
        }
    }
}

