( function($) {
	function Datepicker() {
		this.debug = false;
		this._nextId = 0;
		this._inst = [];
		this._curInst = null;
		this._disabledInputs = [];
		this._datepickerShowing = false;
		this._inDialog = false;
		this._mainDivId = 'ui-datepicker-div';
		this._appendClass = 'ui-datepicker-append';
		this._wrapClass = 'ui-datepicker-wrap';
		this._triggerClass = 'ui-datepicker-trigger';
		this._dialogClass = 'ui-datepicker-dialog';
		this._promptClass = 'ui-datepicker-prompt';
		this._unselectableClass = 'ui-datepicker-unselectable';
		this._currentClass = 'ui-datepicker-current-day';
		this.regional = [];
		this.regional[''] = {
			clearText :'Clear',
			clearStatus :'Erase the current date',
			closeText :'Close',
			closeStatus :'Close without change',
			prevText :'&#x3c;Prev',
			prevStatus :'Show the previous month',
			nextText :'Next&#x3e;',
			nextStatus :'Show the next month',
			currentText :'Today',
			currentStatus :'Show the current month',
			monthNames : [ 'January', 'February', 'March', 'April', 'May',
					'June', 'July', 'August', 'September', 'October',
					'November', 'December' ],
			monthNamesShort : [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
					'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],
			monthStatus :'Show a different month',
			yearStatus :'Show a different year',
			weekHeader :'Wk',
			weekStatus :'Week of the year',
			dayNames : [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday',
					'Thursday', 'Friday', 'Saturday' ],
			dayNamesShort : [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
			dayNamesMin : [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ],
			dayStatus :'Set DD as first week day',
			dateStatus :'Select DD, M d',
			dateFormat :'mm/dd/yy',
			firstDay :0,
			initStatus :'Select a date',
			isRTL :false
		};
		this._defaults = {
			showOn :'focus',
			showAnim :'show',
			defaultDate :null,
			appendText :'',
			buttonText :'...',
			buttonImage :'',
			buttonImageOnly :false,
			closeAtTop :true,
			mandatory :false,
			hideIfNoPrevNext :false,
			navigationAsDateFormat :false,
			changeMonth :true,
			changeYear :true,
			yearRange :'-10:+10',
			changeFirstDay :true,
			highlightWeek :false,
			showOtherMonths :false,
			showWeeks :false,
			calculateWeek :this.iso8601Week,
			shortYearCutoff :'+10',
			showStatus :true,
			statusForDate :this.dateStatus,
			minDate :null,
			maxDate :null,
			speed :'normal',
			beforeShowDay :null,
			beforeShow :null,
			onSelect :null,
			onChangeMonthYear :null,
			onClose :null,
			numberOfMonths :1,
			stepMonths :1,
			rangeSelect :false,
			rangeSeparator :' - ',
			altField :'',
			altFormat :''
		};
		$.extend(this._defaults, this.regional['']);
		this._datepickerDiv = $('<div id="' + this._mainDivId + '"></div>');
	}
	$
			.extend(
					Datepicker.prototype,
					{
						markerClassName :'hasDatepicker',
						log : function() {
							if (this.debug)
								console.log.apply('', arguments);
						},
						_register : function(inst) {
							var id = this._nextId++;
							this._inst[id] = inst;
							return id;
						},
						_getInst : function(id) {
							return this._inst[id] || id;
						},
						setDefaults : function(settings) {
							extendRemove(this._defaults, settings || {});
							return this;
						},
						_attachDatepicker : function(target, settings) {
							var inlineSettings = null;
							for (attrName in this._defaults) {
								var attrValue = target
										.getAttribute('date:' + attrName);
								if (attrValue) {
									inlineSettings = inlineSettings || {};
									try {
										inlineSettings[attrName] = eval(attrValue);
									} catch (err) {
										inlineSettings[attrName] = attrValue;
									}
								}
							}
							var nodeName = target.nodeName.toLowerCase();
							var instSettings = (inlineSettings ? $.extend(
									settings || {}, inlineSettings) : settings);
							if (nodeName == 'input') {
								var inst = (inst && !inlineSettings ? inst
										: new DatepickerInstance(instSettings,
												false));
								this._connectDatepicker(target, inst);
							} else if (nodeName == 'div' || nodeName == 'span') {
								var inst = new DatepickerInstance(instSettings,
										true);
								this._inlineDatepicker(target, inst);
							}
						},
						_destroyDatepicker : function(target) {
							var nodeName = target.nodeName.toLowerCase();
							var calId = target._calId;
							var $target = $(target);
							$target.removeAttr('_calId');
							if (nodeName == 'input') {
								$target.siblings('.' + this._appendClass)
										.replaceWith('').end().siblings(
												'.' + this._triggerClass)
										.replaceWith('').end().removeClass(
												this.markerClassName).unbind(
												'focus', this._showDatepicker)
										.unbind('keydown', this._doKeyDown)
										.unbind('keypress', this._doKeyPress);
								var wrapper = $target
										.parents('.' + this._wrapClass);
								if (wrapper)
									wrapper.siblings('.' + this._appendClass)
											.replaceWith('').end().replaceWith(
													wrapper.html());
							} else if (nodeName == 'div' || nodeName == 'span')
								$target.removeClass(this.markerClassName)
										.empty();
							if ($('input[_calId=' + calId + ']').length == 0)
								this._inst[calId] = null;
						},
						_enableDatepicker : function(target) {
							target.disabled = false;
							$(target).siblings('button.' + this._triggerClass)
									.each( function() {
										this.disabled = false;
									}).end().siblings(
											'img.' + this._triggerClass).css( {
										opacity :'1.0',
										cursor :''
									});
							this._disabledInputs = $
									.map(this._disabledInputs,
											function(value) {
												return (value == target ? null
														: value);
											});
						},
						_disableDatepicker : function(target) {
							target.disabled = true;
							$(target).siblings('button.' + this._triggerClass)
									.each( function() {
										this.disabled = true;
									}).end().siblings(
											'img.' + this._triggerClass).css( {
										opacity :'0.5',
										cursor :'default'
									});
							this._disabledInputs = $
									.map($.datepicker._disabledInputs,
											function(value) {
												return (value == target ? null
														: value);
											});
							this._disabledInputs[$.datepicker._disabledInputs.length] = target;
						},
						_isDisabledDatepicker : function(target) {
							if (!target)
								return false;
							for ( var i = 0; i < this._disabledInputs.length; i++) {
								if (this._disabledInputs[i] == target)
									return true;
							}
							return false;
						},
						_changeDatepicker : function(target, name, value) {
							var settings = name || {};
							if (typeof name == 'string') {
								settings = {};
								settings[name] = value;
							}
							if (inst = this._getInst(target._calId)) {
								extendRemove(inst._settings, settings);
								this._updateDatepicker(inst);
							}
						},
						_setDateDatepicker : function(target, date, endDate) {
							if (inst = this._getInst(target._calId)) {
								inst._setDate(date, endDate);
								this._updateDatepicker(inst);
							}
						},
						_getDateDatepicker : function(target) {
							var inst = this._getInst(target._calId);
							if (inst)
								inst._setDateFromField($(target));
							return (inst ? inst._getDate() : null);
						},
						_doKeyDown : function(e) {
							var inst = $.datepicker._getInst(this._calId);
							if ($.datepicker._datepickerShowing)
								switch (e.keyCode) {
								case 9:
									$.datepicker._hideDatepicker(null, '');
									break;
								case 13:
									$.datepicker
											._selectDay(
													inst,
													inst._selectedMonth,
													inst._selectedYear,
													$(
															'td.ui-datepicker-days-cell-over',
															inst._datepickerDiv)[0]);
									return false;
									break;
								case 27:
									$.datepicker._hideDatepicker(null, inst
											._get('speed'));
									break;
								case 33:
									$.datepicker._adjustDate(inst,
											(e.ctrlKey ? -1 : -inst
													._get('stepMonths')),
											(e.ctrlKey ? 'Y' : 'M'));
									break;
								case 34:
									$.datepicker._adjustDate(inst,
											(e.ctrlKey ? +1 : +inst
													._get('stepMonths')),
											(e.ctrlKey ? 'Y' : 'M'));
									break;
								case 35:
									if (e.ctrlKey)
										$.datepicker._clearDate(inst);
									break;
								case 36:
									if (e.ctrlKey)
										$.datepicker._gotoToday(inst);
									break;
								case 37:
									if (e.ctrlKey)
										$.datepicker._adjustDate(inst, -1, 'D');
									break;
								case 38:
									if (e.ctrlKey)
										$.datepicker._adjustDate(inst, -7, 'D');
									break;
								case 39:
									if (e.ctrlKey)
										$.datepicker._adjustDate(inst, +1, 'D');
									break;
								case 40:
									if (e.ctrlKey)
										$.datepicker._adjustDate(inst, +7, 'D');
									break;
								}
							else if (e.keyCode == 36 && e.ctrlKey)
								$.datepicker._showDatepicker(this);
						},
						_doKeyPress : function(e) {
							var inst = $.datepicker._getInst(this._calId);
							var chars = $.datepicker._possibleChars(inst
									._get('dateFormat'));
							var chr = String
									.fromCharCode(e.charCode == undefined ? e.keyCode
											: e.charCode);
							return e.ctrlKey
									|| (chr < ' ' || !chars || chars
											.indexOf(chr) > -1);
						},
						_connectDatepicker : function(target, inst) {
							var input = $(target);
							if (input.hasClass(this.markerClassName))
								return;
							var appendText = inst._get('appendText');
							var isRTL = inst._get('isRTL');
							if (appendText)
								input[isRTL ? 'before' : 'after']
										('<span class="' + this._appendClass
												+ '">' + appendText + '</span>');
							var showOn = inst._get('showOn');
							if (showOn == 'focus' || showOn == 'both')
								input.focus(this._showDatepicker);
							if (showOn == 'button' || showOn == 'both') {
								input
										.wrap('<span class="' + this._wrapClass + '"></span>');
								var buttonText = inst._get('buttonText');
								var buttonImage = inst._get('buttonImage');
								var trigger = $(inst._get('buttonImageOnly') ? $(
										'<img/>').addClass(this._triggerClass)
										.attr( {
											src :buttonImage,
											alt :buttonText,
											title :buttonText
										})
										: $('<button></button>').addClass(
												this._triggerClass).html(
												buttonImage != '' ? $('<img/>')
														.attr( {
															src :buttonImage,
															alt :buttonText,
															title :buttonText
														}) : buttonText));
								input[isRTL ? 'before' : 'after'](trigger);
								trigger
										.click( function() {
											if ($.datepicker._datepickerShowing
													&& $.datepicker._lastInput == target)
												$.datepicker._hideDatepicker();
											else
												$.datepicker
														._showDatepicker(target);
										});
							}
							input.addClass(this.markerClassName).keydown(
									this._doKeyDown).keypress(this._doKeyPress)
									.bind("setData.datepicker",
											function(event, key, value) {
												inst._settings[key] = value;
											}).bind("getData.datepicker",
											function(event, key) {
												return inst._get(key);
											});
							input[0]._calId = inst._id;
						},
						_inlineDatepicker : function(target, inst) {
							var input = $(target);
							if (input.hasClass(this.markerClassName))
								return;
							input.addClass(this.markerClassName).append(
									inst._datepickerDiv).bind(
									"setData.datepicker",
									function(event, key, value) {
										inst._settings[key] = value;
									}).bind("getData.datepicker",
									function(event, key) {
										return inst._get(key);
									});
							input[0]._calId = inst._id;
							this._updateDatepicker(inst);
						},
						_inlineShow : function(inst) {
							var numMonths = inst._getNumberOfMonths();
							inst._datepickerDiv.width(numMonths[1]
									* $('.ui-datepicker',
											inst._datepickerDiv[0]).width());
						},
						_dialogDatepicker : function(input, dateText, onSelect,
								settings, pos) {
							var inst = this._dialogInst;
							if (!inst) {
								inst = this._dialogInst = new DatepickerInstance(
										{}, false);
								this._dialogInput = $('<input type="text" size="1" style="position: absolute; top: -100px;"/>');
								this._dialogInput.keydown(this._doKeyDown);
								$('body').append(this._dialogInput);
								this._dialogInput[0]._calId = inst._id;
							}
							extendRemove(inst._settings, settings || {});
							this._dialogInput.val(dateText);
							this._pos = (pos ? (pos.length ? pos : [ pos.pageX,
									pos.pageY ]) : null);
							if (!this._pos) {
								var browserWidth = window.innerWidth
										|| document.documentElement.clientWidth
										|| document.body.clientWidth;
								var browserHeight = window.innerHeight
										|| document.documentElement.clientHeight
										|| document.body.clientHeight;
								var scrollX = document.documentElement.scrollLeft
										|| document.body.scrollLeft;
								var scrollY = document.documentElement.scrollTop
										|| document.body.scrollTop;
								this._pos = [
										(browserWidth / 2) - 100 + scrollX,
										(browserHeight / 2) - 150 + scrollY ];
							}
							this._dialogInput.css('left', this._pos[0] + 'px')
									.css('top', this._pos[1] + 'px');
							inst._settings.onSelect = onSelect;
							this._inDialog = true;
							this._datepickerDiv.addClass(this._dialogClass);
							this._showDatepicker(this._dialogInput[0]);
							if ($.blockUI)
								$.blockUI(this._datepickerDiv);
							return this;
						},
						_showDatepicker : function(input) {
							input = input.target || input;
							if (input.nodeName.toLowerCase() != 'input')
								input = $('input', input.parentNode)[0];
							if ($.datepicker._isDisabledDatepicker(input)
									|| $.datepicker._lastInput == input)
								return;
							var inst = $.datepicker._getInst(input._calId);
							var beforeShow = inst._get('beforeShow');
							extendRemove(inst._settings,
									(beforeShow ? beforeShow.apply(input, [
											input, inst ]) : {}));
							$.datepicker._hideDatepicker(null, '');
							$.datepicker._lastInput = input;
							inst._setDateFromField(input);
							if ($.datepicker._inDialog)
								input.value = '';
							if (!$.datepicker._pos) {
								$.datepicker._pos = $.datepicker
										._findPos(input);
								$.datepicker._pos[1] += input.offsetHeight;
							}
							var isFixed = false;
							$(input).parents().each( function() {
								isFixed |= $(this).css('position') == 'fixed';
								return !isFixed;
							});
							if (isFixed && $.browser.opera) {
								$.datepicker._pos[0] -= document.documentElement.scrollLeft;
								$.datepicker._pos[1] -= document.documentElement.scrollTop;
							}
							var offset = {
								left :$.datepicker._pos[0],
								top :$.datepicker._pos[1]
							};
							$.datepicker._pos = null;
							inst._rangeStart = null;
							inst._datepickerDiv.css( {
								position :'absolute',
								display :'block',
								top :'-1000px'
							});
							$.datepicker._updateDatepicker(inst);
							inst._datepickerDiv
									.width(inst._getNumberOfMonths()[1]
											* $('.ui-datepicker',
													inst._datepickerDiv[0])[0].offsetWidth);
							offset = $.datepicker._checkOffset(inst, offset,
									isFixed);
							inst._datepickerDiv
									.css( {
										position :($.datepicker._inDialog
												&& $.blockUI ? 'static'
												: (isFixed ? 'fixed'
														: 'absolute')),
										display :'none',
										left :offset.left + 'px',
										top :offset.top + 'px'
									});
							if (!inst._inline) {
								var showAnim = inst._get('showAnim') || 'show';
								var speed = inst._get('speed');
								var postProcess = function() {
									$.datepicker._datepickerShowing = true;
									if ($.browser.msie
											&& parseInt($.browser.version) < 7)
										$('iframe.ui-datepicker-cover').css(
												{
													width :inst._datepickerDiv
															.width() + 4,
													height :inst._datepickerDiv
															.height() + 4
												});
								};
								inst._datepickerDiv[showAnim](speed,
										postProcess);
								if (speed == '')
									postProcess();
								if (inst._input[0].type != 'hidden')
									inst._input[0].focus();
								$.datepicker._curInst = inst;
							}
						},
						_updateDatepicker : function(inst) {
							var dims = {
								width :inst._datepickerDiv.width() + 4,
								height :inst._datepickerDiv.height() + 4
							};
							inst._datepickerDiv.empty().append(
									inst._generateDatepicker()).find(
									'iframe.ui-datepicker-cover').css( {
								width :dims.width,
								height :dims.height
							});
							var numMonths = inst._getNumberOfMonths();
							if (numMonths[0] != 1 || numMonths[1] != 1)
								inst._datepickerDiv
										.addClass('ui-datepicker-multi');
							else
								inst._datepickerDiv
										.removeClass('ui-datepicker-multi');
							if (inst._get('isRTL'))
								inst._datepickerDiv
										.addClass('ui-datepicker-rtl');
							else
								inst._datepickerDiv
										.removeClass('ui-datepicker-rtl');
							if (inst._input && inst._input[0].type != 'hidden')
								$(inst._input[0]).focus();
						},
						_checkOffset : function(inst, offset, isFixed) {
							var pos = inst._input ? $.datepicker
									._findPos(inst._input[0]) : null;
							var browserWidth = window.innerWidth
									|| document.documentElement.clientWidth;
							var browserHeight = window.innerHeight
									|| document.documentElement.clientHeight;
							var scrollX = document.documentElement.scrollLeft
									|| document.body.scrollLeft;
							var scrollY = document.documentElement.scrollTop
									|| document.body.scrollTop;
							if ((offset.left + inst._datepickerDiv.width() - scrollX) > browserWidth)
								offset.left = Math
										.max(
												(isFixed ? 0 : scrollX),
												pos[0]
														+ (inst._input ? inst._input
																.width()
																: 0)
														- (isFixed ? scrollX
																: 0)
														- inst._datepickerDiv
																.width()
														- (isFixed
																&& $.browser.opera ? document.documentElement.scrollLeft
																: 0));
							else
								offset.left -= (isFixed ? scrollX : 0);
							if ((offset.top + inst._datepickerDiv.height() - scrollY) > browserHeight)
								offset.top = Math
										.max(
												(isFixed ? 0 : scrollY),
												pos[1]
														- (isFixed ? scrollY
																: 0)
														- (this._inDialog ? 0
																: inst._datepickerDiv
																		.height())
														- (isFixed
																&& $.browser.opera ? document.documentElement.scrollTop
																: 0));
							else
								offset.top -= (isFixed ? scrollY : 0);
							return offset;
						},
						_findPos : function(obj) {
							while (obj
									&& (obj.type == 'hidden' || obj.nodeType != 1)) {
								obj = obj.nextSibling;
							}
							var position = $(obj).offset();
							return [ position.left, position.top ];
						},
						_hideDatepicker : function(input, speed) {
							var inst = this._curInst;
							if (!inst)
								return;
							var rangeSelect = inst._get('rangeSelect');
							if (rangeSelect && this._stayOpen)
								this._selectDate(inst, inst._formatDate(
										inst._currentDay, inst._currentMonth,
										inst._currentYear));
							this._stayOpen = false;
							if (this._datepickerShowing) {
								speed = (speed != null ? speed : inst
										._get('speed'));
								var showAnim = inst._get('showAnim');
								inst._datepickerDiv[(showAnim == 'slideDown' ? 'slideUp'
										: (showAnim == 'fadeIn' ? 'fadeOut'
												: 'hide'))](speed, function() {
									$.datepicker._tidyDialog(inst);
								});
								if (speed == '')
									this._tidyDialog(inst);
								var onClose = inst._get('onClose');
								if (onClose)
									onClose.apply((inst._input ? inst._input[0]
											: null), [ inst._getDate(), inst ]);
								this._datepickerShowing = false;
								this._lastInput = null;
								inst._settings.prompt = null;
								if (this._inDialog) {
									this._dialogInput.css( {
										position :'absolute',
										left :'0',
										top :'-100px'
									});
									if ($.blockUI) {
										$.unblockUI();
										$('body').append(this._datepickerDiv);
									}
								}
								this._inDialog = false;
							}
							this._curInst = null;
						},
						_tidyDialog : function(inst) {
							inst._datepickerDiv.removeClass(this._dialogClass)
									.unbind('.ui-datepicker');
							$('.' + this._promptClass, inst._datepickerDiv)
									.remove();
						},
						_checkExternalClick : function(event) {
							if (!$.datepicker._curInst)
								return;
							var $target = $(event.target);
							if (($target.parents('#' + $.datepicker._mainDivId).length == 0)
									&& !$target
											.hasClass($.datepicker.markerClassName)
									&& !$target
											.hasClass($.datepicker._triggerClass)
									&& $.datepicker._datepickerShowing
									&& !($.datepicker._inDialog && $.blockUI))
								$.datepicker._hideDatepicker(null, '');
						},
						_adjustDate : function(id, offset, period) {
							var inst = this._getInst(id);
							inst._adjustDate(offset, period);
							this._updateDatepicker(inst);
						},
						_gotoToday : function(id) {
							var date = new Date();
							var inst = this._getInst(id);
							inst._selectedDay = date.getDate();
							inst._drawMonth = inst._selectedMonth = date
									.getMonth();
							inst._drawYear = inst._selectedYear = date
									.getFullYear();
							this._adjustDate(inst);
							inst._notifyChange();
						},
						_selectMonthYear : function(id, select, period) {
							var inst = this._getInst(id);
							inst._selectingMonthYear = false;
							inst[period == 'M' ? '_drawMonth' : '_drawYear'] = select.options[select.selectedIndex].value - 0;
							this._adjustDate(inst);
							inst._notifyChange();
						},
						_clickMonthYear : function(id) {
							var inst = this._getInst(id);
							if (inst._input && inst._selectingMonthYear
									&& !$.browser.msie)
								inst._input[0].focus();
							inst._selectingMonthYear = !inst._selectingMonthYear;
						},
						_changeFirstDay : function(id, day) {
							var inst = this._getInst(id);
							inst._settings.firstDay = day;
							this._updateDatepicker(inst);
						},
						_selectDay : function(id, month, year, td) {
							if ($(td).hasClass(this._unselectableClass))
								return;
							var inst = this._getInst(id);
							var rangeSelect = inst._get('rangeSelect');
							if (rangeSelect) {
								this._stayOpen = !this._stayOpen;
								if (this._stayOpen) {
									$('.ui-datepicker td').removeClass(
											this._currentClass);
									$(td).addClass(this._currentClass);
								}
							}
							inst._selectedDay = inst._currentDay = $('a', td)
									.html();
							inst._selectedMonth = inst._currentMonth = month;
							inst._selectedYear = inst._currentYear = year;
							if (this._stayOpen) {
								inst._endDay = inst._endMonth = inst._endYear = null;
							} else if (rangeSelect) {
								inst._endDay = inst._currentDay;
								inst._endMonth = inst._currentMonth;
								inst._endYear = inst._currentYear;
							}
							this._selectDate(id, inst._formatDate(
									inst._currentDay, inst._currentMonth,
									inst._currentYear));
							if (this._stayOpen) {
								inst._rangeStart = new Date(inst._currentYear,
										inst._currentMonth, inst._currentDay);
								this._updateDatepicker(inst);
							} else if (rangeSelect) {
								inst._selectedDay = inst._currentDay = inst._rangeStart
										.getDate();
								inst._selectedMonth = inst._currentMonth = inst._rangeStart
										.getMonth();
								inst._selectedYear = inst._currentYear = inst._rangeStart
										.getFullYear();
								inst._rangeStart = null;
								if (inst._inline)
									this._updateDatepicker(inst);
							}
						},
						_clearDate : function(id) {
							var inst = this._getInst(id);
							if (inst._get('mandatory'))
								return;
							this._stayOpen = false;
							inst._endDay = inst._endMonth = inst._endYear = inst._rangeStart = null;
							this._selectDate(inst, '');
						},
						_selectDate : function(id, dateStr) {
							var inst = this._getInst(id);
							dateStr = (dateStr != null ? dateStr : inst
									._formatDate());
							if (inst._get('rangeSelect') && dateStr)
								dateStr = (inst._rangeStart ? inst
										._formatDate(inst._rangeStart)
										: dateStr)
										+ inst._get('rangeSeparator') + dateStr;
							if (inst._input)
								inst._input.val(dateStr);
							this._updateAlternate(inst);
							var onSelect = inst._get('onSelect');
							if (onSelect)
								onSelect.apply((inst._input ? inst._input[0]
										: null), [ dateStr, inst ]);
							else if (inst._input)
								inst._input.trigger('change');
							if (inst._inline)
								this._updateDatepicker(inst);
							else if (!this._stayOpen) {
								this._hideDatepicker(null, inst._get('speed'));
								this._lastInput = inst._input[0];
								if (typeof (inst._input[0]) != 'object')
									inst._input[0].focus();
								this._lastInput = null;
							}
						},
						_updateAlternate : function(inst) {
							var altField = inst._get('altField');
							if (altField) {
								var altFormat = inst._get('altFormat');
								var date = inst._getDate();
								dateStr = (isArray(date) ? (!date[0]
										&& !date[1] ? '' : $.datepicker
										.formatDate(altFormat, date[0], inst
												._getFormatConfig())
										+ inst._get('rangeSeparator')
										+ $.datepicker.formatDate(altFormat,
												date[1] || date[0], inst
														._getFormatConfig()))
										: $.datepicker.formatDate(altFormat,
												date, inst._getFormatConfig()));
								$(altField).each( function() {
									$(this).val(dateStr);
								});
							}
						},
						noWeekends : function(date) {
							var day = date.getDay();
							return [ (day > 0 && day < 6), '' ];
						},
						iso8601Week : function(date) {
							var checkDate = new Date(date.getFullYear(), date
									.getMonth(), date.getDate(), (date
									.getTimezoneOffset() / -60));
							var firstMon = new Date(checkDate.getFullYear(),
									1 - 1, 4);
							var firstDay = firstMon.getDay() || 7;
							firstMon.setDate(firstMon.getDate() + 1 - firstDay);
							if (firstDay < 4 && checkDate < firstMon) {
								checkDate.setDate(checkDate.getDate() - 3);
								return $.datepicker.iso8601Week(checkDate);
							} else if (checkDate > new Date(checkDate
									.getFullYear(), 12 - 1, 28)) {
								firstDay = new Date(
										checkDate.getFullYear() + 1, 1 - 1, 4)
										.getDay() || 7;
								if (firstDay > 4
										&& (checkDate.getDay() || 7) < firstDay - 3) {
									checkDate.setDate(checkDate.getDate() + 3);
									return $.datepicker.iso8601Week(checkDate);
								}
							}
							return Math
									.floor(((checkDate - firstMon) / 86400000) / 7) + 1;
						},
						dateStatus : function(date, inst) {
							return $.datepicker.formatDate(inst
									._get('dateStatus'), date, inst
									._getFormatConfig());
						},
						parseDate : function(format, value, settings) {
							if (format == null || value == null)
								throw 'Invalid arguments';
							value = (typeof value == 'object' ? value
									.toString() : value + '');
							if (value == '')
								return null;
							var shortYearCutoff = (settings ? settings.shortYearCutoff
									: null)
									|| this._defaults.shortYearCutoff;
							var dayNamesShort = (settings ? settings.dayNamesShort
									: null)
									|| this._defaults.dayNamesShort;
							var dayNames = (settings ? settings.dayNames : null)
									|| this._defaults.dayNames;
							var monthNamesShort = (settings ? settings.monthNamesShort
									: null)
									|| this._defaults.monthNamesShort;
							var monthNames = (settings ? settings.monthNames
									: null)
									|| this._defaults.monthNames;
							var year = -1;
							var month = -1;
							var day = -1;
							var literal = false;
							var lookAhead = function(match) {
								var matches = (iFormat + 1 < format.length && format
										.charAt(iFormat + 1) == match);
								if (matches)
									iFormat++;
								return matches;
							};
							var getNumber = function(match) {
								lookAhead(match);
								var size = (match == 'y' ? 4 : 2);
								var num = 0;
								while (size > 0 && iValue < value.length
										&& value.charAt(iValue) >= '0'
										&& value.charAt(iValue) <= '9') {
									num = num * 10
											+ (value.charAt(iValue++) - 0);
									size--;
								}
								if (size == (match == 'y' ? 4 : 2))
									throw 'Missing number at position ' + iValue;
								return num;
							};
							var getName = function(match, shortNames, longNames) {
								var names = (lookAhead(match) ? longNames
										: shortNames);
								var size = 0;
								for ( var j = 0; j < names.length; j++)
									size = Math.max(size, names[j].length);
								var name = '';
								var iInit = iValue;
								while (size > 0 && iValue < value.length) {
									name += value.charAt(iValue++);
									for ( var i = 0; i < names.length; i++)
										if (name == names[i])
											return i + 1;
									size--;
								}
								throw 'Unknown name at position ' + iInit;
							};
							var checkLiteral = function() {
								if (value.charAt(iValue) != format
										.charAt(iFormat))
									throw 'Unexpected literal at position ' + iValue;
								iValue++;
							};
							var iValue = 0;
							for ( var iFormat = 0; iFormat < format.length; iFormat++) {
								if (literal)
									if (format.charAt(iFormat) == "'"
											&& !lookAhead("'"))
										literal = false;
									else
										checkLiteral();
								else
									switch (format.charAt(iFormat)) {
									case 'd':
										day = getNumber('d');
										break;
									case 'D':
										getName('D', dayNamesShort, dayNames);
										break;
									case 'm':
										month = getNumber('m');
										break;
									case 'M':
										month = getName('M', monthNamesShort,
												monthNames);
										break;
									case 'y':
										year = getNumber('y');
										break;
									case "'":
										if (lookAhead("'"))
											checkLiteral();
										else
											literal = true;
										break;
									default:
										checkLiteral();
									}
							}
							if (year < 100)
								year += new Date().getFullYear()
										- new Date().getFullYear() % 100
										+ (year <= shortYearCutoff ? 0 : -100);
							var date = new Date(year, month - 1, day);
							if (date.getFullYear() != year
									|| date.getMonth() + 1 != month
									|| date.getDate() != day)
								throw 'Invalid date';
							return date;
						},
						formatDate : function(format, date, settings) {
							if (!date)
								return '';
							var dayNamesShort = (settings ? settings.dayNamesShort
									: null)
									|| this._defaults.dayNamesShort;
							var dayNames = (settings ? settings.dayNames : null)
									|| this._defaults.dayNames;
							var monthNamesShort = (settings ? settings.monthNamesShort
									: null)
									|| this._defaults.monthNamesShort;
							var monthNames = (settings ? settings.monthNames
									: null)
									|| this._defaults.monthNames;
							var lookAhead = function(match) {
								var matches = (iFormat + 1 < format.length && format
										.charAt(iFormat + 1) == match);
								if (matches)
									iFormat++;
								return matches;
							};
							var formatNumber = function(match, value) {
								return (lookAhead(match) && value < 10 ? '0'
										: '')
										+ value;
							};
							var formatName = function(match, value, shortNames,
									longNames) {
								return (lookAhead(match) ? longNames[value]
										: shortNames[value]);
							};
							var output = '';
							var literal = false;
							if (date)
								for ( var iFormat = 0; iFormat < format.length; iFormat++) {
									if (literal)
										if (format.charAt(iFormat) == "'"
												&& !lookAhead("'"))
											literal = false;
										else
											output += format.charAt(iFormat);
									else
										switch (format.charAt(iFormat)) {
										case 'd':
											output += formatNumber('d', date
													.getDate());
											break;
										case 'D':
											output += formatName('D', date
													.getDay(), dayNamesShort,
													dayNames);
											break;
										case 'm':
											output += formatNumber('m', date
													.getMonth() + 1);
											break;
										case 'M':
											output += formatName('M', date
													.getMonth(),
													monthNamesShort, monthNames);
											break;
										case 'y':
											output += (lookAhead('y') ? date
													.getFullYear() : (date
													.getYear() % 100 < 10 ? '0'
													: '')
													+ date.getYear() % 100);
											break;
										case "'":
											if (lookAhead("'"))
												output += "'";
											else
												literal = true;
											break;
										default:
											output += format.charAt(iFormat);
										}
								}
							return output;
						},
						_possibleChars : function(format) {
							var chars = '';
							var literal = false;
							for ( var iFormat = 0; iFormat < format.length; iFormat++)
								if (literal)
									if (format.charAt(iFormat) == "'"
											&& !lookAhead("'"))
										literal = false;
									else
										chars += format.charAt(iFormat);
								else
									switch (format.charAt(iFormat)) {
									case 'd':
									case 'm':
									case 'y':
										chars += '0123456789';
										break;
									case 'D':
									case 'M':
										return null;
									case "'":
										if (lookAhead("'"))
											chars += "'";
										else
											literal = true;
										break;
									default:
										chars += format.charAt(iFormat);
									}
							return chars;
						}
					});
	function DatepickerInstance(settings, inline) {
		this._id = $.datepicker._register(this);
		this._selectedDay = 0;
		this._selectedMonth = 0;
		this._selectedYear = 0;
		this._drawMonth = 0;
		this._drawYear = 0;
		this._input = null;
		this._inline = inline;
		this._datepickerDiv = (!inline ? $.datepicker._datepickerDiv
				: $('<div id="' + $.datepicker._mainDivId + '-' + this._id
						+ '" class="ui-datepicker-inline">'));
		this._settings = extendRemove(settings || {});
		if (inline)
			this._setDate(this._getDefaultDate());
	}
	$
			.extend(
					DatepickerInstance.prototype,
					{
						_get : function(name) {
							return this._settings[name] !== undefined ? this._settings[name]
									: $.datepicker._defaults[name];
						},
						_setDateFromField : function(input) {
							this._input = $(input);
							var dateFormat = this._get('dateFormat');
							var dates = this._input ? this._input.val().split(
									this._get('rangeSeparator')) : null;
							this._endDay = this._endMonth = this._endYear = null;
							var date = defaultDate = this._getDefaultDate();
							if (dates.length > 0) {
								var settings = this._getFormatConfig();
								if (dates.length > 1) {
									date = $.datepicker.parseDate(dateFormat,
											dates[1], settings)
											|| defaultDate;
									this._endDay = date.getDate();
									this._endMonth = date.getMonth();
									this._endYear = date.getFullYear();
								}
								try {
									date = $.datepicker.parseDate(dateFormat,
											dates[0], settings)
											|| defaultDate;
								} catch (e) {
									$.datepicker.log(e);
									date = defaultDate;
								}
							}
							this._selectedDay = date.getDate();
							this._drawMonth = this._selectedMonth = date
									.getMonth();
							this._drawYear = this._selectedYear = date
									.getFullYear();
							this._currentDay = (dates[0] ? date.getDate() : 0);
							this._currentMonth = (dates[0] ? date.getMonth()
									: 0);
							this._currentYear = (dates[0] ? date.getFullYear()
									: 0);
							this._adjustDate();
						},
						_getDefaultDate : function() {
							var date = this._determineDate('defaultDate',
									new Date());
							var minDate = this._getMinMaxDate('min', true);
							var maxDate = this._getMinMaxDate('max');
							date = (minDate && date < minDate ? minDate : date);
							date = (maxDate && date > maxDate ? maxDate : date);
							return date;
						},
						_determineDate : function(name, defaultDate) {
							var offsetNumeric = function(offset) {
								var date = new Date();
								date.setDate(date.getDate() + offset);
								return date;
							};
							var offsetString = function(offset, getDaysInMonth) {
								var date = new Date();
								var year = date.getFullYear();
								var month = date.getMonth();
								var day = date.getDate();
								var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
								var matches = pattern.exec(offset);
								while (matches) {
									switch (matches[2] || 'd') {
									case 'd':
									case 'D':
										day += (matches[1] - 0);
										break;
									case 'w':
									case 'W':
										day += (matches[1] * 7);
										break;
									case 'm':
									case 'M':
										month += (matches[1] - 0);
										day = Math.min(day, getDaysInMonth(
												year, month));
										break;
									case 'y':
									case 'Y':
										year += (matches[1] - 0);
										day = Math.min(day, getDaysInMonth(
												year, month));
										break;
									}
									matches = pattern.exec(offset);
								}
								return new Date(year, month, day);
							};
							var date = this._get(name);
							return (date == null ? defaultDate
									: (typeof date == 'string' ? offsetString(
											date, this._getDaysInMonth)
											: (typeof date == 'number' ? offsetNumeric(date)
													: date)));
						},
						_setDate : function(date, endDate) {
							this._selectedDay = this._currentDay = date
									.getDate();
							this._drawMonth = this._selectedMonth = this._currentMonth = date
									.getMonth();
							this._drawYear = this._selectedYear = this._currentYear = date
									.getFullYear();
							if (this._get('rangeSelect')) {
								if (endDate) {
									this._endDay = endDate.getDate();
									this._endMonth = endDate.getMonth();
									this._endYear = endDate.getFullYear();
								} else {
									this._endDay = this._currentDay;
									this._endMonth = this._currentMonth;
									this._endYear = this._currentYear;
								}
							}
							this._adjustDate();
						},
						_getDate : function() {
							var startDate = (!this._currentYear
									|| (this._input && this._input.val() == '') ? null
									: new Date(this._currentYear,
											this._currentMonth,
											this._currentDay));
							if (this._get('rangeSelect')) {
								return [
										this._rangeStart || startDate,
										(!this._endYear ? null : new Date(
												this._endYear, this._endMonth,
												this._endDay)) ];
							} else
								return startDate;
						},
						_generateDatepicker : function() {
							var today = new Date();
							today = new Date(today.getFullYear(), today
									.getMonth(), today.getDate());
							var showStatus = true;
							var isRTL = this._get('isRTL');
							var clear = (this._get('mandatory') ? ''
									: '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate('
											+ this._id
											+ ');"'
											+ (showStatus ? this
													._addStatus(this
															._get('clearStatus') || '&#xa0;')
													: '')
											+ '>'
											+ this._get('clearText')
											+ '</a></div>');
							var controls = '<div class="ui-datepicker-control">'
									+ (isRTL ? '' : clear)
									+ '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"'
									+ (showStatus ? this._addStatus(this
											._get('closeStatus') || '&#xa0;')
											: '')
									+ '>'
									+ this._get('closeText')
									+ '</a></div>'
									+ (isRTL ? clear : '') + '</div>';
							var prompt = this._get('prompt');
							var closeAtTop = this._get('closeAtTop');
							var hideIfNoPrevNext = this
									._get('hideIfNoPrevNext');
							var navigationAsDateFormat = this
									._get('navigationAsDateFormat');
							var numMonths = this._getNumberOfMonths();
							var stepMonths = this._get('stepMonths');
							var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
							var minDate = this._getMinMaxDate('min', true);
							var maxDate = this._getMinMaxDate('max');
							var drawMonth = this._drawMonth;
							var drawYear = this._drawYear;
							if (maxDate) {
								var maxDraw = new Date(maxDate.getFullYear(),
										maxDate.getMonth() - numMonths[1] + 1,
										maxDate.getDate());
								maxDraw = (minDate && maxDraw < minDate ? minDate
										: maxDraw);
								while (new Date(drawYear, drawMonth, 1) > maxDraw) {
									drawMonth--;
									if (drawMonth < 0) {
										drawMonth = 11;
										drawYear--;
									}
								}
							}
							var prevText = this._get('prevText');
							prevText = (!navigationAsDateFormat ? prevText
									: $.datepicker.formatDate(prevText,
											new Date(drawYear, drawMonth
													- stepMonths, 1), this
													._getFormatConfig()));
							var prev = '<div class="ui-datepicker-prev">' + (this
									._canAdjustMonth(-1, drawYear, drawMonth) ? '<a onclick="jQuery.datepicker._adjustDate('
									+ this._id
									+ ', -'
									+ stepMonths
									+ ', \'M\');"'
									+ (showStatus ? this._addStatus(this
											._get('prevStatus') || '&#xa0;')
											: '') + '>' + prevText + '</a>'
									: (hideIfNoPrevNext ? ''
											: '<label>' + prevText + '</label>')) + '</div>';
							var nextText = this._get('nextText');
							nextText = (!navigationAsDateFormat ? nextText
									: $.datepicker.formatDate(nextText,
											new Date(drawYear, drawMonth
													+ stepMonths, 1), this
													._getFormatConfig()));
							var next = '<div class="ui-datepicker-next">' + (this
									._canAdjustMonth(+1, drawYear, drawMonth) ? '<a onclick="jQuery.datepicker._adjustDate('
									+ this._id
									+ ', +'
									+ stepMonths
									+ ', \'M\');"'
									+ (showStatus ? this._addStatus(this
											._get('nextStatus') || '&#xa0;')
											: '') + '>' + nextText + '</a>'
									: (hideIfNoPrevNext ? ''
											: '<label>' + nextText + '</label>')) + '</div>';
							var currentText = this._get('currentText');
							currentText = (!navigationAsDateFormat ? currentText
									: $.datepicker.formatDate(currentText,
											today, this._getFormatConfig()));
							var html = (prompt ? '<div class="'
									+ $.datepicker._promptClass + '">' + prompt
									+ '</div>' : '')
									+ (closeAtTop && !this._inline ? controls
											: '')
									+ '<div class="ui-datepicker-links">'
									+ (isRTL ? next : prev)
									+ (this._isInRange(today) ? '<div class="ui-datepicker-current">'
											+ '<a onclick="jQuery.datepicker._gotoToday('
											+ this._id
											+ ');"'
											+ (showStatus ? this
													._addStatus(this
															._get('currentStatus') || '&#xa0;')
													: '')
											+ '>'
											+ currentText
											+ '</a></div>'
											: '')
									+ (isRTL ? prev : next)
									+ '</div>';
							var showWeeks = this._get('showWeeks');
							for ( var row = 0; row < numMonths[0]; row++)
								for ( var col = 0; col < numMonths[1]; col++) {
									var selectedDate = new Date(drawYear,
											drawMonth, this._selectedDay);
									html += '<div class="ui-datepicker-one-month'
											+ (col == 0 ? ' ui-datepicker-new-row'
													: '')
											+ '">'
											+ this._generateMonthYearHeader(
													drawMonth, drawYear,
													minDate, maxDate,
													selectedDate, row > 0
															|| col > 0)
											+ '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>'
											+ '<tr class="ui-datepicker-title-row">'
											+ (showWeeks ? '<td>' + this
													._get('weekHeader') + '</td>'
													: '');
									var firstDay = this._get('firstDay');
									var changeFirstDay = this
											._get('changeFirstDay');
									var dayNames = this._get('dayNames');
									var dayNamesShort = this
											._get('dayNamesShort');
									var dayNamesMin = this._get('dayNamesMin');
									for ( var dow = 0; dow < 7; dow++) {
										var day = (dow + firstDay) % 7;
										var status = this._get('dayStatus') || '&#xa0;';
										status = (status.indexOf('DD') > -1 ? status
												.replace(/DD/, dayNames[day])
												: status.replace(/D/,
														dayNamesShort[day]));
										html += '<td'
												+ ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"'
														: '')
												+ '>'
												+ (!changeFirstDay ? '<span'
														: '<a onclick="jQuery.datepicker._changeFirstDay('
																+ this._id
																+ ', '
																+ day
																+ ');"')
												+ (showStatus ? this
														._addStatus(status)
														: '')
												+ ' title="'
												+ dayNames[day]
												+ '">'
												+ dayNamesMin[day]
												+ (changeFirstDay ? '</a>'
														: '</span>') + '</td>';
									}
									html += '</tr></thead><tbody>';
									var daysInMonth = this._getDaysInMonth(
											drawYear, drawMonth);
									if (drawYear == this._selectedYear
											&& drawMonth == this._selectedMonth)
										this._selectedDay = Math.min(
												this._selectedDay, daysInMonth);
									var leadDays = (this._getFirstDayOfMonth(
											drawYear, drawMonth)
											- firstDay + 7) % 7;
									var currentDate = (!this._currentDay ? new Date(
											9999, 9, 9)
											: new Date(this._currentYear,
													this._currentMonth,
													this._currentDay));
									var endDate = this._endDay ? new Date(
											this._endYear, this._endMonth,
											this._endDay) : currentDate;
									var printDate = new Date(drawYear,
											drawMonth, 1 - leadDays);
									var numRows = (isMultiMonth ? 6 : Math
											.ceil((leadDays + daysInMonth) / 7));
									var beforeShowDay = this
											._get('beforeShowDay');
									var highlightWeek = this
											._get('highlightWeek');
									var showOtherMonths = this
											._get('showOtherMonths');
									var calculateWeek = this
											._get('calculateWeek')
											|| $.datepicker.iso8601Week;
									var dateStatus = this._get('statusForDate')
											|| $.datepicker.dateStatus;
									for ( var dRow = 0; dRow < numRows; dRow++) {
										html += '<tr class="ui-datepicker-days-row">' + (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>'
												: '');
										for ( var dow = 0; dow < 7; dow++) {
											var daySettings = (beforeShowDay ? beforeShowDay
													.apply(
															(this._input ? this._input[0]
																	: null),
															[ printDate ])
													: [ true, '' ]);
											var otherMonth = (printDate
													.getMonth() != drawMonth);
											var unselectable = otherMonth
													|| !daySettings[0]
													|| (minDate && printDate < minDate)
													|| (maxDate && printDate > maxDate);
											html += '<td class="ui-datepicker-days-cell'
													+ ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell'
															: '')
													+ (otherMonth ? ' ui-datepicker-otherMonth'
															: '')
													+ (printDate.getTime() == selectedDate
															.getTime()
															&& drawMonth == this._selectedMonth ? ' ui-datepicker-days-cell-over'
															: '')
													+ (unselectable ? ' ' + $.datepicker._unselectableClass
															: '')
													+ (otherMonth
															&& !showOtherMonths ? ''
															: ' '
																	+ daySettings[1]
																	+ (printDate
																			.getTime() >= currentDate
																			.getTime()
																			&& printDate
																					.getTime() <= endDate
																					.getTime() ? ' ' + $.datepicker._currentClass
																			: '')
																	+ (printDate
																			.getTime() == today
																			.getTime() ? ' ui-datepicker-today'
																			: ''))
													+ '"'
													+ ((!otherMonth || showOtherMonths)
															&& daySettings[2] ? ' title="' + daySettings[2] + '"'
															: '')
													+ (unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + ' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"'
															: '')
															: ' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')'
																	+ (highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')'
																			: '')
																	+ ';'
																	+ (!showStatus
																			|| (otherMonth && !showOtherMonths) ? ''
																			: 'jQuery(\'#ui-datepicker-status-'
																					+ this._id
																					+ '\').html(\''
																					+ (dateStatus
																							.apply(
																									(this._input ? this._input[0]
																											: null),
																									[
																											printDate,
																											this ]) || '&#xa0;')
																					+ '\');')
																	+ '"'
																	+ ' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')'
																	+ (highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')'
																			: '')
																	+ ';'
																	+ (!showStatus
																			|| (otherMonth && !showOtherMonths) ? ''
																			: 'jQuery(\'#ui-datepicker-status-' + this._id + '\').html(\'&#xa0;\');')
																	+ '" onclick="jQuery.datepicker._selectDay('
																	+ this._id
																	+ ','
																	+ drawMonth
																	+ ','
																	+ drawYear
																	+ ', this);"')
													+ '>'
													+ (otherMonth ? (showOtherMonths ? printDate
															.getDate()
															: '&#xa0;')
															: (unselectable ? printDate
																	.getDate()
																	: '<a>' + printDate
																			.getDate() + '</a>'))
													+ '</td>';
											printDate.setDate(printDate
													.getDate() + 1);
										}
										html += '</tr>';
									}
									drawMonth++;
									if (drawMonth > 11) {
										drawMonth = 0;
										drawYear++;
									}
									html += '</tbody></table></div>';
								}
							html += (showStatus ? '<span class="datepicker_ocupado" style="height:15px;width:15px;margin:5px; float:left;"></span><span style="color:#888; float:left; font-size:0.8em; heigth:15px">Días ocupados</span><div style="clear: both;"></div><div id="ui-datepicker-status-'
									+ this._id
									+ '" class="ui-datepicker-status">'
									+ (this._get('initStatus') || '&#xa0;')
									+ '</div>'
									: '')
									+ (!closeAtTop && !this._inline ? controls
											: '')
									+ '<div style="clear: both;"></div>'
									+ ($.browser.msie
											&& parseInt($.browser.version) < 7
											&& !this._inline ? '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>'
											: '');
							return html;
						},
						_generateMonthYearHeader : function(drawMonth,
								drawYear, minDate, maxDate, selectedDate,
								secondary) {
							minDate = (this._rangeStart && minDate
									&& selectedDate < minDate ? selectedDate
									: minDate);
							var showStatus = true;
							var html = '<div class="ui-datepicker-header">';
							var monthNames = this._get('monthNames');
							if (secondary || !this._get('changeMonth'))
								html += monthNames[drawMonth] + '&#xa0;';
							else {
								var inMinYear = (minDate && minDate
										.getFullYear() == drawYear);
								var inMaxYear = (maxDate && maxDate
										.getFullYear() == drawYear);
								html += '<select class="ui-datepicker-new-month" '
										+ 'onchange="jQuery.datepicker._selectMonthYear('
										+ this._id
										+ ', this, \'M\');" '
										+ 'onclick="jQuery.datepicker._clickMonthYear('
										+ this._id
										+ ');"'
										+ (showStatus ? this
												._addStatus(this
														._get('monthStatus') || '&#xa0;')
												: '') + '>';
								for ( var month = 0; month < 12; month++) {
									if ((!inMinYear || month >= minDate
											.getMonth())
											&& (!inMaxYear || month <= maxDate
													.getMonth()))
										html += '<option value="'
												+ month
												+ '"'
												+ (month == drawMonth ? ' selected="selected"'
														: '') + '>'
												+ monthNames[month]
												+ '</option>';
								}
								html += '</select>';
							}
							if (secondary || !this._get('changeYear'))
								html += drawYear;
							else {
								var years = this._get('yearRange').split(':');
								var year = 0;
								var endYear = 0;
								if (years.length != 2) {
									year = drawYear - 10;
									endYear = drawYear + 10;
								} else if (years[0].charAt(0) == '+'
										|| years[0].charAt(0) == '-') {
									year = endYear = new Date().getFullYear();
									year += parseInt(years[0], 10);
									endYear += parseInt(years[1], 10);
								} else {
									year = parseInt(years[0], 10);
									endYear = parseInt(years[1], 10);
								}
								year = (minDate ? Math.max(year, minDate
										.getFullYear()) : year);
								endYear = (maxDate ? Math.min(endYear, maxDate
										.getFullYear()) : endYear);
								html += '<select class="ui-datepicker-new-year" '
										+ 'onchange="jQuery.datepicker._selectMonthYear('
										+ this._id
										+ ', this, \'Y\');" '
										+ 'onclick="jQuery.datepicker._clickMonthYear('
										+ this._id
										+ ');"'
										+ (showStatus ? this
												._addStatus(this
														._get('yearStatus') || '&#xa0;')
												: '') + '>';
								for (; year <= endYear; year++) {
									html += '<option value="'
											+ year
											+ '"'
											+ (year == drawYear ? ' selected="selected"'
													: '') + '>' + year
											+ '</option>';
								}
								html += '</select>';
							}
							html += '</div>';
							return html;
						},
						_addStatus : function(text) {
							return ' onmouseover="jQuery(\'#ui-datepicker-status-'
									+ this._id
									+ '\').html(\''
									+ text
									+ '\');" '
									+ 'onmouseout="jQuery(\'#ui-datepicker-status-'
									+ this._id + '\').html(\'&#xa0;\');"';
						},
						_adjustDate : function(offset, period) {
							var year = this._drawYear
									+ (period == 'Y' ? offset : 0);
							var month = this._drawMonth
									+ (period == 'M' ? offset : 0);
							var day = Math.min(this._selectedDay, this
									._getDaysInMonth(year, month))
									+ (period == 'D' ? offset : 0);
							var date = new Date(year, month, day);
							var minDate = this._getMinMaxDate('min', true);
							var maxDate = this._getMinMaxDate('max');
							date = (minDate && date < minDate ? minDate : date);
							date = (maxDate && date > maxDate ? maxDate : date);
							this._selectedDay = date.getDate();
							this._drawMonth = this._selectedMonth = date
									.getMonth();
							this._drawYear = this._selectedYear = date
									.getFullYear();
							if (period == 'M' || period == 'Y')
								this._notifyChange();
						},
						_notifyChange : function() {
							var onChange = this._get('onChangeMonthYear');
							if (onChange)
								onChange
										.apply(
												(this._input ? this._input[0]
														: null),
												[
														new Date(
																this._selectedYear,
																this._selectedMonth,
																1), this ]);
						},
						_getNumberOfMonths : function() {
							var numMonths = this._get('numberOfMonths');
							return (numMonths == null ? [ 1, 1 ]
									: (typeof numMonths == 'number' ? [ 1,
											numMonths ] : numMonths));
						},
						_getMinMaxDate : function(minMax, checkRange) {
							var date = this._determineDate(minMax + 'Date',
									null);
							if (date) {
								date.setHours(0);
								date.setMinutes(0);
								date.setSeconds(0);
								date.setMilliseconds(0);
							}
							return (!checkRange || !this._rangeStart ? date
									: (!date || this._rangeStart > date ? this._rangeStart
											: date));
						},
						_getDaysInMonth : function(year, month) {
							return 32 - new Date(year, month, 32).getDate();
						},
						_getFirstDayOfMonth : function(year, month) {
							return new Date(year, month, 1).getDay();
						},
						_canAdjustMonth : function(offset, curYear, curMonth) {
							var numMonths = this._getNumberOfMonths();
							var date = new Date(curYear, curMonth
									+ (offset < 0 ? offset : numMonths[1]), 1);
							if (offset < 0)
								date.setDate(this._getDaysInMonth(date
										.getFullYear(), date.getMonth()));
							return this._isInRange(date);
						},
						_isInRange : function(date) {
							var newMinDate = (!this._rangeStart ? null
									: new Date(this._selectedYear,
											this._selectedMonth,
											this._selectedDay));
							newMinDate = (newMinDate
									&& this._rangeStart < newMinDate ? this._rangeStart
									: newMinDate);
							var minDate = newMinDate
									|| this._getMinMaxDate('min');
							var maxDate = this._getMinMaxDate('max');
							return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
						},
						_getFormatConfig : function() {
							var shortYearCutoff = this._get('shortYearCutoff');
							shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff
									: new Date().getFullYear() % 100
											+ parseInt(shortYearCutoff, 10));
							return {
								shortYearCutoff :shortYearCutoff,
								dayNamesShort :this._get('dayNamesShort'),
								dayNames :this._get('dayNames'),
								monthNamesShort :this._get('monthNamesShort'),
								monthNames :this._get('monthNames')
							};
						},
						_formatDate : function(day, month, year) {
							if (!day) {
								this._currentDay = this._selectedDay;
								this._currentMonth = this._selectedMonth;
								this._currentYear = this._selectedYear;
							}
							var date = (day ? (typeof day == 'object' ? day
									: new Date(year, month, day)) : new Date(
									this._currentYear, this._currentMonth,
									this._currentDay));
							return $.datepicker.formatDate(this
									._get('dateFormat'), date, this
									._getFormatConfig());
						}
					});
	function extendRemove(target, props) {
		$.extend(target, props);
		for ( var name in props)
			if (props[name] == null || props[name] == undefined)
				target[name] = props[name];
		return target;
	}
	;
	function isArray(a) {
		return (a && (($.browser.safari && typeof a == 'object' && a.length) || (a.constructor && a.constructor
				.toString().match(/\Array\(\)/))));
	}
	;
	$.fn.datepicker = function(options) {
		var otherArgs = Array.prototype.slice.call(arguments, 1);
		if (typeof options == 'string'
				&& (options == 'isDisabled' || options == 'getDate'))
			return $.datepicker['_' + options + 'Datepicker'].apply(
					$.datepicker, [ this[0] ].concat(otherArgs));
		return this
				.each( function() {
					typeof options == 'string' ? $.datepicker['_' + options + 'Datepicker']
							.apply($.datepicker, [ this ].concat(otherArgs))
							: $.datepicker._attachDatepicker(this, options);
				});
	};
	$.datepicker = new Datepicker();
	$(document).ready(
			function() {
				$(document.body).append($.datepicker._datepickerDiv).mousedown(
						$.datepicker._checkExternalClick);
			});
})(jQuery);