native_date=`Date`days_of_week=%w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday]short_days=%w[Sun Mon Tue Wed Thu Fri Sat]short_months=%w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec]long_months=%w[January Febuary March April May June July August September October November December]classDatedefself.wrap(native)instance=allocate`#{instance}._date = #{native}`instanceenddefself.parse(string)wrap`native_date.parse(string)`enddefself.today%x{
var date = #{new};
date._date = new native_date();
return date;
}enddefinitialize(year,month,day)`#{self}._date = new native_date(year, month - 1, day)`enddef-(date)`Math.round((#{self}._date - #{date}._date) / (1000 * 60 * 60 * 24))`enddef<(other)%x{
var a = #{self}._date, b = #{other}._date;
a.setHours(0, 0, 0, 0);
b.setHours(0, 0, 0, 0);
return a < b;
}enddef<=(other)%x{
var a = #{self}._date, b = #{other}._date;
a.setHours(0, 0, 0, 0);
b.setHours(0, 0, 0, 0);
return a <= b;
}enddef>(other)%x{
var a = #{self}._date, b = #{other}._date;
a.setHours(0, 0, 0, 0);
b.setHours(0, 0, 0, 0);
return a > b;
}enddef>=(other)%x{
var a = #{self}._date, b = #{other}._date;
a.setHours(0, 0, 0, 0);
b.setHours(0, 0, 0, 0);
return a >= b;
}enddef==(other)%x{
var a = #{self}._date, b = #{other}._date;
a.setHours(0, 0, 0, 0);
b.setHours(0, 0, 0, 0);
return (a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate());
}enddefcloneDate.wrap(`new native_date(#{self}._date.getTime())`)enddefday`#{self}._date.getDate()`enddefmonth`#{self}._date.getMonth() + 1`enddefnextres=self.clone`res._date.setDate(#{self}._date.getDate() + 1)`resenddefnext_monthres=self.clone`res._date.add({months: 1})`resenddefprevres=self.clone`res._date.setDate(#{self}._date.getDate() - 1)`resenddefprev_monthres=self.clone`res._date.add({months: -1})`resenddefstrftime(format='')%x{
var d = #{self}._date;
return format.replace(/%(-?.)/g, function(full, m) {
switch (m) {
case 'a': return short_days[d.getDay()];
case 'A': return days_of_week[d.getDay()];
case 'b': return short_months[d.getMonth()];
case 'B': return long_months[d.getMonth()];
case '-d': return d.getDate();
case 'Y': return d.getFullYear();
default: return m ;
}
});
}enddefto_s%x{
var date = #{self}._date;
return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
}enddefto_jsonto_s.to_jsonenddefas_jsonto_senddefwday`#{self}._date.getDay()`enddefyear`#{self}._date.getFullYear()`endend