mambax7/extgallery

View on GitHub
assets/js/TosRUs/lib/FlameViewportScale.js

Summary

Maintainability
B
6 hrs
Test Coverage
/*
FlameViewportScale. 0.12. Facilitates a simple viewport scale query.
Optic Swerve, opticswerve.com
Documented at http://menacingcloud.com/?c=viewportScale
*/

/*--------------------------|
| FlameViewportScale        |
|--------------------------*/
function FlameViewportScale() {
    this.delay = 600; // Delay after calling update to account for viewport bounce
    this.orientation;
    this.screenWidth; // Screen width corrected for orientation
    this.timeout;
    this.viewportScale;

    // Get current scale
    //-------------------
    this.getScale = function() {
        this.viewportScale = undefined;

        // Get viewport width
        var viewportWidth = document.documentElement.clientWidth;

        // Abort. Screen width is greater than the viewport width (not fullscreen).
        if(screen.width > viewportWidth) {
            console.log('Aborted viewport scale measurement. Screen width > viewport width');
            return;

        }

        // Get the orientation corrected screen width
        this.updateOrientation();
        this.screenWidth = screen.width;

        if(this.orientation === 'portrait') {
            // Take smaller of the two dimensions
            if(screen.width > screen.height) this.screenWidth = screen.height;

        }
        else {
            // Take larger of the two dimensions
            if(screen.width < screen.height) this.screenWidth = screen.height;

        }

        // Calculate viewport scale
        this.viewportScale = this.screenWidth / window.innerWidth;
        return this.viewportScale;

    };

    // Update viewport orientation
    //-----------------------------
    this.updateOrientation = function() {
        this.orientation = window.orientation;

        if(this.orientation === undefined) {
            // No JavaScript orientation support. Work it out.
            if(document.documentElement.clientWidth > document.documentElement.clientHeight) this.orientation = 'landscape';
            else this.orientation = 'portrait';

        }
        else if(this.orientation === 0 || this.orientation === 180) this.orientation = 'portrait';
        else this.orientation = 'landscape'; // Assumed default, most laptop and PC screens.

    };

    // Update
    //--------
    this.update = function(callback) {
        // Clear timeout if already set
        if(this.timeout !== undefined) {
            clearTimeout(this.timeout);
            this.timeout = undefined;

        }

        if(this.delay > 0) {
            // Delay compensates for viewport bounce
            var viewScale = this;

            this.timeout = setTimeout(function() {
                viewScale.getScale();
                if(callback !== undefined) callback();

            }, this.delay);

        }
        else {
            // Immediate scale update
            this.getScale();
            if(callback !== undefined) callback();

        }

    };

    return true;

}