Files
filebrowser-durandal-widget/lib/durandal/js/transitions/entrance.js
2015-04-09 07:47:57 +00:00

140 lines
4.4 KiB
JavaScript

/**
* Durandal 2.1.0 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.
* Available via the MIT license.
* see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.
*/
/**
* The entrance transition module.
* @module entrance
* @requires system
* @requires composition
* @requires jquery
*/
define(['durandal/system', 'durandal/composition', 'jquery'], function(system, composition, $) {
var fadeOutDuration = 100;
var endValues = {
left: '0px',
opacity: 1
};
var clearValues = {
left: '',
top: '',
right: '',
bottom:'',
position:'',
opacity: ''
};
var isIE = navigator.userAgent.match(/Trident/) || navigator.userAgent.match(/MSIE/);
var animation = false,
domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
elm = document.createElement('div');
if(elm.style.animationName !== undefined) {
animation = true;
}
if(!animation) {
for(var i = 0; i < domPrefixes.length; i++) {
if(elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
animation = true;
break;
}
}
}
if(animation) {
if(isIE){
system.log('Using CSS3/jQuery mixed animations.');
}else{
system.log('Using CSS3 animations.');
}
} else {
system.log('Using jQuery animations.');
}
function removeAnimationClasses(ele, fadeOnly){
ele.classList.remove(fadeOnly ? 'entrance-in-fade' : 'entrance-in');
ele.classList.remove('entrance-out');
}
/**
* @class EntranceModule
* @constructor
*/
var entrance = function(context) {
return system.defer(function(dfd) {
function endTransition() {
dfd.resolve();
}
function scrollIfNeeded() {
if (!context.keepScrollPosition) {
$(document).scrollTop(0);
}
}
if (!context.child) {
$(context.activeView).fadeOut(fadeOutDuration, endTransition);
} else {
var duration = context.duration || 500;
var $child = $(context.child);
var fadeOnly = !!context.fadeOnly;
var startValues = {
display: 'block',
opacity: 0,
position: 'absolute',
left: fadeOnly || animation ? '0px' : '20px',
right: 0,
top: 0,
bottom: 0
};
function startTransition() {
scrollIfNeeded();
context.triggerAttach();
if (animation) {
removeAnimationClasses(context.child, fadeOnly);
context.child.classList.add(fadeOnly ? 'entrance-in-fade' : 'entrance-in');
setTimeout(function () {
removeAnimationClasses(context.child, fadeOnly);
if(context.activeView){
removeAnimationClasses(context.activeView, fadeOnly);
}
$child.css(clearValues);
endTransition();
}, duration);
} else {
$child.animate(endValues, {
duration: duration,
easing: 'swing',
always: function() {
$child.css(clearValues);
endTransition();
}
});
}
}
$child.css(startValues);
if(context.activeView) {
if (animation && !isIE) {
removeAnimationClasses(context.activeView, fadeOnly);
context.activeView.classList.add('entrance-out');
setTimeout(startTransition, fadeOutDuration);
} else {
$(context.activeView).fadeOut({ duration: fadeOutDuration, always: startTransition });
}
} else {
startTransition();
}
}
}).promise();
};
return entrance;
});