qedproject 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,12 @@
1
- /*!
2
- * jQuery Mobile v1.0rc2
3
- * http://jquerymobile.com/
4
- *
5
- * Copyright 2010, jQuery Project
6
- * Dual licensed under the MIT or GPL Version 2 licenses.
7
- * http://jquery.org/license
8
- */
1
+ /*
2
+ * jQuery Mobile Framework 1.0
3
+ * http://jquerymobile.com
4
+ *
5
+ * Copyright 2011 (c) jQuery Project
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ * http://jquery.org/license
8
+ *
9
+ */
9
10
  /*!
10
11
  * jQuery UI Widget @VERSION
11
12
  *
@@ -15,6 +16,7 @@
15
16
  *
16
17
  * http://docs.jquery.com/UI/Widget
17
18
  */
19
+
18
20
  (function( $, undefined ) {
19
21
 
20
22
  // jQuery 1.4+
@@ -269,10 +271,7 @@ $.Widget.prototype = {
269
271
 
270
272
  })( jQuery );
271
273
  /*
272
- * jQuery Mobile Framework : widget factory extentions for mobile
273
- * Copyright (c) jQuery Project
274
- * Dual licensed under the MIT or GPL Version 2 licenses.
275
- * http://jquery.org/license
274
+ * widget factory extentions for mobile
276
275
  */
277
276
 
278
277
  (function( $, undefined ) {
@@ -312,20 +311,18 @@ $.widget( "mobile.widget", {
312
311
  // TODO remove dependency on the page widget for the keepNative.
313
312
  // Currently the keepNative value is defined on the page prototype so
314
313
  // the method is as well
315
- var page = $(target).data( "page" ),
316
- keepNative = page && page.keepNativeSelector();
314
+ var page = $(target).closest(":jqmData(role='page')").data( "page" ),
315
+ keepNative = (page && page.keepNativeSelector()) || "";
317
316
 
318
- $( this.options.initSelector, target ).not( keepNative || "" )[ this.widgetName ]();
317
+ $( this.options.initSelector, target ).not( keepNative )[ this.widgetName ]();
319
318
  }
320
319
  });
321
320
 
322
321
  })( jQuery );
323
322
  /*
324
- * jQuery Mobile Framework : a workaround for window.matchMedia
325
- * Copyright (c) jQuery Project
326
- * Dual licensed under the MIT or GPL Version 2 licenses.
327
- * http://jquery.org/license
323
+ * a workaround for window.matchMedia
328
324
  */
325
+
329
326
  (function( $, undefined ) {
330
327
 
331
328
  var $window = $( window ),
@@ -366,10 +363,9 @@ $.mobile.media = (function() {
366
363
  };
367
364
  })();
368
365
 
369
- })(jQuery);/*
370
- * jQuery Mobile Framework : support tests
371
- * Copyright (c) jQuery Project
372
- * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
366
+ })(jQuery);
367
+ /*
368
+ * support tests
373
369
  */
374
370
 
375
371
  (function( $, undefined ) {
@@ -378,6 +374,7 @@ var fakeBody = $( "<body>" ).prependTo( "html" ),
378
374
  fbCSS = fakeBody[ 0 ].style,
379
375
  vendors = [ "Webkit", "Moz", "O" ],
380
376
  webos = "palmGetResource" in window, //only used to rule out scrollTop
377
+ operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
381
378
  bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB
382
379
 
383
380
  // thx Modernizr
@@ -440,7 +437,7 @@ $.extend( $.support, {
440
437
  cssPseudoElement: !!propExists( "content" ),
441
438
  touchOverflow: !!propExists( "overflowScrolling" ),
442
439
  boxShadow: !!propExists( "boxShadow" ) && !bb,
443
- scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos,
440
+ scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
444
441
  dynamicBaseTag: baseTagTest()
445
442
  });
446
443
 
@@ -466,7 +463,7 @@ $.mobile.ajaxBlacklist =
466
463
  // BlackBerry browsers, pre-webkit
467
464
  window.blackberry && !window.WebKitPoint ||
468
465
  // Opera Mini
469
- window.operamini && Object.prototype.toString.call( window.operamini ) === "[object OperaMini]" ||
466
+ operamini ||
470
467
  // Symbian webkits pre 7.3
471
468
  nokiaLTE7_3;
472
469
 
@@ -486,10 +483,7 @@ if ( !$.support.boxShadow ) {
486
483
 
487
484
  })( jQuery );
488
485
  /*
489
- * jQuery Mobile Framework : "mouse" plugin
490
- * Copyright (c) jQuery Project
491
- * Dual licensed under the MIT or GPL Version 2 licenses.
492
- * http://jquery.org/license
486
+ * "mouse" plugin
493
487
  */
494
488
 
495
489
  // This plugin is an experiment for abstracting away the touch and mouse
@@ -983,12 +977,10 @@ if ( eventCaptureSupported ) {
983
977
  }, true);
984
978
  }
985
979
  })( jQuery, window, document );
986
- /*
987
- * jQuery Mobile Framework : events
988
- * Copyright (c) jQuery Project
989
- * Dual licensed under the MIT or GPL Version 2 licenses.
990
- * http://jquery.org/license
980
+ /*
981
+ * "events" plugin - Handles events
991
982
  */
983
+
992
984
  (function( $, window, undefined ) {
993
985
 
994
986
  // add new event shortcuts
@@ -1223,7 +1215,7 @@ $.event.special.swipe = {
1223
1215
  last_orientation = orientation;
1224
1216
  win.trigger( "orientationchange" );
1225
1217
  }
1226
- };
1218
+ }
1227
1219
 
1228
1220
  // Get the current page orientation. This method is exposed publicly, should it
1229
1221
  // be needed, as jQuery.event.special.orientationchange.orientation()
@@ -1303,17 +1295,8 @@ $.each({
1303
1295
  });
1304
1296
 
1305
1297
  })( jQuery, this );
1306
- /*!
1307
- * jQuery hashchange event - v1.3 - 7/21/2010
1308
- * http://benalman.com/projects/jquery-hashchange-plugin/
1309
- *
1310
- * Copyright (c) 2010 "Cowboy" Ben Alman
1311
- * Dual licensed under the MIT and GPL licenses.
1312
- * http://benalman.com/about/license/
1313
- */
1314
-
1315
1298
  // Script: jQuery hashchange event
1316
- //
1299
+ //
1317
1300
  // *Version: 1.3, Last updated: 7/21/2010*
1318
1301
  //
1319
1302
  // Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
@@ -1694,10 +1677,7 @@ $.each({
1694
1677
 
1695
1678
  })(jQuery,this);
1696
1679
  /*
1697
- * jQuery Mobile Framework : "page" plugin
1698
- * Copyright (c) jQuery Project
1699
- * Dual licensed under the MIT or GPL Version 2 licenses.
1700
- * http://jquery.org/license
1680
+ * "page" plugin
1701
1681
  */
1702
1682
 
1703
1683
  (function( $, undefined ) {
@@ -1730,17 +1710,14 @@ $.widget( "mobile.page", $.mobile.widget, {
1730
1710
  }
1731
1711
  });
1732
1712
  })( jQuery );
1733
- /*!
1734
- * jQuery Mobile v@VERSION
1735
- * http://jquerymobile.com/
1736
- *
1737
- * Copyright 2010, jQuery Project
1738
- * Dual licensed under the MIT or GPL Version 2 licenses.
1739
- * http://jquery.org/license
1740
- */
1713
+ /*
1714
+ * "core" - The base file for jQm
1715
+ */
1741
1716
 
1742
1717
  (function( $, window, undefined ) {
1743
1718
 
1719
+ var nsNormalizeDict = {};
1720
+
1744
1721
  // jQuery.mobile configurable options
1745
1722
  $.extend( $.mobile, {
1746
1723
 
@@ -1764,6 +1741,9 @@ $.widget( "mobile.page", $.mobile.widget, {
1764
1741
  // Automatically load and show pages based on location.hash
1765
1742
  hashListeningEnabled: true,
1766
1743
 
1744
+ // disable to prevent jquery from bothering with links
1745
+ linkBindingEnabled: true,
1746
+
1767
1747
  // Set default page transition - 'none' for no transitions
1768
1748
  defaultPageTransition: "slide",
1769
1749
 
@@ -1849,24 +1829,42 @@ $.widget( "mobile.page", $.mobile.widget, {
1849
1829
  }, 150 );
1850
1830
  },
1851
1831
 
1832
+ // Expose our cache for testing purposes.
1833
+ nsNormalizeDict: nsNormalizeDict,
1834
+
1852
1835
  // Take a data attribute property, prepend the namespace
1853
- // and then camel case the attribute string
1836
+ // and then camel case the attribute string. Add the result
1837
+ // to our nsNormalizeDict so we don't have to do this again.
1854
1838
  nsNormalize: function( prop ) {
1855
1839
  if ( !prop ) {
1856
1840
  return;
1857
1841
  }
1858
1842
 
1859
- return $.camelCase( $.mobile.ns + prop );
1843
+ return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );
1860
1844
  },
1861
1845
 
1862
1846
  getInheritedTheme: function( el, defaultTheme ) {
1863
- // Find the closest parent with a theme class on it.
1864
- var themedParent = el.closest( "[class*='ui-bar-'],[class*='ui-body-']" ),
1865
-
1866
- // If there's a themed parent, extract the theme letter
1867
- // from the theme class .
1868
- ltr = ( themedParent.length && /ui-(bar|body)-([a-z])\b/.exec( themedParent.attr( "class" ) )[ 2 ] || "" ) || "";
1869
1847
 
1848
+ // Find the closest parent with a theme class on it. Note that
1849
+ // we are not using $.fn.closest() on purpose here because this
1850
+ // method gets called quite a bit and we need it to be as fast
1851
+ // as possible.
1852
+
1853
+ var e = el[ 0 ],
1854
+ ltr = "",
1855
+ re = /ui-(bar|body)-([a-z])\b/,
1856
+ c, m;
1857
+
1858
+ while ( e ) {
1859
+ var c = e.className || "";
1860
+ if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {
1861
+ // We found a parent with a theme class
1862
+ // on it so bail from this loop.
1863
+ break;
1864
+ }
1865
+ e = e.parentNode;
1866
+ }
1867
+
1870
1868
  // Return the theme letter we found, if none, return the
1871
1869
  // specified default.
1872
1870
 
@@ -1929,10 +1927,11 @@ $.widget( "mobile.page", $.mobile.widget, {
1929
1927
  };
1930
1928
 
1931
1929
  // Monkey-patching Sizzle to filter the :jqmData selector
1932
- var oldFind = $.find;
1930
+ var oldFind = $.find,
1931
+ jqmDataRE = /:jqmData\(([^)]*)\)/g;
1933
1932
 
1934
1933
  $.find = function( selector, context, ret, extra ) {
1935
- selector = selector.replace(/:jqmData\(([^)]*)\)/g, "[data-" + ( $.mobile.ns || "" ) + "$1]");
1934
+ selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" );
1936
1935
 
1937
1936
  return oldFind.call( this, selector, context, ret, extra );
1938
1937
  };
@@ -1949,11 +1948,9 @@ $.widget( "mobile.page", $.mobile.widget, {
1949
1948
  })( jQuery, this );
1950
1949
 
1951
1950
  /*
1952
- * jQuery Mobile Framework : core utilities for auto ajax navigation, base tag mgmt,
1953
- * Copyright (c) jQuery Project
1954
- * Dual licensed under the MIT or GPL Version 2 licenses.
1955
- * http://jquery.org/license
1951
+ * core utilities for auto ajax navigation, base tag mgmt,
1956
1952
  */
1953
+
1957
1954
  ( function( $, undefined ) {
1958
1955
 
1959
1956
  //define vars for interal use
@@ -2515,7 +2512,7 @@ $.widget( "mobile.page", $.mobile.widget, {
2515
2512
 
2516
2513
  //simply set the active page's minimum height to screen height, depending on orientation
2517
2514
  function getScreenHeight(){
2518
- var orientation = jQuery.event.special.orientationchange.orientation(),
2515
+ var orientation = $.event.special.orientationchange.orientation(),
2519
2516
  port = orientation === "portrait",
2520
2517
  winMin = port ? 480 : 320,
2521
2518
  screenHeight = port ? screen.availHeight : screen.availWidth,
@@ -2689,13 +2686,29 @@ $.widget( "mobile.page", $.mobile.widget, {
2689
2686
  // attribute and in need of enhancement.
2690
2687
  if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) {
2691
2688
  page = settings.pageContainer.children( "#" + dataUrl )
2692
- .attr( "data-" + $.mobile.ns + "url", dataUrl )
2689
+ .attr( "data-" + $.mobile.ns + "url", dataUrl );
2693
2690
  }
2694
2691
 
2695
2692
  // If we failed to find a page in the DOM, check the URL to see if it
2696
- // refers to the first page in the application.
2697
- if ( page.length === 0 && $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) {
2698
- page = $( $.mobile.firstPage );
2693
+ // refers to the first page in the application. If it isn't a reference
2694
+ // to the first page and refers to non-existent embedded page, error out.
2695
+ if ( page.length === 0 ) {
2696
+ if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) {
2697
+ // Check to make sure our cached-first-page is actually
2698
+ // in the DOM. Some user deployed apps are pruning the first
2699
+ // page from the DOM for various reasons, we check for this
2700
+ // case here because we don't want a first-page with an id
2701
+ // falling through to the non-existent embedded page error
2702
+ // case. If the first-page is not in the DOM, then we let
2703
+ // things fall through to the ajax loading code below so
2704
+ // that it gets reloaded.
2705
+ if ( $.mobile.firstPage.parent().length ) {
2706
+ page = $( $.mobile.firstPage );
2707
+ }
2708
+ } else if ( path.isEmbeddedPage( fileUrl ) ) {
2709
+ deferred.reject( absUrl, options );
2710
+ return deferred.promise();
2711
+ }
2699
2712
  }
2700
2713
 
2701
2714
  // Reset base to the default document base.
@@ -2755,7 +2768,7 @@ $.widget( "mobile.page", $.mobile.widget, {
2755
2768
  type: settings.type,
2756
2769
  data: settings.data,
2757
2770
  dataType: "html",
2758
- success: function( html ) {
2771
+ success: function( html, textStatus, xhr ) {
2759
2772
  //pre-parse html to check for a data-url,
2760
2773
  //use it as the new fileUrl, base path, etc
2761
2774
  var all = $( "<div></div>" ),
@@ -2791,6 +2804,9 @@ $.widget( "mobile.page", $.mobile.widget, {
2791
2804
  }
2792
2805
 
2793
2806
  if ( newPageTitle && !page.jqmData( "title" ) ) {
2807
+ if ( ~newPageTitle.indexOf( "&" ) ) {
2808
+ newPageTitle = $( "<div>" + newPageTitle + "</div>" ).text();
2809
+ }
2794
2810
  page.jqmData( "title", newPageTitle );
2795
2811
  }
2796
2812
 
@@ -2841,7 +2857,9 @@ $.widget( "mobile.page", $.mobile.widget, {
2841
2857
  hideMsg();
2842
2858
  }
2843
2859
 
2844
- // Add the page reference to our triggerData.
2860
+ // Add the page reference and xhr to our triggerData.
2861
+ triggerData.xhr = xhr;
2862
+ triggerData.textStatus = textStatus;
2845
2863
  triggerData.page = page;
2846
2864
 
2847
2865
  // Let listeners know the page loaded successfully.
@@ -2849,12 +2867,17 @@ $.widget( "mobile.page", $.mobile.widget, {
2849
2867
 
2850
2868
  deferred.resolve( absUrl, options, page, dupCachedPage );
2851
2869
  },
2852
- error: function() {
2870
+ error: function( xhr, textStatus, errorThrown ) {
2853
2871
  //set base back to current path
2854
2872
  if( base ) {
2855
2873
  base.set( path.get() );
2856
2874
  }
2857
2875
 
2876
+ // Add error info to our triggerData.
2877
+ triggerData.xhr = xhr;
2878
+ triggerData.textStatus = textStatus;
2879
+ triggerData.errorThrown = errorThrown;
2880
+
2858
2881
  var plfEvent = new $.Event( "pageloadfailed" );
2859
2882
 
2860
2883
  // Let listeners know the page load failed.
@@ -3025,7 +3048,11 @@ $.widget( "mobile.page", $.mobile.widget, {
3025
3048
  // Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
3026
3049
  // is undefined when we are in an IFrame.
3027
3050
  try {
3028
- $( document.activeElement || "" ).add( "input:focus, textarea:focus, select:focus" ).blur();
3051
+ if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') {
3052
+ $(document.activeElement).blur();
3053
+ } else {
3054
+ $( "input:focus, textarea:focus, select:focus" ).blur();
3055
+ }
3029
3056
  } catch(e) {}
3030
3057
 
3031
3058
  // If we're displaying the page as a dialog, we don't want the url
@@ -3047,11 +3074,15 @@ $.widget( "mobile.page", $.mobile.widget, {
3047
3074
  path.set( url );
3048
3075
  }
3049
3076
 
3050
- //if title element wasn't found, try the page div data attr too
3051
- var newPageTitle = toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText();
3077
+ // if title element wasn't found, try the page div data attr too
3078
+ // If this is a deep-link or a reload ( active === undefined ) then just use pageTitle
3079
+ var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText();
3052
3080
  if( !!newPageTitle && pageTitle == document.title ) {
3053
3081
  pageTitle = newPageTitle;
3054
3082
  }
3083
+ if ( !toPage.jqmData( "title" ) ) {
3084
+ toPage.jqmData( "title", pageTitle );
3085
+ }
3055
3086
 
3056
3087
  // Make sure we have a transition defined.
3057
3088
  settings.transition = settings.transition
@@ -3109,7 +3140,14 @@ $.widget( "mobile.page", $.mobile.widget, {
3109
3140
  function findClosestLink( ele )
3110
3141
  {
3111
3142
  while ( ele ) {
3112
- if ( ele.nodeName.toLowerCase() == "a" ) {
3143
+ // Look for the closest element with a nodeName of "a".
3144
+ // Note that we are checking if we have a valid nodeName
3145
+ // before attempting to access it. This is because the
3146
+ // node we get called with could have originated from within
3147
+ // an embedded SVG document where some symbol instance elements
3148
+ // don't have nodeName defined on them, or strings are of type
3149
+ // SVGAnimatedString.
3150
+ if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) {
3113
3151
  break;
3114
3152
  }
3115
3153
  ele = ele.parentNode;
@@ -3189,7 +3227,7 @@ $.widget( "mobile.page", $.mobile.widget, {
3189
3227
  $( document ).bind( "vclick", function( event ) {
3190
3228
  // if this isn't a left click we don't care. Its important to note
3191
3229
  // that when the virtual event is generated it will create
3192
- if ( event.which > 1 ){
3230
+ if ( event.which > 1 || !$.mobile.linkBindingEnabled ){
3193
3231
  return;
3194
3232
  }
3195
3233
 
@@ -3206,6 +3244,10 @@ $.widget( "mobile.page", $.mobile.widget, {
3206
3244
 
3207
3245
  // click routing - direct to HTTP or Ajax, accordingly
3208
3246
  $( document ).bind( "click", function( event ) {
3247
+ if( !$.mobile.linkBindingEnabled ){
3248
+ return;
3249
+ }
3250
+
3209
3251
  var link = findClosestLink( event.target );
3210
3252
 
3211
3253
  // If there is no link associated with the click or its not a left
@@ -3403,11 +3445,9 @@ $.widget( "mobile.page", $.mobile.widget, {
3403
3445
 
3404
3446
  })( jQuery );
3405
3447
  /*
3406
- * jQuery Mobile Framework : history.pushState support, layered on top of hashchange
3407
- * Copyright (c) jQuery Project
3408
- * Dual licensed under the MIT or GPL Version 2 licenses.
3409
- * http://jquery.org/license
3448
+ * history.pushState support, layered on top of hashchange
3410
3449
  */
3450
+
3411
3451
  ( function( $, window ) {
3412
3452
  // For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents
3413
3453
  // Scope self to pushStateHandler so we can reference it sanely within the
@@ -3537,14 +3577,10 @@ $.widget( "mobile.page", $.mobile.widget, {
3537
3577
  pushStateHandler.init();
3538
3578
  }
3539
3579
  });
3540
- })( jQuery, this );/*!
3541
- * jQuery Mobile v@VERSION
3542
- * http://jquerymobile.com/
3543
- *
3544
- * Copyright 2010, jQuery Project
3545
- * Dual licensed under the MIT or GPL Version 2 licenses.
3546
- * http://jquery.org/license
3547
- */
3580
+ })( jQuery, this );
3581
+ /*
3582
+ * "transitions" plugin - Page change tranistions
3583
+ */
3548
3584
 
3549
3585
  (function( $, window, undefined ) {
3550
3586
 
@@ -3588,10 +3624,7 @@ if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) {
3588
3624
 
3589
3625
  })( jQuery, this );
3590
3626
  /*
3591
- * jQuery Mobile Framework : "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made.
3592
- * Copyright (c) jQuery Project
3593
- * Dual licensed under the MIT or GPL Version 2 licenses.
3594
- * http://jquery.org/license
3627
+ * "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made.
3595
3628
  */
3596
3629
 
3597
3630
  (function( $, undefined ) {
@@ -3644,9 +3677,7 @@ $( document ).bind( "pagecreate create", function( e ){
3644
3677
  });
3645
3678
 
3646
3679
  })( jQuery );/*
3647
- * jQuery Mobile Framework : "dialog" plugin.
3648
- * Copyright (c) jQuery Project
3649
- * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
3680
+ * "dialog" plugin.
3650
3681
  */
3651
3682
 
3652
3683
  (function( $, window, undefined ) {
@@ -3654,20 +3685,15 @@ $( document ).bind( "pagecreate create", function( e ){
3654
3685
  $.widget( "mobile.dialog", $.mobile.widget, {
3655
3686
  options: {
3656
3687
  closeBtnText : "Close",
3657
- theme : "a",
3688
+ overlayTheme : "a",
3658
3689
  initSelector : ":jqmData(role='dialog')"
3659
3690
  },
3660
3691
  _create: function() {
3661
3692
  var self = this,
3662
3693
  $el = this.element,
3663
- pageTheme = $el.attr( "class" ).match( /ui-body-[a-z]/ ),
3664
3694
  headerCloseButton = $( "<a href='#' data-" + $.mobile.ns + "icon='delete' data-" + $.mobile.ns + "iconpos='notext'>"+ this.options.closeBtnText + "</a>" );
3665
3695
 
3666
- if( pageTheme.length ){
3667
- $el.removeClass( pageTheme[ 0 ] );
3668
- }
3669
-
3670
- $el.addClass( "ui-body-" + this.options.theme );
3696
+ $el.addClass( "ui-overlay-" + this.options.overlayTheme );
3671
3697
 
3672
3698
  // Class the markup for dialog styling
3673
3699
  // Set aria role
@@ -3678,8 +3704,9 @@ $.widget( "mobile.dialog", $.mobile.widget, {
3678
3704
  .prepend( headerCloseButton )
3679
3705
  .end()
3680
3706
  .find( ":jqmData(role='content'),:jqmData(role='footer')" )
3707
+ .addClass( "ui-overlay-shadow" )
3681
3708
  .last()
3682
- .addClass( "ui-corner-bottom ui-overlay-shadow" );
3709
+ .addClass( "ui-corner-bottom" );
3683
3710
 
3684
3711
  // this must be an anonymous function so that select menu dialogs can replace
3685
3712
  // the close method. This is a change from previously just defining data-rel=back
@@ -3723,10 +3750,7 @@ $( $.mobile.dialog.prototype.options.initSelector ).live( "pagecreate", function
3723
3750
 
3724
3751
  })( jQuery, this );
3725
3752
  /*
3726
- * jQuery Mobile Framework : This plugin handles theming and layout of headers, footers, and content areas
3727
- * Copyright (c) jQuery Project
3728
- * Dual licensed under the MIT or GPL Version 2 licenses.
3729
- * http://jquery.org/license
3753
+ * This plugin handles theming and layout of headers, footers, and content areas
3730
3754
  */
3731
3755
 
3732
3756
  (function( $, undefined ) {
@@ -3742,12 +3766,14 @@ $( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", functi
3742
3766
 
3743
3767
  var $page = $( this ),
3744
3768
  o = $page.data( "page" ).options,
3769
+ pageRole = $page.jqmData( "role" ),
3745
3770
  pageTheme = o.theme;
3746
3771
 
3747
3772
  $( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() {
3748
3773
  var $this = $( this ),
3749
3774
  role = $this.jqmData( "role" ),
3750
3775
  theme = $this.jqmData( "theme" ),
3776
+ contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
3751
3777
  $headeranchors,
3752
3778
  leftbtn,
3753
3779
  rightbtn,
@@ -3799,8 +3825,8 @@ $( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", functi
3799
3825
  });
3800
3826
 
3801
3827
  } else if ( role === "content" ) {
3802
- if (theme || o.contentTheme) {
3803
- $this.addClass( "ui-body-" + ( theme || o.contentTheme ) );
3828
+ if ( contentTheme ) {
3829
+ $this.addClass( "ui-body-" + ( contentTheme ) );
3804
3830
  }
3805
3831
 
3806
3832
  // Add ARIA role
@@ -3810,11 +3836,9 @@ $( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", functi
3810
3836
  });
3811
3837
 
3812
3838
  })( jQuery );/*
3813
- * jQuery Mobile Framework : "collapsible" plugin
3814
- * Copyright (c) jQuery Project
3815
- * Dual licensed under the MIT or GPL Version 2 licenses.
3816
- * http://jquery.org/license
3839
+ * "collapsible" plugin
3817
3840
  */
3841
+
3818
3842
  (function( $, undefined ) {
3819
3843
 
3820
3844
  $.widget( "mobile.collapsible", $.mobile.widget, {
@@ -3822,7 +3846,7 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3822
3846
  expandCueText: " click to expand contents",
3823
3847
  collapseCueText: " click to collapse contents",
3824
3848
  collapsed: true,
3825
- heading: ">:header,>legend",
3849
+ heading: "h1,h2,h3,h4,h5,h6,legend",
3826
3850
  theme: null,
3827
3851
  contentTheme: null,
3828
3852
  iconTheme: "d",
@@ -3833,10 +3857,10 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3833
3857
  var $el = this.element,
3834
3858
  o = this.options,
3835
3859
  collapsible = $el.addClass( "ui-collapsible" ),
3836
- collapsibleHeading = $el.find( o.heading ).eq( 0 ),
3860
+ collapsibleHeading = $el.children( o.heading ).first(),
3837
3861
  collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).find( ".ui-collapsible-content" ),
3838
3862
  collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ),
3839
- colllapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" );
3863
+ collapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" );
3840
3864
 
3841
3865
  // Replace collapsibleHeading if it's a legend
3842
3866
  if ( collapsibleHeading.is( "legend" ) ) {
@@ -3865,7 +3889,8 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3865
3889
  .addClass( "ui-collapsible-heading" )
3866
3890
  .append( "<span class='ui-collapsible-heading-status'></span>" )
3867
3891
  .wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
3868
- .find( "a:eq(0)" )
3892
+ .find( "a" )
3893
+ .first()
3869
3894
  .buttonMarkup({
3870
3895
  shadow: false,
3871
3896
  corners: false,
@@ -3876,7 +3901,7 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3876
3901
 
3877
3902
  if ( !collapsibleSet.length ) {
3878
3903
  collapsibleHeading
3879
- .find( "a:eq(0), .ui-btn-inner" )
3904
+ .find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
3880
3905
  .addClass( "ui-corner-top ui-corner-bottom" );
3881
3906
  } else {
3882
3907
  // If we are in a collapsible set
@@ -3896,15 +3921,17 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3896
3921
  });
3897
3922
  }
3898
3923
 
3899
- colllapsiblesInSet.first()
3900
- .find( "a:eq(0)" )
3924
+ collapsiblesInSet.first()
3925
+ .find( "a" )
3926
+ .first()
3901
3927
  .addClass( "ui-corner-top" )
3902
3928
  .find( ".ui-btn-inner" )
3903
3929
  .addClass( "ui-corner-top" );
3904
3930
 
3905
- colllapsiblesInSet.last()
3931
+ collapsiblesInSet.last()
3906
3932
  .jqmData( "collapsible-last", true )
3907
- .find( "a:eq(0)" )
3933
+ .find( "a" )
3934
+ .first()
3908
3935
  .addClass( "ui-corner-bottom" )
3909
3936
  .find( ".ui-btn-inner" )
3910
3937
  .addClass( "ui-corner-bottom" );
@@ -3912,7 +3939,7 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3912
3939
 
3913
3940
  if ( collapsible.jqmData( "collapsible-last" ) ) {
3914
3941
  collapsibleHeading
3915
- .find( "a:eq(0), .ui-btn-inner" )
3942
+ .find( "a" ).first().add ( collapsibleHeading.find( ".ui-btn-inner" ) )
3916
3943
  .addClass( "ui-corner-bottom" );
3917
3944
  }
3918
3945
  }
@@ -3942,7 +3969,7 @@ $.widget( "mobile.collapsible", $.mobile.widget, {
3942
3969
 
3943
3970
  if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) {
3944
3971
  collapsibleHeading
3945
- .find( "a:eq(0), .ui-btn-inner" )
3972
+ .find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
3946
3973
  .toggleClass( "ui-corner-bottom", isCollapse );
3947
3974
  collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse );
3948
3975
  }
@@ -3971,10 +3998,7 @@ $( document ).bind( "pagecreate create", function( e ){
3971
3998
 
3972
3999
  })( jQuery );
3973
4000
  /*
3974
- * jQuery Mobile Framework : "fieldcontain" plugin - simple class additions to make form row separators
3975
- * Copyright (c) jQuery Project
3976
- * Dual licensed under the MIT or GPL Version 2 licenses.
3977
- * http://jquery.org/license
4001
+ * "fieldcontain" plugin - simple class additions to make form row separators
3978
4002
  */
3979
4003
 
3980
4004
  (function( $, undefined ) {
@@ -3989,10 +4013,7 @@ $( document ).bind( "pagecreate create", function( e ){
3989
4013
  });
3990
4014
 
3991
4015
  })( jQuery );/*
3992
- * jQuery Mobile Framework : plugin for creating CSS grids
3993
- * Copyright (c) jQuery Project
3994
- * Dual licensed under the MIT or GPL Version 2 licenses.
3995
- * http://jquery.org/license
4016
+ * plugin for creating CSS grids
3996
4017
  */
3997
4018
 
3998
4019
  (function( $, undefined ) {
@@ -4041,10 +4062,7 @@ $.fn.grid = function( options ) {
4041
4062
  });
4042
4063
  };
4043
4064
  })( jQuery );/*
4044
- * jQuery Mobile Framework : "navbar" plugin
4045
- * Copyright (c) jQuery Project
4046
- * Dual licensed under the MIT or GPL Version 2 licenses.
4047
- * http://jquery.org/license
4065
+ * "navbar" plugin
4048
4066
  */
4049
4067
 
4050
4068
  (function( $, undefined ) {
@@ -4092,10 +4110,7 @@ $( document ).bind( "pagecreate create", function( e ){
4092
4110
 
4093
4111
  })( jQuery );
4094
4112
  /*
4095
- * jQuery Mobile Framework : "listview" plugin
4096
- * Copyright (c) jQuery Project
4097
- * Dual licensed under the MIT or GPL Version 2 licenses.
4098
- * http://jquery.org/license
4113
+ * "listview" plugin
4099
4114
  */
4100
4115
 
4101
4116
  (function( $, undefined ) {
@@ -4107,7 +4122,7 @@ var listCountPerPage = {};
4107
4122
 
4108
4123
  $.widget( "mobile.listview", $.mobile.widget, {
4109
4124
  options: {
4110
- theme: "c",
4125
+ theme: null,
4111
4126
  countTheme: "c",
4112
4127
  headerTheme: "b",
4113
4128
  dividerTheme: "b",
@@ -4128,25 +4143,6 @@ $.widget( "mobile.listview", $.mobile.widget, {
4128
4143
  t.refresh( true );
4129
4144
  },
4130
4145
 
4131
- _itemApply: function( $list, item ) {
4132
- var $countli = item.find( ".ui-li-count" );
4133
- if ( $countli.length ) {
4134
- item.addClass( "ui-li-has-count" );
4135
- }
4136
- $countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
4137
-
4138
- // TODO class has to be defined in markup
4139
- item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
4140
- .find( "p, dl" ).addClass( "ui-li-desc" ).end()
4141
- .find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function() {
4142
- item.addClass( $(this).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
4143
- }).end()
4144
- .find( ".ui-li-aside" ).each(function() {
4145
- var $this = $(this);
4146
- $this.prependTo( $this.parent() ); //shift aside to front for css float
4147
- });
4148
- },
4149
-
4150
4146
  _removeCorners: function( li, which ) {
4151
4147
  var top = "ui-corner-top ui-corner-tr ui-corner-tl",
4152
4148
  bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
@@ -4179,8 +4175,11 @@ $.widget( "mobile.listview", $.mobile.widget, {
4179
4175
  $topli = $visibleli.first()
4180
4176
  .addClass( "ui-corner-top" );
4181
4177
 
4182
- $topli.add( $topli.find( ".ui-btn-inner" ) )
4183
- .find( ".ui-li-link-alt" )
4178
+ $topli.add( $topli.find( ".ui-btn-inner" )
4179
+ .not( ".ui-li-link-alt span:first-child" ) )
4180
+ .addClass( "ui-corner-top" )
4181
+ .end()
4182
+ .find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" )
4184
4183
  .addClass( "ui-corner-tr" )
4185
4184
  .end()
4186
4185
  .find( ".ui-li-thumb" )
@@ -4204,6 +4203,56 @@ $.widget( "mobile.listview", $.mobile.widget, {
4204
4203
  }
4205
4204
  },
4206
4205
 
4206
+ // This is a generic utility method for finding the first
4207
+ // node with a given nodeName. It uses basic DOM traversal
4208
+ // to be fast and is meant to be a substitute for simple
4209
+ // $.fn.closest() and $.fn.children() calls on a single
4210
+ // element. Note that callers must pass both the lowerCase
4211
+ // and upperCase version of the nodeName they are looking for.
4212
+ // The main reason for this is that this function will be
4213
+ // called many times and we want to avoid having to lowercase
4214
+ // the nodeName from the element every time to ensure we have
4215
+ // a match. Note that this function lives here for now, but may
4216
+ // be moved into $.mobile if other components need a similar method.
4217
+ _findFirstElementByTagName: function( ele, nextProp, lcName, ucName )
4218
+ {
4219
+ var dict = {};
4220
+ dict[ lcName ] = dict[ ucName ] = true;
4221
+ while ( ele ) {
4222
+ if ( dict[ ele.nodeName ] ) {
4223
+ return ele;
4224
+ }
4225
+ ele = ele[ nextProp ];
4226
+ }
4227
+ return null;
4228
+ },
4229
+ _getChildrenByTagName: function( ele, lcName, ucName )
4230
+ {
4231
+ var results = [],
4232
+ dict = {};
4233
+ dict[ lcName ] = dict[ ucName ] = true;
4234
+ ele = ele.firstChild;
4235
+ while ( ele ) {
4236
+ if ( dict[ ele.nodeName ] ) {
4237
+ results.push( ele );
4238
+ }
4239
+ ele = ele.nextSibling;
4240
+ }
4241
+ return $( results );
4242
+ },
4243
+
4244
+ _addThumbClasses: function( containers )
4245
+ {
4246
+ var i, img, len = containers.length;
4247
+ for ( i = 0; i < len; i++ ) {
4248
+ img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) );
4249
+ if ( img.length ) {
4250
+ img.addClass( "ui-li-thumb" );
4251
+ $( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
4252
+ }
4253
+ }
4254
+ },
4255
+
4207
4256
  refresh: function( create ) {
4208
4257
  this.parentPage = this.element.closest( ".ui-page" );
4209
4258
  this._createSubPages();
@@ -4214,14 +4263,19 @@ $.widget( "mobile.listview", $.mobile.widget, {
4214
4263
  dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
4215
4264
  listsplittheme = $list.jqmData( "splittheme" ),
4216
4265
  listspliticon = $list.jqmData( "spliticon" ),
4217
- li = $list.children( "li" ),
4266
+ li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
4218
4267
  counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
4268
+ itemClassDict = {},
4219
4269
  item, itemClass, itemTheme,
4220
- a, last, splittheme, countParent, icon;
4270
+ a, last, splittheme, countParent, icon, imgParents, img;
4221
4271
 
4222
4272
  if ( counter ) {
4223
4273
  $list.find( ".ui-li-dec" ).remove();
4224
4274
  }
4275
+
4276
+ if ( !o.theme ) {
4277
+ o.theme = $.mobile.getInheritedTheme( this.element, "c" );
4278
+ }
4225
4279
 
4226
4280
  for ( var pos = 0, numli = li.length; pos < numli; pos++ ) {
4227
4281
  item = li.eq( pos );
@@ -4230,7 +4284,7 @@ $.widget( "mobile.listview", $.mobile.widget, {
4230
4284
  // If we're creating the element, we update it regardless
4231
4285
  if ( create || !item.hasClass( "ui-li" ) ) {
4232
4286
  itemTheme = item.jqmData("theme") || o.theme;
4233
- a = item.children( "a" );
4287
+ a = this._getChildrenByTagName( item[ 0 ], "a", "A" );
4234
4288
 
4235
4289
  if ( a.length ) {
4236
4290
  icon = item.jqmData("icon");
@@ -4269,7 +4323,7 @@ $.widget( "mobile.listview", $.mobile.widget, {
4269
4323
  })
4270
4324
  .find( ".ui-btn-inner" )
4271
4325
  .append(
4272
- $( "<span />" ).buttonMarkup({
4326
+ $( document.createElement( "span" ) ).buttonMarkup({
4273
4327
  shadow: true,
4274
4328
  corners: true,
4275
4329
  theme: splittheme,
@@ -4300,11 +4354,59 @@ $.widget( "mobile.listview", $.mobile.widget, {
4300
4354
  .prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
4301
4355
  }
4302
4356
 
4303
- item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
4357
+ // Instead of setting item class directly on the list item and its
4358
+ // btn-inner at this point in time, push the item into a dictionary
4359
+ // that tells us what class to set on it so we can do this after this
4360
+ // processing loop is finished.
4361
+
4362
+ if ( !itemClassDict[ itemClass ] ) {
4363
+ itemClassDict[ itemClass ] = [];
4364
+ }
4365
+
4366
+ itemClassDict[ itemClass ].push( item[ 0 ] );
4367
+ }
4368
+
4369
+ // Set the appropriate listview item classes on each list item
4370
+ // and their btn-inner elements. The main reason we didn't do this
4371
+ // in the for-loop above is because we can eliminate per-item function overhead
4372
+ // by calling addClass() and children() once or twice afterwards. This
4373
+ // can give us a significant boost on platforms like WP7.5.
4304
4374
 
4305
- self._itemApply( $list, item );
4375
+ for ( itemClass in itemClassDict ) {
4376
+ $( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass );
4306
4377
  }
4307
4378
 
4379
+ $list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" )
4380
+ .end()
4381
+
4382
+ .find( "p, dl" ).addClass( "ui-li-desc" )
4383
+ .end()
4384
+
4385
+ .find( ".ui-li-aside" ).each(function() {
4386
+ var $this = $(this);
4387
+ $this.prependTo( $this.parent() ); //shift aside to front for css float
4388
+ })
4389
+ .end()
4390
+
4391
+ .find( ".ui-li-count" ).each( function() {
4392
+ $( this ).closest( "li" ).addClass( "ui-li-has-count" );
4393
+ }).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" );
4394
+
4395
+ // The idea here is to look at the first image in the list item
4396
+ // itself, and any .ui-link-inherit element it may contain, so we
4397
+ // can place the appropriate classes on the image and list item.
4398
+ // Note that we used to use something like:
4399
+ //
4400
+ // li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... );
4401
+ //
4402
+ // But executing a find() like that on Windows Phone 7.5 took a
4403
+ // really long time. Walking things manually with the code below
4404
+ // allows the 400 listview item page to load in about 3 seconds as
4405
+ // opposed to 30 seconds.
4406
+
4407
+ this._addThumbClasses( li );
4408
+ this._addThumbClasses( $list.find( ".ui-link-inherit" ) );
4409
+
4308
4410
  this._refreshCorners( create );
4309
4411
  },
4310
4412
 
@@ -4407,10 +4509,7 @@ $( document ).bind( "pagecreate create", function( e ){
4407
4509
 
4408
4510
  })( jQuery );
4409
4511
  /*
4410
- * jQuery Mobile Framework : "listview" filter extension
4411
- * Copyright (c) jQuery Project
4412
- * Dual licensed under the MIT or GPL Version 2 licenses.
4413
- * http://jquery.org/license
4512
+ * "listview" filter extension
4414
4513
  */
4415
4514
 
4416
4515
  (function( $, undefined ) {
@@ -4452,12 +4551,11 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
4452
4551
 
4453
4552
  // Change val as lastval for next execution
4454
4553
  $this.jqmData( "lastval" , val );
4455
-
4456
- change = val.replace( new RegExp( "^" + lastval ) , "" );
4554
+ change = val.substr( 0 , lastval.length - 1 ).replace( lastval , "" );
4457
4555
 
4458
4556
  if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) {
4459
4557
 
4460
- // Removed chars or pasted something totaly different, check all items
4558
+ // Removed chars or pasted something totally different, check all items
4461
4559
  listItems = list.children();
4462
4560
  } else {
4463
4561
 
@@ -4487,7 +4585,7 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
4487
4585
  item.toggleClass( "ui-filter-hidequeue" , true );
4488
4586
  } else {
4489
4587
 
4490
- // There"s a shown item in the bucket
4588
+ // There's a shown item in the bucket
4491
4589
  childItems = true;
4492
4590
  }
4493
4591
  }
@@ -4524,10 +4622,7 @@ $( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
4524
4622
  });
4525
4623
 
4526
4624
  })( jQuery );/*
4527
- * jQuery Mobile Framework : "nojs" plugin - class to make elements hidden to A grade browsers
4528
- * Copyright (c) jQuery Project
4529
- * Dual licensed under the MIT or GPL Version 2 licenses.
4530
- * http://jquery.org/license
4625
+ * "nojs" plugin - class to make elements hidden to A grade browsers
4531
4626
  */
4532
4627
 
4533
4628
  (function( $, undefined ) {
@@ -4538,10 +4633,7 @@ $( document ).bind( "pagecreate create", function( e ){
4538
4633
  });
4539
4634
 
4540
4635
  })( jQuery );/*
4541
- * jQuery Mobile Framework : "checkboxradio" plugin
4542
- * Copyright (c) jQuery Project
4543
- * Dual licensed under the MIT or GPL Version 2 licenses.
4544
- * http://jquery.org/license
4636
+ * "checkboxradio" plugin
4545
4637
  */
4546
4638
 
4547
4639
  (function( $, undefined ) {
@@ -4556,7 +4648,7 @@ $.widget( "mobile.checkboxradio", $.mobile.widget, {
4556
4648
  input = this.element,
4557
4649
  // NOTE: Windows Phone could not find the label through a selector
4558
4650
  // filter works though.
4559
- label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label" ).filter( "[for='" + input[ 0 ].id + "']"),
4651
+ label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label[for='" + input[ 0 ].id + "']"),
4560
4652
  inputtype = input.attr( "type" ),
4561
4653
  checkedState = inputtype + "-on",
4562
4654
  uncheckedState = inputtype + "-off",
@@ -4613,6 +4705,13 @@ $.widget( "mobile.checkboxradio", $.mobile.widget, {
4613
4705
 
4614
4706
  input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) );
4615
4707
 
4708
+ // trigger click handler's bound directly to the input as a substitute for
4709
+ // how label clicks behave normally in the browsers
4710
+ // TODO: it would be nice to let the browser's handle the clicks and pass them
4711
+ // through to the associate input. we can swallow that click at the parent
4712
+ // wrapper element level
4713
+ input.triggerHandler( 'click' );
4714
+
4616
4715
  // Input set for common radio buttons will contain all the radio
4617
4716
  // buttons, but will not for checkboxes. clearing the checked status
4618
4717
  // of other radios ensures the active button state is applied properly
@@ -4627,11 +4726,10 @@ $.widget( "mobile.checkboxradio", $.mobile.widget, {
4627
4726
  input
4628
4727
  .bind({
4629
4728
  vmousedown: function() {
4630
- this._cacheVals();
4729
+ self._cacheVals();
4631
4730
  },
4632
4731
 
4633
4732
  vclick: function() {
4634
-
4635
4733
  var $this = $(this);
4636
4734
 
4637
4735
  // Adds checked attribute to checked input when keyboard is used
@@ -4731,10 +4829,7 @@ $( document ).bind( "pagecreate create", function( e ){
4731
4829
 
4732
4830
  })( jQuery );
4733
4831
  /*
4734
- * jQuery Mobile Framework : "button" plugin - links that proxy to native input/buttons
4735
- * Copyright (c) jQuery Project
4736
- * Dual licensed under the MIT or GPL Version 2 licenses.
4737
- * http://jquery.org/license
4832
+ * "button" plugin - links that proxy to native input/buttons
4738
4833
  */
4739
4834
 
4740
4835
  (function( $, undefined ) {
@@ -4781,15 +4876,18 @@ $.widget( "mobile.button", $.mobile.widget, {
4781
4876
  // Add hidden input if it doesn’t already exist.
4782
4877
  if( $buttonPlaceholder === undefined ) {
4783
4878
  $buttonPlaceholder = $( "<input>", {
4784
- type: "hidden",
4785
- name: $el.attr( "name" ),
4786
- value: $el.attr( "value" )
4787
- })
4788
- .insertBefore( $el );
4879
+ type: "hidden",
4880
+ name: $el.attr( "name" ),
4881
+ value: $el.attr( "value" )
4882
+ }).insertBefore( $el );
4789
4883
 
4790
4884
  // Bind to doc to remove after submit handling
4791
- $( document ).submit(function(){
4792
- $buttonPlaceholder.remove();
4885
+ $( document ).one("submit", function(){
4886
+ $buttonPlaceholder.remove();
4887
+
4888
+ // reset the local var so that the hidden input
4889
+ // will be re-added on subsequent clicks
4890
+ $buttonPlaceholder = undefined;
4793
4891
  });
4794
4892
  }
4795
4893
  });
@@ -4811,11 +4909,17 @@ $.widget( "mobile.button", $.mobile.widget, {
4811
4909
  },
4812
4910
 
4813
4911
  refresh: function() {
4814
- if ( this.element.attr( "disabled" ) ) {
4912
+ var $el = this.element;
4913
+
4914
+ if ( $el.prop("disabled") ) {
4815
4915
  this.disable();
4816
4916
  } else {
4817
4917
  this.enable();
4818
4918
  }
4919
+
4920
+ // the textWrapper is stored as a data element on the button object
4921
+ // to prevent referencing by it's implementation details (eg 'class')
4922
+ this.button.data( 'textWrapper' ).text( $el.text() || $el.val() );
4819
4923
  }
4820
4924
  });
4821
4925
 
@@ -4825,10 +4929,7 @@ $( document ).bind( "pagecreate create", function( e ){
4825
4929
  });
4826
4930
 
4827
4931
  })( jQuery );/*
4828
- * jQuery Mobile Framework : "slider" plugin
4829
- * Copyright (c) jQuery Project
4830
- * Dual licensed under the MIT or GPL Version 2 licenses.
4831
- * http://jquery.org/license
4932
+ * "slider" plugin
4832
4933
  */
4833
4934
 
4834
4935
  ( function( $, undefined ) {
@@ -4896,12 +4997,16 @@ $.widget( "mobile.slider", $.mobile.widget, {
4896
4997
  handle: handle,
4897
4998
  dragging: false,
4898
4999
  beforeStart: null,
4899
- userModified: false
5000
+ userModified: false,
5001
+ mouseMoved: false
4900
5002
  });
4901
5003
 
4902
5004
  if ( cType == "select" ) {
4903
5005
 
4904
5006
  slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
5007
+
5008
+ // make the handle move with a smooth transition
5009
+ handle.addClass( "ui-slider-handle-snapping" );
4905
5010
 
4906
5011
  options = control.find( "option" );
4907
5012
 
@@ -4925,7 +5030,10 @@ $.widget( "mobile.slider", $.mobile.widget, {
4925
5030
  // monitor the input for updated values
4926
5031
  control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" )
4927
5032
  .change( function() {
4928
- self.refresh( val(), true );
5033
+ // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again
5034
+ if (!self.mouseMoved) {
5035
+ self.refresh( val(), true );
5036
+ }
4929
5037
  })
4930
5038
  .keyup( function() { // necessary?
4931
5039
  self.refresh( val(), true, true );
@@ -4937,8 +5045,18 @@ $.widget( "mobile.slider", $.mobile.widget, {
4937
5045
  // prevent screen drag when slider activated
4938
5046
  $( document ).bind( "vmousemove", function( event ) {
4939
5047
  if ( self.dragging ) {
5048
+ // self.mouseMoved must be updated before refresh() because it will be used in the control "change" event
5049
+ self.mouseMoved = true;
5050
+
5051
+ if ( cType === "select" ) {
5052
+ // make the handle move in sync with the mouse
5053
+ handle.removeClass( "ui-slider-handle-snapping" );
5054
+ }
5055
+
4940
5056
  self.refresh( event );
4941
- self.userModified = self.userModified || self.beforeStart !== control[0].selectedIndex;
5057
+
5058
+ // only after refresh() you can calculate self.userModified
5059
+ self.userModified = self.beforeStart !== control[0].selectedIndex;
4942
5060
  return false;
4943
5061
  }
4944
5062
  });
@@ -4946,10 +5064,12 @@ $.widget( "mobile.slider", $.mobile.widget, {
4946
5064
  slider.bind( "vmousedown", function( event ) {
4947
5065
  self.dragging = true;
4948
5066
  self.userModified = false;
5067
+ self.mouseMoved = false;
4949
5068
 
4950
5069
  if ( cType === "select" ) {
4951
5070
  self.beforeStart = control[0].selectedIndex;
4952
5071
  }
5072
+
4953
5073
  self.refresh( event );
4954
5074
  return false;
4955
5075
  });
@@ -4960,14 +5080,31 @@ $.widget( "mobile.slider", $.mobile.widget, {
4960
5080
 
4961
5081
  self.dragging = false;
4962
5082
 
4963
- if ( cType === "select" ) {
4964
-
4965
- if ( !self.userModified ) {
4966
- //tap occurred, but value didn't change. flip it!
4967
- handle.addClass( "ui-slider-handle-snapping" );
4968
- self.refresh( !self.beforeStart ? 1 : 0 );
5083
+ if ( cType === "select") {
5084
+
5085
+ // make the handle move with a smooth transition
5086
+ handle.addClass( "ui-slider-handle-snapping" );
5087
+
5088
+ if ( self.mouseMoved ) {
5089
+
5090
+ // this is a drag, change the value only if user dragged enough
5091
+ if ( self.userModified ) {
5092
+ self.refresh( self.beforeStart == 0 ? 1 : 0 );
5093
+ }
5094
+ else {
5095
+ self.refresh( self.beforeStart );
5096
+ }
5097
+
5098
+ }
5099
+ else {
5100
+ // this is just a click, change the value
5101
+ self.refresh( self.beforeStart == 0 ? 1 : 0 );
4969
5102
  }
5103
+
4970
5104
  }
5105
+
5106
+ self.mouseMoved = false;
5107
+
4971
5108
  return false;
4972
5109
  }
4973
5110
  });
@@ -5041,8 +5178,7 @@ $.widget( "mobile.slider", $.mobile.widget, {
5041
5178
  refresh: function( val, isfromControl, preventInputUpdate ) {
5042
5179
 
5043
5180
  if ( this.options.disabled || this.element.attr('disabled')) {
5044
- this.slider.addClass('ui-disabled');
5045
- return;
5181
+ this.disable();
5046
5182
  }
5047
5183
 
5048
5184
  var control = this.element, percent,
@@ -5149,10 +5285,7 @@ $( document ).bind( "pagecreate create", function( e ){
5149
5285
 
5150
5286
  })( jQuery );
5151
5287
  /*
5152
- * jQuery Mobile Framework : "textinput" plugin for text inputs, textareas
5153
- * Copyright (c) jQuery Project
5154
- * Dual licensed under the MIT or GPL Version 2 licenses.
5155
- * http://jquery.org/license
5288
+ * "textinput" plugin for text inputs, textareas
5156
5289
  */
5157
5290
 
5158
5291
  (function( $, undefined ) {
@@ -5167,20 +5300,13 @@ $.widget( "mobile.textinput", $.mobile.widget, {
5167
5300
 
5168
5301
  var input = this.element,
5169
5302
  o = this.options,
5170
- theme = o.theme,
5171
- themeclass, focusedEl, clearbtn;
5172
-
5173
- if ( !theme ) {
5174
- theme = $.mobile.getInheritedTheme( this.element, "c" );
5175
- }
5176
-
5177
- themeclass = " ui-body-" + theme;
5303
+ theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
5304
+ themeclass = " ui-body-" + theme,
5305
+ focusedEl, clearbtn;
5178
5306
 
5179
5307
  $( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
5180
5308
 
5181
- input.addClass("ui-input-text ui-body-"+ theme );
5182
-
5183
- focusedEl = input;
5309
+ focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
5184
5310
 
5185
5311
  // XXX: Temporary workaround for issue 785 (Apple bug 8910589).
5186
5312
  // Turn off autocorrect and autocomplete on non-iOS 5 devices
@@ -5217,17 +5343,14 @@ $.widget( "mobile.textinput", $.mobile.widget, {
5217
5343
  });
5218
5344
 
5219
5345
  function toggleClear() {
5220
- if ( !input.val() ) {
5221
- clearbtn.addClass( "ui-input-clear-hidden" );
5222
- } else {
5223
- clearbtn.removeClass( "ui-input-clear-hidden" );
5224
- }
5346
+ setTimeout(function() {
5347
+ clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
5348
+ }, 0);
5225
5349
  }
5226
5350
 
5227
5351
  toggleClear();
5228
5352
 
5229
- input.keyup( toggleClear )
5230
- .focus( toggleClear );
5353
+ input.bind('paste cut keyup focus change blur', toggleClear);
5231
5354
 
5232
5355
  } else {
5233
5356
  input.addClass( "ui-corner-all ui-shadow-inset" + themeclass );
@@ -5249,9 +5372,7 @@ $.widget( "mobile.textinput", $.mobile.widget, {
5249
5372
  clientHeight = input[ 0 ].clientHeight;
5250
5373
 
5251
5374
  if ( clientHeight < scrollHeight ) {
5252
- input.css({
5253
- height: (scrollHeight + extraLineHeight)
5254
- });
5375
+ input.height(scrollHeight + extraLineHeight);
5255
5376
  }
5256
5377
  },
5257
5378
  keyupTimeout;
@@ -5261,10 +5382,15 @@ $.widget( "mobile.textinput", $.mobile.widget, {
5261
5382
  keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
5262
5383
  });
5263
5384
 
5264
- // Issue 509: the browser is not giving scrollHeight properly until after the document
5265
- // is ready.
5266
- if ($.trim(input.text())) {
5267
- $(keyup);
5385
+ // Issue 509: the browser is not providing scrollHeight properly until the styles load
5386
+ if ( $.trim( input.val() ) ) {
5387
+ // bind to the window load to make sure the height is calculated based on BOTH
5388
+ // the DOM and CSS
5389
+ $( window ).load( keyup );
5390
+
5391
+ // binding to pagechange here ensures that for pages loaded via
5392
+ // ajax the height is recalculated without user input
5393
+ $( document ).one( "pagechange", keyup );
5268
5394
  }
5269
5395
  }
5270
5396
  },
@@ -5287,10 +5413,7 @@ $( document ).bind( "pagecreate create", function( e ){
5287
5413
 
5288
5414
  })( jQuery );
5289
5415
  /*
5290
- * jQuery Mobile Framework : custom "selectmenu" plugin
5291
- * Copyright (c) jQuery Project
5292
- * Dual licensed under the MIT or GPL Version 2 licenses.
5293
- * http://jquery.org/license
5416
+ * custom "selectmenu" plugin
5294
5417
  */
5295
5418
 
5296
5419
  (function( $, undefined ) {
@@ -5305,7 +5428,7 @@ $( document ).bind( "pagecreate create", function( e ){
5305
5428
  isMultiple = widget.isMultiple = widget.select[ 0 ].multiple,
5306
5429
  buttonId = selectID + "-button",
5307
5430
  menuId = selectID + "-menu",
5308
- menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.menuPageTheme +"'>" +
5431
+ menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.theme +"' data-" +$.mobile.ns + "overlay-theme='"+ widget.options.overlayTheme +"'>" +
5309
5432
  "<div data-" + $.mobile.ns + "role='header'>" +
5310
5433
  "<div class='ui-title'>" + label.getEncodedText() + "</div>"+
5311
5434
  "</div>"+
@@ -5612,7 +5735,7 @@ $( document ).bind( "pagecreate create", function( e ){
5612
5735
  // fall into a black hole
5613
5736
  self.thisPage.unbind( "pagehide.remove" );
5614
5737
 
5615
- //for webos (set lastscroll using button offset)
5738
+ //for WebOS/Opera Mini (set lastscroll using button offset)
5616
5739
  if ( scrollTop == 0 && btnOffset > screenHeight ) {
5617
5740
  self.thisPage.one( "pagehide", function() {
5618
5741
  $( this ).jqmData( "lastScroll", btnOffset );
@@ -5783,10 +5906,7 @@ $( document ).bind( "pagecreate create", function( e ){
5783
5906
  });
5784
5907
  })( jQuery );
5785
5908
  /*
5786
- * jQuery Mobile Framework : "selectmenu" plugin
5787
- * Copyright (c) jQuery Project
5788
- * Dual licensed under the MIT or GPL Version 2 licenses.
5789
- * http://jquery.org/license
5909
+ * "selectmenu" plugin
5790
5910
  */
5791
5911
 
5792
5912
  (function( $, undefined ) {
@@ -5991,30 +6111,36 @@ $( document ).bind( "pagecreate create", function( e ){
5991
6111
  });
5992
6112
  })( jQuery );
5993
6113
  /*
5994
- * jQuery Mobile Framework : plugin for making button-like links
5995
- * Copyright (c) jQuery Project
5996
- * Dual licensed under the MIT or GPL Version 2 licenses.
5997
- * http://jquery.org/license
6114
+ * "buttons" plugin - for making button-like links
5998
6115
  */
6116
+
5999
6117
  ( function( $, undefined ) {
6000
6118
 
6001
6119
  $.fn.buttonMarkup = function( options ) {
6002
- return this.each( function() {
6003
- var el = $( this ),
6120
+ options = options || {};
6121
+
6122
+ for ( var i = 0; i < this.length; i++ ) {
6123
+ var el = this.eq( i ),
6124
+ e = el[ 0 ],
6004
6125
  o = $.extend( {}, $.fn.buttonMarkup.defaults, {
6005
- icon: el.jqmData( "icon" ),
6006
- iconpos: el.jqmData( "iconpos" ),
6007
- theme: el.jqmData( "theme" ),
6008
- inline: el.jqmData( "inline" ),
6009
- shadow: el.jqmData( "shadow" ),
6010
- corners: el.jqmData( "corners" ),
6011
- iconshadow: el.jqmData( "iconshadow" )
6126
+ icon: options.icon !== undefined ? options.icon : el.jqmData( "icon" ),
6127
+ iconpos: options.iconpos !== undefined ? options.iconpos : el.jqmData( "iconpos" ),
6128
+ theme: options.theme !== undefined ? options.theme : el.jqmData( "theme" ),
6129
+ inline: options.inline !== undefined ? options.inline : el.jqmData( "inline" ),
6130
+ shadow: options.shadow !== undefined ? options.shadow : el.jqmData( "shadow" ),
6131
+ corners: options.corners !== undefined ? options.corners : el.jqmData( "corners" ),
6132
+ iconshadow: options.iconshadow !== undefined ? options.iconshadow : el.jqmData( "iconshadow" )
6012
6133
  }, options ),
6013
6134
 
6014
6135
  // Classes Defined
6015
6136
  innerClass = "ui-btn-inner",
6137
+ textClass = "ui-btn-text",
6016
6138
  buttonClass, iconClass,
6017
- wrap;
6139
+
6140
+ // Button inner markup
6141
+ buttonInner = document.createElement( o.wrapperEls ),
6142
+ buttonText = document.createElement( o.wrapperEls ),
6143
+ buttonIcon = o.icon ? document.createElement( "span" ) : null;
6018
6144
 
6019
6145
  if ( attachEvents ) {
6020
6146
  attachEvents();
@@ -6059,15 +6185,33 @@ $.fn.buttonMarkup = function( options ) {
6059
6185
  buttonClass += " ui-shadow";
6060
6186
  }
6061
6187
 
6062
- el.attr( "data-" + $.mobile.ns + "theme", o.theme )
6063
- .addClass( buttonClass );
6188
+ e.setAttribute( "data-" + $.mobile.ns + "theme", o.theme );
6189
+ el.addClass( buttonClass );
6064
6190
 
6065
- wrap = ( "<D class='" + innerClass + "' aria-hidden='true'><D class='ui-btn-text'></D>" +
6066
- ( o.icon ? "<span class='" + iconClass + "'></span>" : "" ) +
6067
- "</D>" ).replace( /D/g, o.wrapperEls );
6191
+ buttonInner.className = innerClass;
6192
+ buttonInner.setAttribute("aria-hidden", "true");
6068
6193
 
6069
- el.wrapInner( wrap );
6070
- });
6194
+ buttonText.className = textClass;
6195
+ buttonInner.appendChild( buttonText );
6196
+
6197
+ if ( buttonIcon ) {
6198
+ buttonIcon.className = iconClass;
6199
+ buttonInner.appendChild( buttonIcon );
6200
+ }
6201
+
6202
+ while ( e.firstChild ) {
6203
+ buttonText.appendChild( e.firstChild );
6204
+ }
6205
+
6206
+ e.appendChild( buttonInner );
6207
+
6208
+ // TODO obviously it would be nice to pull this element out instead of
6209
+ // retrieving it from the DOM again, but this change is much less obtrusive
6210
+ // and 1.0 draws nigh
6211
+ $.data( e, 'textWrapper', $( buttonText ) );
6212
+ }
6213
+
6214
+ return this;
6071
6215
  };
6072
6216
 
6073
6217
  $.fn.buttonMarkup.defaults = {
@@ -6079,14 +6223,23 @@ $.fn.buttonMarkup.defaults = {
6079
6223
  };
6080
6224
 
6081
6225
  function closestEnabledButton( element ) {
6082
- while ( element ) {
6083
- var $ele = $( element );
6084
- if ( $ele.hasClass( "ui-btn" ) && !$ele.hasClass( "ui-disabled" ) ) {
6085
- break;
6086
- }
6087
- element = element.parentNode;
6088
- }
6089
- return element;
6226
+ var cname;
6227
+
6228
+ while ( element ) {
6229
+ // Note that we check for typeof className below because the element we
6230
+ // handed could be in an SVG DOM where className on SVG elements is defined to
6231
+ // be of a different type (SVGAnimatedString). We only operate on HTML DOM
6232
+ // elements, so we look for plain "string".
6233
+
6234
+ cname = ( typeof element.className === 'string' ) && element.className.split(' ');
6235
+
6236
+ if ( cname && $.inArray( "ui-btn", cname ) > -1 && $.inArray( "ui-disabled", cname ) < 0 ) {
6237
+ break;
6238
+ }
6239
+ element = element.parentNode;
6240
+ }
6241
+
6242
+ return element;
6090
6243
  }
6091
6244
 
6092
6245
  var attachEvents = function() {
@@ -6128,7 +6281,7 @@ var attachEvents = function() {
6128
6281
  if ( btn ) {
6129
6282
  $btn = $( btn );
6130
6283
  theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
6131
- $btn.removeClass( "ui-btn-hover-" + theme ).addClass( "ui-btn-up-" + theme );
6284
+ $btn.removeClass( "ui-btn-hover-" + theme + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
6132
6285
  }
6133
6286
  }
6134
6287
  });
@@ -6146,12 +6299,10 @@ $( document ).bind( "pagecreate create", function( e ){
6146
6299
  });
6147
6300
 
6148
6301
  })( jQuery );
6149
- /*
6150
- * jQuery Mobile Framework: "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc
6151
- * Copyright (c) jQuery Project
6152
- * Dual licensed under the MIT or GPL Version 2 licenses.
6153
- * http://jquery.org/license
6302
+ /*
6303
+ * "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc
6154
6304
  */
6305
+
6155
6306
  (function( $, undefined ) {
6156
6307
 
6157
6308
  $.fn.controlgroup = function( options ) {
@@ -6164,9 +6315,9 @@ $.fn.controlgroup = function( options ) {
6164
6315
  shadow: false,
6165
6316
  excludeInvisible: true
6166
6317
  }, options ),
6167
- groupheading = $el.find( ">legend" ),
6318
+ groupheading = $el.children( "legend" ),
6168
6319
  flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
6169
- type = $el.find( "input:eq(0)" ).attr( "type" );
6320
+ type = $el.find( "input" ).first().attr( "type" );
6170
6321
 
6171
6322
  // Replace legend with more stylable replacement div
6172
6323
  if ( groupheading.length ) {
@@ -6183,7 +6334,7 @@ $.fn.controlgroup = function( options ) {
6183
6334
  els.removeClass( "ui-btn-corner-all ui-shadow" )
6184
6335
  .eq( 0 ).addClass( flCorners[ 0 ] )
6185
6336
  .end()
6186
- .filter( ":last" ).addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
6337
+ .last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
6187
6338
  }
6188
6339
 
6189
6340
  flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ) );
@@ -6201,10 +6352,7 @@ $( document ).bind( "pagecreate create", function( e ){
6201
6352
  });
6202
6353
 
6203
6354
  })(jQuery);/*
6204
- * jQuery Mobile Framework : "links" plugin - simple class additions for links
6205
- * Copyright (c) jQuery Project
6206
- * Dual licensed under the MIT or GPL Version 2 licenses.
6207
- * http://jquery.org/license
6355
+ * "links" plugin - simple class additions for links
6208
6356
  */
6209
6357
 
6210
6358
  (function( $, undefined ) {
@@ -6220,10 +6368,7 @@ $( document ).bind( "pagecreate create", function( e ){
6220
6368
  });
6221
6369
 
6222
6370
  })( jQuery );/*
6223
- * jQuery Mobile Framework : "fixHeaderFooter" plugin - on-demand positioning for headers,footers
6224
- * Copyright (c) jQuery Project
6225
- * Dual licensed under the MIT or GPL Version 2 licenses.
6226
- * http://jquery.org/license
6371
+ * "fixHeaderFooter" plugin - on-demand positioning for headers,footers
6227
6372
  */
6228
6373
 
6229
6374
  (function( $, undefined ) {
@@ -6602,10 +6747,7 @@ $( document ).bind( "pagecreate create", function( event ) {
6602
6747
 
6603
6748
  })( jQuery );
6604
6749
  /*
6605
- * jQuery Mobile Framework : "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content
6606
- * Copyright (c) jQuery Project
6607
- * Dual licensed under the MIT or GPL Version 2 licenses.
6608
- * http://jquery.org/license
6750
+ * "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content
6609
6751
  */
6610
6752
 
6611
6753
  (function( $, undefined ) {
@@ -6664,14 +6806,9 @@ $( document ).bind( "pagecreate", function( event ) {
6664
6806
  });
6665
6807
 
6666
6808
  })( jQuery );
6667
- /*!
6668
- * jQuery Mobile v@VERSION
6669
- * http://jquerymobile.com/
6670
- *
6671
- * Copyright 2010, jQuery Project
6672
- * Dual licensed under the MIT or GPL Version 2 licenses.
6673
- * http://jquery.org/license
6674
- */
6809
+ /*
6810
+ * "init" - Initialize the framework
6811
+ */
6675
6812
 
6676
6813
  (function( $, window, undefined ) {
6677
6814
  var $html = $( "html" ),