//util.datetime
(function ($, undefined) {
var ms = $.mobiscroll;
ms.datetime = {
defaults: {
shortyearcutoff: '+10',
monthnames: ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'],
monthnamesshort: ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],
daynames: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'],
daynamesshort: ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
daynamesmin: ['s', 'm', 't', 'w', 't', 'f', 's'],
monthtext: 'month',
amtext: 'am',
pmtext: 'pm',
getyear: function (d) { return d.getfullyear(); },
getmonth: function (d) { return d.getmonth(); },
getday: function (d) { return d.getdate(); },
getdate: function (y, m, d, h, i, s) { return new date(y, m, d, h || 0, i || 0, s || 0); },
getmaxdayofmonth: function (y, m) { return 32 - new date(y, m, 32).getdate(); },
getweeknumber: function (d) {
// copy date so don't modify original
d = new date(d);
d.sethours(0, 0, 0);
// set to nearest thursday: current date + 4 - current day number
// make sunday's day number 7
d.setdate(d.getdate() + 4 - (d.getday() || 7));
// get first day of year
var yearstart = new date(d.getfullyear(), 0, 1);
// calculate full weeks to nearest thursday
return math.ceil((((d - yearstart) / 86400000) + 1) / 7);
}
},
/**
* format a date into a string value with a specified format.
* @param {string} format output format.
* @param {date} date date to format.
* @param {object} [settings={}] settings.
* @return {string} returns the formatted date string.
*/
formatdate: function (format, date, settings) {
if (!date) {
return null;
}
var s = $.extend({}, ms.datetime.defaults, settings),
look = function (m) { // check whether a format character is doubled
var n = 0;
while (i + 1 < format.length && format.charat(i + 1) == m) {
n++;
i++;
}
return n;
},
f1 = function (m, val, len) { // format a number, with leading zero if necessary
var n = '' + val;
if (look(m)) {
while (n.length < len) {
n = '0' + n;
}
}
return n;
},
f2 = function (m, val, s, l) { // format a name, short or long as requested
return (look(m) ? l[val] : s[val]);
},
i,
year,
output = '',
literal = false;
for (i = 0; i < format.length; i++) {
if (literal) {
if (format.charat(i) == "'" && !look("'")) {
literal = false;
} else {
output += format.charat(i);
}
} else {
switch (format.charat(i)) {
case 'd':
output += f1('d', s.getday(date), 2);
break;
case 'd':
output += f2('d', date.getday(), s.daynamesshort, s.daynames);
break;
case 'o':
output += f1('o', (date.gettime() - new date(date.getfullyear(), 0, 0).gettime()) / 86400000, 3);
break;
case 'm':
output += f1('m', s.getmonth(date) + 1, 2);
break;
case 'm':
output += f2('m', s.getmonth(date), s.monthnamesshort, s.monthnames);
break;
case 'y':
year = s.getyear(date);
output += (look('y') ? year : (year % 100 < 10 ? '0' : '') + year % 100);
//output += (look('y') ? date.getfullyear() : (date.getyear() % 100 < 10 ? '0' : '') + date.getyear() % 100);
break;
case 'h':
var h = date.gethours();
output += f1('h', (h > 12 ? (h - 12) : (h === 0 ? 12 : h)), 2);
break;
case 'h':
output += f1('h', date.gethours(), 2);
break;
case 'i':
output += f1('i', date.getminutes(), 2);
break;
case 's':
output += f1('s', date.getseconds(), 2);
break;
case 'a':
output += date.gethours() > 11 ? s.pmtext : s.amtext;
break;
case 'a':
output += date.gethours() > 11 ? s.pmtext.touppercase() : s.amtext.touppercase();
break;
case "'":
if (look("'")) {
output += "'";
} else {
literal = true;
}
break;
default:
output += format.charat(i);
}
}
}
return output;
},
/**
* extract a date from a string value with a specified format.
* @param {string} format input format.
* @param {string} value string to parse.
* @param {object} [settings={}] settings.
* @return {date} returns the extracted date.
*/
parsedate: function (format, value, settings) {
var s = $.extend({}, ms.datetime.defaults, settings),
def = s.defaultvalue || new date();
if (!format || !value) {
return def;
}
// if already a date object
if (value.gettime) {
return value;
}
value = (typeof value == 'object' ? value.tostring() : value + '');
var shortyearcutoff = s.shortyearcutoff,
year = s.getyear(def),
month = s.getmonth(def) + 1,
day = s.getday(def),
doy = -1,
hours = def.gethours(),
minutes = def.getminutes(),
seconds = 0, //def.getseconds(),
ampm = -1,
literal = false, // check whether a format character is doubled
lookahead = function (match) {
var matches = (iformat + 1 < format.length && format.charat(iformat + 1) == match);
if (matches) {
iformat++;
}
return matches;
},
getnumber = function (match) { // extract a number from the string value
lookahead(match);
var size = (match == '@' ? 14 : (match == '!' ? 20 : (match == 'y' ? 4 : (match == 'o' ? 3 : 2)))),
digits = new regexp('^\\d{1,' + size + '}'),
num = value.substr(ivalue).match(digits);
if (!num) {
return 0;
}
ivalue += num[0].length;
return parseint(num[0], 10);
},
getname = function (match, s, l) { // extract a name from the string value and convert to an index
var names = (lookahead(match) ? l : s),
i;
for (i = 0; i < names.length; i++) {
if (value.substr(ivalue, names[i].length).tolowercase() == names[i].tolowercase()) {
ivalue += names[i].length;
return i + 1;
}
}
return 0;
},
checkliteral = function () {
ivalue++;
},
ivalue = 0,
iformat;
for (iformat = 0; iformat < format.length; iformat++) {
if (literal) {
if (format.charat(iformat) == "'" && !lookahead("'")) {
literal = false;
} else {
checkliteral();
}
} else {
switch (format.charat(iformat)) {
case 'd':
day = getnumber('d');
break;
case 'd':
getname('d', s.daynamesshort, s.daynames);
break;
case 'o':
doy = getnumber('o');
break;
case 'm':
month = getnumber('m');
break;
case 'm':
month = getname('m', s.monthnamesshort, s.monthnames);
break;
case 'y':
year = getnumber('y');
break;
case 'h':
hours = getnumber('h');
break;
case 'h':
hours = getnumber('h');
break;
case 'i':
minutes = getnumber('i');
break;
case 's':
seconds = getnumber('s');
break;
case 'a':
ampm = getname('a', [s.amtext, s.pmtext], [s.amtext, s.pmtext]) - 1;
break;
case 'a':
ampm = getname('a', [s.amtext, s.pmtext], [s.amtext, s.pmtext]) - 1;
break;
case "'":
if (lookahead("'")) {
checkliteral();
} else {
literal = true;
}
break;
default:
checkliteral();
}
}
}
if (year < 100) {
year += new date().getfullyear() - new date().getfullyear() % 100 +
(year <= (typeof shortyearcutoff != 'string' ? shortyearcutoff : new date().getfullyear() % 100 + parseint(shortyearcutoff, 10)) ? 0 : -100);
}
if (doy > -1) {
month = 1;
day = doy;
do {
var dim = 32 - new date(year, month - 1, 32).getdate();
if (day <= dim) {
break;
}
month++;
day -= dim;
} while (true);
}
hours = (ampm == -1) ? hours : ((ampm && hours < 12) ? (hours + 12) : (!ampm && hours == 12 ? 0 : hours));
var date = s.getdate(year, month - 1, day, hours, minutes, seconds);
if (s.getyear(date) != year || s.getmonth(date) + 1 != month || s.getday(date) != day) {
return def; // invalid date
}
return date;
}
};
// @deprecated since 2.11.0, backward compatibility code
// ---
ms.formatdate = ms.datetime.formatdate;
ms.parsedate = ms.datetime.parsedate;
// ---
})(jquery);
//datetimebase
(function ($, undefined) {
var ms = $.mobiscroll,
datetime = ms.datetime,
date = new date(),
defaults = {
startyear: date.getfullyear() - 100,
endyear: date.getfullyear() + 9,
separator: ' ',
// localization
dateformat: 'mm/dd/yy',
dateorder: 'mmddy',
timewheels: 'hhiia',
timeformat: 'hh:ii a',
daytext: 'day',
yeartext: 'year',
hourtext: 'hours',
minutetext: 'minutes',
ampmtext: ' ',
sectext: 'seconds',
nowtext: 'now'
},
/**
* @class mobiscroll.datetime
* @extends mobiscroll
* mobiscroll datetime component
*/
preset = function (inst) {
var that = $(this),
html5def = {},
format;
// force format for html5 date inputs (experimental)
if (that.is('input')) {
switch (that.attr('type')) {
case 'date':
format = 'yy-mm-dd';
break;
case 'datetime':
format = 'yy-mm-ddthh:ii:ssz';
break;
case 'datetime-local':
format = 'yy-mm-ddthh:ii:ss';
break;
case 'month':
format = 'yy-mm';
html5def.dateorder = 'mmyy';
break;
case 'time':
format = 'hh:ii:ss';
break;
}
// check for min/max attributes
var min = that.attr('min'),
max = that.attr('max');
if (min) {
html5def.mindate = datetime.parsedate(format, min);
}
if (max) {
html5def.maxdate = datetime.parsedate(format, max);
}
}
// set year-month-day order
var i,
k,
keys,
values,
wg,
start,
end,
hastime,
mins,
maxs,
orig = $.extend({}, inst.settings),
s = $.extend(inst.settings, ms.datetime.defaults, defaults, html5def, orig),
offset = 0,
validvalues = [],
wheels = [],
ord = [],
o = {},
f = { y: getyear, m: getmonth, d: getday, h: gethour, i: getminute, s: getsecond, a: getampm },
invalid = s.invalid,
valid = s.valid,
p = s.preset,
dord = s.dateorder,
tord = s.timewheels,
regen = dord.match(/d/),
ampm = tord.match(/a/i),
hampm = tord.match(/h/),
hformat = p == 'datetime' ? s.dateformat + s.separator + s.timeformat : p == 'time' ? s.timeformat : s.dateformat,
defd = new date(),
steps = s.steps || {},
steph = steps.hour || s.stephour || 1,
stepm = steps.minute || s.stepminute || 1,
steps = steps.second || s.stepsecond || 1,
zerobased = steps.zerobased,
mind = s.mindate || new date(s.startyear, 0, 1),
maxd = s.maxdate || new date(s.endyear, 11, 31, 23, 59, 59),
minh = zerobased ? 0 : mind.gethours() % steph,
minm = zerobased ? 0 : mind.getminutes() % stepm,
mins = zerobased ? 0 : mind.getseconds() % steps,
maxh = getmax(steph, minh, (hampm ? 11 : 23)),
maxm = getmax(stepm, minm, 59),
maxs = getmax(stepm, minm, 59);
format = format || hformat;
if (p.match(/date/i)) {
// determine the order of year, month, day wheels
$.each(['y', 'm', 'd'], function (j, v) {
i = dord.search(new regexp(v, 'i'));
if (i > -1) {
ord.push({ o: i, v: v });
}
});
ord.sort(function (a, b) { return a.o > b.o ? 1 : -1; });
$.each(ord, function (i, v) {
o[v.v] = i;
});
wg = [];
for (k = 0; k < 3; k++) {
if (k == o.y) {
offset++;
values = [];
keys = [];
start = s.getyear(mind);
end = s.getyear(maxd);
for (i = start; i <= end; i++) {
keys.push(i);
values.push((dord.match(/yy/i) ? i : (i + '').substr(2, 2)) + (s.yearsuffix || ''));
}
addwheel(wg, keys, values, s.yeartext);
} else if (k == o.m) {
offset++;
values = [];
keys = [];
for (i = 0; i < 12; i++) {
var str = dord.replace(/[dy]/gi, '').replace(/mm/, (i < 9 ? '0' + (i + 1) : i + 1) + (s.monthsuffix || '')).replace(/m/, i + 1 + (s.monthsuffix || ''));
keys.push(i);
values.push(str.match(/mm/) ? str.replace(/mm/, '' + s.monthnames[i] + '') : str.replace(/m/, '' + s.monthnamesshort[i] + ''));
}
addwheel(wg, keys, values, s.monthtext);
} else if (k == o.d) {
offset++;
values = [];
keys = [];
for (i = 1; i < 32; i++) {
keys.push(i);
values.push((dord.match(/dd/i) && i < 10 ? '0' + i : i) + (s.daysuffix || ''));
}
addwheel(wg, keys, values, s.daytext);
}
}
wheels.push(wg);
}
if (p.match(/time/i)) {
hastime = true;
// determine the order of hours, minutes, seconds wheels
ord = [];
$.each(['h', 'i', 's', 'a'], function (i, v) {
i = tord.search(new regexp(v, 'i'));
if (i > -1) {
ord.push({ o: i, v: v });
}
});
ord.sort(function (a, b) {
return a.o > b.o ? 1 : -1;
});
$.each(ord, function (i, v) {
o[v.v] = offset + i;
});
wg = [];
for (k = offset; k < offset + 4; k++) {
if (k == o.h) {
offset++;
values = [];
keys = [];
for (i = minh; i < (hampm ? 12 : 24); i += steph) {
keys.push(i);
values.push(hampm && i === 0 ? 12 : tord.match(/hh/i) && i < 10 ? '0' + i : i);
}
addwheel(wg, keys, values, s.hourtext);
} else if (k == o.i) {
offset++;
values = [];
keys = [];
for (i = minm; i < 60; i += stepm) {
keys.push(i);
values.push(tord.match(/ii/) && i < 10 ? '0' + i : i);
}
addwheel(wg, keys, values, s.minutetext);
} else if (k == o.s) {
offset++;
values = [];
keys = [];
for (i = mins; i < 60; i += steps) {
keys.push(i);
values.push(tord.match(/ss/) && i < 10 ? '0' + i : i);
}
addwheel(wg, keys, values, s.sectext);
} else if (k == o.a) {
offset++;
var upper = tord.match(/a/);
addwheel(wg, [0, 1], upper ? [s.amtext.touppercase(), s.pmtext.touppercase()] : [s.amtext, s.pmtext], s.ampmtext);
}
}
wheels.push(wg);
}
function get(d, i, def) {
if (o[i] !== undefined) {
return +d[o[i]];
}
if (def !== undefined) {
return def;
}
return f[i](defd);
}
function addwheel(wg, k, v, lbl) {
wg.push({
values: v,
keys: k,
label: lbl
});
}
function step(v, st, min, max) {
return math.min(max, math.floor(v / st) * st + min);
}
function getyear(d) {
return s.getyear(d);
}
function getmonth(d) {
return s.getmonth(d);
}
function getday(d) {
return s.getday(d);
}
function gethour(d) {
var hour = d.gethours();
hour = hampm && hour >= 12 ? hour - 12 : hour;
return step(hour, steph, minh, maxh);
}
function getminute(d) {
return step(d.getminutes(), stepm, minm, maxm);
}
function getsecond(d) {
return step(d.getseconds(), steps, mins, maxs);
}
function getampm(d) {
return ampm && d.gethours() > 11 ? 1 : 0;
}
function getdate(d) {
if (d === null) {
return d;
}
var hour = get(d, 'h', 0);
return s.getdate(get(d, 'y'), get(d, 'm'), get(d, 'd', 1), get(d, 'a', 0) ? hour + 12 : hour, get(d, 'i', 0), get(d, 's', 0));
}
function getmax(step, min, max) {
return math.floor((max - min) / step) * step + min;
}
function getclosestvaliddate(d, dir) {
var next,
prev,
nextvalid = false,
prevvalid = false,
up = 0,
down = 0;
if (isvalid(d)) {
return d;
}
if (d < mind) {
d = mind;
}
if (d > maxd) {
d = maxd;
}
next = d;
prev = d;
if (dir !== 2) {
nextvalid = isvalid(next);
while (!nextvalid && next < maxd) {
next = new date(next.gettime() + 1000 * 60 * 60 * 24);
nextvalid = isvalid(next);
up++;
}
}
if (dir !== 1) {
prevvalid = isvalid(prev);
while (!prevvalid && prev > mind) {
prev = new date(prev.gettime() - 1000 * 60 * 60 * 24);
prevvalid = isvalid(prev);
down++;
}
}
if (dir === 1 && nextvalid) {
return next;
}
if (dir === 2 && prevvalid) {
return prev;
}
return down < up && prevvalid ? prev : next;
}
function isvalid(d) {
if (d < mind) {
return false;
}
if (d > maxd) {
return false;
}
if (isinobj(d, valid)) {
return true;
}
if (isinobj(d, invalid)) {
return false;
}
return true;
}
function isinobj(d, obj) {
var curr,
j,
v;
if (obj) {
for (j = 0; j < obj.length; j++) {
curr = obj[j];
v = curr + '';
if (!curr.start) {
if (curr.gettime) { // exact date
if (d.getfullyear() == curr.getfullyear() && d.getmonth() == curr.getmonth() && d.getdate() == curr.getdate()) {
return true;
}
} else if (!v.match(/w/i)) { // day of month
v = v.split('/');
if (v[1]) {
if ((v[0] - 1) == d.getmonth() && v[1] == d.getdate()) {
return true;
}
} else if (v[0] == d.getdate()) {
return true;
}
} else { // day of week
v = +v.replace('w', '');
if (v == d.getday()) {
return true;
}
}
}
}
}
return false;
}
function validatedates(obj, y, m, first, maxdays, idx, val) {
var j, d, v;
if (obj) {
for (j = 0; j < obj.length; j++) {
d = obj[j];
v = d + '';
if (!d.start) {
if (d.gettime) { // exact date
if (s.getyear(d) == y && s.getmonth(d) == m) {
idx[s.getday(d) - 1] = val;
}
} else if (!v.match(/w/i)) { // day of month
v = v.split('/');
if (v[1]) {
if (v[0] - 1 == m) {
idx[v[1] - 1] = val;
}
} else {
idx[v[0] - 1] = val;
}
} else { // day of week
v = +v.replace('w', '');
for (k = v - first; k < maxdays; k += 7) {
if (k >= 0) {
idx[k] = val;
}
}
}
}
}
}
}
function validatetimes(vobj, i, v, temp, y, m, d, target, valid) {
var dd, ss, str, parts1, parts2, prop1, prop2, v1, v2, j, i1, i2, add, remove, all, hours1, hours2, hours3,
spec = {},
steps = { h: steph, i: stepm, s: steps, a: 1 },
day = s.getdate(y, m, d),
w = ['a', 'h', 'i', 's'];
if (vobj) {
$.each(vobj, function (i, obj) {
if (obj.start) {
obj.apply = false;
dd = obj.d;
ss = dd + '';
str = ss.split('/');
if (dd && ((dd.gettime && y == s.getyear(dd) && m == s.getmonth(dd) && d == s.getday(dd)) || // exact date
(!ss.match(/w/i) && ((str[1] && d == str[1] && m == str[0] - 1) || (!str[1] && d == str[0]))) || // day of month
(ss.match(/w/i) && day.getday() == +ss.replace('w', '')) // day of week
)) {
obj.apply = true;
spec[day] = true; // prevent applying generic rule on day, if specific exists
}
}
});
$.each(vobj, function (x, obj) {
add = 0;
remove = 0;
i1 = 0;
i2 = undefined;
prop1 = true;
prop2 = true;
all = false;
if (obj.start && (obj.apply || (!obj.d && !spec[day]))) {
// define time parts
parts1 = obj.start.split(':');
parts2 = obj.end.split(':');
for (j = 0; j < 3; j++) {
if (parts1[j] === undefined) {
parts1[j] = 0;
}
if (parts2[j] === undefined) {
parts2[j] = 59;
}
parts1[j] = +parts1[j];
parts2[j] = +parts2[j];
}
parts1.unshift(parts1[0] > 11 ? 1 : 0);
parts2.unshift(parts2[0] > 11 ? 1 : 0);
if (hampm) {
if (parts1[1] >= 12) {
parts1[1] = parts1[1] - 12;
}
if (parts2[1] >= 12) {
parts2[1] = parts2[1] - 12;
}
}
// look behind
for (j = 0; j < i; j++) {
if (validvalues[j] !== undefined) {
v1 = step(parts1[j], steps[w[j]], mins[w[j]], maxs[w[j]]);
v2 = step(parts2[j], steps[w[j]], mins[w[j]], maxs[w[j]]);
hours1 = 0;
hours2 = 0;
hours3 = 0;
if (hampm && j == 1) {
hours1 = parts1[0] ? 12 : 0;
hours2 = parts2[0] ? 12 : 0;
hours3 = validvalues[0] ? 12 : 0;
}
if (!prop1) {
v1 = 0;
}
if (!prop2) {
v2 = maxs[w[j]];
}
if ((prop1 || prop2) && (v1 + hours1 < validvalues[j] + hours3 && validvalues[j] + hours3 < v2 + hours2)) {
all = true;
}
if (validvalues[j] != v1) {
prop1 = false;
}
if (validvalues[j] != v2) {
prop2 = false;
}
}
}
// look ahead
if (!valid) {
for (j = i + 1; j < 4; j++) {
if (parts1[j] > 0) {
add = steps[v];
}
if (parts2[j] < maxs[w[j]]) {
remove = steps[v];
}
}
}
if (!all) {
// calculate min and max values
v1 = step(parts1[i], steps[v], mins[v], maxs[v]) + add;
v2 = step(parts2[i], steps[v], mins[v], maxs[v]) - remove;
if (prop1) {
i1 = getvalidindex(target, v1, maxs[v], 0);
}
if (prop2) {
i2 = getvalidindex(target, v2, maxs[v], 1);
}
}
// disable values
if (prop1 || prop2 || all) {
if (valid) {
$('.dw-li', target).slice(i1, i2).addclass('dw-v');
} else {
$('.dw-li', target).slice(i1, i2).removeclass('dw-v');
}
}
}
});
}
}
function getindex(t, v) {
return $('.dw-li', t).index($('.dw-li[data-val="' + v + '"]', t));
}
function getvalidindex(t, v, max, add) {
if (v < 0) {
return 0;
}
if (v > max) {
return $('.dw-li', t).length;
}
return getindex(t, v) + add;
}
function getarray(d) {
var i,
ret = [];
if (d === null || d === undefined) {
return d;
}
for (i in o) {
ret[o[i]] = f[i](d);
}
return ret;
}
function convertranges(arr) {
var i, v, start,
ret = [];
if (arr) {
for (i = 0; i < arr.length; i++) {
v = arr[i];
if (v.start && v.start.gettime) {
start = new date(v.start);
while (start <= v.end) {
ret.push(new date(start.getfullyear(), start.getmonth(), start.getdate()));
start.setdate(start.getdate() + 1);
}
} else {
ret.push(v);
}
}
return ret;
}
return arr;
}
// extended methods
// ---
inst.getval = function (temp) {
return inst._hasvalue || temp ? getdate(inst.getarrayval(temp)) : null;
};
/**
* sets the selected date
*
* @param {date} d date to select.
* @param {boolean} [fill=false] also set the value of the associated input element. default is true.
* @param {number} [time=0] animation time to scroll to the selected date.
* @param {boolean} [temp=false] set temporary value only.
* @param {boolean} [change=fill] trigger change on input element.
*/
inst.setdate = function (d, fill, time, temp, change) {
inst.setarrayval(getarray(d), fill, change, temp, time);
};
/**
* returns the selected date.
*
* @param {boolean} [temp=false] if true, return the currently shown date on the picker, otherwise the last selected one.
* @return {date}
*/
inst.getdate = inst.getval;
// ---
// initializations
// ---
inst.format = hformat;
inst.order = o;
inst.handlers.now = function () { inst.setdate(new date(), false, 0.3, true, true); };
inst.buttons.now = { text: s.nowtext, handler: 'now' };
invalid = convertranges(invalid);
valid = convertranges(valid);
// normalize min and max dates for comparing later (set default values where there are no values from wheels)
mind = getdate(getarray(mind));
maxd = getdate(getarray(maxd));
mins = { y: mind.getfullyear(), m: 0, d: 1, h: minh, i: minm, s: mins, a: 0 };
maxs = { y: maxd.getfullyear(), m: 11, d: 31, h: maxh, i: maxm, s: maxs, a: 1 };
// ---
return {
wheels: wheels,
headertext: s.headertext ? function () {
return datetime.formatdate(hformat, getdate(inst.getarrayval(true)), s);
} : false,
formatresult: function (d) {
return datetime.formatdate(format, getdate(d), s);
},
parsevalue: function (val) {
return getarray(val ? datetime.parsedate(format, val, s) : (s.defaultvalue || new date()));
},
validate: function (dw, i, time, dir) {
var validated = getclosestvaliddate(getdate(inst.getarrayval(true)), dir),
temp = getarray(validated),
y = get(temp, 'y'),
m = get(temp, 'm'),
minprop = true,
maxprop = true;
$.each(['y', 'm', 'd', 'a', 'h', 'i', 's'], function (x, i) {
if (o[i] !== undefined) {
var min = mins[i],
max = maxs[i],
maxdays = 31,
val = get(temp, i),
t = $('.dw-ul', dw).eq(o[i]);
if (i == 'd') {
maxdays = s.getmaxdayofmonth(y, m);
max = maxdays;
if (regen) {
$('.dw-li', t).each(function () {
var that = $(this),
d = that.data('val'),
w = s.getdate(y, m, d).getday(),
str = dord.replace(/[my]/gi, '').replace(/dd/, (d < 10 ? '0' + d : d) + (s.daysuffix || '')).replace(/d/, d + (s.daysuffix || ''));
$('.dw-i', that).html(str.match(/dd/) ? str.replace(/dd/, '' + s.daynames[w] + '') : str.replace(/d/, '' + s.daynamesshort[w] + ''));
});
}
}
if (minprop && mind) {
min = f[i](mind);
}
if (maxprop && maxd) {
max = f[i](maxd);
}
if (i != 'y') {
var i1 = getindex(t, min),
i2 = getindex(t, max);
$('.dw-li', t).removeclass('dw-v').slice(i1, i2 + 1).addclass('dw-v');
if (i == 'd') { // hide days not in month
$('.dw-li', t).removeclass('dw-h').slice(maxdays).addclass('dw-h');
}
}
if (val < min) {
val = min;
}
if (val > max) {
val = max;
}
if (minprop) {
minprop = val == min;
}
if (maxprop) {
maxprop = val == max;
}
// disable some days
if (i == 'd') {
var first = s.getdate(y, m, 1).getday(),
idx = {};
// set invalid indexes
validatedates(invalid, y, m, first, maxdays, idx, 1);
// delete indexes which are valid
validatedates(valid, y, m, first, maxdays, idx, 0);
$.each(idx, function (i, v) {
if (v) {
$('.dw-li', t).eq(i).removeclass('dw-v');
}
});
}
}
});
// invalid times
if (hastime) {
$.each(['a', 'h', 'i', 's'], function (i, v) {
var val = get(temp, v),
d = get(temp, 'd'),
t = $('.dw-ul', dw).eq(o[v]);
if (o[v] !== undefined) {
validatetimes(invalid, i, v, temp, y, m, d, t, 0);
validatetimes(valid, i, v, temp, y, m, d, t, 1);
// get valid value
validvalues[i] = +inst.getvalidcell(val, t, dir).val;
}
});
}
inst._tempwheelarray = temp;
}
};
};
$.each(['date', 'time', 'datetime'], function (i, v) {
ms.presets.scroller[v] = preset;
});
})(jquery);
//datetime
(function ($) {
$.each(['date', 'time', 'datetime'], function (i, v) {
$.mobiscroll.presetshort(v);
});
})(jquery);