summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrent Richardson <trentdrichardson@gmail.com>2013-04-24 13:51:36 -0400
committerTrent Richardson <trentdrichardson@gmail.com>2013-04-24 13:51:36 -0400
commit4a1d2223737d96a5916c9cf5847513dcedd29f17 (patch)
treea28589093b27c011008e9db207a104f3a5adf150
parent9c19b54b9f5ee06c611cb28cfe1fd4bb819b263b (diff)
downloadjQuery-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.html25
-rw-r--r--jquery-ui-timepicker-addon.js103
2 files changed, 112 insertions, 16 deletions
diff --git a/index.html b/index.html
index 067eb75..4de78b9 100644
--- a/index.html
+++ b/index.html
@@ -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";