qedproject 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/qedproject/helpers.rb +5 -0
- data/lib/qedproject/libraries/jquery.rb +1 -1
- data/lib/qedproject/project.rb +12 -2
- data/lib/qedproject/version.rb +1 -1
- data/templates/assets.yml +11 -1
- data/templates/index.html +24 -2
- data/vendor/jquery/jquery-1.6.4.js +9046 -0
- data/vendor/jquerymobile/{jquery.mobile-1.0b2.css → jquery.mobile-1.0b3.css} +64 -5
- data/vendor/jquerymobile/{jquery.mobile-1.0b2.js → jquery.mobile-1.0b3.js} +1125 -727
- data/vendor/skeleton/templates/index.html +13 -1
- metadata +7 -7
- data/vendor/jquery/jquery-1.6.2.min.js +0 -18
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* jQuery Mobile v1.
|
2
|
+
* jQuery Mobile v1.0b3
|
3
3
|
* http://jquerymobile.com/
|
4
4
|
*
|
5
5
|
* Copyright 2010, jQuery Project
|
@@ -356,7 +356,7 @@ $.mobile.media = (function() {
|
|
356
356
|
|
357
357
|
var fakeBody = $( "<body>" ).prependTo( "html" ),
|
358
358
|
fbCSS = fakeBody[ 0 ].style,
|
359
|
-
vendors = [ "
|
359
|
+
vendors = [ "Webkit", "Moz", "O" ],
|
360
360
|
webos = "palmGetResource" in window, //only used to rule out scrollTop
|
361
361
|
bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB
|
362
362
|
|
@@ -366,7 +366,7 @@ function propExists( prop ) {
|
|
366
366
|
props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " );
|
367
367
|
|
368
368
|
for ( var v in props ){
|
369
|
-
if ( fbCSS[ v ] !== undefined ) {
|
369
|
+
if ( fbCSS[ props[ v ] ] !== undefined ) {
|
370
370
|
return true;
|
371
371
|
}
|
372
372
|
}
|
@@ -415,9 +415,10 @@ $.extend( $.support, {
|
|
415
415
|
orientation: "orientation" in window,
|
416
416
|
touch: "ontouchend" in document,
|
417
417
|
cssTransitions: "WebKitTransitionEvent" in window,
|
418
|
-
pushState:
|
418
|
+
pushState: "pushState" in history && "replaceState" in history,
|
419
419
|
mediaquery: $.mobile.media( "only all" ),
|
420
420
|
cssPseudoElement: !!propExists( "content" ),
|
421
|
+
touchOverflow: !!propExists( "overflowScrolling" ),
|
421
422
|
boxShadow: !!propExists( "boxShadow" ) && !bb,
|
422
423
|
scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos,
|
423
424
|
dynamicBaseTag: baseTagTest(),
|
@@ -631,8 +632,7 @@ function clearResetTimer() {
|
|
631
632
|
}
|
632
633
|
|
633
634
|
function triggerVirtualEvent( eventType, event, flags ) {
|
634
|
-
var
|
635
|
-
ve;
|
635
|
+
var ve;
|
636
636
|
|
637
637
|
if ( ( flags && flags[ eventType ] ) ||
|
638
638
|
( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
|
@@ -640,18 +640,27 @@ function triggerVirtualEvent( eventType, event, flags ) {
|
|
640
640
|
ve = createVirtualEvent( event, eventType );
|
641
641
|
|
642
642
|
$( event.target).trigger( ve );
|
643
|
-
|
644
|
-
defaultPrevented = ve.isDefaultPrevented();
|
645
643
|
}
|
646
644
|
|
647
|
-
return
|
645
|
+
return ve;
|
648
646
|
}
|
649
647
|
|
650
648
|
function mouseEventCallback( event ) {
|
651
649
|
var touchID = $.data(event.target, touchTargetPropertyName);
|
652
650
|
|
653
651
|
if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ){
|
654
|
-
triggerVirtualEvent( "v" + event.type, event );
|
652
|
+
var ve = triggerVirtualEvent( "v" + event.type, event );
|
653
|
+
if ( ve ) {
|
654
|
+
if ( ve.isDefaultPrevented() ) {
|
655
|
+
event.preventDefault();
|
656
|
+
}
|
657
|
+
if ( ve.isPropagationStopped() ) {
|
658
|
+
event.stopPropagation();
|
659
|
+
}
|
660
|
+
if ( ve.isImmediatePropagationStopped() ) {
|
661
|
+
event.stopImmediatePropagation();
|
662
|
+
}
|
663
|
+
}
|
655
664
|
}
|
656
665
|
}
|
657
666
|
|
@@ -731,7 +740,8 @@ function handleTouchEnd( event ) {
|
|
731
740
|
triggerVirtualEvent( "vmouseup", event, flags );
|
732
741
|
|
733
742
|
if ( !didScroll ) {
|
734
|
-
|
743
|
+
var ve = triggerVirtualEvent( "vclick", event, flags );
|
744
|
+
if ( ve && ve.isDefaultPrevented() ) {
|
735
745
|
// The target of the mouse events that follow the touchend
|
736
746
|
// event don't necessarily match the target used during the
|
737
747
|
// touch. This means we need to rely on coordinates for blocking
|
@@ -1028,16 +1038,19 @@ $.event.special.tap = {
|
|
1028
1038
|
return false;
|
1029
1039
|
}
|
1030
1040
|
|
1031
|
-
var
|
1032
|
-
origTarget = event.target,
|
1041
|
+
var origTarget = event.target,
|
1033
1042
|
origEvent = event.originalEvent,
|
1034
1043
|
timer;
|
1035
1044
|
|
1045
|
+
function clearTapTimer() {
|
1046
|
+
clearTimeout( timer );
|
1047
|
+
}
|
1048
|
+
|
1036
1049
|
function clearTapHandlers() {
|
1037
|
-
|
1038
|
-
clearTimeout(timer);
|
1050
|
+
clearTapTimer();
|
1039
1051
|
|
1040
1052
|
$this.unbind( "vclick", clickHandler )
|
1053
|
+
.unbind( "vmouseup", clearTapTimer )
|
1041
1054
|
.unbind( "vmousecancel", clearTapHandlers );
|
1042
1055
|
}
|
1043
1056
|
|
@@ -1052,12 +1065,11 @@ $.event.special.tap = {
|
|
1052
1065
|
}
|
1053
1066
|
|
1054
1067
|
$this.bind( "vmousecancel", clearTapHandlers )
|
1068
|
+
.bind( "vmouseup", clearTapTimer )
|
1055
1069
|
.bind( "vclick", clickHandler );
|
1056
1070
|
|
1057
1071
|
timer = setTimeout(function() {
|
1058
|
-
|
1059
|
-
triggerCustomEvent( thisObject, "taphold", event );
|
1060
|
-
}
|
1072
|
+
triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) );
|
1061
1073
|
}, 750 );
|
1062
1074
|
});
|
1063
1075
|
}
|
@@ -1657,14 +1669,12 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1657
1669
|
},
|
1658
1670
|
|
1659
1671
|
_create: function() {
|
1660
|
-
var $elem = this.element,
|
1661
|
-
o = this.options;
|
1662
1672
|
|
1663
|
-
|
1664
|
-
return;
|
1665
|
-
}
|
1673
|
+
this._trigger( "beforecreate" );
|
1666
1674
|
|
1667
|
-
|
1675
|
+
this.element
|
1676
|
+
.attr( "tabindex", "0" )
|
1677
|
+
.addClass( "ui-page ui-body-" + this.options.theme );
|
1668
1678
|
}
|
1669
1679
|
});
|
1670
1680
|
|
@@ -1707,7 +1717,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1707
1717
|
defaultPageTransition: "slide",
|
1708
1718
|
|
1709
1719
|
// Minimum scroll distance that will be remembered when returning to a page
|
1710
|
-
minScrollBack:
|
1720
|
+
minScrollBack: 250,
|
1711
1721
|
|
1712
1722
|
// Set default dialog transition - 'none' for no transitions
|
1713
1723
|
defaultDialogTransition: "pop",
|
@@ -1718,10 +1728,12 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1718
1728
|
|
1719
1729
|
// Error response message - appears when an Ajax page request fails
|
1720
1730
|
pageLoadErrorMessage: "Error Loading Page",
|
1721
|
-
|
1731
|
+
|
1722
1732
|
//automatically initialize the DOM when it's ready
|
1723
1733
|
autoInitializePage: true,
|
1724
1734
|
|
1735
|
+
pushStateEnabled: true,
|
1736
|
+
|
1725
1737
|
// Support conditions that must be met in order to proceed
|
1726
1738
|
// default enhanced qualifications are media query support OR IE 7+
|
1727
1739
|
gradeA: function(){
|
@@ -1835,6 +1847,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1835
1847
|
return $.find( expr, null, null, [ node ] ).length > 0;
|
1836
1848
|
};
|
1837
1849
|
})( jQuery, this );
|
1850
|
+
|
1838
1851
|
/*
|
1839
1852
|
* jQuery Mobile Framework : core utilities for auto ajax navigation, base tag mgmt,
|
1840
1853
|
* Copyright (c) jQuery Project
|
@@ -1875,7 +1888,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
1875
1888
|
// [15]: ?msg=1234&type=unread
|
1876
1889
|
// [16]: #msg-content
|
1877
1890
|
//
|
1878
|
-
urlParseRE: /^(((([^:\/#\?]+:)?(?:\/\/((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([
|
1891
|
+
urlParseRE: /^(((([^:\/#\?]+:)?(?:\/\/((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
|
1879
1892
|
|
1880
1893
|
//Parse a URL into a structure that allows easy access to
|
1881
1894
|
//all of the URL components by name.
|
@@ -2053,6 +2066,26 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2053
2066
|
return ( /^(:?\w+:)/ ).test( url );
|
2054
2067
|
},
|
2055
2068
|
|
2069
|
+
//check if the specified url refers to the first page in the main application document.
|
2070
|
+
isFirstPageUrl: function( url ) {
|
2071
|
+
// We only deal with absolute paths.
|
2072
|
+
var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ),
|
2073
|
+
|
2074
|
+
// Does the url have the same path as the document?
|
2075
|
+
samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ),
|
2076
|
+
|
2077
|
+
// Get the first page element.
|
2078
|
+
fp = $.mobile.firstPage,
|
2079
|
+
|
2080
|
+
// Get the id of the first page element if it has one.
|
2081
|
+
fpId = fp && fp[0] ? fp[0].id : undefined;
|
2082
|
+
|
2083
|
+
// The url refers to the first page if the path matches the document and
|
2084
|
+
// it either has no hash value, or the hash is exactly equal to the id of the
|
2085
|
+
// first page element.
|
2086
|
+
return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) );
|
2087
|
+
},
|
2088
|
+
|
2056
2089
|
isEmbeddedPage: function( url ) {
|
2057
2090
|
var u = path.parseUrl( url );
|
2058
2091
|
|
@@ -2074,7 +2107,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2074
2107
|
//urlHistory is purely here to make guesses at whether the back or forward button was clicked
|
2075
2108
|
//and provide an appropriate transition
|
2076
2109
|
urlHistory = {
|
2077
|
-
// Array of pages that are visited during a single page load.
|
2110
|
+
// Array of pages that are visited during a single page load.
|
2078
2111
|
// Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs)
|
2079
2112
|
stack: [],
|
2080
2113
|
|
@@ -2095,13 +2128,13 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2095
2128
|
},
|
2096
2129
|
|
2097
2130
|
// addNew is used whenever a new page is added
|
2098
|
-
addNew: function( url, transition, title, pageUrl ) {
|
2131
|
+
addNew: function( url, transition, title, pageUrl, role ) {
|
2099
2132
|
//if there's forward history, wipe it
|
2100
2133
|
if( urlHistory.getNext() ) {
|
2101
2134
|
urlHistory.clearForward();
|
2102
2135
|
}
|
2103
2136
|
|
2104
|
-
urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl } );
|
2137
|
+
urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } );
|
2105
2138
|
|
2106
2139
|
urlHistory.activeIndex = urlHistory.stack.length - 1;
|
2107
2140
|
},
|
@@ -2112,7 +2145,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2112
2145
|
},
|
2113
2146
|
|
2114
2147
|
directHashChange: function( opts ) {
|
2115
|
-
var back , forward, newActiveIndex;
|
2148
|
+
var back , forward, newActiveIndex, prev = this.getActive();
|
2116
2149
|
|
2117
2150
|
// check if url isp in history and if it's ahead or behind current page
|
2118
2151
|
$.each( urlHistory.stack, function( i, historyEntry ) {
|
@@ -2130,9 +2163,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2130
2163
|
this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex;
|
2131
2164
|
|
2132
2165
|
if( back ) {
|
2133
|
-
opts.isBack();
|
2166
|
+
( opts.either || opts.isBack )( true );
|
2134
2167
|
} else if( forward ) {
|
2135
|
-
opts.isForward();
|
2168
|
+
( opts.either || opts.isForward )( false );
|
2136
2169
|
}
|
2137
2170
|
},
|
2138
2171
|
|
@@ -2191,20 +2224,13 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2191
2224
|
|
2192
2225
|
//direct focus to the page title, or otherwise first focusable element
|
2193
2226
|
function reFocus( page ) {
|
2194
|
-
var
|
2227
|
+
var pageTitle = page.find( ".ui-title:eq(0)" );
|
2195
2228
|
|
2196
|
-
if(
|
2197
|
-
|
2229
|
+
if( pageTitle.length ) {
|
2230
|
+
pageTitle.focus();
|
2198
2231
|
}
|
2199
|
-
else
|
2200
|
-
|
2201
|
-
|
2202
|
-
if( pageTitle.length ) {
|
2203
|
-
pageTitle.focus();
|
2204
|
-
}
|
2205
|
-
else{
|
2206
|
-
page.find( focusable ).eq( 0 ).focus();
|
2207
|
-
}
|
2232
|
+
else{
|
2233
|
+
page.focus();
|
2208
2234
|
}
|
2209
2235
|
}
|
2210
2236
|
|
@@ -2222,41 +2248,94 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2222
2248
|
$.mobile.changePage.apply( null, pageTransitionQueue.pop() );
|
2223
2249
|
}
|
2224
2250
|
}
|
2251
|
+
|
2252
|
+
// Save the last scroll distance per page, before it is hidden
|
2253
|
+
var getLastScroll = (function( lastScrollEnabled ){
|
2254
|
+
return function(){
|
2255
|
+
if( !lastScrollEnabled ){
|
2256
|
+
lastScrollEnabled = true;
|
2257
|
+
return;
|
2258
|
+
}
|
2259
|
+
|
2260
|
+
lastScrollEnabled = false;
|
2261
|
+
|
2262
|
+
var active = $.mobile.urlHistory.getActive(),
|
2263
|
+
activePage = $( ".ui-page-active" ),
|
2264
|
+
scrollElem = $( window ),
|
2265
|
+
touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled;
|
2266
|
+
|
2267
|
+
if( touchOverflow ){
|
2268
|
+
scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage;
|
2269
|
+
}
|
2270
|
+
|
2271
|
+
if( active ){
|
2272
|
+
var lastScroll = scrollElem.scrollTop();
|
2273
|
+
|
2274
|
+
// Set active page's lastScroll prop.
|
2275
|
+
// If the Y location we're scrolling to is less than minScrollBack, let it go.
|
2276
|
+
active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll;
|
2277
|
+
}
|
2278
|
+
};
|
2279
|
+
})( true );
|
2280
|
+
|
2281
|
+
// to get last scroll, we need to get scrolltop before the page change
|
2282
|
+
// using beforechangepage or popstate/hashchange (whichever comes first)
|
2283
|
+
$( document ).bind( "beforechangepage", getLastScroll );
|
2284
|
+
$( window ).bind( $.support.pushState ? "popstate" : "hashchange", getLastScroll );
|
2285
|
+
|
2286
|
+
// Make the iOS clock quick-scroll work again if we're using native overflow scrolling
|
2287
|
+
/*
|
2288
|
+
if( $.support.touchOverflow ){
|
2289
|
+
if( $.mobile.touchOverflowEnabled ){
|
2290
|
+
$( window ).bind( "scrollstop", function(){
|
2291
|
+
if( $( this ).scrollTop() === 0 ){
|
2292
|
+
$.mobile.activePage.scrollTop( 0 );
|
2293
|
+
}
|
2294
|
+
});
|
2295
|
+
}
|
2296
|
+
}
|
2297
|
+
*/
|
2225
2298
|
|
2226
2299
|
//function for transitioning between two existing pages
|
2227
2300
|
function transitionPages( toPage, fromPage, transition, reverse ) {
|
2228
2301
|
|
2229
2302
|
//get current scroll distance
|
2230
|
-
var
|
2231
|
-
|
2303
|
+
var active = $.mobile.urlHistory.getActive(),
|
2304
|
+
touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
|
2305
|
+
toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ),
|
2232
2306
|
screenHeight = getScreenHeight();
|
2233
|
-
|
2234
|
-
//
|
2235
|
-
|
2236
|
-
window.scrollTo( 0, $.mobile.defaultHomeScroll );
|
2237
|
-
}
|
2238
|
-
|
2239
|
-
//if the Y location we're scrolling to is less than 10px, let it go for sake of smoothness
|
2240
|
-
if( toScroll < $.mobile.minScrollBack ){
|
2241
|
-
toScroll = 0;
|
2242
|
-
}
|
2307
|
+
|
2308
|
+
// Scroll to top, hide addr bar
|
2309
|
+
window.scrollTo( 0, $.mobile.defaultHomeScroll );
|
2243
2310
|
|
2244
2311
|
if( fromPage ) {
|
2245
|
-
//set as data for returning to that spot
|
2246
|
-
fromPage
|
2247
|
-
.height( screenHeight + currScroll )
|
2248
|
-
.jqmData( "lastScroll", currScroll )
|
2249
|
-
.jqmData( "lastClicked", $activeClickedLink );
|
2250
|
-
|
2251
2312
|
//trigger before show/hide events
|
2252
2313
|
fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
|
2253
2314
|
}
|
2254
|
-
|
2255
|
-
|
2256
|
-
.
|
2315
|
+
|
2316
|
+
if( !touchOverflow){
|
2317
|
+
toPage.height( screenHeight + toScroll );
|
2318
|
+
}
|
2319
|
+
|
2320
|
+
toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
|
2257
2321
|
|
2258
2322
|
//clear page loader
|
2259
2323
|
$.mobile.hidePageLoadingMsg();
|
2324
|
+
|
2325
|
+
if( touchOverflow && toScroll ){
|
2326
|
+
|
2327
|
+
toPage.addClass( "ui-mobile-pre-transition" );
|
2328
|
+
// Send focus to page as it is now display: block
|
2329
|
+
reFocus( toPage );
|
2330
|
+
|
2331
|
+
//set page's scrollTop to remembered distance
|
2332
|
+
if( toPage.is( ".ui-native-fixed" ) ){
|
2333
|
+
toPage.find( ".ui-content" ).scrollTop( toScroll );
|
2334
|
+
}
|
2335
|
+
else{
|
2336
|
+
toPage.scrollTop( toScroll );
|
2337
|
+
}
|
2338
|
+
}
|
2260
2339
|
|
2261
2340
|
//find the transition handler for the specified transition. If there
|
2262
2341
|
//isn't one in our transitionHandlers dictionary, use the default one.
|
@@ -2265,21 +2344,25 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2265
2344
|
promise = th( transition, reverse, toPage, fromPage );
|
2266
2345
|
|
2267
2346
|
promise.done(function() {
|
2268
|
-
//reset toPage height
|
2269
|
-
|
2270
|
-
|
2271
|
-
|
2272
|
-
if( toScroll ){
|
2273
|
-
$.mobile.silentScroll( toScroll );
|
2274
|
-
$( document ).one( "silentscroll", function() { reFocus( toPage ); } );
|
2275
|
-
}
|
2276
|
-
else{
|
2347
|
+
//reset toPage height back
|
2348
|
+
if( !touchOverflow ){
|
2349
|
+
toPage.height( "" );
|
2350
|
+
// Send focus to the newly shown page
|
2277
2351
|
reFocus( toPage );
|
2278
2352
|
}
|
2353
|
+
|
2354
|
+
// Jump to top or prev scroll, sometimes on iOS the page has not rendered yet.
|
2355
|
+
if( !touchOverflow ){
|
2356
|
+
$.mobile.silentScroll( toScroll );
|
2357
|
+
}
|
2279
2358
|
|
2280
2359
|
//trigger show/hide events
|
2281
2360
|
if( fromPage ) {
|
2282
|
-
|
2361
|
+
if( !touchOverflow ){
|
2362
|
+
fromPage.height( "" );
|
2363
|
+
}
|
2364
|
+
|
2365
|
+
fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } );
|
2283
2366
|
}
|
2284
2367
|
|
2285
2368
|
//trigger pageshow, define prevPage as either fromPage or empty jQuery obj
|
@@ -2300,6 +2383,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2300
2383
|
|
2301
2384
|
return pageMin;
|
2302
2385
|
}
|
2386
|
+
|
2387
|
+
$.mobile.getScreenHeight = getScreenHeight;
|
2303
2388
|
|
2304
2389
|
//simply set the active page's minimum height to screen height, depending on orientation
|
2305
2390
|
function resetActivePageHeight(){
|
@@ -2349,6 +2434,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2349
2434
|
//history stack
|
2350
2435
|
$.mobile.urlHistory = urlHistory;
|
2351
2436
|
|
2437
|
+
$.mobile.dialogHashKey = dialogHashKey;
|
2438
|
+
|
2352
2439
|
//default non-animation transition handler
|
2353
2440
|
$.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) {
|
2354
2441
|
if ( $fromPage ) {
|
@@ -2434,6 +2521,12 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2434
2521
|
// Check to see if the page already exists in the DOM.
|
2435
2522
|
page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" );
|
2436
2523
|
|
2524
|
+
// If we failed to find a page in the DOM, check the URL to see if it
|
2525
|
+
// refers to the first page in the application.
|
2526
|
+
if ( page.length === 0 && $.mobile.firstPage && path.isFirstPageUrl( absUrl ) ) {
|
2527
|
+
page = $( $.mobile.firstPage );
|
2528
|
+
}
|
2529
|
+
|
2437
2530
|
// Reset base to the default document base.
|
2438
2531
|
if ( base ) {
|
2439
2532
|
base.reset();
|
@@ -2453,18 +2546,18 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2453
2546
|
}
|
2454
2547
|
|
2455
2548
|
if ( settings.showLoadMsg ) {
|
2456
|
-
|
2549
|
+
|
2457
2550
|
// This configurable timeout allows cached pages a brief delay to load without showing a message
|
2458
2551
|
var loadMsgDelay = setTimeout(function(){
|
2459
2552
|
$.mobile.showPageLoadingMsg();
|
2460
2553
|
}, settings.loadMsgDelay ),
|
2461
|
-
|
2554
|
+
|
2462
2555
|
// Shared logic for clearing timeout and removing message.
|
2463
2556
|
hideMsg = function(){
|
2464
|
-
|
2557
|
+
|
2465
2558
|
// Stop message show timer
|
2466
2559
|
clearTimeout( loadMsgDelay );
|
2467
|
-
|
2560
|
+
|
2468
2561
|
// Hide loading message
|
2469
2562
|
$.mobile.hidePageLoadingMsg();
|
2470
2563
|
};
|
@@ -2582,7 +2675,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2582
2675
|
|
2583
2676
|
// Remove loading message.
|
2584
2677
|
if ( settings.showLoadMsg ) {
|
2585
|
-
|
2678
|
+
|
2586
2679
|
// Remove loading message.
|
2587
2680
|
hideMsg();
|
2588
2681
|
|
@@ -2661,17 +2754,39 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2661
2754
|
return;
|
2662
2755
|
}
|
2663
2756
|
|
2757
|
+
var settings = $.extend( {}, $.mobile.changePage.defaults, options );
|
2758
|
+
|
2759
|
+
// Make sure we have a pageContainer to work with.
|
2760
|
+
settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
|
2761
|
+
|
2762
|
+
// Make sure we have a fromPage.
|
2763
|
+
settings.fromPage = settings.fromPage || $.mobile.activePage;
|
2764
|
+
|
2765
|
+
var mpc = settings.pageContainer,
|
2766
|
+
pbcEvent = new $.Event( "pagebeforechange" ),
|
2767
|
+
triggerData = { toPage: toPage, options: settings };
|
2768
|
+
|
2769
|
+
// Let listeners know we're about to change the current page.
|
2770
|
+
mpc.trigger( pbcEvent, triggerData );
|
2771
|
+
|
2772
|
+
mpc.trigger( "beforechangepage", triggerData ); // XXX: DEPRECATED for 1.0
|
2773
|
+
|
2774
|
+
// If the default behavior is prevented, stop here!
|
2775
|
+
if( pbcEvent.isDefaultPrevented() ){
|
2776
|
+
return;
|
2777
|
+
}
|
2778
|
+
|
2779
|
+
// We allow "pagebeforechange" observers to modify the toPage in the trigger
|
2780
|
+
// data to allow for redirects. Make sure our toPage is updated.
|
2781
|
+
|
2782
|
+
toPage = triggerData.toPage;
|
2783
|
+
|
2664
2784
|
// Set the isPageTransitioning flag to prevent any requests from
|
2665
2785
|
// entering this method while we are in the midst of loading a page
|
2666
2786
|
// or transitioning.
|
2667
2787
|
|
2668
2788
|
isPageTransitioning = true;
|
2669
2789
|
|
2670
|
-
var settings = $.extend( {}, $.mobile.changePage.defaults, options );
|
2671
|
-
|
2672
|
-
// Make sure we have a pageContainer to work with.
|
2673
|
-
settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
|
2674
|
-
|
2675
2790
|
// If the caller passed us a url, call loadPage()
|
2676
2791
|
// to make sure it is loaded into the DOM. We'll listen
|
2677
2792
|
// to the promise object it returns so we know when
|
@@ -2692,16 +2807,16 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2692
2807
|
|
2693
2808
|
//release transition lock so navigation is free again
|
2694
2809
|
releasePageTransitionLock();
|
2695
|
-
settings.pageContainer.trigger("
|
2810
|
+
settings.pageContainer.trigger( "pagechangefailed", triggerData );
|
2811
|
+
settings.pageContainer.trigger( "changepagefailed", triggerData ); // XXX: DEPRECATED for 1.0
|
2696
2812
|
});
|
2697
2813
|
return;
|
2698
2814
|
}
|
2699
2815
|
|
2700
2816
|
// The caller passed us a real page DOM element. Update our
|
2701
2817
|
// internal state and then trigger a transition to the page.
|
2702
|
-
var
|
2703
|
-
|
2704
|
-
url = toPage.jqmData( "url" ),
|
2818
|
+
var fromPage = settings.fromPage,
|
2819
|
+
url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ),
|
2705
2820
|
// The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path
|
2706
2821
|
pageUrl = url,
|
2707
2822
|
fileUrl = path.getFilePath( url ),
|
@@ -2711,9 +2826,6 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2711
2826
|
pageTitle = document.title,
|
2712
2827
|
isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog";
|
2713
2828
|
|
2714
|
-
// Let listeners know we're about to change the current page.
|
2715
|
-
mpc.trigger( "beforechangepage" );
|
2716
|
-
|
2717
2829
|
// If we are trying to transition to the same page that we are currently on ignore the request.
|
2718
2830
|
// an illegal same page request is defined by the current page being the same as the url, as long as there's history
|
2719
2831
|
// and toPage is not an array or object (those are allowed to be "same")
|
@@ -2722,7 +2834,8 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2722
2834
|
// to the same page.
|
2723
2835
|
if( fromPage && fromPage[0] === toPage[0] ) {
|
2724
2836
|
isPageTransitioning = false;
|
2725
|
-
mpc.trigger( "
|
2837
|
+
mpc.trigger( "pagechange", triggerData );
|
2838
|
+
mpc.trigger( "changepage", triggerData ); // XXX: DEPRECATED for 1.0
|
2726
2839
|
return;
|
2727
2840
|
}
|
2728
2841
|
|
@@ -2754,7 +2867,11 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2754
2867
|
// for the dialog content to be used in the hash. Instead, we want
|
2755
2868
|
// to append the dialogHashKey to the url of the current page.
|
2756
2869
|
if ( isDialog && active ) {
|
2757
|
-
|
2870
|
+
// on the initial page load active.url is undefined and in that case should
|
2871
|
+
// be an empty string. Moving the undefined -> empty string back into
|
2872
|
+
// urlHistory.addNew seemed imprudent given undefined better represents
|
2873
|
+
// the url state
|
2874
|
+
url = ( active.url || "" ) + dialogHashKey;
|
2758
2875
|
}
|
2759
2876
|
|
2760
2877
|
// Set the location hash.
|
@@ -2773,7 +2890,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2773
2890
|
|
2774
2891
|
//add page to history stack if it's not back or forward
|
2775
2892
|
if( !historyDir ) {
|
2776
|
-
urlHistory.addNew( url, settings.transition, pageTitle, pageUrl );
|
2893
|
+
urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role );
|
2777
2894
|
}
|
2778
2895
|
|
2779
2896
|
//set page title
|
@@ -2805,7 +2922,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2805
2922
|
releasePageTransitionLock();
|
2806
2923
|
|
2807
2924
|
// Let listeners know we're all done changing the current page.
|
2808
|
-
mpc.trigger( "
|
2925
|
+
mpc.trigger( "pagechange", triggerData );
|
2926
|
+
|
2927
|
+
mpc.trigger( "changepage", triggerData ); // XXX: DEPRECATED for 1.0
|
2809
2928
|
});
|
2810
2929
|
};
|
2811
2930
|
|
@@ -2817,7 +2936,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2817
2936
|
role: undefined, // By default we rely on the role defined by the @data-role attribute.
|
2818
2937
|
duplicateCachedPage: undefined,
|
2819
2938
|
pageContainer: undefined,
|
2820
|
-
showLoadMsg: true //loading message shows by default when pages are being fetched during changePage
|
2939
|
+
showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage
|
2940
|
+
dataUrl: undefined,
|
2941
|
+
fromPage: undefined
|
2821
2942
|
};
|
2822
2943
|
|
2823
2944
|
/* Event Bindings - hashchange, submit, and click */
|
@@ -2905,7 +3026,9 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2905
3026
|
var link = findClosestLink( event.target );
|
2906
3027
|
if ( link ) {
|
2907
3028
|
if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
|
2908
|
-
|
3029
|
+
removeActiveLinkClass( true );
|
3030
|
+
$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
|
3031
|
+
$activeClickedLink.addClass( $.mobile.activeBtnClass );
|
2909
3032
|
$( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur();
|
2910
3033
|
}
|
2911
3034
|
}
|
@@ -2983,8 +3106,6 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
2983
3106
|
// moved into more comprehensive isExternalLink
|
2984
3107
|
isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad );
|
2985
3108
|
|
2986
|
-
$activeClickedLink = $link.closest( ".ui-btn" );
|
2987
|
-
|
2988
3109
|
if( isExternal ) {
|
2989
3110
|
httpCleanup();
|
2990
3111
|
//use default click handling
|
@@ -3017,12 +3138,19 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3017
3138
|
});
|
3018
3139
|
} );
|
3019
3140
|
|
3020
|
-
|
3021
|
-
$window.bind( "hashchange", function( e, triggered ) {
|
3141
|
+
$.mobile._handleHashChange = function( hash ) {
|
3022
3142
|
//find first page via hash
|
3023
|
-
var to = path.stripHash(
|
3143
|
+
var to = path.stripHash( hash ),
|
3024
3144
|
//transition is false if it's the first page, undefined otherwise (and may be overridden by default)
|
3025
|
-
transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined
|
3145
|
+
transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined,
|
3146
|
+
|
3147
|
+
// default options for the changPage calls made after examining the current state
|
3148
|
+
// of the page and the hash
|
3149
|
+
changePageOptions = {
|
3150
|
+
transition: transition,
|
3151
|
+
changeHash: false,
|
3152
|
+
fromHashChange: true
|
3153
|
+
};
|
3026
3154
|
|
3027
3155
|
//if listening is disabled (either globally or temporarily), or it's a dialog hash
|
3028
3156
|
if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) {
|
@@ -3031,8 +3159,7 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3031
3159
|
}
|
3032
3160
|
|
3033
3161
|
// special case for dialogs
|
3034
|
-
if( urlHistory.stack.length > 1 &&
|
3035
|
-
to.indexOf( dialogHashKey ) > -1 ) {
|
3162
|
+
if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) {
|
3036
3163
|
|
3037
3164
|
// If current active page is not a dialog skip the dialog and continue
|
3038
3165
|
// in the same direction
|
@@ -3048,22 +3175,43 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3048
3175
|
// prevent changepage
|
3049
3176
|
return;
|
3050
3177
|
} else {
|
3051
|
-
var setTo = function() { to = $.mobile.urlHistory.getActive().pageUrl; };
|
3052
3178
|
// if the current active page is a dialog and we're navigating
|
3053
3179
|
// to a dialog use the dialog objected saved in the stack
|
3054
|
-
urlHistory.directHashChange({
|
3180
|
+
urlHistory.directHashChange({
|
3181
|
+
currentUrl: to,
|
3182
|
+
|
3183
|
+
// regardless of the direction of the history change
|
3184
|
+
// do the following
|
3185
|
+
either: function( isBack ) {
|
3186
|
+
var active = $.mobile.urlHistory.getActive();
|
3187
|
+
|
3188
|
+
to = active.pageUrl;
|
3189
|
+
|
3190
|
+
// make sure to set the role, transition and reversal
|
3191
|
+
// as most of this is lost by the domCache cleaning
|
3192
|
+
$.extend( changePageOptions, {
|
3193
|
+
role: active.role,
|
3194
|
+
transition: active.transition,
|
3195
|
+
reverse: isBack
|
3196
|
+
});
|
3197
|
+
}
|
3198
|
+
});
|
3055
3199
|
}
|
3056
3200
|
}
|
3057
|
-
|
3201
|
+
|
3058
3202
|
//if to is defined, load it
|
3059
3203
|
if ( to ) {
|
3060
3204
|
to = ( typeof to === "string" && !path.isPath( to ) ) ? ( '#' + to ) : to;
|
3061
|
-
$.mobile.changePage( to,
|
3062
|
-
}
|
3063
|
-
|
3064
|
-
|
3065
|
-
$.mobile.changePage( $.mobile.firstPage, { transition: transition, changeHash: false, fromHashChange: true } );
|
3205
|
+
$.mobile.changePage( to, changePageOptions );
|
3206
|
+
} else {
|
3207
|
+
//there's no hash, go to the first page in the dom
|
3208
|
+
$.mobile.changePage( $.mobile.firstPage, changePageOptions );
|
3066
3209
|
}
|
3210
|
+
};
|
3211
|
+
|
3212
|
+
//hashchange event handler
|
3213
|
+
$window.bind( "hashchange", function( e, triggered ) {
|
3214
|
+
$.mobile._handleHashChange( location.hash );
|
3067
3215
|
});
|
3068
3216
|
|
3069
3217
|
//set page min-heights to be device specific
|
@@ -3073,7 +3221,122 @@ $.widget( "mobile.page", $.mobile.widget, {
|
|
3073
3221
|
};//_registerInternalEvents callback
|
3074
3222
|
|
3075
3223
|
})( jQuery );
|
3076
|
-
|
3224
|
+
/*
|
3225
|
+
* jQuery Mobile Framework : history.pushState support, layered on top of hashchange
|
3226
|
+
* Copyright (c) jQuery Project
|
3227
|
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
3228
|
+
* http://jquery.org/license
|
3229
|
+
*/
|
3230
|
+
( function( $, window ) {
|
3231
|
+
// For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents
|
3232
|
+
// Scope self to pushStateHandler so we can reference it sanely within the
|
3233
|
+
// methods handed off as event handlers
|
3234
|
+
var pushStateHandler = {},
|
3235
|
+
self = pushStateHandler,
|
3236
|
+
$win = $( window ),
|
3237
|
+
url = $.mobile.path.parseUrl( location.href );
|
3238
|
+
|
3239
|
+
$.extend( pushStateHandler, {
|
3240
|
+
// TODO move to a path helper, this is rather common functionality
|
3241
|
+
initialFilePath: (function() {
|
3242
|
+
return url.pathname + url.search;
|
3243
|
+
})(),
|
3244
|
+
|
3245
|
+
initialHref: url.hrefNoHash,
|
3246
|
+
|
3247
|
+
// Flag for tracking if a Hashchange naturally occurs after each popstate + replace
|
3248
|
+
hashchangeFired: false,
|
3249
|
+
|
3250
|
+
state: function() {
|
3251
|
+
return {
|
3252
|
+
hash: location.hash || "#" + self.initialFilePath,
|
3253
|
+
title: document.title,
|
3254
|
+
|
3255
|
+
// persist across refresh
|
3256
|
+
initialHref: self.initialHref
|
3257
|
+
};
|
3258
|
+
},
|
3259
|
+
|
3260
|
+
resetUIKeys: function( url ) {
|
3261
|
+
var dialog = $.mobile.dialogHashKey,
|
3262
|
+
subkey = "&" + $.mobile.subPageUrlKey,
|
3263
|
+
dialogIndex = url.indexOf( dialog );
|
3264
|
+
|
3265
|
+
if( dialogIndex > -1 ) {
|
3266
|
+
url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex );
|
3267
|
+
} else if( url.indexOf( subkey ) > -1 ) {
|
3268
|
+
url = url.split( subkey ).join( "#" + subkey );
|
3269
|
+
}
|
3270
|
+
|
3271
|
+
return url;
|
3272
|
+
},
|
3273
|
+
|
3274
|
+
// on hash change we want to clean up the url
|
3275
|
+
// NOTE this takes place *after* the vanilla navigation hash change
|
3276
|
+
// handling has taken place and set the state of the DOM
|
3277
|
+
onHashChange: function( e ) {
|
3278
|
+
var href, state;
|
3279
|
+
|
3280
|
+
self.hashchangeFired = true;
|
3281
|
+
|
3282
|
+
// only replaceState when the hash doesn't represent an embeded page
|
3283
|
+
if( $.mobile.path.isPath(location.hash) ) {
|
3284
|
+
|
3285
|
+
// propulate the hash when its not available
|
3286
|
+
state = self.state();
|
3287
|
+
|
3288
|
+
// make the hash abolute with the current href
|
3289
|
+
href = $.mobile.path.makeUrlAbsolute( state.hash.replace("#", ""), location.href );
|
3290
|
+
|
3291
|
+
href = self.resetUIKeys( href );
|
3292
|
+
|
3293
|
+
// replace the current url with the new href and store the state
|
3294
|
+
history.replaceState( state, document.title, href );
|
3295
|
+
}
|
3296
|
+
},
|
3297
|
+
|
3298
|
+
// on popstate (ie back or forward) we need to replace the hash that was there previously
|
3299
|
+
// cleaned up by the additional hash handling
|
3300
|
+
onPopState: function( e ) {
|
3301
|
+
var poppedState = e.originalEvent.state, holdnexthashchange = false;
|
3302
|
+
|
3303
|
+
// if there's no state its not a popstate we care about, ie chrome's initial popstate
|
3304
|
+
// or forward popstate
|
3305
|
+
if( poppedState ) {
|
3306
|
+
// disable any hashchange triggered by the browser
|
3307
|
+
$.mobile.urlHistory.ignoreNextHashChange = true;
|
3308
|
+
|
3309
|
+
// defer our manual hashchange until after the browser fired
|
3310
|
+
// version has come and gone
|
3311
|
+
setTimeout(function() {
|
3312
|
+
// make sure that the manual hash handling takes place
|
3313
|
+
$.mobile.urlHistory.ignoreNextHashChange = false;
|
3314
|
+
|
3315
|
+
// change the page based on the hash
|
3316
|
+
$.mobile._handleHashChange( poppedState.hash );
|
3317
|
+
}, 100);
|
3318
|
+
}
|
3319
|
+
},
|
3320
|
+
|
3321
|
+
init: function() {
|
3322
|
+
$win.bind( "hashchange", self.onHashChange );
|
3323
|
+
|
3324
|
+
// Handle popstate events the occur through history changes
|
3325
|
+
$win.bind( "popstate", self.onPopState );
|
3326
|
+
|
3327
|
+
// if there's no hash, we need to replacestate for returning to home
|
3328
|
+
if ( location.hash === "" ) {
|
3329
|
+
history.replaceState( self.state(), document.title, location.href );
|
3330
|
+
}
|
3331
|
+
}
|
3332
|
+
});
|
3333
|
+
|
3334
|
+
$( function() {
|
3335
|
+
if( $.mobile.pushStateEnabled && $.support.pushState ){
|
3336
|
+
pushStateHandler.init();
|
3337
|
+
}
|
3338
|
+
});
|
3339
|
+
})( jQuery, this );/*!
|
3077
3340
|
* jQuery Mobile v@VERSION
|
3078
3341
|
* http://jquerymobile.com/
|
3079
3342
|
*
|
@@ -3141,7 +3404,7 @@ $.mobile.page.prototype.options.degradeInputs = {
|
|
3141
3404
|
month: false,
|
3142
3405
|
number: false,
|
3143
3406
|
range: "number",
|
3144
|
-
search:
|
3407
|
+
search: "text",
|
3145
3408
|
tel: false,
|
3146
3409
|
time: false,
|
3147
3410
|
url: false,
|
@@ -3324,7 +3587,9 @@ $( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", functi
|
|
3324
3587
|
|
3325
3588
|
} else if ( role === "content" ) {
|
3326
3589
|
|
3327
|
-
|
3590
|
+
if (theme || o.contentTheme) {
|
3591
|
+
$this.addClass( "ui-body-" + ( theme || o.contentTheme ) );
|
3592
|
+
}
|
3328
3593
|
|
3329
3594
|
// Add ARIA role
|
3330
3595
|
$this.attr( "role", "main" );
|
@@ -3345,7 +3610,7 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
|
|
3345
3610
|
options: {
|
3346
3611
|
expandCueText: " click to expand contents",
|
3347
3612
|
collapseCueText: " click to collapse contents",
|
3348
|
-
collapsed:
|
3613
|
+
collapsed: true,
|
3349
3614
|
heading: ">:header,>legend",
|
3350
3615
|
theme: null,
|
3351
3616
|
iconTheme: "d",
|
@@ -3653,22 +3918,26 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
3653
3918
|
return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
|
3654
3919
|
});
|
3655
3920
|
|
3656
|
-
t.refresh();
|
3921
|
+
t.refresh( true );
|
3657
3922
|
},
|
3658
3923
|
|
3659
3924
|
_itemApply: function( $list, item ) {
|
3925
|
+
var $countli = item.find( ".ui-li-count" );
|
3926
|
+
if ( $countli.length ) {
|
3927
|
+
item.addClass( "ui-li-has-count" );
|
3928
|
+
}
|
3929
|
+
$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
|
3930
|
+
|
3660
3931
|
// TODO class has to be defined in markup
|
3661
|
-
item.find( ".ui-li-
|
3662
|
-
.
|
3663
|
-
|
3664
|
-
|
3665
|
-
|
3666
|
-
|
3667
|
-
|
3668
|
-
|
3669
|
-
|
3670
|
-
$this.prependTo( $this.parent() ); //shift aside to front for css float
|
3671
|
-
});
|
3932
|
+
item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
|
3933
|
+
.find( "p, dl" ).addClass( "ui-li-desc" ).end()
|
3934
|
+
.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function() {
|
3935
|
+
item.addClass( $(this).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
|
3936
|
+
}).end()
|
3937
|
+
.find( ".ui-li-aside" ).each(function() {
|
3938
|
+
var $this = $(this);
|
3939
|
+
$this.prependTo( $this.parent() ); //shift aside to front for css float
|
3940
|
+
});
|
3672
3941
|
},
|
3673
3942
|
|
3674
3943
|
_removeCorners: function( li, which ) {
|
@@ -3686,6 +3955,43 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
3686
3955
|
}
|
3687
3956
|
},
|
3688
3957
|
|
3958
|
+
_refreshCorners: function( create ) {
|
3959
|
+
var $li,
|
3960
|
+
$visibleli,
|
3961
|
+
$topli,
|
3962
|
+
$bottomli;
|
3963
|
+
|
3964
|
+
if ( this.options.inset ) {
|
3965
|
+
$li = this.element.children( "li" );
|
3966
|
+
// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
|
3967
|
+
$visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" );
|
3968
|
+
|
3969
|
+
this._removeCorners( $li );
|
3970
|
+
|
3971
|
+
// Select the first visible li element
|
3972
|
+
$topli = $visibleli.first()
|
3973
|
+
.addClass( "ui-corner-top" );
|
3974
|
+
|
3975
|
+
$topli.add( $topli.find( ".ui-btn-inner" ) )
|
3976
|
+
.find( ".ui-li-link-alt" )
|
3977
|
+
.addClass( "ui-corner-tr" )
|
3978
|
+
.end()
|
3979
|
+
.find( ".ui-li-thumb" )
|
3980
|
+
.addClass( "ui-corner-tl" );
|
3981
|
+
|
3982
|
+
// Select the last visible li element
|
3983
|
+
$bottomli = $visibleli.last()
|
3984
|
+
.addClass( "ui-corner-bottom" );
|
3985
|
+
|
3986
|
+
$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
|
3987
|
+
.find( ".ui-li-link-alt" )
|
3988
|
+
.addClass( "ui-corner-br" )
|
3989
|
+
.end()
|
3990
|
+
.find( ".ui-li-thumb" )
|
3991
|
+
.addClass( "ui-corner-bl" );
|
3992
|
+
}
|
3993
|
+
},
|
3994
|
+
|
3689
3995
|
refresh: function( create ) {
|
3690
3996
|
this.parentPage = this.element.closest( ".ui-page" );
|
3691
3997
|
this._createSubPages();
|
@@ -3726,6 +4032,10 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
3726
4032
|
theme: itemTheme
|
3727
4033
|
});
|
3728
4034
|
|
4035
|
+
if ( ( icon != false ) && ( a.length == 1 ) ) {
|
4036
|
+
item.addClass( "ui-li-has-arrow" );
|
4037
|
+
}
|
4038
|
+
|
3729
4039
|
a.first().addClass( "ui-link-inherit" );
|
3730
4040
|
|
3731
4041
|
if ( a.length > 1 ) {
|
@@ -3771,40 +4081,6 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
3771
4081
|
}
|
3772
4082
|
}
|
3773
4083
|
|
3774
|
-
if ( o.inset ) {
|
3775
|
-
if ( pos === 0 ) {
|
3776
|
-
itemClass += " ui-corner-top";
|
3777
|
-
|
3778
|
-
item.add( item.find( ".ui-btn-inner" ) )
|
3779
|
-
.find( ".ui-li-link-alt" )
|
3780
|
-
.addClass( "ui-corner-tr" )
|
3781
|
-
.end()
|
3782
|
-
.find( ".ui-li-thumb" )
|
3783
|
-
.addClass( "ui-corner-tl" );
|
3784
|
-
|
3785
|
-
if ( item.next().next().length ) {
|
3786
|
-
self._removeCorners( item.next() );
|
3787
|
-
}
|
3788
|
-
}
|
3789
|
-
|
3790
|
-
if ( pos === li.length - 1 ) {
|
3791
|
-
itemClass += " ui-corner-bottom";
|
3792
|
-
|
3793
|
-
item.add( item.find( ".ui-btn-inner" ) )
|
3794
|
-
.find( ".ui-li-link-alt" )
|
3795
|
-
.addClass( "ui-corner-br" )
|
3796
|
-
.end()
|
3797
|
-
.find( ".ui-li-thumb" )
|
3798
|
-
.addClass( "ui-corner-bl" );
|
3799
|
-
|
3800
|
-
if ( item.prev().prev().length ) {
|
3801
|
-
self._removeCorners( item.prev() );
|
3802
|
-
} else if ( item.prev().length ) {
|
3803
|
-
self._removeCorners( item.prev(), "bottom" );
|
3804
|
-
}
|
3805
|
-
}
|
3806
|
-
}
|
3807
|
-
|
3808
4084
|
if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
|
3809
4085
|
countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
|
3810
4086
|
|
@@ -3814,10 +4090,10 @@ $.widget( "mobile.listview", $.mobile.widget, {
|
|
3814
4090
|
|
3815
4091
|
item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
|
3816
4092
|
|
3817
|
-
|
3818
|
-
self._itemApply( $list, item );
|
3819
|
-
}
|
4093
|
+
self._itemApply( $list, item );
|
3820
4094
|
}
|
4095
|
+
|
4096
|
+
this._refreshCorners( create );
|
3821
4097
|
},
|
3822
4098
|
|
3823
4099
|
//create a string for ID/subpage url creation
|
@@ -3926,6 +4202,9 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
3926
4202
|
$.mobile.listview.prototype.options.filter = false;
|
3927
4203
|
$.mobile.listview.prototype.options.filterPlaceholder = "Filter items...";
|
3928
4204
|
$.mobile.listview.prototype.options.filterTheme = "c";
|
4205
|
+
$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){
|
4206
|
+
return text.toLowerCase().indexOf( searchValue ) === -1;
|
4207
|
+
};
|
3929
4208
|
|
3930
4209
|
$( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
|
3931
4210
|
|
@@ -3953,7 +4232,7 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
|
|
3953
4232
|
lastval = $this.jqmData( "lastval" ) + "",
|
3954
4233
|
childItems = false,
|
3955
4234
|
itemtext = "",
|
3956
|
-
item;
|
4235
|
+
item, change;
|
3957
4236
|
|
3958
4237
|
// Change val as lastval for next execution
|
3959
4238
|
$this.jqmData( "lastval" , val );
|
@@ -3986,7 +4265,7 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
|
|
3986
4265
|
// New bucket!
|
3987
4266
|
childItems = false;
|
3988
4267
|
|
3989
|
-
} else if (
|
4268
|
+
} else if ( listview.options.filterCallback( itemtext, val ) ) {
|
3990
4269
|
|
3991
4270
|
//mark to be hidden
|
3992
4271
|
item.toggleClass( "ui-filter-hidequeue" , true );
|
@@ -4013,6 +4292,7 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
|
|
4013
4292
|
//filtervalue is empty => show all
|
4014
4293
|
listItems.toggleClass( "ui-screen-hidden", false );
|
4015
4294
|
}
|
4295
|
+
listview._refreshCorners();
|
4016
4296
|
})
|
4017
4297
|
.appendTo( wrapper )
|
4018
4298
|
.textinput();
|
@@ -4400,7 +4680,8 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
4400
4680
|
slider: slider,
|
4401
4681
|
handle: handle,
|
4402
4682
|
dragging: false,
|
4403
|
-
beforeStart: null
|
4683
|
+
beforeStart: null,
|
4684
|
+
userModified: false
|
4404
4685
|
});
|
4405
4686
|
|
4406
4687
|
if ( cType == "select" ) {
|
@@ -4413,7 +4694,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
4413
4694
|
|
4414
4695
|
var side = !i ? "b":"a",
|
4415
4696
|
corners = !i ? "right" :"left",
|
4416
|
-
theme = !i ? " ui-btn-down-" + trackTheme :"
|
4697
|
+
theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass );
|
4417
4698
|
|
4418
4699
|
$( "<div class='ui-slider-labelbg ui-slider-labelbg-" + side + theme + " ui-btn-corner-" + corners + "'></div>" )
|
4419
4700
|
.prependTo( slider );
|
@@ -4442,12 +4723,14 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
4442
4723
|
$( document ).bind( "vmousemove", function( event ) {
|
4443
4724
|
if ( self.dragging ) {
|
4444
4725
|
self.refresh( event );
|
4726
|
+
self.userModified = self.userModified || self.beforeStart !== control[0].selectedIndex;
|
4445
4727
|
return false;
|
4446
4728
|
}
|
4447
4729
|
});
|
4448
4730
|
|
4449
4731
|
slider.bind( "vmousedown", function( event ) {
|
4450
4732
|
self.dragging = true;
|
4733
|
+
self.userModified = false;
|
4451
4734
|
|
4452
4735
|
if ( cType === "select" ) {
|
4453
4736
|
self.beforeStart = control[0].selectedIndex;
|
@@ -4464,18 +4747,11 @@ $.widget( "mobile.slider", $.mobile.widget, {
|
|
4464
4747
|
|
4465
4748
|
if ( cType === "select" ) {
|
4466
4749
|
|
4467
|
-
if ( self.
|
4750
|
+
if ( !self.userModified ) {
|
4468
4751
|
//tap occurred, but value didn't change. flip it!
|
4752
|
+
handle.addClass( "ui-slider-handle-snapping" );
|
4469
4753
|
self.refresh( !self.beforeStart ? 1 : 0 );
|
4470
4754
|
}
|
4471
|
-
var curval = val();
|
4472
|
-
var snapped = Math.round( curval / ( max - min ) * 100 );
|
4473
|
-
handle
|
4474
|
-
.addClass( "ui-slider-handle-snapping" )
|
4475
|
-
.css( "left", snapped + "%" )
|
4476
|
-
.animationComplete( function() {
|
4477
|
-
handle.removeClass( "ui-slider-handle-snapping" );
|
4478
|
-
});
|
4479
4755
|
}
|
4480
4756
|
return false;
|
4481
4757
|
}
|
@@ -4652,7 +4928,8 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
4652
4928
|
|
4653
4929
|
});
|
4654
4930
|
|
4655
|
-
})( jQuery )
|
4931
|
+
})( jQuery );
|
4932
|
+
/*
|
4656
4933
|
* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas
|
4657
4934
|
* Copyright (c) jQuery Project
|
4658
4935
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
@@ -4788,619 +5065,683 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
4788
5065
|
|
4789
5066
|
})( jQuery );
|
4790
5067
|
/*
|
4791
|
-
* jQuery Mobile Framework : "selectmenu" plugin
|
5068
|
+
* jQuery Mobile Framework : custom "selectmenu" plugin
|
4792
5069
|
* Copyright (c) jQuery Project
|
4793
5070
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
4794
5071
|
* http://jquery.org/license
|
4795
5072
|
*/
|
4796
5073
|
|
4797
5074
|
(function( $, undefined ) {
|
5075
|
+
var extendSelect = function( widget ){
|
5076
|
+
|
5077
|
+
var select = widget.select,
|
5078
|
+
selectID = widget.selectID,
|
5079
|
+
label = widget.label,
|
5080
|
+
thisPage = widget.select.closest( ".ui-page" ),
|
5081
|
+
screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ),
|
5082
|
+
selectOptions = widget.select.find("option"),
|
5083
|
+
isMultiple = widget.isMultiple = widget.select[ 0 ].multiple,
|
5084
|
+
buttonId = selectID + "-button",
|
5085
|
+
menuId = selectID + "-menu",
|
5086
|
+
menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.menuPageTheme +"'>" +
|
5087
|
+
"<div data-" + $.mobile.ns + "role='header'>" +
|
5088
|
+
"<div class='ui-title'>" + label.text() + "</div>"+
|
5089
|
+
"</div>"+
|
5090
|
+
"<div data-" + $.mobile.ns + "role='content'></div>"+
|
5091
|
+
"</div>" ).appendTo( $.mobile.pageContainer ).page(),
|
5092
|
+
|
5093
|
+
listbox = $("<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen),
|
5094
|
+
|
5095
|
+
list = $( "<ul>", {
|
5096
|
+
"class": "ui-selectmenu-list",
|
5097
|
+
"id": menuId,
|
5098
|
+
"role": "listbox",
|
5099
|
+
"aria-labelledby": buttonId
|
5100
|
+
}).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ),
|
5101
|
+
|
5102
|
+
header = $( "<div>", {
|
5103
|
+
"class": "ui-header ui-bar-" + widget.options.theme
|
5104
|
+
}).prependTo( listbox ),
|
5105
|
+
|
5106
|
+
headerTitle = $( "<h1>", {
|
5107
|
+
"class": "ui-title"
|
5108
|
+
}).appendTo( header ),
|
5109
|
+
|
5110
|
+
headerClose = $( "<a>", {
|
5111
|
+
"text": widget.options.closeText,
|
5112
|
+
"href": "#",
|
5113
|
+
"class": "ui-btn-left"
|
5114
|
+
}).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(),
|
5115
|
+
|
5116
|
+
menuPageContent = menuPage.find( ".ui-content" ),
|
5117
|
+
|
5118
|
+
menuPageClose = menuPage.find( ".ui-header a" );
|
5119
|
+
|
5120
|
+
|
5121
|
+
$.extend( widget, {
|
5122
|
+
select: widget.select,
|
5123
|
+
selectID: selectID,
|
5124
|
+
buttonId: buttonId,
|
5125
|
+
menuId: menuId,
|
5126
|
+
thisPage: thisPage,
|
5127
|
+
menuPage: menuPage,
|
5128
|
+
label: label,
|
5129
|
+
screen: screen,
|
5130
|
+
selectOptions: selectOptions,
|
5131
|
+
isMultiple: isMultiple,
|
5132
|
+
theme: widget.options.theme,
|
5133
|
+
listbox: listbox,
|
5134
|
+
list: list,
|
5135
|
+
header: header,
|
5136
|
+
headerTitle: headerTitle,
|
5137
|
+
headerClose: headerClose,
|
5138
|
+
menuPageContent: menuPageContent,
|
5139
|
+
menuPageClose: menuPageClose,
|
5140
|
+
placeholder: "",
|
4798
5141
|
|
4799
|
-
|
4800
|
-
|
4801
|
-
theme: null,
|
4802
|
-
disabled: false,
|
4803
|
-
icon: "arrow-d",
|
4804
|
-
iconpos: "right",
|
4805
|
-
inline: null,
|
4806
|
-
corners: true,
|
4807
|
-
shadow: true,
|
4808
|
-
iconshadow: true,
|
4809
|
-
menuPageTheme: "b",
|
4810
|
-
overlayTheme: "a",
|
4811
|
-
hidePlaceholderMenuItems: true,
|
4812
|
-
closeText: "Close",
|
4813
|
-
nativeMenu: true,
|
4814
|
-
initSelector: "select:not(:jqmData(role='slider'))"
|
4815
|
-
},
|
4816
|
-
_create: function() {
|
5142
|
+
build: function() {
|
5143
|
+
var self = this;
|
4817
5144
|
|
4818
|
-
|
5145
|
+
// Create list from select, update state
|
5146
|
+
self.refresh();
|
4819
5147
|
|
4820
|
-
|
5148
|
+
self.select.attr( "tabindex", "-1" ).focus(function() {
|
5149
|
+
$( this ).blur();
|
5150
|
+
self.button.focus();
|
5151
|
+
});
|
4821
5152
|
|
4822
|
-
|
4823
|
-
|
5153
|
+
// Button events
|
5154
|
+
self.button.bind( "vclick keydown" , function( event ) {
|
5155
|
+
if ( event.type == "vclick" ||
|
5156
|
+
event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER ||
|
5157
|
+
event.keyCode === $.mobile.keyCode.SPACE ) ) {
|
4824
5158
|
|
4825
|
-
|
5159
|
+
self.open();
|
5160
|
+
event.preventDefault();
|
5161
|
+
}
|
5162
|
+
});
|
4826
5163
|
|
4827
|
-
|
5164
|
+
// Events for list items
|
5165
|
+
self.list.attr( "role", "listbox" )
|
5166
|
+
.delegate( ".ui-li>a", "focusin", function() {
|
5167
|
+
$( this ).attr( "tabindex", "0" );
|
5168
|
+
})
|
5169
|
+
.delegate( ".ui-li>a", "focusout", function() {
|
5170
|
+
$( this ).attr( "tabindex", "-1" );
|
5171
|
+
})
|
5172
|
+
.delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) {
|
4828
5173
|
|
4829
|
-
|
4830
|
-
|
4831
|
-
|
4832
|
-
|
5174
|
+
// index of option tag to be selected
|
5175
|
+
var oldIndex = self.select[ 0 ].selectedIndex,
|
5176
|
+
newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ),
|
5177
|
+
option = self.selectOptions.eq( newIndex )[ 0 ];
|
5178
|
+
|
5179
|
+
// toggle selected status on the tag for multi selects
|
5180
|
+
option.selected = self.isMultiple ? !option.selected : true;
|
5181
|
+
|
5182
|
+
// toggle checkbox class for multiple selects
|
5183
|
+
if ( self.isMultiple ) {
|
5184
|
+
$( this ).find( ".ui-icon" )
|
5185
|
+
.toggleClass( "ui-icon-checkbox-on", option.selected )
|
5186
|
+
.toggleClass( "ui-icon-checkbox-off", !option.selected );
|
5187
|
+
}
|
4833
5188
|
|
4834
|
-
|
4835
|
-
|
4836
|
-
|
4837
|
-
|
4838
|
-
"aria-haspopup": "true",
|
4839
|
-
"aria-owns": menuId
|
4840
|
-
}) )
|
4841
|
-
.text( $( select[ 0 ].options.item( selectedIndex ) ).text() )
|
4842
|
-
.insertBefore( select )
|
4843
|
-
.buttonMarkup({
|
4844
|
-
theme: o.theme,
|
4845
|
-
icon: o.icon,
|
4846
|
-
iconpos: o.iconpos,
|
4847
|
-
inline: o.inline,
|
4848
|
-
corners: o.corners,
|
4849
|
-
shadow: o.shadow,
|
4850
|
-
iconshadow: o.iconshadow
|
4851
|
-
}),
|
5189
|
+
// trigger change if value changed
|
5190
|
+
if ( self.isMultiple || oldIndex !== newIndex ) {
|
5191
|
+
self.select.trigger( "change" );
|
5192
|
+
}
|
4852
5193
|
|
4853
|
-
|
4854
|
-
|
5194
|
+
//hide custom select for single selects only
|
5195
|
+
if ( !self.isMultiple ) {
|
5196
|
+
self.close();
|
5197
|
+
}
|
4855
5198
|
|
4856
|
-
|
4857
|
-
|
4858
|
-
|
4859
|
-
|
4860
|
-
|
4861
|
-
|
4862
|
-
|
4863
|
-
|
4864
|
-
|
4865
|
-
|
4866
|
-
|
4867
|
-
|
4868
|
-
|
4869
|
-
|
4870
|
-
|
5199
|
+
event.preventDefault();
|
5200
|
+
})
|
5201
|
+
.keydown(function( event ) { //keyboard events for menu items
|
5202
|
+
var target = $( event.target ),
|
5203
|
+
li = target.closest( "li" ),
|
5204
|
+
prev, next;
|
5205
|
+
|
5206
|
+
// switch logic based on which key was pressed
|
5207
|
+
switch ( event.keyCode ) {
|
5208
|
+
// up or left arrow keys
|
5209
|
+
case 38:
|
5210
|
+
prev = li.prev();
|
5211
|
+
|
5212
|
+
// if there's a previous option, focus it
|
5213
|
+
if ( prev.length ) {
|
5214
|
+
target
|
5215
|
+
.blur()
|
5216
|
+
.attr( "tabindex", "-1" );
|
5217
|
+
|
5218
|
+
prev.find( "a" ).first().focus();
|
5219
|
+
}
|
4871
5220
|
|
4872
|
-
|
5221
|
+
return false;
|
5222
|
+
break;
|
4873
5223
|
|
4874
|
-
|
4875
|
-
|
5224
|
+
// down or right arrow keys
|
5225
|
+
case 40:
|
5226
|
+
next = li.next();
|
4876
5227
|
|
4877
|
-
|
4878
|
-
|
4879
|
-
|
4880
|
-
|
4881
|
-
|
4882
|
-
"</div>" )
|
4883
|
-
.appendTo( $.mobile.pageContainer )
|
4884
|
-
.page(),
|
5228
|
+
// if there's a next option, focus it
|
5229
|
+
if ( next.length ) {
|
5230
|
+
target
|
5231
|
+
.blur()
|
5232
|
+
.attr( "tabindex", "-1" );
|
4885
5233
|
|
4886
|
-
|
5234
|
+
next.find( "a" ).first().focus();
|
5235
|
+
}
|
4887
5236
|
|
4888
|
-
|
5237
|
+
return false;
|
5238
|
+
break;
|
4889
5239
|
|
4890
|
-
|
4891
|
-
|
5240
|
+
// If enter or space is pressed, trigger click
|
5241
|
+
case 13:
|
5242
|
+
case 32:
|
5243
|
+
target.trigger( "click" );
|
4892
5244
|
|
4893
|
-
|
4894
|
-
|
5245
|
+
return false;
|
5246
|
+
break;
|
5247
|
+
}
|
5248
|
+
});
|
4895
5249
|
|
4896
|
-
|
4897
|
-
|
4898
|
-
|
4899
|
-
|
4900
|
-
|
4901
|
-
|
4902
|
-
.attr( "data-" + $.mobile.ns + "theme", theme )
|
4903
|
-
.appendTo( listbox ),
|
5250
|
+
// button refocus ensures proper height calculation
|
5251
|
+
// by removing the inline style and ensuring page inclusion
|
5252
|
+
self.menuPage.bind( "pagehide", function() {
|
5253
|
+
self.list.appendTo( self.listbox );
|
5254
|
+
self._focusButton();
|
5255
|
+
});
|
4904
5256
|
|
4905
|
-
|
4906
|
-
|
4907
|
-
|
4908
|
-
|
5257
|
+
// Events on "screen" overlay
|
5258
|
+
self.screen.bind( "vclick", function( event ) {
|
5259
|
+
self.close();
|
5260
|
+
});
|
4909
5261
|
|
4910
|
-
|
4911
|
-
|
4912
|
-
|
4913
|
-
|
5262
|
+
// Close button on small overlays
|
5263
|
+
self.headerClose.click( function() {
|
5264
|
+
if ( self.menuType == "overlay" ) {
|
5265
|
+
self.close();
|
5266
|
+
return false;
|
5267
|
+
}
|
5268
|
+
});
|
5269
|
+
},
|
4914
5270
|
|
4915
|
-
|
4916
|
-
|
4917
|
-
|
4918
|
-
|
4919
|
-
|
4920
|
-
|
4921
|
-
|
4922
|
-
|
4923
|
-
|
5271
|
+
refresh: function( forceRebuild ){
|
5272
|
+
var self = this,
|
5273
|
+
select = this.element,
|
5274
|
+
isMultiple = this.isMultiple,
|
5275
|
+
options = this.selectOptions = select.find( "option" ),
|
5276
|
+
selected = this.selected(),
|
5277
|
+
// return an array of all selected index's
|
5278
|
+
indicies = this.selectedIndices();
|
5279
|
+
|
5280
|
+
if ( forceRebuild || select[0].options.length != self.list.find( "li" ).length ) {
|
5281
|
+
self._buildList();
|
5282
|
+
}
|
4924
5283
|
|
4925
|
-
|
4926
|
-
|
5284
|
+
self.setButtonText();
|
5285
|
+
self.setButtonCount();
|
4927
5286
|
|
4928
|
-
|
4929
|
-
|
4930
|
-
|
4931
|
-
|
4932
|
-
.hide()
|
4933
|
-
.appendTo( button );
|
4934
|
-
}
|
5287
|
+
self.list.find( "li:not(.ui-li-divider)" )
|
5288
|
+
.removeClass( $.mobile.activeBtnClass )
|
5289
|
+
.attr( "aria-selected", false )
|
5290
|
+
.each(function( i ) {
|
4935
5291
|
|
4936
|
-
|
4937
|
-
|
4938
|
-
this.disable();
|
4939
|
-
}
|
5292
|
+
if ( $.inArray( i, indicies ) > -1 ) {
|
5293
|
+
var item = $( this );
|
4940
5294
|
|
4941
|
-
|
4942
|
-
|
4943
|
-
self.refresh();
|
4944
|
-
});
|
5295
|
+
// Aria selected attr
|
5296
|
+
item.attr( "aria-selected", true );
|
4945
5297
|
|
4946
|
-
|
4947
|
-
|
4948
|
-
|
4949
|
-
|
4950
|
-
|
4951
|
-
|
4952
|
-
|
4953
|
-
|
4954
|
-
|
4955
|
-
button: button,
|
4956
|
-
menuPage: menuPage,
|
4957
|
-
menuPageContent: menuPageContent,
|
4958
|
-
screen: screen,
|
4959
|
-
listbox: listbox,
|
4960
|
-
list: list,
|
4961
|
-
menuType: menuType,
|
4962
|
-
header: header,
|
4963
|
-
headerClose: headerClose,
|
4964
|
-
headerTitle: headerTitle,
|
4965
|
-
placeholder: ""
|
4966
|
-
});
|
5298
|
+
// Multiple selects: add the "on" checkbox state to the icon
|
5299
|
+
if ( self.isMultiple ) {
|
5300
|
+
item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" );
|
5301
|
+
} else {
|
5302
|
+
item.addClass( $.mobile.activeBtnClass );
|
5303
|
+
}
|
5304
|
+
}
|
5305
|
+
});
|
5306
|
+
},
|
4967
5307
|
|
4968
|
-
|
4969
|
-
|
5308
|
+
close: function() {
|
5309
|
+
if ( this.options.disabled || !this.isOpen ) {
|
5310
|
+
return;
|
5311
|
+
}
|
4970
5312
|
|
4971
|
-
|
4972
|
-
|
4973
|
-
|
4974
|
-
|
4975
|
-
|
4976
|
-
|
4977
|
-
|
4978
|
-
|
4979
|
-
|
4980
|
-
|
4981
|
-
|
4982
|
-
|
4983
|
-
|
5313
|
+
var self = this;
|
5314
|
+
|
5315
|
+
if ( self.menuType == "page" ) {
|
5316
|
+
// TODO centralize page removal binding / handling in the page plugin.
|
5317
|
+
// Suggestion from @jblas to do refcounting
|
5318
|
+
//
|
5319
|
+
// rebind the page remove that was unbound in the open function
|
5320
|
+
// to allow for the parent page removal from actions other than the use
|
5321
|
+
// of a dialog sized custom select
|
5322
|
+
if( !self.thisPage.data("page").options.domCache ){
|
5323
|
+
self.thisPage.bind( "pagehide.remove", function() {
|
5324
|
+
$(self).remove();
|
5325
|
+
});
|
5326
|
+
}
|
4984
5327
|
|
4985
|
-
|
4986
|
-
|
4987
|
-
|
5328
|
+
// doesn't solve the possible issue with calling change page
|
5329
|
+
// where the objects don't define data urls which prevents dialog key
|
5330
|
+
// stripping - changePage has incoming refactor
|
5331
|
+
window.history.back();
|
5332
|
+
} else {
|
5333
|
+
self.screen.addClass( "ui-screen-hidden" );
|
5334
|
+
self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" );
|
5335
|
+
self.list.appendTo( self.listbox );
|
5336
|
+
self._focusButton();
|
5337
|
+
}
|
4988
5338
|
|
5339
|
+
// allow the dialog to be closed again
|
5340
|
+
self.isOpen = false;
|
5341
|
+
},
|
4989
5342
|
|
4990
|
-
|
5343
|
+
open: function() {
|
5344
|
+
if ( this.options.disabled ) {
|
5345
|
+
return;
|
5346
|
+
}
|
4991
5347
|
|
4992
|
-
|
4993
|
-
|
5348
|
+
var self = this,
|
5349
|
+
menuHeight = self.list.parent().outerHeight(),
|
5350
|
+
menuWidth = self.list.parent().outerWidth(),
|
5351
|
+
scrollTop = $( window ).scrollTop(),
|
5352
|
+
btnOffset = self.button.offset().top,
|
5353
|
+
screenHeight = window.innerHeight,
|
5354
|
+
screenWidth = window.innerWidth;
|
4994
5355
|
|
4995
|
-
|
4996
|
-
.
|
4997
|
-
$(this).blur();
|
4998
|
-
button.focus();
|
4999
|
-
});
|
5356
|
+
//add active class to button
|
5357
|
+
self.button.addClass( $.mobile.activeBtnClass );
|
5000
5358
|
|
5001
|
-
|
5002
|
-
|
5003
|
-
|
5004
|
-
|
5005
|
-
event.keyCode === $.mobile.keyCode.SPACE ) ) {
|
5359
|
+
//remove after delay
|
5360
|
+
setTimeout( function() {
|
5361
|
+
self.button.removeClass( $.mobile.activeBtnClass );
|
5362
|
+
}, 300);
|
5006
5363
|
|
5007
|
-
|
5008
|
-
|
5364
|
+
function focusMenuItem() {
|
5365
|
+
self.list.find( $.mobile.activeBtnClass ).focus();
|
5009
5366
|
}
|
5010
|
-
});
|
5011
|
-
|
5012
|
-
// Events for list items
|
5013
|
-
list.attr( "role", "listbox" )
|
5014
|
-
.delegate( ".ui-li>a", "focusin", function() {
|
5015
|
-
$( this ).attr( "tabindex", "0" );
|
5016
|
-
})
|
5017
|
-
.delegate( ".ui-li>a", "focusout", function() {
|
5018
|
-
$( this ).attr( "tabindex", "-1" );
|
5019
|
-
})
|
5020
|
-
.delegate( "li:not(.ui-disabled, .ui-li-divider)", "vclick", function( event ) {
|
5021
5367
|
|
5022
|
-
|
5023
|
-
|
5024
|
-
|
5025
|
-
|
5026
|
-
|
5027
|
-
|
5028
|
-
// toggle selected status on the tag for multi selects
|
5029
|
-
option.selected = isMultiple ? !option.selected : true;
|
5030
|
-
|
5031
|
-
// toggle checkbox class for multiple selects
|
5032
|
-
if ( isMultiple ) {
|
5033
|
-
$this.find( ".ui-icon" )
|
5034
|
-
.toggleClass( "ui-icon-checkbox-on", option.selected )
|
5035
|
-
.toggleClass( "ui-icon-checkbox-off", !option.selected );
|
5036
|
-
}
|
5368
|
+
if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
|
5369
|
+
// prevent the parent page from being removed from the DOM,
|
5370
|
+
// otherwise the results of selecting a list item in the dialog
|
5371
|
+
// fall into a black hole
|
5372
|
+
self.thisPage.unbind( "pagehide.remove" );
|
5037
5373
|
|
5038
|
-
//
|
5039
|
-
if (
|
5040
|
-
|
5374
|
+
//for webos (set lastscroll using button offset)
|
5375
|
+
if ( scrollTop == 0 && btnOffset > screenHeight ) {
|
5376
|
+
self.thisPage.one( "pagehide", function() {
|
5377
|
+
$( this ).jqmData( "lastScroll", btnOffset );
|
5378
|
+
});
|
5041
5379
|
}
|
5042
5380
|
|
5043
|
-
|
5044
|
-
|
5045
|
-
|
5046
|
-
|
5381
|
+
self.menuPage.one( "pageshow", function() {
|
5382
|
+
// silentScroll() is called whenever a page is shown to restore
|
5383
|
+
// any previous scroll position the page may have had. We need to
|
5384
|
+
// wait for the "silentscroll" event before setting focus to avoid
|
5385
|
+
// the browser"s "feature" which offsets rendering to make sure
|
5386
|
+
// whatever has focus is in view.
|
5387
|
+
$( window ).one( "silentscroll", function() {
|
5388
|
+
focusMenuItem();
|
5389
|
+
});
|
5047
5390
|
|
5048
|
-
|
5049
|
-
|
5050
|
-
//keyboard events for menu items
|
5051
|
-
.keydown(function( event ) {
|
5052
|
-
var target = $( event.target ),
|
5053
|
-
li = target.closest( "li" ),
|
5054
|
-
prev, next;
|
5391
|
+
self.isOpen = true;
|
5392
|
+
});
|
5055
5393
|
|
5056
|
-
|
5057
|
-
|
5058
|
-
|
5059
|
-
|
5060
|
-
|
5394
|
+
self.menuType = "page";
|
5395
|
+
self.menuPageContent.append( self.list );
|
5396
|
+
$.mobile.changePage( self.menuPage, {
|
5397
|
+
transition: $.mobile.defaultDialogTransition
|
5398
|
+
});
|
5399
|
+
} else {
|
5400
|
+
self.menuType = "overlay";
|
5061
5401
|
|
5062
|
-
|
5063
|
-
|
5064
|
-
target
|
5065
|
-
.blur()
|
5066
|
-
.attr( "tabindex", "-1" );
|
5402
|
+
self.screen.height( $(document).height() )
|
5403
|
+
.removeClass( "ui-screen-hidden" );
|
5067
5404
|
|
5068
|
-
|
5069
|
-
|
5405
|
+
// Try and center the overlay over the button
|
5406
|
+
var roomtop = btnOffset - scrollTop,
|
5407
|
+
roombot = scrollTop + screenHeight - btnOffset,
|
5408
|
+
halfheight = menuHeight / 2,
|
5409
|
+
maxwidth = parseFloat( self.list.parent().css( "max-width" ) ),
|
5410
|
+
newtop, newleft;
|
5070
5411
|
|
5071
|
-
|
5072
|
-
|
5412
|
+
if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) {
|
5413
|
+
newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight;
|
5414
|
+
} else {
|
5415
|
+
// 30px tolerance off the edges
|
5416
|
+
newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30;
|
5417
|
+
}
|
5073
5418
|
|
5074
|
-
//
|
5075
|
-
|
5076
|
-
|
5419
|
+
// If the menuwidth is smaller than the screen center is
|
5420
|
+
if ( menuWidth < maxwidth ) {
|
5421
|
+
newleft = ( screenWidth - menuWidth ) / 2;
|
5422
|
+
} else {
|
5077
5423
|
|
5078
|
-
//
|
5079
|
-
|
5080
|
-
target
|
5081
|
-
.blur()
|
5082
|
-
.attr( "tabindex", "-1" );
|
5424
|
+
//otherwise insure a >= 30px offset from the left
|
5425
|
+
newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2;
|
5083
5426
|
|
5084
|
-
|
5427
|
+
// 30px tolerance off the edges
|
5428
|
+
if ( newleft < 30 ) {
|
5429
|
+
newleft = 30;
|
5430
|
+
} else if ( (newleft + menuWidth) > screenWidth ) {
|
5431
|
+
newleft = screenWidth - menuWidth - 30;
|
5085
5432
|
}
|
5433
|
+
}
|
5086
5434
|
|
5087
|
-
|
5088
|
-
|
5435
|
+
self.listbox.append( self.list )
|
5436
|
+
.removeClass( "ui-selectmenu-hidden" )
|
5437
|
+
.css({
|
5438
|
+
top: newtop,
|
5439
|
+
left: newleft
|
5440
|
+
})
|
5441
|
+
.addClass( "in" );
|
5089
5442
|
|
5090
|
-
|
5091
|
-
case 13:
|
5092
|
-
case 32:
|
5093
|
-
target.trigger( "vclick" );
|
5443
|
+
focusMenuItem();
|
5094
5444
|
|
5095
|
-
|
5096
|
-
|
5445
|
+
// duplicate with value set in page show for dialog sized selects
|
5446
|
+
self.isOpen = true;
|
5097
5447
|
}
|
5098
|
-
}
|
5448
|
+
},
|
5099
5449
|
|
5100
|
-
|
5101
|
-
|
5102
|
-
|
5103
|
-
|
5104
|
-
|
5105
|
-
|
5450
|
+
_buildList: function() {
|
5451
|
+
var self = this,
|
5452
|
+
o = this.options,
|
5453
|
+
placeholder = this.placeholder,
|
5454
|
+
optgroups = [],
|
5455
|
+
lis = [],
|
5456
|
+
dataIcon = self.isMultiple ? "checkbox-off" : "false";
|
5106
5457
|
|
5107
|
-
|
5108
|
-
screen.bind( "vclick", function( event ) {
|
5109
|
-
self.close();
|
5110
|
-
});
|
5458
|
+
self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
|
5111
5459
|
|
5112
|
-
|
5113
|
-
|
5114
|
-
|
5115
|
-
|
5116
|
-
|
5117
|
-
|
5118
|
-
|
5119
|
-
|
5120
|
-
|
5460
|
+
// Populate menu with options from select element
|
5461
|
+
self.select.find( "option" ).each( function( i ) {
|
5462
|
+
var $this = $( this ),
|
5463
|
+
$parent = $this.parent(),
|
5464
|
+
text = $this.text(),
|
5465
|
+
anchor = "<a href='#'>"+ text +"</a>",
|
5466
|
+
classes = [],
|
5467
|
+
extraAttrs = [];
|
5468
|
+
|
5469
|
+
// Are we inside an optgroup?
|
5470
|
+
if ( $parent.is( "optgroup" ) ) {
|
5471
|
+
var optLabel = $parent.attr( "label" );
|
5472
|
+
|
5473
|
+
// has this optgroup already been built yet?
|
5474
|
+
if ( $.inArray( optLabel, optgroups ) === -1 ) {
|
5475
|
+
lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" );
|
5476
|
+
optgroups.push( optLabel );
|
5477
|
+
}
|
5478
|
+
}
|
5121
5479
|
|
5122
|
-
|
5123
|
-
|
5124
|
-
|
5125
|
-
|
5126
|
-
|
5127
|
-
|
5128
|
-
|
5480
|
+
// Find placeholder text
|
5481
|
+
// TODO: Are you sure you want to use getAttribute? ^RW
|
5482
|
+
if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) {
|
5483
|
+
if ( o.hidePlaceholderMenuItems ) {
|
5484
|
+
classes.push( "ui-selectmenu-placeholder" );
|
5485
|
+
}
|
5486
|
+
placeholder = self.placeholder = text;
|
5487
|
+
}
|
5129
5488
|
|
5130
|
-
|
5489
|
+
// support disabled option tags
|
5490
|
+
if ( this.disabled ) {
|
5491
|
+
classes.push( "ui-disabled" );
|
5492
|
+
extraAttrs.push( "aria-disabled='true'" );
|
5493
|
+
}
|
5131
5494
|
|
5132
|
-
|
5133
|
-
|
5134
|
-
|
5135
|
-
|
5136
|
-
|
5137
|
-
|
5138
|
-
|
5139
|
-
|
5140
|
-
|
5141
|
-
|
5142
|
-
|
5143
|
-
|
5144
|
-
|
5145
|
-
// has this optgroup already been built yet?
|
5146
|
-
if ( $.inArray( optLabel, optgroups ) === -1 ) {
|
5147
|
-
lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" );
|
5148
|
-
optgroups.push( optLabel );
|
5495
|
+
lis.push( "<li data-" + $.mobile.ns + "option-index='" + i + "' data-" + $.mobile.ns + "icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" );
|
5496
|
+
});
|
5497
|
+
|
5498
|
+
self.list.html( lis.join(" ") );
|
5499
|
+
|
5500
|
+
self.list.find( "li" )
|
5501
|
+
.attr({ "role": "option", "tabindex": "-1" })
|
5502
|
+
.first().attr( "tabindex", "0" );
|
5503
|
+
|
5504
|
+
// Hide header close link for single selects
|
5505
|
+
if ( !this.isMultiple ) {
|
5506
|
+
this.headerClose.hide();
|
5149
5507
|
}
|
5150
|
-
}
|
5151
5508
|
|
5152
|
-
|
5153
|
-
|
5154
|
-
|
5155
|
-
|
5156
|
-
|
5509
|
+
// Hide header if it's not a multiselect and there's no placeholder
|
5510
|
+
if ( !this.isMultiple && !placeholder.length ) {
|
5511
|
+
this.header.hide();
|
5512
|
+
} else {
|
5513
|
+
this.headerTitle.text( this.placeholder );
|
5157
5514
|
}
|
5158
|
-
placeholder = self.placeholder = text;
|
5159
|
-
}
|
5160
5515
|
|
5161
|
-
|
5162
|
-
|
5163
|
-
|
5164
|
-
extraAttrs.push( "aria-disabled='true'" );
|
5165
|
-
}
|
5516
|
+
// Now populated, create listview
|
5517
|
+
self.list.listview();
|
5518
|
+
},
|
5166
5519
|
|
5167
|
-
|
5168
|
-
|
5520
|
+
_button: function(){
|
5521
|
+
return $( "<a>", {
|
5522
|
+
"href": "#",
|
5523
|
+
"role": "button",
|
5524
|
+
// TODO value is undefined at creation
|
5525
|
+
"id": this.buttonId,
|
5526
|
+
"aria-haspopup": "true",
|
5169
5527
|
|
5170
|
-
|
5528
|
+
// TODO value is undefined at creation
|
5529
|
+
"aria-owns": this.menuId
|
5530
|
+
});
|
5531
|
+
}
|
5532
|
+
});
|
5533
|
+
};
|
5171
5534
|
|
5172
|
-
|
5173
|
-
|
5174
|
-
.first().attr( "tabindex", "0" );
|
5535
|
+
$( "select" ).live( "selectmenubeforecreate", function(){
|
5536
|
+
var selectmenuWidget = $( this ).data( "selectmenu" );
|
5175
5537
|
|
5176
|
-
|
5177
|
-
|
5178
|
-
this.headerClose.hide();
|
5538
|
+
if( !selectmenuWidget.options.nativeMenu ){
|
5539
|
+
extendSelect( selectmenuWidget );
|
5179
5540
|
}
|
5541
|
+
});
|
5542
|
+
})( jQuery );
|
5543
|
+
/*
|
5544
|
+
* jQuery Mobile Framework : "selectmenu" plugin
|
5545
|
+
* Copyright (c) jQuery Project
|
5546
|
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
5547
|
+
* http://jquery.org/license
|
5548
|
+
*/
|
5180
5549
|
|
5181
|
-
|
5182
|
-
if ( !this.isMultiple && !placeholder.length ) {
|
5183
|
-
this.header.hide();
|
5184
|
-
} else {
|
5185
|
-
this.headerTitle.text( this.placeholder );
|
5186
|
-
}
|
5550
|
+
(function( $, undefined ) {
|
5187
5551
|
|
5188
|
-
|
5189
|
-
|
5552
|
+
$.widget( "mobile.selectmenu", $.mobile.widget, {
|
5553
|
+
options: {
|
5554
|
+
theme: null,
|
5555
|
+
disabled: false,
|
5556
|
+
icon: "arrow-d",
|
5557
|
+
iconpos: "right",
|
5558
|
+
inline: null,
|
5559
|
+
corners: true,
|
5560
|
+
shadow: true,
|
5561
|
+
iconshadow: true,
|
5562
|
+
menuPageTheme: "b",
|
5563
|
+
overlayTheme: "a",
|
5564
|
+
hidePlaceholderMenuItems: true,
|
5565
|
+
closeText: "Close",
|
5566
|
+
nativeMenu: true,
|
5567
|
+
initSelector: "select:not(:jqmData(role='slider'))"
|
5190
5568
|
},
|
5191
5569
|
|
5192
|
-
|
5193
|
-
|
5194
|
-
|
5195
|
-
isMultiple = this.isMultiple,
|
5196
|
-
options = this.optionElems = select.find( "option" ),
|
5197
|
-
selected = options.filter( ":selected" ),
|
5570
|
+
_button: function(){
|
5571
|
+
return $( "<div/>" );
|
5572
|
+
},
|
5198
5573
|
|
5199
|
-
|
5200
|
-
|
5201
|
-
|
5202
|
-
|
5574
|
+
_theme: function(){
|
5575
|
+
var themedParent, theme;
|
5576
|
+
// if no theme is defined, try to find closest theme container
|
5577
|
+
// TODO move to core as something like findCurrentTheme
|
5578
|
+
themedParent = this.select.closest( "[class*='ui-bar-'], [class*='ui-body-']" );
|
5579
|
+
theme = themedParent.length ?
|
5580
|
+
/ui-(bar|body)-([a-z])/.exec( themedParent.attr( "class" ) )[2] :
|
5581
|
+
"c";
|
5203
5582
|
|
5204
|
-
|
5205
|
-
|
5583
|
+
return theme;
|
5584
|
+
},
|
5206
5585
|
|
5207
|
-
|
5208
|
-
|
5586
|
+
_setDisabled: function( value ) {
|
5587
|
+
this.element.attr( "disabled", value );
|
5588
|
+
this.button.attr( "aria-disabled", value );
|
5589
|
+
return this._setOption( "disabled", value );
|
5590
|
+
},
|
5209
5591
|
|
5210
|
-
|
5211
|
-
|
5592
|
+
_focusButton : function() {
|
5593
|
+
var self = this;
|
5212
5594
|
|
5213
|
-
|
5214
|
-
|
5215
|
-
|
5595
|
+
setTimeout( function() {
|
5596
|
+
self.button.focus();
|
5597
|
+
}, 40);
|
5598
|
+
},
|
5216
5599
|
|
5217
|
-
|
5218
|
-
|
5219
|
-
|
5220
|
-
|
5600
|
+
// setup items that are generally necessary for select menu extension
|
5601
|
+
_preExtension: function(){
|
5602
|
+
this.select = this.element.wrap( "<div class='ui-select'>" );
|
5603
|
+
this.selectID = this.select.attr( "id" );
|
5604
|
+
this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" );
|
5605
|
+
this.isMultiple = this.select[ 0 ].multiple;
|
5606
|
+
this.options.theme = this._theme();
|
5607
|
+
this.selectOptions = this.select.find( "option" );
|
5608
|
+
},
|
5221
5609
|
|
5222
|
-
|
5223
|
-
|
5224
|
-
self.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
|
5225
|
-
}
|
5610
|
+
_create: function() {
|
5611
|
+
this._preExtension();
|
5226
5612
|
|
5227
|
-
|
5613
|
+
// Allows for extension of the native select for custom selects and other plugins
|
5614
|
+
// see select.custom for example extension
|
5615
|
+
// TODO explore plugin registration
|
5616
|
+
this._trigger( "beforeCreate" );
|
5228
5617
|
|
5229
|
-
|
5230
|
-
.removeClass( $.mobile.activeBtnClass )
|
5231
|
-
.attr( "aria-selected", false )
|
5232
|
-
.each(function( i ) {
|
5618
|
+
this.button = this._button();
|
5233
5619
|
|
5234
|
-
|
5235
|
-
var item = $( this ).addClass( $.mobile.activeBtnClass );
|
5620
|
+
var self = this,
|
5236
5621
|
|
5237
|
-
|
5238
|
-
item.find( "a" ).attr( "aria-selected", true );
|
5622
|
+
options = this.options,
|
5239
5623
|
|
5240
|
-
|
5241
|
-
|
5242
|
-
|
5243
|
-
|
5244
|
-
|
5624
|
+
// IE throws an exception at options.item() function when
|
5625
|
+
// there is no selected item
|
5626
|
+
// select first in this case
|
5627
|
+
selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex,
|
5628
|
+
|
5629
|
+
// TODO values buttonId and menuId are undefined here
|
5630
|
+
button = this.button
|
5631
|
+
.text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() )
|
5632
|
+
.insertBefore( this.select )
|
5633
|
+
.buttonMarkup( {
|
5634
|
+
theme: options.theme,
|
5635
|
+
icon: options.icon,
|
5636
|
+
iconpos: options.iconpos,
|
5637
|
+
inline: options.inline,
|
5638
|
+
corners: options.corners,
|
5639
|
+
shadow: options.shadow,
|
5640
|
+
iconshadow: options.iconshadow
|
5245
5641
|
});
|
5246
|
-
}
|
5247
|
-
},
|
5248
5642
|
|
5249
|
-
|
5250
|
-
|
5251
|
-
|
5643
|
+
// Opera does not properly support opacity on select elements
|
5644
|
+
// In Mini, it hides the element, but not its text
|
5645
|
+
// On the desktop,it seems to do the opposite
|
5646
|
+
// for these reasons, using the nativeMenu option results in a full native select in Opera
|
5647
|
+
if ( options.nativeMenu && window.opera && window.opera.version ) {
|
5648
|
+
this.select.addClass( "ui-select-nativeonly" );
|
5252
5649
|
}
|
5253
5650
|
|
5254
|
-
|
5255
|
-
|
5256
|
-
|
5257
|
-
|
5258
|
-
|
5259
|
-
|
5260
|
-
screenWidth = window.innerWidth;
|
5261
|
-
|
5262
|
-
//add active class to button
|
5263
|
-
self.button.addClass( $.mobile.activeBtnClass );
|
5264
|
-
|
5265
|
-
//remove after delay
|
5266
|
-
setTimeout(function() {
|
5267
|
-
self.button.removeClass( $.mobile.activeBtnClass );
|
5268
|
-
}, 300);
|
5269
|
-
|
5270
|
-
function focusMenuItem() {
|
5271
|
-
self.list.find( ".ui-btn-active" ).focus();
|
5651
|
+
// Add counter for multi selects
|
5652
|
+
if ( this.isMultiple ) {
|
5653
|
+
this.buttonCount = $( "<span>" )
|
5654
|
+
.addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" )
|
5655
|
+
.hide()
|
5656
|
+
.appendTo( button );
|
5272
5657
|
}
|
5273
5658
|
|
5274
|
-
|
5275
|
-
|
5276
|
-
|
5277
|
-
|
5278
|
-
self.thisPage.unbind( "pagehide.remove" );
|
5659
|
+
// Disable if specified
|
5660
|
+
if ( options.disabled ) {
|
5661
|
+
this.disable();
|
5662
|
+
}
|
5279
5663
|
|
5280
|
-
|
5281
|
-
|
5282
|
-
|
5283
|
-
|
5284
|
-
});
|
5285
|
-
}
|
5664
|
+
// Events on native select
|
5665
|
+
this.select.change( function() {
|
5666
|
+
self.refresh();
|
5667
|
+
});
|
5286
5668
|
|
5287
|
-
|
5288
|
-
|
5289
|
-
// any previous scroll position the page may have had. We need to
|
5290
|
-
// wait for the "silentscroll" event before setting focus to avoid
|
5291
|
-
// the browser"s "feature" which offsets rendering to make sure
|
5292
|
-
// whatever has focus is in view.
|
5293
|
-
$( window ).one( "silentscroll", function() {
|
5294
|
-
focusMenuItem();
|
5295
|
-
});
|
5669
|
+
this.build();
|
5670
|
+
},
|
5296
5671
|
|
5297
|
-
|
5298
|
-
|
5672
|
+
build: function() {
|
5673
|
+
var self = this;
|
5299
5674
|
|
5300
|
-
|
5301
|
-
|
5302
|
-
|
5303
|
-
|
5675
|
+
this.select
|
5676
|
+
.appendTo( self.button )
|
5677
|
+
.bind( "vmousedown", function() {
|
5678
|
+
// Add active class to button
|
5679
|
+
self.button.addClass( $.mobile.activeBtnClass );
|
5680
|
+
})
|
5681
|
+
.bind( "focus vmouseover", function() {
|
5682
|
+
self.button.trigger( "vmouseover" );
|
5683
|
+
})
|
5684
|
+
.bind( "vmousemove", function() {
|
5685
|
+
// Remove active class on scroll/touchmove
|
5686
|
+
self.button.removeClass( $.mobile.activeBtnClass );
|
5687
|
+
})
|
5688
|
+
.bind( "change blur vmouseout", function() {
|
5689
|
+
self.button.trigger( "vmouseout" )
|
5690
|
+
.removeClass( $.mobile.activeBtnClass );
|
5691
|
+
})
|
5692
|
+
.bind( "change blur", function() {
|
5693
|
+
self.button.removeClass( "ui-btn-down-" + self.options.theme );
|
5304
5694
|
});
|
5305
|
-
|
5306
|
-
|
5307
|
-
self.menuType = "overlay";
|
5308
|
-
|
5309
|
-
self.screen.height( $(document).height() )
|
5310
|
-
.removeClass( "ui-screen-hidden" );
|
5695
|
+
},
|
5311
5696
|
|
5312
|
-
|
5313
|
-
|
5314
|
-
|
5315
|
-
halfheight = menuHeight / 2,
|
5316
|
-
maxwidth = parseFloat( self.list.parent().css( "max-width" ) ),
|
5317
|
-
newtop, newleft;
|
5697
|
+
selected: function() {
|
5698
|
+
return this.selectOptions.filter( ":selected" );
|
5699
|
+
},
|
5318
5700
|
|
5319
|
-
|
5320
|
-
|
5321
|
-
} else {
|
5322
|
-
// 30px tolerance off the edges
|
5323
|
-
newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30;
|
5324
|
-
}
|
5701
|
+
selectedIndices: function() {
|
5702
|
+
var self = this;
|
5325
5703
|
|
5326
|
-
|
5327
|
-
|
5328
|
-
|
5329
|
-
|
5704
|
+
return this.selected().map( function() {
|
5705
|
+
return self.selectOptions.index( this );
|
5706
|
+
}).get();
|
5707
|
+
},
|
5330
5708
|
|
5331
|
-
|
5332
|
-
|
5709
|
+
setButtonText: function() {
|
5710
|
+
var self = this, selected = this.selected();
|
5333
5711
|
|
5334
|
-
|
5335
|
-
|
5336
|
-
|
5337
|
-
} else if ( ( newleft + menuWidth ) > screenWidth ) {
|
5338
|
-
newleft = screenWidth - menuWidth - 30;
|
5339
|
-
}
|
5712
|
+
this.button.find( ".ui-btn-text" ).text( function() {
|
5713
|
+
if ( !self.isMultiple ) {
|
5714
|
+
return selected.text();
|
5340
5715
|
}
|
5341
5716
|
|
5342
|
-
|
5343
|
-
|
5344
|
-
|
5345
|
-
|
5346
|
-
left: newleft
|
5347
|
-
})
|
5348
|
-
.addClass( "in" );
|
5349
|
-
|
5350
|
-
focusMenuItem();
|
5351
|
-
|
5352
|
-
// duplicate with value set in page show for dialog sized selects
|
5353
|
-
self.isOpen = true;
|
5354
|
-
}
|
5355
|
-
},
|
5356
|
-
|
5357
|
-
_focusButton : function(){
|
5358
|
-
var self = this;
|
5359
|
-
setTimeout(function() {
|
5360
|
-
self.button.focus();
|
5361
|
-
}, 40);
|
5717
|
+
return selected.length ? selected.map( function() {
|
5718
|
+
return $( this ).text();
|
5719
|
+
}).get().join( ", " ) : self.placeholder;
|
5720
|
+
});
|
5362
5721
|
},
|
5363
5722
|
|
5364
|
-
|
5365
|
-
|
5366
|
-
return;
|
5367
|
-
}
|
5368
|
-
|
5369
|
-
var self = this;
|
5723
|
+
setButtonCount: function() {
|
5724
|
+
var selected = this.selected();
|
5370
5725
|
|
5371
|
-
|
5372
|
-
|
5373
|
-
|
5374
|
-
// of a dialog sized custom select
|
5375
|
-
self.thisPage.bind( "pagehide.remove", function(){
|
5376
|
-
$(this).remove();
|
5377
|
-
});
|
5378
|
-
|
5379
|
-
// doesn't solve the possible issue with calling change page
|
5380
|
-
// where the objects don't define data urls which prevents dialog key
|
5381
|
-
// stripping - changePage has incoming refactor
|
5382
|
-
window.history.back();
|
5383
|
-
} else{
|
5384
|
-
self.screen.addClass( "ui-screen-hidden" );
|
5385
|
-
self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" );
|
5386
|
-
self.list.appendTo( self.listbox );
|
5387
|
-
self._focusButton();
|
5726
|
+
// multiple count inside button
|
5727
|
+
if ( this.isMultiple ) {
|
5728
|
+
this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
|
5388
5729
|
}
|
5730
|
+
},
|
5389
5731
|
|
5390
|
-
|
5391
|
-
this.
|
5732
|
+
refresh: function() {
|
5733
|
+
this.setButtonText();
|
5734
|
+
this.setButtonCount();
|
5392
5735
|
},
|
5393
5736
|
|
5394
5737
|
disable: function() {
|
5395
|
-
this.
|
5396
|
-
this.button.addClass( "ui-disabled" )
|
5397
|
-
return this._setOption( "disabled", true );
|
5738
|
+
this._setDisabled( true );
|
5739
|
+
this.button.addClass( "ui-disabled" );
|
5398
5740
|
},
|
5399
5741
|
|
5400
5742
|
enable: function() {
|
5401
|
-
this.
|
5402
|
-
this.button.removeClass( "ui-disabled" )
|
5403
|
-
return this._setOption( "disabled", false );
|
5743
|
+
this._setDisabled( false );
|
5744
|
+
this.button.removeClass( "ui-disabled" );
|
5404
5745
|
}
|
5405
5746
|
});
|
5406
5747
|
|
@@ -5410,9 +5751,7 @@ $( document ).bind( "pagecreate create", function( e ){
|
|
5410
5751
|
.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
|
5411
5752
|
.selectmenu();
|
5412
5753
|
});
|
5413
|
-
|
5414
5754
|
})( jQuery );
|
5415
|
-
|
5416
5755
|
/*
|
5417
5756
|
* jQuery Mobile Framework : plugin for making button-like links
|
5418
5757
|
* Copyright (c) jQuery Project
|
@@ -5675,7 +6014,7 @@ $.fn.fixHeaderFooter = function( options ) {
|
|
5675
6014
|
// single controller for all showing,hiding,toggling
|
5676
6015
|
$.mobile.fixedToolbars = (function() {
|
5677
6016
|
|
5678
|
-
if ( !$.support.scrollTop ) {
|
6017
|
+
if ( !$.support.scrollTop || $.support.touchOverflow ) {
|
5679
6018
|
return;
|
5680
6019
|
}
|
5681
6020
|
|
@@ -5999,7 +6338,7 @@ $( document ).bind( "pagecreate create", function( event ) {
|
|
5999
6338
|
|
6000
6339
|
$( event.target ).each(function() {
|
6001
6340
|
|
6002
|
-
if ( !$.support.scrollTop ) {
|
6341
|
+
if ( !$.support.scrollTop || $.support.touchOverflow ) {
|
6003
6342
|
return this;
|
6004
6343
|
}
|
6005
6344
|
|
@@ -6020,6 +6359,65 @@ $( document ).bind( "pagecreate create", function( event ) {
|
|
6020
6359
|
}
|
6021
6360
|
});
|
6022
6361
|
|
6362
|
+
})( jQuery );
|
6363
|
+
/*
|
6364
|
+
* jQuery Mobile Framework : "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content
|
6365
|
+
* Copyright (c) jQuery Project
|
6366
|
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
6367
|
+
* http://jquery.org/license
|
6368
|
+
*/
|
6369
|
+
|
6370
|
+
(function( $, undefined ) {
|
6371
|
+
|
6372
|
+
$.mobile.touchOverflowEnabled = false;
|
6373
|
+
|
6374
|
+
$( document ).bind( "pagecreate", function( event ) {
|
6375
|
+
if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){
|
6376
|
+
|
6377
|
+
var $target = $( event.target ),
|
6378
|
+
scrollStartY = 0;
|
6379
|
+
|
6380
|
+
if( $target.is( ":jqmData(role='page')" ) ){
|
6381
|
+
|
6382
|
+
$target.each(function() {
|
6383
|
+
var $page = $( this ),
|
6384
|
+
$fixies = $page.find( ":jqmData(role='header'), :jqmData(role='footer')" ).filter( ":jqmData(position='fixed')" ),
|
6385
|
+
fullScreen = $page.jqmData( "fullscreen" ),
|
6386
|
+
$scrollElem = $fixies.length ? $page.find( ".ui-content" ) : $page;
|
6387
|
+
|
6388
|
+
$page.addClass( "ui-mobile-touch-overflow" );
|
6389
|
+
|
6390
|
+
$scrollElem.bind( "scrollstop", function(){
|
6391
|
+
if( $scrollElem.scrollTop() > 0 ){
|
6392
|
+
window.scrollTo( 0, $.mobile.defaultHomeScroll );
|
6393
|
+
}
|
6394
|
+
});
|
6395
|
+
|
6396
|
+
if( $fixies.length ){
|
6397
|
+
|
6398
|
+
$page.addClass( "ui-native-fixed" );
|
6399
|
+
|
6400
|
+
if( fullScreen ){
|
6401
|
+
|
6402
|
+
$page.addClass( "ui-native-fullscreen" );
|
6403
|
+
|
6404
|
+
$fixies.addClass( "fade in" );
|
6405
|
+
|
6406
|
+
$( document ).bind( "vclick", function(){
|
6407
|
+
$fixies
|
6408
|
+
.removeClass( "ui-native-bars-hidden" )
|
6409
|
+
.toggleClass( "in out" )
|
6410
|
+
.animationComplete(function(){
|
6411
|
+
$(this).not( ".in" ).addClass( "ui-native-bars-hidden" );
|
6412
|
+
});
|
6413
|
+
});
|
6414
|
+
}
|
6415
|
+
}
|
6416
|
+
});
|
6417
|
+
}
|
6418
|
+
}
|
6419
|
+
});
|
6420
|
+
|
6023
6421
|
})( jQuery );
|
6024
6422
|
/*
|
6025
6423
|
* jQuery Mobile Framework : resolution and CSS media query related helpers and behavior
|
@@ -6100,7 +6498,7 @@ $( document ).bind( "mobileinit.htmlclass", function() {
|
|
6100
6498
|
|
6101
6499
|
var ev = $.support.orientation;
|
6102
6500
|
|
6103
|
-
$window.bind( "orientationchange.htmlclass
|
6501
|
+
$window.bind( "orientationchange.htmlclass throttledresize.htmlclass", function( event ) {
|
6104
6502
|
|
6105
6503
|
// add orientation class to HTML element on flip/resize.
|
6106
6504
|
if ( event.orientation ) {
|
@@ -6136,47 +6534,47 @@ $(function() {
|
|
6136
6534
|
$head = $( "head" ),
|
6137
6535
|
$window = $( window );
|
6138
6536
|
|
6139
|
-
//trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
|
6537
|
+
// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
|
6140
6538
|
$( window.document ).trigger( "mobileinit" );
|
6141
6539
|
|
6142
|
-
//support conditions
|
6143
|
-
//if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
|
6144
|
-
//otherwise, proceed with the enhancements
|
6540
|
+
// support conditions
|
6541
|
+
// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
|
6542
|
+
// otherwise, proceed with the enhancements
|
6145
6543
|
if ( !$.mobile.gradeA() ) {
|
6146
6544
|
return;
|
6147
6545
|
}
|
6148
|
-
|
6149
|
-
// override ajaxEnabled on platforms that have known conflicts with hash history updates
|
6546
|
+
|
6547
|
+
// override ajaxEnabled on platforms that have known conflicts with hash history updates
|
6150
6548
|
// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)
|
6151
|
-
if( $.mobile.ajaxBlacklist ){
|
6549
|
+
if ( $.mobile.ajaxBlacklist ) {
|
6152
6550
|
$.mobile.ajaxEnabled = false;
|
6153
6551
|
}
|
6154
6552
|
|
6155
|
-
//add mobile, initial load "rendering" classes to docEl
|
6553
|
+
// add mobile, initial load "rendering" classes to docEl
|
6156
6554
|
$html.addClass( "ui-mobile ui-mobile-rendering" );
|
6157
6555
|
|
6158
|
-
//loading div which appears during Ajax requests
|
6159
|
-
//will not appear if $.mobile.loadingMessage is false
|
6556
|
+
// loading div which appears during Ajax requests
|
6557
|
+
// will not appear if $.mobile.loadingMessage is false
|
6160
6558
|
var $loader = $( "<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>" );
|
6161
6559
|
|
6162
6560
|
$.extend($.mobile, {
|
6163
6561
|
// turn on/off page loading message.
|
6164
6562
|
showPageLoadingMsg: function() {
|
6165
|
-
if( $.mobile.loadingMessage ){
|
6563
|
+
if ( $.mobile.loadingMessage ) {
|
6166
6564
|
var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
|
6167
|
-
|
6565
|
+
|
6168
6566
|
$loader
|
6169
6567
|
.find( "h1" )
|
6170
6568
|
.text( $.mobile.loadingMessage )
|
6171
6569
|
.end()
|
6172
6570
|
.appendTo( $.mobile.pageContainer )
|
6173
|
-
//position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
|
6174
|
-
.css(
|
6175
|
-
top: $.support.scrollTop && $
|
6571
|
+
// position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
|
6572
|
+
.css({
|
6573
|
+
top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
|
6176
6574
|
activeBtn.length && activeBtn.offset().top || 100
|
6177
|
-
}
|
6575
|
+
});
|
6178
6576
|
}
|
6179
|
-
|
6577
|
+
|
6180
6578
|
$html.addClass( "ui-loading" );
|
6181
6579
|
},
|
6182
6580
|
|
@@ -6194,36 +6592,36 @@ $(function() {
|
|
6194
6592
|
},
|
6195
6593
|
|
6196
6594
|
// find and enhance the pages in the dom and transition to the first page.
|
6197
|
-
initializePage: function(){
|
6198
|
-
//find present pages
|
6595
|
+
initializePage: function() {
|
6596
|
+
// find present pages
|
6199
6597
|
var $pages = $( ":jqmData(role='page')" );
|
6200
|
-
|
6201
|
-
//if no pages are found, create one with body's inner html
|
6202
|
-
if( !$pages.length ){
|
6598
|
+
|
6599
|
+
// if no pages are found, create one with body's inner html
|
6600
|
+
if ( !$pages.length ) {
|
6203
6601
|
$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
|
6204
6602
|
}
|
6205
6603
|
|
6206
|
-
//add dialogs, set data-url attrs
|
6207
|
-
$pages.add( ":jqmData(role='dialog')" ).each(function(){
|
6604
|
+
// add dialogs, set data-url attrs
|
6605
|
+
$pages.add( ":jqmData(role='dialog')" ).each(function() {
|
6208
6606
|
var $this = $(this);
|
6209
6607
|
|
6210
|
-
// unless the data url is already set set it to the
|
6211
|
-
if( !$this.jqmData(
|
6212
|
-
$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) );
|
6608
|
+
// unless the data url is already set set it to the pathname
|
6609
|
+
if ( !$this.jqmData("url") ) {
|
6610
|
+
$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search );
|
6213
6611
|
}
|
6214
6612
|
});
|
6215
6613
|
|
6216
|
-
//define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
|
6614
|
+
// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
|
6217
6615
|
$.mobile.firstPage = $pages.first();
|
6218
6616
|
|
6219
|
-
//define page container
|
6617
|
+
// define page container
|
6220
6618
|
$.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" );
|
6221
6619
|
|
6222
|
-
//cue page loading message
|
6620
|
+
// cue page loading message
|
6223
6621
|
$.mobile.showPageLoadingMsg();
|
6224
6622
|
|
6225
6623
|
// if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM
|
6226
|
-
if( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ){
|
6624
|
+
if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) {
|
6227
6625
|
$.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } );
|
6228
6626
|
}
|
6229
6627
|
// otherwise, trigger a hashchange to load a deeplink
|
@@ -6232,28 +6630,28 @@ $(function() {
|
|
6232
6630
|
}
|
6233
6631
|
}
|
6234
6632
|
});
|
6235
|
-
|
6236
|
-
//initialize events now, after mobileinit has occurred
|
6633
|
+
|
6634
|
+
// initialize events now, after mobileinit has occurred
|
6237
6635
|
$.mobile._registerInternalEvents();
|
6238
|
-
|
6239
|
-
//check which scrollTop value should be used by scrolling to 1 immediately at domready
|
6240
|
-
//then check what the scroll top is. Android will report 0... others 1
|
6241
|
-
//note that this initial scroll won't hide the address bar. It's just for the check.
|
6242
|
-
$(function(){
|
6636
|
+
|
6637
|
+
// check which scrollTop value should be used by scrolling to 1 immediately at domready
|
6638
|
+
// then check what the scroll top is. Android will report 0... others 1
|
6639
|
+
// note that this initial scroll won't hide the address bar. It's just for the check.
|
6640
|
+
$(function() {
|
6243
6641
|
window.scrollTo( 0, 1 );
|
6244
6642
|
|
6245
|
-
//if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
|
6246
|
-
//it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
|
6247
|
-
//so if it's 1, use 0 from now on
|
6643
|
+
// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
|
6644
|
+
// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
|
6645
|
+
// so if it's 1, use 0 from now on
|
6248
6646
|
$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1;
|
6249
|
-
|
6647
|
+
|
6250
6648
|
//dom-ready inits
|
6251
6649
|
if( $.mobile.autoInitializePage ){
|
6252
|
-
|
6650
|
+
$.mobile.initializePage();
|
6253
6651
|
}
|
6254
|
-
|
6255
|
-
//window load event
|
6256
|
-
//hide iOS browser chrome on load
|
6652
|
+
|
6653
|
+
// window load event
|
6654
|
+
// hide iOS browser chrome on load
|
6257
6655
|
$window.load( $.mobile.silentScroll );
|
6258
6656
|
});
|
6259
6657
|
})( jQuery, this );
|