cleave.js
Version:
JavaScript library for formatting input text content when you are typing
179 lines (144 loc) • 5.38 kB
JavaScript
;
var TimeFormatter = function (timePattern, timeFormat) {
var owner = this;
owner.time = [];
owner.blocks = [];
owner.timePattern = timePattern;
owner.timeFormat = timeFormat;
owner.initBlocks();
};
TimeFormatter.prototype = {
initBlocks: function () {
var owner = this;
owner.timePattern.forEach(function () {
owner.blocks.push(2);
});
},
getISOFormatTime: function () {
var owner = this,
time = owner.time;
return time[2] ? (
owner.addLeadingZero(time[0]) + ':' + owner.addLeadingZero(time[1]) + ':' + owner.addLeadingZero(time[2])
) : '';
},
getBlocks: function () {
return this.blocks;
},
getTimeFormatOptions: function () {
var owner = this;
if (String(owner.timeFormat) === '12') {
return {
maxHourFirstDigit: 1,
maxHours: 12,
maxMinutesFirstDigit: 5,
maxMinutes: 60
};
}
return {
maxHourFirstDigit: 2,
maxHours: 23,
maxMinutesFirstDigit: 5,
maxMinutes: 60
};
},
getValidatedTime: function (value) {
var owner = this, result = '';
value = value.replace(/[^\d]/g, '');
var timeFormatOptions = owner.getTimeFormatOptions();
owner.blocks.forEach(function (length, index) {
if (value.length > 0) {
var sub = value.slice(0, length),
sub0 = sub.slice(0, 1),
rest = value.slice(length);
switch (owner.timePattern[index]) {
case 'h':
if (parseInt(sub0, 10) > timeFormatOptions.maxHourFirstDigit) {
sub = '0' + sub0;
} else if (parseInt(sub, 10) > timeFormatOptions.maxHours) {
sub = timeFormatOptions.maxHours + '';
}
break;
case 'm':
case 's':
if (parseInt(sub0, 10) > timeFormatOptions.maxMinutesFirstDigit) {
sub = '0' + sub0;
} else if (parseInt(sub, 10) > timeFormatOptions.maxMinutes) {
sub = timeFormatOptions.maxMinutes + '';
}
break;
}
result += sub;
// update remaining string
value = rest;
}
});
return this.getFixedTimeString(result);
},
getFixedTimeString: function (value) {
var owner = this, timePattern = owner.timePattern, time = [],
secondIndex = 0, minuteIndex = 0, hourIndex = 0,
secondStartIndex = 0, minuteStartIndex = 0, hourStartIndex = 0,
second, minute, hour;
if (value.length === 6) {
timePattern.forEach(function (type, index) {
switch (type) {
case 's':
secondIndex = index * 2;
break;
case 'm':
minuteIndex = index * 2;
break;
case 'h':
hourIndex = index * 2;
break;
}
});
hourStartIndex = hourIndex;
minuteStartIndex = minuteIndex;
secondStartIndex = secondIndex;
second = parseInt(value.slice(secondStartIndex, secondStartIndex + 2), 10);
minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);
hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);
time = this.getFixedTime(hour, minute, second);
}
if (value.length === 4 && owner.timePattern.indexOf('s') < 0) {
timePattern.forEach(function (type, index) {
switch (type) {
case 'm':
minuteIndex = index * 2;
break;
case 'h':
hourIndex = index * 2;
break;
}
});
hourStartIndex = hourIndex;
minuteStartIndex = minuteIndex;
second = 0;
minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);
hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);
time = this.getFixedTime(hour, minute, second);
}
owner.time = time;
return time.length === 0 ? value : timePattern.reduce(function (previous, current) {
switch (current) {
case 's':
return previous + owner.addLeadingZero(time[2]);
case 'm':
return previous + owner.addLeadingZero(time[1]);
case 'h':
return previous + owner.addLeadingZero(time[0]);
}
}, '');
},
getFixedTime: function (hour, minute, second) {
second = Math.min(parseInt(second || 0, 10), 60);
minute = Math.min(minute, 60);
hour = Math.min(hour, 60);
return [hour, minute, second];
},
addLeadingZero: function (number) {
return (number < 10 ? '0' : '') + number;
}
};
module.exports = TimeFormatter;