transition-slide.js 4.77 KB
/*
 * ADOBE CONFIDENTIAL
 *
 * Copyright 2015 Adobe Systems Incorporated
 * All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and may be covered by U.S. and Foreign Patents,
 * patents in process, and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */
(function($, player) {
    'use strict';

    var DEFAULT_TRANSITION_DURATION = 600;

    /**
     * Returns the width of the viewport.
     * @returns {number} the width of the window
     */
    var getViewportWidth = function() {
        return window.innerWidth;
    };

    /**
     * Returns the height of the viewport.
     * @returns {number} the height of the window
     */
    var getViewportHeight = function() {
        return window.innerHeight;
    };

    var initItem = function($item) {
        return $item.css({
            position: 'absolute',
            x: 0,
            y: 0
        });
    };

    /**
     * Generic slide transition
     * @param {jquery} $oldItem Old item
     * @param {jquery} $nextItem next item to show
     * @param {object} before Before state of next item
     * @param {object} after After state of old item
     * @param {function} next fn callback after transition
     * @param {number} duration The duration of the fadeOut and fadeIn animations
     */
    var slide = function($oldItem, $nextItem, before, after, next, duration) {
        // ensure fixed dimensions for more robust transitions on iOS
        after.width = before.width = getViewportWidth() + 'px';
        after.height = before.height = getViewportHeight() + 'px';

        function nextFnc() {
            $oldItem.css({
                x: 0,
                y: 0
            }).hide(0);
            next();
        }
        $nextItem.css(before).show(0).transition({
            x: 0,
            y: 0
        }, duration || DEFAULT_TRANSITION_DURATION);

        $oldItem && $oldItem.css({
            x: 0,
            y: 0
        }).transition(after, duration || DEFAULT_TRANSITION_DURATION, nextFnc) || next();
    };

    var SlideintopTransition = function(strategy) {
        this.strategy = strategy;
        initItem(this.strategy.items());
        return this;
    };

    var SlideinbottomTransition = function(strategy) {
        this.strategy = strategy;
        initItem(this.strategy.items());
        return this;
    };

    var SlideinleftTransition = function(strategy) {
        this.strategy = strategy;
        initItem(this.strategy.items());
        return this;
    };

    var SlideinrightTransition = function(strategy) {
        this.strategy = strategy;
        initItem(this.strategy.items());
        return this;
    };

    SlideintopTransition.prototype.execute = function($oldItem, $newItem, next, duration) {
        slide(
            $oldItem,
            $newItem,
            { y: -getViewportHeight()},
            { y: +getViewportHeight()},
            next,
            duration
        );
    };

    SlideinbottomTransition.prototype.execute = function($oldItem, $newItem, next, duration) {
        slide(
            $oldItem,
            $newItem,
            { y: getViewportHeight()},
            { y: -getViewportHeight()},
            next,
            duration
        );
    };

    SlideinleftTransition.prototype.execute = function($oldItem, $newItem, next, duration) {
        slide(
            $oldItem,
            $newItem,
            { x: -getViewportWidth()},
            { x: getViewportWidth()},
            next,
            duration
        );
    };

    SlideinrightTransition.prototype.execute = function($oldItem, $newItem, next, duration) {
        slide(
            $oldItem,
            $newItem,
            { x: getViewportWidth()},
            { x: -getViewportWidth()},
            next,
            duration
        );
    };

    SlideintopTransition.prototype.destroy = function() {
        this.strategy = null;
    };

    SlideinbottomTransition.prototype.destroy = function() {
        this.strategy = null;
    };

    SlideinleftTransition.prototype.destroy = function() {
        this.strategy = null;
    };

    SlideinrightTransition.prototype.destroy = function() {
        this.strategy = null;
    };

    player.transitions.slideintop = SlideintopTransition;
    player.transitions.slideinbottom = SlideinbottomTransition;
    player.transitions.slideinleft = SlideinleftTransition;
    player.transitions.slideinright = SlideinrightTransition;

}(window.jQuery, window.ScreensPlayer));