jquery-ui-rails 3.0.1 → 4.0.0
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.
Potentially problematic release.
This version of jquery-ui-rails might be problematic. Click here for more details.
- data/History.md +10 -0
- data/README.md +1 -1
- data/Rakefile +4 -5
- data/lib/jquery/ui/rails/version.rb +1 -1
- data/vendor/assets/javascripts/jquery.ui.accordion.js +130 -290
- data/vendor/assets/javascripts/jquery.ui.autocomplete.js +30 -18
- data/vendor/assets/javascripts/jquery.ui.button.js +9 -8
- data/vendor/assets/javascripts/jquery.ui.core.js +19 -53
- data/vendor/assets/javascripts/jquery.ui.datepicker-be.js +23 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-fr-CA.js +23 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-ky.js +24 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-nb.js +22 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-nn.js +22 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker.js +1076 -878
- data/vendor/assets/javascripts/jquery.ui.dialog.js +456 -547
- data/vendor/assets/javascripts/jquery.ui.draggable.js +317 -207
- data/vendor/assets/javascripts/jquery.ui.droppable.js +177 -100
- data/vendor/assets/javascripts/jquery.ui.effect-blind.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-bounce.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-clip.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-drop.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-explode.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-fade.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-fold.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-highlight.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-pulsate.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-scale.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-shake.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-slide.js +2 -2
- data/vendor/assets/javascripts/jquery.ui.effect-transfer.js +3 -3
- data/vendor/assets/javascripts/jquery.ui.effect.js +91 -99
- data/vendor/assets/javascripts/jquery.ui.menu.js +20 -9
- data/vendor/assets/javascripts/jquery.ui.mouse.js +25 -25
- data/vendor/assets/javascripts/jquery.ui.position.js +39 -59
- data/vendor/assets/javascripts/jquery.ui.progressbar.js +73 -33
- data/vendor/assets/javascripts/jquery.ui.resizable.js +461 -294
- data/vendor/assets/javascripts/jquery.ui.selectable.js +67 -51
- data/vendor/assets/javascripts/jquery.ui.slider.js +100 -95
- data/vendor/assets/javascripts/jquery.ui.sortable.js +411 -257
- data/vendor/assets/javascripts/jquery.ui.spinner.js +19 -5
- data/vendor/assets/javascripts/jquery.ui.tabs.js +47 -567
- data/vendor/assets/javascripts/jquery.ui.tooltip.js +14 -10
- data/vendor/assets/javascripts/jquery.ui.widget.js +33 -40
- data/vendor/assets/stylesheets/jquery.ui.accordion.css.erb +30 -8
- data/vendor/assets/stylesheets/jquery.ui.all.css.erb +2 -2
- data/vendor/assets/stylesheets/jquery.ui.autocomplete.css.erb +2 -5
- data/vendor/assets/stylesheets/jquery.ui.base.css.erb +2 -2
- data/vendor/assets/stylesheets/jquery.ui.button.css.erb +100 -26
- data/vendor/assets/stylesheets/jquery.ui.core.css.erb +65 -12
- data/vendor/assets/stylesheets/jquery.ui.datepicker.css.erb +166 -55
- data/vendor/assets/stylesheets/jquery.ui.dialog.css.erb +61 -14
- data/vendor/assets/stylesheets/jquery.ui.menu.css.erb +61 -14
- data/vendor/assets/stylesheets/jquery.ui.progressbar.css.erb +20 -4
- data/vendor/assets/stylesheets/jquery.ui.resizable.css.erb +70 -13
- data/vendor/assets/stylesheets/jquery.ui.selectable.css.erb +7 -3
- data/vendor/assets/stylesheets/jquery.ui.slider.css.erb +63 -15
- data/vendor/assets/stylesheets/jquery.ui.spinner.css.erb +52 -10
- data/vendor/assets/stylesheets/jquery.ui.tabs.css.erb +44 -10
- data/vendor/assets/stylesheets/jquery.ui.theme.css.erb +196 -38
- data/vendor/assets/stylesheets/jquery.ui.tooltip.css.erb +4 -6
- metadata +8 -3
| @@ -4,10 +4,10 @@ | |
| 4 4 | 
             
            //= require jquery.ui.position
         | 
| 5 5 |  | 
| 6 6 | 
             
            /*!
         | 
| 7 | 
            -
             * jQuery UI Autocomplete 1. | 
| 7 | 
            +
             * jQuery UI Autocomplete 1.10.0
         | 
| 8 8 | 
             
             * http://jqueryui.com
         | 
| 9 9 | 
             
             *
         | 
| 10 | 
            -
             * Copyright  | 
| 10 | 
            +
             * Copyright 2013 jQuery Foundation and other contributors
         | 
| 11 11 | 
             
             * Released under the MIT license.
         | 
| 12 12 | 
             
             * http://jquery.org/license
         | 
| 13 13 | 
             
             *
         | 
| @@ -25,10 +25,10 @@ | |
| 25 25 | 
             
            var requestIndex = 0;
         | 
| 26 26 |  | 
| 27 27 | 
             
            $.widget( "ui.autocomplete", {
         | 
| 28 | 
            -
            	version: "1. | 
| 28 | 
            +
            	version: "1.10.0",
         | 
| 29 29 | 
             
            	defaultElement: "<input>",
         | 
| 30 30 | 
             
            	options: {
         | 
| 31 | 
            -
            		appendTo:  | 
| 31 | 
            +
            		appendTo: null,
         | 
| 32 32 | 
             
            		autoFocus: false,
         | 
| 33 33 | 
             
            		delay: 300,
         | 
| 34 34 | 
             
            		minLength: 1,
         | 
| @@ -71,6 +71,7 @@ $.widget( "ui.autocomplete", { | |
| 71 71 |  | 
| 72 72 | 
             
            		this._on( this.element, {
         | 
| 73 73 | 
             
            			keydown: function( event ) {
         | 
| 74 | 
            +
            				/*jshint maxcomplexity:15*/
         | 
| 74 75 | 
             
            				if ( this.element.prop( "readOnly" ) ) {
         | 
| 75 76 | 
             
            					suppressKeyPress = true;
         | 
| 76 77 | 
             
            					suppressInput = true;
         | 
| @@ -186,7 +187,7 @@ $.widget( "ui.autocomplete", { | |
| 186 187 | 
             
            		this._initSource();
         | 
| 187 188 | 
             
            		this.menu = $( "<ul>" )
         | 
| 188 189 | 
             
            			.addClass( "ui-autocomplete" )
         | 
| 189 | 
            -
            			.appendTo( this. | 
| 190 | 
            +
            			.appendTo( this._appendTo() )
         | 
| 190 191 | 
             
            			.menu({
         | 
| 191 192 | 
             
            				// custom key handling for now
         | 
| 192 193 | 
             
            				input: $(),
         | 
| @@ -195,7 +196,7 @@ $.widget( "ui.autocomplete", { | |
| 195 196 | 
             
            			})
         | 
| 196 197 | 
             
            			.zIndex( this.element.zIndex() + 1 )
         | 
| 197 198 | 
             
            			.hide()
         | 
| 198 | 
            -
            			.data( "menu" );
         | 
| 199 | 
            +
            			.data( "ui-menu" );
         | 
| 199 200 |  | 
| 200 201 | 
             
            		this._on( this.menu.element, {
         | 
| 201 202 | 
             
            			mousedown: function( event ) {
         | 
| @@ -242,9 +243,7 @@ $.widget( "ui.autocomplete", { | |
| 242 243 | 
             
            					}
         | 
| 243 244 | 
             
            				}
         | 
| 244 245 |  | 
| 245 | 
            -
            				 | 
| 246 | 
            -
            				// TODO remove the fallback, see #8156
         | 
| 247 | 
            -
            				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
         | 
| 246 | 
            +
            				var item = ui.item.data( "ui-autocomplete-item" );
         | 
| 248 247 | 
             
            				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
         | 
| 249 248 | 
             
            					// use value to match what will end up in the input, if it was a key event
         | 
| 250 249 | 
             
            					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
         | 
| @@ -260,9 +259,7 @@ $.widget( "ui.autocomplete", { | |
| 260 259 | 
             
            				}
         | 
| 261 260 | 
             
            			},
         | 
| 262 261 | 
             
            			menuselect: function( event, ui ) {
         | 
| 263 | 
            -
            				 | 
| 264 | 
            -
            				// TODO remove the fallback, see #8156
         | 
| 265 | 
            -
            				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
         | 
| 262 | 
            +
            				var item = ui.item.data( "ui-autocomplete-item" ),
         | 
| 266 263 | 
             
            					previous = this.previous;
         | 
| 267 264 |  | 
| 268 265 | 
             
            				// only trigger when focus was lost (click on menu)
         | 
| @@ -297,10 +294,6 @@ $.widget( "ui.autocomplete", { | |
| 297 294 | 
             
            			.addClass( "ui-helper-hidden-accessible" )
         | 
| 298 295 | 
             
            			.insertAfter( this.element );
         | 
| 299 296 |  | 
| 300 | 
            -
            		if ( $.fn.bgiframe ) {
         | 
| 301 | 
            -
            			this.menu.element.bgiframe();
         | 
| 302 | 
            -
            		}
         | 
| 303 | 
            -
             | 
| 304 297 | 
             
            		// turning off autocomplete prevents the browser from remembering the
         | 
| 305 298 | 
             
            		// value when navigating through history, so we re-enable autocomplete
         | 
| 306 299 | 
             
            		// if the page is unloaded before the widget is destroyed. #7790
         | 
| @@ -326,13 +319,33 @@ $.widget( "ui.autocomplete", { | |
| 326 319 | 
             
            			this._initSource();
         | 
| 327 320 | 
             
            		}
         | 
| 328 321 | 
             
            		if ( key === "appendTo" ) {
         | 
| 329 | 
            -
            			this.menu.element.appendTo( this. | 
| 322 | 
            +
            			this.menu.element.appendTo( this._appendTo() );
         | 
| 330 323 | 
             
            		}
         | 
| 331 324 | 
             
            		if ( key === "disabled" && value && this.xhr ) {
         | 
| 332 325 | 
             
            			this.xhr.abort();
         | 
| 333 326 | 
             
            		}
         | 
| 334 327 | 
             
            	},
         | 
| 335 328 |  | 
| 329 | 
            +
            	_appendTo: function() {
         | 
| 330 | 
            +
            		var element = this.options.appendTo;
         | 
| 331 | 
            +
             | 
| 332 | 
            +
            		if ( element ) {
         | 
| 333 | 
            +
            			element = element.jquery || element.nodeType ?
         | 
| 334 | 
            +
            				$( element ) :
         | 
| 335 | 
            +
            				this.document.find( element ).eq( 0 );
         | 
| 336 | 
            +
            		}
         | 
| 337 | 
            +
             | 
| 338 | 
            +
            		if ( !element ) {
         | 
| 339 | 
            +
            			element = this.element.closest( ".ui-front" );
         | 
| 340 | 
            +
            		}
         | 
| 341 | 
            +
             | 
| 342 | 
            +
            		if ( !element.length ) {
         | 
| 343 | 
            +
            			element = this.document[0].body;
         | 
| 344 | 
            +
            		}
         | 
| 345 | 
            +
             | 
| 346 | 
            +
            		return element;
         | 
| 347 | 
            +
            	},
         | 
| 348 | 
            +
             | 
| 336 349 | 
             
            	_isMultiLine: function() {
         | 
| 337 350 | 
             
            		// Textareas are always multi-line
         | 
| 338 351 | 
             
            		if ( this.element.is( "textarea" ) ) {
         | 
| @@ -603,5 +616,4 @@ $.widget( "ui.autocomplete", $.ui.autocomplete, { | |
| 603 616 | 
             
            	}
         | 
| 604 617 | 
             
            });
         | 
| 605 618 |  | 
| 606 | 
            -
             | 
| 607 619 | 
             
            }( jQuery ));
         | 
| @@ -2,10 +2,10 @@ | |
| 2 2 | 
             
            //= require jquery.ui.widget
         | 
| 3 3 |  | 
| 4 4 | 
             
            /*!
         | 
| 5 | 
            -
             * jQuery UI Button 1. | 
| 5 | 
            +
             * jQuery UI Button 1.10.0
         | 
| 6 6 | 
             
             * http://jqueryui.com
         | 
| 7 7 | 
             
             *
         | 
| 8 | 
            -
             * Copyright  | 
| 8 | 
            +
             * Copyright 2013 jQuery Foundation and other contributors
         | 
| 9 9 | 
             
             * Released under the MIT license.
         | 
| 10 10 | 
             
             * http://jquery.org/license
         | 
| 11 11 | 
             
             *
         | 
| @@ -32,6 +32,7 @@ var lastActive, startXPos, startYPos, clickDragged, | |
| 32 32 | 
             
            			form = radio.form,
         | 
| 33 33 | 
             
            			radios = $( [] );
         | 
| 34 34 | 
             
            		if ( name ) {
         | 
| 35 | 
            +
            			name = name.replace( /'/g, "\\'" );
         | 
| 35 36 | 
             
            			if ( form ) {
         | 
| 36 37 | 
             
            				radios = $( form ).find( "[name='" + name + "']" );
         | 
| 37 38 | 
             
            			} else {
         | 
| @@ -45,7 +46,7 @@ var lastActive, startXPos, startYPos, clickDragged, | |
| 45 46 | 
             
            	};
         | 
| 46 47 |  | 
| 47 48 | 
             
            $.widget( "ui.button", {
         | 
| 48 | 
            -
            	version: "1. | 
| 49 | 
            +
            	version: "1.10.0",
         | 
| 49 50 | 
             
            	defaultElement: "<button>",
         | 
| 50 51 | 
             
            	options: {
         | 
| 51 52 | 
             
            		disabled: null,
         | 
| @@ -149,8 +150,6 @@ $.widget( "ui.button", { | |
| 149 150 | 
             
            				if ( options.disabled || clickDragged ) {
         | 
| 150 151 | 
             
            					return false;
         | 
| 151 152 | 
             
            				}
         | 
| 152 | 
            -
            				$( this ).toggleClass( "ui-state-active" );
         | 
| 153 | 
            -
            				that.buttonElement.attr( "aria-pressed", that.element[0].checked );
         | 
| 154 153 | 
             
            			});
         | 
| 155 154 | 
             
            		} else if ( this.type === "radio" ) {
         | 
| 156 155 | 
             
            			this.buttonElement.bind( "click" + this.eventNamespace, function() {
         | 
| @@ -195,7 +194,9 @@ $.widget( "ui.button", { | |
| 195 194 | 
             
            						$( this ).addClass( "ui-state-active" );
         | 
| 196 195 | 
             
            					}
         | 
| 197 196 | 
             
            				})
         | 
| 198 | 
            -
            				 | 
| 197 | 
            +
            				// see #8559, we bind to blur here in case the button element loses
         | 
| 198 | 
            +
            				// focus between keydown and keyup, it would be left in an "active" state
         | 
| 199 | 
            +
            				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
         | 
| 199 200 | 
             
            					$( this ).removeClass( "ui-state-active" );
         | 
| 200 201 | 
             
            				});
         | 
| 201 202 |  | 
| @@ -362,9 +363,9 @@ $.widget( "ui.button", { | |
| 362 363 | 
             
            });
         | 
| 363 364 |  | 
| 364 365 | 
             
            $.widget( "ui.buttonset", {
         | 
| 365 | 
            -
            	version: "1. | 
| 366 | 
            +
            	version: "1.10.0",
         | 
| 366 367 | 
             
            	options: {
         | 
| 367 | 
            -
            		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
         | 
| 368 | 
            +
            		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
         | 
| 368 369 | 
             
            	},
         | 
| 369 370 |  | 
| 370 371 | 
             
            	_create: function() {
         | 
| @@ -1,10 +1,8 @@ | |
| 1 | 
            -
            //= require jquery
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            /*!
         | 
| 4 | 
            -
             * jQuery UI Core 1. | 
| 2 | 
            +
             * jQuery UI Core 1.10.0
         | 
| 5 3 | 
             
             * http://jqueryui.com
         | 
| 6 4 | 
             
             *
         | 
| 7 | 
            -
             * Copyright  | 
| 5 | 
            +
             * Copyright 2013 jQuery Foundation and other contributors
         | 
| 8 6 | 
             
             * Released under the MIT license.
         | 
| 9 7 | 
             
             * http://jquery.org/license
         | 
| 10 8 | 
             
             *
         | 
| @@ -24,7 +22,7 @@ if ( $.ui.version ) { | |
| 24 22 | 
             
            }
         | 
| 25 23 |  | 
| 26 24 | 
             
            $.extend( $.ui, {
         | 
| 27 | 
            -
            	version: "1. | 
| 25 | 
            +
            	version: "1.10.0",
         | 
| 28 26 |  | 
| 29 27 | 
             
            	keyCode: {
         | 
| 30 28 | 
             
            		BACKSPACE: 8,
         | 
| @@ -71,17 +69,17 @@ $.fn.extend({ | |
| 71 69 |  | 
| 72 70 | 
             
            	scrollParent: function() {
         | 
| 73 71 | 
             
            		var scrollParent;
         | 
| 74 | 
            -
            		if (($.ui.ie && (/(static|relative)/).test(this.css( | 
| 72 | 
            +
            		if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
         | 
| 75 73 | 
             
            			scrollParent = this.parents().filter(function() {
         | 
| 76 | 
            -
            				return (/(relative|absolute|fixed)/).test($.css(this, | 
| 74 | 
            +
            				return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
         | 
| 77 75 | 
             
            			}).eq(0);
         | 
| 78 76 | 
             
            		} else {
         | 
| 79 77 | 
             
            			scrollParent = this.parents().filter(function() {
         | 
| 80 | 
            -
            				return (/(auto|scroll)/).test($.css(this, | 
| 78 | 
            +
            				return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
         | 
| 81 79 | 
             
            			}).eq(0);
         | 
| 82 80 | 
             
            		}
         | 
| 83 81 |  | 
| 84 | 
            -
            		return (/fixed/).test(this.css( | 
| 82 | 
            +
            		return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
         | 
| 85 83 | 
             
            	},
         | 
| 86 84 |  | 
| 87 85 | 
             
            	zIndex: function( zIndex ) {
         | 
| @@ -154,7 +152,7 @@ function focusable( element, isTabIndexNotNaN ) { | |
| 154 152 |  | 
| 155 153 | 
             
            function visible( element ) {
         | 
| 156 154 | 
             
            	return $.expr.filters.visible( element ) &&
         | 
| 157 | 
            -
            		!$( element ).parents(). | 
| 155 | 
            +
            		!$( element ).parents().addBack().filter(function() {
         | 
| 158 156 | 
             
            			return $.css( this, "visibility" ) === "hidden";
         | 
| 159 157 | 
             
            		}).length;
         | 
| 160 158 | 
             
            }
         | 
| @@ -182,31 +180,6 @@ $.extend( $.expr[ ":" ], { | |
| 182 180 | 
             
            	}
         | 
| 183 181 | 
             
            });
         | 
| 184 182 |  | 
| 185 | 
            -
            // support
         | 
| 186 | 
            -
            $(function() {
         | 
| 187 | 
            -
            	var body = document.body,
         | 
| 188 | 
            -
            		div = body.appendChild( div = document.createElement( "div" ) );
         | 
| 189 | 
            -
             | 
| 190 | 
            -
            	// access offsetHeight before setting the style to prevent a layout bug
         | 
| 191 | 
            -
            	// in IE 9 which causes the element to continue to take up space even
         | 
| 192 | 
            -
            	// after it is removed from the DOM (#8026)
         | 
| 193 | 
            -
            	div.offsetHeight;
         | 
| 194 | 
            -
             | 
| 195 | 
            -
            	$.extend( div.style, {
         | 
| 196 | 
            -
            		minHeight: "100px",
         | 
| 197 | 
            -
            		height: "auto",
         | 
| 198 | 
            -
            		padding: 0,
         | 
| 199 | 
            -
            		borderWidth: 0
         | 
| 200 | 
            -
            	});
         | 
| 201 | 
            -
             | 
| 202 | 
            -
            	$.support.minHeight = div.offsetHeight === 100;
         | 
| 203 | 
            -
            	$.support.selectstart = "onselectstart" in div;
         | 
| 204 | 
            -
             | 
| 205 | 
            -
            	// set display to none to avoid a layout bug in IE
         | 
| 206 | 
            -
            	// http://dev.jquery.com/ticket/4014
         | 
| 207 | 
            -
            	body.removeChild( div ).style.display = "none";
         | 
| 208 | 
            -
            });
         | 
| 209 | 
            -
             | 
| 210 183 | 
             
            // support: jQuery <1.8
         | 
| 211 184 | 
             
            if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
         | 
| 212 185 | 
             
            	$.each( [ "Width", "Height" ], function( i, name ) {
         | 
| @@ -254,6 +227,15 @@ if ( !$( "<a>" ).outerWidth( 1 ).jquery ) { | |
| 254 227 | 
             
            	});
         | 
| 255 228 | 
             
            }
         | 
| 256 229 |  | 
| 230 | 
            +
            // support: jQuery <1.8
         | 
| 231 | 
            +
            if ( !$.fn.addBack ) {
         | 
| 232 | 
            +
            	$.fn.addBack = function( selector ) {
         | 
| 233 | 
            +
            		return this.add( selector == null ?
         | 
| 234 | 
            +
            			this.prevObject : this.prevObject.filter( selector )
         | 
| 235 | 
            +
            		);
         | 
| 236 | 
            +
            	};
         | 
| 237 | 
            +
            }
         | 
| 238 | 
            +
             | 
| 257 239 | 
             
            // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
         | 
| 258 240 | 
             
            if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
         | 
| 259 241 | 
             
            	$.fn.removeData = (function( removeData ) {
         | 
| @@ -272,13 +254,9 @@ if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { | |
| 272 254 |  | 
| 273 255 |  | 
| 274 256 | 
             
            // deprecated
         | 
| 257 | 
            +
            $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
         | 
| 275 258 |  | 
| 276 | 
            -
            ( | 
| 277 | 
            -
            	var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
         | 
| 278 | 
            -
            	$.ui.ie = uaMatch.length ? true : false;
         | 
| 279 | 
            -
            	$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
         | 
| 280 | 
            -
            })();
         | 
| 281 | 
            -
             | 
| 259 | 
            +
            $.support.selectstart = "onselectstart" in document.createElement( "div" );
         | 
| 282 260 | 
             
            $.fn.extend({
         | 
| 283 261 | 
             
            	disableSelection: function() {
         | 
| 284 262 | 
             
            		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
         | 
| @@ -318,8 +296,6 @@ $.extend( $.ui, { | |
| 318 296 | 
             
            		}
         | 
| 319 297 | 
             
            	},
         | 
| 320 298 |  | 
| 321 | 
            -
            	contains: $.contains,
         | 
| 322 | 
            -
             | 
| 323 299 | 
             
            	// only used by resizable
         | 
| 324 300 | 
             
            	hasScroll: function( el, a ) {
         | 
| 325 301 |  | 
| @@ -342,16 +318,6 @@ $.extend( $.ui, { | |
| 342 318 | 
             
            		has = ( el[ scroll ] > 0 );
         | 
| 343 319 | 
             
            		el[ scroll ] = 0;
         | 
| 344 320 | 
             
            		return has;
         | 
| 345 | 
            -
            	},
         | 
| 346 | 
            -
             | 
| 347 | 
            -
            	// these are odd functions, fix the API or move into individual plugins
         | 
| 348 | 
            -
            	isOverAxis: function( x, reference, size ) {
         | 
| 349 | 
            -
            		//Determines when x coordinate is over "b" element axis
         | 
| 350 | 
            -
            		return ( x > reference ) && ( x < ( reference + size ) );
         | 
| 351 | 
            -
            	},
         | 
| 352 | 
            -
            	isOver: function( y, x, top, left, height, width ) {
         | 
| 353 | 
            -
            		//Determines when x, y coordinates is over "b" element
         | 
| 354 | 
            -
            		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
         | 
| 355 321 | 
             
            	}
         | 
| 356 322 | 
             
            });
         | 
| 357 323 |  | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            /* Belarusian initialisation for the jQuery UI date picker plugin. */
         | 
| 2 | 
            +
            /* Written by Pavel Selitskas <p.selitskas@gmail.com> */
         | 
| 3 | 
            +
            jQuery(function($){
         | 
| 4 | 
            +
            	$.datepicker.regional['be'] = {
         | 
| 5 | 
            +
            		closeText: 'Зачыніць',
         | 
| 6 | 
            +
            		prevText: '←Папяр.',
         | 
| 7 | 
            +
            		nextText: 'Наст.→',
         | 
| 8 | 
            +
            		currentText: 'Сёньня',
         | 
| 9 | 
            +
            		monthNames: ['Студзень','Люты','Сакавік','Красавік','Травень','Чэрвень',
         | 
| 10 | 
            +
            		'Ліпень','Жнівень','Верасень','Кастрычнік','Лістапад','Сьнежань'],
         | 
| 11 | 
            +
            		monthNamesShort: ['Сту','Лют','Сак','Кра','Тра','Чэр',
         | 
| 12 | 
            +
            		'Ліп','Жні','Вер','Кас','Ліс','Сьн'],
         | 
| 13 | 
            +
            		dayNames: ['нядзеля','панядзелак','аўторак','серада','чацьвер','пятніца','субота'],
         | 
| 14 | 
            +
            		dayNamesShort: ['ндз','пнд','аўт','срд','чцв','птн','сбт'],
         | 
| 15 | 
            +
            		dayNamesMin: ['Нд','Пн','Аў','Ср','Чц','Пт','Сб'],
         | 
| 16 | 
            +
            		weekHeader: 'Тд',
         | 
| 17 | 
            +
            		dateFormat: 'dd.mm.yy',
         | 
| 18 | 
            +
            		firstDay: 1,
         | 
| 19 | 
            +
            		isRTL: false,
         | 
| 20 | 
            +
            		showMonthAfterYear: false,
         | 
| 21 | 
            +
            		yearSuffix: ''};
         | 
| 22 | 
            +
            	$.datepicker.setDefaults($.datepicker.regional['be']);
         | 
| 23 | 
            +
            });
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            /* Canadian-French initialisation for the jQuery UI date picker plugin. */
         | 
| 2 | 
            +
            jQuery(function ($) {
         | 
| 3 | 
            +
            	$.datepicker.regional['fr-CA'] = {
         | 
| 4 | 
            +
            		closeText: 'Fermer',
         | 
| 5 | 
            +
            		prevText: 'Précédent',
         | 
| 6 | 
            +
            		nextText: 'Suivant',
         | 
| 7 | 
            +
            		currentText: 'Aujourd\'hui',
         | 
| 8 | 
            +
            		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
         | 
| 9 | 
            +
            			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
         | 
| 10 | 
            +
            		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
         | 
| 11 | 
            +
            			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
         | 
| 12 | 
            +
            		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
         | 
| 13 | 
            +
            		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
         | 
| 14 | 
            +
            		dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
         | 
| 15 | 
            +
            		weekHeader: 'Sem.',
         | 
| 16 | 
            +
            		dateFormat: 'yy-mm-dd',
         | 
| 17 | 
            +
            		firstDay: 0,
         | 
| 18 | 
            +
            		isRTL: false,
         | 
| 19 | 
            +
            		showMonthAfterYear: false,
         | 
| 20 | 
            +
            		yearSuffix: ''
         | 
| 21 | 
            +
            	};
         | 
| 22 | 
            +
            	$.datepicker.setDefaults($.datepicker.regional['fr-CA']);
         | 
| 23 | 
            +
            });
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            /* Kyrgyz (UTF-8) initialisation for the jQuery UI date picker plugin. */
         | 
| 2 | 
            +
            /* Written by Sergey Kartashov (ebishkek@yandex.ru). */
         | 
| 3 | 
            +
            jQuery(function($){
         | 
| 4 | 
            +
            	$.datepicker.regional['ky'] = {
         | 
| 5 | 
            +
            		closeText: 'Жабуу',
         | 
| 6 | 
            +
            		prevText: '<Мур',
         | 
| 7 | 
            +
            		nextText: 'Кий>',
         | 
| 8 | 
            +
            		currentText: 'Бүгүн',
         | 
| 9 | 
            +
            		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
         | 
| 10 | 
            +
            		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
         | 
| 11 | 
            +
            		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
         | 
| 12 | 
            +
            		'Июл','Авг','Сен','Окт','Ноя','Дек'],
         | 
| 13 | 
            +
            		dayNames: ['жекшемби', 'дүйшөмбү', 'шейшемби', 'шаршемби', 'бейшемби', 'жума', 'ишемби'],
         | 
| 14 | 
            +
            		dayNamesShort: ['жек', 'дүй', 'шей', 'шар', 'бей', 'жум', 'ише'],
         | 
| 15 | 
            +
            		dayNamesMin: ['Жк','Дш','Шш','Шр','Бш','Жм','Иш'],
         | 
| 16 | 
            +
            		weekHeader: 'Жум',
         | 
| 17 | 
            +
            		dateFormat: 'dd.mm.yy',
         | 
| 18 | 
            +
            		firstDay: 1,
         | 
| 19 | 
            +
            		isRTL: false,
         | 
| 20 | 
            +
            		showMonthAfterYear: false,
         | 
| 21 | 
            +
            		yearSuffix: ''
         | 
| 22 | 
            +
            	};
         | 
| 23 | 
            +
            	$.datepicker.setDefaults($.datepicker.regional['ky']);
         | 
| 24 | 
            +
            });
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            /* Norwegian Bokmål initialisation for the jQuery UI date picker plugin. */
         | 
| 2 | 
            +
            /* Written by Bjørn Johansen (post@bjornjohansen.no). */
         | 
| 3 | 
            +
            jQuery(function($){
         | 
| 4 | 
            +
            	$.datepicker.regional['nb'] = {
         | 
| 5 | 
            +
            		closeText: 'Lukk',
         | 
| 6 | 
            +
            		prevText: '«Forrige',
         | 
| 7 | 
            +
            		nextText: 'Neste»',
         | 
| 8 | 
            +
            		currentText: 'I dag',
         | 
| 9 | 
            +
            		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
         | 
| 10 | 
            +
            		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
         | 
| 11 | 
            +
            		dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
         | 
| 12 | 
            +
            		dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
         | 
| 13 | 
            +
            		dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
         | 
| 14 | 
            +
            		weekHeader: 'Uke',
         | 
| 15 | 
            +
            		dateFormat: 'dd.mm.yy',
         | 
| 16 | 
            +
            		firstDay: 1,
         | 
| 17 | 
            +
            		isRTL: false,
         | 
| 18 | 
            +
            		showMonthAfterYear: false,
         | 
| 19 | 
            +
            		yearSuffix: ''
         | 
| 20 | 
            +
            	};
         | 
| 21 | 
            +
            	$.datepicker.setDefaults($.datepicker.regional['nb']);
         | 
| 22 | 
            +
            });
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            /* Norwegian Nynorsk initialisation for the jQuery UI date picker plugin. */
         | 
| 2 | 
            +
            /* Written by Bjørn Johansen (post@bjornjohansen.no). */
         | 
| 3 | 
            +
            jQuery(function($){
         | 
| 4 | 
            +
            	$.datepicker.regional['nn'] = {
         | 
| 5 | 
            +
            		closeText: 'Lukk',
         | 
| 6 | 
            +
            		prevText: '«Førre',
         | 
| 7 | 
            +
            		nextText: 'Neste»',
         | 
| 8 | 
            +
            		currentText: 'I dag',
         | 
| 9 | 
            +
            		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
         | 
| 10 | 
            +
            		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
         | 
| 11 | 
            +
            		dayNamesShort: ['sun','mån','tys','ons','tor','fre','lau'],
         | 
| 12 | 
            +
            		dayNames: ['sundag','måndag','tysdag','onsdag','torsdag','fredag','laurdag'],
         | 
| 13 | 
            +
            		dayNamesMin: ['su','må','ty','on','to','fr','la'],
         | 
| 14 | 
            +
            		weekHeader: 'Veke',
         | 
| 15 | 
            +
            		dateFormat: 'dd.mm.yy',
         | 
| 16 | 
            +
            		firstDay: 1,
         | 
| 17 | 
            +
            		isRTL: false,
         | 
| 18 | 
            +
            		showMonthAfterYear: false,
         | 
| 19 | 
            +
            		yearSuffix: ''
         | 
| 20 | 
            +
            	};
         | 
| 21 | 
            +
            	$.datepicker.setDefaults($.datepicker.regional['nn']);
         | 
| 22 | 
            +
            });
         | 
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            //= require jquery.ui.core
         | 
| 2 2 |  | 
| 3 3 | 
             
            /*!
         | 
| 4 | 
            -
             * jQuery UI Datepicker 1. | 
| 4 | 
            +
             * jQuery UI Datepicker 1.10.0
         | 
| 5 5 | 
             
             * http://jqueryui.com
         | 
| 6 6 | 
             
             *
         | 
| 7 | 
            -
             * Copyright  | 
| 7 | 
            +
             * Copyright 2013 jQuery Foundation and other contributors
         | 
| 8 8 | 
             
             * Released under the MIT license.
         | 
| 9 9 | 
             
             * http://jquery.org/license
         | 
| 10 10 | 
             
             *
         | 
| @@ -15,11 +15,11 @@ | |
| 15 15 | 
             
             */
         | 
| 16 16 | 
             
            (function( $, undefined ) {
         | 
| 17 17 |  | 
| 18 | 
            -
            $.extend($.ui, { datepicker: { version: "1. | 
| 18 | 
            +
            $.extend($.ui, { datepicker: { version: "1.10.0" } });
         | 
| 19 19 |  | 
| 20 | 
            -
            var PROP_NAME =  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 20 | 
            +
            var PROP_NAME = "datepicker",
         | 
| 21 | 
            +
            	dpuuid = new Date().getTime(),
         | 
| 22 | 
            +
            	instActive;
         | 
| 23 23 |  | 
| 24 24 | 
             
            /* Date picker manager.
         | 
| 25 25 | 
             
               Use the singleton instance of this class, $.datepicker, to interact with the date picker.
         | 
| @@ -27,50 +27,49 @@ var instActive; | |
| 27 27 | 
             
               allowing multiple different settings on the same page. */
         | 
| 28 28 |  | 
| 29 29 | 
             
            function Datepicker() {
         | 
| 30 | 
            -
            	this.debug = false; // Change this to true to start debugging
         | 
| 31 30 | 
             
            	this._curInst = null; // The current instance in use
         | 
| 32 31 | 
             
            	this._keyEvent = false; // If the last event was a key event
         | 
| 33 32 | 
             
            	this._disabledInputs = []; // List of date picker inputs that have been disabled
         | 
| 34 33 | 
             
            	this._datepickerShowing = false; // True if the popup picker is showing , false if not
         | 
| 35 34 | 
             
            	this._inDialog = false; // True if showing within a "dialog", false if not
         | 
| 36 | 
            -
            	this._mainDivId =  | 
| 37 | 
            -
            	this._inlineClass =  | 
| 38 | 
            -
            	this._appendClass =  | 
| 39 | 
            -
            	this._triggerClass =  | 
| 40 | 
            -
            	this._dialogClass =  | 
| 41 | 
            -
            	this._disableClass =  | 
| 42 | 
            -
            	this._unselectableClass =  | 
| 43 | 
            -
            	this._currentClass =  | 
| 44 | 
            -
            	this._dayOverClass =  | 
| 35 | 
            +
            	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
         | 
| 36 | 
            +
            	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
         | 
| 37 | 
            +
            	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
         | 
| 38 | 
            +
            	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
         | 
| 39 | 
            +
            	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
         | 
| 40 | 
            +
            	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
         | 
| 41 | 
            +
            	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
         | 
| 42 | 
            +
            	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
         | 
| 43 | 
            +
            	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
         | 
| 45 44 | 
             
            	this.regional = []; // Available regional settings, indexed by language code
         | 
| 46 | 
            -
            	this.regional[ | 
| 47 | 
            -
            		closeText:  | 
| 48 | 
            -
            		prevText:  | 
| 49 | 
            -
            		nextText:  | 
| 50 | 
            -
            		currentText:  | 
| 51 | 
            -
            		monthNames: [ | 
| 52 | 
            -
            			 | 
| 53 | 
            -
            		monthNamesShort: [ | 
| 54 | 
            -
            		dayNames: [ | 
| 55 | 
            -
            		dayNamesShort: [ | 
| 56 | 
            -
            		dayNamesMin: [ | 
| 57 | 
            -
            		weekHeader:  | 
| 58 | 
            -
            		dateFormat:  | 
| 45 | 
            +
            	this.regional[""] = { // Default regional settings
         | 
| 46 | 
            +
            		closeText: "Done", // Display text for close link
         | 
| 47 | 
            +
            		prevText: "Prev", // Display text for previous month link
         | 
| 48 | 
            +
            		nextText: "Next", // Display text for next month link
         | 
| 49 | 
            +
            		currentText: "Today", // Display text for current month link
         | 
| 50 | 
            +
            		monthNames: ["January","February","March","April","May","June",
         | 
| 51 | 
            +
            			"July","August","September","October","November","December"], // Names of months for drop-down and formatting
         | 
| 52 | 
            +
            		monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
         | 
| 53 | 
            +
            		dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
         | 
| 54 | 
            +
            		dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
         | 
| 55 | 
            +
            		dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
         | 
| 56 | 
            +
            		weekHeader: "Wk", // Column header for week of the year
         | 
| 57 | 
            +
            		dateFormat: "mm/dd/yy", // See format options on parseDate
         | 
| 59 58 | 
             
            		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
         | 
| 60 59 | 
             
            		isRTL: false, // True if right-to-left language, false if left-to-right
         | 
| 61 60 | 
             
            		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
         | 
| 62 | 
            -
            		yearSuffix:  | 
| 61 | 
            +
            		yearSuffix: "" // Additional text to append to the year in the month headers
         | 
| 63 62 | 
             
            	};
         | 
| 64 63 | 
             
            	this._defaults = { // Global defaults for all the date picker instances
         | 
| 65 | 
            -
            		showOn:  | 
| 66 | 
            -
            			//  | 
| 67 | 
            -
            		showAnim:  | 
| 64 | 
            +
            		showOn: "focus", // "focus" for popup on focus,
         | 
| 65 | 
            +
            			// "button" for trigger button, or "both" for either
         | 
| 66 | 
            +
            		showAnim: "fadeIn", // Name of jQuery animation for popup
         | 
| 68 67 | 
             
            		showOptions: {}, // Options for enhanced animations
         | 
| 69 68 | 
             
            		defaultDate: null, // Used when field is blank: actual date,
         | 
| 70 69 | 
             
            			// +/-number for offset from today, null for today
         | 
| 71 | 
            -
            		appendText:  | 
| 72 | 
            -
            		buttonText:  | 
| 73 | 
            -
            		buttonImage:  | 
| 70 | 
            +
            		appendText: "", // Display text following the input box, e.g. showing the format
         | 
| 71 | 
            +
            		buttonText: "...", // Text for trigger button
         | 
| 72 | 
            +
            		buttonImage: "", // URL for trigger button image
         | 
| 74 73 | 
             
            		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
         | 
| 75 74 | 
             
            		hideIfNoPrevNext: false, // True to hide next/previous month links
         | 
| 76 75 | 
             
            			// if not applicable, false to just disable them
         | 
| @@ -78,7 +77,7 @@ function Datepicker() { | |
| 78 77 | 
             
            		gotoCurrent: false, // True if today link goes back to current selection instead
         | 
| 79 78 | 
             
            		changeMonth: false, // True if month can be selected directly, false if only prev/next
         | 
| 80 79 | 
             
            		changeYear: false, // True if year can be selected directly, false if only prev/next
         | 
| 81 | 
            -
            		yearRange:  | 
| 80 | 
            +
            		yearRange: "c-10:c+10", // Range of years to display in drop-down,
         | 
| 82 81 | 
             
            			// either relative to today's year (-nn:+nn), relative to currently displayed year
         | 
| 83 82 | 
             
            			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
         | 
| 84 83 | 
             
            		showOtherMonths: false, // True to show dates in other months, false to leave blank
         | 
| @@ -86,14 +85,14 @@ function Datepicker() { | |
| 86 85 | 
             
            		showWeek: false, // True to show week of the year, false to not show it
         | 
| 87 86 | 
             
            		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
         | 
| 88 87 | 
             
            			// takes a Date and returns the number of the week for it
         | 
| 89 | 
            -
            		shortYearCutoff:  | 
| 88 | 
            +
            		shortYearCutoff: "+10", // Short year values < this are in the current century,
         | 
| 90 89 | 
             
            			// > this are in the previous century,
         | 
| 91 | 
            -
            			// string value starting with  | 
| 90 | 
            +
            			// string value starting with "+" for current year + value
         | 
| 92 91 | 
             
            		minDate: null, // The earliest selectable date, or null for no limit
         | 
| 93 92 | 
             
            		maxDate: null, // The latest selectable date, or null for no limit
         | 
| 94 | 
            -
            		duration:  | 
| 93 | 
            +
            		duration: "fast", // Duration of display/closure
         | 
| 95 94 | 
             
            		beforeShowDay: null, // Function that takes a date and returns an array with
         | 
| 96 | 
            -
            			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or  | 
| 95 | 
            +
            			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
         | 
| 97 96 | 
             
            			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
         | 
| 98 97 | 
             
            		beforeShow: null, // Function that takes an input field and
         | 
| 99 98 | 
             
            			// returns a set of custom settings for the date picker
         | 
| @@ -104,69 +103,53 @@ function Datepicker() { | |
| 104 103 | 
             
            		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
         | 
| 105 104 | 
             
            		stepMonths: 1, // Number of months to step back/forward
         | 
| 106 105 | 
             
            		stepBigMonths: 12, // Number of months to step back/forward for the big links
         | 
| 107 | 
            -
            		altField:  | 
| 108 | 
            -
            		altFormat:  | 
| 106 | 
            +
            		altField: "", // Selector for an alternate field to store selected dates into
         | 
| 107 | 
            +
            		altFormat: "", // The date format to use for the alternate field
         | 
| 109 108 | 
             
            		constrainInput: true, // The input is constrained by the current date format
         | 
| 110 109 | 
             
            		showButtonPanel: false, // True to show button panel, false to not show it
         | 
| 111 110 | 
             
            		autoSize: false, // True to size the input for the date format, false to leave as is
         | 
| 112 111 | 
             
            		disabled: false // The initial disabled state
         | 
| 113 112 | 
             
            	};
         | 
| 114 | 
            -
            	$.extend(this._defaults, this.regional[ | 
| 115 | 
            -
            	this.dpDiv = bindHover($( | 
| 113 | 
            +
            	$.extend(this._defaults, this.regional[""]);
         | 
| 114 | 
            +
            	this.dpDiv = bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
         | 
| 116 115 | 
             
            }
         | 
| 117 116 |  | 
| 118 117 | 
             
            $.extend(Datepicker.prototype, {
         | 
| 119 118 | 
             
            	/* Class name added to elements to indicate already configured with a date picker. */
         | 
| 120 | 
            -
            	markerClassName:  | 
| 119 | 
            +
            	markerClassName: "hasDatepicker",
         | 
| 121 120 |  | 
| 122 121 | 
             
            	//Keep track of the maximum number of rows displayed (see #7043)
         | 
| 123 122 | 
             
            	maxRows: 4,
         | 
| 124 123 |  | 
| 125 | 
            -
            	/* Debug logging (if enabled). */
         | 
| 126 | 
            -
            	log: function () {
         | 
| 127 | 
            -
            		if (this.debug)
         | 
| 128 | 
            -
            			console.log.apply('', arguments);
         | 
| 129 | 
            -
            	},
         | 
| 130 | 
            -
             | 
| 131 124 | 
             
            	// TODO rename to "widget" when switching to widget factory
         | 
| 132 125 | 
             
            	_widgetDatepicker: function() {
         | 
| 133 126 | 
             
            		return this.dpDiv;
         | 
| 134 127 | 
             
            	},
         | 
| 135 128 |  | 
| 136 129 | 
             
            	/* Override the default settings for all instances of the date picker.
         | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 130 | 
            +
            	 * @param  settings  object - the new settings to use as defaults (anonymous object)
         | 
| 131 | 
            +
            	 * @return the manager object
         | 
| 132 | 
            +
            	 */
         | 
| 139 133 | 
             
            	setDefaults: function(settings) {
         | 
| 140 134 | 
             
            		extendRemove(this._defaults, settings || {});
         | 
| 141 135 | 
             
            		return this;
         | 
| 142 136 | 
             
            	},
         | 
| 143 137 |  | 
| 144 138 | 
             
            	/* Attach the date picker to a jQuery selection.
         | 
| 145 | 
            -
             | 
| 146 | 
            -
             | 
| 139 | 
            +
            	 * @param  target	element - the target input field or division or span
         | 
| 140 | 
            +
            	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
         | 
| 141 | 
            +
            	 */
         | 
| 147 142 | 
             
            	_attachDatepicker: function(target, settings) {
         | 
| 148 | 
            -
            		 | 
| 149 | 
            -
            		 | 
| 150 | 
            -
            		 | 
| 151 | 
            -
            			var attrValue = target.getAttribute('date:' + attrName);
         | 
| 152 | 
            -
            			if (attrValue) {
         | 
| 153 | 
            -
            				inlineSettings = inlineSettings || {};
         | 
| 154 | 
            -
            				try {
         | 
| 155 | 
            -
            					inlineSettings[attrName] = eval(attrValue);
         | 
| 156 | 
            -
            				} catch (err) {
         | 
| 157 | 
            -
            					inlineSettings[attrName] = attrValue;
         | 
| 158 | 
            -
            				}
         | 
| 159 | 
            -
            			}
         | 
| 160 | 
            -
            		}
         | 
| 161 | 
            -
            		var nodeName = target.nodeName.toLowerCase();
         | 
| 162 | 
            -
            		var inline = (nodeName == 'div' || nodeName == 'span');
         | 
| 143 | 
            +
            		var nodeName, inline, inst;
         | 
| 144 | 
            +
            		nodeName = target.nodeName.toLowerCase();
         | 
| 145 | 
            +
            		inline = (nodeName === "div" || nodeName === "span");
         | 
| 163 146 | 
             
            		if (!target.id) {
         | 
| 164 147 | 
             
            			this.uuid += 1;
         | 
| 165 | 
            -
            			target.id =  | 
| 148 | 
            +
            			target.id = "dp" + this.uuid;
         | 
| 166 149 | 
             
            		}
         | 
| 167 | 
            -
            		 | 
| 168 | 
            -
            		inst.settings = $.extend({}, settings || {} | 
| 169 | 
            -
            		if (nodeName  | 
| 150 | 
            +
            		inst = this._newInst($(target), inline);
         | 
| 151 | 
            +
            		inst.settings = $.extend({}, settings || {});
         | 
| 152 | 
            +
            		if (nodeName === "input") {
         | 
| 170 153 | 
             
            			this._connectDatepicker(target, inst);
         | 
| 171 154 | 
             
            		} else if (inline) {
         | 
| 172 155 | 
             
            			this._inlineDatepicker(target, inst);
         | 
| @@ -175,13 +158,13 @@ $.extend(Datepicker.prototype, { | |
| 175 158 |  | 
| 176 159 | 
             
            	/* Create a new instance object. */
         | 
| 177 160 | 
             
            	_newInst: function(target, inline) {
         | 
| 178 | 
            -
            		var id = target[0].id.replace(/([^A-Za-z0-9_ | 
| 161 | 
            +
            		var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
         | 
| 179 162 | 
             
            		return {id: id, input: target, // associated target
         | 
| 180 163 | 
             
            			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
         | 
| 181 164 | 
             
            			drawMonth: 0, drawYear: 0, // month being drawn
         | 
| 182 165 | 
             
            			inline: inline, // is datepicker inline or not
         | 
| 183 166 | 
             
            			dpDiv: (!inline ? this.dpDiv : // presentation div
         | 
| 184 | 
            -
            			bindHover($( | 
| 167 | 
            +
            			bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
         | 
| 185 168 | 
             
            	},
         | 
| 186 169 |  | 
| 187 170 | 
             
            	/* Attach the date picker to an input field. */
         | 
| @@ -189,16 +172,12 @@ $.extend(Datepicker.prototype, { | |
| 189 172 | 
             
            		var input = $(target);
         | 
| 190 173 | 
             
            		inst.append = $([]);
         | 
| 191 174 | 
             
            		inst.trigger = $([]);
         | 
| 192 | 
            -
            		if (input.hasClass(this.markerClassName))
         | 
| 175 | 
            +
            		if (input.hasClass(this.markerClassName)) {
         | 
| 193 176 | 
             
            			return;
         | 
| 177 | 
            +
            		}
         | 
| 194 178 | 
             
            		this._attachments(input, inst);
         | 
| 195 179 | 
             
            		input.addClass(this.markerClassName).keydown(this._doKeyDown).
         | 
| 196 | 
            -
            			keypress(this._doKeyPress).keyup(this._doKeyUp) | 
| 197 | 
            -
            			bind("setData.datepicker", function(event, key, value) {
         | 
| 198 | 
            -
            				inst.settings[key] = value;
         | 
| 199 | 
            -
            			}).bind("getData.datepicker", function(event, key) {
         | 
| 200 | 
            -
            				return this._get(inst, key);
         | 
| 201 | 
            -
            			});
         | 
| 180 | 
            +
            			keypress(this._doKeyPress).keyup(this._doKeyUp);
         | 
| 202 181 | 
             
            		this._autoSize(inst);
         | 
| 203 182 | 
             
            		$.data(target, PROP_NAME, inst);
         | 
| 204 183 | 
             
            		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
         | 
| @@ -209,38 +188,47 @@ $.extend(Datepicker.prototype, { | |
| 209 188 |  | 
| 210 189 | 
             
            	/* Make attachments based on settings. */
         | 
| 211 190 | 
             
            	_attachments: function(input, inst) {
         | 
| 212 | 
            -
            		var  | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 191 | 
            +
            		var showOn, buttonText, buttonImage,
         | 
| 192 | 
            +
            			appendText = this._get(inst, "appendText"),
         | 
| 193 | 
            +
            			isRTL = this._get(inst, "isRTL");
         | 
| 194 | 
            +
             | 
| 195 | 
            +
            		if (inst.append) {
         | 
| 215 196 | 
             
            			inst.append.remove();
         | 
| 197 | 
            +
            		}
         | 
| 216 198 | 
             
            		if (appendText) {
         | 
| 217 | 
            -
            			inst.append = $( | 
| 218 | 
            -
            			input[isRTL ?  | 
| 199 | 
            +
            			inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
         | 
| 200 | 
            +
            			input[isRTL ? "before" : "after"](inst.append);
         | 
| 219 201 | 
             
            		}
         | 
| 220 | 
            -
             | 
| 221 | 
            -
            		 | 
| 202 | 
            +
             | 
| 203 | 
            +
            		input.unbind("focus", this._showDatepicker);
         | 
| 204 | 
            +
             | 
| 205 | 
            +
            		if (inst.trigger) {
         | 
| 222 206 | 
             
            			inst.trigger.remove();
         | 
| 223 | 
            -
            		 | 
| 224 | 
            -
             | 
| 207 | 
            +
            		}
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            		showOn = this._get(inst, "showOn");
         | 
| 210 | 
            +
            		if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
         | 
| 225 211 | 
             
            			input.focus(this._showDatepicker);
         | 
| 226 | 
            -
            		 | 
| 227 | 
            -
             | 
| 228 | 
            -
            			 | 
| 229 | 
            -
            			 | 
| 230 | 
            -
             | 
| 212 | 
            +
            		}
         | 
| 213 | 
            +
            		if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
         | 
| 214 | 
            +
            			buttonText = this._get(inst, "buttonText");
         | 
| 215 | 
            +
            			buttonImage = this._get(inst, "buttonImage");
         | 
| 216 | 
            +
            			inst.trigger = $(this._get(inst, "buttonImageOnly") ?
         | 
| 217 | 
            +
            				$("<img/>").addClass(this._triggerClass).
         | 
| 231 218 | 
             
            					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
         | 
| 232 | 
            -
            				$( | 
| 233 | 
            -
            					html(buttonImage  | 
| 219 | 
            +
            				$("<button type='button'></button>").addClass(this._triggerClass).
         | 
| 220 | 
            +
            					html(!buttonImage ? buttonText : $("<img/>").attr(
         | 
| 234 221 | 
             
            					{ src:buttonImage, alt:buttonText, title:buttonText })));
         | 
| 235 | 
            -
            			input[isRTL ?  | 
| 222 | 
            +
            			input[isRTL ? "before" : "after"](inst.trigger);
         | 
| 236 223 | 
             
            			inst.trigger.click(function() {
         | 
| 237 | 
            -
            				if ($.datepicker._datepickerShowing && $.datepicker._lastInput  | 
| 224 | 
            +
            				if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
         | 
| 238 225 | 
             
            					$.datepicker._hideDatepicker();
         | 
| 239 | 
            -
            				else if ($.datepicker._datepickerShowing && $.datepicker._lastInput  | 
| 226 | 
            +
            				} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
         | 
| 240 227 | 
             
            					$.datepicker._hideDatepicker();
         | 
| 241 228 | 
             
            					$.datepicker._showDatepicker(input[0]);
         | 
| 242 | 
            -
            				} else
         | 
| 229 | 
            +
            				} else {
         | 
| 243 230 | 
             
            					$.datepicker._showDatepicker(input[0]);
         | 
| 231 | 
            +
            				}
         | 
| 244 232 | 
             
            				return false;
         | 
| 245 233 | 
             
            			});
         | 
| 246 234 | 
             
            		}
         | 
| @@ -248,14 +236,16 @@ $.extend(Datepicker.prototype, { | |
| 248 236 |  | 
| 249 237 | 
             
            	/* Apply the maximum length for the date format. */
         | 
| 250 238 | 
             
            	_autoSize: function(inst) {
         | 
| 251 | 
            -
            		if (this._get(inst,  | 
| 252 | 
            -
            			var  | 
| 253 | 
            -
             | 
| 239 | 
            +
            		if (this._get(inst, "autoSize") && !inst.inline) {
         | 
| 240 | 
            +
            			var findMax, max, maxI, i,
         | 
| 241 | 
            +
            				date = new Date(2009, 12 - 1, 20), // Ensure double digits
         | 
| 242 | 
            +
            				dateFormat = this._get(inst, "dateFormat");
         | 
| 243 | 
            +
             | 
| 254 244 | 
             
            			if (dateFormat.match(/[DM]/)) {
         | 
| 255 | 
            -
            				 | 
| 256 | 
            -
            					 | 
| 257 | 
            -
            					 | 
| 258 | 
            -
            					for ( | 
| 245 | 
            +
            				findMax = function(names) {
         | 
| 246 | 
            +
            					max = 0;
         | 
| 247 | 
            +
            					maxI = 0;
         | 
| 248 | 
            +
            					for (i = 0; i < names.length; i++) {
         | 
| 259 249 | 
             
            						if (names[i].length > max) {
         | 
| 260 250 | 
             
            							max = names[i].length;
         | 
| 261 251 | 
             
            							maxI = i;
         | 
| @@ -264,25 +254,21 @@ $.extend(Datepicker.prototype, { | |
| 264 254 | 
             
            					return maxI;
         | 
| 265 255 | 
             
            				};
         | 
| 266 256 | 
             
            				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
         | 
| 267 | 
            -
            					 | 
| 257 | 
            +
            					"monthNames" : "monthNamesShort"))));
         | 
| 268 258 | 
             
            				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
         | 
| 269 | 
            -
            					 | 
| 259 | 
            +
            					"dayNames" : "dayNamesShort"))) + 20 - date.getDay());
         | 
| 270 260 | 
             
            			}
         | 
| 271 | 
            -
            			inst.input.attr( | 
| 261 | 
            +
            			inst.input.attr("size", this._formatDate(inst, date).length);
         | 
| 272 262 | 
             
            		}
         | 
| 273 263 | 
             
            	},
         | 
| 274 264 |  | 
| 275 265 | 
             
            	/* Attach an inline date picker to a div. */
         | 
| 276 266 | 
             
            	_inlineDatepicker: function(target, inst) {
         | 
| 277 267 | 
             
            		var divSpan = $(target);
         | 
| 278 | 
            -
            		if (divSpan.hasClass(this.markerClassName))
         | 
| 268 | 
            +
            		if (divSpan.hasClass(this.markerClassName)) {
         | 
| 279 269 | 
             
            			return;
         | 
| 280 | 
            -
            		 | 
| 281 | 
            -
             | 
| 282 | 
            -
            				inst.settings[key] = value;
         | 
| 283 | 
            -
            			}).bind("getData.datepicker", function(event, key){
         | 
| 284 | 
            -
            				return this._get(inst, key);
         | 
| 285 | 
            -
            			});
         | 
| 270 | 
            +
            		}
         | 
| 271 | 
            +
            		divSpan.addClass(this.markerClassName).append(inst.dpDiv);
         | 
| 286 272 | 
             
            		$.data(target, PROP_NAME, inst);
         | 
| 287 273 | 
             
            		this._setDate(inst, this._getDefaultDate(inst), true);
         | 
| 288 274 | 
             
            		this._updateDatepicker(inst);
         | 
| @@ -297,186 +283,219 @@ $.extend(Datepicker.prototype, { | |
| 297 283 | 
             
            	},
         | 
| 298 284 |  | 
| 299 285 | 
             
            	/* Pop-up the date picker in a "dialog" box.
         | 
| 300 | 
            -
             | 
| 301 | 
            -
             | 
| 302 | 
            -
             | 
| 303 | 
            -
             | 
| 304 | 
            -
             | 
| 305 | 
            -
             | 
| 306 | 
            -
             | 
| 307 | 
            -
             | 
| 286 | 
            +
            	 * @param  input element - ignored
         | 
| 287 | 
            +
            	 * @param  date	string or Date - the initial date to display
         | 
| 288 | 
            +
            	 * @param  onSelect  function - the function to call when a date is selected
         | 
| 289 | 
            +
            	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
         | 
| 290 | 
            +
            	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
         | 
| 291 | 
            +
            	 *					event - with x/y coordinates or
         | 
| 292 | 
            +
            	 *					leave empty for default (screen centre)
         | 
| 293 | 
            +
            	 * @return the manager object
         | 
| 294 | 
            +
            	 */
         | 
| 308 295 | 
             
            	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
         | 
| 309 | 
            -
            		var  | 
| 296 | 
            +
            		var id, browserWidth, browserHeight, scrollX, scrollY,
         | 
| 297 | 
            +
            			inst = this._dialogInst; // internal instance
         | 
| 298 | 
            +
             | 
| 310 299 | 
             
            		if (!inst) {
         | 
| 311 300 | 
             
            			this.uuid += 1;
         | 
| 312 | 
            -
            			 | 
| 313 | 
            -
            			this._dialogInput = $( | 
| 314 | 
            -
            				' | 
| 301 | 
            +
            			id = "dp" + this.uuid;
         | 
| 302 | 
            +
            			this._dialogInput = $("<input type='text' id='" + id +
         | 
| 303 | 
            +
            				"' style='position: absolute; top: -100px; width: 0px;'/>");
         | 
| 315 304 | 
             
            			this._dialogInput.keydown(this._doKeyDown);
         | 
| 316 | 
            -
            			$( | 
| 305 | 
            +
            			$("body").append(this._dialogInput);
         | 
| 317 306 | 
             
            			inst = this._dialogInst = this._newInst(this._dialogInput, false);
         | 
| 318 307 | 
             
            			inst.settings = {};
         | 
| 319 308 | 
             
            			$.data(this._dialogInput[0], PROP_NAME, inst);
         | 
| 320 309 | 
             
            		}
         | 
| 321 310 | 
             
            		extendRemove(inst.settings, settings || {});
         | 
| 322 | 
            -
            		date = (date && date.constructor  | 
| 311 | 
            +
            		date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
         | 
| 323 312 | 
             
            		this._dialogInput.val(date);
         | 
| 324 313 |  | 
| 325 314 | 
             
            		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
         | 
| 326 315 | 
             
            		if (!this._pos) {
         | 
| 327 | 
            -
            			 | 
| 328 | 
            -
            			 | 
| 329 | 
            -
            			 | 
| 330 | 
            -
            			 | 
| 316 | 
            +
            			browserWidth = document.documentElement.clientWidth;
         | 
| 317 | 
            +
            			browserHeight = document.documentElement.clientHeight;
         | 
| 318 | 
            +
            			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
         | 
| 319 | 
            +
            			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
         | 
| 331 320 | 
             
            			this._pos = // should use actual width/height below
         | 
| 332 321 | 
             
            				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
         | 
| 333 322 | 
             
            		}
         | 
| 334 323 |  | 
| 335 324 | 
             
            		// move input on screen for focus, but hidden behind dialog
         | 
| 336 | 
            -
            		this._dialogInput.css( | 
| 325 | 
            +
            		this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
         | 
| 337 326 | 
             
            		inst.settings.onSelect = onSelect;
         | 
| 338 327 | 
             
            		this._inDialog = true;
         | 
| 339 328 | 
             
            		this.dpDiv.addClass(this._dialogClass);
         | 
| 340 329 | 
             
            		this._showDatepicker(this._dialogInput[0]);
         | 
| 341 | 
            -
            		if ($.blockUI)
         | 
| 330 | 
            +
            		if ($.blockUI) {
         | 
| 342 331 | 
             
            			$.blockUI(this.dpDiv);
         | 
| 332 | 
            +
            		}
         | 
| 343 333 | 
             
            		$.data(this._dialogInput[0], PROP_NAME, inst);
         | 
| 344 334 | 
             
            		return this;
         | 
| 345 335 | 
             
            	},
         | 
| 346 336 |  | 
| 347 337 | 
             
            	/* Detach a datepicker from its control.
         | 
| 348 | 
            -
             | 
| 338 | 
            +
            	 * @param  target	element - the target input field or division or span
         | 
| 339 | 
            +
            	 */
         | 
| 349 340 | 
             
            	_destroyDatepicker: function(target) {
         | 
| 350 | 
            -
            		var  | 
| 351 | 
            -
             | 
| 341 | 
            +
            		var nodeName,
         | 
| 342 | 
            +
            			$target = $(target),
         | 
| 343 | 
            +
            			inst = $.data(target, PROP_NAME);
         | 
| 344 | 
            +
             | 
| 352 345 | 
             
            		if (!$target.hasClass(this.markerClassName)) {
         | 
| 353 346 | 
             
            			return;
         | 
| 354 347 | 
             
            		}
         | 
| 355 | 
            -
             | 
| 348 | 
            +
             | 
| 349 | 
            +
            		nodeName = target.nodeName.toLowerCase();
         | 
| 356 350 | 
             
            		$.removeData(target, PROP_NAME);
         | 
| 357 | 
            -
            		if (nodeName  | 
| 351 | 
            +
            		if (nodeName === "input") {
         | 
| 358 352 | 
             
            			inst.append.remove();
         | 
| 359 353 | 
             
            			inst.trigger.remove();
         | 
| 360 354 | 
             
            			$target.removeClass(this.markerClassName).
         | 
| 361 | 
            -
            				unbind( | 
| 362 | 
            -
            				unbind( | 
| 363 | 
            -
            				unbind( | 
| 364 | 
            -
            				unbind( | 
| 365 | 
            -
            		} else if (nodeName  | 
| 355 | 
            +
            				unbind("focus", this._showDatepicker).
         | 
| 356 | 
            +
            				unbind("keydown", this._doKeyDown).
         | 
| 357 | 
            +
            				unbind("keypress", this._doKeyPress).
         | 
| 358 | 
            +
            				unbind("keyup", this._doKeyUp);
         | 
| 359 | 
            +
            		} else if (nodeName === "div" || nodeName === "span") {
         | 
| 366 360 | 
             
            			$target.removeClass(this.markerClassName).empty();
         | 
| 361 | 
            +
            		}
         | 
| 367 362 | 
             
            	},
         | 
| 368 363 |  | 
| 369 364 | 
             
            	/* Enable the date picker to a jQuery selection.
         | 
| 370 | 
            -
             | 
| 365 | 
            +
            	 * @param  target	element - the target input field or division or span
         | 
| 366 | 
            +
            	 */
         | 
| 371 367 | 
             
            	_enableDatepicker: function(target) {
         | 
| 372 | 
            -
            		var  | 
| 373 | 
            -
             | 
| 368 | 
            +
            		var nodeName, inline,
         | 
| 369 | 
            +
            			$target = $(target),
         | 
| 370 | 
            +
            			inst = $.data(target, PROP_NAME);
         | 
| 371 | 
            +
             | 
| 374 372 | 
             
            		if (!$target.hasClass(this.markerClassName)) {
         | 
| 375 373 | 
             
            			return;
         | 
| 376 374 | 
             
            		}
         | 
| 377 | 
            -
             | 
| 378 | 
            -
            		 | 
| 375 | 
            +
             | 
| 376 | 
            +
            		nodeName = target.nodeName.toLowerCase();
         | 
| 377 | 
            +
            		if (nodeName === "input") {
         | 
| 379 378 | 
             
            			target.disabled = false;
         | 
| 380 | 
            -
            			inst.trigger.filter( | 
| 379 | 
            +
            			inst.trigger.filter("button").
         | 
| 381 380 | 
             
            				each(function() { this.disabled = false; }).end().
         | 
| 382 | 
            -
            				filter( | 
| 383 | 
            -
            		}
         | 
| 384 | 
            -
             | 
| 385 | 
            -
            			 | 
| 386 | 
            -
            			inline.children().removeClass('ui-state-disabled');
         | 
| 381 | 
            +
            				filter("img").css({opacity: "1.0", cursor: ""});
         | 
| 382 | 
            +
            		} else if (nodeName === "div" || nodeName === "span") {
         | 
| 383 | 
            +
            			inline = $target.children("." + this._inlineClass);
         | 
| 384 | 
            +
            			inline.children().removeClass("ui-state-disabled");
         | 
| 387 385 | 
             
            			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
         | 
| 388 386 | 
             
            				prop("disabled", false);
         | 
| 389 387 | 
             
            		}
         | 
| 390 388 | 
             
            		this._disabledInputs = $.map(this._disabledInputs,
         | 
| 391 | 
            -
            			function(value) { return (value  | 
| 389 | 
            +
            			function(value) { return (value === target ? null : value); }); // delete entry
         | 
| 392 390 | 
             
            	},
         | 
| 393 391 |  | 
| 394 392 | 
             
            	/* Disable the date picker to a jQuery selection.
         | 
| 395 | 
            -
             | 
| 393 | 
            +
            	 * @param  target	element - the target input field or division or span
         | 
| 394 | 
            +
            	 */
         | 
| 396 395 | 
             
            	_disableDatepicker: function(target) {
         | 
| 397 | 
            -
            		var  | 
| 398 | 
            -
             | 
| 396 | 
            +
            		var nodeName, inline,
         | 
| 397 | 
            +
            			$target = $(target),
         | 
| 398 | 
            +
            			inst = $.data(target, PROP_NAME);
         | 
| 399 | 
            +
             | 
| 399 400 | 
             
            		if (!$target.hasClass(this.markerClassName)) {
         | 
| 400 401 | 
             
            			return;
         | 
| 401 402 | 
             
            		}
         | 
| 402 | 
            -
             | 
| 403 | 
            -
            		 | 
| 403 | 
            +
             | 
| 404 | 
            +
            		nodeName = target.nodeName.toLowerCase();
         | 
| 405 | 
            +
            		if (nodeName === "input") {
         | 
| 404 406 | 
             
            			target.disabled = true;
         | 
| 405 | 
            -
            			inst.trigger.filter( | 
| 407 | 
            +
            			inst.trigger.filter("button").
         | 
| 406 408 | 
             
            				each(function() { this.disabled = true; }).end().
         | 
| 407 | 
            -
            				filter( | 
| 408 | 
            -
            		}
         | 
| 409 | 
            -
             | 
| 410 | 
            -
            			 | 
| 411 | 
            -
            			inline.children().addClass('ui-state-disabled');
         | 
| 409 | 
            +
            				filter("img").css({opacity: "0.5", cursor: "default"});
         | 
| 410 | 
            +
            		} else if (nodeName === "div" || nodeName === "span") {
         | 
| 411 | 
            +
            			inline = $target.children("." + this._inlineClass);
         | 
| 412 | 
            +
            			inline.children().addClass("ui-state-disabled");
         | 
| 412 413 | 
             
            			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
         | 
| 413 414 | 
             
            				prop("disabled", true);
         | 
| 414 415 | 
             
            		}
         | 
| 415 416 | 
             
            		this._disabledInputs = $.map(this._disabledInputs,
         | 
| 416 | 
            -
            			function(value) { return (value  | 
| 417 | 
            +
            			function(value) { return (value === target ? null : value); }); // delete entry
         | 
| 417 418 | 
             
            		this._disabledInputs[this._disabledInputs.length] = target;
         | 
| 418 419 | 
             
            	},
         | 
| 419 420 |  | 
| 420 421 | 
             
            	/* Is the first field in a jQuery collection disabled as a datepicker?
         | 
| 421 | 
            -
             | 
| 422 | 
            -
             | 
| 422 | 
            +
            	 * @param  target	element - the target input field or division or span
         | 
| 423 | 
            +
            	 * @return boolean - true if disabled, false if enabled
         | 
| 424 | 
            +
            	 */
         | 
| 423 425 | 
             
            	_isDisabledDatepicker: function(target) {
         | 
| 424 426 | 
             
            		if (!target) {
         | 
| 425 427 | 
             
            			return false;
         | 
| 426 428 | 
             
            		}
         | 
| 427 429 | 
             
            		for (var i = 0; i < this._disabledInputs.length; i++) {
         | 
| 428 | 
            -
            			if (this._disabledInputs[i]  | 
| 430 | 
            +
            			if (this._disabledInputs[i] === target) {
         | 
| 429 431 | 
             
            				return true;
         | 
| 432 | 
            +
            			}
         | 
| 430 433 | 
             
            		}
         | 
| 431 434 | 
             
            		return false;
         | 
| 432 435 | 
             
            	},
         | 
| 433 436 |  | 
| 434 437 | 
             
            	/* Retrieve the instance data for the target control.
         | 
| 435 | 
            -
             | 
| 436 | 
            -
             | 
| 437 | 
            -
             | 
| 438 | 
            +
            	 * @param  target  element - the target input field or division or span
         | 
| 439 | 
            +
            	 * @return  object - the associated instance data
         | 
| 440 | 
            +
            	 * @throws  error if a jQuery problem getting data
         | 
| 441 | 
            +
            	 */
         | 
| 438 442 | 
             
            	_getInst: function(target) {
         | 
| 439 443 | 
             
            		try {
         | 
| 440 444 | 
             
            			return $.data(target, PROP_NAME);
         | 
| 441 445 | 
             
            		}
         | 
| 442 446 | 
             
            		catch (err) {
         | 
| 443 | 
            -
            			throw  | 
| 447 | 
            +
            			throw "Missing instance data for this datepicker";
         | 
| 444 448 | 
             
            		}
         | 
| 445 449 | 
             
            	},
         | 
| 446 450 |  | 
| 447 451 | 
             
            	/* Update or retrieve the settings for a date picker attached to an input field or division.
         | 
| 448 | 
            -
             | 
| 449 | 
            -
             | 
| 450 | 
            -
             | 
| 451 | 
            -
             | 
| 452 | 
            -
             | 
| 453 | 
            -
             | 
| 454 | 
            -
             | 
| 452 | 
            +
            	 * @param  target  element - the target input field or division or span
         | 
| 453 | 
            +
            	 * @param  name	object - the new settings to update or
         | 
| 454 | 
            +
            	 *				string - the name of the setting to change or retrieve,
         | 
| 455 | 
            +
            	 *				when retrieving also "all" for all instance settings or
         | 
| 456 | 
            +
            	 *				"defaults" for all global defaults
         | 
| 457 | 
            +
            	 * @param  value   any - the new value for the setting
         | 
| 458 | 
            +
            	 *				(omit if above is an object or to retrieve a value)
         | 
| 459 | 
            +
            	 */
         | 
| 455 460 | 
             
            	_optionDatepicker: function(target, name, value) {
         | 
| 456 | 
            -
            		var  | 
| 457 | 
            -
             | 
| 458 | 
            -
             | 
| 459 | 
            -
             | 
| 461 | 
            +
            		var settings, date, minDate, maxDate,
         | 
| 462 | 
            +
            			inst = this._getInst(target);
         | 
| 463 | 
            +
             | 
| 464 | 
            +
            		if (arguments.length === 2 && typeof name === "string") {
         | 
| 465 | 
            +
            			return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
         | 
| 466 | 
            +
            				(inst ? (name === "all" ? $.extend({}, inst.settings) :
         | 
| 460 467 | 
             
            				this._get(inst, name)) : null));
         | 
| 461 468 | 
             
            		}
         | 
| 462 | 
            -
             | 
| 463 | 
            -
            		 | 
| 469 | 
            +
             | 
| 470 | 
            +
            		settings = name || {};
         | 
| 471 | 
            +
            		if (typeof name === "string") {
         | 
| 464 472 | 
             
            			settings = {};
         | 
| 465 473 | 
             
            			settings[name] = value;
         | 
| 466 474 | 
             
            		}
         | 
| 475 | 
            +
             | 
| 467 476 | 
             
            		if (inst) {
         | 
| 468 | 
            -
            			if (this._curInst  | 
| 477 | 
            +
            			if (this._curInst === inst) {
         | 
| 469 478 | 
             
            				this._hideDatepicker();
         | 
| 470 479 | 
             
            			}
         | 
| 471 | 
            -
             | 
| 472 | 
            -
            			 | 
| 473 | 
            -
            			 | 
| 480 | 
            +
             | 
| 481 | 
            +
            			date = this._getDateDatepicker(target, true);
         | 
| 482 | 
            +
            			minDate = this._getMinMaxDate(inst, "min");
         | 
| 483 | 
            +
            			maxDate = this._getMinMaxDate(inst, "max");
         | 
| 474 484 | 
             
            			extendRemove(inst.settings, settings);
         | 
| 475 485 | 
             
            			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
         | 
| 476 | 
            -
            			if (minDate !== null && settings | 
| 486 | 
            +
            			if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
         | 
| 477 487 | 
             
            				inst.settings.minDate = this._formatDate(inst, minDate);
         | 
| 478 | 
            -
            			 | 
| 488 | 
            +
            			}
         | 
| 489 | 
            +
            			if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
         | 
| 479 490 | 
             
            				inst.settings.maxDate = this._formatDate(inst, maxDate);
         | 
| 491 | 
            +
            			}
         | 
| 492 | 
            +
            			if ( "disabled" in settings ) {
         | 
| 493 | 
            +
            				if ( settings.disabled ) {
         | 
| 494 | 
            +
            					this._disableDatepicker(target);
         | 
| 495 | 
            +
            				} else {
         | 
| 496 | 
            +
            					this._enableDatepicker(target);
         | 
| 497 | 
            +
            				}
         | 
| 498 | 
            +
            			}
         | 
| 480 499 | 
             
            			this._attachments($(target), inst);
         | 
| 481 500 | 
             
            			this._autoSize(inst);
         | 
| 482 501 | 
             
            			this._setDate(inst, date);
         | 
| @@ -491,7 +510,8 @@ $.extend(Datepicker.prototype, { | |
| 491 510 | 
             
            	},
         | 
| 492 511 |  | 
| 493 512 | 
             
            	/* Redraw the date picker attached to an input field or division.
         | 
| 494 | 
            -
             | 
| 513 | 
            +
            	 * @param  target  element - the target input field or division or span
         | 
| 514 | 
            +
            	 */
         | 
| 495 515 | 
             
            	_refreshDatepicker: function(target) {
         | 
| 496 516 | 
             
            		var inst = this._getInst(target);
         | 
| 497 517 | 
             
            		if (inst) {
         | 
| @@ -500,8 +520,9 @@ $.extend(Datepicker.prototype, { | |
| 500 520 | 
             
            	},
         | 
| 501 521 |  | 
| 502 522 | 
             
            	/* Set the dates for a jQuery selection.
         | 
| 503 | 
            -
             | 
| 504 | 
            -
             | 
| 523 | 
            +
            	 * @param  target element - the target input field or division or span
         | 
| 524 | 
            +
            	 * @param  date	Date - the new date
         | 
| 525 | 
            +
            	 */
         | 
| 505 526 | 
             
            	_setDateDatepicker: function(target, date) {
         | 
| 506 527 | 
             
            		var inst = this._getInst(target);
         | 
| 507 528 | 
             
            		if (inst) {
         | 
| @@ -512,87 +533,110 @@ $.extend(Datepicker.prototype, { | |
| 512 533 | 
             
            	},
         | 
| 513 534 |  | 
| 514 535 | 
             
            	/* Get the date(s) for the first entry in a jQuery selection.
         | 
| 515 | 
            -
             | 
| 516 | 
            -
             | 
| 517 | 
            -
             | 
| 536 | 
            +
            	 * @param  target element - the target input field or division or span
         | 
| 537 | 
            +
            	 * @param  noDefault boolean - true if no default date is to be used
         | 
| 538 | 
            +
            	 * @return Date - the current date
         | 
| 539 | 
            +
            	 */
         | 
| 518 540 | 
             
            	_getDateDatepicker: function(target, noDefault) {
         | 
| 519 541 | 
             
            		var inst = this._getInst(target);
         | 
| 520 | 
            -
            		if (inst && !inst.inline)
         | 
| 542 | 
            +
            		if (inst && !inst.inline) {
         | 
| 521 543 | 
             
            			this._setDateFromField(inst, noDefault);
         | 
| 544 | 
            +
            		}
         | 
| 522 545 | 
             
            		return (inst ? this._getDate(inst) : null);
         | 
| 523 546 | 
             
            	},
         | 
| 524 547 |  | 
| 525 548 | 
             
            	/* Handle keystrokes. */
         | 
| 526 549 | 
             
            	_doKeyDown: function(event) {
         | 
| 527 | 
            -
            		var  | 
| 528 | 
            -
             | 
| 529 | 
            -
             | 
| 550 | 
            +
            		var onSelect, dateStr, sel,
         | 
| 551 | 
            +
            			inst = $.datepicker._getInst(event.target),
         | 
| 552 | 
            +
            			handled = true,
         | 
| 553 | 
            +
            			isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
         | 
| 554 | 
            +
             | 
| 530 555 | 
             
            		inst._keyEvent = true;
         | 
| 531 | 
            -
            		if ($.datepicker._datepickerShowing)
         | 
| 556 | 
            +
            		if ($.datepicker._datepickerShowing) {
         | 
| 532 557 | 
             
            			switch (event.keyCode) {
         | 
| 533 558 | 
             
            				case 9: $.datepicker._hideDatepicker();
         | 
| 534 559 | 
             
            						handled = false;
         | 
| 535 560 | 
             
            						break; // hide on tab out
         | 
| 536 | 
            -
            				case 13:  | 
| 537 | 
            -
            									$.datepicker._currentClass +  | 
| 538 | 
            -
            						if (sel[0])
         | 
| 561 | 
            +
            				case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
         | 
| 562 | 
            +
            									$.datepicker._currentClass + ")", inst.dpDiv);
         | 
| 563 | 
            +
            						if (sel[0]) {
         | 
| 539 564 | 
             
            							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
         | 
| 540 | 
            -
             | 
| 541 | 
            -
            							if (onSelect) {
         | 
| 542 | 
            -
            								var dateStr = $.datepicker._formatDate(inst);
         | 
| 565 | 
            +
            						}
         | 
| 543 566 |  | 
| 544 | 
            -
             | 
| 545 | 
            -
             | 
| 546 | 
            -
            							 | 
| 547 | 
            -
             | 
| 567 | 
            +
            						onSelect = $.datepicker._get(inst, "onSelect");
         | 
| 568 | 
            +
            						if (onSelect) {
         | 
| 569 | 
            +
            							dateStr = $.datepicker._formatDate(inst);
         | 
| 570 | 
            +
             | 
| 571 | 
            +
            							// trigger custom callback
         | 
| 572 | 
            +
            							onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
         | 
| 573 | 
            +
            						} else {
         | 
| 548 574 | 
             
            							$.datepicker._hideDatepicker();
         | 
| 575 | 
            +
            						}
         | 
| 576 | 
            +
             | 
| 549 577 | 
             
            						return false; // don't submit the form
         | 
| 550 | 
            -
            						break; // select the value on enter
         | 
| 551 578 | 
             
            				case 27: $.datepicker._hideDatepicker();
         | 
| 552 579 | 
             
            						break; // hide on escape
         | 
| 553 580 | 
             
            				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
         | 
| 554 | 
            -
            							-$.datepicker._get(inst,  | 
| 555 | 
            -
            							-$.datepicker._get(inst,  | 
| 581 | 
            +
            							-$.datepicker._get(inst, "stepBigMonths") :
         | 
| 582 | 
            +
            							-$.datepicker._get(inst, "stepMonths")), "M");
         | 
| 556 583 | 
             
            						break; // previous month/year on page up/+ ctrl
         | 
| 557 584 | 
             
            				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
         | 
| 558 | 
            -
            							+$.datepicker._get(inst,  | 
| 559 | 
            -
            							+$.datepicker._get(inst,  | 
| 585 | 
            +
            							+$.datepicker._get(inst, "stepBigMonths") :
         | 
| 586 | 
            +
            							+$.datepicker._get(inst, "stepMonths")), "M");
         | 
| 560 587 | 
             
            						break; // next month/year on page down/+ ctrl
         | 
| 561 | 
            -
            				case 35: if (event.ctrlKey || event.metaKey)  | 
| 588 | 
            +
            				case 35: if (event.ctrlKey || event.metaKey) {
         | 
| 589 | 
            +
            							$.datepicker._clearDate(event.target);
         | 
| 590 | 
            +
            						}
         | 
| 562 591 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 563 592 | 
             
            						break; // clear on ctrl or command +end
         | 
| 564 | 
            -
            				case 36: if (event.ctrlKey || event.metaKey)  | 
| 593 | 
            +
            				case 36: if (event.ctrlKey || event.metaKey) {
         | 
| 594 | 
            +
            							$.datepicker._gotoToday(event.target);
         | 
| 595 | 
            +
            						}
         | 
| 565 596 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 566 597 | 
             
            						break; // current on ctrl or command +home
         | 
| 567 | 
            -
            				case 37: if (event.ctrlKey || event.metaKey)  | 
| 598 | 
            +
            				case 37: if (event.ctrlKey || event.metaKey) {
         | 
| 599 | 
            +
            							$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
         | 
| 600 | 
            +
            						}
         | 
| 568 601 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 569 602 | 
             
            						// -1 day on ctrl or command +left
         | 
| 570 | 
            -
            						if (event.originalEvent.altKey)  | 
| 571 | 
            -
             | 
| 572 | 
            -
             | 
| 603 | 
            +
            						if (event.originalEvent.altKey) {
         | 
| 604 | 
            +
            							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
         | 
| 605 | 
            +
            								-$.datepicker._get(inst, "stepBigMonths") :
         | 
| 606 | 
            +
            								-$.datepicker._get(inst, "stepMonths")), "M");
         | 
| 607 | 
            +
            						}
         | 
| 573 608 | 
             
            						// next month/year on alt +left on Mac
         | 
| 574 609 | 
             
            						break;
         | 
| 575 | 
            -
            				case 38: if (event.ctrlKey || event.metaKey)  | 
| 610 | 
            +
            				case 38: if (event.ctrlKey || event.metaKey) {
         | 
| 611 | 
            +
            							$.datepicker._adjustDate(event.target, -7, "D");
         | 
| 612 | 
            +
            						}
         | 
| 576 613 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 577 614 | 
             
            						break; // -1 week on ctrl or command +up
         | 
| 578 | 
            -
            				case 39: if (event.ctrlKey || event.metaKey)  | 
| 615 | 
            +
            				case 39: if (event.ctrlKey || event.metaKey) {
         | 
| 616 | 
            +
            							$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
         | 
| 617 | 
            +
            						}
         | 
| 579 618 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 580 619 | 
             
            						// +1 day on ctrl or command +right
         | 
| 581 | 
            -
            						if (event.originalEvent.altKey)  | 
| 582 | 
            -
             | 
| 583 | 
            -
             | 
| 620 | 
            +
            						if (event.originalEvent.altKey) {
         | 
| 621 | 
            +
            							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
         | 
| 622 | 
            +
            								+$.datepicker._get(inst, "stepBigMonths") :
         | 
| 623 | 
            +
            								+$.datepicker._get(inst, "stepMonths")), "M");
         | 
| 624 | 
            +
            						}
         | 
| 584 625 | 
             
            						// next month/year on alt +right
         | 
| 585 626 | 
             
            						break;
         | 
| 586 | 
            -
            				case 40: if (event.ctrlKey || event.metaKey)  | 
| 627 | 
            +
            				case 40: if (event.ctrlKey || event.metaKey) {
         | 
| 628 | 
            +
            							$.datepicker._adjustDate(event.target, +7, "D");
         | 
| 629 | 
            +
            						}
         | 
| 587 630 | 
             
            						handled = event.ctrlKey || event.metaKey;
         | 
| 588 631 | 
             
            						break; // +1 week on ctrl or command +down
         | 
| 589 632 | 
             
            				default: handled = false;
         | 
| 590 633 | 
             
            			}
         | 
| 591 | 
            -
            		else if (event.keyCode  | 
| 634 | 
            +
            		} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
         | 
| 592 635 | 
             
            			$.datepicker._showDatepicker(this);
         | 
| 593 | 
            -
            		else {
         | 
| 636 | 
            +
            		} else {
         | 
| 594 637 | 
             
            			handled = false;
         | 
| 595 638 | 
             
            		}
         | 
| 639 | 
            +
             | 
| 596 640 | 
             
            		if (handled) {
         | 
| 597 641 | 
             
            			event.preventDefault();
         | 
| 598 642 | 
             
            			event.stopPropagation();
         | 
| @@ -601,22 +645,27 @@ $.extend(Datepicker.prototype, { | |
| 601 645 |  | 
| 602 646 | 
             
            	/* Filter entered characters - based on date format. */
         | 
| 603 647 | 
             
            	_doKeyPress: function(event) {
         | 
| 604 | 
            -
            		var  | 
| 605 | 
            -
             | 
| 606 | 
            -
             | 
| 607 | 
            -
             | 
| 608 | 
            -
            			 | 
| 648 | 
            +
            		var chars, chr,
         | 
| 649 | 
            +
            			inst = $.datepicker._getInst(event.target);
         | 
| 650 | 
            +
             | 
| 651 | 
            +
            		if ($.datepicker._get(inst, "constrainInput")) {
         | 
| 652 | 
            +
            			chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
         | 
| 653 | 
            +
            			chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
         | 
| 654 | 
            +
            			return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
         | 
| 609 655 | 
             
            		}
         | 
| 610 656 | 
             
            	},
         | 
| 611 657 |  | 
| 612 658 | 
             
            	/* Synchronise manual entry and field/alternate field. */
         | 
| 613 659 | 
             
            	_doKeyUp: function(event) {
         | 
| 614 | 
            -
            		var  | 
| 615 | 
            -
             | 
| 660 | 
            +
            		var date,
         | 
| 661 | 
            +
            			inst = $.datepicker._getInst(event.target);
         | 
| 662 | 
            +
             | 
| 663 | 
            +
            		if (inst.input.val() !== inst.lastVal) {
         | 
| 616 664 | 
             
            			try {
         | 
| 617 | 
            -
            				 | 
| 665 | 
            +
            				date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
         | 
| 618 666 | 
             
            					(inst.input ? inst.input.val() : null),
         | 
| 619 667 | 
             
            					$.datepicker._getFormatConfig(inst));
         | 
| 668 | 
            +
             | 
| 620 669 | 
             
            				if (date) { // only if valid
         | 
| 621 670 | 
             
            					$.datepicker._setDateFromField(inst);
         | 
| 622 671 | 
             
            					$.datepicker._updateAlternate(inst);
         | 
| @@ -624,86 +673,91 @@ $.extend(Datepicker.prototype, { | |
| 624 673 | 
             
            				}
         | 
| 625 674 | 
             
            			}
         | 
| 626 675 | 
             
            			catch (err) {
         | 
| 627 | 
            -
            				$.datepicker.log(err);
         | 
| 628 676 | 
             
            			}
         | 
| 629 677 | 
             
            		}
         | 
| 630 678 | 
             
            		return true;
         | 
| 631 679 | 
             
            	},
         | 
| 632 680 |  | 
| 633 681 | 
             
            	/* Pop-up the date picker for a given input field.
         | 
| 634 | 
            -
             | 
| 635 | 
            -
             | 
| 636 | 
            -
             | 
| 682 | 
            +
            	 * If false returned from beforeShow event handler do not show.
         | 
| 683 | 
            +
            	 * @param  input  element - the input field attached to the date picker or
         | 
| 684 | 
            +
            	 *					event - if triggered by focus
         | 
| 685 | 
            +
            	 */
         | 
| 637 686 | 
             
            	_showDatepicker: function(input) {
         | 
| 638 687 | 
             
            		input = input.target || input;
         | 
| 639 | 
            -
            		if (input.nodeName.toLowerCase()  | 
| 640 | 
            -
            			input = $( | 
| 641 | 
            -
            		 | 
| 688 | 
            +
            		if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
         | 
| 689 | 
            +
            			input = $("input", input.parentNode)[0];
         | 
| 690 | 
            +
            		}
         | 
| 691 | 
            +
             | 
| 692 | 
            +
            		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
         | 
| 642 693 | 
             
            			return;
         | 
| 643 | 
            -
            		 | 
| 644 | 
            -
             | 
| 694 | 
            +
            		}
         | 
| 695 | 
            +
             | 
| 696 | 
            +
            		var inst, beforeShow, beforeShowSettings, isFixed,
         | 
| 697 | 
            +
            			offset, showAnim, duration;
         | 
| 698 | 
            +
             | 
| 699 | 
            +
            		inst = $.datepicker._getInst(input);
         | 
| 700 | 
            +
            		if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
         | 
| 645 701 | 
             
            			$.datepicker._curInst.dpDiv.stop(true, true);
         | 
| 646 702 | 
             
            			if ( inst && $.datepicker._datepickerShowing ) {
         | 
| 647 703 | 
             
            				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
         | 
| 648 704 | 
             
            			}
         | 
| 649 705 | 
             
            		}
         | 
| 650 | 
            -
             | 
| 651 | 
            -
            		 | 
| 706 | 
            +
             | 
| 707 | 
            +
            		beforeShow = $.datepicker._get(inst, "beforeShow");
         | 
| 708 | 
            +
            		beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
         | 
| 652 709 | 
             
            		if(beforeShowSettings === false){
         | 
| 653 | 
            -
            			//false
         | 
| 654 710 | 
             
            			return;
         | 
| 655 711 | 
             
            		}
         | 
| 656 712 | 
             
            		extendRemove(inst.settings, beforeShowSettings);
         | 
| 713 | 
            +
             | 
| 657 714 | 
             
            		inst.lastVal = null;
         | 
| 658 715 | 
             
            		$.datepicker._lastInput = input;
         | 
| 659 716 | 
             
            		$.datepicker._setDateFromField(inst);
         | 
| 660 | 
            -
             | 
| 661 | 
            -
             | 
| 717 | 
            +
             | 
| 718 | 
            +
            		if ($.datepicker._inDialog) { // hide cursor
         | 
| 719 | 
            +
            			input.value = "";
         | 
| 720 | 
            +
            		}
         | 
| 662 721 | 
             
            		if (!$.datepicker._pos) { // position below input
         | 
| 663 722 | 
             
            			$.datepicker._pos = $.datepicker._findPos(input);
         | 
| 664 723 | 
             
            			$.datepicker._pos[1] += input.offsetHeight; // add the height
         | 
| 665 724 | 
             
            		}
         | 
| 666 | 
            -
             | 
| 725 | 
            +
             | 
| 726 | 
            +
            		isFixed = false;
         | 
| 667 727 | 
             
            		$(input).parents().each(function() {
         | 
| 668 | 
            -
            			isFixed |= $(this).css( | 
| 728 | 
            +
            			isFixed |= $(this).css("position") === "fixed";
         | 
| 669 729 | 
             
            			return !isFixed;
         | 
| 670 730 | 
             
            		});
         | 
| 671 | 
            -
             | 
| 731 | 
            +
             | 
| 732 | 
            +
            		offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
         | 
| 672 733 | 
             
            		$.datepicker._pos = null;
         | 
| 673 734 | 
             
            		//to avoid flashes on Firefox
         | 
| 674 735 | 
             
            		inst.dpDiv.empty();
         | 
| 675 736 | 
             
            		// determine sizing offscreen
         | 
| 676 | 
            -
            		inst.dpDiv.css({position:  | 
| 737 | 
            +
            		inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
         | 
| 677 738 | 
             
            		$.datepicker._updateDatepicker(inst);
         | 
| 678 739 | 
             
            		// fix width for dynamic number of date pickers
         | 
| 679 740 | 
             
            		// and adjust position before showing
         | 
| 680 741 | 
             
            		offset = $.datepicker._checkOffset(inst, offset, isFixed);
         | 
| 681 742 | 
             
            		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
         | 
| 682 | 
            -
            			 | 
| 683 | 
            -
            			left: offset.left +  | 
| 743 | 
            +
            			"static" : (isFixed ? "fixed" : "absolute")), display: "none",
         | 
| 744 | 
            +
            			left: offset.left + "px", top: offset.top + "px"});
         | 
| 745 | 
            +
             | 
| 684 746 | 
             
            		if (!inst.inline) {
         | 
| 685 | 
            -
            			 | 
| 686 | 
            -
            			 | 
| 687 | 
            -
            			var postProcess = function() {
         | 
| 688 | 
            -
            				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
         | 
| 689 | 
            -
            				if( !! cover.length ){
         | 
| 690 | 
            -
            					var borders = $.datepicker._getBorders(inst.dpDiv);
         | 
| 691 | 
            -
            					cover.css({left: -borders[0], top: -borders[1],
         | 
| 692 | 
            -
            						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
         | 
| 693 | 
            -
            				}
         | 
| 694 | 
            -
            			};
         | 
| 747 | 
            +
            			showAnim = $.datepicker._get(inst, "showAnim");
         | 
| 748 | 
            +
            			duration = $.datepicker._get(inst, "duration");
         | 
| 695 749 | 
             
            			inst.dpDiv.zIndex($(input).zIndex()+1);
         | 
| 696 750 | 
             
            			$.datepicker._datepickerShowing = true;
         | 
| 697 751 |  | 
| 698 | 
            -
            			 | 
| 699 | 
            -
             | 
| 700 | 
            -
             | 
| 701 | 
            -
             | 
| 702 | 
            -
             | 
| 703 | 
            -
             | 
| 704 | 
            -
             | 
| 705 | 
            -
            			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
         | 
| 752 | 
            +
            			if ( $.effects && $.effects.effect[ showAnim ] ) {
         | 
| 753 | 
            +
            				inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
         | 
| 754 | 
            +
            			} else {
         | 
| 755 | 
            +
            				inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
         | 
| 756 | 
            +
            			}
         | 
| 757 | 
            +
             | 
| 758 | 
            +
            			if (inst.input.is(":visible") && !inst.input.is(":disabled")) {
         | 
| 706 759 | 
             
            				inst.input.focus();
         | 
| 760 | 
            +
            			}
         | 
| 707 761 | 
             
            			$.datepicker._curInst = inst;
         | 
| 708 762 | 
             
            		}
         | 
| 709 763 | 
             
            	},
         | 
| @@ -711,37 +765,39 @@ $.extend(Datepicker.prototype, { | |
| 711 765 | 
             
            	/* Generate the date picker content. */
         | 
| 712 766 | 
             
            	_updateDatepicker: function(inst) {
         | 
| 713 767 | 
             
            		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
         | 
| 714 | 
            -
            		var borders = $.datepicker._getBorders(inst.dpDiv);
         | 
| 715 768 | 
             
            		instActive = inst; // for delegate hover events
         | 
| 716 769 | 
             
            		inst.dpDiv.empty().append(this._generateHTML(inst));
         | 
| 717 770 | 
             
            		this._attachHandlers(inst);
         | 
| 718 | 
            -
            		 | 
| 719 | 
            -
             | 
| 720 | 
            -
             | 
| 721 | 
            -
             | 
| 722 | 
            -
             | 
| 723 | 
            -
             | 
| 724 | 
            -
             | 
| 725 | 
            -
            		 | 
| 726 | 
            -
            		 | 
| 727 | 
            -
             | 
| 728 | 
            -
             | 
| 729 | 
            -
            		inst.dpDiv[(numMonths[0]  | 
| 730 | 
            -
            			 | 
| 731 | 
            -
            		inst.dpDiv[(this._get(inst,  | 
| 732 | 
            -
            			 | 
| 733 | 
            -
             | 
| 734 | 
            -
             | 
| 735 | 
            -
             | 
| 736 | 
            -
             | 
| 771 | 
            +
            		inst.dpDiv.find("." + this._dayOverClass + " a").mouseover();
         | 
| 772 | 
            +
             | 
| 773 | 
            +
            		var origyearshtml,
         | 
| 774 | 
            +
            			numMonths = this._getNumberOfMonths(inst),
         | 
| 775 | 
            +
            			cols = numMonths[1],
         | 
| 776 | 
            +
            			width = 17;
         | 
| 777 | 
            +
             | 
| 778 | 
            +
            		inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
         | 
| 779 | 
            +
            		if (cols > 1) {
         | 
| 780 | 
            +
            			inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
         | 
| 781 | 
            +
            		}
         | 
| 782 | 
            +
            		inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
         | 
| 783 | 
            +
            			"Class"]("ui-datepicker-multi");
         | 
| 784 | 
            +
            		inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
         | 
| 785 | 
            +
            			"Class"]("ui-datepicker-rtl");
         | 
| 786 | 
            +
             | 
| 787 | 
            +
            		// #6694 - don't focus the input if it's already focused
         | 
| 788 | 
            +
            		// this breaks the change event in IE
         | 
| 789 | 
            +
            		if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
         | 
| 790 | 
            +
            			inst.input.is(":visible") && !inst.input.is(":disabled") && inst.input[0] !== document.activeElement) {
         | 
| 737 791 | 
             
            			inst.input.focus();
         | 
| 792 | 
            +
            		}
         | 
| 793 | 
            +
             | 
| 738 794 | 
             
            		// deffered render of the years select (to avoid flashes on Firefox)
         | 
| 739 795 | 
             
            		if( inst.yearshtml ){
         | 
| 740 | 
            -
            			 | 
| 796 | 
            +
            			origyearshtml = inst.yearshtml;
         | 
| 741 797 | 
             
            			setTimeout(function(){
         | 
| 742 798 | 
             
            				//assure that inst.yearshtml didn't change.
         | 
| 743 799 | 
             
            				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
         | 
| 744 | 
            -
            					inst.dpDiv.find( | 
| 800 | 
            +
            					inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
         | 
| 745 801 | 
             
            				}
         | 
| 746 802 | 
             
            				origyearshtml = inst.yearshtml = null;
         | 
| 747 803 | 
             
            			}, 0);
         | 
| @@ -749,28 +805,29 @@ $.extend(Datepicker.prototype, { | |
| 749 805 | 
             
            	},
         | 
| 750 806 |  | 
| 751 807 | 
             
            	/* Retrieve the size of left and top borders for an element.
         | 
| 752 | 
            -
             | 
| 753 | 
            -
             | 
| 808 | 
            +
            	 * @param  elem  (jQuery object) the element of interest
         | 
| 809 | 
            +
            	 * @return  (number[2]) the left and top borders
         | 
| 810 | 
            +
            	 */
         | 
| 754 811 | 
             
            	_getBorders: function(elem) {
         | 
| 755 812 | 
             
            		var convert = function(value) {
         | 
| 756 813 | 
             
            			return {thin: 1, medium: 2, thick: 3}[value] || value;
         | 
| 757 814 | 
             
            		};
         | 
| 758 | 
            -
            		return [parseFloat(convert(elem.css( | 
| 759 | 
            -
            			parseFloat(convert(elem.css( | 
| 815 | 
            +
            		return [parseFloat(convert(elem.css("border-left-width"))),
         | 
| 816 | 
            +
            			parseFloat(convert(elem.css("border-top-width")))];
         | 
| 760 817 | 
             
            	},
         | 
| 761 818 |  | 
| 762 819 | 
             
            	/* Check positioning to remain on screen. */
         | 
| 763 820 | 
             
            	_checkOffset: function(inst, offset, isFixed) {
         | 
| 764 | 
            -
            		var dpWidth = inst.dpDiv.outerWidth() | 
| 765 | 
            -
             | 
| 766 | 
            -
             | 
| 767 | 
            -
             | 
| 768 | 
            -
             | 
| 769 | 
            -
             | 
| 821 | 
            +
            		var dpWidth = inst.dpDiv.outerWidth(),
         | 
| 822 | 
            +
            			dpHeight = inst.dpDiv.outerHeight(),
         | 
| 823 | 
            +
            			inputWidth = inst.input ? inst.input.outerWidth() : 0,
         | 
| 824 | 
            +
            			inputHeight = inst.input ? inst.input.outerHeight() : 0,
         | 
| 825 | 
            +
            			viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
         | 
| 826 | 
            +
            			viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
         | 
| 770 827 |  | 
| 771 | 
            -
            		offset.left -= (this._get(inst,  | 
| 772 | 
            -
            		offset.left -= (isFixed && offset.left  | 
| 773 | 
            -
            		offset.top -= (isFixed && offset.top  | 
| 828 | 
            +
            		offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
         | 
| 829 | 
            +
            		offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
         | 
| 830 | 
            +
            		offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
         | 
| 774 831 |  | 
| 775 832 | 
             
            		// now check if datepicker is showing outside window viewport - move to a better place if so.
         | 
| 776 833 | 
             
            		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
         | 
| @@ -783,47 +840,60 @@ $.extend(Datepicker.prototype, { | |
| 783 840 |  | 
| 784 841 | 
             
            	/* Find an object's position on the screen. */
         | 
| 785 842 | 
             
            	_findPos: function(obj) {
         | 
| 786 | 
            -
            		var  | 
| 787 | 
            -
             | 
| 788 | 
            -
             | 
| 789 | 
            -
             | 
| 843 | 
            +
            		var position,
         | 
| 844 | 
            +
            			inst = this._getInst(obj),
         | 
| 845 | 
            +
            			isRTL = this._get(inst, "isRTL");
         | 
| 846 | 
            +
             | 
| 847 | 
            +
            		while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
         | 
| 848 | 
            +
            			obj = obj[isRTL ? "previousSibling" : "nextSibling"];
         | 
| 790 849 | 
             
            		}
         | 
| 791 | 
            -
             | 
| 850 | 
            +
             | 
| 851 | 
            +
            		position = $(obj).offset();
         | 
| 792 852 | 
             
            		return [position.left, position.top];
         | 
| 793 853 | 
             
            	},
         | 
| 794 854 |  | 
| 795 855 | 
             
            	/* Hide the date picker from view.
         | 
| 796 | 
            -
             | 
| 856 | 
            +
            	 * @param  input  element - the input field attached to the date picker
         | 
| 857 | 
            +
            	 */
         | 
| 797 858 | 
             
            	_hideDatepicker: function(input) {
         | 
| 798 | 
            -
            		var  | 
| 799 | 
            -
             | 
| 859 | 
            +
            		var showAnim, duration, postProcess, onClose,
         | 
| 860 | 
            +
            			inst = this._curInst;
         | 
| 861 | 
            +
             | 
| 862 | 
            +
            		if (!inst || (input && inst !== $.data(input, PROP_NAME))) {
         | 
| 800 863 | 
             
            			return;
         | 
| 864 | 
            +
            		}
         | 
| 865 | 
            +
             | 
| 801 866 | 
             
            		if (this._datepickerShowing) {
         | 
| 802 | 
            -
            			 | 
| 803 | 
            -
            			 | 
| 804 | 
            -
            			 | 
| 867 | 
            +
            			showAnim = this._get(inst, "showAnim");
         | 
| 868 | 
            +
            			duration = this._get(inst, "duration");
         | 
| 869 | 
            +
            			postProcess = function() {
         | 
| 805 870 | 
             
            				$.datepicker._tidyDialog(inst);
         | 
| 806 871 | 
             
            			};
         | 
| 807 872 |  | 
| 808 873 | 
             
            			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
         | 
| 809 | 
            -
            			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
         | 
| 810 | 
            -
            				inst.dpDiv.hide(showAnim, $.datepicker._get(inst,  | 
| 811 | 
            -
            			else
         | 
| 812 | 
            -
            				inst.dpDiv[(showAnim  | 
| 813 | 
            -
            					(showAnim  | 
| 814 | 
            -
            			 | 
| 874 | 
            +
            			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
         | 
| 875 | 
            +
            				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
         | 
| 876 | 
            +
            			} else {
         | 
| 877 | 
            +
            				inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
         | 
| 878 | 
            +
            					(showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
         | 
| 879 | 
            +
            			}
         | 
| 880 | 
            +
             | 
| 881 | 
            +
            			if (!showAnim) {
         | 
| 815 882 | 
             
            				postProcess();
         | 
| 883 | 
            +
            			}
         | 
| 816 884 | 
             
            			this._datepickerShowing = false;
         | 
| 817 | 
            -
             | 
| 818 | 
            -
            			 | 
| 819 | 
            -
             | 
| 820 | 
            -
             | 
| 885 | 
            +
             | 
| 886 | 
            +
            			onClose = this._get(inst, "onClose");
         | 
| 887 | 
            +
            			if (onClose) {
         | 
| 888 | 
            +
            				onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
         | 
| 889 | 
            +
            			}
         | 
| 890 | 
            +
             | 
| 821 891 | 
             
            			this._lastInput = null;
         | 
| 822 892 | 
             
            			if (this._inDialog) {
         | 
| 823 | 
            -
            				this._dialogInput.css({ position:  | 
| 893 | 
            +
            				this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
         | 
| 824 894 | 
             
            				if ($.blockUI) {
         | 
| 825 895 | 
             
            					$.unblockUI();
         | 
| 826 | 
            -
            					$( | 
| 896 | 
            +
            					$("body").append(this.dpDiv);
         | 
| 827 897 | 
             
            				}
         | 
| 828 898 | 
             
            			}
         | 
| 829 899 | 
             
            			this._inDialog = false;
         | 
| @@ -832,50 +902,54 @@ $.extend(Datepicker.prototype, { | |
| 832 902 |  | 
| 833 903 | 
             
            	/* Tidy up after a dialog display. */
         | 
| 834 904 | 
             
            	_tidyDialog: function(inst) {
         | 
| 835 | 
            -
            		inst.dpDiv.removeClass(this._dialogClass).unbind( | 
| 905 | 
            +
            		inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
         | 
| 836 906 | 
             
            	},
         | 
| 837 907 |  | 
| 838 908 | 
             
            	/* Close date picker if clicked elsewhere. */
         | 
| 839 909 | 
             
            	_checkExternalClick: function(event) {
         | 
| 840 | 
            -
            		if (!$.datepicker._curInst)
         | 
| 910 | 
            +
            		if (!$.datepicker._curInst) {
         | 
| 841 911 | 
             
            			return;
         | 
| 912 | 
            +
            		}
         | 
| 842 913 |  | 
| 843 914 | 
             
            		var $target = $(event.target),
         | 
| 844 915 | 
             
            			inst = $.datepicker._getInst($target[0]);
         | 
| 845 916 |  | 
| 846 | 
            -
            		if ( ( ( $target[0].id  | 
| 847 | 
            -
            				$target.parents( | 
| 917 | 
            +
            		if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
         | 
| 918 | 
            +
            				$target.parents("#" + $.datepicker._mainDivId).length === 0 &&
         | 
| 848 919 | 
             
            				!$target.hasClass($.datepicker.markerClassName) &&
         | 
| 849 920 | 
             
            				!$target.closest("." + $.datepicker._triggerClass).length &&
         | 
| 850 921 | 
             
            				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
         | 
| 851 | 
            -
            			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst  | 
| 852 | 
            -
             | 
| 922 | 
            +
            			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
         | 
| 923 | 
            +
            				$.datepicker._hideDatepicker();
         | 
| 924 | 
            +
            		}
         | 
| 853 925 | 
             
            	},
         | 
| 854 926 |  | 
| 855 927 | 
             
            	/* Adjust one of the date sub-fields. */
         | 
| 856 928 | 
             
            	_adjustDate: function(id, offset, period) {
         | 
| 857 | 
            -
            		var target = $(id) | 
| 858 | 
            -
             | 
| 929 | 
            +
            		var target = $(id),
         | 
| 930 | 
            +
            			inst = this._getInst(target[0]);
         | 
| 931 | 
            +
             | 
| 859 932 | 
             
            		if (this._isDisabledDatepicker(target[0])) {
         | 
| 860 933 | 
             
            			return;
         | 
| 861 934 | 
             
            		}
         | 
| 862 935 | 
             
            		this._adjustInstDate(inst, offset +
         | 
| 863 | 
            -
            			(period  | 
| 936 | 
            +
            			(period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
         | 
| 864 937 | 
             
            			period);
         | 
| 865 938 | 
             
            		this._updateDatepicker(inst);
         | 
| 866 939 | 
             
            	},
         | 
| 867 940 |  | 
| 868 941 | 
             
            	/* Action for current link. */
         | 
| 869 942 | 
             
            	_gotoToday: function(id) {
         | 
| 870 | 
            -
            		var  | 
| 871 | 
            -
             | 
| 872 | 
            -
             | 
| 943 | 
            +
            		var date,
         | 
| 944 | 
            +
            			target = $(id),
         | 
| 945 | 
            +
            			inst = this._getInst(target[0]);
         | 
| 946 | 
            +
             | 
| 947 | 
            +
            		if (this._get(inst, "gotoCurrent") && inst.currentDay) {
         | 
| 873 948 | 
             
            			inst.selectedDay = inst.currentDay;
         | 
| 874 949 | 
             
            			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
         | 
| 875 950 | 
             
            			inst.drawYear = inst.selectedYear = inst.currentYear;
         | 
| 876 | 
            -
            		}
         | 
| 877 | 
            -
             | 
| 878 | 
            -
            			var date = new Date();
         | 
| 951 | 
            +
            		} else {
         | 
| 952 | 
            +
            			date = new Date();
         | 
| 879 953 | 
             
            			inst.selectedDay = date.getDate();
         | 
| 880 954 | 
             
            			inst.drawMonth = inst.selectedMonth = date.getMonth();
         | 
| 881 955 | 
             
            			inst.drawYear = inst.selectedYear = date.getFullYear();
         | 
| @@ -886,23 +960,28 @@ $.extend(Datepicker.prototype, { | |
| 886 960 |  | 
| 887 961 | 
             
            	/* Action for selecting a new month/year. */
         | 
| 888 962 | 
             
            	_selectMonthYear: function(id, select, period) {
         | 
| 889 | 
            -
            		var target = $(id) | 
| 890 | 
            -
             | 
| 891 | 
            -
             | 
| 892 | 
            -
            		inst[ | 
| 963 | 
            +
            		var target = $(id),
         | 
| 964 | 
            +
            			inst = this._getInst(target[0]);
         | 
| 965 | 
            +
             | 
| 966 | 
            +
            		inst["selected" + (period === "M" ? "Month" : "Year")] =
         | 
| 967 | 
            +
            		inst["draw" + (period === "M" ? "Month" : "Year")] =
         | 
| 893 968 | 
             
            			parseInt(select.options[select.selectedIndex].value,10);
         | 
| 969 | 
            +
             | 
| 894 970 | 
             
            		this._notifyChange(inst);
         | 
| 895 971 | 
             
            		this._adjustDate(target);
         | 
| 896 972 | 
             
            	},
         | 
| 897 973 |  | 
| 898 974 | 
             
            	/* Action for selecting a day. */
         | 
| 899 975 | 
             
            	_selectDay: function(id, month, year, td) {
         | 
| 900 | 
            -
            		var  | 
| 976 | 
            +
            		var inst,
         | 
| 977 | 
            +
            			target = $(id);
         | 
| 978 | 
            +
             | 
| 901 979 | 
             
            		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
         | 
| 902 980 | 
             
            			return;
         | 
| 903 981 | 
             
            		}
         | 
| 904 | 
            -
             | 
| 905 | 
            -
            		inst | 
| 982 | 
            +
             | 
| 983 | 
            +
            		inst = this._getInst(target[0]);
         | 
| 984 | 
            +
            		inst.selectedDay = inst.currentDay = $("a", td).html();
         | 
| 906 985 | 
             
            		inst.selectedMonth = inst.currentMonth = month;
         | 
| 907 986 | 
             
            		inst.selectedYear = inst.currentYear = year;
         | 
| 908 987 | 
             
            		this._selectDate(id, this._formatDate(inst,
         | 
| @@ -912,372 +991,427 @@ $.extend(Datepicker.prototype, { | |
| 912 991 | 
             
            	/* Erase the input field and hide the date picker. */
         | 
| 913 992 | 
             
            	_clearDate: function(id) {
         | 
| 914 993 | 
             
            		var target = $(id);
         | 
| 915 | 
            -
            		 | 
| 916 | 
            -
            		this._selectDate(target, '');
         | 
| 994 | 
            +
            		this._selectDate(target, "");
         | 
| 917 995 | 
             
            	},
         | 
| 918 996 |  | 
| 919 997 | 
             
            	/* Update the input field with the selected date. */
         | 
| 920 998 | 
             
            	_selectDate: function(id, dateStr) {
         | 
| 921 | 
            -
            		var  | 
| 922 | 
            -
             | 
| 999 | 
            +
            		var onSelect,
         | 
| 1000 | 
            +
            			target = $(id),
         | 
| 1001 | 
            +
            			inst = this._getInst(target[0]);
         | 
| 1002 | 
            +
             | 
| 923 1003 | 
             
            		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
         | 
| 924 | 
            -
            		if (inst.input)
         | 
| 1004 | 
            +
            		if (inst.input) {
         | 
| 925 1005 | 
             
            			inst.input.val(dateStr);
         | 
| 1006 | 
            +
            		}
         | 
| 926 1007 | 
             
            		this._updateAlternate(inst);
         | 
| 927 | 
            -
             | 
| 928 | 
            -
            		 | 
| 1008 | 
            +
             | 
| 1009 | 
            +
            		onSelect = this._get(inst, "onSelect");
         | 
| 1010 | 
            +
            		if (onSelect) {
         | 
| 929 1011 | 
             
            			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
         | 
| 930 | 
            -
            		else if (inst.input)
         | 
| 931 | 
            -
            			inst.input.trigger( | 
| 932 | 
            -
            		 | 
| 1012 | 
            +
            		} else if (inst.input) {
         | 
| 1013 | 
            +
            			inst.input.trigger("change"); // fire the change event
         | 
| 1014 | 
            +
            		}
         | 
| 1015 | 
            +
             | 
| 1016 | 
            +
            		if (inst.inline){
         | 
| 933 1017 | 
             
            			this._updateDatepicker(inst);
         | 
| 934 | 
            -
            		else {
         | 
| 1018 | 
            +
            		} else {
         | 
| 935 1019 | 
             
            			this._hideDatepicker();
         | 
| 936 1020 | 
             
            			this._lastInput = inst.input[0];
         | 
| 937 | 
            -
            			if (typeof(inst.input[0])  | 
| 1021 | 
            +
            			if (typeof(inst.input[0]) !== "object") {
         | 
| 938 1022 | 
             
            				inst.input.focus(); // restore focus
         | 
| 1023 | 
            +
            			}
         | 
| 939 1024 | 
             
            			this._lastInput = null;
         | 
| 940 1025 | 
             
            		}
         | 
| 941 1026 | 
             
            	},
         | 
| 942 1027 |  | 
| 943 1028 | 
             
            	/* Update any alternate field to synchronise with the main field. */
         | 
| 944 1029 | 
             
            	_updateAlternate: function(inst) {
         | 
| 945 | 
            -
            		var  | 
| 1030 | 
            +
            		var altFormat, date, dateStr,
         | 
| 1031 | 
            +
            			altField = this._get(inst, "altField");
         | 
| 1032 | 
            +
             | 
| 946 1033 | 
             
            		if (altField) { // update alternate field too
         | 
| 947 | 
            -
            			 | 
| 948 | 
            -
            			 | 
| 949 | 
            -
            			 | 
| 1034 | 
            +
            			altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
         | 
| 1035 | 
            +
            			date = this._getDate(inst);
         | 
| 1036 | 
            +
            			dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
         | 
| 950 1037 | 
             
            			$(altField).each(function() { $(this).val(dateStr); });
         | 
| 951 1038 | 
             
            		}
         | 
| 952 1039 | 
             
            	},
         | 
| 953 1040 |  | 
| 954 1041 | 
             
            	/* Set as beforeShowDay function to prevent selection of weekends.
         | 
| 955 | 
            -
             | 
| 956 | 
            -
             | 
| 1042 | 
            +
            	 * @param  date  Date - the date to customise
         | 
| 1043 | 
            +
            	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
         | 
| 1044 | 
            +
            	 */
         | 
| 957 1045 | 
             
            	noWeekends: function(date) {
         | 
| 958 1046 | 
             
            		var day = date.getDay();
         | 
| 959 | 
            -
            		return [(day > 0 && day < 6),  | 
| 1047 | 
            +
            		return [(day > 0 && day < 6), ""];
         | 
| 960 1048 | 
             
            	},
         | 
| 961 1049 |  | 
| 962 1050 | 
             
            	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
         | 
| 963 | 
            -
             | 
| 964 | 
            -
             | 
| 1051 | 
            +
            	 * @param  date  Date - the date to get the week for
         | 
| 1052 | 
            +
            	 * @return  number - the number of the week within the year that contains this date
         | 
| 1053 | 
            +
            	 */
         | 
| 965 1054 | 
             
            	iso8601Week: function(date) {
         | 
| 966 | 
            -
            		var  | 
| 1055 | 
            +
            		var time,
         | 
| 1056 | 
            +
            			checkDate = new Date(date.getTime());
         | 
| 1057 | 
            +
             | 
| 967 1058 | 
             
            		// Find Thursday of this week starting on Monday
         | 
| 968 1059 | 
             
            		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
         | 
| 969 | 
            -
             | 
| 1060 | 
            +
             | 
| 1061 | 
            +
            		time = checkDate.getTime();
         | 
| 970 1062 | 
             
            		checkDate.setMonth(0); // Compare with Jan 1
         | 
| 971 1063 | 
             
            		checkDate.setDate(1);
         | 
| 972 1064 | 
             
            		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
         | 
| 973 1065 | 
             
            	},
         | 
| 974 1066 |  | 
| 975 1067 | 
             
            	/* Parse a string value into a date object.
         | 
| 976 | 
            -
             | 
| 977 | 
            -
             | 
| 978 | 
            -
             | 
| 979 | 
            -
             | 
| 980 | 
            -
             | 
| 981 | 
            -
             | 
| 982 | 
            -
             | 
| 983 | 
            -
             | 
| 984 | 
            -
             | 
| 985 | 
            -
             | 
| 986 | 
            -
             | 
| 1068 | 
            +
            	 * See formatDate below for the possible formats.
         | 
| 1069 | 
            +
            	 *
         | 
| 1070 | 
            +
            	 * @param  format string - the expected format of the date
         | 
| 1071 | 
            +
            	 * @param  value string - the date in the above format
         | 
| 1072 | 
            +
            	 * @param  settings Object - attributes include:
         | 
| 1073 | 
            +
            	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
         | 
| 1074 | 
            +
            	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
         | 
| 1075 | 
            +
            	 *					dayNames		string[7] - names of the days from Sunday (optional)
         | 
| 1076 | 
            +
            	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
         | 
| 1077 | 
            +
            	 *					monthNames		string[12] - names of the months (optional)
         | 
| 1078 | 
            +
            	 * @return  Date - the extracted date value or null if value is blank
         | 
| 1079 | 
            +
            	 */
         | 
| 987 1080 | 
             
            	parseDate: function (format, value, settings) {
         | 
| 988 | 
            -
            		if (format == null || value == null)
         | 
| 989 | 
            -
            			throw  | 
| 990 | 
            -
            		 | 
| 991 | 
            -
             | 
| 1081 | 
            +
            		if (format == null || value == null) {
         | 
| 1082 | 
            +
            			throw "Invalid arguments";
         | 
| 1083 | 
            +
            		}
         | 
| 1084 | 
            +
             | 
| 1085 | 
            +
            		value = (typeof value === "object" ? value.toString() : value + "");
         | 
| 1086 | 
            +
            		if (value === "") {
         | 
| 992 1087 | 
             
            			return null;
         | 
| 993 | 
            -
            		 | 
| 994 | 
            -
             | 
| 995 | 
            -
             | 
| 996 | 
            -
             | 
| 997 | 
            -
             | 
| 998 | 
            -
             | 
| 999 | 
            -
             | 
| 1000 | 
            -
             | 
| 1001 | 
            -
             | 
| 1002 | 
            -
             | 
| 1003 | 
            -
             | 
| 1004 | 
            -
             | 
| 1005 | 
            -
             | 
| 1006 | 
            -
             | 
| 1007 | 
            -
            			 | 
| 1008 | 
            -
            			 | 
| 1009 | 
            -
             | 
| 1010 | 
            -
            			 | 
| 1011 | 
            -
             | 
| 1012 | 
            -
             | 
| 1013 | 
            -
             | 
| 1014 | 
            -
             | 
| 1015 | 
            -
            			var size = (match == '@' ? 14 : (match == '!' ? 20 :
         | 
| 1016 | 
            -
            				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
         | 
| 1017 | 
            -
            			var digits = new RegExp('^\\d{1,' + size + '}');
         | 
| 1018 | 
            -
            			var num = value.substring(iValue).match(digits);
         | 
| 1019 | 
            -
            			if (!num)
         | 
| 1020 | 
            -
            				throw 'Missing number at position ' + iValue;
         | 
| 1021 | 
            -
            			iValue += num[0].length;
         | 
| 1022 | 
            -
            			return parseInt(num[0], 10);
         | 
| 1023 | 
            -
            		};
         | 
| 1024 | 
            -
            		// Extract a name from the string value and convert to an index
         | 
| 1025 | 
            -
            		var getName = function(match, shortNames, longNames) {
         | 
| 1026 | 
            -
            			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
         | 
| 1027 | 
            -
            				return [ [k, v] ];
         | 
| 1028 | 
            -
            			}).sort(function (a, b) {
         | 
| 1029 | 
            -
            				return -(a[1].length - b[1].length);
         | 
| 1030 | 
            -
            			});
         | 
| 1031 | 
            -
            			var index = -1;
         | 
| 1032 | 
            -
            			$.each(names, function (i, pair) {
         | 
| 1033 | 
            -
            				var name = pair[1];
         | 
| 1034 | 
            -
            				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
         | 
| 1035 | 
            -
            					index = pair[0];
         | 
| 1036 | 
            -
            					iValue += name.length;
         | 
| 1037 | 
            -
            					return false;
         | 
| 1088 | 
            +
            		}
         | 
| 1089 | 
            +
             | 
| 1090 | 
            +
            		var iFormat, dim, extra,
         | 
| 1091 | 
            +
            			iValue = 0,
         | 
| 1092 | 
            +
            			shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
         | 
| 1093 | 
            +
            			shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
         | 
| 1094 | 
            +
            				new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
         | 
| 1095 | 
            +
            			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
         | 
| 1096 | 
            +
            			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
         | 
| 1097 | 
            +
            			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
         | 
| 1098 | 
            +
            			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
         | 
| 1099 | 
            +
            			year = -1,
         | 
| 1100 | 
            +
            			month = -1,
         | 
| 1101 | 
            +
            			day = -1,
         | 
| 1102 | 
            +
            			doy = -1,
         | 
| 1103 | 
            +
            			literal = false,
         | 
| 1104 | 
            +
            			date,
         | 
| 1105 | 
            +
            			// Check whether a format character is doubled
         | 
| 1106 | 
            +
            			lookAhead = function(match) {
         | 
| 1107 | 
            +
            				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
         | 
| 1108 | 
            +
            				if (matches) {
         | 
| 1109 | 
            +
            					iFormat++;
         | 
| 1038 1110 | 
             
            				}
         | 
| 1039 | 
            -
             | 
| 1040 | 
            -
            			 | 
| 1041 | 
            -
             | 
| 1042 | 
            -
            			 | 
| 1043 | 
            -
            				 | 
| 1044 | 
            -
             | 
| 1045 | 
            -
             | 
| 1046 | 
            -
             | 
| 1047 | 
            -
             | 
| 1048 | 
            -
            				 | 
| 1049 | 
            -
             | 
| 1050 | 
            -
             | 
| 1051 | 
            -
             | 
| 1052 | 
            -
             | 
| 1053 | 
            -
            			 | 
| 1054 | 
            -
             | 
| 1111 | 
            +
            				return matches;
         | 
| 1112 | 
            +
            			},
         | 
| 1113 | 
            +
            			// Extract a number from the string value
         | 
| 1114 | 
            +
            			getNumber = function(match) {
         | 
| 1115 | 
            +
            				var isDoubled = lookAhead(match),
         | 
| 1116 | 
            +
            					size = (match === "@" ? 14 : (match === "!" ? 20 :
         | 
| 1117 | 
            +
            					(match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
         | 
| 1118 | 
            +
            					digits = new RegExp("^\\d{1," + size + "}"),
         | 
| 1119 | 
            +
            					num = value.substring(iValue).match(digits);
         | 
| 1120 | 
            +
            				if (!num) {
         | 
| 1121 | 
            +
            					throw "Missing number at position " + iValue;
         | 
| 1122 | 
            +
            				}
         | 
| 1123 | 
            +
            				iValue += num[0].length;
         | 
| 1124 | 
            +
            				return parseInt(num[0], 10);
         | 
| 1125 | 
            +
            			},
         | 
| 1126 | 
            +
            			// Extract a name from the string value and convert to an index
         | 
| 1127 | 
            +
            			getName = function(match, shortNames, longNames) {
         | 
| 1128 | 
            +
            				var index = -1,
         | 
| 1129 | 
            +
            					names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
         | 
| 1130 | 
            +
            						return [ [k, v] ];
         | 
| 1131 | 
            +
            					}).sort(function (a, b) {
         | 
| 1132 | 
            +
            						return -(a[1].length - b[1].length);
         | 
| 1133 | 
            +
            					});
         | 
| 1134 | 
            +
             | 
| 1135 | 
            +
            				$.each(names, function (i, pair) {
         | 
| 1136 | 
            +
            					var name = pair[1];
         | 
| 1137 | 
            +
            					if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
         | 
| 1138 | 
            +
            						index = pair[0];
         | 
| 1139 | 
            +
            						iValue += name.length;
         | 
| 1140 | 
            +
            						return false;
         | 
| 1141 | 
            +
            					}
         | 
| 1142 | 
            +
            				});
         | 
| 1143 | 
            +
            				if (index !== -1) {
         | 
| 1144 | 
            +
            					return index + 1;
         | 
| 1145 | 
            +
            				} else {
         | 
| 1146 | 
            +
            					throw "Unknown name at position " + iValue;
         | 
| 1147 | 
            +
            				}
         | 
| 1148 | 
            +
            			},
         | 
| 1149 | 
            +
            			// Confirm that a literal character matches the string value
         | 
| 1150 | 
            +
            			checkLiteral = function() {
         | 
| 1151 | 
            +
            				if (value.charAt(iValue) !== format.charAt(iFormat)) {
         | 
| 1152 | 
            +
            					throw "Unexpected literal at position " + iValue;
         | 
| 1153 | 
            +
            				}
         | 
| 1154 | 
            +
            				iValue++;
         | 
| 1155 | 
            +
            			};
         | 
| 1156 | 
            +
             | 
| 1157 | 
            +
            		for (iFormat = 0; iFormat < format.length; iFormat++) {
         | 
| 1158 | 
            +
            			if (literal) {
         | 
| 1159 | 
            +
            				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
         | 
| 1055 1160 | 
             
            					literal = false;
         | 
| 1056 | 
            -
            				else
         | 
| 1161 | 
            +
            				} else {
         | 
| 1057 1162 | 
             
            					checkLiteral();
         | 
| 1058 | 
            -
             | 
| 1163 | 
            +
            				}
         | 
| 1164 | 
            +
            			} else {
         | 
| 1059 1165 | 
             
            				switch (format.charAt(iFormat)) {
         | 
| 1060 | 
            -
            					case  | 
| 1061 | 
            -
            						day = getNumber( | 
| 1166 | 
            +
            					case "d":
         | 
| 1167 | 
            +
            						day = getNumber("d");
         | 
| 1062 1168 | 
             
            						break;
         | 
| 1063 | 
            -
            					case  | 
| 1064 | 
            -
            						getName( | 
| 1169 | 
            +
            					case "D":
         | 
| 1170 | 
            +
            						getName("D", dayNamesShort, dayNames);
         | 
| 1065 1171 | 
             
            						break;
         | 
| 1066 | 
            -
            					case  | 
| 1067 | 
            -
            						doy = getNumber( | 
| 1172 | 
            +
            					case "o":
         | 
| 1173 | 
            +
            						doy = getNumber("o");
         | 
| 1068 1174 | 
             
            						break;
         | 
| 1069 | 
            -
            					case  | 
| 1070 | 
            -
            						month = getNumber( | 
| 1175 | 
            +
            					case "m":
         | 
| 1176 | 
            +
            						month = getNumber("m");
         | 
| 1071 1177 | 
             
            						break;
         | 
| 1072 | 
            -
            					case  | 
| 1073 | 
            -
            						month = getName( | 
| 1178 | 
            +
            					case "M":
         | 
| 1179 | 
            +
            						month = getName("M", monthNamesShort, monthNames);
         | 
| 1074 1180 | 
             
            						break;
         | 
| 1075 | 
            -
            					case  | 
| 1076 | 
            -
            						year = getNumber( | 
| 1181 | 
            +
            					case "y":
         | 
| 1182 | 
            +
            						year = getNumber("y");
         | 
| 1077 1183 | 
             
            						break;
         | 
| 1078 | 
            -
            					case  | 
| 1079 | 
            -
            						 | 
| 1184 | 
            +
            					case "@":
         | 
| 1185 | 
            +
            						date = new Date(getNumber("@"));
         | 
| 1080 1186 | 
             
            						year = date.getFullYear();
         | 
| 1081 1187 | 
             
            						month = date.getMonth() + 1;
         | 
| 1082 1188 | 
             
            						day = date.getDate();
         | 
| 1083 1189 | 
             
            						break;
         | 
| 1084 | 
            -
            					case  | 
| 1085 | 
            -
            						 | 
| 1190 | 
            +
            					case "!":
         | 
| 1191 | 
            +
            						date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
         | 
| 1086 1192 | 
             
            						year = date.getFullYear();
         | 
| 1087 1193 | 
             
            						month = date.getMonth() + 1;
         | 
| 1088 1194 | 
             
            						day = date.getDate();
         | 
| 1089 1195 | 
             
            						break;
         | 
| 1090 1196 | 
             
            					case "'":
         | 
| 1091 | 
            -
            						if (lookAhead("'"))
         | 
| 1197 | 
            +
            						if (lookAhead("'")){
         | 
| 1092 1198 | 
             
            							checkLiteral();
         | 
| 1093 | 
            -
            						else
         | 
| 1199 | 
            +
            						} else {
         | 
| 1094 1200 | 
             
            							literal = true;
         | 
| 1201 | 
            +
            						}
         | 
| 1095 1202 | 
             
            						break;
         | 
| 1096 1203 | 
             
            					default:
         | 
| 1097 1204 | 
             
            						checkLiteral();
         | 
| 1098 1205 | 
             
            				}
         | 
| 1206 | 
            +
            			}
         | 
| 1099 1207 | 
             
            		}
         | 
| 1208 | 
            +
             | 
| 1100 1209 | 
             
            		if (iValue < value.length){
         | 
| 1101 | 
            -
            			 | 
| 1210 | 
            +
            			extra = value.substr(iValue);
         | 
| 1102 1211 | 
             
            			if (!/^\s+/.test(extra)) {
         | 
| 1103 1212 | 
             
            				throw "Extra/unparsed characters found in date: " + extra;
         | 
| 1104 1213 | 
             
            			}
         | 
| 1105 1214 | 
             
            		}
         | 
| 1106 | 
            -
             | 
| 1215 | 
            +
             | 
| 1216 | 
            +
            		if (year === -1) {
         | 
| 1107 1217 | 
             
            			year = new Date().getFullYear();
         | 
| 1108 | 
            -
            		else if (year < 100)
         | 
| 1218 | 
            +
            		} else if (year < 100) {
         | 
| 1109 1219 | 
             
            			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
         | 
| 1110 1220 | 
             
            				(year <= shortYearCutoff ? 0 : -100);
         | 
| 1221 | 
            +
            		}
         | 
| 1222 | 
            +
             | 
| 1111 1223 | 
             
            		if (doy > -1) {
         | 
| 1112 1224 | 
             
            			month = 1;
         | 
| 1113 1225 | 
             
            			day = doy;
         | 
| 1114 1226 | 
             
            			do {
         | 
| 1115 | 
            -
            				 | 
| 1116 | 
            -
            				if (day <= dim)
         | 
| 1227 | 
            +
            				dim = this._getDaysInMonth(year, month - 1);
         | 
| 1228 | 
            +
            				if (day <= dim) {
         | 
| 1117 1229 | 
             
            					break;
         | 
| 1230 | 
            +
            				}
         | 
| 1118 1231 | 
             
            				month++;
         | 
| 1119 1232 | 
             
            				day -= dim;
         | 
| 1120 1233 | 
             
            			} while (true);
         | 
| 1121 1234 | 
             
            		}
         | 
| 1122 | 
            -
             | 
| 1123 | 
            -
            		 | 
| 1124 | 
            -
             | 
| 1235 | 
            +
             | 
| 1236 | 
            +
            		date = this._daylightSavingAdjust(new Date(year, month - 1, day));
         | 
| 1237 | 
            +
            		if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
         | 
| 1238 | 
            +
            			throw "Invalid date"; // E.g. 31/02/00
         | 
| 1239 | 
            +
            		}
         | 
| 1125 1240 | 
             
            		return date;
         | 
| 1126 1241 | 
             
            	},
         | 
| 1127 1242 |  | 
| 1128 1243 | 
             
            	/* Standard date formats. */
         | 
| 1129 | 
            -
            	ATOM:  | 
| 1130 | 
            -
            	COOKIE:  | 
| 1131 | 
            -
            	ISO_8601:  | 
| 1132 | 
            -
            	RFC_822:  | 
| 1133 | 
            -
            	RFC_850:  | 
| 1134 | 
            -
            	RFC_1036:  | 
| 1135 | 
            -
            	RFC_1123:  | 
| 1136 | 
            -
            	RFC_2822:  | 
| 1137 | 
            -
            	RSS:  | 
| 1138 | 
            -
            	TICKS:  | 
| 1139 | 
            -
            	TIMESTAMP:  | 
| 1140 | 
            -
            	W3C:  | 
| 1244 | 
            +
            	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
         | 
| 1245 | 
            +
            	COOKIE: "D, dd M yy",
         | 
| 1246 | 
            +
            	ISO_8601: "yy-mm-dd",
         | 
| 1247 | 
            +
            	RFC_822: "D, d M y",
         | 
| 1248 | 
            +
            	RFC_850: "DD, dd-M-y",
         | 
| 1249 | 
            +
            	RFC_1036: "D, d M y",
         | 
| 1250 | 
            +
            	RFC_1123: "D, d M yy",
         | 
| 1251 | 
            +
            	RFC_2822: "D, d M yy",
         | 
| 1252 | 
            +
            	RSS: "D, d M y", // RFC 822
         | 
| 1253 | 
            +
            	TICKS: "!",
         | 
| 1254 | 
            +
            	TIMESTAMP: "@",
         | 
| 1255 | 
            +
            	W3C: "yy-mm-dd", // ISO 8601
         | 
| 1141 1256 |  | 
| 1142 1257 | 
             
            	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
         | 
| 1143 1258 | 
             
            		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
         | 
| 1144 1259 |  | 
| 1145 1260 | 
             
            	/* Format a date object into a string value.
         | 
| 1146 | 
            -
             | 
| 1147 | 
            -
             | 
| 1148 | 
            -
             | 
| 1149 | 
            -
             | 
| 1150 | 
            -
             | 
| 1151 | 
            -
             | 
| 1152 | 
            -
             | 
| 1153 | 
            -
             | 
| 1154 | 
            -
             | 
| 1155 | 
            -
             | 
| 1156 | 
            -
             | 
| 1157 | 
            -
             | 
| 1158 | 
            -
             | 
| 1159 | 
            -
             | 
| 1160 | 
            -
             | 
| 1161 | 
            -
             | 
| 1162 | 
            -
             | 
| 1163 | 
            -
             | 
| 1164 | 
            -
             | 
| 1165 | 
            -
             | 
| 1166 | 
            -
             | 
| 1167 | 
            -
             | 
| 1168 | 
            -
             | 
| 1169 | 
            -
             | 
| 1170 | 
            -
             | 
| 1171 | 
            -
             | 
| 1261 | 
            +
            	 * The format can be combinations of the following:
         | 
| 1262 | 
            +
            	 * d  - day of month (no leading zero)
         | 
| 1263 | 
            +
            	 * dd - day of month (two digit)
         | 
| 1264 | 
            +
            	 * o  - day of year (no leading zeros)
         | 
| 1265 | 
            +
            	 * oo - day of year (three digit)
         | 
| 1266 | 
            +
            	 * D  - day name short
         | 
| 1267 | 
            +
            	 * DD - day name long
         | 
| 1268 | 
            +
            	 * m  - month of year (no leading zero)
         | 
| 1269 | 
            +
            	 * mm - month of year (two digit)
         | 
| 1270 | 
            +
            	 * M  - month name short
         | 
| 1271 | 
            +
            	 * MM - month name long
         | 
| 1272 | 
            +
            	 * y  - year (two digit)
         | 
| 1273 | 
            +
            	 * yy - year (four digit)
         | 
| 1274 | 
            +
            	 * @ - Unix timestamp (ms since 01/01/1970)
         | 
| 1275 | 
            +
            	 * ! - Windows ticks (100ns since 01/01/0001)
         | 
| 1276 | 
            +
            	 * "..." - literal text
         | 
| 1277 | 
            +
            	 * '' - single quote
         | 
| 1278 | 
            +
            	 *
         | 
| 1279 | 
            +
            	 * @param  format string - the desired format of the date
         | 
| 1280 | 
            +
            	 * @param  date Date - the date value to format
         | 
| 1281 | 
            +
            	 * @param  settings Object - attributes include:
         | 
| 1282 | 
            +
            	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
         | 
| 1283 | 
            +
            	 *					dayNames		string[7] - names of the days from Sunday (optional)
         | 
| 1284 | 
            +
            	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
         | 
| 1285 | 
            +
            	 *					monthNames		string[12] - names of the months (optional)
         | 
| 1286 | 
            +
            	 * @return  string - the date in the above format
         | 
| 1287 | 
            +
            	 */
         | 
| 1172 1288 | 
             
            	formatDate: function (format, date, settings) {
         | 
| 1173 | 
            -
            		if (!date)
         | 
| 1174 | 
            -
            			return  | 
| 1175 | 
            -
            		 | 
| 1176 | 
            -
             | 
| 1177 | 
            -
            		var  | 
| 1178 | 
            -
             | 
| 1179 | 
            -
             | 
| 1180 | 
            -
             | 
| 1181 | 
            -
            			 | 
| 1182 | 
            -
            			 | 
| 1183 | 
            -
             | 
| 1184 | 
            -
             | 
| 1185 | 
            -
             | 
| 1186 | 
            -
             | 
| 1187 | 
            -
             | 
| 1188 | 
            -
             | 
| 1189 | 
            -
            			 | 
| 1190 | 
            -
             | 
| 1191 | 
            -
             | 
| 1192 | 
            -
             | 
| 1193 | 
            -
             | 
| 1194 | 
            -
             | 
| 1195 | 
            -
             | 
| 1196 | 
            -
             | 
| 1197 | 
            -
             | 
| 1198 | 
            -
             | 
| 1199 | 
            -
             | 
| 1200 | 
            -
             | 
| 1201 | 
            -
            			 | 
| 1202 | 
            -
            				 | 
| 1203 | 
            -
             | 
| 1289 | 
            +
            		if (!date) {
         | 
| 1290 | 
            +
            			return "";
         | 
| 1291 | 
            +
            		}
         | 
| 1292 | 
            +
             | 
| 1293 | 
            +
            		var iFormat,
         | 
| 1294 | 
            +
            			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
         | 
| 1295 | 
            +
            			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
         | 
| 1296 | 
            +
            			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
         | 
| 1297 | 
            +
            			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
         | 
| 1298 | 
            +
            			// Check whether a format character is doubled
         | 
| 1299 | 
            +
            			lookAhead = function(match) {
         | 
| 1300 | 
            +
            				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
         | 
| 1301 | 
            +
            				if (matches) {
         | 
| 1302 | 
            +
            					iFormat++;
         | 
| 1303 | 
            +
            				}
         | 
| 1304 | 
            +
            				return matches;
         | 
| 1305 | 
            +
            			},
         | 
| 1306 | 
            +
            			// Format a number, with leading zero if necessary
         | 
| 1307 | 
            +
            			formatNumber = function(match, value, len) {
         | 
| 1308 | 
            +
            				var num = "" + value;
         | 
| 1309 | 
            +
            				if (lookAhead(match)) {
         | 
| 1310 | 
            +
            					while (num.length < len) {
         | 
| 1311 | 
            +
            						num = "0" + num;
         | 
| 1312 | 
            +
            					}
         | 
| 1313 | 
            +
            				}
         | 
| 1314 | 
            +
            				return num;
         | 
| 1315 | 
            +
            			},
         | 
| 1316 | 
            +
            			// Format a name, short or long as requested
         | 
| 1317 | 
            +
            			formatName = function(match, value, shortNames, longNames) {
         | 
| 1318 | 
            +
            				return (lookAhead(match) ? longNames[value] : shortNames[value]);
         | 
| 1319 | 
            +
            			},
         | 
| 1320 | 
            +
            			output = "",
         | 
| 1321 | 
            +
            			literal = false;
         | 
| 1322 | 
            +
             | 
| 1323 | 
            +
            		if (date) {
         | 
| 1324 | 
            +
            			for (iFormat = 0; iFormat < format.length; iFormat++) {
         | 
| 1325 | 
            +
            				if (literal) {
         | 
| 1326 | 
            +
            					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
         | 
| 1204 1327 | 
             
            						literal = false;
         | 
| 1205 | 
            -
            					else
         | 
| 1328 | 
            +
            					} else {
         | 
| 1206 1329 | 
             
            						output += format.charAt(iFormat);
         | 
| 1207 | 
            -
             | 
| 1330 | 
            +
            					}
         | 
| 1331 | 
            +
            				} else {
         | 
| 1208 1332 | 
             
            					switch (format.charAt(iFormat)) {
         | 
| 1209 | 
            -
            						case  | 
| 1210 | 
            -
            							output += formatNumber( | 
| 1333 | 
            +
            						case "d":
         | 
| 1334 | 
            +
            							output += formatNumber("d", date.getDate(), 2);
         | 
| 1211 1335 | 
             
            							break;
         | 
| 1212 | 
            -
            						case  | 
| 1213 | 
            -
            							output += formatName( | 
| 1336 | 
            +
            						case "D":
         | 
| 1337 | 
            +
            							output += formatName("D", date.getDay(), dayNamesShort, dayNames);
         | 
| 1214 1338 | 
             
            							break;
         | 
| 1215 | 
            -
            						case  | 
| 1216 | 
            -
            							output += formatNumber( | 
| 1339 | 
            +
            						case "o":
         | 
| 1340 | 
            +
            							output += formatNumber("o",
         | 
| 1217 1341 | 
             
            								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
         | 
| 1218 1342 | 
             
            							break;
         | 
| 1219 | 
            -
            						case  | 
| 1220 | 
            -
            							output += formatNumber( | 
| 1343 | 
            +
            						case "m":
         | 
| 1344 | 
            +
            							output += formatNumber("m", date.getMonth() + 1, 2);
         | 
| 1221 1345 | 
             
            							break;
         | 
| 1222 | 
            -
            						case  | 
| 1223 | 
            -
            							output += formatName( | 
| 1346 | 
            +
            						case "M":
         | 
| 1347 | 
            +
            							output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
         | 
| 1224 1348 | 
             
            							break;
         | 
| 1225 | 
            -
            						case  | 
| 1226 | 
            -
            							output += (lookAhead( | 
| 1227 | 
            -
            								(date.getYear() % 100 < 10 ?  | 
| 1349 | 
            +
            						case "y":
         | 
| 1350 | 
            +
            							output += (lookAhead("y") ? date.getFullYear() :
         | 
| 1351 | 
            +
            								(date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
         | 
| 1228 1352 | 
             
            							break;
         | 
| 1229 | 
            -
            						case  | 
| 1353 | 
            +
            						case "@":
         | 
| 1230 1354 | 
             
            							output += date.getTime();
         | 
| 1231 1355 | 
             
            							break;
         | 
| 1232 | 
            -
            						case  | 
| 1356 | 
            +
            						case "!":
         | 
| 1233 1357 | 
             
            							output += date.getTime() * 10000 + this._ticksTo1970;
         | 
| 1234 1358 | 
             
            							break;
         | 
| 1235 1359 | 
             
            						case "'":
         | 
| 1236 | 
            -
            							if (lookAhead("'"))
         | 
| 1360 | 
            +
            							if (lookAhead("'")) {
         | 
| 1237 1361 | 
             
            								output += "'";
         | 
| 1238 | 
            -
            							else
         | 
| 1362 | 
            +
            							} else {
         | 
| 1239 1363 | 
             
            								literal = true;
         | 
| 1364 | 
            +
            							}
         | 
| 1240 1365 | 
             
            							break;
         | 
| 1241 1366 | 
             
            						default:
         | 
| 1242 1367 | 
             
            							output += format.charAt(iFormat);
         | 
| 1243 1368 | 
             
            					}
         | 
| 1369 | 
            +
            				}
         | 
| 1244 1370 | 
             
            			}
         | 
| 1371 | 
            +
            		}
         | 
| 1245 1372 | 
             
            		return output;
         | 
| 1246 1373 | 
             
            	},
         | 
| 1247 1374 |  | 
| 1248 1375 | 
             
            	/* Extract all possible characters from the date format. */
         | 
| 1249 1376 | 
             
            	_possibleChars: function (format) {
         | 
| 1250 | 
            -
            		var  | 
| 1251 | 
            -
             | 
| 1252 | 
            -
             | 
| 1253 | 
            -
             | 
| 1254 | 
            -
            			 | 
| 1255 | 
            -
             | 
| 1256 | 
            -
            				 | 
| 1257 | 
            -
             | 
| 1258 | 
            -
             | 
| 1259 | 
            -
             | 
| 1260 | 
            -
            			 | 
| 1261 | 
            -
             | 
| 1377 | 
            +
            		var iFormat,
         | 
| 1378 | 
            +
            			chars = "",
         | 
| 1379 | 
            +
            			literal = false,
         | 
| 1380 | 
            +
            			// Check whether a format character is doubled
         | 
| 1381 | 
            +
            			lookAhead = function(match) {
         | 
| 1382 | 
            +
            				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
         | 
| 1383 | 
            +
            				if (matches) {
         | 
| 1384 | 
            +
            					iFormat++;
         | 
| 1385 | 
            +
            				}
         | 
| 1386 | 
            +
            				return matches;
         | 
| 1387 | 
            +
            			};
         | 
| 1388 | 
            +
             | 
| 1389 | 
            +
            		for (iFormat = 0; iFormat < format.length; iFormat++) {
         | 
| 1390 | 
            +
            			if (literal) {
         | 
| 1391 | 
            +
            				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
         | 
| 1262 1392 | 
             
            					literal = false;
         | 
| 1263 | 
            -
            				else
         | 
| 1393 | 
            +
            				} else {
         | 
| 1264 1394 | 
             
            					chars += format.charAt(iFormat);
         | 
| 1265 | 
            -
             | 
| 1395 | 
            +
            				}
         | 
| 1396 | 
            +
            			} else {
         | 
| 1266 1397 | 
             
            				switch (format.charAt(iFormat)) {
         | 
| 1267 | 
            -
            					case  | 
| 1268 | 
            -
            						chars +=  | 
| 1398 | 
            +
            					case "d": case "m": case "y": case "@":
         | 
| 1399 | 
            +
            						chars += "0123456789";
         | 
| 1269 1400 | 
             
            						break;
         | 
| 1270 | 
            -
            					case  | 
| 1401 | 
            +
            					case "D": case "M":
         | 
| 1271 1402 | 
             
            						return null; // Accept anything
         | 
| 1272 1403 | 
             
            					case "'":
         | 
| 1273 | 
            -
            						if (lookAhead("'"))
         | 
| 1404 | 
            +
            						if (lookAhead("'")) {
         | 
| 1274 1405 | 
             
            							chars += "'";
         | 
| 1275 | 
            -
            						else
         | 
| 1406 | 
            +
            						} else {
         | 
| 1276 1407 | 
             
            							literal = true;
         | 
| 1408 | 
            +
            						}
         | 
| 1277 1409 | 
             
            						break;
         | 
| 1278 1410 | 
             
            					default:
         | 
| 1279 1411 | 
             
            						chars += format.charAt(iFormat);
         | 
| 1280 1412 | 
             
            				}
         | 
| 1413 | 
            +
            			}
         | 
| 1414 | 
            +
            		}
         | 
| 1281 1415 | 
             
            		return chars;
         | 
| 1282 1416 | 
             
            	},
         | 
| 1283 1417 |  | 
| @@ -1289,19 +1423,20 @@ $.extend(Datepicker.prototype, { | |
| 1289 1423 |  | 
| 1290 1424 | 
             
            	/* Parse existing date and initialise date picker. */
         | 
| 1291 1425 | 
             
            	_setDateFromField: function(inst, noDefault) {
         | 
| 1292 | 
            -
            		if (inst.input.val()  | 
| 1426 | 
            +
            		if (inst.input.val() === inst.lastVal) {
         | 
| 1293 1427 | 
             
            			return;
         | 
| 1294 1428 | 
             
            		}
         | 
| 1295 | 
            -
             | 
| 1296 | 
            -
            		var  | 
| 1297 | 
            -
             | 
| 1298 | 
            -
             | 
| 1299 | 
            -
             | 
| 1429 | 
            +
             | 
| 1430 | 
            +
            		var dateFormat = this._get(inst, "dateFormat"),
         | 
| 1431 | 
            +
            			dates = inst.lastVal = inst.input ? inst.input.val() : null,
         | 
| 1432 | 
            +
            			defaultDate = this._getDefaultDate(inst),
         | 
| 1433 | 
            +
            			date = defaultDate,
         | 
| 1434 | 
            +
            			settings = this._getFormatConfig(inst);
         | 
| 1435 | 
            +
             | 
| 1300 1436 | 
             
            		try {
         | 
| 1301 1437 | 
             
            			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
         | 
| 1302 1438 | 
             
            		} catch (event) {
         | 
| 1303 | 
            -
            			 | 
| 1304 | 
            -
            			dates = (noDefault ? '' : dates);
         | 
| 1439 | 
            +
            			dates = (noDefault ? "" : dates);
         | 
| 1305 1440 | 
             
            		}
         | 
| 1306 1441 | 
             
            		inst.selectedDay = date.getDate();
         | 
| 1307 1442 | 
             
            		inst.drawMonth = inst.selectedMonth = date.getMonth();
         | 
| @@ -1315,53 +1450,56 @@ $.extend(Datepicker.prototype, { | |
| 1315 1450 | 
             
            	/* Retrieve the default date shown on opening. */
         | 
| 1316 1451 | 
             
            	_getDefaultDate: function(inst) {
         | 
| 1317 1452 | 
             
            		return this._restrictMinMax(inst,
         | 
| 1318 | 
            -
            			this._determineDate(inst, this._get(inst,  | 
| 1453 | 
            +
            			this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
         | 
| 1319 1454 | 
             
            	},
         | 
| 1320 1455 |  | 
| 1321 1456 | 
             
            	/* A date may be specified as an exact value or a relative one. */
         | 
| 1322 1457 | 
             
            	_determineDate: function(inst, date, defaultDate) {
         | 
| 1323 1458 | 
             
            		var offsetNumeric = function(offset) {
         | 
| 1324 | 
            -
             | 
| 1325 | 
            -
             | 
| 1326 | 
            -
             | 
| 1327 | 
            -
             | 
| 1328 | 
            -
             | 
| 1329 | 
            -
             | 
| 1330 | 
            -
             | 
| 1331 | 
            -
             | 
| 1332 | 
            -
            			}
         | 
| 1333 | 
            -
            			catch (e) {
         | 
| 1334 | 
            -
            				// Ignore
         | 
| 1335 | 
            -
            			}
         | 
| 1336 | 
            -
            			var date = (offset.toLowerCase().match(/^c/) ?
         | 
| 1337 | 
            -
            				$.datepicker._getDate(inst) : null) || new Date();
         | 
| 1338 | 
            -
            			var year = date.getFullYear();
         | 
| 1339 | 
            -
            			var month = date.getMonth();
         | 
| 1340 | 
            -
            			var day = date.getDate();
         | 
| 1341 | 
            -
            			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
         | 
| 1342 | 
            -
            			var matches = pattern.exec(offset);
         | 
| 1343 | 
            -
            			while (matches) {
         | 
| 1344 | 
            -
            				switch (matches[2] || 'd') {
         | 
| 1345 | 
            -
            					case 'd' : case 'D' :
         | 
| 1346 | 
            -
            						day += parseInt(matches[1],10); break;
         | 
| 1347 | 
            -
            					case 'w' : case 'W' :
         | 
| 1348 | 
            -
            						day += parseInt(matches[1],10) * 7; break;
         | 
| 1349 | 
            -
            					case 'm' : case 'M' :
         | 
| 1350 | 
            -
            						month += parseInt(matches[1],10);
         | 
| 1351 | 
            -
            						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
         | 
| 1352 | 
            -
            						break;
         | 
| 1353 | 
            -
            					case 'y': case 'Y' :
         | 
| 1354 | 
            -
            						year += parseInt(matches[1],10);
         | 
| 1355 | 
            -
            						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
         | 
| 1356 | 
            -
            						break;
         | 
| 1459 | 
            +
            				var date = new Date();
         | 
| 1460 | 
            +
            				date.setDate(date.getDate() + offset);
         | 
| 1461 | 
            +
            				return date;
         | 
| 1462 | 
            +
            			},
         | 
| 1463 | 
            +
            			offsetString = function(offset) {
         | 
| 1464 | 
            +
            				try {
         | 
| 1465 | 
            +
            					return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
         | 
| 1466 | 
            +
            						offset, $.datepicker._getFormatConfig(inst));
         | 
| 1357 1467 | 
             
            				}
         | 
| 1358 | 
            -
            				 | 
| 1359 | 
            -
             | 
| 1360 | 
            -
             | 
| 1361 | 
            -
             | 
| 1362 | 
            -
             | 
| 1363 | 
            -
             | 
| 1364 | 
            -
             | 
| 1468 | 
            +
            				catch (e) {
         | 
| 1469 | 
            +
            					// Ignore
         | 
| 1470 | 
            +
            				}
         | 
| 1471 | 
            +
             | 
| 1472 | 
            +
            				var date = (offset.toLowerCase().match(/^c/) ?
         | 
| 1473 | 
            +
            					$.datepicker._getDate(inst) : null) || new Date(),
         | 
| 1474 | 
            +
            					year = date.getFullYear(),
         | 
| 1475 | 
            +
            					month = date.getMonth(),
         | 
| 1476 | 
            +
            					day = date.getDate(),
         | 
| 1477 | 
            +
            					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
         | 
| 1478 | 
            +
            					matches = pattern.exec(offset);
         | 
| 1479 | 
            +
             | 
| 1480 | 
            +
            				while (matches) {
         | 
| 1481 | 
            +
            					switch (matches[2] || "d") {
         | 
| 1482 | 
            +
            						case "d" : case "D" :
         | 
| 1483 | 
            +
            							day += parseInt(matches[1],10); break;
         | 
| 1484 | 
            +
            						case "w" : case "W" :
         | 
| 1485 | 
            +
            							day += parseInt(matches[1],10) * 7; break;
         | 
| 1486 | 
            +
            						case "m" : case "M" :
         | 
| 1487 | 
            +
            							month += parseInt(matches[1],10);
         | 
| 1488 | 
            +
            							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
         | 
| 1489 | 
            +
            							break;
         | 
| 1490 | 
            +
            						case "y": case "Y" :
         | 
| 1491 | 
            +
            							year += parseInt(matches[1],10);
         | 
| 1492 | 
            +
            							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
         | 
| 1493 | 
            +
            							break;
         | 
| 1494 | 
            +
            					}
         | 
| 1495 | 
            +
            					matches = pattern.exec(offset);
         | 
| 1496 | 
            +
            				}
         | 
| 1497 | 
            +
            				return new Date(year, month, day);
         | 
| 1498 | 
            +
            			},
         | 
| 1499 | 
            +
            			newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
         | 
| 1500 | 
            +
            				(typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
         | 
| 1501 | 
            +
             | 
| 1502 | 
            +
            		newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
         | 
| 1365 1503 | 
             
            		if (newDate) {
         | 
| 1366 1504 | 
             
            			newDate.setHours(0);
         | 
| 1367 1505 | 
             
            			newDate.setMinutes(0);
         | 
| @@ -1372,37 +1510,42 @@ $.extend(Datepicker.prototype, { | |
| 1372 1510 | 
             
            	},
         | 
| 1373 1511 |  | 
| 1374 1512 | 
             
            	/* Handle switch to/from daylight saving.
         | 
| 1375 | 
            -
             | 
| 1376 | 
            -
             | 
| 1377 | 
            -
             | 
| 1378 | 
            -
             | 
| 1379 | 
            -
             | 
| 1513 | 
            +
            	 * Hours may be non-zero on daylight saving cut-over:
         | 
| 1514 | 
            +
            	 * > 12 when midnight changeover, but then cannot generate
         | 
| 1515 | 
            +
            	 * midnight datetime, so jump to 1AM, otherwise reset.
         | 
| 1516 | 
            +
            	 * @param  date  (Date) the date to check
         | 
| 1517 | 
            +
            	 * @return  (Date) the corrected date
         | 
| 1518 | 
            +
            	 */
         | 
| 1380 1519 | 
             
            	_daylightSavingAdjust: function(date) {
         | 
| 1381 | 
            -
            		if (!date)  | 
| 1520 | 
            +
            		if (!date) {
         | 
| 1521 | 
            +
            			return null;
         | 
| 1522 | 
            +
            		}
         | 
| 1382 1523 | 
             
            		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
         | 
| 1383 1524 | 
             
            		return date;
         | 
| 1384 1525 | 
             
            	},
         | 
| 1385 1526 |  | 
| 1386 1527 | 
             
            	/* Set the date(s) directly. */
         | 
| 1387 1528 | 
             
            	_setDate: function(inst, date, noChange) {
         | 
| 1388 | 
            -
            		var clear = !date | 
| 1389 | 
            -
             | 
| 1390 | 
            -
             | 
| 1391 | 
            -
             | 
| 1529 | 
            +
            		var clear = !date,
         | 
| 1530 | 
            +
            			origMonth = inst.selectedMonth,
         | 
| 1531 | 
            +
            			origYear = inst.selectedYear,
         | 
| 1532 | 
            +
            			newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
         | 
| 1533 | 
            +
             | 
| 1392 1534 | 
             
            		inst.selectedDay = inst.currentDay = newDate.getDate();
         | 
| 1393 1535 | 
             
            		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
         | 
| 1394 1536 | 
             
            		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
         | 
| 1395 | 
            -
            		if ((origMonth  | 
| 1537 | 
            +
            		if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
         | 
| 1396 1538 | 
             
            			this._notifyChange(inst);
         | 
| 1539 | 
            +
            		}
         | 
| 1397 1540 | 
             
            		this._adjustInstDate(inst);
         | 
| 1398 1541 | 
             
            		if (inst.input) {
         | 
| 1399 | 
            -
            			inst.input.val(clear ?  | 
| 1542 | 
            +
            			inst.input.val(clear ? "" : this._formatDate(inst));
         | 
| 1400 1543 | 
             
            		}
         | 
| 1401 1544 | 
             
            	},
         | 
| 1402 1545 |  | 
| 1403 1546 | 
             
            	/* Retrieve the date(s) directly. */
         | 
| 1404 1547 | 
             
            	_getDate: function(inst) {
         | 
| 1405 | 
            -
            		var startDate = (!inst.currentYear || (inst.input && inst.input.val()  | 
| 1548 | 
            +
            		var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
         | 
| 1406 1549 | 
             
            			this._daylightSavingAdjust(new Date(
         | 
| 1407 1550 | 
             
            			inst.currentYear, inst.currentMonth, inst.currentDay)));
         | 
| 1408 1551 | 
             
            			return startDate;
         | 
| @@ -1412,64 +1555,71 @@ $.extend(Datepicker.prototype, { | |
| 1412 1555 | 
             
            	 * they work with static code transformers like Caja.
         | 
| 1413 1556 | 
             
            	 */
         | 
| 1414 1557 | 
             
            	_attachHandlers: function(inst) {
         | 
| 1415 | 
            -
            		var stepMonths = this._get(inst,  | 
| 1416 | 
            -
             | 
| 1417 | 
            -
            		inst.dpDiv.find( | 
| 1558 | 
            +
            		var stepMonths = this._get(inst, "stepMonths"),
         | 
| 1559 | 
            +
            			id = "#" + inst.id.replace( /\\\\/g, "\\" );
         | 
| 1560 | 
            +
            		inst.dpDiv.find("[data-handler]").map(function () {
         | 
| 1418 1561 | 
             
            			var handler = {
         | 
| 1419 1562 | 
             
            				prev: function () {
         | 
| 1420 | 
            -
            					window[ | 
| 1563 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._adjustDate(id, -stepMonths, "M");
         | 
| 1421 1564 | 
             
            				},
         | 
| 1422 1565 | 
             
            				next: function () {
         | 
| 1423 | 
            -
            					window[ | 
| 1566 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._adjustDate(id, +stepMonths, "M");
         | 
| 1424 1567 | 
             
            				},
         | 
| 1425 1568 | 
             
            				hide: function () {
         | 
| 1426 | 
            -
            					window[ | 
| 1569 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._hideDatepicker();
         | 
| 1427 1570 | 
             
            				},
         | 
| 1428 1571 | 
             
            				today: function () {
         | 
| 1429 | 
            -
            					window[ | 
| 1572 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._gotoToday(id);
         | 
| 1430 1573 | 
             
            				},
         | 
| 1431 1574 | 
             
            				selectDay: function () {
         | 
| 1432 | 
            -
            					window[ | 
| 1575 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
         | 
| 1433 1576 | 
             
            					return false;
         | 
| 1434 1577 | 
             
            				},
         | 
| 1435 1578 | 
             
            				selectMonth: function () {
         | 
| 1436 | 
            -
            					window[ | 
| 1579 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._selectMonthYear(id, this, "M");
         | 
| 1437 1580 | 
             
            					return false;
         | 
| 1438 1581 | 
             
            				},
         | 
| 1439 1582 | 
             
            				selectYear: function () {
         | 
| 1440 | 
            -
            					window[ | 
| 1583 | 
            +
            					window["DP_jQuery_" + dpuuid].datepicker._selectMonthYear(id, this, "Y");
         | 
| 1441 1584 | 
             
            					return false;
         | 
| 1442 1585 | 
             
            				}
         | 
| 1443 1586 | 
             
            			};
         | 
| 1444 | 
            -
            			$(this).bind(this.getAttribute( | 
| 1587 | 
            +
            			$(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
         | 
| 1445 1588 | 
             
            		});
         | 
| 1446 1589 | 
             
            	},
         | 
| 1447 1590 |  | 
| 1448 1591 | 
             
            	/* Generate the HTML for the current state of the date picker. */
         | 
| 1449 1592 | 
             
            	_generateHTML: function(inst) {
         | 
| 1450 | 
            -
            		var  | 
| 1451 | 
            -
             | 
| 1452 | 
            -
            			 | 
| 1453 | 
            -
             | 
| 1454 | 
            -
             | 
| 1455 | 
            -
             | 
| 1456 | 
            -
             | 
| 1457 | 
            -
             | 
| 1458 | 
            -
             | 
| 1459 | 
            -
             | 
| 1460 | 
            -
             | 
| 1461 | 
            -
             | 
| 1462 | 
            -
            			 | 
| 1463 | 
            -
             | 
| 1464 | 
            -
             | 
| 1465 | 
            -
             | 
| 1466 | 
            -
             | 
| 1593 | 
            +
            		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
         | 
| 1594 | 
            +
            			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
         | 
| 1595 | 
            +
            			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
         | 
| 1596 | 
            +
            			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
         | 
| 1597 | 
            +
            			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
         | 
| 1598 | 
            +
            			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
         | 
| 1599 | 
            +
            			tempDate = new Date(),
         | 
| 1600 | 
            +
            			today = this._daylightSavingAdjust(
         | 
| 1601 | 
            +
            				new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
         | 
| 1602 | 
            +
            			isRTL = this._get(inst, "isRTL"),
         | 
| 1603 | 
            +
            			showButtonPanel = this._get(inst, "showButtonPanel"),
         | 
| 1604 | 
            +
            			hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
         | 
| 1605 | 
            +
            			navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
         | 
| 1606 | 
            +
            			numMonths = this._getNumberOfMonths(inst),
         | 
| 1607 | 
            +
            			showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
         | 
| 1608 | 
            +
            			stepMonths = this._get(inst, "stepMonths"),
         | 
| 1609 | 
            +
            			isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
         | 
| 1610 | 
            +
            			currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
         | 
| 1611 | 
            +
            				new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
         | 
| 1612 | 
            +
            			minDate = this._getMinMaxDate(inst, "min"),
         | 
| 1613 | 
            +
            			maxDate = this._getMinMaxDate(inst, "max"),
         | 
| 1614 | 
            +
            			drawMonth = inst.drawMonth - showCurrentAtPos,
         | 
| 1615 | 
            +
            			drawYear = inst.drawYear;
         | 
| 1616 | 
            +
             | 
| 1467 1617 | 
             
            		if (drawMonth < 0) {
         | 
| 1468 1618 | 
             
            			drawMonth += 12;
         | 
| 1469 1619 | 
             
            			drawYear--;
         | 
| 1470 1620 | 
             
            		}
         | 
| 1471 1621 | 
             
            		if (maxDate) {
         | 
| 1472 | 
            -
            			 | 
| 1622 | 
            +
            			maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
         | 
| 1473 1623 | 
             
            				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
         | 
| 1474 1624 | 
             
            			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
         | 
| 1475 1625 | 
             
            			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
         | 
| @@ -1482,133 +1632,142 @@ $.extend(Datepicker.prototype, { | |
| 1482 1632 | 
             
            		}
         | 
| 1483 1633 | 
             
            		inst.drawMonth = drawMonth;
         | 
| 1484 1634 | 
             
            		inst.drawYear = drawYear;
         | 
| 1485 | 
            -
             | 
| 1635 | 
            +
             | 
| 1636 | 
            +
            		prevText = this._get(inst, "prevText");
         | 
| 1486 1637 | 
             
            		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
         | 
| 1487 1638 | 
             
            			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
         | 
| 1488 1639 | 
             
            			this._getFormatConfig(inst)));
         | 
| 1489 | 
            -
             | 
| 1490 | 
            -
             | 
| 1491 | 
            -
            			 | 
| 1492 | 
            -
            			 | 
| 1493 | 
            -
             | 
| 1640 | 
            +
             | 
| 1641 | 
            +
            		prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
         | 
| 1642 | 
            +
            			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
         | 
| 1643 | 
            +
            			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
         | 
| 1644 | 
            +
            			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
         | 
| 1645 | 
            +
             | 
| 1646 | 
            +
            		nextText = this._get(inst, "nextText");
         | 
| 1494 1647 | 
             
            		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
         | 
| 1495 1648 | 
             
            			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
         | 
| 1496 1649 | 
             
            			this._getFormatConfig(inst)));
         | 
| 1497 | 
            -
             | 
| 1498 | 
            -
             | 
| 1499 | 
            -
            			 | 
| 1500 | 
            -
            			 | 
| 1501 | 
            -
             | 
| 1502 | 
            -
             | 
| 1650 | 
            +
             | 
| 1651 | 
            +
            		next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
         | 
| 1652 | 
            +
            			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
         | 
| 1653 | 
            +
            			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
         | 
| 1654 | 
            +
            			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
         | 
| 1655 | 
            +
             | 
| 1656 | 
            +
            		currentText = this._get(inst, "currentText");
         | 
| 1657 | 
            +
            		gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
         | 
| 1503 1658 | 
             
            		currentText = (!navigationAsDateFormat ? currentText :
         | 
| 1504 1659 | 
             
            			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
         | 
| 1505 | 
            -
             | 
| 1506 | 
            -
             | 
| 1507 | 
            -
             | 
| 1508 | 
            -
             | 
| 1509 | 
            -
             | 
| 1510 | 
            -
             | 
| 1660 | 
            +
             | 
| 1661 | 
            +
            		controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
         | 
| 1662 | 
            +
            			this._get(inst, "closeText") + "</button>" : "");
         | 
| 1663 | 
            +
             | 
| 1664 | 
            +
            		buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
         | 
| 1665 | 
            +
            			(this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
         | 
| 1666 | 
            +
            			">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
         | 
| 1667 | 
            +
             | 
| 1668 | 
            +
            		firstDay = parseInt(this._get(inst, "firstDay"),10);
         | 
| 1511 1669 | 
             
            		firstDay = (isNaN(firstDay) ? 0 : firstDay);
         | 
| 1512 | 
            -
             | 
| 1513 | 
            -
            		 | 
| 1514 | 
            -
            		 | 
| 1515 | 
            -
            		 | 
| 1516 | 
            -
            		 | 
| 1517 | 
            -
            		 | 
| 1518 | 
            -
            		 | 
| 1519 | 
            -
            		 | 
| 1520 | 
            -
            		 | 
| 1521 | 
            -
            		 | 
| 1522 | 
            -
            		 | 
| 1523 | 
            -
            		 | 
| 1524 | 
            -
            		for ( | 
| 1525 | 
            -
            			 | 
| 1670 | 
            +
             | 
| 1671 | 
            +
            		showWeek = this._get(inst, "showWeek");
         | 
| 1672 | 
            +
            		dayNames = this._get(inst, "dayNames");
         | 
| 1673 | 
            +
            		dayNamesMin = this._get(inst, "dayNamesMin");
         | 
| 1674 | 
            +
            		monthNames = this._get(inst, "monthNames");
         | 
| 1675 | 
            +
            		monthNamesShort = this._get(inst, "monthNamesShort");
         | 
| 1676 | 
            +
            		beforeShowDay = this._get(inst, "beforeShowDay");
         | 
| 1677 | 
            +
            		showOtherMonths = this._get(inst, "showOtherMonths");
         | 
| 1678 | 
            +
            		selectOtherMonths = this._get(inst, "selectOtherMonths");
         | 
| 1679 | 
            +
            		defaultDate = this._getDefaultDate(inst);
         | 
| 1680 | 
            +
            		html = "";
         | 
| 1681 | 
            +
            		dow;
         | 
| 1682 | 
            +
            		for (row = 0; row < numMonths[0]; row++) {
         | 
| 1683 | 
            +
            			group = "";
         | 
| 1526 1684 | 
             
            			this.maxRows = 4;
         | 
| 1527 | 
            -
            			for ( | 
| 1528 | 
            -
            				 | 
| 1529 | 
            -
            				 | 
| 1530 | 
            -
            				 | 
| 1685 | 
            +
            			for (col = 0; col < numMonths[1]; col++) {
         | 
| 1686 | 
            +
            				selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
         | 
| 1687 | 
            +
            				cornerClass = " ui-corner-all";
         | 
| 1688 | 
            +
            				calender = "";
         | 
| 1531 1689 | 
             
            				if (isMultiMonth) {
         | 
| 1532 | 
            -
            					calender +=  | 
| 1533 | 
            -
            					if (numMonths[1] > 1)
         | 
| 1690 | 
            +
            					calender += "<div class='ui-datepicker-group";
         | 
| 1691 | 
            +
            					if (numMonths[1] > 1) {
         | 
| 1534 1692 | 
             
            						switch (col) {
         | 
| 1535 | 
            -
            							case 0: calender +=  | 
| 1536 | 
            -
            								cornerClass =  | 
| 1537 | 
            -
            							case numMonths[1]-1: calender +=  | 
| 1538 | 
            -
            								cornerClass =  | 
| 1539 | 
            -
            							default: calender +=  | 
| 1693 | 
            +
            							case 0: calender += " ui-datepicker-group-first";
         | 
| 1694 | 
            +
            								cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
         | 
| 1695 | 
            +
            							case numMonths[1]-1: calender += " ui-datepicker-group-last";
         | 
| 1696 | 
            +
            								cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
         | 
| 1697 | 
            +
            							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
         | 
| 1540 1698 | 
             
            						}
         | 
| 1541 | 
            -
            					 | 
| 1699 | 
            +
            					}
         | 
| 1700 | 
            +
            					calender += "'>";
         | 
| 1542 1701 | 
             
            				}
         | 
| 1543 | 
            -
            				calender +=  | 
| 1544 | 
            -
            					(/all|left/.test(cornerClass) && row  | 
| 1545 | 
            -
            					(/all|right/.test(cornerClass) && row  | 
| 1702 | 
            +
            				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
         | 
| 1703 | 
            +
            					(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
         | 
| 1704 | 
            +
            					(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
         | 
| 1546 1705 | 
             
            					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
         | 
| 1547 1706 | 
             
            					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
         | 
| 1548 | 
            -
            					 | 
| 1549 | 
            -
            					 | 
| 1550 | 
            -
            				 | 
| 1551 | 
            -
            				for ( | 
| 1552 | 
            -
            					 | 
| 1553 | 
            -
            					thead +=  | 
| 1554 | 
            -
            						 | 
| 1707 | 
            +
            					"</div><table class='ui-datepicker-calendar'><thead>" +
         | 
| 1708 | 
            +
            					"<tr>";
         | 
| 1709 | 
            +
            				thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
         | 
| 1710 | 
            +
            				for (dow = 0; dow < 7; dow++) { // days of the week
         | 
| 1711 | 
            +
            					day = (dow + firstDay) % 7;
         | 
| 1712 | 
            +
            					thead += "<th" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
         | 
| 1713 | 
            +
            						"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
         | 
| 1555 1714 | 
             
            				}
         | 
| 1556 | 
            -
            				calender += thead +  | 
| 1557 | 
            -
            				 | 
| 1558 | 
            -
            				if (drawYear  | 
| 1715 | 
            +
            				calender += thead + "</tr></thead><tbody>";
         | 
| 1716 | 
            +
            				daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
         | 
| 1717 | 
            +
            				if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
         | 
| 1559 1718 | 
             
            					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
         | 
| 1560 | 
            -
            				 | 
| 1561 | 
            -
            				 | 
| 1562 | 
            -
            				 | 
| 1719 | 
            +
            				}
         | 
| 1720 | 
            +
            				leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
         | 
| 1721 | 
            +
            				curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
         | 
| 1722 | 
            +
            				numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
         | 
| 1563 1723 | 
             
            				this.maxRows = numRows;
         | 
| 1564 | 
            -
            				 | 
| 1565 | 
            -
            				for ( | 
| 1566 | 
            -
            					calender +=  | 
| 1567 | 
            -
            					 | 
| 1568 | 
            -
            						this._get(inst,  | 
| 1569 | 
            -
            					for ( | 
| 1570 | 
            -
            						 | 
| 1571 | 
            -
            							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true,  | 
| 1572 | 
            -
            						 | 
| 1573 | 
            -
            						 | 
| 1724 | 
            +
            				printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
         | 
| 1725 | 
            +
            				for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
         | 
| 1726 | 
            +
            					calender += "<tr>";
         | 
| 1727 | 
            +
            					tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
         | 
| 1728 | 
            +
            						this._get(inst, "calculateWeek")(printDate) + "</td>");
         | 
| 1729 | 
            +
            					for (dow = 0; dow < 7; dow++) { // create date picker days
         | 
| 1730 | 
            +
            						daySettings = (beforeShowDay ?
         | 
| 1731 | 
            +
            							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
         | 
| 1732 | 
            +
            						otherMonth = (printDate.getMonth() !== drawMonth);
         | 
| 1733 | 
            +
            						unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
         | 
| 1574 1734 | 
             
            							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
         | 
| 1575 | 
            -
            						tbody +=  | 
| 1576 | 
            -
            							((dow + firstDay + 6) % 7 >= 5 ?  | 
| 1577 | 
            -
            							(otherMonth ?  | 
| 1578 | 
            -
            							((printDate.getTime()  | 
| 1579 | 
            -
            							(defaultDate.getTime()  | 
| 1735 | 
            +
            						tbody += "<td class='" +
         | 
| 1736 | 
            +
            							((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
         | 
| 1737 | 
            +
            							(otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
         | 
| 1738 | 
            +
            							((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
         | 
| 1739 | 
            +
            							(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
         | 
| 1580 1740 | 
             
            							// or defaultDate is current printedDate and defaultDate is selectedDate
         | 
| 1581 | 
            -
            							 | 
| 1582 | 
            -
            							(unselectable ?  | 
| 1583 | 
            -
            							(otherMonth && !showOtherMonths ?  | 
| 1584 | 
            -
            							(printDate.getTime()  | 
| 1585 | 
            -
            							(printDate.getTime()  | 
| 1586 | 
            -
            							((!otherMonth || showOtherMonths) && daySettings[2] ?  | 
| 1587 | 
            -
            							(unselectable ?  | 
| 1588 | 
            -
            							(otherMonth && !showOtherMonths ?  | 
| 1589 | 
            -
            							(unselectable ?  | 
| 1590 | 
            -
            							(printDate.getTime()  | 
| 1591 | 
            -
            							(printDate.getTime()  | 
| 1592 | 
            -
            							(otherMonth ?  | 
| 1593 | 
            -
            							' | 
| 1741 | 
            +
            							" " + this._dayOverClass : "") + // highlight selected day
         | 
| 1742 | 
            +
            							(unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") +  // highlight unselectable days
         | 
| 1743 | 
            +
            							(otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
         | 
| 1744 | 
            +
            							(printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
         | 
| 1745 | 
            +
            							(printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
         | 
| 1746 | 
            +
            							((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2] + "'" : "") + // cell title
         | 
| 1747 | 
            +
            							(unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
         | 
| 1748 | 
            +
            							(otherMonth && !showOtherMonths ? " " : // display for other months
         | 
| 1749 | 
            +
            							(unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
         | 
| 1750 | 
            +
            							(printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
         | 
| 1751 | 
            +
            							(printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
         | 
| 1752 | 
            +
            							(otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
         | 
| 1753 | 
            +
            							"' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
         | 
| 1594 1754 | 
             
            						printDate.setDate(printDate.getDate() + 1);
         | 
| 1595 1755 | 
             
            						printDate = this._daylightSavingAdjust(printDate);
         | 
| 1596 1756 | 
             
            					}
         | 
| 1597 | 
            -
            					calender += tbody +  | 
| 1757 | 
            +
            					calender += tbody + "</tr>";
         | 
| 1598 1758 | 
             
            				}
         | 
| 1599 1759 | 
             
            				drawMonth++;
         | 
| 1600 1760 | 
             
            				if (drawMonth > 11) {
         | 
| 1601 1761 | 
             
            					drawMonth = 0;
         | 
| 1602 1762 | 
             
            					drawYear++;
         | 
| 1603 1763 | 
             
            				}
         | 
| 1604 | 
            -
            				calender +=  | 
| 1605 | 
            -
            							((numMonths[0] > 0 && col  | 
| 1764 | 
            +
            				calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
         | 
| 1765 | 
            +
            							((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
         | 
| 1606 1766 | 
             
            				group += calender;
         | 
| 1607 1767 | 
             
            			}
         | 
| 1608 1768 | 
             
            			html += group;
         | 
| 1609 1769 | 
             
            		}
         | 
| 1610 | 
            -
            		html += buttonPanel | 
| 1611 | 
            -
            			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
         | 
| 1770 | 
            +
            		html += buttonPanel;
         | 
| 1612 1771 | 
             
            		inst._keyEvent = false;
         | 
| 1613 1772 | 
             
            		return html;
         | 
| 1614 1773 | 
             
            	},
         | 
| @@ -1616,108 +1775,116 @@ $.extend(Datepicker.prototype, { | |
| 1616 1775 | 
             
            	/* Generate the month and year header. */
         | 
| 1617 1776 | 
             
            	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
         | 
| 1618 1777 | 
             
            			secondary, monthNames, monthNamesShort) {
         | 
| 1619 | 
            -
             | 
| 1620 | 
            -
            		var  | 
| 1621 | 
            -
             | 
| 1622 | 
            -
             | 
| 1623 | 
            -
             | 
| 1778 | 
            +
             | 
| 1779 | 
            +
            		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
         | 
| 1780 | 
            +
            			changeMonth = this._get(inst, "changeMonth"),
         | 
| 1781 | 
            +
            			changeYear = this._get(inst, "changeYear"),
         | 
| 1782 | 
            +
            			showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
         | 
| 1783 | 
            +
            			html = "<div class='ui-datepicker-title'>",
         | 
| 1784 | 
            +
            			monthHtml = "";
         | 
| 1785 | 
            +
             | 
| 1624 1786 | 
             
            		// month selection
         | 
| 1625 | 
            -
            		if (secondary || !changeMonth)
         | 
| 1626 | 
            -
            			monthHtml +=  | 
| 1627 | 
            -
            		else {
         | 
| 1628 | 
            -
            			 | 
| 1629 | 
            -
            			 | 
| 1630 | 
            -
            			monthHtml +=  | 
| 1631 | 
            -
            			for ( | 
| 1632 | 
            -
            				if ((!inMinYear || month >= minDate.getMonth()) &&
         | 
| 1633 | 
            -
             | 
| 1634 | 
            -
             | 
| 1635 | 
            -
            						 | 
| 1636 | 
            -
             | 
| 1787 | 
            +
            		if (secondary || !changeMonth) {
         | 
| 1788 | 
            +
            			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
         | 
| 1789 | 
            +
            		} else {
         | 
| 1790 | 
            +
            			inMinYear = (minDate && minDate.getFullYear() === drawYear);
         | 
| 1791 | 
            +
            			inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
         | 
| 1792 | 
            +
            			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
         | 
| 1793 | 
            +
            			for ( month = 0; month < 12; month++) {
         | 
| 1794 | 
            +
            				if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
         | 
| 1795 | 
            +
            					monthHtml += "<option value='" + month + "'" +
         | 
| 1796 | 
            +
            						(month === drawMonth ? " selected='selected'" : "") +
         | 
| 1797 | 
            +
            						">" + monthNamesShort[month] + "</option>";
         | 
| 1798 | 
            +
            				}
         | 
| 1637 1799 | 
             
            			}
         | 
| 1638 | 
            -
            			monthHtml +=  | 
| 1800 | 
            +
            			monthHtml += "</select>";
         | 
| 1801 | 
            +
            		}
         | 
| 1802 | 
            +
             | 
| 1803 | 
            +
            		if (!showMonthAfterYear) {
         | 
| 1804 | 
            +
            			html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : "");
         | 
| 1639 1805 | 
             
            		}
         | 
| 1640 | 
            -
             | 
| 1641 | 
            -
            			html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : '');
         | 
| 1806 | 
            +
             | 
| 1642 1807 | 
             
            		// year selection
         | 
| 1643 1808 | 
             
            		if ( !inst.yearshtml ) {
         | 
| 1644 | 
            -
            			inst.yearshtml =  | 
| 1645 | 
            -
            			if (secondary || !changeYear)
         | 
| 1646 | 
            -
            				html +=  | 
| 1647 | 
            -
            			else {
         | 
| 1809 | 
            +
            			inst.yearshtml = "";
         | 
| 1810 | 
            +
            			if (secondary || !changeYear) {
         | 
| 1811 | 
            +
            				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
         | 
| 1812 | 
            +
            			} else {
         | 
| 1648 1813 | 
             
            				// determine range of years to display
         | 
| 1649 | 
            -
            				 | 
| 1650 | 
            -
            				 | 
| 1651 | 
            -
            				 | 
| 1652 | 
            -
            					var year = (value.match(/c[ | 
| 1653 | 
            -
            						(value.match(/[ | 
| 1814 | 
            +
            				years = this._get(inst, "yearRange").split(":");
         | 
| 1815 | 
            +
            				thisYear = new Date().getFullYear();
         | 
| 1816 | 
            +
            				determineYear = function(value) {
         | 
| 1817 | 
            +
            					var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
         | 
| 1818 | 
            +
            						(value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
         | 
| 1654 1819 | 
             
            						parseInt(value, 10)));
         | 
| 1655 1820 | 
             
            					return (isNaN(year) ? thisYear : year);
         | 
| 1656 1821 | 
             
            				};
         | 
| 1657 | 
            -
            				 | 
| 1658 | 
            -
            				 | 
| 1822 | 
            +
            				year = determineYear(years[0]);
         | 
| 1823 | 
            +
            				endYear = Math.max(year, determineYear(years[1] || ""));
         | 
| 1659 1824 | 
             
            				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
         | 
| 1660 1825 | 
             
            				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
         | 
| 1661 | 
            -
            				inst.yearshtml +=  | 
| 1826 | 
            +
            				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
         | 
| 1662 1827 | 
             
            				for (; year <= endYear; year++) {
         | 
| 1663 | 
            -
            					inst.yearshtml +=  | 
| 1664 | 
            -
            						(year  | 
| 1665 | 
            -
            						 | 
| 1828 | 
            +
            					inst.yearshtml += "<option value='" + year + "'" +
         | 
| 1829 | 
            +
            						(year === drawYear ? " selected='selected'" : "") +
         | 
| 1830 | 
            +
            						">" + year + "</option>";
         | 
| 1666 1831 | 
             
            				}
         | 
| 1667 | 
            -
            				inst.yearshtml +=  | 
| 1832 | 
            +
            				inst.yearshtml += "</select>";
         | 
| 1668 1833 |  | 
| 1669 1834 | 
             
            				html += inst.yearshtml;
         | 
| 1670 1835 | 
             
            				inst.yearshtml = null;
         | 
| 1671 1836 | 
             
            			}
         | 
| 1672 1837 | 
             
            		}
         | 
| 1673 | 
            -
             | 
| 1674 | 
            -
            		 | 
| 1675 | 
            -
             | 
| 1676 | 
            -
             | 
| 1838 | 
            +
             | 
| 1839 | 
            +
            		html += this._get(inst, "yearSuffix");
         | 
| 1840 | 
            +
            		if (showMonthAfterYear) {
         | 
| 1841 | 
            +
            			html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml;
         | 
| 1842 | 
            +
            		}
         | 
| 1843 | 
            +
            		html += "</div>"; // Close datepicker_header
         | 
| 1677 1844 | 
             
            		return html;
         | 
| 1678 1845 | 
             
            	},
         | 
| 1679 1846 |  | 
| 1680 1847 | 
             
            	/* Adjust one of the date sub-fields. */
         | 
| 1681 1848 | 
             
            	_adjustInstDate: function(inst, offset, period) {
         | 
| 1682 | 
            -
            		var year = inst.drawYear + (period  | 
| 1683 | 
            -
             | 
| 1684 | 
            -
             | 
| 1685 | 
            -
            			 | 
| 1686 | 
            -
             | 
| 1687 | 
            -
            			this._daylightSavingAdjust(new Date(year, month, day)));
         | 
| 1849 | 
            +
            		var year = inst.drawYear + (period === "Y" ? offset : 0),
         | 
| 1850 | 
            +
            			month = inst.drawMonth + (period === "M" ? offset : 0),
         | 
| 1851 | 
            +
            			day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
         | 
| 1852 | 
            +
            			date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
         | 
| 1853 | 
            +
             | 
| 1688 1854 | 
             
            		inst.selectedDay = date.getDate();
         | 
| 1689 1855 | 
             
            		inst.drawMonth = inst.selectedMonth = date.getMonth();
         | 
| 1690 1856 | 
             
            		inst.drawYear = inst.selectedYear = date.getFullYear();
         | 
| 1691 | 
            -
            		if (period  | 
| 1857 | 
            +
            		if (period === "M" || period === "Y") {
         | 
| 1692 1858 | 
             
            			this._notifyChange(inst);
         | 
| 1859 | 
            +
            		}
         | 
| 1693 1860 | 
             
            	},
         | 
| 1694 1861 |  | 
| 1695 1862 | 
             
            	/* Ensure a date is within any min/max bounds. */
         | 
| 1696 1863 | 
             
            	_restrictMinMax: function(inst, date) {
         | 
| 1697 | 
            -
            		var minDate = this._getMinMaxDate(inst,  | 
| 1698 | 
            -
             | 
| 1699 | 
            -
             | 
| 1700 | 
            -
            		 | 
| 1701 | 
            -
            		return newDate;
         | 
| 1864 | 
            +
            		var minDate = this._getMinMaxDate(inst, "min"),
         | 
| 1865 | 
            +
            			maxDate = this._getMinMaxDate(inst, "max"),
         | 
| 1866 | 
            +
            			newDate = (minDate && date < minDate ? minDate : date);
         | 
| 1867 | 
            +
            		return (maxDate && newDate > maxDate ? maxDate : newDate);
         | 
| 1702 1868 | 
             
            	},
         | 
| 1703 1869 |  | 
| 1704 1870 | 
             
            	/* Notify change of month/year. */
         | 
| 1705 1871 | 
             
            	_notifyChange: function(inst) {
         | 
| 1706 | 
            -
            		var onChange = this._get(inst,  | 
| 1707 | 
            -
            		if (onChange)
         | 
| 1872 | 
            +
            		var onChange = this._get(inst, "onChangeMonthYear");
         | 
| 1873 | 
            +
            		if (onChange) {
         | 
| 1708 1874 | 
             
            			onChange.apply((inst.input ? inst.input[0] : null),
         | 
| 1709 1875 | 
             
            				[inst.selectedYear, inst.selectedMonth + 1, inst]);
         | 
| 1876 | 
            +
            		}
         | 
| 1710 1877 | 
             
            	},
         | 
| 1711 1878 |  | 
| 1712 1879 | 
             
            	/* Determine the number of months to show. */
         | 
| 1713 1880 | 
             
            	_getNumberOfMonths: function(inst) {
         | 
| 1714 | 
            -
            		var numMonths = this._get(inst,  | 
| 1715 | 
            -
            		return (numMonths == null ? [1, 1] : (typeof numMonths  | 
| 1881 | 
            +
            		var numMonths = this._get(inst, "numberOfMonths");
         | 
| 1882 | 
            +
            		return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
         | 
| 1716 1883 | 
             
            	},
         | 
| 1717 1884 |  | 
| 1718 1885 | 
             
            	/* Determine the current maximum date - ensure no time components are set. */
         | 
| 1719 1886 | 
             
            	_getMinMaxDate: function(inst, minMax) {
         | 
| 1720 | 
            -
            		return this._determineDate(inst, this._get(inst, minMax +  | 
| 1887 | 
            +
            		return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
         | 
| 1721 1888 | 
             
            	},
         | 
| 1722 1889 |  | 
| 1723 1890 | 
             
            	/* Find the number of days in a given month. */
         | 
| @@ -1732,30 +1899,45 @@ $.extend(Datepicker.prototype, { | |
| 1732 1899 |  | 
| 1733 1900 | 
             
            	/* Determines if we should allow a "next/prev" month display change. */
         | 
| 1734 1901 | 
             
            	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
         | 
| 1735 | 
            -
            		var numMonths = this._getNumberOfMonths(inst) | 
| 1736 | 
            -
             | 
| 1902 | 
            +
            		var numMonths = this._getNumberOfMonths(inst),
         | 
| 1903 | 
            +
            			date = this._daylightSavingAdjust(new Date(curYear,
         | 
| 1737 1904 | 
             
            			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
         | 
| 1738 | 
            -
             | 
| 1905 | 
            +
             | 
| 1906 | 
            +
            		if (offset < 0) {
         | 
| 1739 1907 | 
             
            			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
         | 
| 1908 | 
            +
            		}
         | 
| 1740 1909 | 
             
            		return this._isInRange(inst, date);
         | 
| 1741 1910 | 
             
            	},
         | 
| 1742 1911 |  | 
| 1743 1912 | 
             
            	/* Is the given date in the accepted range? */
         | 
| 1744 1913 | 
             
            	_isInRange: function(inst, date) {
         | 
| 1745 | 
            -
            		var  | 
| 1746 | 
            -
             | 
| 1914 | 
            +
            		var yearSplit, currentYear,
         | 
| 1915 | 
            +
            			minDate = this._getMinMaxDate(inst, "min"),
         | 
| 1916 | 
            +
            			maxDate = this._getMinMaxDate(inst, "max"),
         | 
| 1917 | 
            +
            			minYear = null,
         | 
| 1918 | 
            +
            			maxYear = null,
         | 
| 1919 | 
            +
            			years = this._get(inst, "yearRange");
         | 
| 1920 | 
            +
            			if (years){
         | 
| 1921 | 
            +
            				yearSplit = years.split(":");
         | 
| 1922 | 
            +
            				currentYear = new Date().getFullYear();
         | 
| 1923 | 
            +
            				minYear = parseInt(yearSplit[0], 10) + currentYear;
         | 
| 1924 | 
            +
            				maxYear = parseInt(yearSplit[1], 10) + currentYear;
         | 
| 1925 | 
            +
            			}
         | 
| 1926 | 
            +
             | 
| 1747 1927 | 
             
            		return ((!minDate || date.getTime() >= minDate.getTime()) &&
         | 
| 1748 | 
            -
            			(!maxDate || date.getTime() <= maxDate.getTime()) | 
| 1928 | 
            +
            			(!maxDate || date.getTime() <= maxDate.getTime()) &&
         | 
| 1929 | 
            +
            			(!minYear || date.getFullYear() >= minYear) &&
         | 
| 1930 | 
            +
            			(!maxYear || date.getFullYear() <= maxYear));
         | 
| 1749 1931 | 
             
            	},
         | 
| 1750 1932 |  | 
| 1751 1933 | 
             
            	/* Provide the configuration settings for formatting/parsing. */
         | 
| 1752 1934 | 
             
            	_getFormatConfig: function(inst) {
         | 
| 1753 | 
            -
            		var shortYearCutoff = this._get(inst,  | 
| 1754 | 
            -
            		shortYearCutoff = (typeof shortYearCutoff  | 
| 1935 | 
            +
            		var shortYearCutoff = this._get(inst, "shortYearCutoff");
         | 
| 1936 | 
            +
            		shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
         | 
| 1755 1937 | 
             
            			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
         | 
| 1756 1938 | 
             
            		return {shortYearCutoff: shortYearCutoff,
         | 
| 1757 | 
            -
            			dayNamesShort: this._get(inst,  | 
| 1758 | 
            -
            			monthNamesShort: this._get(inst,  | 
| 1939 | 
            +
            			dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
         | 
| 1940 | 
            +
            			monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
         | 
| 1759 1941 | 
             
            	},
         | 
| 1760 1942 |  | 
| 1761 1943 | 
             
            	/* Format the given date for display. */
         | 
| @@ -1765,10 +1947,10 @@ $.extend(Datepicker.prototype, { | |
| 1765 1947 | 
             
            			inst.currentMonth = inst.selectedMonth;
         | 
| 1766 1948 | 
             
            			inst.currentYear = inst.selectedYear;
         | 
| 1767 1949 | 
             
            		}
         | 
| 1768 | 
            -
            		var date = (day ? (typeof day  | 
| 1950 | 
            +
            		var date = (day ? (typeof day === "object" ? day :
         | 
| 1769 1951 | 
             
            			this._daylightSavingAdjust(new Date(year, month, day))) :
         | 
| 1770 1952 | 
             
            			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
         | 
| 1771 | 
            -
            		return this.formatDate(this._get(inst,  | 
| 1953 | 
            +
            		return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
         | 
| 1772 1954 | 
             
            	}
         | 
| 1773 1955 | 
             
            });
         | 
| 1774 1956 |  | 
| @@ -1778,18 +1960,26 @@ $.extend(Datepicker.prototype, { | |
| 1778 1960 | 
             
             * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
         | 
| 1779 1961 | 
             
             */
         | 
| 1780 1962 | 
             
            function bindHover(dpDiv) {
         | 
| 1781 | 
            -
            	var selector =  | 
| 1782 | 
            -
            	return dpDiv.delegate(selector,  | 
| 1783 | 
            -
            			$(this).removeClass( | 
| 1784 | 
            -
            			if (this.className.indexOf( | 
| 1785 | 
            -
             | 
| 1963 | 
            +
            	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
         | 
| 1964 | 
            +
            	return dpDiv.delegate(selector, "mouseout", function() {
         | 
| 1965 | 
            +
            			$(this).removeClass("ui-state-hover");
         | 
| 1966 | 
            +
            			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
         | 
| 1967 | 
            +
            				$(this).removeClass("ui-datepicker-prev-hover");
         | 
| 1968 | 
            +
            			}
         | 
| 1969 | 
            +
            			if (this.className.indexOf("ui-datepicker-next") !== -1) {
         | 
| 1970 | 
            +
            				$(this).removeClass("ui-datepicker-next-hover");
         | 
| 1971 | 
            +
            			}
         | 
| 1786 1972 | 
             
            		})
         | 
| 1787 | 
            -
            		.delegate(selector,  | 
| 1973 | 
            +
            		.delegate(selector, "mouseover", function(){
         | 
| 1788 1974 | 
             
            			if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
         | 
| 1789 | 
            -
            				$(this).parents( | 
| 1790 | 
            -
            				$(this).addClass( | 
| 1791 | 
            -
            				if (this.className.indexOf( | 
| 1792 | 
            -
             | 
| 1975 | 
            +
            				$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
         | 
| 1976 | 
            +
            				$(this).addClass("ui-state-hover");
         | 
| 1977 | 
            +
            				if (this.className.indexOf("ui-datepicker-prev") !== -1) {
         | 
| 1978 | 
            +
            					$(this).addClass("ui-datepicker-prev-hover");
         | 
| 1979 | 
            +
            				}
         | 
| 1980 | 
            +
            				if (this.className.indexOf("ui-datepicker-next") !== -1) {
         | 
| 1981 | 
            +
            					$(this).addClass("ui-datepicker-next-hover");
         | 
| 1982 | 
            +
            				}
         | 
| 1793 1983 | 
             
            			}
         | 
| 1794 1984 | 
             
            		});
         | 
| 1795 1985 | 
             
            }
         | 
| @@ -1797,15 +1987,17 @@ function bindHover(dpDiv) { | |
| 1797 1987 | 
             
            /* jQuery extend now ignores nulls! */
         | 
| 1798 1988 | 
             
            function extendRemove(target, props) {
         | 
| 1799 1989 | 
             
            	$.extend(target, props);
         | 
| 1800 | 
            -
            	for (var name in props)
         | 
| 1801 | 
            -
            		if (props[name] == null  | 
| 1990 | 
            +
            	for (var name in props) {
         | 
| 1991 | 
            +
            		if (props[name] == null) {
         | 
| 1802 1992 | 
             
            			target[name] = props[name];
         | 
| 1993 | 
            +
            		}
         | 
| 1994 | 
            +
            	}
         | 
| 1803 1995 | 
             
            	return target;
         | 
| 1804 | 
            -
            } | 
| 1996 | 
            +
            }
         | 
| 1805 1997 |  | 
| 1806 1998 | 
             
            /* Invoke the datepicker functionality.
         | 
| 1807 1999 | 
             
               @param  options  string - a command, optionally followed by additional parameters or
         | 
| 1808 | 
            -
             | 
| 2000 | 
            +
            					Object - settings for attaching new datepicker functionality
         | 
| 1809 2001 | 
             
               @return  jQuery object */
         | 
| 1810 2002 | 
             
            $.fn.datepicker = function(options){
         | 
| 1811 2003 |  | 
| @@ -1816,21 +2008,27 @@ $.fn.datepicker = function(options){ | |
| 1816 2008 |  | 
| 1817 2009 | 
             
            	/* Initialise the date picker. */
         | 
| 1818 2010 | 
             
            	if (!$.datepicker.initialized) {
         | 
| 1819 | 
            -
            		$(document).mousedown($.datepicker._checkExternalClick) | 
| 1820 | 
            -
            			find(document.body).append($.datepicker.dpDiv);
         | 
| 2011 | 
            +
            		$(document).mousedown($.datepicker._checkExternalClick);
         | 
| 1821 2012 | 
             
            		$.datepicker.initialized = true;
         | 
| 1822 2013 | 
             
            	}
         | 
| 1823 2014 |  | 
| 2015 | 
            +
            	/* Append datepicker main container to body if not exist. */
         | 
| 2016 | 
            +
            	if ($("#"+$.datepicker._mainDivId).length === 0) {
         | 
| 2017 | 
            +
            		$("body").append($.datepicker.dpDiv);
         | 
| 2018 | 
            +
            	}
         | 
| 2019 | 
            +
             | 
| 1824 2020 | 
             
            	var otherArgs = Array.prototype.slice.call(arguments, 1);
         | 
| 1825 | 
            -
            	if (typeof options  | 
| 1826 | 
            -
            		return $.datepicker[ | 
| 2021 | 
            +
            	if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
         | 
| 2022 | 
            +
            		return $.datepicker["_" + options + "Datepicker"].
         | 
| 1827 2023 | 
             
            			apply($.datepicker, [this[0]].concat(otherArgs));
         | 
| 1828 | 
            -
            	 | 
| 1829 | 
            -
             | 
| 2024 | 
            +
            	}
         | 
| 2025 | 
            +
            	if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
         | 
| 2026 | 
            +
            		return $.datepicker["_" + options + "Datepicker"].
         | 
| 1830 2027 | 
             
            			apply($.datepicker, [this[0]].concat(otherArgs));
         | 
| 2028 | 
            +
            	}
         | 
| 1831 2029 | 
             
            	return this.each(function() {
         | 
| 1832 | 
            -
            		typeof options  | 
| 1833 | 
            -
            			$.datepicker[ | 
| 2030 | 
            +
            		typeof options === "string" ?
         | 
| 2031 | 
            +
            			$.datepicker["_" + options + "Datepicker"].
         | 
| 1834 2032 | 
             
            				apply($.datepicker, [this].concat(otherArgs)) :
         | 
| 1835 2033 | 
             
            			$.datepicker._attachDatepicker(this, options);
         | 
| 1836 2034 | 
             
            	});
         | 
| @@ -1839,10 +2037,10 @@ $.fn.datepicker = function(options){ | |
| 1839 2037 | 
             
            $.datepicker = new Datepicker(); // singleton instance
         | 
| 1840 2038 | 
             
            $.datepicker.initialized = false;
         | 
| 1841 2039 | 
             
            $.datepicker.uuid = new Date().getTime();
         | 
| 1842 | 
            -
            $.datepicker.version = "1. | 
| 2040 | 
            +
            $.datepicker.version = "1.10.0";
         | 
| 1843 2041 |  | 
| 1844 2042 | 
             
            // Workaround for #4055
         | 
| 1845 2043 | 
             
            // Add another global to avoid noConflict issues with inline event handlers
         | 
| 1846 | 
            -
            window[ | 
| 2044 | 
            +
            window["DP_jQuery_" + dpuuid] = $;
         | 
| 1847 2045 |  | 
| 1848 2046 | 
             
            })(jQuery);
         |