diff options
author | Trent Richardson <trentdrichardson@gmail.com> | 2013-04-24 13:51:36 -0400 |
---|---|---|
committer | Trent Richardson <trentdrichardson@gmail.com> | 2013-04-24 13:51:36 -0400 |
commit | 4a1d2223737d96a5916c9cf5847513dcedd29f17 (patch) | |
tree | a28589093b27c011008e9db207a104f3a5adf150 | |
parent | 9c19b54b9f5ee06c611cb28cfe1fd4bb819b263b (diff) | |
download | jQuery-Timepicker-Addon-4a1d2223737d96a5916c9cf5847513dcedd29f17.zip jQuery-Timepicker-Addon-4a1d2223737d96a5916c9cf5847513dcedd29f17.tar.gz jQuery-Timepicker-Addon-4a1d2223737d96a5916c9cf5847513dcedd29f17.tar.bz2 |
#577 Microseconds added to the timepicker
-rw-r--r-- | index.html | 25 | ||||
-rw-r--r-- | jquery-ui-timepicker-addon.js | 103 |
2 files changed, 112 insertions, 16 deletions
@@ -182,6 +182,9 @@ <dt>millisecText</dt> <dd><em>Default: "Millisecond", A Localization Setting</em> - Label used to identify the millisecond slider.</dd> + <dt>microsecText</dt> + <dd><em>Default: "Microsecond", A Localization Setting</em> - Label used to identify the microsecond slider.</dd> + <dt>timezoneText</dt> <dd><em>Default: "Timezone", A Localization Setting</em> - Label used to identify the timezone slider.</dd> @@ -245,6 +248,9 @@ <dt>showMillisec</dt> <dd><em>Default: null</em> - Whether to show the millisecond control. The default of null will use detection from timeFormat.</dd> + <dt>showMicrosec</dt> + <dd><em>Default: null</em> - Whether to show the microsecond control. The default of null will use detection from timeFormat.</dd> + <dt>showTimezone</dt> <dd><em>Default: null</em> - Whether to show the timezone select.</dd> @@ -260,9 +266,12 @@ <dt>stepSecond</dt> <dd><em>Default: 1</em> - Seconds per step the slider makes.</dd> - <dt>stepMilliSec</dt> + <dt>stepMillisec</dt> <dd><em>Default: 1</em> - Milliseconds per step the slider makes.</dd> + <dt>stepMicrosec</dt> + <dd><em>Default: 1</em> - Microseconds per step the slider makes.</dd> + <dt>hour</dt> <dd><em>Default: 0</em> - Initial hour set.</dd> @@ -275,6 +284,9 @@ <dt>millisec</dt> <dd><em>Default: 0</em> - Initial millisecond set.</dd> + <dt>microsec</dt> + <dd><em>Default: 0</em> - Initial microsecond set. Note: Javascript's native Date object does not natively support microseconds. Timepicker adds ability to simply Date.setMicroseconds(m) and Date.getMicroseconds(). Date comparisons will not acknowledge microseconds. Use this only for display purposes.</dd> + <dt>timezone</dt> <dd><em>Default: 0</em> - Initial timezone set.</dd> @@ -290,6 +302,9 @@ <dt>millisecMin</dt> <dd><em>Default: 0</em> - The minimum millisecond allowed for all dates.</dd> + <dt>microsecMin</dt> + <dd><em>Default: 0</em> - The minimum microsecond allowed for all dates.</dd> + <dt>hourMax</dt> <dd><em>Default: 23</em> - The maximum hour allowed for all dates.</dd> @@ -302,6 +317,9 @@ <dt>millisecMax</dt> <dd><em>Default: 999</em> - The maximum millisecond allowed for all dates.</dd> + <dt>microsecMax</dt> + <dd><em>Default: 999</em> - The maximum microsecond allowed for all dates.</dd> + <dt>hourGrid</dt> <dd><em>Default: 0</em> - When greater than 0 a label grid will be generated under the slider. This number represents the units (in hours) between labels.</dd> @@ -313,6 +331,9 @@ <dt>millisecGrid</dt> <dd><em>Default: 0</em> - When greater than 0 a label grid will be genereated under the slider. This number represents the units (in milliseconds) between labels.</dd> + + <dt>microsecGrid</dt> + <dd><em>Default: 0</em> - When greater than 0 a label grid will be genereated under the slider. This number represents the units (in microseconds) between labels.</dd> </dl> <h3>Other Options</h3> @@ -363,6 +384,7 @@ minute: 10, second: 23, millisec: 45, + microsec: 23, timezone: '-0400' }</pre> </dd> @@ -390,6 +412,7 @@ <dt>s</dt><dd>Second with no leading 0</dd> <dt>ss</dt><dd>Second with leading 0</dd> <dt>l</dt><dd>Milliseconds always with leading 0</dd> + <dt>c</dt><dd>Microseconds always with leading 0</dd> <dt>t</dt><dd>a or p for AM/PM</dd> <dt>T</dt><dd>A or P for AM/PM</dd> <dt>tt</dt><dd>am or pm for AM/PM</dd> diff --git a/jquery-ui-timepicker-addon.js b/jquery-ui-timepicker-addon.js index 598e897..ab6c428 100644 --- a/jquery-ui-timepicker-addon.js +++ b/jquery-ui-timepicker-addon.js @@ -52,6 +52,7 @@ minuteText: 'Minute', secondText: 'Second', millisecText: 'Millisecond', + microsecText: 'Microsecond', timezoneText: 'Time Zone', isRTL: false }; @@ -62,25 +63,30 @@ 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, @@ -88,6 +94,7 @@ minuteGrid: 0, secondGrid: 0, millisecGrid: 0, + microsecGrid: 0, alwaysSetTime: true, separator: ' ', altFieldTimeOnly: true, @@ -117,26 +124,30 @@ 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'], + units: ['hour','minute','second','millisec', 'microsec'], support: {}, control: null, @@ -251,6 +262,8 @@ 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; @@ -547,11 +560,12 @@ 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) { + 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()) { @@ -565,26 +579,36 @@ if (this.second <= this._defaults.secondMin) { this.second = this._defaults.secondMin; this._defaults.millisecMin = minDateTime.getMilliseconds(); - } else { - if (this.millisec < this._defaults.millisecMin) { + if(this.millisec <= this._default.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; } } @@ -592,11 +616,12 @@ 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) { + 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()) { @@ -610,26 +635,36 @@ if (this.second >= this._defaults.secondMax) { this.second = this._defaults.secondMax; this._defaults.millisecMax = maxDateTime.getMilliseconds(); - } else { - if (this.millisec > this._defaults.millisecMax) { - this.millisec = this._defaults.millisecMax; + if (this.millisecond >= this._defaults.millisecondMax) { + this.millisecond = this._defaults.millisecondMax; + 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; } } @@ -638,6 +673,7 @@ 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 }); @@ -655,6 +691,10 @@ 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)); + } } }, @@ -668,6 +708,7 @@ 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, @@ -685,6 +726,9 @@ if (typeof(millisec) == 'object') { millisec = false; } + if (typeof(microsec) == 'object') { + microsec = false; + } if (typeof(timezone) == 'object') { timezone = false; } @@ -701,12 +745,15 @@ 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 + 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)); @@ -724,6 +771,9 @@ if (millisec !== false) { this.millisec = millisec; } + if (microsec !== false) { + this.microsec = microsec; + } if (timezone !== false) { this.timezone = timezone; } @@ -931,7 +981,7 @@ if(unit == 'hour'){ sel += $.datepicker.formatTime($.trim(format.replace(/[^ht ]/ig,'')), {hour:i}, tp_inst._defaults); } - else if(unit == 'millisec' || i >= 10){ sel += i; } + else if(unit == 'millisec' || unit == 'microsec' || i >= 10){ sel += i; } else {sel += '0'+ i.toString(); } sel += '</option>'; } @@ -1022,6 +1072,7 @@ if (parseRes.timeObj) { var t = parseRes.timeObj; parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec); + parseRex.date.setMicroseconds(t.microsec); } return parseRes.date; @@ -1053,12 +1104,13 @@ // 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}|t{1,2}|z|'.*?')/g), + 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 }; @@ -1074,13 +1126,14 @@ }; var regstr = '^' + f.toString() - .replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[lz]|'.*?')/g, function (match) { + .replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[lcz]|'.*?')/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 @@ -1099,7 +1152,8 @@ hour: 0, minute: 0, second: 0, - millisec: 0 + millisec: 0, + microsec: 0 }; if (treg) { @@ -1134,6 +1188,9 @@ 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) { var tz = treg[order.z].toUpperCase(); switch (tz.length) { @@ -1186,6 +1243,7 @@ minute: d.getMinutes(), second: d.getSeconds(), millisec: d.getMilliseconds(), + microsec: d.getMicroseconds(), timezone: $.timepicker.timezoneOffsetString(d.getTimezoneOffset()) }; } @@ -1234,7 +1292,7 @@ ampmName = options.pmNames[0]; } - tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[lz]|('.*?'|".*?"))/g, function(match) { + tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[lcz]|('.*?'|".*?"))/g, function(match) { switch (match) { case 'HH': return ('0' + hour).slice(-2); @@ -1254,6 +1312,8 @@ return time.second; case 'l': return ('00' + time.millisec).slice(-3); + case 'c': + return ('00' + time.microsec).slice(-3); case 'z': return time.timezone === null? options.timezone : time.timezone; case 'T': @@ -1470,6 +1530,7 @@ 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); @@ -1498,6 +1559,7 @@ 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()); } @@ -1558,6 +1620,7 @@ 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 @@ -1731,6 +1794,7 @@ minute: isIn(tf,'m'), second: isIn(tf,'s'), millisec: isIn(tf,'l'), + microsec: isIn(tf,'c'), timezone: isIn(tf,'z'), ampm: isIn('t') && isIn(timeFormat,'h') }; @@ -1803,7 +1867,7 @@ * Internal function to parse datetime interval * Returns: {date: Date, timeObj: Object}, where * date - parsed date without time (type Date) - * timeObj = {hour: , minute: , second: , millisec: } - parsed time. Optional + * timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional */ var parseDateTimeInternal = function(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) { var date; @@ -2015,6 +2079,15 @@ }; /* + * Rough microsecond support + */ + if(!Date.prototype.getMicroseconds){ + Date.microseconds = null; + Date.prototype.getMicroseconds = function(){ return this.microseconds; }; + Date.prototype.setMicroseconds = function(m){ this.microseconds = m; return this; }; + } + + /* * Keep up with the version */ $.timepicker.version = "1.3"; |