BackgroundOffset.js #1

  • //
  • guest/
  • perforce_software/
  • chronicle/
  • main/
  • application/
  • ui/
  • resources/
  • dojo/
  • ui/
  • BackgroundOffset.js
  • View
  • Commits
  • Open Download .zip Download (6 KB)
// summary:
// Manages background offset require to present the toolbar, notifications, etc.

if (!dojo._hasResource['p4cms.ui.BackgroundOffset']) {
    dojo._hasResource['p4cms.ui.BackgroundOffset'] = true;
    dojo.provide('p4cms.ui.BackgroundOffset');

    // closure for singleton values
    p4cms.ui._bgo = {
        bgOffset:       0,
        leftPos:        0,
        topPos:         0,
        paddingTop:     0,
        toolbarHeight:  0,
        ptPos:          0
    };

    p4cms.ui.BackgroundOffset.increase = function(pixels) {
        p4cms.ui.BackgroundOffset._applyOffset(parseInt(pixels, 10));
    };

    p4cms.ui.BackgroundOffset.decrease = function(pixels) {
        p4cms.ui.BackgroundOffset._applyOffset(-parseInt(pixels, 10));
    };

    p4cms.ui.BackgroundOffset.get = function() {
        if (typeof p4cms.ui._bgo.originalBP === 'undefined') {
            p4cms.ui.BackgroundOffset._parseBackgroundPosition();
        }
        return p4cms.ui._bgo.topPos;
    };

    p4cms.ui.BackgroundOffset.getWindowDimensions = function() {
        var de = document.documentElement;
        var width = window.self.innerWidth
                  || (de && de.clientWidth)
                  || document.body.clientWidth;

        // webkit positions percentage backgrounds against window height
        var height = window.self.innerHeight
                  || (de && de.clientHeight)
                  || document.body.clientHeight;

        // mozilla positions percentage background against content height
        if (dojo.isMozilla) {
            var cs = document.defaultView.getComputedStyle(dojo.body(), false);
            height = Math.floor(parseFloat(cs.height)) - p4cms.ui._bgo.toolbarHeight;
        }

        return {
            'width':  width,
            'height': height
        };
    };

    p4cms.ui.BackgroundOffset.cleanupUrl = function(url) {
        var regExp = /^url\(["']?(.+?)["']?\)$/ig,
            matches = regExp.exec(url);
        if (!matches) {
            matches = regExp.exec(url);
        }

        return (!matches || typeof matches[1] === 'undefined')
            ? null
            : matches[1];
    };

    p4cms.ui.getBGimageDimensions = function() {
        var dim = { 'width':  0, 'height': 0 },
            bgImage = dojo.style(dojo.body(), 'backgroundImage');
        if (typeof bgImage === 'undefined') {
            return dim;
        }

        bgImage = p4cms.ui.BackgroundOffset.cleanupUrl(bgImage);
        var image = dojo.create('img', { 'src': bgImage });
        dim.width = image.width;
        dim.height = image.height;

        return dim;
    };

    p4cms.ui.BackgroundOffset.toPx = function(dimension, horizontal, useBgImg) {
        horizontal = horizontal ? true : false;
        useBgImg   = useBgImg   ? true : false;

        var dValue = parseFloat(dimension);
        if (dValue === 0.0) {
            return '0px';
        }

        var units = 'px';
        if (dimension.indexOf('%') >= 0) {
            units = '%';
        }

        var fontSize = 16.0;
        if (dimension.indexOf('em') >= 0) {
            units = 'em';
            fontSize = parseFloat(dojo.style(dojo.body(), 'fontSize'));
        }

        // if already in px, no-op
        if (units === 'px') {
            return dimension;
        }

        var area = p4cms.ui.BackgroundOffset.getWindowDimensions();
        var areaLength = horizontal ? area.width : area.height;

        var pixels = 0;
        if (units === '%' && areaLength > 0.0) {
            pixels = dValue * areaLength / 100;
        } else if (units === 'em' && areaLength > 0.0) {
            pixels = dValue * fontSize;
            if (dojo.isIE && (fontSize / areaLength) > 0.0) {
                pixels = 16 * pixels / areaLength;
            }
        }
        pixels = Math.ceil(pixels);

        if (useBgImg) {
            var bgImgArea = p4cms.ui.getBGimageDimensions();
            var bgImgLength = horizontal ? bgImgArea.width : bgImgArea.height;
            pixels -= dValue * bgImgLength / 100;
        }

        return Math.floor(pixels) + 'px';
    };

    p4cms.ui.BackgroundOffset.reset = function() {
        p4cms.ui._bgo.topPos = 0;
        p4cms.ui._bgo.ptPos = 0;
        if (typeof p4cms.ui._bgo.originalBP !== 'undefined') {
            dojo.style(dojo.body(), 'backgroundPosition', p4cms.ui._bgo.originalBP);
            dojo.style(dojo.body(), 'paddingTop', p4cms.ui._bgo.originalPT);
        }
        p4cms.ui._bgo.originalBP = undefined;
        p4cms.ui._bgo.originalPT = undefined;
    };

    p4cms.ui.BackgroundOffset._parseBackgroundPosition = function() {
        var bp = dojo.style(dojo.body(), 'backgroundPosition');
        p4cms.ui._bgo.originalBP = bp;

        if (bp && bp !== '') {
            var index = bp.indexOf(' ');
            p4cms.ui._bgo.leftPos = bp.substring(0, index);
            var topPos = p4cms.ui.BackgroundOffset.toPx(bp.substring(index), false, true);
            p4cms.ui._bgo.topPos = topPos;
        } else {
            p4cms.ui._bgo.topPos = '0px';
        }

        var pt = dojo.style(dojo.body(), 'paddingTop');
        p4cms.ui._bgo.originalPT = pt;
        if (pt === '') {
            pt = 0;
        }
        p4cms.ui._bgo.ptPos = p4cms.ui.BackgroundOffset.toPx(pt);
    };

    p4cms.ui.BackgroundOffset._applyOffset = function(offset) {
        if (!offset) {
            return;
        }

        if (typeof p4cms.ui._bgo.originalBP === 'undefined') {
            p4cms.ui.BackgroundOffset._parseBackgroundPosition();
        }

        // only adjust background positions specified in pixels.
        var topPos = p4cms.ui._bgo.topPos || "";
        var bgAdjust = p4cms.ui._bgo.originalBP;
        if (topPos.indexOf('px') >= 0) {
            topPos = parseFloat(topPos) + offset;
            p4cms.ui._bgo.topPos = topPos + 'px';

            var leftPos = p4cms.ui._bgo.leftPos;
            bgAdjust = leftPos + ' ' + topPos + 'px';
        }

        var ptPos = parseFloat(p4cms.ui._bgo.ptPos) + offset;
        p4cms.ui._bgo.ptPos = ptPos;
        dojo.style(dojo.body(), 'paddingTop', ptPos + 'px');
        dojo.style(dojo.body(), 'backgroundPosition', bgAdjust);
    };
}
# Change User Description Committed
#1 16170 perforce_software Move Chronicle files to follow new path scheme for branching.
//guest/perforce_software/chronicle/application/ui/resources/dojo/ui/BackgroundOffset.js
#1 8972 Matt Attaway Initial add of the Chronicle source code