/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var ngAnimate = require('@angular/animations');

/**
 * FdsAnimations constructor.
 *
 * @constructor
 */
function FdsAnimations() {
};

FdsAnimations.prototype = {
    constructor: FdsAnimations,

    /**
     * Fade animation
     */
    fadeAnimation: ngAnimate.trigger('routeAnimation', [
        ngAnimate.state('*',
            ngAnimate.style({
                opacity: 1
            })
        ),
        ngAnimate.transition(':enter', [
            ngAnimate.style({
                opacity: 0
            }),
            ngAnimate.animate('0.5s ease-in')
        ]),
        ngAnimate.transition(':leave', [
            ngAnimate.animate('0.5s ease-out', ngAnimate.style({
                opacity: 0
            }))
        ])
    ]),

    /**
     * Slide in from the left animation
     */
    slideInLeftAnimation: ngAnimate.trigger('routeAnimation', [
        ngAnimate.state('*',
            ngAnimate.style({
                opacity: 1,
                transform: 'translateX(0)'
            })
        ),
        ngAnimate.transition(':enter', [
            ngAnimate.style({
                opacity: 0,
                transform: 'translateX(-100%)'
            }),
            ngAnimate.animate('0.5s ease-in')
        ]),
        ngAnimate.transition(':leave', [
            ngAnimate.animate('0.5s ease-out', ngAnimate.style({
                opacity: 0,
                transform: 'translateX(100%)'
            }))
        ])
    ]),

    /**
     * Slide in from the top animation
     */
    slideInDownAnimation: ngAnimate.trigger('routeAnimation', [
        ngAnimate.state('*',
            ngAnimate.style({
                opacity: 1,
                transform: 'translateY(0)'
            })
        ),
        ngAnimate.transition(':enter', [
            ngAnimate.style({
                opacity: 0,
                transform: 'translateY(-100%)'
            }),
            ngAnimate.animate('0.5s ease-in')
        ]),
        ngAnimate.transition(':leave', [
            ngAnimate.animate('0.5s ease-out', ngAnimate.style({
                opacity: 0,
                transform: 'translateY(100%)'
            }))
        ])
    ]),

    /**
     * Fly in/out animation
     */
    flyInOutAnimation: ngAnimate.trigger('flyInOut', [
        ngAnimate.state('in',
            ngAnimate.style({transform: 'translateX(0)'})
        ),
        ngAnimate.transition('void => *', [
            ngAnimate.style({transform: 'translateX(100%)'}),
            ngAnimate.animate('0.4s 0.1s ease-in')
        ]),
        ngAnimate.transition('* => void', ngAnimate.animate('0.2s ease-out', ngAnimate.style({transform: 'translateX(-100%)'})))
    ]),

    /**
     * Fly in/out animation
     */
    fadeInOutAnimation: ngAnimate.trigger('fadeInOut', [
        ngAnimate.state('in',
            ngAnimate.style({opacity: 1})
        ),
        ngAnimate.transition('void => *', [
            ngAnimate.style({opacity: 0}),
            ngAnimate.animate('0.5s 0.1s ease-in')
        ]),
        ngAnimate.transition('* => void', ngAnimate.animate('0.5s ease-out', ngAnimate.style({opacity: 0})))
    ])

};

module.exports = new FdsAnimations();
