Applied update of jquery timepicker
authorSascha Greuel <sascha@softcreatr.de>
Sun, 25 Aug 2013 17:30:06 +0000 (19:30 +0200)
committerSascha Greuel <sascha@softcreatr.de>
Sun, 25 Aug 2013 17:30:06 +0000 (19:30 +0200)
Additionally, i've added the source of it

wcfsetup/install/files/js/3rdParty/jquery-ui.timepicker.js [new file with mode: 0644]
wcfsetup/install/files/js/3rdParty/jquery-ui.timepicker.min.js

diff --git a/wcfsetup/install/files/js/3rdParty/jquery-ui.timepicker.js b/wcfsetup/install/files/js/3rdParty/jquery-ui.timepicker.js
new file mode 100644 (file)
index 0000000..1642fd2
--- /dev/null
@@ -0,0 +1,2134 @@
+/*! jQuery Timepicker Addon - v1.4 - 2013-08-11
+* http://trentrichardson.com/examples/timepicker
+* Copyright (c) 2013 Trent Richardson; Licensed MIT */
+(function ($) {
+
+       /*
+       * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
+       */
+       $.ui.timepicker = $.ui.timepicker || {};
+       if ($.ui.timepicker.version) {
+               return;
+       }
+
+       /*
+       * Extend jQueryUI, get it started with our version number
+       */
+       $.extend($.ui, {
+               timepicker: {
+                       version: "1.4"
+               }
+       });
+
+       /* 
+       * Timepicker manager.
+       * Use the singleton instance of this class, $.timepicker, to interact with the time picker.
+       * Settings for (groups of) time pickers are maintained in an instance object,
+       * allowing multiple different settings on the same page.
+       */
+       var Timepicker = function () {
+               this.regional = []; // Available regional settings, indexed by language code
+               this.regional[''] = { // Default regional settings
+                       currentText: 'Now',
+                       closeText: 'Done',
+                       amNames: ['AM', 'A'],
+                       pmNames: ['PM', 'P'],
+                       timeFormat: 'HH:mm',
+                       timeSuffix: '',
+                       timeOnlyTitle: 'Choose Time',
+                       timeText: 'Time',
+                       hourText: 'Hour',
+                       minuteText: 'Minute',
+                       secondText: 'Second',
+                       millisecText: 'Millisecond',
+                       microsecText: 'Microsecond',
+                       timezoneText: 'Time Zone',
+                       isRTL: false
+               };
+               this._defaults = { // Global defaults for all the datetime picker instances
+                       showButtonPanel: true,
+                       timeOnly: false,
+                       showHour: null,
+                       showMinute: null,
+                       showSecond: null,
+                       showMillisec: null,
+                       showMicrosec: null,
+                       showTimezone: null,
+                       showTime: true,
+                       stepHour: 1,
+                       stepMinute: 1,
+                       stepSecond: 1,
+                       stepMillisec: 1,
+                       stepMicrosec: 1,
+                       hour: 0,
+                       minute: 0,
+                       second: 0,
+                       millisec: 0,
+                       microsec: 0,
+                       timezone: null,
+                       hourMin: 0,
+                       minuteMin: 0,
+                       secondMin: 0,
+                       millisecMin: 0,
+                       microsecMin: 0,
+                       hourMax: 23,
+                       minuteMax: 59,
+                       secondMax: 59,
+                       millisecMax: 999,
+                       microsecMax: 999,
+                       minDateTime: null,
+                       maxDateTime: null,
+                       onSelect: null,
+                       hourGrid: 0,
+                       minuteGrid: 0,
+                       secondGrid: 0,
+                       millisecGrid: 0,
+                       microsecGrid: 0,
+                       alwaysSetTime: true,
+                       separator: ' ',
+                       altFieldTimeOnly: true,
+                       altTimeFormat: null,
+                       altSeparator: null,
+                       altTimeSuffix: null,
+                       pickerTimeFormat: null,
+                       pickerTimeSuffix: null,
+                       showTimepicker: true,
+                       timezoneList: null,
+                       addSliderAccess: false,
+                       sliderAccessArgs: null,
+                       controlType: 'slider',
+                       defaultValue: null,
+                       parse: 'strict'
+               };
+               $.extend(this._defaults, this.regional['']);
+       };
+
+       $.extend(Timepicker.prototype, {
+               $input: null,
+               $altInput: null,
+               $timeObj: null,
+               inst: null,
+               hour_slider: null,
+               minute_slider: null,
+               second_slider: null,
+               millisec_slider: null,
+               microsec_slider: null,
+               timezone_select: null,
+               hour: 0,
+               minute: 0,
+               second: 0,
+               millisec: 0,
+               microsec: 0,
+               timezone: null,
+               hourMinOriginal: null,
+               minuteMinOriginal: null,
+               secondMinOriginal: null,
+               millisecMinOriginal: null,
+               microsecMinOriginal: null,
+               hourMaxOriginal: null,
+               minuteMaxOriginal: null,
+               secondMaxOriginal: null,
+               millisecMaxOriginal: null,
+               microsecMaxOriginal: null,
+               ampm: '',
+               formattedDate: '',
+               formattedTime: '',
+               formattedDateTime: '',
+               timezoneList: null,
+               units: ['hour', 'minute', 'second', 'millisec', 'microsec'],
+               support: {},
+               control: null,
+
+               /* 
+               * Override the default settings for all instances of the time picker.
+               * @param  {Object} settings  object - the new settings to use as defaults (anonymous object)
+               * @return {Object} the manager object
+               */
+               setDefaults: function (settings) {
+                       extendRemove(this._defaults, settings || {});
+                       return this;
+               },
+
+               /*
+               * Create a new Timepicker instance
+               */
+               _newInst: function ($input, opts) {
+                       var tp_inst = new Timepicker(),
+                               inlineSettings = {},
+                               fns = {},
+                               overrides, i;
+
+                       for (var attrName in this._defaults) {
+                               if (this._defaults.hasOwnProperty(attrName)) {
+                                       var attrValue = $input.attr('time:' + attrName);
+                                       if (attrValue) {
+                                               try {
+                                                       inlineSettings[attrName] = eval(attrValue);
+                                               } catch (err) {
+                                                       inlineSettings[attrName] = attrValue;
+                                               }
+                                       }
+                               }
+                       }
+
+                       overrides = {
+                               beforeShow: function (input, dp_inst) {
+                                       if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {
+                                               return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);
+                                       }
+                               },
+                               onChangeMonthYear: function (year, month, dp_inst) {
+                                       // Update the time as well : this prevents the time from disappearing from the $input field.
+                                       tp_inst._updateDateTime(dp_inst);
+                                       if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {
+                                               tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
+                                       }
+                               },
+                               onClose: function (dateText, dp_inst) {
+                                       if (tp_inst.timeDefined === true && $input.val() !== '') {
+                                               tp_inst._updateDateTime(dp_inst);
+                                       }
+                                       if ($.isFunction(tp_inst._defaults.evnts.onClose)) {
+                                               tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);
+                                       }
+                               }
+                       };
+                       for (i in overrides) {
+                               if (overrides.hasOwnProperty(i)) {
+                                       fns[i] = opts[i] || null;
+                               }
+                       }
+
+                       tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {
+                               evnts: fns,
+                               timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
+                       });
+                       tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {
+                               return val.toUpperCase();
+                       });
+                       tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {
+                               return val.toUpperCase();
+                       });
+
+                       // detect which units are supported
+                       tp_inst.support = detectSupport(
+                                       tp_inst._defaults.timeFormat + 
+                                       (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') +
+                                       (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : ''));
+
+                       // controlType is string - key to our this._controls
+                       if (typeof(tp_inst._defaults.controlType) === 'string') {
+                               if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') {
+                                       tp_inst._defaults.controlType = 'select';
+                               }
+                               tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];
+                       }
+                       // controlType is an object and must implement create, options, value methods
+                       else {
+                               tp_inst.control = tp_inst._defaults.controlType;
+                       }
+
+                       // prep the timezone options
+                       var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60,
+                                       0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];
+                       if (tp_inst._defaults.timezoneList !== null) {
+                               timezoneList = tp_inst._defaults.timezoneList;
+                       }
+                       var tzl = timezoneList.length, tzi = 0, tzv = null;
+                       if (tzl > 0 && typeof timezoneList[0] !== 'object') {
+                               for (; tzi < tzl; tzi++) {
+                                       tzv = timezoneList[tzi];
+                                       timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) };
+                               }
+                       }
+                       tp_inst._defaults.timezoneList = timezoneList;
+
+                       // set the default units
+                       tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) :
+                                                       ((new Date()).getTimezoneOffset() * -1);
+                       tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin :
+                                                       tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
+                       tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin :
+                                                       tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
+                       tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin :
+                                                       tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;
+                       tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin :
+                                                       tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
+                       tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin :
+                                                       tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;
+                       tp_inst.ampm = '';
+                       tp_inst.$input = $input;
+
+                       if (tp_inst._defaults.altField) {
+                               tp_inst.$altInput = $(tp_inst._defaults.altField).css({
+                                       cursor: 'pointer'
+                               }).focus(function () {
+                                       $input.trigger("focus");
+                               });
+                       }
+
+                       if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {
+                               tp_inst._defaults.minDate = new Date();
+                       }
+                       if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {
+                               tp_inst._defaults.maxDate = new Date();
+                       }
+
+                       // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
+                       if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {
+                               tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
+                       }
+                       if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {
+                               tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
+                       }
+                       if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {
+                               tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
+                       }
+                       if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {
+                               tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
+                       }
+                       tp_inst.$input.bind('focus', function () {
+                               tp_inst._onFocus();
+                       });
+
+                       return tp_inst;
+               },
+
+               /*
+               * add our sliders to the calendar
+               */
+               _addTimePicker: function (dp_inst) {
+                       var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val();
+
+                       this.timeDefined = this._parseTime(currDT);
+                       this._limitMinMaxDateTime(dp_inst, false);
+                       this._injectTimePicker();
+               },
+
+               /*
+               * parse the time string from input value or _setTime
+               */
+               _parseTime: function (timeString, withDate) {
+                       if (!this.inst) {
+                               this.inst = $.datepicker._getInst(this.$input[0]);
+                       }
+
+                       if (withDate || !this._defaults.timeOnly) {
+                               var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
+                               try {
+                                       var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);
+                                       if (!parseRes.timeObj) {
+                                               return false;
+                                       }
+                                       $.extend(this, parseRes.timeObj);
+                               } catch (err) {
+                                       $.timepicker.log("Error parsing the date/time string: " + err +
+                                                                       "\ndate/time string = " + timeString +
+                                                                       "\ntimeFormat = " + this._defaults.timeFormat +
+                                                                       "\ndateFormat = " + dp_dateFormat);
+                                       return false;
+                               }
+                               return true;
+                       } else {
+                               var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);
+                               if (!timeObj) {
+                                       return false;
+                               }
+                               $.extend(this, timeObj);
+                               return true;
+                       }
+               },
+
+               /*
+               * generate and inject html for timepicker into ui datepicker
+               */
+               _injectTimePicker: function () {
+                       var $dp = this.inst.dpDiv,
+                               o = this.inst.settings,
+                               tp_inst = this,
+                               litem = '',
+                               uitem = '',
+                               show = null,
+                               max = {},
+                               gridSize = {},
+                               size = null,
+                               i = 0,
+                               l = 0;
+
+                       // Prevent displaying twice
+                       if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) {
+                               var noDisplay = ' style="display:none;"',
+                                       html = '<div class="ui-timepicker-div' + (o.isRTL ? ' ui-timepicker-rtl' : '') + '"><dl>' + '<dt class="ui_tpicker_time_label"' + ((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
+                                                               '<dd class="ui_tpicker_time"' + ((o.showTime) ? '' : noDisplay) + '></dd>';
+
+                               // Create the markup
+                               for (i = 0, l = this.units.length; i < l; i++) {
+                                       litem = this.units[i];
+                                       uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
+                                       show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
+
+                                       // Added by Peter Medeiros:
+                                       // - Figure out what the hour/minute/second max should be based on the step values.
+                                       // - Example: if stepMinute is 15, then minMax is 45.
+                                       max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10);
+                                       gridSize[litem] = 0;
+
+                                       html += '<dt class="ui_tpicker_' + litem + '_label"' + (show ? '' : noDisplay) + '>' + o[litem + 'Text'] + '</dt>' +
+                                                               '<dd class="ui_tpicker_' + litem + '"><div class="ui_tpicker_' + litem + '_slider"' + (show ? '' : noDisplay) + '></div>';
+
+                                       if (show && o[litem + 'Grid'] > 0) {
+                                               html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
+
+                                               if (litem === 'hour') {
+                                                       for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) {
+                                                               gridSize[litem]++;
+                                                               var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o);
+                                                               html += '<td data-for="' + litem + '">' + tmph + '</td>';
+                                                       }
+                                               }
+                                               else {
+                                                       for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) {
+                                                               gridSize[litem]++;
+                                                               html += '<td data-for="' + litem + '">' + ((m < 10) ? '0' : '') + m + '</td>';
+                                                       }
+                                               }
+
+                                               html += '</tr></table></div>';
+                                       }
+                                       html += '</dd>';
+                               }
+                               
+                               // Timezone
+                               var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;
+                               html += '<dt class="ui_tpicker_timezone_label"' + (showTz ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
+                               html += '<dd class="ui_tpicker_timezone" ' + (showTz ? '' : noDisplay) + '></dd>';
+
+                               // Create the elements from string
+                               html += '</dl></div>';
+                               var $tp = $(html);
+
+                               // if we only want time picker...
+                               if (o.timeOnly === true) {
+                                       $tp.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' + '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' + '</div>');
+                                       $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
+                               }
+                               
+                               // add sliders, adjust grids, add events
+                               for (i = 0, l = tp_inst.units.length; i < l; i++) {
+                                       litem = tp_inst.units[i];
+                                       uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
+                                       show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
+
+                                       // add the slider
+                                       tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]);
+
+                                       // adjust the grid and add click event
+                                       if (show && o[litem + 'Grid'] > 0) {
+                                               size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']);
+                                               $tp.find('.ui_tpicker_' + litem + ' table').css({
+                                                       width: size + "%",
+                                                       marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"),
+                                                       marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0',
+                                                       borderCollapse: 'collapse'
+                                               }).find("td").click(function (e) {
+                                                               var $t = $(this),
+                                                                       h = $t.html(),
+                                                                       n = parseInt(h.replace(/[^0-9]/g), 10),
+                                                                       ap = h.replace(/[^apm]/ig),
+                                                                       f = $t.data('for'); // loses scope, so we use data-for
+
+                                                               if (f === 'hour') {
+                                                                       if (ap.indexOf('p') !== -1 && n < 12) {
+                                                                               n += 12;
+                                                                       }
+                                                                       else {
+                                                                               if (ap.indexOf('a') !== -1 && n === 12) {
+                                                                                       n = 0;
+                                                                               }
+                                                                       }
+                                                               }
+                                                               
+                                                               tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n);
+
+                                                               tp_inst._onTimeChange();
+                                                               tp_inst._onSelectHandler();
+                                                       }).css({
+                                                               cursor: 'pointer',
+                                                               width: (100 / gridSize[litem]) + '%',
+                                                               textAlign: 'center',
+                                                               overflow: 'hidden'
+                                                       });
+                                       } // end if grid > 0
+                               } // end for loop
+
+                               // Add timezone options
+                               this.timezone_select = $tp.find('.ui_tpicker_timezone').append('<select></select>').find("select");
+                               $.fn.append.apply(this.timezone_select,
+                               $.map(o.timezoneList, function (val, idx) {
+                                       return $("<option />").val(typeof val === "object" ? val.value : val).text(typeof val === "object" ? val.label : val);
+                               }));
+                               if (typeof(this.timezone) !== "undefined" && this.timezone !== null && this.timezone !== "") {
+                                       var local_timezone = (new Date(this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12)).getTimezoneOffset() * -1;
+                                       if (local_timezone === this.timezone) {
+                                               selectLocalTimezone(tp_inst);
+                                       } else {
+                                               this.timezone_select.val(this.timezone);
+                                       }
+                               } else {
+                                       if (typeof(this.hour) !== "undefined" && this.hour !== null && this.hour !== "") {
+                                               this.timezone_select.val(o.timezone);
+                                       } else {
+                                               selectLocalTimezone(tp_inst);
+                                       }
+                               }
+                               this.timezone_select.change(function () {
+                                       tp_inst._onTimeChange();
+                                       tp_inst._onSelectHandler();
+                               });
+                               // End timezone options
+                               
+                               // inject timepicker into datepicker
+                               var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
+                               if ($buttonPanel.length) {
+                                       $buttonPanel.before($tp);
+                               } else {
+                                       $dp.append($tp);
+                               }
+
+                               this.$timeObj = $tp.find('.ui_tpicker_time');
+
+                               if (this.inst !== null) {
+                                       var timeDefined = this.timeDefined;
+                                       this._onTimeChange();
+                                       this.timeDefined = timeDefined;
+                               }
+
+                               // slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
+                               if (this._defaults.addSliderAccess) {
+                                       var sliderAccessArgs = this._defaults.sliderAccessArgs,
+                                               rtl = this._defaults.isRTL;
+                                       sliderAccessArgs.isRTL = rtl;
+                                               
+                                       setTimeout(function () { // fix for inline mode
+                                               if ($tp.find('.ui-slider-access').length === 0) {
+                                                       $tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
+
+                                                       // fix any grids since sliders are shorter
+                                                       var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
+                                                       if (sliderAccessWidth) {
+                                                               $tp.find('table:visible').each(function () {
+                                                                       var $g = $(this),
+                                                                               oldWidth = $g.outerWidth(),
+                                                                               oldMarginLeft = $g.css(rtl ? 'marginRight' : 'marginLeft').toString().replace('%', ''),
+                                                                               newWidth = oldWidth - sliderAccessWidth,
+                                                                               newMarginLeft = ((oldMarginLeft * newWidth) / oldWidth) + '%',
+                                                                               css = { width: newWidth, marginRight: 0, marginLeft: 0 };
+                                                                       css[rtl ? 'marginRight' : 'marginLeft'] = newMarginLeft;
+                                                                       $g.css(css);
+                                                               });
+                                                       }
+                                               }
+                                       }, 10);
+                               }
+                               // end slideAccess integration
+
+                               tp_inst._limitMinMaxDateTime(this.inst, true);
+                       }
+               },
+
+               /*
+               * This function tries to limit the ability to go outside the
+               * min/max date range
+               */
+               _limitMinMaxDateTime: function (dp_inst, adjustSliders) {
+                       var o = this._defaults,
+                               dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
+
+                       if (!this._defaults.showTimepicker) {
+                               return;
+                       } // No time so nothing to check here
+
+                       if ($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date) {
+                               var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
+                                       minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
+
+                               if (this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null || this.microsecMinOriginal === null) {
+                                       this.hourMinOriginal = o.hourMin;
+                                       this.minuteMinOriginal = o.minuteMin;
+                                       this.secondMinOriginal = o.secondMin;
+                                       this.millisecMinOriginal = o.millisecMin;
+                                       this.microsecMinOriginal = o.microsecMin;
+                               }
+
+                               if (dp_inst.settings.timeOnly || minDateTimeDate.getTime() === dp_date.getTime()) {
+                                       this._defaults.hourMin = minDateTime.getHours();
+                                       if (this.hour <= this._defaults.hourMin) {
+                                               this.hour = this._defaults.hourMin;
+                                               this._defaults.minuteMin = minDateTime.getMinutes();
+                                               if (this.minute <= this._defaults.minuteMin) {
+                                                       this.minute = this._defaults.minuteMin;
+                                                       this._defaults.secondMin = minDateTime.getSeconds();
+                                                       if (this.second <= this._defaults.secondMin) {
+                                                               this.second = this._defaults.secondMin;
+                                                               this._defaults.millisecMin = minDateTime.getMilliseconds();
+                                                               if (this.millisec <= this._defaults.millisecMin) {
+                                                                       this.millisec = this._defaults.millisecMin;
+                                                                       this._defaults.microsecMin = minDateTime.getMicroseconds();
+                                                               } else {
+                                                                       if (this.microsec < this._defaults.microsecMin) {
+                                                                               this.microsec = this._defaults.microsecMin;
+                                                                       }
+                                                                       this._defaults.microsecMin = this.microsecMinOriginal;
+                                                               }
+                                                       } else {
+                                                               this._defaults.millisecMin = this.millisecMinOriginal;
+                                                               this._defaults.microsecMin = this.microsecMinOriginal;
+                                                       }
+                                               } else {
+                                                       this._defaults.secondMin = this.secondMinOriginal;
+                                                       this._defaults.millisecMin = this.millisecMinOriginal;
+                                                       this._defaults.microsecMin = this.microsecMinOriginal;
+                                               }
+                                       } else {
+                                               this._defaults.minuteMin = this.minuteMinOriginal;
+                                               this._defaults.secondMin = this.secondMinOriginal;
+                                               this._defaults.millisecMin = this.millisecMinOriginal;
+                                               this._defaults.microsecMin = this.microsecMinOriginal;
+                                       }
+                               } else {
+                                       this._defaults.hourMin = this.hourMinOriginal;
+                                       this._defaults.minuteMin = this.minuteMinOriginal;
+                                       this._defaults.secondMin = this.secondMinOriginal;
+                                       this._defaults.millisecMin = this.millisecMinOriginal;
+                                       this._defaults.microsecMin = this.microsecMinOriginal;
+                               }
+                       }
+
+                       if ($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date) {
+                               var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
+                                       maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
+
+                               if (this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null || this.millisecMaxOriginal === null) {
+                                       this.hourMaxOriginal = o.hourMax;
+                                       this.minuteMaxOriginal = o.minuteMax;
+                                       this.secondMaxOriginal = o.secondMax;
+                                       this.millisecMaxOriginal = o.millisecMax;
+                                       this.microsecMaxOriginal = o.microsecMax;
+                               }
+
+                               if (dp_inst.settings.timeOnly || maxDateTimeDate.getTime() === dp_date.getTime()) {
+                                       this._defaults.hourMax = maxDateTime.getHours();
+                                       if (this.hour >= this._defaults.hourMax) {
+                                               this.hour = this._defaults.hourMax;
+                                               this._defaults.minuteMax = maxDateTime.getMinutes();
+                                               if (this.minute >= this._defaults.minuteMax) {
+                                                       this.minute = this._defaults.minuteMax;
+                                                       this._defaults.secondMax = maxDateTime.getSeconds();
+                                                       if (this.second >= this._defaults.secondMax) {
+                                                               this.second = this._defaults.secondMax;
+                                                               this._defaults.millisecMax = maxDateTime.getMilliseconds();
+                                                               if (this.millisec >= this._defaults.millisecMax) {
+                                                                       this.millisec = this._defaults.millisecMax;
+                                                                       this._defaults.microsecMax = maxDateTime.getMicroseconds();
+                                                               } else {
+                                                                       if (this.microsec > this._defaults.microsecMax) {
+                                                                               this.microsec = this._defaults.microsecMax;
+                                                                       }
+                                                                       this._defaults.microsecMax = this.microsecMaxOriginal;
+                                                               }
+                                                       } else {
+                                                               this._defaults.millisecMax = this.millisecMaxOriginal;
+                                                               this._defaults.microsecMax = this.microsecMaxOriginal;
+                                                       }
+                                               } else {
+                                                       this._defaults.secondMax = this.secondMaxOriginal;
+                                                       this._defaults.millisecMax = this.millisecMaxOriginal;
+                                                       this._defaults.microsecMax = this.microsecMaxOriginal;
+                                               }
+                                       } else {
+                                               this._defaults.minuteMax = this.minuteMaxOriginal;
+                                               this._defaults.secondMax = this.secondMaxOriginal;
+                                               this._defaults.millisecMax = this.millisecMaxOriginal;
+                                               this._defaults.microsecMax = this.microsecMaxOriginal;
+                                       }
+                               } else {
+                                       this._defaults.hourMax = this.hourMaxOriginal;
+                                       this._defaults.minuteMax = this.minuteMaxOriginal;
+                                       this._defaults.secondMax = this.secondMaxOriginal;
+                                       this._defaults.millisecMax = this.millisecMaxOriginal;
+                                       this._defaults.microsecMax = this.microsecMaxOriginal;
+                               }
+                       }
+
+                       if (adjustSliders !== undefined && adjustSliders === true) {
+                               var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)), 10),
+                                       minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)), 10),
+                                       secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)), 10),
+                                       millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)), 10),
+                                       microsecMax = parseInt((this._defaults.microsecMax - ((this._defaults.microsecMax - this._defaults.microsecMin) % this._defaults.stepMicrosec)), 10);
+
+                               if (this.hour_slider) {
+                                       this.control.options(this, this.hour_slider, 'hour', { min: this._defaults.hourMin, max: hourMax });
+                                       this.control.value(this, this.hour_slider, 'hour', this.hour - (this.hour % this._defaults.stepHour));
+                               }
+                               if (this.minute_slider) {
+                                       this.control.options(this, this.minute_slider, 'minute', { min: this._defaults.minuteMin, max: minMax });
+                                       this.control.value(this, this.minute_slider, 'minute', this.minute - (this.minute % this._defaults.stepMinute));
+                               }
+                               if (this.second_slider) {
+                                       this.control.options(this, this.second_slider, 'second', { min: this._defaults.secondMin, max: secMax });
+                                       this.control.value(this, this.second_slider, 'second', this.second - (this.second % this._defaults.stepSecond));
+                               }
+                               if (this.millisec_slider) {
+                                       this.control.options(this, this.millisec_slider, 'millisec', { min: this._defaults.millisecMin, max: millisecMax });
+                                       this.control.value(this, this.millisec_slider, 'millisec', this.millisec - (this.millisec % this._defaults.stepMillisec));
+                               }
+                               if (this.microsec_slider) {
+                                       this.control.options(this, this.microsec_slider, 'microsec', { min: this._defaults.microsecMin, max: microsecMax });
+                                       this.control.value(this, this.microsec_slider, 'microsec', this.microsec - (this.microsec % this._defaults.stepMicrosec));
+                               }
+                       }
+
+               },
+
+               /*
+               * when a slider moves, set the internal time...
+               * on time change is also called when the time is updated in the text field
+               */
+               _onTimeChange: function () {
+                       if (!this._defaults.showTimepicker) {
+                                return;
+                       }
+                       var hour = (this.hour_slider) ? this.control.value(this, this.hour_slider, 'hour') : false,
+                               minute = (this.minute_slider) ? this.control.value(this, this.minute_slider, 'minute') : false,
+                               second = (this.second_slider) ? this.control.value(this, this.second_slider, 'second') : false,
+                               millisec = (this.millisec_slider) ? this.control.value(this, this.millisec_slider, 'millisec') : false,
+                               microsec = (this.microsec_slider) ? this.control.value(this, this.microsec_slider, 'microsec') : false,
+                               timezone = (this.timezone_select) ? this.timezone_select.val() : false,
+                               o = this._defaults,
+                               pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,
+                               pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;
+
+                       if (typeof(hour) === 'object') {
+                               hour = false;
+                       }
+                       if (typeof(minute) === 'object') {
+                               minute = false;
+                       }
+                       if (typeof(second) === 'object') {
+                               second = false;
+                       }
+                       if (typeof(millisec) === 'object') {
+                               millisec = false;
+                       }
+                       if (typeof(microsec) === 'object') {
+                               microsec = false;
+                       }
+                       if (typeof(timezone) === 'object') {
+                               timezone = false;
+                       }
+
+                       if (hour !== false) {
+                               hour = parseInt(hour, 10);
+                       }
+                       if (minute !== false) {
+                               minute = parseInt(minute, 10);
+                       }
+                       if (second !== false) {
+                               second = parseInt(second, 10);
+                       }
+                       if (millisec !== false) {
+                               millisec = parseInt(millisec, 10);
+                       }
+                       if (microsec !== false) {
+                               microsec = parseInt(microsec, 10);
+                       }
+
+                       var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
+
+                       // If the update was done in the input field, the input field should not be updated.
+                       // If the update was done using the sliders, update the input field.
+                       var hasChanged = (hour !== this.hour || minute !== this.minute || second !== this.second || millisec !== this.millisec || microsec !== this.microsec || 
+                                       (this.ampm.length > 0 && (hour < 12) !== ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1)) || (this.timezone !== null && timezone !== this.timezone));
+
+                       if (hasChanged) {
+
+                               if (hour !== false) {
+                                       this.hour = hour;
+                               }
+                               if (minute !== false) {
+                                       this.minute = minute;
+                               }
+                               if (second !== false) {
+                                       this.second = second;
+                               }
+                               if (millisec !== false) {
+                                       this.millisec = millisec;
+                               }
+                               if (microsec !== false) {
+                                       this.microsec = microsec;
+                               }
+                               if (timezone !== false) {
+                                       this.timezone = timezone;
+                               }
+
+                               if (!this.inst) {
+                                       this.inst = $.datepicker._getInst(this.$input[0]);
+                               }
+
+                               this._limitMinMaxDateTime(this.inst, true);
+                       }
+                       if (this.support.ampm) {
+                               this.ampm = ampm;
+                       }
+
+                       // Updates the time within the timepicker
+                       this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);
+                       if (this.$timeObj) {
+                               if (pickerTimeFormat === o.timeFormat) {
+                                       this.$timeObj.text(this.formattedTime + pickerTimeSuffix);
+                               }
+                               else {
+                                       this.$timeObj.text($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
+                               }
+                       }
+
+                       this.timeDefined = true;
+                       if (hasChanged) {
+                               this._updateDateTime();
+                       }
+               },
+
+               /*
+               * call custom onSelect.
+               * bind to sliders slidestop, and grid click.
+               */
+               _onSelectHandler: function () {
+                       var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;
+                       var inputEl = this.$input ? this.$input[0] : null;
+                       if (onSelect && inputEl) {
+                               onSelect.apply(inputEl, [this.formattedDateTime, this]);
+                       }
+               },
+
+               /*
+               * update our input with the new date time..
+               */
+               _updateDateTime: function (dp_inst) {
+                       dp_inst = this.inst || dp_inst;
+                       var dtTmp = (dp_inst.currentYear > 0? 
+                                                       new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay) : 
+                                                       new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
+                               dt = $.datepicker._daylightSavingAdjust(dtTmp),
+                               //dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
+                               //dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay)),
+                               dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
+                               formatCfg = $.datepicker._getFormatConfig(dp_inst),
+                               timeAvailable = dt !== null && this.timeDefined;
+                       this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
+                       var formattedDateTime = this.formattedDate;
+                       
+                       // if a slider was changed but datepicker doesn't have a value yet, set it
+                       if (dp_inst.lastVa === "") {
+                dp_inst.currentYear = dp_inst.selectedYear;
+                dp_inst.currentMonth = dp_inst.selectedMonth;
+                dp_inst.currentDay = dp_inst.selectedDay;
+            }
+
+                       /*
+                       * remove following lines to force every changes in date picker to change the input value
+                       * Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker. 
+                       * If the user manually empty the value in the input field, the date picker will never change selected value.
+                       */
+                       //if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {
+                       //      return;
+                       //}
+
+                       if (this._defaults.timeOnly === true) {
+                               formattedDateTime = this.formattedTime;
+                       } else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
+                               formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
+                       }
+
+                       this.formattedDateTime = formattedDateTime;
+
+                       if (!this._defaults.showTimepicker) {
+                               this.$input.val(this.formattedDate);
+                       } else if (this.$altInput && this._defaults.timeOnly === false && this._defaults.altFieldTimeOnly === true) {
+                               this.$altInput.val(this.formattedTime);
+                               this.$input.val(this.formattedDate);
+                       } else if (this.$altInput) {
+                               this.$input.val(formattedDateTime);
+                               var altFormattedDateTime = '',
+                                       altSeparator = this._defaults.altSeparator ? this._defaults.altSeparator : this._defaults.separator,
+                                       altTimeSuffix = this._defaults.altTimeSuffix ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;
+                               
+                               if (!this._defaults.timeOnly) {
+                                       if (this._defaults.altFormat) {
+                                               altFormattedDateTime = $.datepicker.formatDate(this._defaults.altFormat, (dt === null ? new Date() : dt), formatCfg);
+                                       }
+                                       else {
+                                               altFormattedDateTime = this.formattedDate;
+                                       }
+
+                                       if (altFormattedDateTime) {
+                                               altFormattedDateTime += altSeparator;
+                                       }
+                               }
+
+                               if (this._defaults.altTimeFormat) {
+                                       altFormattedDateTime += $.datepicker.formatTime(this._defaults.altTimeFormat, this, this._defaults) + altTimeSuffix;
+                               }
+                               else {
+                                       altFormattedDateTime += this.formattedTime + altTimeSuffix;
+                               }
+                               this.$altInput.val(altFormattedDateTime);
+                       } else {
+                               this.$input.val(formattedDateTime);
+                       }
+
+                       this.$input.trigger("change");
+               },
+
+               _onFocus: function () {
+                       if (!this.$input.val() && this._defaults.defaultValue) {
+                               this.$input.val(this._defaults.defaultValue);
+                               var inst = $.datepicker._getInst(this.$input.get(0)),
+                                       tp_inst = $.datepicker._get(inst, 'timepicker');
+                               if (tp_inst) {
+                                       if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
+                                               try {
+                                                       $.datepicker._updateDatepicker(inst);
+                                               } catch (err) {
+                                                       $.timepicker.log(err);
+                                               }
+                                       }
+                               }
+                       }
+               },
+
+               /*
+               * Small abstraction to control types
+               * We can add more, just be sure to follow the pattern: create, options, value
+               */
+               _controls: {
+                       // slider methods
+                       slider: {
+                               create: function (tp_inst, obj, unit, val, min, max, step) {
+                                       var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60
+                                       return obj.prop('slide', null).slider({
+                                               orientation: "horizontal",
+                                               value: rtl ? val * -1 : val,
+                                               min: rtl ? max * -1 : min,
+                                               max: rtl ? min * -1 : max,
+                                               step: step,
+                                               slide: function (event, ui) {
+                                                       tp_inst.control.value(tp_inst, $(this), unit, rtl ? ui.value * -1 : ui.value);
+                                                       tp_inst._onTimeChange();
+                                               },
+                                               stop: function (event, ui) {
+                                                       tp_inst._onSelectHandler();
+                                               }
+                                       });     
+                               },
+                               options: function (tp_inst, obj, unit, opts, val) {
+                                       if (tp_inst._defaults.isRTL) {
+                                               if (typeof(opts) === 'string') {
+                                                       if (opts === 'min' || opts === 'max') {
+                                                               if (val !== undefined) {
+                                                                       return obj.slider(opts, val * -1);
+                                                               }
+                                                               return Math.abs(obj.slider(opts));
+                                                       }
+                                                       return obj.slider(opts);
+                                               }
+                                               var min = opts.min, 
+                                                       max = opts.max;
+                                               opts.min = opts.max = null;
+                                               if (min !== undefined) {
+                                                       opts.max = min * -1;
+                                               }
+                                               if (max !== undefined) {
+                                                       opts.min = max * -1;
+                                               }
+                                               return obj.slider(opts);
+                                       }
+                                       if (typeof(opts) === 'string' && val !== undefined) {
+                                               return obj.slider(opts, val);
+                                       }
+                                       return obj.slider(opts);
+                               },
+                               value: function (tp_inst, obj, unit, val) {
+                                       if (tp_inst._defaults.isRTL) {
+                                               if (val !== undefined) {
+                                                       return obj.slider('value', val * -1);
+                                               }
+                                               return Math.abs(obj.slider('value'));
+                                       }
+                                       if (val !== undefined) {
+                                               return obj.slider('value', val);
+                                       }
+                                       return obj.slider('value');
+                               }
+                       },
+                       // select methods
+                       select: {
+                               create: function (tp_inst, obj, unit, val, min, max, step) {
+                                       var sel = '<select class="ui-timepicker-select" data-unit="' + unit + '" data-min="' + min + '" data-max="' + max + '" data-step="' + step + '">',
+                                               format = tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat;
+
+                                       for (var i = min; i <= max; i += step) {
+                                               sel += '<option value="' + i + '"' + (i === val ? ' selected' : '') + '>';
+                                               if (unit === 'hour') {
+                                                       sel += $.datepicker.formatTime($.trim(format.replace(/[^ht ]/ig, '')), {hour: i}, tp_inst._defaults);
+                                               }
+                                               else if (unit === 'millisec' || unit === 'microsec' || i >= 10) { sel += i; }
+                                               else {sel += '0' + i.toString(); }
+                                               sel += '</option>';
+                                       }
+                                       sel += '</select>';
+
+                                       obj.children('select').remove();
+
+                                       $(sel).appendTo(obj).change(function (e) {
+                                               tp_inst._onTimeChange();
+                                               tp_inst._onSelectHandler();
+                                       });
+
+                                       return obj;
+                               },
+                               options: function (tp_inst, obj, unit, opts, val) {
+                                       var o = {},
+                                               $t = obj.children('select');
+                                       if (typeof(opts) === 'string') {
+                                               if (val === undefined) {
+                                                       return $t.data(opts);
+                                               }
+                                               o[opts] = val;  
+                                       }
+                                       else { o = opts; }
+                                       return tp_inst.control.create(tp_inst, obj, $t.data('unit'), $t.val(), o.min || $t.data('min'), o.max || $t.data('max'), o.step || $t.data('step'));
+                               },
+                               value: function (tp_inst, obj, unit, val) {
+                                       var $t = obj.children('select');
+                                       if (val !== undefined) {
+                                               return $t.val(val);
+                                       }
+                                       return $t.val();
+                               }
+                       }
+               } // end _controls
+
+       });
+
+       $.fn.extend({
+               /*
+               * shorthand just to use timepicker.
+               */
+               timepicker: function (o) {
+                       o = o || {};
+                       var tmp_args = Array.prototype.slice.call(arguments);
+
+                       if (typeof o === 'object') {
+                               tmp_args[0] = $.extend(o, {
+                                       timeOnly: true
+                               });
+                       }
+
+                       return $(this).each(function () {
+                               $.fn.datetimepicker.apply($(this), tmp_args);
+                       });
+               },
+
+               /*
+               * extend timepicker to datepicker
+               */
+               datetimepicker: function (o) {
+                       o = o || {};
+                       var tmp_args = arguments;
+
+                       if (typeof(o) === 'string') {
+                               if (o === 'getDate') {
+                                       return $.fn.datepicker.apply($(this[0]), tmp_args);
+                               } else {
+                                       return this.each(function () {
+                                               var $t = $(this);
+                                               $t.datepicker.apply($t, tmp_args);
+                                       });
+                               }
+                       } else {
+                               return this.each(function () {
+                                       var $t = $(this);
+                                       $t.datepicker($.timepicker._newInst($t, o)._defaults);
+                               });
+                       }
+               }
+       });
+
+       /*
+       * Public Utility to parse date and time
+       */
+       $.datepicker.parseDateTime = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
+               var parseRes = parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings);
+               if (parseRes.timeObj) {
+                       var t = parseRes.timeObj;
+                       parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec);
+                       parseRes.date.setMicroseconds(t.microsec);
+               }
+
+               return parseRes.date;
+       };
+
+       /*
+       * Public utility to parse time
+       */
+       $.datepicker.parseTime = function (timeFormat, timeString, options) {
+               var o = extendRemove(extendRemove({}, $.timepicker._defaults), options || {}),
+                       iso8601 = (timeFormat.replace(/\'.*?\'/g, '').indexOf('Z') !== -1);
+
+               // Strict parse requires the timeString to match the timeFormat exactly
+               var strictParse = function (f, s, o) {
+
+                       // pattern for standard and localized AM/PM markers
+                       var getPatternAmpm = function (amNames, pmNames) {
+                               var markers = [];
+                               if (amNames) {
+                                       $.merge(markers, amNames);
+                               }
+                               if (pmNames) {
+                                       $.merge(markers, pmNames);
+                               }
+                               markers = $.map(markers, function (val) {
+                                       return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&');
+                               });
+                               return '(' + markers.join('|') + ')?';
+                       };
+
+                       // figure out position of time elements.. cause js cant do named captures
+                       var getFormatPositions = function (timeFormat) {
+                               var finds = timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),
+                                       orders = {
+                                               h: -1,
+                                               m: -1,
+                                               s: -1,
+                                               l: -1,
+                                               c: -1,
+                                               t: -1,
+                                               z: -1
+                                       };
+
+                               if (finds) {
+                                       for (var i = 0; i < finds.length; i++) {
+                                               if (orders[finds[i].toString().charAt(0)] === -1) {
+                                                       orders[finds[i].toString().charAt(0)] = i + 1;
+                                               }
+                                       }
+                               }
+                               return orders;
+                       };
+
+                       var regstr = '^' + f.toString()
+                                       .replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
+                                                       var ml = match.length;
+                                                       switch (match.charAt(0).toLowerCase()) {
+                                                       case 'h':
+                                                               return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
+                                                       case 'm':
+                                                               return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
+                                                       case 's':
+                                                               return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
+                                                       case 'l':
+                                                               return '(\\d?\\d?\\d)';
+                                                       case 'c':
+                                                               return '(\\d?\\d?\\d)';
+                                                       case 'z':
+                                                               return '(z|[-+]\\d\\d:?\\d\\d|\\S+)?';
+                                                       case 't':
+                                                               return getPatternAmpm(o.amNames, o.pmNames);
+                                                       default:    // literal escaped in quotes
+                                                               return '(' + match.replace(/\'/g, "").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g, function (m) { return "\\" + m; }) + ')?';
+                                                       }
+                                               })
+                                       .replace(/\s/g, '\\s?') +
+                                       o.timeSuffix + '$',
+                               order = getFormatPositions(f),
+                               ampm = '',
+                               treg;
+
+                       treg = s.match(new RegExp(regstr, 'i'));
+
+                       var resTime = {
+                               hour: 0,
+                               minute: 0,
+                               second: 0,
+                               millisec: 0,
+                               microsec: 0
+                       };
+
+                       if (treg) {
+                               if (order.t !== -1) {
+                                       if (treg[order.t] === undefined || treg[order.t].length === 0) {
+                                               ampm = '';
+                                               resTime.ampm = '';
+                                       } else {
+                                               ampm = $.inArray(treg[order.t].toUpperCase(), o.amNames) !== -1 ? 'AM' : 'PM';
+                                               resTime.ampm = o[ampm === 'AM' ? 'amNames' : 'pmNames'][0];
+                                       }
+                               }
+
+                               if (order.h !== -1) {
+                                       if (ampm === 'AM' && treg[order.h] === '12') {
+                                               resTime.hour = 0; // 12am = 0 hour
+                                       } else {
+                                               if (ampm === 'PM' && treg[order.h] !== '12') {
+                                                       resTime.hour = parseInt(treg[order.h], 10) + 12; // 12pm = 12 hour, any other pm = hour + 12
+                                               } else {
+                                                       resTime.hour = Number(treg[order.h]);
+                                               }
+                                       }
+                               }
+
+                               if (order.m !== -1) {
+                                       resTime.minute = Number(treg[order.m]);
+                               }
+                               if (order.s !== -1) {
+                                       resTime.second = Number(treg[order.s]);
+                               }
+                               if (order.l !== -1) {
+                                       resTime.millisec = Number(treg[order.l]);
+                               }
+                               if (order.c !== -1) {
+                                       resTime.microsec = Number(treg[order.c]);
+                               }
+                               if (order.z !== -1 && treg[order.z] !== undefined) {
+                                       resTime.timezone = $.timepicker.timezoneOffsetNumber(treg[order.z]);
+                               }
+
+
+                               return resTime;
+                       }
+                       return false;
+               };// end strictParse
+
+               // First try JS Date, if that fails, use strictParse
+               var looseParse = function (f, s, o) {
+                       try {
+                               var d = new Date('2012-01-01 ' + s);
+                               if (isNaN(d.getTime())) {
+                                       d = new Date('2012-01-01T' + s);
+                                       if (isNaN(d.getTime())) {
+                                               d = new Date('01/01/2012 ' + s);
+                                               if (isNaN(d.getTime())) {
+                                                       throw "Unable to parse time with native Date: " + s;
+                                               }
+                                       }
+                               }
+
+                               return {
+                                       hour: d.getHours(),
+                                       minute: d.getMinutes(),
+                                       second: d.getSeconds(),
+                                       millisec: d.getMilliseconds(),
+                                       microsec: d.getMicroseconds(),
+                                       timezone: d.getTimezoneOffset() * -1
+                               };
+                       }
+                       catch (err) {
+                               try {
+                                       return strictParse(f, s, o);
+                               }
+                               catch (err2) {
+                                       $.timepicker.log("Unable to parse \ntimeString: " + s + "\ntimeFormat: " + f);
+                               }                               
+                       }
+                       return false;
+               }; // end looseParse
+               
+               if (typeof o.parse === "function") {
+                       return o.parse(timeFormat, timeString, o);
+               }
+               if (o.parse === 'loose') {
+                       return looseParse(timeFormat, timeString, o);
+               }
+               return strictParse(timeFormat, timeString, o);
+       };
+
+       /**
+        * Public utility to format the time
+        * @param {string} format format of the time
+        * @param {Object} time Object not a Date for timezones
+        * @param {Object} [options] essentially the regional[].. amNames, pmNames, ampm
+        * @returns {string} the formatted time
+        */
+       $.datepicker.formatTime = function (format, time, options) {
+               options = options || {};
+               options = $.extend({}, $.timepicker._defaults, options);
+               time = $.extend({
+                       hour: 0,
+                       minute: 0,
+                       second: 0,
+                       millisec: 0,
+                       microsec: 0,
+                       timezone: null
+               }, time);
+
+               var tmptime = format,
+                       ampmName = options.amNames[0],
+                       hour = parseInt(time.hour, 10);
+
+               if (hour > 11) {
+                       ampmName = options.pmNames[0];
+               }
+
+               tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
+                       switch (match) {
+                       case 'HH':
+                               return ('0' + hour).slice(-2);
+                       case 'H':
+                               return hour;
+                       case 'hh':
+                               return ('0' + convert24to12(hour)).slice(-2);
+                       case 'h':
+                               return convert24to12(hour);
+                       case 'mm':
+                               return ('0' + time.minute).slice(-2);
+                       case 'm':
+                               return time.minute;
+                       case 'ss':
+                               return ('0' + time.second).slice(-2);
+                       case 's':
+                               return time.second;
+                       case 'l':
+                               return ('00' + time.millisec).slice(-3);
+                       case 'c':
+                               return ('00' + time.microsec).slice(-3);
+                       case 'z':
+                               return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, false);
+                       case 'Z':
+                               return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, true);
+                       case 'T':
+                               return ampmName.charAt(0).toUpperCase();
+                       case 'TT':
+                               return ampmName.toUpperCase();
+                       case 't':
+                               return ampmName.charAt(0).toLowerCase();
+                       case 'tt':
+                               return ampmName.toLowerCase();
+                       default:
+                               return match.replace(/'/g, "");
+                       }
+               });
+
+               return tmptime;
+       };
+
+       /*
+       * the bad hack :/ override datepicker so it doesn't close on select
+       // inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
+       */
+       $.datepicker._base_selectDate = $.datepicker._selectDate;
+       $.datepicker._selectDate = function (id, dateStr) {
+               var inst = this._getInst($(id)[0]),
+                       tp_inst = this._get(inst, 'timepicker');
+
+               if (tp_inst) {
+                       tp_inst._limitMinMaxDateTime(inst, true);
+                       inst.inline = inst.stay_open = true;
+                       //This way the onSelect handler called from calendarpicker get the full dateTime
+                       this._base_selectDate(id, dateStr);
+                       inst.inline = inst.stay_open = false;
+                       this._notifyChange(inst);
+                       this._updateDatepicker(inst);
+               } else {
+                       this._base_selectDate(id, dateStr);
+               }
+       };
+
+       /*
+       * second bad hack :/ override datepicker so it triggers an event when changing the input field
+       * and does not redraw the datepicker on every selectDate event
+       */
+       $.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
+       $.datepicker._updateDatepicker = function (inst) {
+
+               // don't popup the datepicker if there is another instance already opened
+               var input = inst.input[0];
+               if ($.datepicker._curInst && $.datepicker._curInst !== inst && $.datepicker._datepickerShowing && $.datepicker._lastInput !== input) {
+                       return;
+               }
+
+               if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
+
+                       this._base_updateDatepicker(inst);
+
+                       // Reload the time control when changing something in the input text field.
+                       var tp_inst = this._get(inst, 'timepicker');
+                       if (tp_inst) {
+                               tp_inst._addTimePicker(inst);
+                       }
+               }
+       };
+
+       /*
+       * third bad hack :/ override datepicker so it allows spaces and colon in the input field
+       */
+       $.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
+       $.datepicker._doKeyPress = function (event) {
+               var inst = $.datepicker._getInst(event.target),
+                       tp_inst = $.datepicker._get(inst, 'timepicker');
+
+               if (tp_inst) {
+                       if ($.datepicker._get(inst, 'constrainInput')) {
+                               var ampm = tp_inst.support.ampm,
+                                       tz = tp_inst._defaults.showTimezone !== null ? tp_inst._defaults.showTimezone : tp_inst.support.timezone,
+                                       dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
+                                       datetimeChars = tp_inst._defaults.timeFormat.toString()
+                                                                                       .replace(/[hms]/g, '')
+                                                                                       .replace(/TT/g, ampm ? 'APM' : '')
+                                                                                       .replace(/Tt/g, ampm ? 'AaPpMm' : '')
+                                                                                       .replace(/tT/g, ampm ? 'AaPpMm' : '')
+                                                                                       .replace(/T/g, ampm ? 'AP' : '')
+                                                                                       .replace(/tt/g, ampm ? 'apm' : '')
+                                                                                       .replace(/t/g, ampm ? 'ap' : '') + 
+                                                                                       " " + tp_inst._defaults.separator + 
+                                                                                       tp_inst._defaults.timeSuffix + 
+                                                                                       (tz ? tp_inst._defaults.timezoneList.join('') : '') + 
+                                                                                       (tp_inst._defaults.amNames.join('')) + (tp_inst._defaults.pmNames.join('')) + 
+                                                                                       dateChars,
+                                       chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
+                               return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
+                       }
+               }
+
+               return $.datepicker._base_doKeyPress(event);
+       };
+
+       /*
+       * Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField
+       * Update any alternate field to synchronise with the main field.
+       */
+       $.datepicker._base_updateAlternate = $.datepicker._updateAlternate;
+       $.datepicker._updateAlternate = function (inst) {
+               var tp_inst = this._get(inst, 'timepicker');
+               if (tp_inst) {
+                       var altField = tp_inst._defaults.altField;
+                       if (altField) { // update alternate field too
+                               var altFormat = tp_inst._defaults.altFormat || tp_inst._defaults.dateFormat,
+                                       date = this._getDate(inst),
+                                       formatCfg = $.datepicker._getFormatConfig(inst),
+                                       altFormattedDateTime = '', 
+                                       altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator, 
+                                       altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix,
+                                       altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;
+                               
+                               altFormattedDateTime += $.datepicker.formatTime(altTimeFormat, tp_inst, tp_inst._defaults) + altTimeSuffix;
+                               if (!tp_inst._defaults.timeOnly && !tp_inst._defaults.altFieldTimeOnly && date !== null) {
+                                       if (tp_inst._defaults.altFormat) {
+                                               altFormattedDateTime = $.datepicker.formatDate(tp_inst._defaults.altFormat, date, formatCfg) + altSeparator + altFormattedDateTime;
+                                       }
+                                       else {
+                                               altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;
+                                       }
+                               }
+                               $(altField).val(altFormattedDateTime);
+                       }
+               }
+               else {
+                       $.datepicker._base_updateAlternate(inst);
+               }
+       };
+
+       /*
+       * Override key up event to sync manual input changes.
+       */
+       $.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
+       $.datepicker._doKeyUp = function (event) {
+               var inst = $.datepicker._getInst(event.target),
+                       tp_inst = $.datepicker._get(inst, 'timepicker');
+
+               if (tp_inst) {
+                       if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
+                               try {
+                                       $.datepicker._updateDatepicker(inst);
+                               } catch (err) {
+                                       $.timepicker.log(err);
+                               }
+                       }
+               }
+
+               return $.datepicker._base_doKeyUp(event);
+       };
+
+       /*
+       * override "Today" button to also grab the time.
+       */
+       $.datepicker._base_gotoToday = $.datepicker._gotoToday;
+       $.datepicker._gotoToday = function (id) {
+               var inst = this._getInst($(id)[0]),
+                       $dp = inst.dpDiv;
+               this._base_gotoToday(id);
+               var tp_inst = this._get(inst, 'timepicker');
+               selectLocalTimezone(tp_inst);
+               var now = new Date();
+               this._setTime(inst, now);
+               $('.ui-datepicker-today', $dp).click();
+       };
+
+       /*
+       * Disable & enable the Time in the datetimepicker
+       */
+       $.datepicker._disableTimepickerDatepicker = function (target) {
+               var inst = this._getInst(target);
+               if (!inst) {
+                       return;
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+               $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
+               if (tp_inst) {
+                       inst.settings.showTimepicker = false;
+                       tp_inst._defaults.showTimepicker = false;
+                       tp_inst._updateDateTime(inst);
+               }
+       };
+
+       $.datepicker._enableTimepickerDatepicker = function (target) {
+               var inst = this._getInst(target);
+               if (!inst) {
+                       return;
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+               $(target).datepicker('getDate'); // Init selected[Year|Month|Day]
+               if (tp_inst) {
+                       inst.settings.showTimepicker = true;
+                       tp_inst._defaults.showTimepicker = true;
+                       tp_inst._addTimePicker(inst); // Could be disabled on page load
+                       tp_inst._updateDateTime(inst);
+               }
+       };
+
+       /*
+       * Create our own set time function
+       */
+       $.datepicker._setTime = function (inst, date) {
+               var tp_inst = this._get(inst, 'timepicker');
+               if (tp_inst) {
+                       var defaults = tp_inst._defaults;
+
+                       // calling _setTime with no date sets time to defaults
+                       tp_inst.hour = date ? date.getHours() : defaults.hour;
+                       tp_inst.minute = date ? date.getMinutes() : defaults.minute;
+                       tp_inst.second = date ? date.getSeconds() : defaults.second;
+                       tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;
+                       tp_inst.microsec = date ? date.getMicroseconds() : defaults.microsec;
+
+                       //check if within min/max times.. 
+                       tp_inst._limitMinMaxDateTime(inst, true);
+
+                       tp_inst._onTimeChange();
+                       tp_inst._updateDateTime(inst);
+               }
+       };
+
+       /*
+       * Create new public method to set only time, callable as $().datepicker('setTime', date)
+       */
+       $.datepicker._setTimeDatepicker = function (target, date, withDate) {
+               var inst = this._getInst(target);
+               if (!inst) {
+                       return;
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+
+               if (tp_inst) {
+                       this._setDateFromField(inst);
+                       var tp_date;
+                       if (date) {
+                               if (typeof date === "string") {
+                                       tp_inst._parseTime(date, withDate);
+                                       tp_date = new Date();
+                                       tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
+                                       tp_date.setMicroseconds(tp_inst.microsec);
+                               } else {
+                                       tp_date = new Date(date.getTime());
+                                       tp_date.setMicroseconds(date.getMicroseconds());
+                               }
+                               if (tp_date.toString() === 'Invalid Date') {
+                                       tp_date = undefined;
+                               }
+                               this._setTime(inst, tp_date);
+                       }
+               }
+
+       };
+
+       /*
+       * override setDate() to allow setting time too within Date object
+       */
+       $.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
+       $.datepicker._setDateDatepicker = function (target, date) {
+               var inst = this._getInst(target);
+               if (!inst) {
+                       return;
+               }
+
+               if (typeof(date) === 'string') {
+                       date = new Date(date);
+                       if (!date.getTime()) {
+                               $.timepicker.log("Error creating Date object from string.");
+                       }
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+               var tp_date;
+               if (date instanceof Date) {
+                       tp_date = new Date(date.getTime());
+                       tp_date.setMicroseconds(date.getMicroseconds());
+               } else {
+                       tp_date = date;
+               }
+               
+               // This is important if you are using the timezone option, javascript's Date 
+               // object will only return the timezone offset for the current locale, so we 
+               // adjust it accordingly.  If not using timezone option this won't matter..
+               // If a timezone is different in tp, keep the timezone as is
+               if (tp_inst) {
+                       // look out for DST if tz wasn't specified
+                       if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
+                               tp_inst.timezone = tp_date.getTimezoneOffset() * -1;
+                       }
+                       date = $.timepicker.timezoneAdjust(date, tp_inst.timezone);
+                       tp_date = $.timepicker.timezoneAdjust(tp_date, tp_inst.timezone);
+               }
+
+               this._updateDatepicker(inst);
+               this._base_setDateDatepicker.apply(this, arguments);
+               this._setTimeDatepicker(target, tp_date, true);
+       };
+
+       /*
+       * override getDate() to allow getting time too within Date object
+       */
+       $.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
+       $.datepicker._getDateDatepicker = function (target, noDefault) {
+               var inst = this._getInst(target);
+               if (!inst) {
+                       return;
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+
+               if (tp_inst) {
+                       // if it hasn't yet been defined, grab from field
+                       if (inst.lastVal === undefined) {
+                               this._setDateFromField(inst, noDefault);
+                       }
+
+                       var date = this._getDate(inst);
+                       if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) {
+                               date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
+                               date.setMicroseconds(tp_inst.microsec);
+
+                               // This is important if you are using the timezone option, javascript's Date 
+                               // object will only return the timezone offset for the current locale, so we 
+                               // adjust it accordingly.  If not using timezone option this won't matter..
+                               if (tp_inst.timezone != null) {
+                                       // look out for DST if tz wasn't specified
+                                       if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
+                                               tp_inst.timezone = date.getTimezoneOffset() * -1;
+                                       }
+                                       date = $.timepicker.timezoneAdjust(date, tp_inst.timezone);
+                               }
+                       }
+                       return date;
+               }
+               return this._base_getDateDatepicker(target, noDefault);
+       };
+
+       /*
+       * override parseDate() because UI 1.8.14 throws an error about "Extra characters"
+       * An option in datapicker to ignore extra format characters would be nicer.
+       */
+       $.datepicker._base_parseDate = $.datepicker.parseDate;
+       $.datepicker.parseDate = function (format, value, settings) {
+               var date;
+               try {
+                       date = this._base_parseDate(format, value, settings);
+               } catch (err) {
+                       // Hack!  The error message ends with a colon, a space, and
+                       // the "extra" characters.  We rely on that instead of
+                       // attempting to perfectly reproduce the parsing algorithm.
+                       if (err.indexOf(":") >= 0) {
+                               date = this._base_parseDate(format, value.substring(0, value.length - (err.length - err.indexOf(':') - 2)), settings);
+                               $.timepicker.log("Error parsing the date string: " + err + "\ndate string = " + value + "\ndate format = " + format);
+                       } else {
+                               throw err;
+                       }
+               }
+               return date;
+       };
+
+       /*
+       * override formatDate to set date with time to the input
+       */
+       $.datepicker._base_formatDate = $.datepicker._formatDate;
+       $.datepicker._formatDate = function (inst, day, month, year) {
+               var tp_inst = this._get(inst, 'timepicker');
+               if (tp_inst) {
+                       tp_inst._updateDateTime(inst);
+                       return tp_inst.$input.val();
+               }
+               return this._base_formatDate(inst);
+       };
+
+       /*
+       * override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
+       */
+       $.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
+       $.datepicker._optionDatepicker = function (target, name, value) {
+               var inst = this._getInst(target),
+                       name_clone;
+               if (!inst) {
+                       return null;
+               }
+
+               var tp_inst = this._get(inst, 'timepicker');
+               if (tp_inst) {
+                       var min = null,
+                               max = null,
+                               onselect = null,
+                               overrides = tp_inst._defaults.evnts,
+                               fns = {},
+                               prop;
+                       if (typeof name === 'string') { // if min/max was set with the string
+                               if (name === 'minDate' || name === 'minDateTime') {
+                                       min = value;
+                               } else if (name === 'maxDate' || name === 'maxDateTime') {
+                                       max = value;
+                               } else if (name === 'onSelect') {
+                                       onselect = value;
+                               } else if (overrides.hasOwnProperty(name)) {
+                                       if (typeof (value) === 'undefined') {
+                                               return overrides[name];
+                                       }
+                                       fns[name] = value;
+                                       name_clone = {}; //empty results in exiting function after overrides updated
+                               }
+                       } else if (typeof name === 'object') { //if min/max was set with the JSON
+                               if (name.minDate) {
+                                       min = name.minDate;
+                               } else if (name.minDateTime) {
+                                       min = name.minDateTime;
+                               } else if (name.maxDate) {
+                                       max = name.maxDate;
+                               } else if (name.maxDateTime) {
+                                       max = name.maxDateTime;
+                               }
+                               for (prop in overrides) {
+                                       if (overrides.hasOwnProperty(prop) && name[prop]) {
+                                               fns[prop] = name[prop];
+                                       }
+                               }
+                       }
+                       for (prop in fns) {
+                               if (fns.hasOwnProperty(prop)) {
+                                       overrides[prop] = fns[prop];
+                                       if (!name_clone) { name_clone = $.extend({}, name); }
+                                       delete name_clone[prop];
+                               }
+                       }
+                       if (name_clone && isEmptyObject(name_clone)) { return; }
+                       if (min) { //if min was set
+                               if (min === 0) {
+                                       min = new Date();
+                               } else {
+                                       min = new Date(min);
+                               }
+                               tp_inst._defaults.minDate = min;
+                               tp_inst._defaults.minDateTime = min;
+                       } else if (max) { //if max was set
+                               if (max === 0) {
+                                       max = new Date();
+                               } else {
+                                       max = new Date(max);
+                               }
+                               tp_inst._defaults.maxDate = max;
+                               tp_inst._defaults.maxDateTime = max;
+                       } else if (onselect) {
+                               tp_inst._defaults.onSelect = onselect;
+                       }
+               }
+               if (value === undefined) {
+                       return this._base_optionDatepicker.call($.datepicker, target, name);
+               }
+               return this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);
+       };
+       
+       /*
+       * jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,
+       * it will return false for all objects
+       */
+       var isEmptyObject = function (obj) {
+               var prop;
+               for (prop in obj) {
+                       if (obj.hasOwnProperty(prop)) {
+                               return false;
+                       }
+               }
+               return true;
+       };
+
+       /*
+       * jQuery extend now ignores nulls!
+       */
+       var extendRemove = function (target, props) {
+               $.extend(target, props);
+               for (var name in props) {
+                       if (props[name] === null || props[name] === undefined) {
+                               target[name] = props[name];
+                       }
+               }
+               return target;
+       };
+
+       /*
+       * Determine by the time format which units are supported
+       * Returns an object of booleans for each unit
+       */
+       var detectSupport = function (timeFormat) {
+               var tf = timeFormat.replace(/'.*?'/g, '').toLowerCase(), // removes literals
+                       isIn = function (f, t) { // does the format contain the token?
+                                       return f.indexOf(t) !== -1 ? true : false;
+                               };
+               return {
+                               hour: isIn(tf, 'h'),
+                               minute: isIn(tf, 'm'),
+                               second: isIn(tf, 's'),
+                               millisec: isIn(tf, 'l'),
+                               microsec: isIn(tf, 'c'),
+                               timezone: isIn(tf, 'z'),
+                               ampm: isIn(tf, 't') && isIn(timeFormat, 'h'),
+                               iso8601: isIn(timeFormat, 'Z')
+                       };
+       };
+
+       /*
+       * Converts 24 hour format into 12 hour
+       * Returns 12 hour without leading 0
+       */
+       var convert24to12 = function (hour) {
+               hour %= 12;
+
+               if (hour === 0) {
+                       hour = 12;
+               }
+
+               return String(hour);
+       };
+
+       var computeEffectiveSetting = function (settings, property) {
+               return settings && settings[property] ? settings[property] : $.timepicker._defaults[property];
+       };
+
+       /*
+       * Splits datetime string into date and time substrings.
+       * Throws exception when date can't be parsed
+       * Returns {dateString: dateString, timeString: timeString}
+       */
+       var splitDateTime = function (dateTimeString, timeSettings) {
+               // The idea is to get the number separator occurrences in datetime and the time format requested (since time has
+               // fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.
+               var separator = computeEffectiveSetting(timeSettings, 'separator'),
+                       format = computeEffectiveSetting(timeSettings, 'timeFormat'),
+                       timeParts = format.split(separator), // how many occurrences of separator may be in our format?
+                       timePartsLen = timeParts.length,
+                       allParts = dateTimeString.split(separator),
+                       allPartsLen = allParts.length;
+
+               if (allPartsLen > 1) {
+                       return {
+                               dateString: allParts.splice(0, allPartsLen - timePartsLen).join(separator),
+                               timeString: allParts.splice(0, timePartsLen).join(separator)
+                       };
+               }
+
+               return {
+                       dateString: dateTimeString,
+                       timeString: ''
+               };
+       };
+
+       /*
+       * Internal function to parse datetime interval
+       * Returns: {date: Date, timeObj: Object}, where
+       *   date - parsed date without time (type Date)
+       *   timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional
+       */
+       var parseDateTimeInternal = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
+               var date,
+                       parts,
+                       parsedTime;
+
+               parts = splitDateTime(dateTimeString, timeSettings);
+               date = $.datepicker._base_parseDate(dateFormat, parts.dateString, dateSettings);
+
+               if (parts.timeString === '') {
+                       return {
+                               date: date
+                       };
+               }
+
+               parsedTime = $.datepicker.parseTime(timeFormat, parts.timeString, timeSettings);
+
+               if (!parsedTime) {
+                       throw 'Wrong time format';
+               }
+
+               return {
+                       date: date,
+                       timeObj: parsedTime
+               };
+       };
+
+       /*
+       * Internal function to set timezone_select to the local timezone
+       */
+       var selectLocalTimezone = function (tp_inst, date) {
+               if (tp_inst && tp_inst.timezone_select) {
+                       var now = date || new Date();
+                       tp_inst.timezone_select.val(-now.getTimezoneOffset());
+               }
+       };
+
+       /*
+       * Create a Singleton Instance
+       */
+       $.timepicker = new Timepicker();
+
+       /**
+        * Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)
+        * @param {number} tzMinutes if not a number, less than -720 (-1200), or greater than 840 (+1400) this value is returned
+        * @param {boolean} iso8601 if true formats in accordance to iso8601 "+12:45"
+        * @return {string}
+        */
+       $.timepicker.timezoneOffsetString = function (tzMinutes, iso8601) {
+               if (isNaN(tzMinutes) || tzMinutes > 840 || tzMinutes < -720) {
+                       return tzMinutes;
+               }
+
+               var off = tzMinutes,
+                       minutes = off % 60,
+                       hours = (off - minutes) / 60,
+                       iso = iso8601 ? ':' : '',
+                       tz = (off >= 0 ? '+' : '-') + ('0' + Math.abs(hours)).slice(-2) + iso + ('0' + Math.abs(minutes)).slice(-2);
+               
+               if (tz === '+00:00') {
+                       return 'Z';
+               }
+               return tz;
+       };
+
+       /**
+        * Get the number in minutes that represents a timezone string
+        * @param  {string} tzString formatted like "+0500", "-1245", "Z"
+        * @return {number} the offset minutes or the original string if it doesn't match expectations
+        */
+       $.timepicker.timezoneOffsetNumber = function (tzString) {
+               var normalized = tzString.toString().replace(':', ''); // excuse any iso8601, end up with "+1245"
+
+               if (normalized.toUpperCase() === 'Z') { // if iso8601 with Z, its 0 minute offset
+                       return 0;
+               }
+
+               if (!/^(\-|\+)\d{4}$/.test(normalized)) { // possibly a user defined tz, so just give it back
+                       return tzString;
+               }
+
+               return ((normalized.substr(0, 1) === '-' ? -1 : 1) * // plus or minus
+                                       ((parseInt(normalized.substr(1, 2), 10) * 60) + // hours (converted to minutes)
+                                       parseInt(normalized.substr(3, 2), 10))); // minutes
+       };
+
+       /**
+        * No way to set timezone in js Date, so we must adjust the minutes to compensate. (think setDate, getDate)
+        * @param  {Date} date
+        * @param  {string} toTimezone formatted like "+0500", "-1245"
+        * @return {Date}
+        */
+       $.timepicker.timezoneAdjust = function (date, toTimezone) {
+               var toTz = $.timepicker.timezoneOffsetNumber(toTimezone);
+               if (!isNaN(toTz)) {
+                       date.setMinutes(date.getMinutes() + -date.getTimezoneOffset() - toTz);
+               }
+               return date;
+       };
+
+       /**
+        * Calls `timepicker()` on the `startTime` and `endTime` elements, and configures them to
+        * enforce date range limits.
+        * n.b. The input value must be correctly formatted (reformatting is not supported)
+        * @param  {Element} startTime
+        * @param  {Element} endTime
+        * @param  {Object} options Options for the timepicker() call
+        * @return {jQuery}
+        */
+       $.timepicker.timeRange = function (startTime, endTime, options) {
+               return $.timepicker.handleRange('timepicker', startTime, endTime, options);
+       };
+
+       /**
+        * Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to
+        * enforce date range limits.
+        * @param  {Element} startTime
+        * @param  {Element} endTime
+        * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,
+        *   a boolean value that can be used to reformat the input values to the `dateFormat`.
+        * @param  {string} method Can be used to specify the type of picker to be added
+        * @return {jQuery}
+        */
+       $.timepicker.datetimeRange = function (startTime, endTime, options) {
+               $.timepicker.handleRange('datetimepicker', startTime, endTime, options);
+       };
+
+       /**
+        * Calls `datepicker` on the `startTime` and `endTime` elements, and configures them to
+        * enforce date range limits.
+        * @param  {Element} startTime
+        * @param  {Element} endTime
+        * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,
+        *   a boolean value that can be used to reformat the input values to the `dateFormat`.
+        * @return {jQuery}
+        */
+       $.timepicker.dateRange = function (startTime, endTime, options) {
+               $.timepicker.handleRange('datepicker', startTime, endTime, options);
+       };
+
+       /**
+        * Calls `method` on the `startTime` and `endTime` elements, and configures them to
+        * enforce date range limits.
+        * @param  {string} method Can be used to specify the type of picker to be added
+        * @param  {Element} startTime
+        * @param  {Element} endTime
+        * @param  {Object} options Options for the `timepicker()` call. Also supports `reformat`,
+        *   a boolean value that can be used to reformat the input values to the `dateFormat`.
+        * @return {jQuery}
+        */
+       $.timepicker.handleRange = function (method, startTime, endTime, options) {
+               options = $.extend({}, {
+                       minInterval: 0, // min allowed interval in milliseconds
+                       maxInterval: 0, // max allowed interval in milliseconds
+                       start: {},      // options for start picker
+                       end: {}         // options for end picker
+               }, options);
+
+               function checkDates(changed, other) {
+                       var startdt = startTime[method]('getDate'),
+                               enddt = endTime[method]('getDate'),
+                               changeddt = changed[method]('getDate');
+
+                       if (startdt !== null) {
+                               var minDate = new Date(startdt.getTime()),
+                                       maxDate = new Date(startdt.getTime());
+
+                               minDate.setMilliseconds(minDate.getMilliseconds() + options.minInterval);
+                               maxDate.setMilliseconds(maxDate.getMilliseconds() + options.maxInterval);
+
+                               if (options.minInterval > 0 && minDate > enddt) { // minInterval check
+                                       endTime[method]('setDate', minDate);
+                               }
+                               else if (options.maxInterval > 0 && maxDate < enddt) { // max interval check
+                                       endTime[method]('setDate', maxDate);
+                               }
+                               else if (startdt > enddt) {
+                                       other[method]('setDate', changeddt);
+                               }
+                       }
+               }
+
+               function selected(changed, other, option) {
+                       if (!changed.val()) {
+                               return;
+                       }
+                       var date = changed[method].call(changed, 'getDate');
+                       if (date !== null && options.minInterval > 0) {
+                               if (option === 'minDate') {
+                                       date.setMilliseconds(date.getMilliseconds() + options.minInterval);
+                               }
+                               if (option === 'maxDate') {
+                                       date.setMilliseconds(date.getMilliseconds() - options.minInterval);
+                               }
+                       }
+                       if (date.getTime) {
+                               other[method].call(other, 'option', option, date);
+                       }
+               }
+
+               $.fn[method].call(startTime, $.extend({
+                       onClose: function (dateText, inst) {
+                               checkDates($(this), endTime);
+                       },
+                       onSelect: function (selectedDateTime) {
+                               selected($(this), endTime, 'minDate');
+                       }
+               }, options, options.start));
+               $.fn[method].call(endTime, $.extend({
+                       onClose: function (dateText, inst) {
+                               checkDates($(this), startTime);
+                       },
+                       onSelect: function (selectedDateTime) {
+                               selected($(this), startTime, 'maxDate');
+                       }
+               }, options, options.end));
+
+               checkDates(startTime, endTime);
+               selected(startTime, endTime, 'minDate');
+               selected(endTime, startTime, 'maxDate');
+               return $([startTime.get(0), endTime.get(0)]);
+       };
+
+       /**
+        * Log error or data to the console during error or debugging
+        * @param  {Object} err pass any type object to log to the console during error or debugging
+        * @return {void}
+        */
+       $.timepicker.log = function (err) {
+               if (window.console) {
+                       window.console.log(err);
+               }
+       };
+
+       /*
+        * Add util object to allow access to private methods for testability.
+        */
+       $.timepicker._util = {
+               _extendRemove: extendRemove,
+               _isEmptyObject: isEmptyObject,
+               _convert24to12: convert24to12,
+               _detectSupport: detectSupport,
+               _selectLocalTimezone: selectLocalTimezone,
+               _computeEffectiveSetting: computeEffectiveSetting,
+               _splitDateTime: splitDateTime,
+               _parseDateTimeInternal: parseDateTimeInternal
+       };
+
+       /*
+       * Microsecond support
+       */
+       if (!Date.prototype.getMicroseconds) {
+               Date.prototype.microseconds = 0;
+               Date.prototype.getMicroseconds = function () { return this.microseconds; };
+               Date.prototype.setMicroseconds = function (m) {
+                       this.setMilliseconds(this.getMilliseconds() + Math.floor(m / 1000));
+                       this.microseconds = m % 1000;
+                       return this;
+               };
+       }
+
+       /*
+       * Keep up with the version
+       */
+       $.timepicker.version = "1.4";
+
+})(jQuery);
\ No newline at end of file
index 829295dfb34ca74fdf46a73620f3f6593e5b1004..a7a934f066effe5745728a2fd85833271d6660b5 100644 (file)
@@ -1,12 +1,5 @@
-/*
- * jQuery timepicker addon
- * By: Trent Richardson [http://trentrichardson.com]
- * Version 1.2.2
- * Last Modified: 04/13/2013
- *
- * Copyright 2013 Trent Richardson
- * You may use this project under MIT or GPL licenses.
- * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
- * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
- */
-(function($){$.ui.timepicker=$.ui.timepicker||{};if($.ui.timepicker.version){return}$.extend($.ui,{timepicker:{version:"1.2.2"}});var u=function(){this.regional=[];this.regional['']={currentText:'Now',closeText:'Done',amNames:['AM','A'],pmNames:['PM','P'],timeFormat:'HH:mm',timeSuffix:'',timeOnlyTitle:'Choose Time',timeText:'Time',hourText:'Hour',minuteText:'Minute',secondText:'Second',millisecText:'Millisecond',timezoneText:'Time Zone',isRTL:false};this._defaults={showButtonPanel:true,timeOnly:false,showHour:true,showMinute:true,showSecond:false,showMillisec:false,showTimezone:false,showTime:true,stepHour:1,stepMinute:1,stepSecond:1,stepMillisec:1,hour:0,minute:0,second:0,millisec:0,timezone:null,useLocalTimezone:false,defaultTimezone:"+0000",hourMin:0,minuteMin:0,secondMin:0,millisecMin:0,hourMax:23,minuteMax:59,secondMax:59,millisecMax:999,minDateTime:null,maxDateTime:null,onSelect:null,hourGrid:0,minuteGrid:0,secondGrid:0,millisecGrid:0,alwaysSetTime:true,separator:' ',altFieldTimeOnly:true,altTimeFormat:null,altSeparator:null,altTimeSuffix:null,pickerTimeFormat:null,pickerTimeSuffix:null,showTimepicker:true,timezoneIso8601:false,timezoneList:null,addSliderAccess:false,sliderAccessArgs:null,controlType:'slider',defaultValue:null,parse:'strict'};$.extend(this._defaults,this.regional[''])};$.extend(u.prototype,{$input:null,$altInput:null,$timeObj:null,inst:null,hour_slider:null,minute_slider:null,second_slider:null,millisec_slider:null,timezone_select:null,hour:0,minute:0,second:0,millisec:0,timezone:null,defaultTimezone:"+0000",hourMinOriginal:null,minuteMinOriginal:null,secondMinOriginal:null,millisecMinOriginal:null,hourMaxOriginal:null,minuteMaxOriginal:null,secondMaxOriginal:null,millisecMaxOriginal:null,ampm:'',formattedDate:'',formattedTime:'',formattedDateTime:'',timezoneList:null,units:['hour','minute','second','millisec'],control:null,setDefaults:function(a){w(this._defaults,a||{});return this},_newInst:function(d,o){var e=new u(),inlineSettings={},fns={},overrides,i;for(var f in this._defaults){if(this._defaults.hasOwnProperty(f)){var g=d.attr('time:'+f);if(g){try{inlineSettings[f]=eval(g)}catch(err){inlineSettings[f]=g}}}}overrides={beforeShow:function(a,b){if($.isFunction(e._defaults.evnts.beforeShow)){return e._defaults.evnts.beforeShow.call(d[0],a,b,e)}},onChangeMonthYear:function(a,b,c){e._updateDateTime(c);if($.isFunction(e._defaults.evnts.onChangeMonthYear)){e._defaults.evnts.onChangeMonthYear.call(d[0],a,b,c,e)}},onClose:function(a,b){if(e.timeDefined===true&&d.val()!==''){e._updateDateTime(b)}if($.isFunction(e._defaults.evnts.onClose)){e._defaults.evnts.onClose.call(d[0],a,b,e)}}};for(i in overrides){if(overrides.hasOwnProperty(i)){fns[i]=o[i]||null}}e._defaults=$.extend({},this._defaults,inlineSettings,o,overrides,{evnts:fns,timepicker:e});e.amNames=$.map(e._defaults.amNames,function(a){return a.toUpperCase()});e.pmNames=$.map(e._defaults.pmNames,function(a){return a.toUpperCase()});if(typeof(e._defaults.controlType)==='string'){if($.fn[e._defaults.controlType]===undefined){e._defaults.controlType='select'}e.control=e._controls[e._defaults.controlType]}else{e.control=e._defaults.controlType}if(e._defaults.timezoneList===null){var h=['-1200','-1100','-1000','-0930','-0900','-0800','-0700','-0600','-0500','-0430','-0400','-0330','-0300','-0200','-0100','+0000','+0100','+0200','+0300','+0330','+0400','+0430','+0500','+0530','+0545','+0600','+0630','+0700','+0800','+0845','+0900','+0930','+1000','+1030','+1100','+1130','+1200','+1245','+1300','+1400'];if(e._defaults.timezoneIso8601){h=$.map(h,function(a){return a=='+0000'?'Z':(a.substring(0,3)+':'+a.substring(3))})}e._defaults.timezoneList=h}e.timezone=e._defaults.timezone;e.hour=e._defaults.hour<e._defaults.hourMin?e._defaults.hourMin:e._defaults.hour>e._defaults.hourMax?e._defaults.hourMax:e._defaults.hour;e.minute=e._defaults.minute<e._defaults.minuteMin?e._defaults.minuteMin:e._defaults.minute>e._defaults.minuteMax?e._defaults.minuteMax:e._defaults.minute;e.second=e._defaults.second<e._defaults.secondMin?e._defaults.secondMin:e._defaults.second>e._defaults.secondMax?e._defaults.secondMax:e._defaults.second;e.millisec=e._defaults.millisec<e._defaults.millisecMin?e._defaults.millisecMin:e._defaults.millisec>e._defaults.millisecMax?e._defaults.millisecMax:e._defaults.millisec;e.ampm='';e.$input=d;if(o.altField){e.$altInput=$(o.altField).css({cursor:'pointer'}).focus(function(){d.trigger("focus")})}if(e._defaults.minDate===0||e._defaults.minDateTime===0){e._defaults.minDate=new Date()}if(e._defaults.maxDate===0||e._defaults.maxDateTime===0){e._defaults.maxDate=new Date()}if(e._defaults.minDate!==undefined&&e._defaults.minDate instanceof Date){e._defaults.minDateTime=new Date(e._defaults.minDate.getTime())}if(e._defaults.minDateTime!==undefined&&e._defaults.minDateTime instanceof Date){e._defaults.minDate=new Date(e._defaults.minDateTime.getTime())}if(e._defaults.maxDate!==undefined&&e._defaults.maxDate instanceof Date){e._defaults.maxDateTime=new Date(e._defaults.maxDate.getTime())}if(e._defaults.maxDateTime!==undefined&&e._defaults.maxDateTime instanceof Date){e._defaults.maxDate=new Date(e._defaults.maxDateTime.getTime())}e.$input.bind('focus',function(){e._onFocus()});return e},_addTimePicker:function(a){var b=(this.$altInput&&this._defaults.altFieldTimeOnly)?this.$input.val()+' '+this.$altInput.val():this.$input.val();this.timeDefined=this._parseTime(b);this._limitMinMaxDateTime(a,false);this._injectTimePicker()},_parseTime:function(a,b){if(!this.inst){this.inst=$.datepicker._getInst(this.$input[0])}if(b||!this._defaults.timeOnly){var c=$.datepicker._get(this.inst,'dateFormat');try{var d=A(c,this._defaults.timeFormat,a,$.datepicker._getFormatConfig(this.inst),this._defaults);if(!d.timeObj){return false}$.extend(this,d.timeObj)}catch(err){$.timepicker.log("Error parsing the date/time string: "+err+"\ndate/time string = "+a+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+c);return false}return true}else{var e=$.datepicker.parseTime(this._defaults.timeFormat,a,this._defaults);if(!e){return false}$.extend(this,e);return true}},_injectTimePicker:function(){var c=this.inst.dpDiv,o=this.inst.settings,tp_inst=this,litem='',uitem='',max={},gridSize={},size=null,i=0,l=0;if(c.find("div.ui-timepicker-div").length===0&&o.showTimepicker){var d=' style="display:none;"',html='<div class="ui-timepicker-div'+(o.isRTL?' ui-timepicker-rtl':'')+'"><dl>'+'<dt class="ui_tpicker_time_label"'+((o.showTime)?'':d)+'>'+o.timeText+'</dt>'+'<dd class="ui_tpicker_time"'+((o.showTime)?'':d)+'></dd>';for(i=0,l=this.units.length;i<l;i++){litem=this.units[i];uitem=litem.substr(0,1).toUpperCase()+litem.substr(1);max[litem]=parseInt((o[litem+'Max']-((o[litem+'Max']-o[litem+'Min'])%o['step'+uitem])),10);gridSize[litem]=0;html+='<dt class="ui_tpicker_'+litem+'_label"'+((o['show'+uitem])?'':d)+'>'+o[litem+'Text']+'</dt>'+'<dd class="ui_tpicker_'+litem+'"><div class="ui_tpicker_'+litem+'_slider"'+((o['show'+uitem])?'':d)+'></div>';if(o['show'+uitem]&&o[litem+'Grid']>0){html+='<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';if(litem=='hour'){for(var h=o[litem+'Min'];h<=max[litem];h+=parseInt(o[litem+'Grid'],10)){gridSize[litem]++;var g=$.datepicker.formatTime(x(o.pickerTimeFormat||o.timeFormat)?'hht':'HH',{hour:h},o);html+='<td data-for="'+litem+'">'+g+'</td>'}}else{for(var m=o[litem+'Min'];m<=max[litem];m+=parseInt(o[litem+'Grid'],10)){gridSize[litem]++;html+='<td data-for="'+litem+'">'+((m<10)?'0':'')+m+'</td>'}}html+='</tr></table></div>'}html+='</dd>'}html+='<dt class="ui_tpicker_timezone_label"'+((o.showTimezone)?'':d)+'>'+o.timezoneText+'</dt>';html+='<dd class="ui_tpicker_timezone" '+((o.showTimezone)?'':d)+'></dd>';html+='</dl></div>';var j=$(html);if(o.timeOnly===true){j.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all">'+'<div class="ui-datepicker-title">'+o.timeOnlyTitle+'</div>'+'</div>');c.find('.ui-datepicker-header, .ui-datepicker-calendar').hide()}for(i=0,l=tp_inst.units.length;i<l;i++){litem=tp_inst.units[i];uitem=litem.substr(0,1).toUpperCase()+litem.substr(1);tp_inst[litem+'_slider']=tp_inst.control.create(tp_inst,j.find('.ui_tpicker_'+litem+'_slider'),litem,tp_inst[litem],o[litem+'Min'],max[litem],o['step'+uitem]);if(o['show'+uitem]&&o[litem+'Grid']>0){size=100*gridSize[litem]*o[litem+'Grid']/(max[litem]-o[litem+'Min']);j.find('.ui_tpicker_'+litem+' table').css({width:size+"%",marginLeft:o.isRTL?'0':((size/(-2*gridSize[litem]))+"%"),marginRight:o.isRTL?((size/(-2*gridSize[litem]))+"%"):'0',borderCollapse:'collapse'}).find("td").click(function(e){var a=$(this),h=a.html(),n=parseInt(h.replace(/[^0-9]/g),10),ap=h.replace(/[^apm]/ig),f=a.data('for');if(f=='hour'){if(ap.indexOf('p')!==-1&&n<12){n+=12}else{if(ap.indexOf('a')!==-1&&n===12){n=0}}}tp_inst.control.value(tp_inst,tp_inst[f+'_slider'],litem,n);tp_inst._onTimeChange();tp_inst._onSelectHandler()}).css({cursor:'pointer',width:(100/gridSize[litem])+'%',textAlign:'center',overflow:'hidden'})}}this.timezone_select=j.find('.ui_tpicker_timezone').append('<select></select>').find("select");$.fn.append.apply(this.timezone_select,$.map(o.timezoneList,function(a,b){return $("<option />").val(typeof a=="object"?a.value:a).text(typeof a=="object"?a.label:a)}));if(typeof(this.timezone)!="undefined"&&this.timezone!==null&&this.timezone!==""){var k=new Date(this.inst.selectedYear,this.inst.selectedMonth,this.inst.selectedDay,12);var p=$.timepicker.timeZoneOffsetString(k);if(p==this.timezone){B(tp_inst)}else{this.timezone_select.val(this.timezone)}}else{if(typeof(this.hour)!="undefined"&&this.hour!==null&&this.hour!==""){this.timezone_select.val(o.defaultTimezone)}else{B(tp_inst)}}this.timezone_select.change(function(){tp_inst._defaults.useLocalTimezone=false;tp_inst._onTimeChange();tp_inst._onSelectHandler()});var q=c.find('.ui-datepicker-buttonpane');if(q.length){q.before(j)}else{c.append(j)}this.$timeObj=j.find('.ui_tpicker_time');if(this.inst!==null){var r=this.timeDefined;this._onTimeChange();this.timeDefined=r}if(this._defaults.addSliderAccess){var s=this._defaults.sliderAccessArgs,rtl=this._defaults.isRTL;s.isRTL=rtl;setTimeout(function(){if(j.find('.ui-slider-access').length===0){j.find('.ui-slider:visible').sliderAccess(s);var b=j.find('.ui-slider-access:eq(0)').outerWidth(true);if(b){j.find('table:visible').each(function(){var a=$(this),oldWidth=a.outerWidth(),oldMarginLeft=a.css(rtl?'marginRight':'marginLeft').toString().replace('%',''),newWidth=oldWidth-b,newMarginLeft=((oldMarginLeft*newWidth)/oldWidth)+'%',css={width:newWidth,marginRight:0,marginLeft:0};css[rtl?'marginRight':'marginLeft']=newMarginLeft;a.css(css)})}}},10)}}},_limitMinMaxDateTime:function(a,b){var o=this._defaults,dp_date=new Date(a.selectedYear,a.selectedMonth,a.selectedDay);if(!this._defaults.showTimepicker){return}if($.datepicker._get(a,'minDateTime')!==null&&$.datepicker._get(a,'minDateTime')!==undefined&&dp_date){var c=$.datepicker._get(a,'minDateTime'),minDateTimeDate=new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);if(this.hourMinOriginal===null||this.minuteMinOriginal===null||this.secondMinOriginal===null||this.millisecMinOriginal===null){this.hourMinOriginal=o.hourMin;this.minuteMinOriginal=o.minuteMin;this.secondMinOriginal=o.secondMin;this.millisecMinOriginal=o.millisecMin}if(a.settings.timeOnly||minDateTimeDate.getTime()==dp_date.getTime()){this._defaults.hourMin=c.getHours();if(this.hour<=this._defaults.hourMin){this.hour=this._defaults.hourMin;this._defaults.minuteMin=c.getMinutes();if(this.minute<=this._defaults.minuteMin){this.minute=this._defaults.minuteMin;this._defaults.secondMin=c.getSeconds();if(this.second<=this._defaults.secondMin){this.second=this._defaults.secondMin;this._defaults.millisecMin=c.getMilliseconds()}else{if(this.millisec<this._defaults.millisecMin){this.millisec=this._defaults.millisecMin}this._defaults.millisecMin=this.millisecMinOriginal}}else{this._defaults.secondMin=this.secondMinOriginal;this._defaults.millisecMin=this.millisecMinOriginal}}else{this._defaults.minuteMin=this.minuteMinOriginal;this._defaults.secondMin=this.secondMinOriginal;this._defaults.millisecMin=this.millisecMinOriginal}}else{this._defaults.hourMin=this.hourMinOriginal;this._defaults.minuteMin=this.minuteMinOriginal;this._defaults.secondMin=this.secondMinOriginal;this._defaults.millisecMin=this.millisecMinOriginal}}if($.datepicker._get(a,'maxDateTime')!==null&&$.datepicker._get(a,'maxDateTime')!==undefined&&dp_date){var d=$.datepicker._get(a,'maxDateTime'),maxDateTimeDate=new Date(d.getFullYear(),d.getMonth(),d.getDate(),0,0,0,0);if(this.hourMaxOriginal===null||this.minuteMaxOriginal===null||this.secondMaxOriginal===null){this.hourMaxOriginal=o.hourMax;this.minuteMaxOriginal=o.minuteMax;this.secondMaxOriginal=o.secondMax;this.millisecMaxOriginal=o.millisecMax}if(a.settings.timeOnly||maxDateTimeDate.getTime()==dp_date.getTime()){this._defaults.hourMax=d.getHours();if(this.hour>=this._defaults.hourMax){this.hour=this._defaults.hourMax;this._defaults.minuteMax=d.getMinutes();if(this.minute>=this._defaults.minuteMax){this.minute=this._defaults.minuteMax;this._defaults.secondMax=d.getSeconds();if(this.second>=this._defaults.secondMax){this.second=this._defaults.secondMax;this._defaults.millisecMax=d.getMilliseconds()}else{if(this.millisec>this._defaults.millisecMax){this.millisec=this._defaults.millisecMax}this._defaults.millisecMax=this.millisecMaxOriginal}}else{this._defaults.secondMax=this.secondMaxOriginal;this._defaults.millisecMax=this.millisecMaxOriginal}}else{this._defaults.minuteMax=this.minuteMaxOriginal;this._defaults.secondMax=this.secondMaxOriginal;this._defaults.millisecMax=this.millisecMaxOriginal}}else{this._defaults.hourMax=this.hourMaxOriginal;this._defaults.minuteMax=this.minuteMaxOriginal;this._defaults.secondMax=this.secondMaxOriginal;this._defaults.millisecMax=this.millisecMaxOriginal}}if(b!==undefined&&b===true){var e=parseInt((this._defaults.hourMax-((this._defaults.hourMax-this._defaults.hourMin)%this._defaults.stepHour)),10),minMax=parseInt((this._defaults.minuteMax-((this._defaults.minuteMax-this._defaults.minuteMin)%this._defaults.stepMinute)),10),secMax=parseInt((this._defaults.secondMax-((this._defaults.secondMax-this._defaults.secondMin)%this._defaults.stepSecond)),10),millisecMax=parseInt((this._defaults.millisecMax-((this._defaults.millisecMax-this._defaults.millisecMin)%this._defaults.stepMillisec)),10);if(this.hour_slider){this.control.options(this,this.hour_slider,'hour',{min:this._defaults.hourMin,max:e});this.control.value(this,this.hour_slider,'hour',this.hour-(this.hour%this._defaults.stepHour))}if(this.minute_slider){this.control.options(this,this.minute_slider,'minute',{min:this._defaults.minuteMin,max:minMax});this.control.value(this,this.minute_slider,'minute',this.minute-(this.minute%this._defaults.stepMinute))}if(this.second_slider){this.control.options(this,this.second_slider,'second',{min:this._defaults.secondMin,max:secMax});this.control.value(this,this.second_slider,'second',this.second-(this.second%this._defaults.stepSecond))}if(this.millisec_slider){this.control.options(this,this.millisec_slider,'millisec',{min:this._defaults.millisecMin,max:millisecMax});this.control.value(this,this.millisec_slider,'millisec',this.millisec-(this.millisec%this._defaults.stepMillisec))}}},_onTimeChange:function(){var a=(this.hour_slider)?this.control.value(this,this.hour_slider,'hour'):false,minute=(this.minute_slider)?this.control.value(this,this.minute_slider,'minute'):false,second=(this.second_slider)?this.control.value(this,this.second_slider,'second'):false,millisec=(this.millisec_slider)?this.control.value(this,this.millisec_slider,'millisec'):false,timezone=(this.timezone_select)?this.timezone_select.val():false,o=this._defaults,pickerTimeFormat=o.pickerTimeFormat||o.timeFormat,pickerTimeSuffix=o.pickerTimeSuffix||o.timeSuffix;if(typeof(a)=='object'){a=false}if(typeof(minute)=='object'){minute=false}if(typeof(second)=='object'){second=false}if(typeof(millisec)=='object'){millisec=false}if(typeof(timezone)=='object'){timezone=false}if(a!==false){a=parseInt(a,10)}if(minute!==false){minute=parseInt(minute,10)}if(second!==false){second=parseInt(second,10)}if(millisec!==false){millisec=parseInt(millisec,10)}var b=o[a<12?'amNames':'pmNames'][0];var c=(a!=this.hour||minute!=this.minute||second!=this.second||millisec!=this.millisec||(this.ampm.length>0&&(a<12)!=($.inArray(this.ampm.toUpperCase(),this.amNames)!==-1))||((this.timezone===null&&timezone!=this.defaultTimezone)||(this.timezone!==null&&timezone!=this.timezone)));if(c){if(a!==false){this.hour=a}if(minute!==false){this.minute=minute}if(second!==false){this.second=second}if(millisec!==false){this.millisec=millisec}if(timezone!==false){this.timezone=timezone}if(!this.inst){this.inst=$.datepicker._getInst(this.$input[0])}this._limitMinMaxDateTime(this.inst,true)}if(x(o.timeFormat)){this.ampm=b}this.formattedTime=$.datepicker.formatTime(o.timeFormat,this,o);if(this.$timeObj){if(pickerTimeFormat===o.timeFormat){this.$timeObj.text(this.formattedTime+pickerTimeSuffix)}else{this.$timeObj.text($.datepicker.formatTime(pickerTimeFormat,this,o)+pickerTimeSuffix)}}this.timeDefined=true;if(c){this._updateDateTime()}},_onSelectHandler:function(){var a=this._defaults.onSelect||this.inst.settings.onSelect;var b=this.$input?this.$input[0]:null;if(a&&b){a.apply(b,[this.formattedDateTime,this])}},_updateDateTime:function(a){a=this.inst||a;var b=$.datepicker._daylightSavingAdjust(new Date(a.selectedYear,a.selectedMonth,a.selectedDay)),dateFmt=$.datepicker._get(a,'dateFormat'),formatCfg=$.datepicker._getFormatConfig(a),timeAvailable=b!==null&&this.timeDefined;this.formattedDate=$.datepicker.formatDate(dateFmt,(b===null?new Date():b),formatCfg);var c=this.formattedDate;if(a.lastVal===""){a.currentYear=a.selectedYear;a.currentMonth=a.selectedMonth;a.currentDay=a.selectedDay}if(this._defaults.timeOnly===true){c=this.formattedTime}else if(this._defaults.timeOnly!==true&&(this._defaults.alwaysSetTime||timeAvailable)){c+=this._defaults.separator+this.formattedTime+this._defaults.timeSuffix}this.formattedDateTime=c;if(!this._defaults.showTimepicker){this.$input.val(this.formattedDate)}else if(this.$altInput&&this._defaults.altFieldTimeOnly===true){this.$altInput.val(this.formattedTime);this.$input.val(this.formattedDate)}else if(this.$altInput){this.$input.val(c);var d='',altSeparator=this._defaults.altSeparator?this._defaults.altSeparator:this._defaults.separator,altTimeSuffix=this._defaults.altTimeSuffix?this._defaults.altTimeSuffix:this._defaults.timeSuffix;if(this._defaults.altFormat){d=$.datepicker.formatDate(this._defaults.altFormat,(b===null?new Date():b),formatCfg)}else{d=this.formattedDate}if(d){d+=altSeparator}if(this._defaults.altTimeFormat){d+=$.datepicker.formatTime(this._defaults.altTimeFormat,this,this._defaults)+altTimeSuffix}else{d+=this.formattedTime+altTimeSuffix}this.$altInput.val(d)}else{this.$input.val(c)}this.$input.trigger("change")},_onFocus:function(){if(!this.$input.val()&&this._defaults.defaultValue){this.$input.val(this._defaults.defaultValue);var a=$.datepicker._getInst(this.$input.get(0)),tp_inst=$.datepicker._get(a,'timepicker');if(tp_inst){if(tp_inst._defaults.timeOnly&&(a.input.val()!=a.lastVal)){try{$.datepicker._updateDatepicker(a)}catch(err){$.timepicker.log(err)}}}}},_controls:{slider:{create:function(c,d,e,f,g,h,i){var j=c._defaults.isRTL;return d.prop('slide',null).slider({orientation:"horizontal",value:j?f*-1:f,min:j?h*-1:g,max:j?g*-1:h,step:i,slide:function(a,b){c.control.value(c,$(this),e,j?b.value*-1:b.value);c._onTimeChange()},stop:function(a,b){c._onSelectHandler()}})},options:function(a,b,c,d,e){if(a._defaults.isRTL){if(typeof(d)=='string'){if(d=='min'||d=='max'){if(e!==undefined){return b.slider(d,e*-1)}return Math.abs(b.slider(d))}return b.slider(d)}var f=d.min,max=d.max;d.min=d.max=null;if(f!==undefined){d.max=f*-1}if(max!==undefined){d.min=max*-1}return b.slider(d)}if(typeof(d)=='string'&&e!==undefined){return b.slider(d,e)}return b.slider(d)},value:function(a,b,c,d){if(a._defaults.isRTL){if(d!==undefined){return b.slider('value',d*-1)}return Math.abs(b.slider('value'))}if(d!==undefined){return b.slider('value',d)}return b.slider('value')}},select:{create:function(a,b,c,d,f,g,h){var j='<select class="ui-timepicker-select" data-unit="'+c+'" data-min="'+f+'" data-max="'+g+'" data-step="'+h+'">',format=a._defaults.pickerTimeFormat||a._defaults.timeFormat;for(var i=f;i<=g;i+=h){j+='<option value="'+i+'"'+(i==d?' selected':'')+'>';if(c=='hour'){j+=$.datepicker.formatTime($.trim(format.replace(/[^ht ]/ig,'')),{hour:i},a._defaults)}else if(c=='millisec'||i>=10){j+=i}else{j+='0'+i.toString()}j+='</option>'}j+='</select>';b.children('select').remove();$(j).appendTo(b).change(function(e){a._onTimeChange();a._onSelectHandler()});return b},options:function(a,b,c,d,e){var o={},$t=b.children('select');if(typeof(d)=='string'){if(e===undefined){return $t.data(d)}o[d]=e}else{o=d}return a.control.create(a,b,$t.data('unit'),$t.val(),o.min||$t.data('min'),o.max||$t.data('max'),o.step||$t.data('step'))},value:function(a,b,c,d){var e=b.children('select');if(d!==undefined){return e.val(d)}return e.val()}}}});$.fn.extend({timepicker:function(o){o=o||{};var a=Array.prototype.slice.call(arguments);if(typeof o=='object'){a[0]=$.extend(o,{timeOnly:true})}return $(this).each(function(){$.fn.datetimepicker.apply($(this),a)})},datetimepicker:function(o){o=o||{};var b=arguments;if(typeof(o)=='string'){if(o=='getDate'){return $.fn.datepicker.apply($(this[0]),b)}else{return this.each(function(){var a=$(this);a.datepicker.apply(a,b)})}}else{return this.each(function(){var a=$(this);a.datepicker($.timepicker._newInst(a,o)._defaults)})}}});$.datepicker.parseDateTime=function(a,b,c,d,e){var f=A(a,b,c,d,e);if(f.timeObj){var t=f.timeObj;f.date.setHours(t.hour,t.minute,t.second,t.millisec)}return f.date};$.datepicker.parseTime=function(l,n,p){var o=w(w({},$.timepicker._defaults),p||{});var q=function(f,s,o){var e=function(b,c){var d=[];if(b){$.merge(d,b)}if(c){$.merge(d,c)}d=$.map(d,function(a){return a.replace(/[.*+?|()\[\]{}\\]/g,'\\$&')});return'('+d.join('|')+')?'};var g=function(a){var b=a.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z|'.*?')/g),orders={h:-1,m:-1,s:-1,l:-1,t:-1,z:-1};if(b){for(var i=0;i<b.length;i++){if(orders[b[i].toString().charAt(0)]==-1){orders[b[i].toString().charAt(0)]=i+1}}}return orders};var h='^'+f.toString().replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[lz]|'.*?')/g,function(a){var b=a.length;switch(a.charAt(0).toLowerCase()){case'h':return b===1?'(\\d?\\d)':'(\\d{'+b+'})';case'm':return b===1?'(\\d?\\d)':'(\\d{'+b+'})';case's':return b===1?'(\\d?\\d)':'(\\d{'+b+'})';case'l':return'(\\d?\\d?\\d)';case'z':return'(z|[-+]\\d\\d:?\\d\\d|\\S+)?';case't':return e(o.amNames,o.pmNames);default:return'('+a.replace(/\'/g,"").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g,function(m){return"\\"+m})+')?'}}).replace(/\s/g,'\\s?')+o.timeSuffix+'$',order=g(f),ampm='',treg;treg=s.match(new RegExp(h,'i'));var j={hour:0,minute:0,second:0,millisec:0};if(treg){if(order.t!==-1){if(treg[order.t]===undefined||treg[order.t].length===0){ampm='';j.ampm=''}else{ampm=$.inArray(treg[order.t].toUpperCase(),o.amNames)!==-1?'AM':'PM';j.ampm=o[ampm=='AM'?'amNames':'pmNames'][0]}}if(order.h!==-1){if(ampm=='AM'&&treg[order.h]=='12'){j.hour=0}else{if(ampm=='PM'&&treg[order.h]!='12'){j.hour=parseInt(treg[order.h],10)+12}else{j.hour=Number(treg[order.h])}}}if(order.m!==-1){j.minute=Number(treg[order.m])}if(order.s!==-1){j.second=Number(treg[order.s])}if(order.l!==-1){j.millisec=Number(treg[order.l])}if(order.z!==-1&&treg[order.z]!==undefined){var k=treg[order.z].toUpperCase();switch(k.length){case 1:k=o.timezoneIso8601?'Z':'+0000';break;case 5:if(o.timezoneIso8601){k=k.substring(1)=='0000'?'Z':k.substring(0,3)+':'+k.substring(3)}break;case 6:if(!o.timezoneIso8601){k=k=='Z'||k.substring(1)=='00:00'?'+0000':k.replace(/:/,'')}else{if(k.substring(1)=='00:00'){k='Z'}}break}j.timezone=k}return j}return false};var r=function(f,s,o){try{var d=new Date('2012-01-01 '+s);if(isNaN(d.getTime())){d=new Date('2012-01-01T'+s);if(isNaN(d.getTime())){d=new Date('01/01/2012 '+s);if(isNaN(d.getTime())){throw"Unable to parse time with native Date: "+s;}}}return{hour:d.getHours(),minute:d.getMinutes(),second:d.getSeconds(),millisec:d.getMilliseconds(),timezone:$.timepicker.timeZoneOffsetString(d)}}catch(err){try{return q(f,s,o)}catch(err2){$.timepicker.log("Unable to parse \ntimeString: "+s+"\ntimeFormat: "+f)}}return false};if(typeof o.parse==="function"){return o.parse(l,n,o)}if(o.parse==='loose'){return r(l,n,o)}return q(l,n,o)};$.datepicker.formatTime=function(b,c,d){d=d||{};d=$.extend({},$.timepicker._defaults,d);c=$.extend({hour:0,minute:0,second:0,millisec:0,timezone:'+0000'},c);var e=b,ampmName=d.amNames[0],hour=parseInt(c.hour,10);if(hour>11){ampmName=d.pmNames[0]}e=e.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[lz]|('.*?'|".*?"))/g,function(a){switch(a){case'HH':return('0'+hour).slice(-2);case'H':return hour;case'hh':return('0'+y(hour)).slice(-2);case'h':return y(hour);case'mm':return('0'+c.minute).slice(-2);case'm':return c.minute;case'ss':return('0'+c.second).slice(-2);case's':return c.second;case'l':return('00'+c.millisec).slice(-3);case'z':return c.timezone===null?d.defaultTimezone:c.timezone;case'T':return ampmName.charAt(0).toUpperCase();case'TT':return ampmName.toUpperCase();case't':return ampmName.charAt(0).toLowerCase();case'tt':return ampmName.toLowerCase();default:return a.replace(/\'/g,"")||"'"}});e=$.trim(e);return e};$.datepicker._base_selectDate=$.datepicker._selectDate;$.datepicker._selectDate=function(a,b){var c=this._getInst($(a)[0]),tp_inst=this._get(c,'timepicker');if(tp_inst){tp_inst._limitMinMaxDateTime(c,true);c.inline=c.stay_open=true;this._base_selectDate(a,b);c.inline=c.stay_open=false;this._notifyChange(c);this._updateDatepicker(c)}else{this._base_selectDate(a,b)}};$.datepicker._base_updateDatepicker=$.datepicker._updateDatepicker;$.datepicker._updateDatepicker=function(a){var b=a.input[0];if($.datepicker._curInst&&$.datepicker._curInst!=a&&$.datepicker._datepickerShowing&&$.datepicker._lastInput!=b){return}if(typeof(a.stay_open)!=='boolean'||a.stay_open===false){this._base_updateDatepicker(a);var c=this._get(a,'timepicker');if(c){c._addTimePicker(a)}}};$.datepicker._base_doKeyPress=$.datepicker._doKeyPress;$.datepicker._doKeyPress=function(a){var b=$.datepicker._getInst(a.target),tp_inst=$.datepicker._get(b,'timepicker');if(tp_inst){if($.datepicker._get(b,'constrainInput')){var c=x(tp_inst._defaults.timeFormat),dateChars=$.datepicker._possibleChars($.datepicker._get(b,'dateFormat')),datetimeChars=tp_inst._defaults.timeFormat.toString().replace(/[hms]/g,'').replace(/TT/g,c?'APM':'').replace(/Tt/g,c?'AaPpMm':'').replace(/tT/g,c?'AaPpMm':'').replace(/T/g,c?'AP':'').replace(/tt/g,c?'apm':'').replace(/t/g,c?'ap':'')+" "+tp_inst._defaults.separator+tp_inst._defaults.timeSuffix+(tp_inst._defaults.showTimezone?tp_inst._defaults.timezoneList.join(''):'')+(tp_inst._defaults.amNames.join(''))+(tp_inst._defaults.pmNames.join(''))+dateChars,chr=String.fromCharCode(a.charCode===undefined?a.keyCode:a.charCode);return a.ctrlKey||(chr<' '||!dateChars||datetimeChars.indexOf(chr)>-1)}}return $.datepicker._base_doKeyPress(a)};$.datepicker._base_updateAlternate=$.datepicker._updateAlternate;$.datepicker._updateAlternate=function(a){var b=this._get(a,'timepicker');if(b){var c=b._defaults.altField;if(c){var d=b._defaults.altFormat||b._defaults.dateFormat,date=this._getDate(a),formatCfg=$.datepicker._getFormatConfig(a),altFormattedDateTime='',altSeparator=b._defaults.altSeparator?b._defaults.altSeparator:b._defaults.separator,altTimeSuffix=b._defaults.altTimeSuffix?b._defaults.altTimeSuffix:b._defaults.timeSuffix,altTimeFormat=b._defaults.altTimeFormat!==null?b._defaults.altTimeFormat:b._defaults.timeFormat;altFormattedDateTime+=$.datepicker.formatTime(altTimeFormat,b,b._defaults)+altTimeSuffix;if(!b._defaults.timeOnly&&!b._defaults.altFieldTimeOnly&&date!==null){if(b._defaults.altFormat){altFormattedDateTime=$.datepicker.formatDate(b._defaults.altFormat,date,formatCfg)+altSeparator+altFormattedDateTime}else{altFormattedDateTime=b.formattedDate+altSeparator+altFormattedDateTime}}$(c).val(altFormattedDateTime)}}else{$.datepicker._base_updateAlternate(a)}};$.datepicker._base_doKeyUp=$.datepicker._doKeyUp;$.datepicker._doKeyUp=function(a){var b=$.datepicker._getInst(a.target),tp_inst=$.datepicker._get(b,'timepicker');if(tp_inst){if(tp_inst._defaults.timeOnly&&(b.input.val()!=b.lastVal)){try{$.datepicker._updateDatepicker(b)}catch(err){$.timepicker.log(err)}}}return $.datepicker._base_doKeyUp(a)};$.datepicker._base_gotoToday=$.datepicker._gotoToday;$.datepicker._gotoToday=function(a){var b=this._getInst($(a)[0]),$dp=b.dpDiv;this._base_gotoToday(a);var c=this._get(b,'timepicker');B(c);var d=new Date();this._setTime(b,d);$('.ui-datepicker-today',$dp).click()};$.datepicker._disableTimepickerDatepicker=function(a){var b=this._getInst(a);if(!b){return}var c=this._get(b,'timepicker');$(a).datepicker('getDate');if(c){c._defaults.showTimepicker=false;c._updateDateTime(b)}};$.datepicker._enableTimepickerDatepicker=function(a){var b=this._getInst(a);if(!b){return}var c=this._get(b,'timepicker');$(a).datepicker('getDate');if(c){c._defaults.showTimepicker=true;c._addTimePicker(b);c._updateDateTime(b)}};$.datepicker._setTime=function(a,b){var c=this._get(a,'timepicker');if(c){var d=c._defaults;c.hour=b?b.getHours():d.hour;c.minute=b?b.getMinutes():d.minute;c.second=b?b.getSeconds():d.second;c.millisec=b?b.getMilliseconds():d.millisec;c._limitMinMaxDateTime(a,true);c._onTimeChange();c._updateDateTime(a)}};$.datepicker._setTimeDatepicker=function(a,b,c){var d=this._getInst(a);if(!d){return}var e=this._get(d,'timepicker');if(e){this._setDateFromField(d);var f;if(b){if(typeof b=="string"){e._parseTime(b,c);f=new Date();f.setHours(e.hour,e.minute,e.second,e.millisec)}else{f=new Date(b.getTime())}if(f.toString()=='Invalid Date'){f=undefined}this._setTime(d,f)}}};$.datepicker._base_setDateDatepicker=$.datepicker._setDateDatepicker;$.datepicker._setDateDatepicker=function(a,b){var c=this._getInst(a);if(!c){return}var d=(b instanceof Date)?new Date(b.getTime()):b;this._updateDatepicker(c);this._base_setDateDatepicker.apply(this,arguments);this._setTimeDatepicker(a,d,true)};$.datepicker._base_getDateDatepicker=$.datepicker._getDateDatepicker;$.datepicker._getDateDatepicker=function(a,b){var c=this._getInst(a);if(!c){return}var d=this._get(c,'timepicker');if(d){if(c.lastVal===undefined){this._setDateFromField(c,b)}var e=this._getDate(c);if(e&&d._parseTime($(a).val(),d.timeOnly)){e.setHours(d.hour,d.minute,d.second,d.millisec)}return e}return this._base_getDateDatepicker(a,b)};$.datepicker._base_parseDate=$.datepicker.parseDate;$.datepicker.parseDate=function(a,b,c){var d;try{d=this._base_parseDate(a,b,c)}catch(err){if(err.indexOf(":")>=0){d=this._base_parseDate(a,b.substring(0,b.length-(err.length-err.indexOf(':')-2)),c);$.timepicker.log("Error parsing the date string: "+err+"\ndate string = "+b+"\ndate format = "+a)}else{throw err;}}return d};$.datepicker._base_formatDate=$.datepicker._formatDate;$.datepicker._formatDate=function(a,b,c,d){var e=this._get(a,'timepicker');if(e){e._updateDateTime(a);return e.$input.val()}return this._base_formatDate(a)};$.datepicker._base_optionDatepicker=$.datepicker._optionDatepicker;$.datepicker._optionDatepicker=function(a,b,c){var d=this._getInst(a),name_clone;if(!d){return null}var e=this._get(d,'timepicker');if(e){var f=null,max=null,onselect=null,overrides=e._defaults.evnts,fns={},prop;if(typeof b=='string'){if(b==='minDate'||b==='minDateTime'){f=c}else if(b==='maxDate'||b==='maxDateTime'){max=c}else if(b==='onSelect'){onselect=c}else if(overrides.hasOwnProperty(b)){if(typeof(c)==='undefined'){return overrides[b]}fns[b]=c;name_clone={}}}else if(typeof b=='object'){if(b.minDate){f=b.minDate}else if(b.minDateTime){f=b.minDateTime}else if(b.maxDate){max=b.maxDate}else if(b.maxDateTime){max=b.maxDateTime}for(prop in overrides){if(overrides.hasOwnProperty(prop)&&b[prop]){fns[prop]=b[prop]}}}for(prop in fns){if(fns.hasOwnProperty(prop)){overrides[prop]=fns[prop];if(!name_clone){name_clone=$.extend({},b)}delete name_clone[prop]}}if(name_clone&&v(name_clone)){return}if(f){if(f===0){f=new Date()}else{f=new Date(f)}e._defaults.minDate=f;e._defaults.minDateTime=f}else if(max){if(max===0){max=new Date()}else{max=new Date(max)}e._defaults.maxDate=max;e._defaults.maxDateTime=max}else if(onselect){e._defaults.onSelect=onselect}}if(c===undefined){return this._base_optionDatepicker.call($.datepicker,a,b)}return this._base_optionDatepicker.call($.datepicker,a,name_clone||b,c)};var v=function(a){var b;for(b in a){if(a.hasOwnProperty(a)){return false}}return true};var w=function(a,b){$.extend(a,b);for(var c in b){if(b[c]===null||b[c]===undefined){a[c]=b[c]}}return a};var x=function(a){return((a.indexOf('t')!==-1||a.indexOf('T')!==-1)&&a.indexOf('h')!==-1)};var y=function(a){if(a>12){a=a-12}if(a===0){a=12}return String(a)};var z=function(a,b,c,d){try{var e=d&&d.separator?d.separator:$.timepicker._defaults.separator,format=d&&d.timeFormat?d.timeFormat:$.timepicker._defaults.timeFormat,timeParts=format.split(e),timePartsLen=timeParts.length,allParts=b.split(e),allPartsLen=allParts.length;if(allPartsLen>1){return[allParts.splice(0,allPartsLen-timePartsLen).join(e),allParts.splice(0,timePartsLen).join(e)]}}catch(err){$.timepicker.log('Could not split the date from the time. Please check the following datetimepicker options'+"\nthrown error: "+err+"\ndateTimeString"+b+"\ndateFormat = "+a+"\nseparator = "+d.separator+"\ntimeFormat = "+d.timeFormat);if(err.indexOf(":")>=0){var f=b.length-(err.length-err.indexOf(':')-2),timeString=b.substring(f);return[$.trim(b.substring(0,f)),$.trim(b.substring(f))]}else{throw err;}}return[b,'']};var A=function(a,b,c,d,e){var f;var g=z(a,c,d,e);f=$.datepicker._base_parseDate(a,g[0],d);if(g[1]!==''){var h=g[1],parsedTime=$.datepicker.parseTime(b,h,e);if(parsedTime===null){throw'Wrong time format';}return{date:f,timeObj:parsedTime}}else{return{date:f}}};var B=function(a,b){if(a&&a.timezone_select){a._defaults.useLocalTimezone=true;var c=typeof b!=='undefined'?b:new Date();var d=$.timepicker.timeZoneOffsetString(c);if(a._defaults.timezoneIso8601){d=d.substring(0,3)+':'+d.substring(3)}a.timezone_select.val(d)}};$.timepicker=new u();$.timepicker.timeZoneOffsetString=function(a){var b=a.getTimezoneOffset()*-1,minutes=b%60,hours=(b-minutes)/60;return(b>=0?'+':'-')+('0'+(hours*101).toString()).slice(-2)+('0'+(minutes*101).toString()).slice(-2)};$.timepicker.timeRange=function(a,b,c){return $.timepicker.handleRange('timepicker',a,b,c)};$.timepicker.dateTimeRange=function(a,b,c){$.timepicker.dateRange(a,b,c,'datetimepicker')};$.timepicker.dateRange=function(a,b,c,d){d=d||'datepicker';$.timepicker.handleRange(d,a,b,c)};$.timepicker.handleRange=function(e,f,g,h){$.fn[e].call(f,$.extend({onClose:function(a,b){checkDates(this,g,a)},onSelect:function(a){selected(this,g,'minDate')}},h,h.start));$.fn[e].call(g,$.extend({onClose:function(a,b){checkDates(this,f,a)},onSelect:function(a){selected(this,f,'maxDate')}},h,h.end));if(e!='timepicker'&&h.reformat){$([f,g]).each(function(){var a=$(this)[e].call($(this),'option','dateFormat'),date=new Date($(this).val());if($(this).val()&&date){$(this).val($.datepicker.formatDate(a,date))}})}checkDates(f,g,f.val());function checkDates(a,b,c){if(b.val()&&(new Date(f.val())>new Date(g.val()))){b.val(c)}}selected(f,g,'minDate');selected(g,f,'maxDate');function selected(a,b,c){if(!$(a).val()){return}var d=$(a)[e].call($(a),'getDate');if(d.getTime){$(b)[e].call($(b),'option',c,d)}}return $([f.get(0),g.get(0)])};$.timepicker.log=function(a){if(window.console){console.log(a)}};$.timepicker.version="1.2.2"})(jQuery);
\ No newline at end of file
+/*! jQuery Timepicker Addon - v1.4 - 2013-08-11
+* http://trentrichardson.com/examples/timepicker
+* Copyright (c) 2013 Trent Richardson; Licensed MIT */
+(function($){if($.ui.timepicker=$.ui.timepicker||{},!$.ui.timepicker.version){$.extend($.ui,{timepicker:{version:"1.4"}});var Timepicker=function(){this.regional=[],this.regional[""]={currentText:"Now",closeText:"Done",amNames:["AM","A"],pmNames:["PM","P"],timeFormat:"HH:mm",timeSuffix:"",timeOnlyTitle:"Choose Time",timeText:"Time",hourText:"Hour",minuteText:"Minute",secondText:"Second",millisecText:"Millisecond",microsecText:"Microsecond",timezoneText:"Time Zone",isRTL:!1},this._defaults={showButtonPanel:!0,timeOnly:!1,showHour:null,showMinute:null,showSecond:null,showMillisec:null,showMicrosec:null,showTimezone:null,showTime:!0,stepHour:1,stepMinute:1,stepSecond:1,stepMillisec:1,stepMicrosec:1,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMin:0,minuteMin:0,secondMin:0,millisecMin:0,microsecMin:0,hourMax:23,minuteMax:59,secondMax:59,millisecMax:999,microsecMax:999,minDateTime:null,maxDateTime:null,onSelect:null,hourGrid:0,minuteGrid:0,secondGrid:0,millisecGrid:0,microsecGrid:0,alwaysSetTime:!0,separator:" ",altFieldTimeOnly:!0,altTimeFormat:null,altSeparator:null,altTimeSuffix:null,pickerTimeFormat:null,pickerTimeSuffix:null,showTimepicker:!0,timezoneList:null,addSliderAccess:!1,sliderAccessArgs:null,controlType:"slider",defaultValue:null,parse:"strict"},$.extend(this._defaults,this.regional[""])};$.extend(Timepicker.prototype,{$input:null,$altInput:null,$timeObj:null,inst:null,hour_slider:null,minute_slider:null,second_slider:null,millisec_slider:null,microsec_slider:null,timezone_select:null,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMinOriginal:null,minuteMinOriginal:null,secondMinOriginal:null,millisecMinOriginal:null,microsecMinOriginal:null,hourMaxOriginal:null,minuteMaxOriginal:null,secondMaxOriginal:null,millisecMaxOriginal:null,microsecMaxOriginal:null,ampm:"",formattedDate:"",formattedTime:"",formattedDateTime:"",timezoneList:null,units:["hour","minute","second","millisec","microsec"],support:{},control:null,setDefaults:function(e){return extendRemove(this._defaults,e||{}),this},_newInst:function($input,opts){var tp_inst=new Timepicker,inlineSettings={},fns={},overrides,i;for(var attrName in this._defaults)if(this._defaults.hasOwnProperty(attrName)){var attrValue=$input.attr("time:"+attrName);if(attrValue)try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}overrides={beforeShow:function(e,t){return $.isFunction(tp_inst._defaults.evnts.beforeShow)?tp_inst._defaults.evnts.beforeShow.call($input[0],e,t,tp_inst):void 0},onChangeMonthYear:function(e,t,i){tp_inst._updateDateTime(i),$.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)&&tp_inst._defaults.evnts.onChangeMonthYear.call($input[0],e,t,i,tp_inst)},onClose:function(e,t){tp_inst.timeDefined===!0&&""!==$input.val()&&tp_inst._updateDateTime(t),$.isFunction(tp_inst._defaults.evnts.onClose)&&tp_inst._defaults.evnts.onClose.call($input[0],e,t,tp_inst)}};for(i in overrides)overrides.hasOwnProperty(i)&&(fns[i]=opts[i]||null);tp_inst._defaults=$.extend({},this._defaults,inlineSettings,opts,overrides,{evnts:fns,timepicker:tp_inst}),tp_inst.amNames=$.map(tp_inst._defaults.amNames,function(e){return e.toUpperCase()}),tp_inst.pmNames=$.map(tp_inst._defaults.pmNames,function(e){return e.toUpperCase()}),tp_inst.support=detectSupport(tp_inst._defaults.timeFormat+(tp_inst._defaults.pickerTimeFormat?tp_inst._defaults.pickerTimeFormat:"")+(tp_inst._defaults.altTimeFormat?tp_inst._defaults.altTimeFormat:"")),"string"==typeof tp_inst._defaults.controlType?("slider"===tp_inst._defaults.controlType&&$.ui.slider===void 0&&(tp_inst._defaults.controlType="select"),tp_inst.control=tp_inst._controls[tp_inst._defaults.controlType]):tp_inst.control=tp_inst._defaults.controlType;var timezoneList=[-720,-660,-600,-570,-540,-480,-420,-360,-300,-270,-240,-210,-180,-120,-60,0,60,120,180,210,240,270,300,330,345,360,390,420,480,525,540,570,600,630,660,690,720,765,780,840];null!==tp_inst._defaults.timezoneList&&(timezoneList=tp_inst._defaults.timezoneList);var tzl=timezoneList.length,tzi=0,tzv=null;if(tzl>0&&"object"!=typeof timezoneList[0])for(;tzl>tzi;tzi++)tzv=timezoneList[tzi],timezoneList[tzi]={value:tzv,label:$.timepicker.timezoneOffsetString(tzv,tp_inst.support.iso8601)};return tp_inst._defaults.timezoneList=timezoneList,tp_inst.timezone=null!==tp_inst._defaults.timezone?$.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone):-1*(new Date).getTimezoneOffset(),tp_inst.hour=tp_inst._defaults.hour<tp_inst._defaults.hourMin?tp_inst._defaults.hourMin:tp_inst._defaults.hour>tp_inst._defaults.hourMax?tp_inst._defaults.hourMax:tp_inst._defaults.hour,tp_inst.minute=tp_inst._defaults.minute<tp_inst._defaults.minuteMin?tp_inst._defaults.minuteMin:tp_inst._defaults.minute>tp_inst._defaults.minuteMax?tp_inst._defaults.minuteMax:tp_inst._defaults.minute,tp_inst.second=tp_inst._defaults.second<tp_inst._defaults.secondMin?tp_inst._defaults.secondMin:tp_inst._defaults.second>tp_inst._defaults.secondMax?tp_inst._defaults.secondMax:tp_inst._defaults.second,tp_inst.millisec=tp_inst._defaults.millisec<tp_inst._defaults.millisecMin?tp_inst._defaults.millisecMin:tp_inst._defaults.millisec>tp_inst._defaults.millisecMax?tp_inst._defaults.millisecMax:tp_inst._defaults.millisec,tp_inst.microsec=tp_inst._defaults.microsec<tp_inst._defaults.microsecMin?tp_inst._defaults.microsecMin:tp_inst._defaults.microsec>tp_inst._defaults.microsecMax?tp_inst._defaults.microsecMax:tp_inst._defaults.microsec,tp_inst.ampm="",tp_inst.$input=$input,tp_inst._defaults.altField&&(tp_inst.$altInput=$(tp_inst._defaults.altField).css({cursor:"pointer"}).focus(function(){$input.trigger("focus")})),(0===tp_inst._defaults.minDate||0===tp_inst._defaults.minDateTime)&&(tp_inst._defaults.minDate=new Date),(0===tp_inst._defaults.maxDate||0===tp_inst._defaults.maxDateTime)&&(tp_inst._defaults.maxDate=new Date),void 0!==tp_inst._defaults.minDate&&tp_inst._defaults.minDate instanceof Date&&(tp_inst._defaults.minDateTime=new Date(tp_inst._defaults.minDate.getTime())),void 0!==tp_inst._defaults.minDateTime&&tp_inst._defaults.minDateTime instanceof Date&&(tp_inst._defaults.minDate=new Date(tp_inst._defaults.minDateTime.getTime())),void 0!==tp_inst._defaults.maxDate&&tp_inst._defaults.maxDate instanceof Date&&(tp_inst._defaults.maxDateTime=new Date(tp_inst._defaults.maxDate.getTime())),void 0!==tp_inst._defaults.maxDateTime&&tp_inst._defaults.maxDateTime instanceof Date&&(tp_inst._defaults.maxDate=new Date(tp_inst._defaults.maxDateTime.getTime())),tp_inst.$input.bind("focus",function(){tp_inst._onFocus()}),tp_inst},_addTimePicker:function(e){var t=this.$altInput&&this._defaults.altFieldTimeOnly?this.$input.val()+" "+this.$altInput.val():this.$input.val();this.timeDefined=this._parseTime(t),this._limitMinMaxDateTime(e,!1),this._injectTimePicker()},_parseTime:function(e,t){if(this.inst||(this.inst=$.datepicker._getInst(this.$input[0])),t||!this._defaults.timeOnly){var i=$.datepicker._get(this.inst,"dateFormat");try{var s=parseDateTimeInternal(i,this._defaults.timeFormat,e,$.datepicker._getFormatConfig(this.inst),this._defaults);if(!s.timeObj)return!1;$.extend(this,s.timeObj)}catch(a){return $.timepicker.log("Error parsing the date/time string: "+a+"\ndate/time string = "+e+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+i),!1}return!0}var n=$.datepicker.parseTime(this._defaults.timeFormat,e,this._defaults);return n?($.extend(this,n),!0):!1},_injectTimePicker:function(){var e=this.inst.dpDiv,t=this.inst.settings,i=this,s="",a="",n=null,r={},l={},o=null,c=0,u=0;if(0===e.find("div.ui-timepicker-div").length&&t.showTimepicker){var m=' style="display:none;"',d='<div class="ui-timepicker-div'+(t.isRTL?" ui-timepicker-rtl":"")+'"><dl>'+'<dt class="ui_tpicker_time_label"'+(t.showTime?"":m)+">"+t.timeText+"</dt>"+'<dd class="ui_tpicker_time"'+(t.showTime?"":m)+"></dd>";for(c=0,u=this.units.length;u>c;c++){if(s=this.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],r[s]=parseInt(t[s+"Max"]-(t[s+"Max"]-t[s+"Min"])%t["step"+a],10),l[s]=0,d+='<dt class="ui_tpicker_'+s+'_label"'+(n?"":m)+">"+t[s+"Text"]+"</dt>"+'<dd class="ui_tpicker_'+s+'"><div class="ui_tpicker_'+s+'_slider"'+(n?"":m)+"></div>",n&&t[s+"Grid"]>0){if(d+='<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>',"hour"===s)for(var p=t[s+"Min"];r[s]>=p;p+=parseInt(t[s+"Grid"],10)){l[s]++;var h=$.datepicker.formatTime(this.support.ampm?"hht":"HH",{hour:p},t);d+='<td data-for="'+s+'">'+h+"</td>"}else for(var _=t[s+"Min"];r[s]>=_;_+=parseInt(t[s+"Grid"],10))l[s]++,d+='<td data-for="'+s+'">'+(10>_?"0":"")+_+"</td>";d+="</tr></table></div>"}d+="</dd>"}var f=null!==t.showTimezone?t.showTimezone:this.support.timezone;d+='<dt class="ui_tpicker_timezone_label"'+(f?"":m)+">"+t.timezoneText+"</dt>",d+='<dd class="ui_tpicker_timezone" '+(f?"":m)+"></dd>",d+="</dl></div>";var g=$(d);for(t.timeOnly===!0&&(g.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all"><div class="ui-datepicker-title">'+t.timeOnlyTitle+"</div>"+"</div>"),e.find(".ui-datepicker-header, .ui-datepicker-calendar").hide()),c=0,u=i.units.length;u>c;c++)s=i.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],i[s+"_slider"]=i.control.create(i,g.find(".ui_tpicker_"+s+"_slider"),s,i[s],t[s+"Min"],r[s],t["step"+a]),n&&t[s+"Grid"]>0&&(o=100*l[s]*t[s+"Grid"]/(r[s]-t[s+"Min"]),g.find(".ui_tpicker_"+s+" table").css({width:o+"%",marginLeft:t.isRTL?"0":o/(-2*l[s])+"%",marginRight:t.isRTL?o/(-2*l[s])+"%":"0",borderCollapse:"collapse"}).find("td").click(function(){var e=$(this),t=e.html(),a=parseInt(t.replace(/[^0-9]/g),10),n=t.replace(/[^apm]/gi),r=e.data("for");"hour"===r&&(-1!==n.indexOf("p")&&12>a?a+=12:-1!==n.indexOf("a")&&12===a&&(a=0)),i.control.value(i,i[r+"_slider"],s,a),i._onTimeChange(),i._onSelectHandler()}).css({cursor:"pointer",width:100/l[s]+"%",textAlign:"center",overflow:"hidden"}));if(this.timezone_select=g.find(".ui_tpicker_timezone").append("<select></select>").find("select"),$.fn.append.apply(this.timezone_select,$.map(t.timezoneList,function(e){return $("<option />").val("object"==typeof e?e.value:e).text("object"==typeof e?e.label:e)})),this.timezone!==void 0&&null!==this.timezone&&""!==this.timezone){var M=-1*new Date(this.inst.selectedYear,this.inst.selectedMonth,this.inst.selectedDay,12).getTimezoneOffset();M===this.timezone?selectLocalTimezone(i):this.timezone_select.val(this.timezone)}else this.hour!==void 0&&null!==this.hour&&""!==this.hour?this.timezone_select.val(t.timezone):selectLocalTimezone(i);this.timezone_select.change(function(){i._onTimeChange(),i._onSelectHandler()});var v=e.find(".ui-datepicker-buttonpane");if(v.length?v.before(g):e.append(g),this.$timeObj=g.find(".ui_tpicker_time"),null!==this.inst){var k=this.timeDefined;this._onTimeChange(),this.timeDefined=k}if(this._defaults.addSliderAccess){var T=this._defaults.sliderAccessArgs,D=this._defaults.isRTL;T.isRTL=D,setTimeout(function(){if(0===g.find(".ui-slider-access").length){g.find(".ui-slider:visible").sliderAccess(T);var e=g.find(".ui-slider-access:eq(0)").outerWidth(!0);e&&g.find("table:visible").each(function(){var t=$(this),i=t.outerWidth(),s=(""+t.css(D?"marginRight":"marginLeft")).replace("%",""),a=i-e,n=s*a/i+"%",r={width:a,marginRight:0,marginLeft:0};r[D?"marginRight":"marginLeft"]=n,t.css(r)})}},10)}i._limitMinMaxDateTime(this.inst,!0)}},_limitMinMaxDateTime:function(e,t){var i=this._defaults,s=new Date(e.selectedYear,e.selectedMonth,e.selectedDay);if(this._defaults.showTimepicker){if(null!==$.datepicker._get(e,"minDateTime")&&void 0!==$.datepicker._get(e,"minDateTime")&&s){var a=$.datepicker._get(e,"minDateTime"),n=new Date(a.getFullYear(),a.getMonth(),a.getDate(),0,0,0,0);(null===this.hourMinOriginal||null===this.minuteMinOriginal||null===this.secondMinOriginal||null===this.millisecMinOriginal||null===this.microsecMinOriginal)&&(this.hourMinOriginal=i.hourMin,this.minuteMinOriginal=i.minuteMin,this.secondMinOriginal=i.secondMin,this.millisecMinOriginal=i.millisecMin,this.microsecMinOriginal=i.microsecMin),e.settings.timeOnly||n.getTime()===s.getTime()?(this._defaults.hourMin=a.getHours(),this.hour<=this._defaults.hourMin?(this.hour=this._defaults.hourMin,this._defaults.minuteMin=a.getMinutes(),this.minute<=this._defaults.minuteMin?(this.minute=this._defaults.minuteMin,this._defaults.secondMin=a.getSeconds(),this.second<=this._defaults.secondMin?(this.second=this._defaults.secondMin,this._defaults.millisecMin=a.getMilliseconds(),this.millisec<=this._defaults.millisecMin?(this.millisec=this._defaults.millisecMin,this._defaults.microsecMin=a.getMicroseconds()):(this.microsec<this._defaults.microsecMin&&(this.microsec=this._defaults.microsecMin),this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.hourMin=this.hourMinOriginal,this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)}if(null!==$.datepicker._get(e,"maxDateTime")&&void 0!==$.datepicker._get(e,"maxDateTime")&&s){var r=$.datepicker._get(e,"maxDateTime"),l=new Date(r.getFullYear(),r.getMonth(),r.getDate(),0,0,0,0);(null===this.hourMaxOriginal||null===this.minuteMaxOriginal||null===this.secondMaxOriginal||null===this.millisecMaxOriginal)&&(this.hourMaxOriginal=i.hourMax,this.minuteMaxOriginal=i.minuteMax,this.secondMaxOriginal=i.secondMax,this.millisecMaxOriginal=i.millisecMax,this.microsecMaxOriginal=i.microsecMax),e.settings.timeOnly||l.getTime()===s.getTime()?(this._defaults.hourMax=r.getHours(),this.hour>=this._defaults.hourMax?(this.hour=this._defaults.hourMax,this._defaults.minuteMax=r.getMinutes(),this.minute>=this._defaults.minuteMax?(this.minute=this._defaults.minuteMax,this._defaults.secondMax=r.getSeconds(),this.second>=this._defaults.secondMax?(this.second=this._defaults.secondMax,this._defaults.millisecMax=r.getMilliseconds(),this.millisec>=this._defaults.millisecMax?(this.millisec=this._defaults.millisecMax,this._defaults.microsecMax=r.getMicroseconds()):(this.microsec>this._defaults.microsecMax&&(this.microsec=this._defaults.microsecMax),this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.hourMax=this.hourMaxOriginal,this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)}if(void 0!==t&&t===!0){var o=parseInt(this._defaults.hourMax-(this._defaults.hourMax-this._defaults.hourMin)%this._defaults.stepHour,10),c=parseInt(this._defaults.minuteMax-(this._defaults.minuteMax-this._defaults.minuteMin)%this._defaults.stepMinute,10),u=parseInt(this._defaults.secondMax-(this._defaults.secondMax-this._defaults.secondMin)%this._defaults.stepSecond,10),m=parseInt(this._defaults.millisecMax-(this._defaults.millisecMax-this._defaults.millisecMin)%this._defaults.stepMillisec,10),d=parseInt(this._defaults.microsecMax-(this._defaults.microsecMax-this._defaults.microsecMin)%this._defaults.stepMicrosec,10);this.hour_slider&&(this.control.options(this,this.hour_slider,"hour",{min:this._defaults.hourMin,max:o}),this.control.value(this,this.hour_slider,"hour",this.hour-this.hour%this._defaults.stepHour)),this.minute_slider&&(this.control.options(this,this.minute_slider,"minute",{min:this._defaults.minuteMin,max:c}),this.control.value(this,this.minute_slider,"minute",this.minute-this.minute%this._defaults.stepMinute)),this.second_slider&&(this.control.options(this,this.second_slider,"second",{min:this._defaults.secondMin,max:u}),this.control.value(this,this.second_slider,"second",this.second-this.second%this._defaults.stepSecond)),this.millisec_slider&&(this.control.options(this,this.millisec_slider,"millisec",{min:this._defaults.millisecMin,max:m}),this.control.value(this,this.millisec_slider,"millisec",this.millisec-this.millisec%this._defaults.stepMillisec)),this.microsec_slider&&(this.control.options(this,this.microsec_slider,"microsec",{min:this._defaults.microsecMin,max:d}),this.control.value(this,this.microsec_slider,"microsec",this.microsec-this.microsec%this._defaults.stepMicrosec))}}},_onTimeChange:function(){if(this._defaults.showTimepicker){var e=this.hour_slider?this.control.value(this,this.hour_slider,"hour"):!1,t=this.minute_slider?this.control.value(this,this.minute_slider,"minute"):!1,i=this.second_slider?this.control.value(this,this.second_slider,"second"):!1,s=this.millisec_slider?this.control.value(this,this.millisec_slider,"millisec"):!1,a=this.microsec_slider?this.control.value(this,this.microsec_slider,"microsec"):!1,n=this.timezone_select?this.timezone_select.val():!1,r=this._defaults,l=r.pickerTimeFormat||r.timeFormat,o=r.pickerTimeSuffix||r.timeSuffix;"object"==typeof e&&(e=!1),"object"==typeof t&&(t=!1),"object"==typeof i&&(i=!1),"object"==typeof s&&(s=!1),"object"==typeof a&&(a=!1),"object"==typeof n&&(n=!1),e!==!1&&(e=parseInt(e,10)),t!==!1&&(t=parseInt(t,10)),i!==!1&&(i=parseInt(i,10)),s!==!1&&(s=parseInt(s,10)),a!==!1&&(a=parseInt(a,10));var c=r[12>e?"amNames":"pmNames"][0],u=e!==this.hour||t!==this.minute||i!==this.second||s!==this.millisec||a!==this.microsec||this.ampm.length>0&&12>e!=(-1!==$.inArray(this.ampm.toUpperCase(),this.amNames))||null!==this.timezone&&n!==this.timezone;u&&(e!==!1&&(this.hour=e),t!==!1&&(this.minute=t),i!==!1&&(this.second=i),s!==!1&&(this.millisec=s),a!==!1&&(this.microsec=a),n!==!1&&(this.timezone=n),this.inst||(this.inst=$.datepicker._getInst(this.$input[0])),this._limitMinMaxDateTime(this.inst,!0)),this.support.ampm&&(this.ampm=c),this.formattedTime=$.datepicker.formatTime(r.timeFormat,this,r),this.$timeObj&&(l===r.timeFormat?this.$timeObj.text(this.formattedTime+o):this.$timeObj.text($.datepicker.formatTime(l,this,r)+o)),this.timeDefined=!0,u&&this._updateDateTime()}},_onSelectHandler:function(){var e=this._defaults.onSelect||this.inst.settings.onSelect,t=this.$input?this.$input[0]:null;e&&t&&e.apply(t,[this.formattedDateTime,this])},_updateDateTime:function(e){e=this.inst||e;var t=e.currentYear>0?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(e.selectedYear,e.selectedMonth,e.selectedDay),i=$.datepicker._daylightSavingAdjust(t),s=$.datepicker._get(e,"dateFormat"),a=$.datepicker._getFormatConfig(e),n=null!==i&&this.timeDefined;this.formattedDate=$.datepicker.formatDate(s,null===i?new Date:i,a);var r=this.formattedDate;if(""===e.lastVa&&(e.currentYear=e.selectedYear,e.currentMonth=e.selectedMonth,e.currentDay=e.selectedDay),this._defaults.timeOnly===!0?r=this.formattedTime:this._defaults.timeOnly!==!0&&(this._defaults.alwaysSetTime||n)&&(r+=this._defaults.separator+this.formattedTime+this._defaults.timeSuffix),this.formattedDateTime=r,this._defaults.showTimepicker)if(this.$altInput&&this._defaults.timeOnly===!1&&this._defaults.altFieldTimeOnly===!0)this.$altInput.val(this.formattedTime),this.$input.val(this.formattedDate);else if(this.$altInput){this.$input.val(r);var l="",o=this._defaults.altSeparator?this._defaults.altSeparator:this._defaults.separator,c=this._defaults.altTimeSuffix?this._defaults.altTimeSuffix:this._defaults.timeSuffix;this._defaults.timeOnly||(l=this._defaults.altFormat?$.datepicker.formatDate(this._defaults.altFormat,null===i?new Date:i,a):this.formattedDate,l&&(l+=o)),l+=this._defaults.altTimeFormat?$.datepicker.formatTime(this._defaults.altTimeFormat,this,this._defaults)+c:this.formattedTime+c,this.$altInput.val(l)}else this.$input.val(r);else this.$input.val(this.formattedDate);this.$input.trigger("change")},_onFocus:function(){if(!this.$input.val()&&this._defaults.defaultValue){this.$input.val(this._defaults.defaultValue);var e=$.datepicker._getInst(this.$input.get(0)),t=$.datepicker._get(e,"timepicker");if(t&&t._defaults.timeOnly&&e.input.val()!==e.lastVal)try{$.datepicker._updateDatepicker(e)}catch(i){$.timepicker.log(i)}}},_controls:{slider:{create:function(e,t,i,s,a,n,r){var l=e._defaults.isRTL;return t.prop("slide",null).slider({orientation:"horizontal",value:l?-1*s:s,min:l?-1*n:a,max:l?-1*a:n,step:r,slide:function(t,s){e.control.value(e,$(this),i,l?-1*s.value:s.value),e._onTimeChange()},stop:function(){e._onSelectHandler()}})},options:function(e,t,i,s,a){if(e._defaults.isRTL){if("string"==typeof s)return"min"===s||"max"===s?void 0!==a?t.slider(s,-1*a):Math.abs(t.slider(s)):t.slider(s);var n=s.min,r=s.max;return s.min=s.max=null,void 0!==n&&(s.max=-1*n),void 0!==r&&(s.min=-1*r),t.slider(s)}return"string"==typeof s&&void 0!==a?t.slider(s,a):t.slider(s)},value:function(e,t,i,s){return e._defaults.isRTL?void 0!==s?t.slider("value",-1*s):Math.abs(t.slider("value")):void 0!==s?t.slider("value",s):t.slider("value")}},select:{create:function(e,t,i,s,a,n,r){for(var l='<select class="ui-timepicker-select" data-unit="'+i+'" data-min="'+a+'" data-max="'+n+'" data-step="'+r+'">',o=e._defaults.pickerTimeFormat||e._defaults.timeFormat,c=a;n>=c;c+=r)l+='<option value="'+c+'"'+(c===s?" selected":"")+">",l+="hour"===i?$.datepicker.formatTime($.trim(o.replace(/[^ht ]/gi,"")),{hour:c},e._defaults):"millisec"===i||"microsec"===i||c>=10?c:"0"+(""+c),l+="</option>";return l+="</select>",t.children("select").remove(),$(l).appendTo(t).change(function(){e._onTimeChange(),e._onSelectHandler()}),t},options:function(e,t,i,s,a){var n={},r=t.children("select");if("string"==typeof s){if(void 0===a)return r.data(s);n[s]=a}else n=s;return e.control.create(e,t,r.data("unit"),r.val(),n.min||r.data("min"),n.max||r.data("max"),n.step||r.data("step"))},value:function(e,t,i,s){var a=t.children("select");return void 0!==s?a.val(s):a.val()}}}}),$.fn.extend({timepicker:function(e){e=e||{};var t=Array.prototype.slice.call(arguments);return"object"==typeof e&&(t[0]=$.extend(e,{timeOnly:!0})),$(this).each(function(){$.fn.datetimepicker.apply($(this),t)})},datetimepicker:function(e){e=e||{};var t=arguments;return"string"==typeof e?"getDate"===e?$.fn.datepicker.apply($(this[0]),t):this.each(function(){var e=$(this);e.datepicker.apply(e,t)}):this.each(function(){var t=$(this);t.datepicker($.timepicker._newInst(t,e)._defaults)})}}),$.datepicker.parseDateTime=function(e,t,i,s,a){var n=parseDateTimeInternal(e,t,i,s,a);if(n.timeObj){var r=n.timeObj;n.date.setHours(r.hour,r.minute,r.second,r.millisec),n.date.setMicroseconds(r.microsec)}return n.date},$.datepicker.parseTime=function(e,t,i){var s=extendRemove(extendRemove({},$.timepicker._defaults),i||{});-1!==e.replace(/\'.*?\'/g,"").indexOf("Z");var a=function(e,t,i){var s,a=function(e,t){var i=[];return e&&$.merge(i,e),t&&$.merge(i,t),i=$.map(i,function(e){return e.replace(/[.*+?|()\[\]{}\\]/g,"\\$&")}),"("+i.join("|")+")?"},n=function(e){var t=e.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),i={h:-1,m:-1,s:-1,l:-1,c:-1,t:-1,z:-1};if(t)for(var s=0;t.length>s;s++)-1===i[(""+t[s]).charAt(0)]&&(i[(""+t[s]).charAt(0)]=s+1);return i},r="^"+(""+e).replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){var t=e.length;switch(e.charAt(0).toLowerCase()){case"h":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"m":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"s":return 1===t?"(\\d?\\d)":"(\\d{"+t+"})";case"l":return"(\\d?\\d?\\d)";case"c":return"(\\d?\\d?\\d)";case"z":return"(z|[-+]\\d\\d:?\\d\\d|\\S+)?";case"t":return a(i.amNames,i.pmNames);default:return"("+e.replace(/\'/g,"").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g,function(e){return"\\"+e})+")?"}}).replace(/\s/g,"\\s?")+i.timeSuffix+"$",l=n(e),o="";s=t.match(RegExp(r,"i"));var c={hour:0,minute:0,second:0,millisec:0,microsec:0};return s?(-1!==l.t&&(void 0===s[l.t]||0===s[l.t].length?(o="",c.ampm=""):(o=-1!==$.inArray(s[l.t].toUpperCase(),i.amNames)?"AM":"PM",c.ampm=i["AM"===o?"amNames":"pmNames"][0])),-1!==l.h&&(c.hour="AM"===o&&"12"===s[l.h]?0:"PM"===o&&"12"!==s[l.h]?parseInt(s[l.h],10)+12:Number(s[l.h])),-1!==l.m&&(c.minute=Number(s[l.m])),-1!==l.s&&(c.second=Number(s[l.s])),-1!==l.l&&(c.millisec=Number(s[l.l])),-1!==l.c&&(c.microsec=Number(s[l.c])),-1!==l.z&&void 0!==s[l.z]&&(c.timezone=$.timepicker.timezoneOffsetNumber(s[l.z])),c):!1},n=function(e,t,i){try{var s=new Date("2012-01-01 "+t);if(isNaN(s.getTime())&&(s=new Date("2012-01-01T"+t),isNaN(s.getTime())&&(s=new Date("01/01/2012 "+t),isNaN(s.getTime()))))throw"Unable to parse time with native Date: "+t;return{hour:s.getHours(),minute:s.getMinutes(),second:s.getSeconds(),millisec:s.getMilliseconds(),microsec:s.getMicroseconds(),timezone:-1*s.getTimezoneOffset()}}catch(n){try{return a(e,t,i)}catch(r){$.timepicker.log("Unable to parse \ntimeString: "+t+"\ntimeFormat: "+e)}}return!1};return"function"==typeof s.parse?s.parse(e,t,s):"loose"===s.parse?n(e,t,s):a(e,t,s)},$.datepicker.formatTime=function(e,t,i){i=i||{},i=$.extend({},$.timepicker._defaults,i),t=$.extend({hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null},t);var s=e,a=i.amNames[0],n=parseInt(t.hour,10);return n>11&&(a=i.pmNames[0]),s=s.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){switch(e){case"HH":return("0"+n).slice(-2);case"H":return n;case"hh":return("0"+convert24to12(n)).slice(-2);case"h":return convert24to12(n);case"mm":return("0"+t.minute).slice(-2);case"m":return t.minute;case"ss":return("0"+t.second).slice(-2);case"s":return t.second;case"l":return("00"+t.millisec).slice(-3);case"c":return("00"+t.microsec).slice(-3);case"z":return $.timepicker.timezoneOffsetString(null===t.timezone?i.timezone:t.timezone,!1);case"Z":return $.timepicker.timezoneOffsetString(null===t.timezone?i.timezone:t.timezone,!0);case"T":return a.charAt(0).toUpperCase();case"TT":return a.toUpperCase();case"t":return a.charAt(0).toLowerCase();case"tt":return a.toLowerCase();default:return e.replace(/'/g,"")}})},$.datepicker._base_selectDate=$.datepicker._selectDate,$.datepicker._selectDate=function(e,t){var i=this._getInst($(e)[0]),s=this._get(i,"timepicker");s?(s._limitMinMaxDateTime(i,!0),i.inline=i.stay_open=!0,this._base_selectDate(e,t),i.inline=i.stay_open=!1,this._notifyChange(i),this._updateDatepicker(i)):this._base_selectDate(e,t)},$.datepicker._base_updateDatepicker=$.datepicker._updateDatepicker,$.datepicker._updateDatepicker=function(e){var t=e.input[0];if(!($.datepicker._curInst&&$.datepicker._curInst!==e&&$.datepicker._datepickerShowing&&$.datepicker._lastInput!==t||"boolean"==typeof e.stay_open&&e.stay_open!==!1)){this._base_updateDatepicker(e);var i=this._get(e,"timepicker");i&&i._addTimePicker(e)}},$.datepicker._base_doKeyPress=$.datepicker._doKeyPress,$.datepicker._doKeyPress=function(e){var t=$.datepicker._getInst(e.target),i=$.datepicker._get(t,"timepicker");if(i&&$.datepicker._get(t,"constrainInput")){var s=i.support.ampm,a=null!==i._defaults.showTimezone?i._defaults.showTimezone:i.support.timezone,n=$.datepicker._possibleChars($.datepicker._get(t,"dateFormat")),r=(""+i._defaults.timeFormat).replace(/[hms]/g,"").replace(/TT/g,s?"APM":"").replace(/Tt/g,s?"AaPpMm":"").replace(/tT/g,s?"AaPpMm":"").replace(/T/g,s?"AP":"").replace(/tt/g,s?"apm":"").replace(/t/g,s?"ap":"")+" "+i._defaults.separator+i._defaults.timeSuffix+(a?i._defaults.timezoneList.join(""):"")+i._defaults.amNames.join("")+i._defaults.pmNames.join("")+n,l=String.fromCharCode(void 0===e.charCode?e.keyCode:e.charCode);return e.ctrlKey||" ">l||!n||r.indexOf(l)>-1}return $.datepicker._base_doKeyPress(e)},$.datepicker._base_updateAlternate=$.datepicker._updateAlternate,$.datepicker._updateAlternate=function(e){var t=this._get(e,"timepicker");if(t){var i=t._defaults.altField;if(i){var s=(t._defaults.altFormat||t._defaults.dateFormat,this._getDate(e)),a=$.datepicker._getFormatConfig(e),n="",r=t._defaults.altSeparator?t._defaults.altSeparator:t._defaults.separator,l=t._defaults.altTimeSuffix?t._defaults.altTimeSuffix:t._defaults.timeSuffix,o=null!==t._defaults.altTimeFormat?t._defaults.altTimeFormat:t._defaults.timeFormat;n+=$.datepicker.formatTime(o,t,t._defaults)+l,t._defaults.timeOnly||t._defaults.altFieldTimeOnly||null===s||(n=t._defaults.altFormat?$.datepicker.formatDate(t._defaults.altFormat,s,a)+r+n:t.formattedDate+r+n),$(i).val(n)}}else $.datepicker._base_updateAlternate(e)},$.datepicker._base_doKeyUp=$.datepicker._doKeyUp,$.datepicker._doKeyUp=function(e){var t=$.datepicker._getInst(e.target),i=$.datepicker._get(t,"timepicker");if(i&&i._defaults.timeOnly&&t.input.val()!==t.lastVal)try{$.datepicker._updateDatepicker(t)}catch(s){$.timepicker.log(s)}return $.datepicker._base_doKeyUp(e)},$.datepicker._base_gotoToday=$.datepicker._gotoToday,$.datepicker._gotoToday=function(e){var t=this._getInst($(e)[0]),i=t.dpDiv;this._base_gotoToday(e);var s=this._get(t,"timepicker");selectLocalTimezone(s);var a=new Date;this._setTime(t,a),$(".ui-datepicker-today",i).click()},$.datepicker._disableTimepickerDatepicker=function(e){var t=this._getInst(e);if(t){var i=this._get(t,"timepicker");$(e).datepicker("getDate"),i&&(t.settings.showTimepicker=!1,i._defaults.showTimepicker=!1,i._updateDateTime(t))}},$.datepicker._enableTimepickerDatepicker=function(e){var t=this._getInst(e);if(t){var i=this._get(t,"timepicker");$(e).datepicker("getDate"),i&&(t.settings.showTimepicker=!0,i._defaults.showTimepicker=!0,i._addTimePicker(t),i._updateDateTime(t))}},$.datepicker._setTime=function(e,t){var i=this._get(e,"timepicker");if(i){var s=i._defaults;i.hour=t?t.getHours():s.hour,i.minute=t?t.getMinutes():s.minute,i.second=t?t.getSeconds():s.second,i.millisec=t?t.getMilliseconds():s.millisec,i.microsec=t?t.getMicroseconds():s.microsec,i._limitMinMaxDateTime(e,!0),i._onTimeChange(),i._updateDateTime(e)}},$.datepicker._setTimeDatepicker=function(e,t,i){var s=this._getInst(e);if(s){var a=this._get(s,"timepicker");if(a){this._setDateFromField(s);var n;t&&("string"==typeof t?(a._parseTime(t,i),n=new Date,n.setHours(a.hour,a.minute,a.second,a.millisec),n.setMicroseconds(a.microsec)):(n=new Date(t.getTime()),n.setMicroseconds(t.getMicroseconds())),"Invalid Date"==""+n&&(n=void 0),this._setTime(s,n))}}},$.datepicker._base_setDateDatepicker=$.datepicker._setDateDatepicker,$.datepicker._setDateDatepicker=function(e,t){var i=this._getInst(e);if(i){"string"==typeof t&&(t=new Date(t),t.getTime()||$.timepicker.log("Error creating Date object from string."));var s,a=this._get(i,"timepicker");t instanceof Date?(s=new Date(t.getTime()),s.setMicroseconds(t.getMicroseconds())):s=t,a&&(a.support.timezone||null!==a._defaults.timezone||(a.timezone=-1*s.getTimezoneOffset()),t=$.timepicker.timezoneAdjust(t,a.timezone),s=$.timepicker.timezoneAdjust(s,a.timezone)),this._updateDatepicker(i),this._base_setDateDatepicker.apply(this,arguments),this._setTimeDatepicker(e,s,!0)}},$.datepicker._base_getDateDatepicker=$.datepicker._getDateDatepicker,$.datepicker._getDateDatepicker=function(e,t){var i=this._getInst(e);if(i){var s=this._get(i,"timepicker");if(s){void 0===i.lastVal&&this._setDateFromField(i,t);var a=this._getDate(i);return a&&s._parseTime($(e).val(),s.timeOnly)&&(a.setHours(s.hour,s.minute,s.second,s.millisec),a.setMicroseconds(s.microsec),null!=s.timezone&&(s.support.timezone||null!==s._defaults.timezone||(s.timezone=-1*a.getTimezoneOffset()),a=$.timepicker.timezoneAdjust(a,s.timezone))),a
+}return this._base_getDateDatepicker(e,t)}},$.datepicker._base_parseDate=$.datepicker.parseDate,$.datepicker.parseDate=function(e,t,i){var s;try{s=this._base_parseDate(e,t,i)}catch(a){if(!(a.indexOf(":")>=0))throw a;s=this._base_parseDate(e,t.substring(0,t.length-(a.length-a.indexOf(":")-2)),i),$.timepicker.log("Error parsing the date string: "+a+"\ndate string = "+t+"\ndate format = "+e)}return s},$.datepicker._base_formatDate=$.datepicker._formatDate,$.datepicker._formatDate=function(e){var t=this._get(e,"timepicker");return t?(t._updateDateTime(e),t.$input.val()):this._base_formatDate(e)},$.datepicker._base_optionDatepicker=$.datepicker._optionDatepicker,$.datepicker._optionDatepicker=function(e,t,i){var s,a=this._getInst(e);if(!a)return null;var n=this._get(a,"timepicker");if(n){var r,l=null,o=null,c=null,u=n._defaults.evnts,m={};if("string"==typeof t){if("minDate"===t||"minDateTime"===t)l=i;else if("maxDate"===t||"maxDateTime"===t)o=i;else if("onSelect"===t)c=i;else if(u.hasOwnProperty(t)){if(i===void 0)return u[t];m[t]=i,s={}}}else if("object"==typeof t){t.minDate?l=t.minDate:t.minDateTime?l=t.minDateTime:t.maxDate?o=t.maxDate:t.maxDateTime&&(o=t.maxDateTime);for(r in u)u.hasOwnProperty(r)&&t[r]&&(m[r]=t[r])}for(r in m)m.hasOwnProperty(r)&&(u[r]=m[r],s||(s=$.extend({},t)),delete s[r]);if(s&&isEmptyObject(s))return;l?(l=0===l?new Date:new Date(l),n._defaults.minDate=l,n._defaults.minDateTime=l):o?(o=0===o?new Date:new Date(o),n._defaults.maxDate=o,n._defaults.maxDateTime=o):c&&(n._defaults.onSelect=c)}return void 0===i?this._base_optionDatepicker.call($.datepicker,e,t):this._base_optionDatepicker.call($.datepicker,e,s||t,i)};var isEmptyObject=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0},extendRemove=function(e,t){$.extend(e,t);for(var i in t)(null===t[i]||void 0===t[i])&&(e[i]=t[i]);return e},detectSupport=function(e){var t=e.replace(/'.*?'/g,"").toLowerCase(),i=function(e,t){return-1!==e.indexOf(t)?!0:!1};return{hour:i(t,"h"),minute:i(t,"m"),second:i(t,"s"),millisec:i(t,"l"),microsec:i(t,"c"),timezone:i(t,"z"),ampm:i(t,"t")&&i(e,"h"),iso8601:i(e,"Z")}},convert24to12=function(e){return e%=12,0===e&&(e=12),e+""},computeEffectiveSetting=function(e,t){return e&&e[t]?e[t]:$.timepicker._defaults[t]},splitDateTime=function(e,t){var i=computeEffectiveSetting(t,"separator"),s=computeEffectiveSetting(t,"timeFormat"),a=s.split(i),n=a.length,r=e.split(i),l=r.length;return l>1?{dateString:r.splice(0,l-n).join(i),timeString:r.splice(0,n).join(i)}:{dateString:e,timeString:""}},parseDateTimeInternal=function(e,t,i,s,a){var n,r,l;if(r=splitDateTime(i,a),n=$.datepicker._base_parseDate(e,r.dateString,s),""===r.timeString)return{date:n};if(l=$.datepicker.parseTime(t,r.timeString,a),!l)throw"Wrong time format";return{date:n,timeObj:l}},selectLocalTimezone=function(e,t){if(e&&e.timezone_select){var i=t||new Date;e.timezone_select.val(-i.getTimezoneOffset())}};$.timepicker=new Timepicker,$.timepicker.timezoneOffsetString=function(e,t){if(isNaN(e)||e>840||-720>e)return e;var i=e,s=i%60,a=(i-s)/60,n=t?":":"",r=(i>=0?"+":"-")+("0"+Math.abs(a)).slice(-2)+n+("0"+Math.abs(s)).slice(-2);return"+00:00"===r?"Z":r},$.timepicker.timezoneOffsetNumber=function(e){var t=(""+e).replace(":","");return"Z"===t.toUpperCase()?0:/^(\-|\+)\d{4}$/.test(t)?("-"===t.substr(0,1)?-1:1)*(60*parseInt(t.substr(1,2),10)+parseInt(t.substr(3,2),10)):e},$.timepicker.timezoneAdjust=function(e,t){var i=$.timepicker.timezoneOffsetNumber(t);return isNaN(i)||e.setMinutes(e.getMinutes()+-e.getTimezoneOffset()-i),e},$.timepicker.timeRange=function(e,t,i){return $.timepicker.handleRange("timepicker",e,t,i)},$.timepicker.datetimeRange=function(e,t,i){$.timepicker.handleRange("datetimepicker",e,t,i)},$.timepicker.dateRange=function(e,t,i){$.timepicker.handleRange("datepicker",e,t,i)},$.timepicker.handleRange=function(e,t,i,s){function a(a,n){var r=t[e]("getDate"),l=i[e]("getDate"),o=a[e]("getDate");if(null!==r){var c=new Date(r.getTime()),u=new Date(r.getTime());c.setMilliseconds(c.getMilliseconds()+s.minInterval),u.setMilliseconds(u.getMilliseconds()+s.maxInterval),s.minInterval>0&&c>l?i[e]("setDate",c):s.maxInterval>0&&l>u?i[e]("setDate",u):r>l&&n[e]("setDate",o)}}function n(t,i,a){if(t.val()){var n=t[e].call(t,"getDate");null!==n&&s.minInterval>0&&("minDate"===a&&n.setMilliseconds(n.getMilliseconds()+s.minInterval),"maxDate"===a&&n.setMilliseconds(n.getMilliseconds()-s.minInterval)),n.getTime&&i[e].call(i,"option",a,n)}}return s=$.extend({},{minInterval:0,maxInterval:0,start:{},end:{}},s),$.fn[e].call(t,$.extend({onClose:function(){a($(this),i)},onSelect:function(){n($(this),i,"minDate")}},s,s.start)),$.fn[e].call(i,$.extend({onClose:function(){a($(this),t)},onSelect:function(){n($(this),t,"maxDate")}},s,s.end)),a(t,i),n(t,i,"minDate"),n(i,t,"maxDate"),$([t.get(0),i.get(0)])},$.timepicker.log=function(e){window.console&&window.console.log(e)},$.timepicker._util={_extendRemove:extendRemove,_isEmptyObject:isEmptyObject,_convert24to12:convert24to12,_detectSupport:detectSupport,_selectLocalTimezone:selectLocalTimezone,_computeEffectiveSetting:computeEffectiveSetting,_splitDateTime:splitDateTime,_parseDateTimeInternal:parseDateTimeInternal},Date.prototype.getMicroseconds||(Date.prototype.microseconds=0,Date.prototype.getMicroseconds=function(){return this.microseconds},Date.prototype.setMicroseconds=function(e){return this.setMilliseconds(this.getMilliseconds()+Math.floor(e/1e3)),this.microseconds=e%1e3,this}),$.timepicker.version="1.4"}})(jQuery);
\ No newline at end of file