Showing with 52 additions and 36 deletions.
  1. +52 −36 js/widgets/popup.js
@@ -11,6 +11,20 @@ define( [ "jquery",
//>>excludeEnd("jqmBuildExclude");
(function( $, undefined ) {

function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
var ret = desired;

if ( winSize < segSize ) {
// Center segment if it's bigger than the window
ret = offset + ( winSize - segSize ) / 2;
} else {
// Otherwise center it at the desired coordinate while keeping it completely inside the window
ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
}

return ret;
}

$.widget( "mobile.popup", $.mobile.widget, {
options: {
theme: null,
@@ -95,7 +109,7 @@ define( [ "jquery",
this._ui.screen.height( Math.max( $( window ).height(), this._page.height() ) );
},

_realSetTheme: function( dst, theme ) {
_applyTheme: function( dst, theme ) {
var classes = ( dst.attr( "class" ) || "").split( " " ),
alreadyAdded = true,
currentTheme = null,
@@ -122,11 +136,11 @@ define( [ "jquery",
},

_setTheme: function( value ) {
this._realSetTheme( this._ui.container, value );
this._applyTheme( this._ui.container, value );
},

_setOverlayTheme: function( value ) {
this._realSetTheme( this._ui.screen, value );
this._applyTheme( this._ui.screen, value );

if ( $.mobile.browser.ie ) {
this._ui.screen.toggleClass(
@@ -174,20 +188,6 @@ define( [ "jquery",

// Try and center the overlay over the given coordinates
_placementCoords: function( x, y ) {
function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
var ret = desired;

if ( winSize < segSize ) {
// Center segment if it's bigger than the window
ret = offset + ( winSize - segSize ) / 2;
} else {
// Otherwise center it at the desired coordinate while keeping it completely inside the window
ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
}

return ret;
}

// Tolerances off the window edges
var tol = { l: 10, t: 30, r: 10, b: 30 },
// rectangle within which the popup must fit
@@ -250,34 +250,34 @@ define( [ "jquery",
self._prereqs = prereqs;
},

_animate: function( additionalCondition, transition, classToRemove, screenClassToAdd, containerClassToAdd, applyTransition, prereqs ) {
_animate: function( args ) {
var self = this;

if ( self.options.overlayTheme && additionalCondition ) {
if ( self.options.overlayTheme && args.additionalCondition ) {
self._ui.screen
.removeClass( classToRemove )
.addClass( screenClassToAdd )
.removeClass( args.classToRemove )
.addClass( args.screenClassToAdd )
.animationComplete( function() {
prereqs.screen.resolve();
args.prereqs.screen.resolve();
});
} else {
prereqs.screen.resolve();
args.prereqs.screen.resolve();
}

if ( transition && transition !== "none" ) {
if ( applyTransition ) { self._applyTransition( transition ); }
if ( args.transition && args.transition !== "none" ) {
if ( args.applyTransition ) { self._applyTransition( args.transition ); }
self._ui.container
.addClass( containerClassToAdd )
.removeClass( classToRemove )
.addClass( args.containerClassToAdd )
.removeClass( args.classToRemove )
.animationComplete( function() {
prereqs.container.resolve();
args.prereqs.container.resolve();
});
} else {
prereqs.container.resolve();
args.prereqs.container.resolve();
}
},

_realOpen: function( x, y, transition ) {
_open: function( x, y, transition ) {
var self = this,
coords = self._placementCoords(
( undefined === x ? window.innerWidth / 2 : x ),
@@ -320,10 +320,18 @@ define( [ "jquery",
top: coords.y
});

self._animate( true, transition, "", "in", "in", false, self._prereqs );
self._animate({
additionalCondition: true,
transition: transition,
classToRemove: "",
screenClassToAdd: "in",
containerClassToAdd: "in",
applyTransition: false,
prereqs: self._prereqs
});
},

_realClose: function() {
_close: function() {
var self = this,
transition = ( self._currentTransition ? self._currentTransition : self.options.transition );

@@ -349,7 +357,15 @@ define( [ "jquery",
self.element.trigger( "closed" );
});

self._animate( self._ui.screen.hasClass( "in" ), transition, "in", "out", "reverse out", true, self._prereqs );
self._animate( {
additionalCondition: self._ui.screen.hasClass( "in" ),
transition: transition,
classToRemove: "in",
screenClassToAdd: "out",
containerClassToAdd: "reverse out",
applyTransition: true,
prereqs: self._prereqs
});
},

_destroy: function() {
@@ -379,7 +395,7 @@ define( [ "jquery",
// array of: {
// open: true/false
// popup: popup
// args: args for _realOpen
// args: args for _open
// }
_actionQueue: [],
_inProgress: false,
@@ -507,11 +523,11 @@ define( [ "jquery",
return;
}
signal = "opened";
fn = "_realOpen";
fn = "_open";
args = self._actionQueue[0].args;
} else {
signal = "closed";
fn = "_realClose";
fn = "_close";
args = [];
}