1 /* 2 * CopticDate.js - Represent a date in the Coptic calendar 3 * 4 * Copyright © 2015, 2018, JEDLSoft 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 var ilib = require("./ilib.js"); 21 var MathUtils = require("./MathUtils.js"); 22 23 var Locale = require("./Locale.js"); 24 var IDate = require("./IDate.js"); 25 26 var EthiopicDate = require("./EthiopicDate.js"); 27 var CopticCal = require("./CopticCal.js"); 28 var CopticRataDie = require("./CopticRataDie.js"); 29 30 /** 31 * @class 32 * Construct a new date object for the Coptic Calendar. The constructor can be called 33 * with a parameter object that contains any of the following properties: 34 * 35 * <ul> 36 * <li><i>unixtime<i> - sets the time of this instance according to the given 37 * unix time. Unix time is the number of milliseconds since midnight on Jan 1, 1970 (Gregorian). 38 * <li><i>julianday</i> - the Julian Day to set into this date 39 * <li><i>year</i> - any integer 40 * <li><i>month</i> - 1 to 13, where 1 means Thoout, 2 means Paope, etc., and 13 means Epagomene 41 * <li><i>day</i> - 1 to 30 42 * <li><i>hour</i> - 0 to 23. A formatter is used to display 12 hour clocks, but this representation 43 * is always done with an unambiguous 24 hour representation 44 * <li><i>minute</i> - 0 to 59 45 * <li><i>second</i> - 0 to 59 46 * <li><i>millisecond<i> - 0 to 999 47 * <li><i>locale</i> - the TimeZone instance or time zone name as a string 48 * of this coptic date. The date/time is kept in the local time. The time zone 49 * is used later if this date is formatted according to a different time zone and 50 * the difference has to be calculated, or when the date format has a time zone 51 * component in it. 52 * <li><i>timezone</i> - the time zone of this instance. If the time zone is not 53 * given, it can be inferred from this locale. For locales that span multiple 54 * time zones, the one with the largest population is chosen as the one that 55 * represents the locale. 56 * 57 * <li><i>date</i> - use the given intrinsic Javascript date to initialize this one. 58 * </ul> 59 * 60 * If called with another Coptic date argument, the date components of the given 61 * date are copied into the current one.<p> 62 * 63 * If the constructor is called with no arguments at all or if none of the 64 * properties listed above 65 * from <i>unixtime</i> through <i>millisecond</i> are present, then the date 66 * components are 67 * filled in with the current date at the time of instantiation. Note that if 68 * you do not give the time zone when defaulting to the current time and the 69 * time zone for all of ilib was not set with <i>ilib.setTimeZone()</i>, then the 70 * time zone will default to UTC ("Universal Time, Coordinated" or "Greenwich 71 * Mean Time").<p> 72 * 73 * 74 * @constructor 75 * @extends EthiopicDate 76 * @param {Object=} params parameters that govern the settings and behaviour of this Coptic date 77 */ 78 var CopticDate = function(params) { 79 this.rd = NaN; // clear these out so that the EthiopicDate constructor can set it 80 var newparams = ilib.extend({}, params); 81 newparams.onLoad = function(ed) { 82 ed.cal = new CopticCal(); 83 if (typeof(params.onLoad) === "function") { 84 params.onLoad(ed); 85 } 86 }; 87 EthiopicDate.call(this, params); 88 }; 89 90 CopticDate.prototype = new EthiopicDate({noinstance: true}); 91 CopticDate.prototype.parent = EthiopicDate.prototype; 92 CopticDate.prototype.constructor = CopticDate; 93 94 /** 95 * Return a new RD for this date type using the given params. 96 * @protected 97 * @param {Object=} params the parameters used to create this rata die instance 98 * @returns {RataDie} the new RD instance for the given params 99 */ 100 CopticDate.prototype.newRd = function (params) { 101 return new CopticRataDie(params); 102 }; 103 104 /** 105 * Return the day of the week of this date. The day of the week is encoded 106 * as number from 0 to 6, with 0=Sunday, 1=Monday, etc., until 6=Saturday. 107 * 108 * @return {number} the day of the week 109 */ 110 CopticDate.prototype.getDayOfWeek = function() { 111 var rd = Math.floor(this.rd.getRataDie() + (this.offset || 0)); 112 return MathUtils.mod(rd-3, 7); 113 }; 114 115 /** 116 * Return the name of the calendar that governs this date. 117 * 118 * @return {string} a string giving the name of the calendar 119 */ 120 CopticDate.prototype.getCalendar = function() { 121 return "coptic"; 122 }; 123 124 //register with the factory method 125 IDate._constructors["coptic"] = CopticDate; 126 127 module.exports = CopticDate; 128