jquery_mobile_rails 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/lib/jquery_mobile_rails/version.rb +1 -1
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/log/development.log +470 -0
- data/test/dummy/tmp/cache/assets/C8E/8B0/sprockets%2F52156458f704751589bb6d29ec84a52e +0 -0
- data/test/dummy/tmp/cache/assets/CB1/D10/sprockets%2F5827a2184097ddeeb4158ef641f00085 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/CDE/910/sprockets%2F8af59305547610b5be0e9e038bb58f21 +0 -0
- data/test/dummy/tmp/cache/assets/D20/330/sprockets%2Fe76bd3b1395773eefc19cb17743e5846 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D38/BD0/sprockets%2Ffe52d2d1bcf248d028108d0c513e6d79 +0 -0
- data/test/dummy/tmp/cache/assets/D40/4D0/sprockets%2F20f705b59cf5abf8a0a7938b887b11f1 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D5F/7B0/sprockets%2F1792255ae34105be22fabed9ba5e4d15 +0 -0
- data/test/dummy/tmp/cache/assets/D6C/7A0/sprockets%2Ff25aa7e262f1ff93154f29dc914afc20 +0 -0
- data/test/dummy/tmp/cache/assets/D9B/360/sprockets%2Fbb7052d2ba9883c28d4db137e1fb9b6c +0 -0
- data/test/dummy/tmp/cache/assets/DB7/390/sprockets%2Ff800b3c4a4a306067fea026fc7b2bbde +0 -0
- data/test/dummy/tmp/cache/assets/DDC/0B0/sprockets%2F63d8cfc5e184b372b7ec77cca69d4db7 +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E08/030/sprockets%2F21255d26ce8eda2e2e0e69dfbea8cf99 +0 -0
- data/test/dummy/tmp/cache/assets/E1F/BB0/sprockets%2F222d4a2c95dbe3c58acdb1df2a04bff9 +0 -0
- data/test/dummy/tmp/cache/assets/E9D/620/sprockets%2Fcbde7d2f6466ed4a7dddefc773f63eae +0 -0
- data/vendor/assets/images/jquery-mobile/icons-18-black.png +0 -0
- data/vendor/assets/images/jquery-mobile/icons-36-black.png +0 -0
- data/vendor/assets/javascripts/jquery.mobile.js +245 -77
- data/vendor/assets/javascripts/jquery.mobile.min.js +123 -117
- data/vendor/assets/stylesheets/jquery.mobile.css.scss +42 -42
- data/vendor/assets/stylesheets/jquery.mobile.min.css.scss +1 -1
- data/vendor/assets/stylesheets/jquery.mobile.structure.css +33 -11
- data/vendor/assets/stylesheets/jquery.mobile.structure.min.css +2 -2
- metadata +52 -8
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,8 +1,8 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery Mobile Framework 1.0
|
2
|
+
* jQuery Mobile Framework 1.0.1
|
3
3
|
* http://jquerymobile.com
|
4
4
|
*
|
5
|
-
* Copyright 2011 (c) jQuery Project
|
5
|
+
* Copyright 2011-2012 (c) jQuery Project
|
6
6
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
7
7
|
* http://jquery.org/license
|
8
8
|
*
|
@@ -311,7 +311,7 @@ $.widget( "mobile.widget", {
|
|
311
311
|
// TODO remove dependency on the page widget for the keepNative.
|
312
312
|
// Currently the keepNative value is defined on the page prototype so
|
313
313
|
// the method is as well
|
314
|
-
var page = $(target)
|
314
|
+
var page = $.mobile.closestPageData( $(target) ),
|
315
315
|
keepNative = (page && page.keepNativeSelector()) || "";
|
316
316
|
|
317
317
|
$( this.options.initSelector, target ).not( keepNative )[ this.widgetName ]();
|
@@ -422,7 +422,9 @@ $.mobile.browser.ie = (function() {
|
|
422
422
|
div = document.createElement( "div" ),
|
423
423
|
a = div.all || [];
|
424
424
|
|
425
|
-
|
425
|
+
// added {} to silence closure compiler warnings. registering my dislike of all things
|
426
|
+
// overly clever here for future reference
|
427
|
+
while ( div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->", a[ 0 ] ){};
|
426
428
|
|
427
429
|
return v > 4 ? v : !v;
|
428
430
|
})();
|
@@ -1161,7 +1163,37 @@ $.event.special.swipe = {
|
|
1161
1163
|
var win = $( window ),
|
1162
1164
|
special_event,
|
1163
1165
|
get_orientation,
|
1164
|
-
last_orientation
|
1166
|
+
last_orientation,
|
1167
|
+
initial_orientation_is_landscape,
|
1168
|
+
initial_orientation_is_default,
|
1169
|
+
portrait_map = { "0": true, "180": true };
|
1170
|
+
|
1171
|
+
// It seems that some device/browser vendors use window.orientation values 0 and 180 to
|
1172
|
+
// denote the "default" orientation. For iOS devices, and most other smart-phones tested,
|
1173
|
+
// the default orientation is always "portrait", but in some Android and RIM based tablets,
|
1174
|
+
// the default orientation is "landscape". The following code injects a landscape orientation
|
1175
|
+
// media query into the document to figure out what the current orientation is, and then
|
1176
|
+
// makes adjustments to the portrait_map if necessary, so that we can properly
|
1177
|
+
// decode the window.orientation value whenever get_orientation() is called.
|
1178
|
+
if ( $.support.orientation ) {
|
1179
|
+
|
1180
|
+
// Use a media query to figure out the true orientation of the device at this moment.
|
1181
|
+
// Note that we've initialized the portrait map values to 0 and 180, *AND* we purposely
|
1182
|
+
// use a landscape media query so that if the device/browser does not support this particular
|
1183
|
+
// media query, we default to the assumption that portrait is the default orientation.
|
1184
|
+
initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
|
1185
|
+
|
1186
|
+
// Now check to see if the current window.orientation is 0 or 180.
|
1187
|
+
initial_orientation_is_default = portrait_map[ window.orientation ];
|
1188
|
+
|
1189
|
+
// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
|
1190
|
+
// if the initial orientation is portrait, but window.orientation reports 90 or -90, we
|
1191
|
+
// need to flip our portrait_map values because landscape is the default orientation for
|
1192
|
+
// this device/browser.
|
1193
|
+
if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
|
1194
|
+
portrait_map = { "-90": true, "90": true };
|
1195
|
+
}
|
1196
|
+
}
|
1165
1197
|
|
1166
1198
|
$.event.special.orientationchange = special_event = {
|
1167
1199
|
setup: function() {
|
@@ -1230,7 +1262,7 @@ $.event.special.swipe = {
|
|
1230
1262
|
if ( $.support.orientation ) {
|
1231
1263
|
// if the window orientation registers as 0 or 180 degrees report
|
1232
1264
|
// portrait, otherwise landscape
|
1233
|
-
isPortrait = window.orientation
|
1265
|
+
isPortrait = portrait_map[ window.orientation ];
|
1234
1266
|
} else {
|
1235
1267
|
isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
|
1236
1268
|
}
|
@@ -1374,8 +1406,6 @@ $.each({
|
|
1374
1406
|
// part of jQuery BBQ, but also be available separately.
|
1375
1407
|
|
1376
1408
|
(function($,window,undefined){
|
1377
|
-
'$:nomunge'; // Used by YUI compressor.
|
1378
|
-
|
1379
1409
|
// Reused string.
|
1380
1410
|
var str_hashchange = 'hashchange',
|
1381
1411
|
|
@@ -1710,7 +1740,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1710
1740
|
}
|
1711
1741
|
});
|
1712
1742
|
})( jQuery );
|
1713
|
-
/*
|
1743
|
+
/*
|
1714
1744
|
* "core" - The base file for jQm
|
1715
1745
|
*/
|
1716
1746
|
|
@@ -1864,11 +1894,24 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1864
1894
|
}
|
1865
1895
|
e = e.parentNode;
|
1866
1896
|
}
|
1867
|
-
|
1897
|
+
|
1868
1898
|
// Return the theme letter we found, if none, return the
|
1869
1899
|
// specified default.
|
1870
1900
|
|
1871
1901
|
return ltr || defaultTheme || "a";
|
1902
|
+
},
|
1903
|
+
|
1904
|
+
// TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers
|
1905
|
+
//
|
1906
|
+
// Find the closest javascript page element to gather settings data jsperf test
|
1907
|
+
// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
|
1908
|
+
// possibly naive, but it shows that the parsing overhead for *just* the page selector vs
|
1909
|
+
// the page and dialog selector is negligable. This could probably be speed up by
|
1910
|
+
// doing a similar parent node traversal to the one found in the inherited theme code above
|
1911
|
+
closestPageData: function( $target ) {
|
1912
|
+
return $target
|
1913
|
+
.closest(':jqmData(role="page"), :jqmData(role="dialog")')
|
1914
|
+
.data("page");
|
1872
1915
|
}
|
1873
1916
|
});
|
1874
1917
|
|
@@ -2194,6 +2237,19 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2194
2237
|
return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) );
|
2195
2238
|
}
|
2196
2239
|
return (/^#/).test( u.href );
|
2240
|
+
},
|
2241
|
+
|
2242
|
+
|
2243
|
+
// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
|
2244
|
+
// requests if the document doing the request was loaded via the file:// protocol.
|
2245
|
+
// This is usually to allow the application to "phone home" and fetch app specific
|
2246
|
+
// data. We normally let the browser handle external/cross-domain urls, but if the
|
2247
|
+
// allowCrossDomainPages option is true, we will allow cross-domain http/https
|
2248
|
+
// requests to go through our page loading logic.
|
2249
|
+
isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
|
2250
|
+
return $.mobile.allowCrossDomainPages
|
2251
|
+
&& docUrl.protocol === "file:"
|
2252
|
+
&& reqUrl.search( /^https?:/ ) != -1;
|
2197
2253
|
}
|
2198
2254
|
},
|
2199
2255
|
|
@@ -3043,7 +3099,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3043
3099
|
|
3044
3100
|
// Kill the keyboard.
|
3045
3101
|
// XXX_jblas: We need to stop crawling the entire document to kill focus. Instead,
|
3046
|
-
// we should be tracking focus with a
|
3102
|
+
// we should be tracking focus with a delegate() handler so we already have
|
3047
3103
|
// the element in hand at this point.
|
3048
3104
|
// Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
|
3049
3105
|
// is undefined when we are in an IFrame.
|
@@ -3169,13 +3225,12 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3169
3225
|
return path.makeUrlAbsolute( url, base);
|
3170
3226
|
}
|
3171
3227
|
|
3172
|
-
|
3173
3228
|
//The following event bindings should be bound after mobileinit has been triggered
|
3174
3229
|
//the following function is called in the init file
|
3175
3230
|
$.mobile._registerInternalEvents = function(){
|
3176
3231
|
|
3177
3232
|
//bind to form submit events, handle with Ajax
|
3178
|
-
$( "form"
|
3233
|
+
$( document ).delegate( "form", "submit", function( event ) {
|
3179
3234
|
var $this = $( this );
|
3180
3235
|
if( !$.mobile.ajaxEnabled ||
|
3181
3236
|
$this.is( ":jqmData(ajax='false')" ) ) {
|
@@ -3205,8 +3260,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3205
3260
|
|
3206
3261
|
url = path.makeUrlAbsolute( url, getClosestBaseUrl($this) );
|
3207
3262
|
|
3208
|
-
|
3209
|
-
if( path.isExternal( url ) || target ) {
|
3263
|
+
if(( path.isExternal( url ) && !path.isPermittedCrossDomainRequest(documentUrl, url)) || target ) {
|
3210
3264
|
return;
|
3211
3265
|
}
|
3212
3266
|
|
@@ -3314,12 +3368,11 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3314
3368
|
// data. We normally let the browser handle external/cross-domain urls, but if the
|
3315
3369
|
// allowCrossDomainPages option is true, we will allow cross-domain http/https
|
3316
3370
|
// requests to go through our page loading logic.
|
3317
|
-
isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ),
|
3318
3371
|
|
3319
3372
|
//check for protocol or rel and its not an embedded page
|
3320
3373
|
//TODO overlap in logic from isExternal, rel=external check should be
|
3321
3374
|
// moved into more comprehensive isExternalLink
|
3322
|
-
isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !
|
3375
|
+
isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !path.isPermittedCrossDomainRequest(documentUrl, href) );
|
3323
3376
|
|
3324
3377
|
if( isExternal ) {
|
3325
3378
|
httpCleanup();
|
@@ -3342,7 +3395,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3342
3395
|
});
|
3343
3396
|
|
3344
3397
|
//prefetch pages when anchors with data-prefetch are encountered
|
3345
|
-
$( ".ui-page"
|
3398
|
+
$( document ).delegate( ".ui-page", "pageshow.prefetch", function() {
|
3346
3399
|
var urls = [];
|
3347
3400
|
$( this ).find( "a:jqmData(prefetch)" ).each(function(){
|
3348
3401
|
var $link = $(this),
|
@@ -3649,7 +3702,7 @@ $.mobile.page.prototype.options.degradeInputs = {
|
|
3649
3702
|
//auto self-init widgets
|
3650
3703
|
$( document ).bind( "pagecreate create", function( e ){
|
3651
3704
|
|
3652
|
-
var page = $(e.target)
|
3705
|
+
var page = $.mobile.closestPageData( $(e.target) );
|
3653
3706
|
|
3654
3707
|
if( !page ) {
|
3655
3708
|
return;
|
@@ -3711,7 +3764,10 @@ $.widget( "mobile.dialog", $.mobile.widget, {
|
|
3711
3764
|
// this must be an anonymous function so that select menu dialogs can replace
|
3712
3765
|
// the close method. This is a change from previously just defining data-rel=back
|
3713
3766
|
// on the button and letting nav handle it
|
3714
|
-
|
3767
|
+
//
|
3768
|
+
// Use click rather than vclick in order to prevent the possibility of unintentionally
|
3769
|
+
// reopening the dialog if the dialog opening item was directly under the close button.
|
3770
|
+
headerCloseButton.bind( "click", function() {
|
3715
3771
|
self.close();
|
3716
3772
|
});
|
3717
3773
|
|
@@ -3744,7 +3800,7 @@ $.widget( "mobile.dialog", $.mobile.widget, {
|
|
3744
3800
|
});
|
3745
3801
|
|
3746
3802
|
//auto self-init widgets
|
3747
|
-
$( $.mobile.dialog.prototype.options.initSelector
|
3803
|
+
$( document ).delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function(){
|
3748
3804
|
$( this ).dialog();
|
3749
3805
|
});
|
3750
3806
|
|
@@ -3762,7 +3818,7 @@ $.mobile.page.prototype.options.headerTheme = "a";
|
|
3762
3818
|
$.mobile.page.prototype.options.footerTheme = "a";
|
3763
3819
|
$.mobile.page.prototype.options.contentTheme = null;
|
3764
3820
|
|
3765
|
-
$( ":jqmData(role='page'), :jqmData(role='dialog')"
|
3821
|
+
$( document ).delegate( ":jqmData(role='page'), :jqmData(role='dialog')", "pagecreate", function( e ) {
|
3766
3822
|
|
3767
3823
|
var $page = $( this ),
|
3768
3824
|
o = $page.data( "page" ).options,
|
@@ -3952,6 +4008,88 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
3952
4008
|
$( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible();
|
3953
4009
|
});
|
3954
4010
|
|
4011
|
+
})( jQuery );
|
4012
|
+
/*
|
4013
|
+
* "collapsibleset" plugin
|
4014
|
+
*/
|
4015
|
+
|
4016
|
+
(function( $, undefined ) {
|
4017
|
+
|
4018
|
+
$.widget( "mobile.collapsibleset", $.mobile.widget, {
|
4019
|
+
options: {
|
4020
|
+
initSelector: ":jqmData(role='collapsible-set')"
|
4021
|
+
},
|
4022
|
+
_create: function() {
|
4023
|
+
var $el = this.element.addClass( "ui-collapsible-set" ),
|
4024
|
+
o = this.options,
|
4025
|
+
collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" );
|
4026
|
+
|
4027
|
+
// Inherit the theme from collapsible-set
|
4028
|
+
if ( !o.theme ) {
|
4029
|
+
o.theme = $el.jqmData( "theme" );
|
4030
|
+
}
|
4031
|
+
// Inherit the content-theme from collapsible-set
|
4032
|
+
if ( !o.contentTheme ) {
|
4033
|
+
o.contentTheme = $el.jqmData( "content-theme" );
|
4034
|
+
}
|
4035
|
+
|
4036
|
+
// Initialize the collapsible set if it's not already initialized
|
4037
|
+
if ( !$el.jqmData( "collapsiblebound" ) ) {
|
4038
|
+
|
4039
|
+
$el
|
4040
|
+
.jqmData( "collapsiblebound", true )
|
4041
|
+
.bind( "expand collapse", function( event ) {
|
4042
|
+
var isCollapse = ( event.type === "collapse" ),
|
4043
|
+
collapsible = $( event.target ).closest( ".ui-collapsible" ),
|
4044
|
+
widget = collapsible.data( "collapsible" ),
|
4045
|
+
contentTheme = widget.options.contentTheme;
|
4046
|
+
if ( contentTheme && collapsible.jqmData( "collapsible-last" ) ) {
|
4047
|
+
collapsible.find( widget.options.heading ).first()
|
4048
|
+
.find( "a" ).first()
|
4049
|
+
.add( ".ui-btn-inner" )
|
4050
|
+
.toggleClass( "ui-corner-bottom", isCollapse );
|
4051
|
+
collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse );
|
4052
|
+
}
|
4053
|
+
})
|
4054
|
+
.bind( "expand", function( event ) {
|
4055
|
+
$( event.target )
|
4056
|
+
.closest( ".ui-collapsible" )
|
4057
|
+
.siblings( ".ui-collapsible" )
|
4058
|
+
.trigger( "collapse" );
|
4059
|
+
|
4060
|
+
});
|
4061
|
+
|
4062
|
+
// clean up borders
|
4063
|
+
collapsiblesInSet.each( function() {
|
4064
|
+
$( this ).find( $.mobile.collapsible.prototype.options.heading )
|
4065
|
+
.find( "a" ).first()
|
4066
|
+
.add( ".ui-btn-inner" )
|
4067
|
+
.removeClass( "ui-corner-top ui-corner-bottom" );
|
4068
|
+
});
|
4069
|
+
|
4070
|
+
collapsiblesInSet.first()
|
4071
|
+
.find( "a" )
|
4072
|
+
.first()
|
4073
|
+
.addClass( "ui-corner-top" )
|
4074
|
+
.find( ".ui-btn-inner" )
|
4075
|
+
.addClass( "ui-corner-top" );
|
4076
|
+
|
4077
|
+
collapsiblesInSet.last()
|
4078
|
+
.jqmData( "collapsible-last", true )
|
4079
|
+
.find( "a" )
|
4080
|
+
.first()
|
4081
|
+
.addClass( "ui-corner-bottom" )
|
4082
|
+
.find( ".ui-btn-inner" )
|
4083
|
+
.addClass( "ui-corner-bottom" );
|
4084
|
+
}
|
4085
|
+
}
|
4086
|
+
});
|
4087
|
+
|
4088
|
+
//auto self-init widgets
|
4089
|
+
$( document ).bind( "pagecreate create", function( e ){
|
4090
|
+
$( $.mobile.collapsibleset.prototype.options.initSelector, e.target ).collapsibleset();
|
4091
|
+
});
|
4092
|
+
|
3955
4093
|
})( jQuery );
|
3956
4094
|
/*
|
3957
4095
|
* "fieldcontain" plugin - simple class additions to make form row separators
|
@@ -4053,8 +4191,10 @@ $.widget( "mobile.navbar", $.mobile.widget, {
|
|
4053
4191
|
});
|
4054
4192
|
|
4055
4193
|
$navbar.delegate( "a", "vclick", function( event ) {
|
4056
|
-
|
4057
|
-
|
4194
|
+
if( !$(event.target).hasClass("ui-disabled") ) {
|
4195
|
+
$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
|
4196
|
+
$( this ).addClass( $.mobile.activeBtnClass );
|
4197
|
+
}
|
4058
4198
|
});
|
4059
4199
|
}
|
4060
4200
|
});
|
@@ -4477,7 +4617,7 @@ $.mobile.listview.prototype.options.filterCallback = function( text, searchValue
|
|
4477
4617
|
return text.toLowerCase().indexOf( searchValue ) === -1;
|
4478
4618
|
};
|
4479
4619
|
|
4480
|
-
$( ":jqmData(role='listview')"
|
4620
|
+
$( document ).delegate( ":jqmData(role='listview')", "listviewcreate", function() {
|
4481
4621
|
|
4482
4622
|
var list = $( this ),
|
4483
4623
|
listview = list.data( "listview" );
|
@@ -4503,13 +4643,11 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
|
|
4503
4643
|
lastval = $this.jqmData( "lastval" ) + "",
|
4504
4644
|
childItems = false,
|
4505
4645
|
itemtext = "",
|
4506
|
-
item
|
4646
|
+
item;
|
4507
4647
|
|
4508
4648
|
// Change val as lastval for next execution
|
4509
4649
|
$this.jqmData( "lastval" , val );
|
4510
|
-
|
4511
|
-
|
4512
|
-
if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) {
|
4650
|
+
if ( val.length < lastval.length || val.indexOf(lastval) !== 0 ) {
|
4513
4651
|
|
4514
4652
|
// Removed chars or pasted something totally different, check all items
|
4515
4653
|
listItems = list.children();
|
@@ -4604,7 +4742,7 @@ $.widget( "mobile.checkboxradio", $.mobile.widget, {
|
|
4604
4742
|
input = this.element,
|
4605
4743
|
// NOTE: Windows Phone could not find the label through a selector
|
4606
4744
|
// filter works though.
|
4607
|
-
label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label[for='" + input[ 0 ].id + "']"),
|
4745
|
+
label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label" ).filter( "[for='" + input[ 0 ].id + "']" ),
|
4608
4746
|
inputtype = input.attr( "type" ),
|
4609
4747
|
checkedState = inputtype + "-on",
|
4610
4748
|
uncheckedState = inputtype + "-off",
|
@@ -4808,6 +4946,12 @@ $.widget( "mobile.button", $.mobile.widget, {
|
|
4808
4946
|
name,
|
4809
4947
|
$buttonPlaceholder;
|
4810
4948
|
|
4949
|
+
// if this is a link, check if it's been enhanced and, if not, use the right function
|
4950
|
+
if( $el[ 0 ].tagName === "A" ) {
|
4951
|
+
if ( !$el.hasClass( "ui-btn" ) ) $el.buttonMarkup();
|
4952
|
+
return;
|
4953
|
+
}
|
4954
|
+
|
4811
4955
|
// Add ARIA role
|
4812
4956
|
this.button = $( "<div></div>" )
|
4813
4957
|
.text( $el.text() || $el.val() )
|
@@ -4960,7 +5104,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
4960
5104
|
if ( cType == "select" ) {
|
4961
5105
|
|
4962
5106
|
slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
|
4963
|
-
|
5107
|
+
|
4964
5108
|
// make the handle move with a smooth transition
|
4965
5109
|
handle.addClass( "ui-slider-handle-snapping" );
|
4966
5110
|
|
@@ -5003,14 +5147,14 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5003
5147
|
if ( self.dragging ) {
|
5004
5148
|
// self.mouseMoved must be updated before refresh() because it will be used in the control "change" event
|
5005
5149
|
self.mouseMoved = true;
|
5006
|
-
|
5150
|
+
|
5007
5151
|
if ( cType === "select" ) {
|
5008
5152
|
// make the handle move in sync with the mouse
|
5009
5153
|
handle.removeClass( "ui-slider-handle-snapping" );
|
5010
5154
|
}
|
5011
|
-
|
5155
|
+
|
5012
5156
|
self.refresh( event );
|
5013
|
-
|
5157
|
+
|
5014
5158
|
// only after refresh() you can calculate self.userModified
|
5015
5159
|
self.userModified = self.beforeStart !== control[0].selectedIndex;
|
5016
5160
|
return false;
|
@@ -5025,7 +5169,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5025
5169
|
if ( cType === "select" ) {
|
5026
5170
|
self.beforeStart = control[0].selectedIndex;
|
5027
5171
|
}
|
5028
|
-
|
5172
|
+
|
5029
5173
|
self.refresh( event );
|
5030
5174
|
return false;
|
5031
5175
|
});
|
@@ -5037,12 +5181,12 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5037
5181
|
self.dragging = false;
|
5038
5182
|
|
5039
5183
|
if ( cType === "select") {
|
5040
|
-
|
5184
|
+
|
5041
5185
|
// make the handle move with a smooth transition
|
5042
5186
|
handle.addClass( "ui-slider-handle-snapping" );
|
5043
|
-
|
5187
|
+
|
5044
5188
|
if ( self.mouseMoved ) {
|
5045
|
-
|
5189
|
+
|
5046
5190
|
// this is a drag, change the value only if user dragged enough
|
5047
5191
|
if ( self.userModified ) {
|
5048
5192
|
self.refresh( self.beforeStart == 0 ? 1 : 0 );
|
@@ -5050,17 +5194,17 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5050
5194
|
else {
|
5051
5195
|
self.refresh( self.beforeStart );
|
5052
5196
|
}
|
5053
|
-
|
5197
|
+
|
5054
5198
|
}
|
5055
5199
|
else {
|
5056
5200
|
// this is just a click, change the value
|
5057
5201
|
self.refresh( self.beforeStart == 0 ? 1 : 0 );
|
5058
5202
|
}
|
5059
|
-
|
5203
|
+
|
5060
5204
|
}
|
5061
|
-
|
5205
|
+
|
5062
5206
|
self.mouseMoved = false;
|
5063
|
-
|
5207
|
+
|
5064
5208
|
return false;
|
5065
5209
|
}
|
5066
5210
|
});
|
@@ -5133,14 +5277,15 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5133
5277
|
|
5134
5278
|
refresh: function( val, isfromControl, preventInputUpdate ) {
|
5135
5279
|
|
5136
|
-
if ( this.options.disabled || this.element.attr('disabled')) {
|
5280
|
+
if ( this.options.disabled || this.element.attr('disabled')) {
|
5137
5281
|
this.disable();
|
5138
5282
|
}
|
5139
5283
|
|
5140
5284
|
var control = this.element, percent,
|
5141
5285
|
cType = control[0].nodeName.toLowerCase(),
|
5142
5286
|
min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0,
|
5143
|
-
max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1
|
5287
|
+
max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1,
|
5288
|
+
step = (cType === "input" && parseFloat( control.attr( "step" ) ) > 0) ? parseFloat(control.attr("step")) : 1;
|
5144
5289
|
|
5145
5290
|
if ( typeof val === "object" ) {
|
5146
5291
|
var data = val,
|
@@ -5154,7 +5299,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5154
5299
|
percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 );
|
5155
5300
|
} else {
|
5156
5301
|
if ( val == null ) {
|
5157
|
-
val = cType === "input" ? parseFloat( control.val() ) : control[0].selectedIndex;
|
5302
|
+
val = cType === "input" ? parseFloat( control.val() || 0 ) : control[0].selectedIndex;
|
5158
5303
|
}
|
5159
5304
|
percent = ( parseFloat( val ) - min ) / ( max - min ) * 100;
|
5160
5305
|
}
|
@@ -5171,7 +5316,18 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5171
5316
|
percent = 100;
|
5172
5317
|
}
|
5173
5318
|
|
5174
|
-
var newval =
|
5319
|
+
var newval = ( percent / 100 ) * ( max - min ) + min;
|
5320
|
+
|
5321
|
+
//from jQuery UI slider, the following source will round to the nearest step
|
5322
|
+
var valModStep = ( newval - min ) % step;
|
5323
|
+
var alignValue = newval - valModStep;
|
5324
|
+
|
5325
|
+
if ( Math.abs( valModStep ) * 2 >= step ) {
|
5326
|
+
alignValue += ( valModStep > 0 ) ? step : ( -step );
|
5327
|
+
}
|
5328
|
+
// Since JavaScript has problems with large floats, round
|
5329
|
+
// the final value to 5 digits after the decimal point (see jQueryUI: #4124)
|
5330
|
+
newval = parseFloat( alignValue.toFixed(5) );
|
5175
5331
|
|
5176
5332
|
if ( newval < min ) {
|
5177
5333
|
newval = min;
|
@@ -5181,15 +5337,11 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
5181
5337
|
newval = max;
|
5182
5338
|
}
|
5183
5339
|
|
5184
|
-
// Flip the stack of the bg colors
|
5185
|
-
if ( percent > 60 && cType === "select" ) {
|
5186
|
-
// TODO: Dead path?
|
5187
|
-
}
|
5188
5340
|
this.handle.css( "left", percent + "%" );
|
5189
5341
|
this.handle.attr( {
|
5190
5342
|
"aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ),
|
5191
5343
|
"aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(),
|
5192
|
-
title: newval
|
5344
|
+
title: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText()
|
5193
5345
|
});
|
5194
5346
|
|
5195
5347
|
// add/remove classes for flip toggle switch
|
@@ -5338,15 +5490,15 @@ $.widget( "mobile.textinput", $.mobile.widget, {
|
|
5338
5490
|
keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
|
5339
5491
|
});
|
5340
5492
|
|
5493
|
+
// binding to pagechange here ensures that for pages loaded via
|
5494
|
+
// ajax the height is recalculated without user input
|
5495
|
+
$( document ).one( "pagechange", keyup );
|
5496
|
+
|
5341
5497
|
// Issue 509: the browser is not providing scrollHeight properly until the styles load
|
5342
5498
|
if ( $.trim( input.val() ) ) {
|
5343
5499
|
// bind to the window load to make sure the height is calculated based on BOTH
|
5344
5500
|
// the DOM and CSS
|
5345
5501
|
$( window ).load( keyup );
|
5346
|
-
|
5347
|
-
// binding to pagechange here ensures that for pages loaded via
|
5348
|
-
// ajax the height is recalculated without user input
|
5349
|
-
$( document ).one( "pagechange", keyup );
|
5350
5502
|
}
|
5351
5503
|
}
|
5352
5504
|
},
|
@@ -5667,11 +5819,11 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
5667
5819
|
menuWidth = self.list.parent().outerWidth(),
|
5668
5820
|
activePage = $( ".ui-page-active" ),
|
5669
5821
|
tOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
|
5670
|
-
tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage
|
5822
|
+
tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage,
|
5671
5823
|
scrollTop = tOverflow ? tScrollElem.scrollTop() : $( window ).scrollTop(),
|
5672
5824
|
btnOffset = self.button.offset().top,
|
5673
|
-
screenHeight = window.
|
5674
|
-
screenWidth = window.
|
5825
|
+
screenHeight = $(window).height(),
|
5826
|
+
screenWidth = $(window).width();
|
5675
5827
|
|
5676
5828
|
//add active class to button
|
5677
5829
|
self.button.addClass( $.mobile.activeBtnClass );
|
@@ -5853,7 +6005,7 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
5853
6005
|
});
|
5854
6006
|
};
|
5855
6007
|
|
5856
|
-
$(
|
6008
|
+
$( document ).delegate( "select", "selectmenubeforecreate", function(){
|
5857
6009
|
var selectmenuWidget = $( this ).data( "selectmenu" );
|
5858
6010
|
|
5859
6011
|
if( !selectmenuWidget.options.nativeMenu ){
|
@@ -6074,7 +6226,6 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
6074
6226
|
|
6075
6227
|
$.fn.buttonMarkup = function( options ) {
|
6076
6228
|
options = options || {};
|
6077
|
-
|
6078
6229
|
for ( var i = 0; i < this.length; i++ ) {
|
6079
6230
|
var el = this.eq( i ),
|
6080
6231
|
e = el[ 0 ],
|
@@ -6098,6 +6249,15 @@ $.fn.buttonMarkup = function( options ) {
|
|
6098
6249
|
buttonText = document.createElement( o.wrapperEls ),
|
6099
6250
|
buttonIcon = o.icon ? document.createElement( "span" ) : null;
|
6100
6251
|
|
6252
|
+
// if so, prevent double enhancement, and continue with rest of the elements.
|
6253
|
+
if( e.tagName === "INPUT" && el.jqmData('role') === "button" ) continue;
|
6254
|
+
|
6255
|
+
// if this is a button, check if it's been enhanced and, if not, use the right function
|
6256
|
+
if( e.tagName === "BUTTON" ) {
|
6257
|
+
if ( !$( e.parentNode ).hasClass( "ui-btn" ) ) $( e ).button();
|
6258
|
+
continue;
|
6259
|
+
}
|
6260
|
+
|
6101
6261
|
if ( attachEvents ) {
|
6102
6262
|
attachEvents();
|
6103
6263
|
}
|
@@ -6145,7 +6305,6 @@ $.fn.buttonMarkup = function( options ) {
|
|
6145
6305
|
el.addClass( buttonClass );
|
6146
6306
|
|
6147
6307
|
buttonInner.className = innerClass;
|
6148
|
-
buttonInner.setAttribute("aria-hidden", "true");
|
6149
6308
|
|
6150
6309
|
buttonText.className = textClass;
|
6151
6310
|
buttonInner.appendChild( buttonText );
|
@@ -6160,7 +6319,7 @@ $.fn.buttonMarkup = function( options ) {
|
|
6160
6319
|
}
|
6161
6320
|
|
6162
6321
|
e.appendChild( buttonInner );
|
6163
|
-
|
6322
|
+
|
6164
6323
|
// TODO obviously it would be nice to pull this element out instead of
|
6165
6324
|
// retrieving it from the DOM again, but this change is much less obtrusive
|
6166
6325
|
// and 1.0 draws nigh
|
@@ -6186,12 +6345,11 @@ function closestEnabledButton( element ) {
|
|
6186
6345
|
// handed could be in an SVG DOM where className on SVG elements is defined to
|
6187
6346
|
// be of a different type (SVGAnimatedString). We only operate on HTML DOM
|
6188
6347
|
// elements, so we look for plain "string".
|
6189
|
-
|
6190
|
-
|
6191
|
-
|
6192
|
-
if ( cname && $.inArray( "ui-btn", cname ) > -1 && $.inArray( "ui-disabled", cname ) < 0 ) {
|
6348
|
+
cname = ( typeof element.className === 'string' ) && (element.className + ' ');
|
6349
|
+
if ( cname && cname.indexOf("ui-btn ") > -1 && cname.indexOf("ui-disabled ") < 0 ) {
|
6193
6350
|
break;
|
6194
6351
|
}
|
6352
|
+
|
6195
6353
|
element = element.parentNode;
|
6196
6354
|
}
|
6197
6355
|
|
@@ -6475,9 +6633,7 @@ $.mobile.fixedToolbars = (function() {
|
|
6475
6633
|
|
6476
6634
|
// 1. Before page is shown, check for duplicate footer
|
6477
6635
|
// 2. After page is shown, append footer to new page
|
6478
|
-
$( ".ui-page" )
|
6479
|
-
.live( "pagebeforeshow", function( event, ui ) {
|
6480
|
-
|
6636
|
+
$( document ).delegate( ".ui-page", "pagebeforeshow", function( event, ui ) {
|
6481
6637
|
var page = $( event.target ),
|
6482
6638
|
footer = page.find( ":jqmData(role='footer')" ),
|
6483
6639
|
id = footer.data( "id" ),
|
@@ -6490,12 +6646,10 @@ $.mobile.fixedToolbars = (function() {
|
|
6490
6646
|
setTop( stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer ) );
|
6491
6647
|
}
|
6492
6648
|
})
|
6493
|
-
.
|
6494
|
-
|
6649
|
+
.delegate( ".ui-page", "pageshow", function( event, ui ) {
|
6495
6650
|
var $this = $( this );
|
6496
6651
|
|
6497
6652
|
if ( stickyFooter && stickyFooter.length ) {
|
6498
|
-
|
6499
6653
|
setTimeout(function() {
|
6500
6654
|
setTop( stickyFooter.appendTo( $this ).addClass( "fade" ) );
|
6501
6655
|
stickyFooter = null;
|
@@ -6505,8 +6659,8 @@ $.mobile.fixedToolbars = (function() {
|
|
6505
6659
|
$.mobile.fixedToolbars.show( true, this );
|
6506
6660
|
});
|
6507
6661
|
|
6508
|
-
// When a
|
6509
|
-
$( ".ui-collapsible-contain"
|
6662
|
+
// When a collapsible is hidden or shown we need to trigger the fixed toolbar to reposition itself (#1635)
|
6663
|
+
$( document ).delegate( ".ui-collapsible-contain", "collapse expand", showEventCallback );
|
6510
6664
|
|
6511
6665
|
// element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The
|
6512
6666
|
// coordinates inside of the rect it returns don't have the page scroll position
|
@@ -6822,13 +6976,27 @@ $( document ).bind( "pagecreate", function( event ) {
|
|
6822
6976
|
// find and enhance the pages in the dom and transition to the first page.
|
6823
6977
|
initializePage: function() {
|
6824
6978
|
// find present pages
|
6825
|
-
var $pages = $( ":jqmData(role='page')" );
|
6979
|
+
var $dialogs, $pages = $( ":jqmData(role='page')" );
|
6826
6980
|
|
6827
|
-
// if no pages are found, create one with body's inner html
|
6981
|
+
// if no pages are found, check for dialogs or create one with body's inner html
|
6828
6982
|
if ( !$pages.length ) {
|
6829
|
-
$
|
6983
|
+
$dialogs = $( ":jqmData(role='dialog')" );
|
6984
|
+
|
6985
|
+
// if there are no pages but a dialog is present, load it as a page
|
6986
|
+
if( $dialogs.length ) {
|
6987
|
+
// alter the attribute so it will be treated as a page unpon enhancement
|
6988
|
+
// TODO allow for the loading of a dialog as the first page (many considerations)
|
6989
|
+
$dialogs.first().attr( "data-" + $.mobile.ns + "role", "page" );
|
6990
|
+
|
6991
|
+
// remove the first dialog from the set of dialogs since it's now a page
|
6992
|
+
// add it to the empty set of pages to be loaded by the initial changepage
|
6993
|
+
$pages = $pages.add( $dialogs.get().shift() );
|
6994
|
+
} else {
|
6995
|
+
$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
|
6996
|
+
}
|
6830
6997
|
}
|
6831
6998
|
|
6999
|
+
|
6832
7000
|
// add dialogs, set data-url attrs
|
6833
7001
|
$pages.add( ":jqmData(role='dialog')" ).each(function() {
|
6834
7002
|
var $this = $(this);
|