﻿// SCROLL +++++++++++++++++++++++++++++++++++++//
var __scroll = { sp: 6, fps: 16, timer: 0 };
function setScrollSp(sp) {
    if (typeof sp == "number") {
        this.__scroll.sp = sp;
    }
}
function setScrollFps(fps) {
    if (typeof fps == "number") {
        this.__scroll.fps = fps;
    }
}
function scrollToTop() {
    pageScroll(0, 0);
}
function getScrollLeft() {
    if (navigator.userAgent.indexOf("MSIE") != -1) {
        return (document.compatMode == "CSS1Compat") ? document.documentElement.scrollLeft : document.body.scrollLeft;
    } else {
        return (window.pageXOffset) ? window.pageXOffset : 0;
    }
}
function getScrollTop() {
    if (navigator.userAgent.indexOf("MSIE") != -1) {
        return (document.compatMode == "CSS1Compat") ? document.documentElement.scrollTop : document.body.scrollTop;
    } else {
        return (window.pageYOffset) ? window.pageYOffset : 0;
    }
}
function pageScroll(toX, toY, cuX, cuY) {
    clearTimeout(this.__scroll.timer);
    toX = (!toX || toX < 0) ? 0 : toX;
    toY = (!toY || toY < 0) ? 0 : toY;
    cuX = (!cuX) ? 0 + getScrollLeft() : cuX;
    cuY = (!cuY) ? 0 + getScrollTop() : cuY;
    cuX += (toX - getScrollLeft()) / this.__scroll.sp;
    cuY += (toY - getScrollTop()) / this.__scroll.sp;
    if (cuX < 0) { cuX = 0; }
    if (cuY < 0) { cuY = 0; }
    window.scrollTo(Math.floor(cuX), Math.floor(cuY));
    if (Math.floor(cuX) != toX || Math.floor(cuY) != toY) {
        this.__scroll.timer = setTimeout("pageScroll(" + toX + "," + toY + "," + cuX + "," + cuY + ")", this.__scroll.sp);
    }
}

// SCROLL_PAGE_LINK +++++++++++++++++++++++++++++++++++++//
ScrollClass.prototype.speed = 12;
ScrollClass.prototype.timer = 0;
ScrollClass.prototype.direction = new Object();
ScrollClass.prototype.offset = new Object();

ScrollClass.prototype.isCompatMode = document.compatMode == "CSS1Compat";
ScrollClass.prototype.major = parseInt(navigator.appVersion);
ScrollClass.prototype.minor = parseFloat(navigator.appVersion);
ScrollClass.prototype.isIE = navigator.userAgent.indexOf("MSIE") != -1;
ScrollClass.prototype.isOpera = window.opera;
ScrollClass.prototype.isMozilla = navigator.userAgent.indexOf("Gecko") != -1;
ScrollClass.prototype.isSafari = navigator.userAgent.indexOf('Safari') != -1;
ScrollClass.prototype.isNN = navigator.userAgent.indexOf("Netscape") != -1;
ScrollClass.prototype.isMac = navigator.userAgent.indexOf("Mac") != -1;

var scroll = new ScrollClass();
function ScrollClass() { }
ScrollClass.prototype.setScrollSpeed = function(num) {
    if (typeof num == "number") {
        this.speed = num;
    }
}
ScrollClass.prototype.getScrollSpeed = function() {
    return this.speed;
}
ScrollClass.prototype.getMaxScroll = function() {
    var pos = new Object();
    if (this.isNN) {
        pos.x = this.major <= 5 ? document.documentElement.offsetWidth - window.innerWidth + 16 : document.documentElement.offsetWidth - window.innerWidth + 17;
        pos.y = this.major <= 5 ? document.documentElement.offsetHeight - window.innerHeight + 16 : document.documentElement.offsetHeight - window.innerHeight + 17;
    } else {
        if (this.isMac) {
            if (this.isIE) {
                pos.x = document.body.offsetWidth - document.body.clientWidth + 1;
                pos.y = document.body.offsetHeight - document.body.clientHeight + 1;
            } else {
                pos.x = document.documentElement.offsetWidth - window.innerWidth;
                pos.y = document.documentElement.offsetHeight - window.innerHeight;
            }
        } else {
            pos.x = this.isCompatMode ? document.documentElement.scrollWidth - document.documentElement.clientWidth : document.body.scrollWidth - document.body.clientWidth;
            pos.y = this.isCompatMode ? document.documentElement.scrollHeight - document.documentElement.clientHeight : document.body.scrollHeight - document.body.clientHeight;
        }
    }
    if (pos.x < 0) { pos.x = 0; }
    if (pos.y < 0) { pos.y = 0; }
    return { x: pos.x, y: pos.y };
}
ScrollClass.prototype.getScrollLeft = function() {
    if (this.isIE) {
        return this.isCompatMode ? document.documentElement.scrollLeft : document.body.scrollLeft;
    } else {
        return window.pageXOffset ? window.pageXOffset : 0;
    }
}
ScrollClass.prototype.getScrollTop = function() {
    if (this.isIE) {
        return this.isCompatMode ? document.documentElement.scrollTop : document.body.scrollTop;
    } else {
        return window.pageYOffset ? window.pageYOffset : 0;
    }
}
ScrollClass.prototype.scrollTo = function() {
    clearTimeout(this.timer);
    this.offset.x = null;
    this.offset.y = null;
    var toX = this.parse("x", this.findAnchor(arguments[0]) ? this.getAnchorPos(arguments[0]).x : arguments[0]);
    var toY = this.parse("y", this.findAnchor(arguments[1]) ? this.getAnchorPos(arguments[1]).y : arguments[1]);
    this.direction.is_x = toX - this.getScrollLeft() >= 0 ? true : false;
    this.direction.is_y = toY - this.getScrollTop() >= 0 ? true : false;
    if (this.isOpera) {
        window.scrollTo(toX, toY);
    } else {
        if (this.isMozilla) {
            //toY = toY - 16 > 0 ? toY - 16 : toY;
        }
        this.pageScroll(toX, toY);
    }
}
ScrollClass.prototype.findAnchor = function(id) {
    return (document.getElementsByName(id)[0] || document.anchors[id]);
}
ScrollClass.prototype.getAnchorPos = function(id) {
    if (document.getElementsByName(id)[0]) {
        var element = document.getElementsByName(id)[0];
        var obj = new Object();
        do {
            obj.x = (!obj.x) ? element.offsetLeft : obj.x + element.offsetLeft;
            obj.y = (!obj.y) ? element.offsetTop : obj.y + element.offsetTop;
        } while ((element = element.offsetParent) != null);
        return { x: obj.x < 0 ? 0 : obj.x, y: obj.y };
    } else if (document.layers) {
        var element = document.anchors[id];
        return { x: element.x, y: element.y };
    } else {
        return { x: 0, y: 0 };
    }
}
ScrollClass.prototype.parse = function(direction, value) {
    var maxScroll = this.getMaxScroll();
    var range = { min_x: 0, max_x: maxScroll.x, min_y: 0, max_y: maxScroll.y };
    switch (direction) {
        case "x":
            if (typeof value == "boolean") {
                return value ? 0 : this.getScrollLeft();
            } else if (typeof value == "number") {
                if (!this.isOpera) {
                    if (value < 0) {
                        return 0;
                    } else if (value > range.max_x) {
                        return range.max_x;
                    }
                }
                return value;
            } else if (typeof value == "string") {
                switch (value) {
                    case "left": return 0;
                    case "center": return Math.floor(range.max_x / 2);
                    case "right": return range.max_x;
                    default: this.getScrollLeft();
                }
            }
            return this.getScrollLeft();
            break;
        case "y":
            if (typeof value == "boolean") {
                return value ? 0 : this.getScrollTop();
            } else if (typeof value == "number") {
                if (value < 0) {
                    return 0;
                } else if (value > range.max_y) {
                    return range.max_y;
                }
                return value;
            } else if (typeof value == "string") {
                switch (value) {
                    case "top": return 0;
                    case "middle": return Math.floor(range.max_y / 2);
                    case "bottom": return range.max_y;
                    default: this.getScrollTop();
                }
            }
            return this.getScrollTop();
            break;
    }
}
ScrollClass.prototype.pageScroll = function(toX, toY) {
    clearTimeout(this.timer);
    var dX = this.direction.is_x;
    var dY = this.direction.is_y;
    var scX = this.getScrollLeft();
    var scY = this.getScrollTop();
    var cuX = dX ? Math.ceil((toX - scX) / this.speed) : Math.floor((toX - scX) / this.speed);
    var cuY = dY ? Math.ceil((toY - scY) / this.speed) : Math.floor((toY - scY) / this.speed);
    if (((dX && scX + cuX < toX - 1) || (!dX && scX + cuX > toX + 1)) || ((dY && scY + cuY < toY - 1) || (!dY && scY + cuY > toY + 1))) {
        if (this.offset.x != null && this.offset.y != null) {
            if (this.offset.x == scX && this.offset.y == scY) {
                return;
            } else if ((dX && this.offset.x > scX) || (!dX && this.offset.x < scX)) {
                return;
            } else if ((dY && this.offset.y > scY) || (!dY && this.offset.y < scY)) {
                return;
            }
        }
        window.scrollTo(scX + cuX, scY + cuY);
        this.timer = setTimeout("ScrollClass.prototype.pageScroll(" + toX + "," + toY + ")", this.speed);
        this.offset.x = scX;
        this.offset.y = scY;
    } else {
        clearTimeout(this.timer);
        window.scrollTo(toX, toY);
        return false;
    }
}

