From 47ff356c6a9613c0d94d8ec7799a38a551583754 Mon Sep 17 00:00:00 2001 From: Dylan Markow Date: Mon, 3 Nov 2014 10:04:10 -0600 Subject: [PATCH] Upgrade to JQM 1.4.5 --- Gemfile.lock | 2 +- README.md | 2 +- lib/jquery_mobile_rails/version.rb | 2 +- vendor/assets/javascripts/jquery.mobile.js | 506 ++++++++++-------- .../assets/javascripts/jquery.mobile.min.js | 18 +- .../assets/stylesheets/jquery.mobile.css.scss | 9 +- .../stylesheets/jquery.mobile.min.css.scss | 4 +- .../jquery.mobile.structure.css.scss | 9 +- .../jquery.mobile.structure.min.css.scss | 4 +- .../stylesheets/jquery.mobile.theme.css.scss | 4 +- .../jquery.mobile.theme.min.css.scss | 2 +- 11 files changed, 311 insertions(+), 251 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 42d1abf..59c2471 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - jquery_mobile_rails (1.4.4.1) + jquery_mobile_rails (1.4.5) railties (>= 3.1.0) GEM diff --git a/README.md b/README.md index a76c0a9..6c156c7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This gem adds the jQuery Mobile files to Rails' asset pipeline. ## Gem's jQuery Mobile Version -1.4.4 (gem 1.4.4.1) +1.4.5 (gem 1.4.5) ## Installation diff --git a/lib/jquery_mobile_rails/version.rb b/lib/jquery_mobile_rails/version.rb index 6ccbcc5..b966305 100644 --- a/lib/jquery_mobile_rails/version.rb +++ b/lib/jquery_mobile_rails/version.rb @@ -1,3 +1,3 @@ module JqueryMobileRails - VERSION = "1.4.4.1" + VERSION = "1.4.5" end diff --git a/vendor/assets/javascripts/jquery.mobile.js b/vendor/assets/javascripts/jquery.mobile.js index 8918844..937dfa5 100755 --- a/vendor/assets/javascripts/jquery.mobile.js +++ b/vendor/assets/javascripts/jquery.mobile.js @@ -1,6 +1,6 @@ /*! -* jQuery Mobile 1.4.4 -* Git HEAD hash: b4150fb1c561b614da796c210877fb25e74cf622 <> Date: Fri Sep 12 2014 16:43:26 UTC +* jQuery Mobile 1.4.5 +* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC * http://jquerymobile.com * * Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors @@ -26,204 +26,6 @@ $.mobile = {}; }( jQuery )); -(function( $, window, undefined ) { - $.extend( $.mobile, { - - // Version of the jQuery Mobile Framework - version: "1.4.4", - - // Deprecated and no longer used in 1.4 remove in 1.5 - // Define the url parameter used for referencing widget-generated sub-pages. - // Translates to example.html&ui-page=subpageIdentifier - // hash segment before &ui-page= is used to make Ajax request - subPageUrlKey: "ui-page", - - hideUrlBar: true, - - // Keepnative Selector - keepNative: ":jqmData(role='none'), :jqmData(role='nojs')", - - // Deprecated in 1.4 remove in 1.5 - // Class assigned to page currently in view, and during transitions - activePageClass: "ui-page-active", - - // Deprecated in 1.4 remove in 1.5 - // Class used for "active" button state, from CSS framework - activeBtnClass: "ui-btn-active", - - // Deprecated in 1.4 remove in 1.5 - // Class used for "focus" form element state, from CSS framework - focusClass: "ui-focus", - - // Automatically handle clicks and form submissions through Ajax, when same-domain - ajaxEnabled: true, - - // Automatically load and show pages based on location.hash - hashListeningEnabled: true, - - // disable to prevent jquery from bothering with links - linkBindingEnabled: true, - - // Set default page transition - 'none' for no transitions - defaultPageTransition: "fade", - - // Set maximum window width for transitions to apply - 'false' for no limit - maxTransitionWidth: false, - - // Minimum scroll distance that will be remembered when returning to a page - // Deprecated remove in 1.5 - minScrollBack: 0, - - // Set default dialog transition - 'none' for no transitions - defaultDialogTransition: "pop", - - // Error response message - appears when an Ajax page request fails - pageLoadErrorMessage: "Error Loading Page", - - // For error messages, which theme does the box use? - pageLoadErrorMessageTheme: "a", - - // replace calls to window.history.back with phonegaps navigation helper - // where it is provided on the window object - phonegapNavigationEnabled: false, - - //automatically initialize the DOM when it's ready - autoInitializePage: true, - - pushStateEnabled: true, - - // allows users to opt in to ignoring content by marking a parent element as - // data-ignored - ignoreContentEnabled: false, - - buttonMarkup: { - hoverDelay: 200 - }, - - // disable the alteration of the dynamic base tag or links in the case - // that a dynamic base tag isn't supported - dynamicBaseEnabled: true, - - // default the property to remove dependency on assignment in init module - pageContainer: $(), - - //enable cross-domain page support - allowCrossDomainPages: false, - - dialogHashKey: "&ui-state=dialog" - }); -})( jQuery, this ); - -(function( $, window, undefined ) { - var nsNormalizeDict = {}, - oldFind = $.find, - rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - jqmDataRE = /:jqmData\(([^)]*)\)/g; - - $.extend( $.mobile, { - - // Namespace used framework-wide for data-attrs. Default is no namespace - - ns: "", - - // Retrieve an attribute from an element and perform some massaging of the value - - getAttribute: function( element, key ) { - var data; - - element = element.jquery ? element[0] : element; - - if ( element && element.getAttribute ) { - data = element.getAttribute( "data-" + $.mobile.ns + key ); - } - - // Copied from core's src/data.js:dataAttr() - // Convert from a string to a proper data type - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? JSON.parse( data ) : - data; - } catch( err ) {} - - return data; - }, - - // Expose our cache for testing purposes. - nsNormalizeDict: nsNormalizeDict, - - // Take a data attribute property, prepend the namespace - // and then camel case the attribute string. Add the result - // to our nsNormalizeDict so we don't have to do this again. - nsNormalize: function( prop ) { - return nsNormalizeDict[ prop ] || - ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) ); - }, - - // Find the closest javascript page element to gather settings data jsperf test - // http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit - // possibly naive, but it shows that the parsing overhead for *just* the page selector vs - // the page and dialog selector is negligable. This could probably be speed up by - // doing a similar parent node traversal to the one found in the inherited theme code above - closestPageData: function( $target ) { - return $target - .closest( ":jqmData(role='page'), :jqmData(role='dialog')" ) - .data( "mobile-page" ); - } - - }); - - // Mobile version of data and removeData and hasData methods - // ensures all data is set and retrieved using jQuery Mobile's data namespace - $.fn.jqmData = function( prop, value ) { - var result; - if ( typeof prop !== "undefined" ) { - if ( prop ) { - prop = $.mobile.nsNormalize( prop ); - } - - // undefined is permitted as an explicit input for the second param - // in this case it returns the value and does not set it to undefined - if ( arguments.length < 2 || value === undefined ) { - result = this.data( prop ); - } else { - result = this.data( prop, value ); - } - } - return result; - }; - - $.jqmData = function( elem, prop, value ) { - var result; - if ( typeof prop !== "undefined" ) { - result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); - } - return result; - }; - - $.fn.jqmRemoveData = function( prop ) { - return this.removeData( $.mobile.nsNormalize( prop ) ); - }; - - $.jqmRemoveData = function( elem, prop ) { - return $.removeData( elem, $.mobile.nsNormalize( prop ) ); - }; - - $.find = function( selector, context, ret, extra ) { - if ( selector.indexOf( ":jqmData" ) > -1 ) { - selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" ); - } - - return oldFind.call( this, selector, context, ret, extra ); - }; - - $.extend( $.find, oldFind ); - -})( jQuery, this ); - /*! * jQuery UI Core c0ab71056b936627e8a7821f03c044aec6280a40 * http://jqueryui.com @@ -521,13 +323,32 @@ $.ui.plugin = { (function( $, window, undefined ) { // Subtract the height of external toolbars from the page height, if the page does not have - // internal toolbars of the same type + // internal toolbars of the same type. We take care to use the widget options if we find a + // widget instance and the element's data-attributes otherwise. var compensateToolbars = function( page, desiredHeight ) { var pageParent = page.parent(), toolbarsAffectingHeight = [], - externalHeaders = pageParent.children( ":jqmData(role='header')" ), + + // We use this function to filter fixed toolbars with option updatePagePadding set to + // true (which is the default) from our height subtraction, because fixed toolbars with + // option updatePagePadding set to true compensate for their presence by adding padding + // to the active page. We want to avoid double-counting by also subtracting their + // height from the desired page height. + noPadders = function() { + var theElement = $( this ), + widgetOptions = $.mobile.toolbar && theElement.data( "mobile-toolbar" ) ? + theElement.toolbar( "option" ) : { + position: theElement.attr( "data-" + $.mobile.ns + "position" ), + updatePagePadding: ( theElement.attr( "data-" + $.mobile.ns + + "update-page-padding" ) !== false ) + }; + + return !( widgetOptions.position === "fixed" && + widgetOptions.updatePagePadding === true ); + }, + externalHeaders = pageParent.children( ":jqmData(role='header')" ).filter( noPadders ), internalHeaders = page.children( ":jqmData(role='header')" ), - externalFooters = pageParent.children( ":jqmData(role='footer')" ), + externalFooters = pageParent.children( ":jqmData(role='footer')" ).filter( noPadders ), internalFooters = page.children( ":jqmData(role='footer')" ); // If we have no internal headers, but we do have external headers, then their height @@ -828,6 +649,93 @@ $.ui.plugin = { })( jQuery, this ); +(function( $, window, undefined ) { + $.extend( $.mobile, { + + // Version of the jQuery Mobile Framework + version: "1.4.5", + + // Deprecated and no longer used in 1.4 remove in 1.5 + // Define the url parameter used for referencing widget-generated sub-pages. + // Translates to example.html&ui-page=subpageIdentifier + // hash segment before &ui-page= is used to make Ajax request + subPageUrlKey: "ui-page", + + hideUrlBar: true, + + // Keepnative Selector + keepNative: ":jqmData(role='none'), :jqmData(role='nojs')", + + // Deprecated in 1.4 remove in 1.5 + // Class assigned to page currently in view, and during transitions + activePageClass: "ui-page-active", + + // Deprecated in 1.4 remove in 1.5 + // Class used for "active" button state, from CSS framework + activeBtnClass: "ui-btn-active", + + // Deprecated in 1.4 remove in 1.5 + // Class used for "focus" form element state, from CSS framework + focusClass: "ui-focus", + + // Automatically handle clicks and form submissions through Ajax, when same-domain + ajaxEnabled: true, + + // Automatically load and show pages based on location.hash + hashListeningEnabled: true, + + // disable to prevent jquery from bothering with links + linkBindingEnabled: true, + + // Set default page transition - 'none' for no transitions + defaultPageTransition: "fade", + + // Set maximum window width for transitions to apply - 'false' for no limit + maxTransitionWidth: false, + + // Minimum scroll distance that will be remembered when returning to a page + // Deprecated remove in 1.5 + minScrollBack: 0, + + // Set default dialog transition - 'none' for no transitions + defaultDialogTransition: "pop", + + // Error response message - appears when an Ajax page request fails + pageLoadErrorMessage: "Error Loading Page", + + // For error messages, which theme does the box use? + pageLoadErrorMessageTheme: "a", + + // replace calls to window.history.back with phonegaps navigation helper + // where it is provided on the window object + phonegapNavigationEnabled: false, + + //automatically initialize the DOM when it's ready + autoInitializePage: true, + + pushStateEnabled: true, + + // allows users to opt in to ignoring content by marking a parent element as + // data-ignored + ignoreContentEnabled: false, + + buttonMarkup: { + hoverDelay: 200 + }, + + // disable the alteration of the dynamic base tag or links in the case + // that a dynamic base tag isn't supported + dynamicBaseEnabled: true, + + // default the property to remove dependency on assignment in init module + pageContainer: $(), + + //enable cross-domain page support + allowCrossDomainPages: false, + + dialogHashKey: "&ui-state=dialog" + }); +})( jQuery, this ); /*! * jQuery UI Widget c0ab71056b936627e8a7821f03c044aec6280a40 @@ -1353,6 +1261,116 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { })( jQuery ); +(function( $, window, undefined ) { + var nsNormalizeDict = {}, + oldFind = $.find, + rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + jqmDataRE = /:jqmData\(([^)]*)\)/g; + + $.extend( $.mobile, { + + // Namespace used framework-wide for data-attrs. Default is no namespace + + ns: "", + + // Retrieve an attribute from an element and perform some massaging of the value + + getAttribute: function( element, key ) { + var data; + + element = element.jquery ? element[0] : element; + + if ( element && element.getAttribute ) { + data = element.getAttribute( "data-" + $.mobile.ns + key ); + } + + // Copied from core's src/data.js:dataAttr() + // Convert from a string to a proper data type + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? JSON.parse( data ) : + data; + } catch( err ) {} + + return data; + }, + + // Expose our cache for testing purposes. + nsNormalizeDict: nsNormalizeDict, + + // Take a data attribute property, prepend the namespace + // and then camel case the attribute string. Add the result + // to our nsNormalizeDict so we don't have to do this again. + nsNormalize: function( prop ) { + return nsNormalizeDict[ prop ] || + ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) ); + }, + + // Find the closest javascript page element to gather settings data jsperf test + // http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit + // possibly naive, but it shows that the parsing overhead for *just* the page selector vs + // the page and dialog selector is negligable. This could probably be speed up by + // doing a similar parent node traversal to the one found in the inherited theme code above + closestPageData: function( $target ) { + return $target + .closest( ":jqmData(role='page'), :jqmData(role='dialog')" ) + .data( "mobile-page" ); + } + + }); + + // Mobile version of data and removeData and hasData methods + // ensures all data is set and retrieved using jQuery Mobile's data namespace + $.fn.jqmData = function( prop, value ) { + var result; + if ( typeof prop !== "undefined" ) { + if ( prop ) { + prop = $.mobile.nsNormalize( prop ); + } + + // undefined is permitted as an explicit input for the second param + // in this case it returns the value and does not set it to undefined + if ( arguments.length < 2 || value === undefined ) { + result = this.data( prop ); + } else { + result = this.data( prop, value ); + } + } + return result; + }; + + $.jqmData = function( elem, prop, value ) { + var result; + if ( typeof prop !== "undefined" ) { + result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); + } + return result; + }; + + $.fn.jqmRemoveData = function( prop ) { + return this.removeData( $.mobile.nsNormalize( prop ) ); + }; + + $.jqmRemoveData = function( elem, prop ) { + return $.removeData( elem, $.mobile.nsNormalize( prop ) ); + }; + + $.find = function( selector, context, ret, extra ) { + if ( selector.indexOf( ":jqmData" ) > -1 ) { + selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" ); + } + + return oldFind.call( this, selector, context, ret, extra ); + }; + + $.extend( $.find, oldFind ); + +})( jQuery, this ); + (function( $, undefined ) { var rcapitals = /[A-Z]/g, @@ -1495,8 +1513,11 @@ $.mobile.widget = $.Widget; this.element.find( "h1" ).text( message ); } - // attach the loader to the DOM - this.element.appendTo( $.mobile.pageContainer ); + // If the pagecontainer widget has been defined we may use the :mobile-pagecontainer + // and attach to the element on which the pagecontainer widget has been defined. If not, + // we attach to the body. + this.element.appendTo( $.mobile.pagecontainer ? + $( ":mobile-pagecontainer" ) : $( "body" ) ); // check that the loader is visible this.checkLoaderPosition(); @@ -1512,8 +1533,8 @@ $.mobile.widget = $.Widget; this.element.removeClass( "ui-loader-fakefix" ); } - $.mobile.window.unbind( "scroll", this.fakeFixLoader ); - $.mobile.window.unbind( "scroll", this.checkLoaderPosition ); + this.window.unbind( "scroll", this.fakeFixLoader ); + this.window.unbind( "scroll", this.checkLoaderPosition ); } }); @@ -1911,6 +1932,7 @@ $.mobile.widget = $.Widget; })(jQuery,this); + (function( $, undefined ) { /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ @@ -5105,8 +5127,16 @@ $.widget( "mobile.page", { // know when the content is done loading, or if an error has occurred. var deferred = ( options && options.deferred ) || $.Deferred(), + // Examining the option "reloadPage" passed by the user is deprecated as of 1.4.0 + // and will be removed in 1.5.0. + // Copy option "reloadPage" to "reload", but only if option "reload" is not present + reloadOptionExtension = + ( ( options && options.reload === undefined && + options.reloadPage !== undefined ) ? + { reload: options.reloadPage } : {} ), + // The default load options with overrides specified by the caller. - settings = $.extend( {}, this._loadDefaults, options ), + settings = $.extend( {}, this._loadDefaults, options, reloadOptionExtension ), // The DOM element for the content after it has been loaded. content = null, @@ -5116,9 +5146,6 @@ $.widget( "mobile.page", { absUrl = $.mobile.path.makeUrlAbsolute( url, this._findBaseWithDefault() ), fileUrl, dataUrl, pblEvent, triggerData; - // DEPRECATED reloadPage - settings.reload = settings.reloadPage; - // If the caller provided data, and we're using "get" request, // append the data to the URL. if ( settings.data && settings.type === "get" ) { @@ -10062,7 +10089,9 @@ $.widget( "mobile.selectmenu", $.extend( { self.refresh(); if ( !!options.nativeMenu ) { - this.blur(); + self._delay( function() { + self.select.blur(); + }); } }); @@ -10522,12 +10551,10 @@ $.widget( "mobile.popup", { if ( targetElement !== ui.container[ 0 ] ) { target = $( targetElement ); - if ( 0 === target.parents().filter( ui.container[ 0 ] ).length ) { - $( this.document[ 0 ].activeElement ).one( "focus", function(/* theEvent */) { - if ( targetElement.nodeName.toLowerCase() !== "body" ) { - target.blur(); - } - }); + if ( !$.contains( ui.container[ 0 ], targetElement ) ) { + $( this.document[ 0 ].activeElement ).one( "focus", $.proxy( function() { + this._safelyBlur( targetElement ); + }, this ) ); ui.focusElement.focus(); theEvent.preventDefault(); theEvent.stopImmediatePropagation(); @@ -10858,13 +10885,28 @@ $.widget( "mobile.popup", { } }, + _safelyBlur: function( currentElement ){ + if ( currentElement !== this.window[ 0 ] && + currentElement.nodeName.toLowerCase() !== "body" ) { + $( currentElement ).blur(); + } + }, + _openPrerequisitesComplete: function() { - var id = this.element.attr( "id" ); + var id = this.element.attr( "id" ), + firstFocus = this._ui.container.find( ":focusable" ).first(); this._ui.container.addClass( "ui-popup-active" ); this._isOpen = true; this._resizeScreen(); - this._ui.container.attr( "tabindex", "0" ).focus(); + + // Check to see if currElement is not a child of the container. If it's not, blur + if ( !$.contains( this._ui.container[ 0 ], this.document[ 0 ].activeElement ) ) { + this._safelyBlur( this.document[ 0 ].activeElement ); + } + if ( firstFocus.length > 0 ) { + this._ui.focusElement = firstFocus; + } this._ignoreResizeEvents(); if ( id ) { this.document.find( "[aria-haspopup='true'][aria-owns='" + id + "']" ).attr( "aria-expanded", true ); @@ -10949,8 +10991,6 @@ $.widget( "mobile.popup", { var container = this._ui.container, id = this.element.attr( "id" ); - container.removeAttr( "tabindex" ); - // remove the global mutex for popups $.mobile.popup.active = undefined; @@ -11513,9 +11553,8 @@ $.widget( "mobile.selectmenu", $.mobile.selectmenu, { .find( "a" ).removeClass( $.mobile.activeBtnClass ).end() .attr( "aria-selected", false ) .each(function( i ) { - + var item = $( this ); if ( $.inArray( i, indices ) > -1 ) { - var item = $( this ); // Aria selected attr item.attr( "aria-selected", true ); @@ -11530,6 +11569,8 @@ $.widget( "mobile.selectmenu", $.mobile.selectmenu, { item.find( "a" ).addClass( $.mobile.activeBtnClass ); } } + } else if ( self.isMultiple ) { + item.find( "a" ).removeClass( "ui-checkbox-on" ).addClass( "ui-checkbox-off" ); } }); }, @@ -12043,16 +12084,22 @@ $.widget( "mobile.controlgroup", $.extend( { _create: function() { var elem = this.element, - opts = this.options; + opts = this.options, + keepNative = $.mobile.page.prototype.keepNativeSelector(); // Run buttonmarkup if ( $.fn.buttonMarkup ) { - this.element.find( $.fn.buttonMarkup.initSelector ).buttonMarkup(); + this.element + .find( $.fn.buttonMarkup.initSelector ) + .not( keepNative ) + .buttonMarkup(); } // Enhance child widgets $.each( this._childWidgets, $.proxy( function( number, widgetName ) { if ( $.mobile[ widgetName ] ) { - this.element.find( $.mobile[ widgetName ].initSelector ).not( $.mobile.page.prototype.keepNativeSelector() )[ widgetName ](); + this.element + .find( $.mobile[ widgetName ].initSelector ) + .not( keepNative )[ widgetName ](); } }, this )); @@ -13268,7 +13315,10 @@ $.widget( "mobile.panel", { }); if ( !this._parentPage && this.options.display !== "overlay" ) { this._on( this.document, { - "pageshow": "_getWrapper" + "pageshow": function() { + this._openedPage = null; + this._getWrapper(); + } }); } // Clean up open panels after page hide diff --git a/vendor/assets/javascripts/jquery.mobile.min.js b/vendor/assets/javascripts/jquery.mobile.min.js index db2a796..5b1a9a1 100755 --- a/vendor/assets/javascripts/jquery.mobile.min.js +++ b/vendor/assets/javascripts/jquery.mobile.min.js @@ -1,10 +1,10 @@ -/*! jQuery Mobile 1.4.4 | Git HEADhash: b4150fb <> 2014-09-12T16:43:26Z | (c) 2010, 2014 jQuery Foundation, Inc. | jquery.org/license */ +/*! jQuery Mobile 1.4.5 | Git HEADhash: 68e55e7 <> 2014-10-31T17:33:30Z | (c) 2010, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b,c){"function"==typeof define&&define.amd?define(["jquery"],function(d){return c(d,a,b),d.mobile}):c(a.jQuery,a,b)}(this,document,function(a,b,c){!function(a){a.mobile={}}(a),function(a){a.extend(a.mobile,{version:"1.4.4",subPageUrlKey:"ui-page",hideUrlBar:!0,keepNative:":jqmData(role='none'), :jqmData(role='nojs')",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",focusClass:"ui-focus",ajaxEnabled:!0,hashListeningEnabled:!0,linkBindingEnabled:!0,defaultPageTransition:"fade",maxTransitionWidth:!1,minScrollBack:0,defaultDialogTransition:"pop",pageLoadErrorMessage:"Error Loading Page",pageLoadErrorMessageTheme:"a",phonegapNavigationEnabled:!1,autoInitializePage:!0,pushStateEnabled:!0,ignoreContentEnabled:!1,buttonMarkup:{hoverDelay:200},dynamicBaseEnabled:!0,pageContainer:a(),allowCrossDomainPages:!1,dialogHashKey:"&ui-state=dialog"})}(a,this),function(a,b,c){var d={},e=a.find,f=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,g=/:jqmData\(([^)]*)\)/g;a.extend(a.mobile,{ns:"",getAttribute:function(b,c){var d;b=b.jquery?b[0]:b,b&&b.getAttribute&&(d=b.getAttribute("data-"+a.mobile.ns+c));try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:f.test(d)?JSON.parse(d):d}catch(e){}return d},nsNormalizeDict:d,nsNormalize:function(b){return d[b]||(d[b]=a.camelCase(a.mobile.ns+b))},closestPageData:function(a){return a.closest(":jqmData(role='page'), :jqmData(role='dialog')").data("mobile-page")}}),a.fn.jqmData=function(b,d){var e;return"undefined"!=typeof b&&(b&&(b=a.mobile.nsNormalize(b)),e=arguments.length<2||d===c?this.data(b):this.data(b,d)),e},a.jqmData=function(b,c,d){var e;return"undefined"!=typeof c&&(e=a.data(b,c?a.mobile.nsNormalize(c):c,d)),e},a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))},a.jqmRemoveData=function(b,c){return a.removeData(b,a.mobile.nsNormalize(c))},a.find=function(b,c,d,f){return b.indexOf(":jqmData")>-1&&(b=b.replace(g,"[data-"+(a.mobile.ns||"")+"$1]")),e.call(this,b,c,d,f)},a.extend(a.find,e)}(a,this),function(a,b){function d(b,c){var d,f,g,h=b.nodeName.toLowerCase();return"area"===h?(d=b.parentNode,f=d.name,b.href&&f&&"map"===d.nodeName.toLowerCase()?(g=a("img[usemap=#"+f+"]")[0],!!g&&e(g)):!1):(/input|select|textarea|button|object/.test(h)?!b.disabled:"a"===h?b.href||c:c)&&e(b)}function e(b){return a.expr.filters.visible(b)&&!a(b).parents().addBack().filter(function(){return"hidden"===a.css(this,"visibility")}).length}var f=0,g=/^ui-id-\d+$/;a.ui=a.ui||{},a.extend(a.ui,{version:"c0ab71056b936627e8a7821f03c044aec6280a40",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),a.fn.extend({focus:function(b){return function(c,d){return"number"==typeof c?this.each(function(){var b=this;setTimeout(function(){a(b).focus(),d&&d.call(b)},c)}):b.apply(this,arguments)}}(a.fn.focus),scrollParent:function(){var b;return b=a.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.css(this,"position"))&&/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(this[0].ownerDocument||c):b},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++f)})},removeUniqueId:function(){return this.each(function(){g.test(this.id)&&a(this).removeAttr("id")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return d(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var c=a.attr(b,"tabindex"),e=isNaN(c);return(e||c>=0)&&d(b,!e)}}),a("").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function e(b,c,d,e){return a.each(f,function(){c-=parseFloat(a.css(b,"padding"+this))||0,d&&(c-=parseFloat(a.css(b,"border"+this+"Width"))||0),e&&(c-=parseFloat(a.css(b,"margin"+this))||0)}),c}var f="Width"===d?["Left","Right"]:["Top","Bottom"],g=d.toLowerCase(),h={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?h["inner"+d].call(this):this.each(function(){a(this).css(g,e(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return"number"!=typeof b?h["outer"+d].call(this,b):this.each(function(){a(this).css(g,e(this,b,!0,c)+"px")})}}),a.fn.addBack||(a.fn.addBack=function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}),a("").data("a-b","a").removeData("a-b").data("a-b")&&(a.fn.removeData=function(b){return function(c){return arguments.length?b.call(this,a.camelCase(c)):b.call(this)}}(a.fn.removeData)),a.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),a.support.selectstart="onselectstart"in c.createElement("div"),a.fn.extend({disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(d){if(d!==b)return this.css("zIndex",d);if(this.length)for(var e,f,g=a(this[0]);g.length&&g[0]!==c;){if(e=g.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(f=parseInt(g.css("zIndex"),10),!isNaN(f)&&0!==f))return f;g=g.parent()}return 0}}),a.ui.plugin={add:function(b,c,d){var e,f=a.ui[b].prototype;for(e in d)f.plugins[e]=f.plugins[e]||[],f.plugins[e].push([c,d[e]])},call:function(a,b,c,d){var e,f=a.plugins[b];if(f&&(d||a.element[0].parentNode&&11!==a.element[0].parentNode.nodeType))for(e=0;e0&&(e=e.concat(f.toArray())),0===i.length&&h.length>0&&(e=e.concat(h.toArray())),a.each(e,function(b,d){c-=a(d).outerHeight()}),Math.max(0,c)};a.extend(a.mobile,{window:a(b),document:a(c),keyCode:a.ui.keyCode,behaviors:{},silentScroll:function(c){"number"!==a.type(c)&&(c=a.mobile.defaultHomeScroll),a.event.special.scrollstart.enabled=!1,setTimeout(function(){b.scrollTo(0,c),a.mobile.document.trigger("silentscroll",{x:0,y:c})},20),setTimeout(function(){a.event.special.scrollstart.enabled=!0},150)},getClosestBaseUrl:function(b){var c=a(b).closest(".ui-page").jqmData("url"),d=a.mobile.path.documentBase.hrefNoHash;return a.mobile.dynamicBaseEnabled&&c&&a.mobile.path.isPath(c)||(c=d),a.mobile.path.makeUrlAbsolute(c,d)},removeActiveLinkClass:function(b){!a.mobile.activeClickedLink||a.mobile.activeClickedLink.closest("."+a.mobile.activePageClass).length&&!b||a.mobile.activeClickedLink.removeClass(a.mobile.activeBtnClass),a.mobile.activeClickedLink=null},getInheritedTheme:function(a,b){for(var c,d,e=a[0],f="",g=/ui-(bar|body|overlay)-([a-z])\b/;e&&(c=e.className||"",!(c&&(d=g.exec(c))&&(f=d[2])));)e=e.parentNode;return f||b||"a"},enhanceable:function(a){return this.haveParents(a,"enhance")},hijackable:function(a){return this.haveParents(a,"ajax")},haveParents:function(b,c){if(!a.mobile.ignoreContentEnabled)return b;var d,e,f,g,h,i=b.length,j=a();for(g=0;i>g;g++){for(e=b.eq(g),f=!1,d=b[g];d;){if(h=d.getAttribute?d.getAttribute("data-"+a.mobile.ns+c):"","false"===h){f=!0;break}d=d.parentNode}f||(j=j.add(e))}return j},getScreenHeight:function(){return b.innerHeight||a.mobile.window.height()},resetActivePageHeight:function(b){var c=a("."+a.mobile.activePageClass),e=c.height(),f=c.outerHeight(!0);b=d(c,"number"==typeof b?b:a.mobile.getScreenHeight()),c.css("min-height",""),c.height()0&&(g=g.not(d)),g.length>0&&(c[f.prototype.widgetName]=g)}});for(b in c)c[b][b]();return this},addDependents:function(b){a.addDependents(this,b)},getEncodedText:function(){return a("").text(this.text()).html()},jqmEnhanceable:function(){return a.mobile.enhanceable(this)},jqmHijackable:function(){return a.mobile.hijackable(this)}}),a.removeWithDependents=function(b){var c=a(b);(c.jqmData("dependents")||a()).remove(),c.remove()},a.addDependents=function(b,c){var d=a(b),e=d.jqmData("dependents")||a();d.jqmData("dependents",a(e).add(c))},a.find.matches=function(b,c){return a.find(b,null,null,c)},a.find.matchesSelector=function(b,c){return a.find(c,null,null,[b]).length>0}}(a,this),function(a,b){var c=0,d=Array.prototype.slice,e=a.cleanData;a.cleanData=function(b){for(var c,d=0;null!=(c=b[d]);d++)try{a(c).triggerHandler("remove")}catch(f){}e(b)},a.widget=function(b,c,d){var e,f,g,h,i={},j=b.split(".")[0];return b=b.split(".")[1],e=j+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][e.toLowerCase()]=function(b){return!!a.data(b,e)},a[j]=a[j]||{},f=a[j][b],g=a[j][b]=function(a,b){return this._createWidget?void(arguments.length&&this._createWidget(a,b)):new g(a,b)},a.extend(g,f,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),h=new c,h.options=a.widget.extend({},h.options),a.each(d,function(b,d){return a.isFunction(d)?void(i[b]=function(){var a=function(){return c.prototype[b].apply(this,arguments)},e=function(a){return c.prototype[b].apply(this,a)};return function(){var b,c=this._super,f=this._superApply;return this._super=a,this._superApply=e,b=d.apply(this,arguments),this._super=c,this._superApply=f,b}}()):void(i[b]=d)}),g.prototype=a.widget.extend(h,{widgetEventPrefix:f?h.widgetEventPrefix||b:b},i,{constructor:g,namespace:j,widgetName:b,widgetFullName:e}),f?(a.each(f._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,g,c._proto)}),delete f._childConstructors):c._childConstructors.push(g),a.widget.bridge(b,g),g},a.widget.extend=function(c){for(var e,f,g=d.call(arguments,1),h=0,i=g.length;i>h;h++)for(e in g[h])f=g[h][e],g[h].hasOwnProperty(e)&&f!==b&&(c[e]=a.isPlainObject(f)?a.isPlainObject(c[e])?a.widget.extend({},c[e],f):a.widget.extend({},f):f);return c},a.widget.bridge=function(c,e){var f=e.prototype.widgetFullName||c;a.fn[c]=function(g){var h="string"==typeof g,i=d.call(arguments,1),j=this;return g=!h&&i.length?a.widget.extend.apply(null,[g].concat(i)):g,this.each(h?function(){var d,e=a.data(this,f);return"instance"===g?(j=e,!1):e?a.isFunction(e[g])&&"_"!==g.charAt(0)?(d=e[g].apply(e,i),d!==e&&d!==b?(j=d&&d.jquery?j.pushStack(d.get()):d,!1):void 0):a.error("no such method '"+g+"' for "+c+" widget instance"):a.error("cannot call methods on "+c+" prior to initialization; attempted to call method '"+g+"'")}:function(){var b=a.data(this,f);b?b.option(g||{})._init():a.data(this,f,new e(g,this))}),j}},a.Widget=function(){},a.Widget._childConstructors=[],a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(b,d){d=a(d||this.defaultElement||this)[0],this.element=a(d),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=a.widget.extend({},this.options,this._getCreateOptions(),b),this.bindings=a(),this.hoverable=a(),this.focusable=a(),d!==this&&(a.data(d,this.widgetFullName,this),this._on(!0,this.element,{remove:function(a){a.target===d&&this.destroy()}}),this.document=a(d.style?d.ownerDocument:d.document||d),this.window=a(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:a.noop,_getCreateEventData:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(a.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(c,d){var e,f,g,h=c;if(0===arguments.length)return a.widget.extend({},this.options);if("string"==typeof c)if(h={},e=c.split("."),c=e.shift(),e.length){for(f=h[c]=a.widget.extend({},this.options[c]),g=0;g

",fakeFixLoader:function(){var b=a("."+a.mobile.activeBtnClass).first();this.element.css({top:a.support.scrollTop&&this.window.scrollTop()+this.window.height()/2||b.length&&b.offset().top||100})},checkLoaderPosition:function(){var b=this.element.offset(),c=this.window.scrollTop(),d=a.mobile.getScreenHeight();(b.topd)&&(this.element.addClass("ui-loader-fakefix"),this.fakeFixLoader(),this.window.unbind("scroll",this.checkLoaderPosition).bind("scroll",a.proxy(this.fakeFixLoader,this)))},resetHtml:function(){this.element.html(a(this.defaultHtml).html())},show:function(d,e,f){var g,h,i;this.resetHtml(),"object"===a.type(d)?(i=a.extend({},this.options,d),d=i.theme):(i=this.options,d=d||i.theme),h=e||(i.text===!1?"":i.text),c.addClass("ui-loading"),g=i.textVisible,this.element.attr("class",b+" ui-corner-all ui-body-"+d+" ui-loader-"+(g||e||d.text?"verbose":"default")+(i.textonly||f?" ui-loader-textonly":"")),i.html?this.element.html(i.html):this.element.find("h1").text(h),this.element.appendTo(a.mobile.pageContainer),this.checkLoaderPosition(),this.window.bind("scroll",a.proxy(this.checkLoaderPosition,this))},hide:function(){c.removeClass("ui-loading"),this.options.text&&this.element.removeClass("ui-loader-fakefix"),a.mobile.window.unbind("scroll",this.fakeFixLoader),a.mobile.window.unbind("scroll",this.checkLoaderPosition)}})}(a,this),function(a,b,d){"$:nomunge";function e(a){return a=a||location.href,"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f,g="hashchange",h=c,i=a.event.special,j=h.documentMode,k="on"+g in b&&(j===d||j>7);a.fn[g]=function(a){return a?this.bind(g,a):this.trigger(g)},a.fn[g].delay=50,i[g]=a.extend(i[g],{setup:function(){return k?!1:void a(f.start)},teardown:function(){return k?!1:void a(f.stop)}}),f=function(){function c(){var d=e(),h=n(j);d!==j?(m(j=d,h),a(b).trigger(g)):h!==j&&(location.href=location.href.replace(/#.*/,"")+h),f=setTimeout(c,a.fn[g].delay)}var f,i={},j=e(),l=function(a){return a},m=l,n=l;return i.start=function(){f||c()},i.stop=function(){f&&clearTimeout(f),f=d},b.attachEvent&&!b.addEventListener&&!k&&function(){var b,d;i.start=function(){b||(d=a.fn[g].src,d=d&&d+e(),b=a('