forked from kbwood/calendars
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.calendars.ethiopian.js
138 lines (124 loc) · 5.88 KB
/
jquery.calendars.ethiopian.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* http://keith-wood.name/calendars.html
Ethiopian calendar for jQuery v1.2.1.
Written by Keith Wood (kbwood{at}iinet.com.au) February 2010.
Available under the MIT (https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt) license.
Please attribute the author if you use it. */
(function($) { // Hide scope, no $ conflict
/* Implementation of the Ethiopian calendar.
See http://en.wikipedia.org/wiki/Ethiopian_calendar.
See also Calendrical Calculations: The Millennium Edition
(http://emr.cs.iit.edu/home/reingold/calendar-book/index.shtml).
@param language (string) the language code (default English) for localisation (optional) */
function EthiopianCalendar(language) {
this.local = this.regional[language || ''] || this.regional[''];
}
EthiopianCalendar.prototype = new $.calendars.baseCalendar;
$.extend(EthiopianCalendar.prototype, {
name: 'Ethiopian', // The calendar name
jdEpoch: 1724220.5, // Julian date of start of Ethiopian epoch: 27 August 8 CE (Gregorian)
daysPerMonth: [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 5], // Days per month in a common year
hasYearZero: false, // True if has a year zero, false if not
minMonth: 1, // The minimum month number
firstMonth: 1, // The first month in the year
minDay: 1, // The minimum day number
regional: { // Localisations
'': {
name: 'Ethiopian', // The calendar name
epochs: ['BEE', 'EE'],
monthNames: ['Meskerem', 'Tikemet', 'Hidar', 'Tahesas', 'Tir', 'Yekatit',
'Megabit', 'Miazia', 'Genbot', 'Sene', 'Hamle', 'Nehase', 'Pagume'],
monthNamesShort: ['Mes', 'Tik', 'Hid', 'Tah', 'Tir', 'Yek',
'Meg', 'Mia', 'Gen', 'Sen', 'Ham', 'Neh', 'Pag'],
dayNames: ['Ehud', 'Segno', 'Maksegno', 'Irob', 'Hamus', 'Arb', 'Kidame'],
dayNamesShort: ['Ehu', 'Seg', 'Mak', 'Iro', 'Ham', 'Arb', 'Kid'],
dayNamesMin: ['Eh', 'Se', 'Ma', 'Ir', 'Ha', 'Ar', 'Ki'],
dateFormat: 'dd/mm/yyyy', // See format options on BaseCalendar.formatDate
firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
isRTL: false // True if right-to-left language, false if left-to-right
}
},
/* Determine whether this date is in a leap year.
@param year (CDate) the date to examine or
(number) the year to examine
@return (boolean) true if this is a leap year, false if not
@throws error if an invalid year or a different calendar used */
leapYear: function(year) {
var date = this._validate(year, this.minMonth, this.minDay, $.calendars.local.invalidYear);
var year = date.year() + (date.year() < 0 ? 1 : 0); // No year zero
return year % 4 == 3 || year % 4 == -1;
},
/* Retrieve the number of months in a year.
@param year (CDate) the date to examine or
(number) the year to examine
@return (number) the number of months
@throws error if an invalid year or a different calendar used */
monthsInYear: function(year) {
this._validate(year, this.minMonth, this.minDay,
$.calendars.local.invalidYear || $.calendars.regional[''].invalidYear);
return 13;
},
/* Determine the week of the year for a date.
@param year (CDate) the date to examine or
(number) the year to examine
@param month (number) the month to examine
@param day (number) the day to examine
@return (number) the week of the year
@throws error if an invalid date or a different calendar used */
weekOfYear: function(year, month, day) {
// Find Sunday of this week starting on Sunday
var checkDate = this.newDate(year, month, day);
checkDate.add(-checkDate.dayOfWeek(), 'd');
return Math.floor((checkDate.dayOfYear() - 1) / 7) + 1;
},
/* Retrieve the number of days in a month.
@param year (CDate) the date to examine or
(number) the year of the month
@param month (number) the month
@return (number) the number of days in this month
@throws error if an invalid month/year or a different calendar used */
daysInMonth: function(year, month) {
var date = this._validate(year, month, this.minDay, $.calendars.local.invalidMonth);
return this.daysPerMonth[date.month() - 1] +
(date.month() == 13 && this.leapYear(date.year()) ? 1 : 0);
},
/* Determine whether this date is a week day.
@param year (CDate) the date to examine or
(number) the year to examine
@param month (number) the month to examine
@param day (number) the day to examine
@return (boolean) true if a week day, false if not
@throws error if an invalid date or a different calendar used */
weekDay: function(year, month, day) {
return (this.dayOfWeek(year, month, day) || 7) < 6;
},
/* Retrieve the Julian date equivalent for this date,
i.e. days since January 1, 4713 BCE Greenwich noon.
@param year (CDate) the date to convert or
(number) the year to convert
@param month (number) the month to convert
@param day (number) the day to convert
@return (number) the equivalent Julian date
@throws error if an invalid date or a different calendar used */
toJD: function(year, month, day) {
var date = this._validate(year, month, day, $.calendars.local.invalidDate);
year = date.year();
if (year < 0) { year++; } // No year zero
return date.day() + (date.month() - 1) * 30 +
(year - 1) * 365 + Math.floor(year / 4) + this.jdEpoch - 1;
},
/* Create a new date from a Julian date.
@param jd (number) the Julian date to convert
@return (CDate) the equivalent date */
fromJD: function(jd) {
var c = Math.floor(jd) + 0.5 - this.jdEpoch;
var year = Math.floor((c - Math.floor((c + 366) / 1461)) / 365) + 1;
if (year <= 0) { year--; } // No year zero
c = Math.floor(jd) + 0.5 - this.newDate(year, 1, 1).toJD();
var month = Math.floor(c / 30) + 1;
var day = c - (month - 1) * 30 + 1;
return this.newDate(year, month, day);
}
});
// Ethiopian calendar implementation
$.calendars.calendars.ethiopian = EthiopianCalendar;
})(jQuery);