2011-07-29 18:48:43 +00:00
|
|
|
// vim: et:ts=4:sw=4:sts=4:ft=javascript
|
2011-11-05 16:46:53 +00:00
|
|
|
'use strict';
|
2011-05-16 10:49:48 +00:00
|
|
|
/*@
|
|
|
|
Ox.DateInput <f:Ox.Element> DateInput Element
|
|
|
|
() -> <f> DateInput Element
|
|
|
|
(options) -> <f> DateInput Element
|
|
|
|
(options, self) -> <f> DateInput Element
|
|
|
|
options <o> Options object
|
|
|
|
format <s|short> format can be short, medium, long
|
2011-09-08 08:16:31 +00:00
|
|
|
value <d> date value, defaults to current date
|
2011-05-16 10:49:48 +00:00
|
|
|
weekday <b|false> weekday
|
2011-09-08 08:16:31 +00:00
|
|
|
width <o> width of individual input elements, in px
|
|
|
|
day <n> width of day input element
|
|
|
|
month <n> width of month input element
|
|
|
|
weekday <n> width of weekday input element
|
|
|
|
year <n> width of year input element
|
2011-05-16 10:49:48 +00:00
|
|
|
self <o> Shared private variable
|
2011-11-03 15:42:41 +00:00
|
|
|
change <!> triggered on change of value
|
2011-05-16 10:49:48 +00:00
|
|
|
@*/
|
|
|
|
Ox.DateInput = function(options, self) {
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-06-19 17:48:32 +00:00
|
|
|
var that;
|
2011-09-08 08:16:31 +00:00
|
|
|
self = Ox.extend(self || {}, {
|
|
|
|
options: Ox.extend({
|
2011-04-22 22:03:10 +00:00
|
|
|
format: 'short',
|
|
|
|
value: Ox.formatDate(new Date(), '%F'),
|
|
|
|
weekday: false,
|
|
|
|
width: {
|
|
|
|
day: 32,
|
|
|
|
month: options.format == 'long' ? 80 : (options.format == 'medium' ? 40 : 32),
|
|
|
|
weekday: options.format == 'long' ? 80 : 40,
|
|
|
|
year: 48
|
|
|
|
}
|
|
|
|
}, options)
|
2011-06-19 17:48:32 +00:00
|
|
|
});
|
2011-04-22 22:03:10 +00:00
|
|
|
|
2011-09-08 08:16:31 +00:00
|
|
|
Ox.extend(self, {
|
2011-04-22 22:03:10 +00:00
|
|
|
date: new Date(self.options.value.replace(/-/g, '/')),
|
|
|
|
formats: {
|
|
|
|
day: '%d',
|
|
|
|
month: self.options.format == 'short' ? '%m' :
|
|
|
|
(self.options.format == 'medium' ? '%b' : '%B'),
|
|
|
|
weekday: self.options.format == 'long' ? '%A' : '%a',
|
|
|
|
year: '%Y'
|
|
|
|
},
|
2011-09-17 18:36:09 +00:00
|
|
|
months: self.options.format == 'long' ? Ox.MONTHS : Ox.SHORT_MONTHS,
|
|
|
|
weekdays: self.options.format == 'long' ? Ox.WEEKDAYS : Ox.SHORT_WEEKDAYS
|
2011-04-22 22:03:10 +00:00
|
|
|
});
|
|
|
|
|
2011-09-17 18:36:09 +00:00
|
|
|
self.$input = Ox.extend(self.options.weekday ? {
|
2011-06-19 17:48:32 +00:00
|
|
|
weekday: Ox.Input({
|
2011-04-22 22:03:10 +00:00
|
|
|
autocomplete: self.weekdays,
|
|
|
|
autocompleteReplace: true,
|
|
|
|
autocompleteReplaceCorrect: true,
|
|
|
|
id: 'weekday',
|
|
|
|
value: Ox.formatDate(self.date, self.formats.weekday),
|
|
|
|
width: self.options.width.weekday
|
|
|
|
})
|
|
|
|
.bindEvent('autocomplete', changeWeekday),
|
|
|
|
} : {}, {
|
2011-06-19 17:48:32 +00:00
|
|
|
day: Ox.Input({
|
2011-09-08 08:16:31 +00:00
|
|
|
autocomplete: Ox.range(1, Ox.getDaysInMonth(
|
2011-04-22 22:03:10 +00:00
|
|
|
parseInt(Ox.formatDate(self.date, '%Y'), 10),
|
|
|
|
parseInt(Ox.formatDate(self.date, '%m'), 10)
|
2011-09-08 08:16:31 +00:00
|
|
|
) + 1).map(function(i) {
|
|
|
|
return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString();
|
2011-04-22 22:03:10 +00:00
|
|
|
}),
|
|
|
|
autocompleteReplace: true,
|
|
|
|
autocompleteReplaceCorrect: true,
|
|
|
|
id: 'day',
|
|
|
|
value: Ox.formatDate(self.date, self.formats.day),
|
|
|
|
textAlign: 'right',
|
|
|
|
width: self.options.width.day
|
|
|
|
})
|
|
|
|
.bindEvent('autocomplete', changeDay),
|
2011-06-19 17:48:32 +00:00
|
|
|
month: Ox.Input({
|
2011-09-17 18:36:09 +00:00
|
|
|
autocomplete: self.options.format == 'short' ? Ox.range(1, 13).map(function(i) {
|
|
|
|
return Ox.pad(i, 2);
|
2011-04-22 22:03:10 +00:00
|
|
|
}) : self.months,
|
|
|
|
autocompleteReplace: true,
|
|
|
|
autocompleteReplaceCorrect: true,
|
|
|
|
id: 'month',
|
|
|
|
value: Ox.formatDate(self.date, self.formats.month),
|
|
|
|
textAlign: self.options.format == 'short' ? 'right' : 'left',
|
|
|
|
width: self.options.width.month
|
|
|
|
})
|
|
|
|
.bindEvent('autocomplete', changeMonthOrYear),
|
2011-06-19 17:48:32 +00:00
|
|
|
year: Ox.Input({
|
2011-09-17 18:36:09 +00:00
|
|
|
autocomplete: Ox.merge(Ox.range(1900, 3000), Ox.range(1000, 1900)).map(function(i) {
|
|
|
|
return i.toString();
|
2011-04-22 22:03:10 +00:00
|
|
|
}),
|
|
|
|
autocompleteReplace: true,
|
|
|
|
autocompleteReplaceCorrect: true,
|
|
|
|
id: 'year',
|
|
|
|
value: Ox.formatDate(self.date, self.formats.year),
|
|
|
|
textAlign: 'right',
|
|
|
|
width: self.options.width.year
|
|
|
|
})
|
|
|
|
.bindEvent('autocomplete', changeMonthOrYear)
|
|
|
|
});
|
|
|
|
|
2011-09-08 08:16:31 +00:00
|
|
|
that = Ox.InputGroup(Ox.extend(self.options, {
|
2011-04-22 22:03:10 +00:00
|
|
|
id: self.options.id,
|
2011-09-08 08:16:31 +00:00
|
|
|
inputs: Ox.merge(self.options.weekday ? [
|
2011-04-22 22:03:10 +00:00
|
|
|
self.$input.weekday
|
|
|
|
] : [], self.options.format == 'short' ? [
|
|
|
|
self.$input.year, self.$input.month, self.$input.day
|
|
|
|
] : [
|
|
|
|
self.$input.month, self.$input.day, self.$input.year
|
|
|
|
]),
|
2011-11-10 13:55:33 +00:00
|
|
|
joinValues: function(values) {
|
|
|
|
setValue();
|
|
|
|
return self.options.value;
|
|
|
|
},
|
2011-09-08 08:16:31 +00:00
|
|
|
separators: Ox.merge(self.options.weekday ? [
|
2011-04-22 22:03:10 +00:00
|
|
|
{title: self.options.format == 'short' ? '' : ',', width: 8},
|
|
|
|
] : [], self.options.format == 'short' ? [
|
|
|
|
{title: '-', width: 8}, {title: '-', width: 8}
|
|
|
|
] : [
|
|
|
|
{title: '', width: 8}, {title: ',', width: 8}
|
|
|
|
]),
|
|
|
|
width: 0
|
|
|
|
}), self);
|
|
|
|
|
2011-11-04 15:54:28 +00:00
|
|
|
//Ox.Log('Form', 'SELF', self)
|
2011-04-22 22:03:10 +00:00
|
|
|
|
|
|
|
function changeDay() {
|
|
|
|
self.options.weekday && self.$input.weekday.options({
|
|
|
|
value: Ox.formatDate(new Date([
|
|
|
|
self.$input.month.options('value'),
|
|
|
|
self.$input.day.options('value'),
|
|
|
|
self.$input.year.options('value')
|
|
|
|
].join(' ')), self.formats.weekday)
|
|
|
|
});
|
|
|
|
setValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
function changeMonthOrYear() {
|
|
|
|
var day = self.$input.day.options('value'),
|
|
|
|
month = self.$input.month.options('value'),
|
|
|
|
year = self.$input.year.options('value'),
|
|
|
|
days = Ox.getDaysInMonth(year, self.options.format == 'short' ? parseInt(month, 10) : month);
|
|
|
|
day = day <= days ? day : days;
|
2011-11-04 15:54:28 +00:00
|
|
|
//Ox.Log('Form', year, month, 'day days', day, days)
|
2011-04-22 22:03:10 +00:00
|
|
|
self.options.weekday && self.$input.weekday.options({
|
|
|
|
value: Ox.formatDate(new Date([month, day, year].join(' ')), self.formats.weekday)
|
|
|
|
});
|
|
|
|
self.$input.day.options({
|
2011-09-17 18:36:09 +00:00
|
|
|
autocomplete: Ox.range(1, days + 1).map(function(i) {
|
|
|
|
return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString();
|
2011-04-22 22:03:10 +00:00
|
|
|
}),
|
|
|
|
value: self.options.format == 'short' ? Ox.pad(day, 2) : day.toString()
|
|
|
|
});
|
|
|
|
setValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
function changeWeekday() {
|
|
|
|
var date = getDateInWeek(
|
|
|
|
self.$input.weekday.options('value'),
|
|
|
|
self.$input.month.options('value'),
|
|
|
|
self.$input.day.options('value'),
|
|
|
|
self.$input.year.options('value')
|
|
|
|
);
|
|
|
|
self.$input.month.options({value: date.month});
|
|
|
|
self.$input.day.options({
|
2011-09-17 18:36:09 +00:00
|
|
|
autocomplete: Ox.range(1, Ox.getDaysInMonth(date.year, date.month) + 1).map(function(i) {
|
|
|
|
return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString();
|
2011-04-22 22:03:10 +00:00
|
|
|
}),
|
|
|
|
value: date.day
|
|
|
|
});
|
|
|
|
self.$input.year.options({value: date.year});
|
|
|
|
setValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
function getDateInWeek(weekday, month, day, year) {
|
2011-11-04 15:54:28 +00:00
|
|
|
//Ox.Log('Form', [month, day, year].join(' '))
|
2011-04-22 22:03:10 +00:00
|
|
|
var date = new Date([month, day, year].join(' '));
|
|
|
|
date = Ox.getDateInWeek(date, weekday);
|
|
|
|
return {
|
|
|
|
day: Ox.formatDate(date, self.formats.day),
|
|
|
|
month: Ox.formatDate(date, self.formats.month),
|
|
|
|
year: Ox.formatDate(date, self.formats.year)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function setValue() {
|
|
|
|
self.options.value = Ox.formatDate(new Date(self.options.format == 'short' ? [
|
|
|
|
self.$input.year.options('value'),
|
|
|
|
self.$input.month.options('value'),
|
|
|
|
self.$input.day.options('value')
|
|
|
|
].join('/') : [
|
|
|
|
self.$input.month.options('value'),
|
|
|
|
self.$input.day.options('value'),
|
|
|
|
self.$input.year.options('value')
|
|
|
|
].join(' ')), '%F');
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
function normalize() {
|
|
|
|
var year = that.getInputById('year').options('value'),
|
|
|
|
month = that.getInputById('month').options('value'),
|
|
|
|
day = that.getInputById('day').options('value')
|
|
|
|
return {
|
|
|
|
year: year,
|
|
|
|
month: self.options.format == 'short' ? month :
|
|
|
|
Ox.pad((format == 'medium' ? Ox.WEEKDAYS.map(function(v, i) {
|
|
|
|
return v.substr(0, 3);
|
|
|
|
}) : Ox.WEEKDAYS).indexOf(month), 2),
|
|
|
|
day: Ox.pad(day, 2)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
that.serialize = function() {
|
|
|
|
var normal = normalize();
|
|
|
|
return [normal.year, normal.month, normal.day].join('-');
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
return that;
|
|
|
|
|
|
|
|
};
|