mambax7/smartfaq

View on GitHub
assets/js/overlib/overlib_followscroll.js

Summary

Maintainability
F
1 wk
Test Coverage
//\/////
//\  overLIB Follow Scroll Plugin
//\  This file requires overLIB 4.00 or later.
//\
//\  overLIB 4.05 - You may not remove or change this notice.
//\  Copyright Erik Bosrup 1998-2004. All rights reserved.
//\  Contributors are listed on the homepage.
//\  See http://www.bosrup.com/web/overlib/ for details.
//   $Revision: 1.2 $                      $Date: 2005/08/15 16:52:04 $
//\/////


////////
// PRE-INIT
// Ignore these lines, configuration is below.
////////
if (typeof olInfo == 'undefined' || olInfo.simpleversion < 400) alert('overLIB 4.00 or later is required for the Follow Scroll Plugin.');
registerCommands('followscroll,followscrollrefresh');


////////
// DEFAULT CONFIGURATION
// You don't have to change anything here if you don't want to. All of this can be
// changed on your html page or through an overLIB call.
////////
// Default value for scroll is not to scroll (0)
if (typeof ol_followscroll == 'undefined') var ol_followscroll = 0;
if (typeof ol_followscrollrefresh == 'undefined') var ol_followscrollrefresh = 100;

////////
// END OF CONFIGURATION
// Don't change anything below this line, all configuration is above.
////////


////////
// INIT
////////
// Runtime variables init. Don't change for config!
var o3_followscroll = 0;
var o3_followscrollrefresh = 100;


////////
// PLUGIN FUNCTIONS
////////
function setScrollVariables() {
    o3_followscroll = ol_followscroll;
    o3_followscrollrefresh = ol_followscrollrefresh;
}

// Parses Shadow and Scroll commands
function parseScrollExtras(pf, i, ar) {
    var k = i, v;
    if (k < ar.length) {
        if (ar[k] == FOLLOWSCROLL) {
            eval(pf + 'followscroll=(' + pf + 'followscroll==0)? 1 : 0');
            return k;
        }
        if (ar[k] == FOLLOWSCROLLREFRESH) {
            eval(pf + 'followscrollrefresh=' + ar[++k]);
            return k;
        }
    }
    return -1;
}


// Function to support scroll feature (overloads default)
function scroll_placeLayer() {
    var placeX, placeY, widthFix = 0;
    var hasAnchor = (typeof o3_anchor != 'undefined' && o3_anchor);

    // HORIZONTAL PLACEMENT
    if (eval('o3_frame.' + docRoot) && eval("typeof o3_frame." + docRoot + ".clientWidth=='number'") && eval('o3_frame.' + docRoot + '.clientWidth')) {
        iwidth = eval('o3_frame.' + docRoot + '.clientWidth');
    } else if (typeof(o3_frame.innerWidth) == 'number') {
        widthFix = Math.ceil(1.2 * (o3_frame.outerWidth - o3_frame.innerWidth));
        iwidth = o3_frame.innerWidth;
    }

    if (hasAnchor) {
        placeX = rmrkPosition[0];
        placeY = rmrkPosition[1];
    } else {
        // Horizontal scroll offset
        winoffset = (olIe4) ? eval('o3_frame.' + docRoot + '.scrollLeft') : o3_frame.pageXOffset;
        var parsedWidth = parseInt(o3_width);

        if (o3_fixx > -1 || o3_relx != null) {
            // Fixed position
            placeX = (o3_relx != null ? ( o3_relx < 0 ? winoffset + o3_relx + iwidth - parsedWidth - widthFix : winoffset + o3_relx) : o3_fixx);
        } else {
            // If HAUTO, decide what to use.
            if (o3_hauto == 1) {
                if ((o3_x - winoffset) > (iwidth / 2)) {
                    o3_hpos = LEFT;
                } else {
                    o3_hpos = RIGHT;
                }
            }

            // From mouse
            if (o3_hpos == CENTER) { // Center
                placeX = o3_x + o3_offsetx - (parsedWidth / 2);

                if (placeX < winoffset) placeX = winoffset;
            }

            if (o3_hpos == RIGHT) { // Right
                placeX = o3_x + o3_offsetx;

                if ((placeX + parsedWidth) > (winoffset + iwidth - widthFix)) {
                    placeX = iwidth + winoffset - parsedWidth - widthFix;
                    if (placeX < 0) placeX = 0;
                }
            }
            if (o3_hpos == LEFT) { // Left
                placeX = o3_x - o3_offsetx - parsedWidth;
                if (placeX < winoffset) placeX = winoffset;
            }

            // Snapping!
            if (o3_snapx > 1) {
                var snapping = placeX % o3_snapx;

                if (o3_hpos == LEFT) {
                    placeX = placeX - (o3_snapx + snapping);
                } else {
                    // CENTER and RIGHT
                    placeX = placeX + (o3_snapx - snapping);
                }

                if (placeX < winoffset) placeX = winoffset;
            }
        }

        // VERTICAL PLACEMENT
        if (eval('o3_frame.' + docRoot) && eval("typeof o3_frame." + docRoot + ".clientHeight=='number'") && eval('o3_frame.' + docRoot + '.clientHeight')) {
            iheight = eval('o3_frame.' + docRoot + '.clientHeight');
        } else if (typeof(o3_frame.innerHeight) == 'number') {
            iheight = o3_frame.innerHeight;
        }

        // Vertical scroll offset
        scrolloffset = (olIe4) ? eval('o3_frame.' + docRoot + '.scrollTop') : o3_frame.pageYOffset;
        var parsedHeight = (o3_aboveheight ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight));

        if (o3_fixy > -1 || o3_rely != null) {
            // Fixed position
            placeY = (o3_rely != null ? (o3_rely < 0 ? scrolloffset + o3_rely + iheight - parsedHeight : scrolloffset + o3_rely) : o3_fixy);
        } else {
            // If VAUTO, decide what to use.
            if (o3_vauto == 1) {
                if ((o3_y - scrolloffset) > (iheight / 2)) {
                    o3_vpos = ABOVE;
                } else {
                    o3_vpos = BELOW;
                }
            }

            // From mouse
            if (o3_vpos == ABOVE) {
                if (o3_aboveheight == 0) o3_aboveheight = parsedHeight;

                placeY = o3_y - (o3_aboveheight + o3_offsety);
                if (placeY < scrolloffset) placeY = scrolloffset;
            } else {
                // BELOW
                placeY = o3_y + o3_offsety;
            }

            // Snapping!
            if (o3_snapy > 1) {
                var snapping = placeY % o3_snapy;

                if (o3_aboveheight > 0 && o3_vpos == ABOVE) {
                    placeY = placeY - (o3_snapy + snapping);
                } else {
                    placeY = placeY + (o3_snapy - snapping);
                }

                if (placeY < scrolloffset) placeY = scrolloffset;
            }
        }
    }

    // Actually move the object.
    repositionTo(over, placeX, placeY);

    if (o3_followscroll && o3_sticky && (o3_relx || o3_rely) && (typeof o3_draggable == 'undefined' || !o3_draggable)) {
        if (typeof over.scroller == 'undefined' || over.scroller.canScroll) over.scroller = new Scroller(placeX - winoffset, placeY - scrolloffset, o3_followscrollrefresh);
    }
}


///////
// SUPPORT ROUTINES FOR SCROLL FEATURE
///////

// Scroller constructor
function Scroller(X, Y, refresh) {
    this.canScroll = 0;
    this.refresh = refresh;
    this.x = X;
    this.y = Y;
    this.timer = setTimeout("repositionOver()", this.refresh);
}

// Removes the timer to stop replacing the layer.
function cancelScroll() {
    if (!o3_followscroll || typeof over.scroller == 'undefined') return;
    over.scroller.canScroll = 1;

    if (over.scroller.timer) {
        clearTimeout(over.scroller.timer);
        over.scroller.timer = null;
    }
}

// Find out how much we've scrolled.
function getPageScrollY() {
    if (o3_frame.pageYOffset) return o3_frame.pageYOffset;
    if (eval(docRoot)) return eval('o3_frame.' + docRoot + '.scrollTop');
    return -1;
}
function getPageScrollX() {
    if (o3_frame.pageXOffset) return o3_frame.pageXOffset;
    if (eval(docRoot)) return eval('o3_frame.' + docRoot + '.scrollLeft');
    return -1;
}

// Find out where our layer is
function getLayerTop(layer) {
    if (layer.pageY) return layer.pageY;
    if (layer.style.top) return parseInt(layer.style.top);
    return -1;
}
function getLayerLeft(layer) {
    if (layer.pageX) return layer.pageX;
    if (layer.style.left) return parseInt(layer.style.left);
    return -1;
}

// Repositions the layer if needed
function repositionOver() {
    var X, Y, pgLeft, pgTop;
    pgTop = getPageScrollY();
    pgLeft = getPageScrollX();
    X = getLayerLeft(over) - pgLeft;
    Y = getLayerTop(over) - pgTop;

    if (X != over.scroller.x || Y != over.scroller.y) repositionTo(over, pgLeft + over.scroller.x, pgTop + over.scroller.y);
    over.scroller.timer = setTimeout("repositionOver()", over.scroller.refresh);
}

////////
// PLUGIN REGISTRATIONS
////////
registerRunTimeFunction(setScrollVariables);
registerCmdLineFunction(parseScrollExtras);
registerHook("hideObject", cancelScroll, FAFTER);
registerHook("placeLayer", scroll_placeLayer, FREPLACE);
//end