123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
- define(["jquery"], function ($) {
- // This isn't really a "module" since it just patches jQuery itself
- // FIX ME Animations TO DO
- // walkthrough animations go here
- // animate participant cursor and box popping in when they enter the session
- // animate participant cursor and box popping out when they leave the session
- // animate the participant cursor -> rotate down when they're down the page
- $.fn.rotateCursorDown = function () {
- $('svg').animate({borderSpacing: -150, opacity: 1}, {
- step: function(now, fx) {
- if (fx.prop == "borderSpacing") {
- $(this).css('-webkit-transform', 'rotate('+now+'deg)')
- .css('-moz-transform', 'rotate('+now+'deg)')
- .css('-ms-transform', 'rotate('+now+'deg)')
- .css('-o-transform', 'rotate('+now+'deg)')
- .css('transform', 'rotate('+now+'deg)');
- } else {
- $(this).css(fx.prop, now);
- }
- },
- duration: 500
- }, 'linear').promise().then(function () {
- this.css('-webkit-transform', '');
- this.css('-moz-transform', '');
- this.css('-ms-transform', '');
- this.css('-o-transform', '');
- this.css('transform', '');
- this.css("opacity", "");
- });
- };
- // animate the participant cursor -> rotate up when they're on the same frame as the user
- $.fn.rotateCursorDown = function () {
- $('.togetherjs-cursor svg').animate({borderSpacing: 0, opacity: 1}, {
- step: function(now, fx) {
- if (fx.prop == "borderSpacing") {
- $(this).css('-webkit-transform', 'rotate('+now+'deg)')
- .css('-moz-transform', 'rotate('+now+'deg)')
- .css('-ms-transform', 'rotate('+now+'deg)')
- .css('-o-transform', 'rotate('+now+'deg)')
- .css('transform', 'rotate('+now+'deg)');
- } else {
- $(this).css(fx.prop, now);
- }
- },
- duration: 500
- }, 'linear').promise().then(function () {
- this.css('-webkit-transform', '');
- this.css('-moz-transform', '');
- this.css('-ms-transform', '');
- this.css('-o-transform', '');
- this.css('transform', '');
- this.css("opacity", "");
- });
- };
- // Move notification when another notification slides in //
- /* Pop in window from dock button: */
- $.fn.popinWindow = function () {
- //mobile popout window with no animation
- if($.browser.mobile) {
- //starting position
- this.css({
- left: "0px",
- opacity: 1,
- "zIndex": 8888
- });
- //starting position for arrow
- $('#togetherjs-window-pointer-right').css({
- left: "+=74px",
- opacity: 1,
- "zIndex": 8888
- });
- //animate arrow out
- $('#togetherjs-window-pointer-right').animate({
- opacity: 1,
- left: "-=78px"
- }, {
- duration:60, easing:"linear"
- });
- $('#togetherjs-window-pointer-right').queue();
- //bounce arrow back
- $('#togetherjs-window-pointer-right').animate({
- left:'+=4px'
- }, {
- duration:60, easing:"linear"
- });
- //animate window out
- this.animate({
- opacity: 1,
- left: "0px"
- }, {
- duration:60, easing:"linear"
- });
- this.queue();
- //bounce window back
- this.animate({
- left:'0px'
- }, {
- duration:60, easing:"linear"
- });
- }
- else {
- //starting position
- this.css({
- left: "+=74px",
- opacity: 1,
- "zIndex": 8888
- });
- //starting position for arrow
- $('#togetherjs-window-pointer-right').css({
- left: "+=74px",
- opacity: 1,
- "zIndex": 8888
- });
- //animate arrow out
- $('#togetherjs-window-pointer-right').animate({
- opacity: 1,
- left: "-=78px"
- }, {
- duration:60, easing:"linear"
- });
- $('#togetherjs-window-pointer-right').queue();
- //bounce arrow back
- $('#togetherjs-window-pointer-right').animate({
- left:'+=4px'
- }, {
- duration:60, easing:"linear"
- });
- //animate window out
- this.animate({
- opacity: 1,
- left: "-=78px"
- }, {
- duration:60, easing:"linear"
- });
- this.queue();
- //bounce window back
- this.animate({
- left:'+=4px'
- }, {
- duration:60, easing:"linear"
- });
- }
- };
- /* Slide in notification window: */
- $.fn.slideIn = function () {
- this.css({
- //top: "240px",
- left: "+=74px",
- opacity: 0,
- "zIndex": 8888
- });
- return this.animate({
- "left": "-=74px",
- opacity: 1,
- "zIndex": 9999
- }, "fast");
- };
- /* Used to fade away notification windows + flip the bottom of them out: */
- $.fn.fadeOut = function () {
- this.animate({borderSpacing: -90, opacity: 0.5}, {
- step: function(now, fx) {
- if (fx.prop == "borderSpacing") {
- $(this).css('-webkit-transform', 'perspective( 600px ) rotateX('+now+'deg)')
- .css('-moz-transform', 'perspective( 600px ) rotateX('+now+'deg)')
- .css('-ms-transform', 'perspective( 600px ) rotateX('+now+'deg)')
- .css('-o-transform', 'perspective( 600px ) rotateX('+now+'deg)')
- .css('transform', 'perspective( 600px ) rotateX('+now+'deg)');
- } else {
- $(this).css(fx.prop, now);
- }
- },
- duration: 500
- }, 'linear').promise().then(function () {
- this.css('-webkit-transform', '');
- this.css('-moz-transform', '');
- this.css('-ms-transform', '');
- this.css('-o-transform', '');
- this.css('transform', '');
- this.css("opacity", "");
- });
- return this;
- };
- /* used when user goes down to participant cursor location on screen */
- $.fn.easeTo = function (y) {
- return this.animate({
- scrollTop: y
- }, {
- duration: 400,
- easing: "swing"
- });
- };
- // avatar animate in
- $.fn.animateDockEntry = function () {
- var height = this.height();
- var width = this.width();
- var backgroundSize = height + 4;
- var margin = parseInt(this.css("marginLeft"), 10);
- // set starting position CSS for avatar
- this.css({
- marginLeft: margin + width/2,
- height: 0,
- width: 0,
- backgroundSize: "0 0"
- });
- var self = this;
- //then animate avatar to the actual dimensions, and reset the values
- this.animate({
- marginLeft: margin,
- height: height,
- width: width,
- backgroundSize: backgroundSize
- }, {
- duration: 600
- }).promise().then(function () {
- self.css({
- marginLeft: "",
- height: "",
- width: "",
- backgroundSize: ""
- });
- });
- return this;
- };
- // avatar animate out, reverse of above
- $.fn.animateDockExit = function () {
- // get the current avatar dimenensions
- var height = this.height();
- var width = this.width();
- var backgroundSize = height + 4;
- var margin = parseInt(this.css("marginLeft"), 10);
- //then animate avatar to shrink to nothing, and reset the values again
- // FIXME this needs to animate from the CENTER
- this.animate({
- marginLeft: margin + width/2,
- height: 0,
- width: 0,
- backgroundSize: "0 0",
- opacity: 0
- }, 600 );
- return this;
- };
- $.fn.animateCursorEntry = function () {
- // Make the cursor bubble pop in
- };
- // keyboard typing animation
- $.fn.animateKeyboard = function () {
- var one = this.find(".togetherjs-typing-ellipse-one");
- var two = this.find(".togetherjs-typing-ellipse-two");
- var three = this.find(".togetherjs-typing-ellipse-three");
- var count = -1;
- var run = (function () {
- count = (count+1) % 4;
- if (count === 0) {
- one.css("opacity", 0.5);
- two.css("opacity", 0.5);
- three.css("opacity", 0.5);
- } else if (count == 1) {
- one.css("opacity", 1);
- } else if (count == 2) {
- two.css("opacity", 1);
- } else { // count==3
- three.css("opacity", 1);
- }
- }).bind(this);
- run();
- var interval = setInterval(run, 300);
- this.data("animateKeyboard", interval);
- };
- $.fn.stopKeyboardAnimation = function () {
- clearTimeout(this.data("animateKeyboard"));
- this.data("animateKeyboard", null);
- };
- // FIXME: not sure if this is legit, but at least the modern mobile devices we
- // care about should have this defined:
- if (! $.browser) {
- $.browser = {};
- }
- $.browser.mobile = window.orientation !== undefined;
- if (navigator.userAgent.search(/mobile/i) != -1) {
- // FIXME: At least on the Firefox OS simulator I need this
- $.browser.mobile = true;
- }
- if ($.browser.mobile && window.matchMedia && ! window.matchMedia("screen and (max-screen-width: 480px)").matches) {
- // FIXME: for Firefox OS simulator really:
- document.body.className += " togetherjs-mobile-browser";
- }
- });
|