UNPKG

ilib

Version:

iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

1 lines 6.15 kB
var ilib=require("../index.js"),JSUtils=require("./JSUtils.js"),MathUtils=require("./MathUtils.js"),Locale=require("./Locale.js"),LocaleInfo=require("./LocaleInfo.js"),IDate=require("./IDate.js"),TimeZone=require("./TimeZone.js"),Astro=require("./Astro.js"),HanCal=require("./HanCal.js"),GregorianDate=require("./GregorianDate.js"),HanRataDie=require("./HanRataDie.js"),RataDie=require("./RataDie.js"),HanDate=function(params){(params=params||{}).locale&&(this.locale="string"==typeof params.locale?new Locale(params.locale):params.locale),params.timezone&&(this.timezone=params.timezone),this.timezone?this._init(params):this.locale?new LocaleInfo(this.locale,{sync:params.sync,loadParams:params.loadParams,onLoad:ilib.bind(this,function(li){this.li=li,this.timezone=li.getTimeZone(),this._init(params)})}):(this.timezone="local",this._init(params))};HanDate.prototype=new IDate({noinstance:!0}),HanDate.prototype.parent=IDate,(HanDate.prototype.constructor=HanDate).prototype._init=function(params){new HanCal({sync:!params||"boolean"!=typeof params.sync||params.sync,loadParams:params&&params.loadParams,onLoad:ilib.bind(this,function(cal){this.cal=cal,params.year||params.month||params.day||params.hour||params.minute||params.second||params.millisecond||params.cycle||params.cycleYear?(void 0!==params.cycle?(this.cycle=parseInt(params.cycle,10)||0,cal=(void 0!==params.year?parseInt(params.year,10):parseInt(params.cycleYear,10))||0,this.year=HanCal._getElapsedYear(cal,this.cycle)):void 0!==params.year?(this.year=parseInt(params.year,10)||0,this.cycle=Math.floor((this.year-1)/60)):this.year=this.cycle=0,this.month=parseInt(params.month,10)||1,this.day=parseInt(params.day,10)||1,this.hour=parseInt(params.hour,10)||0,this.minute=parseInt(params.minute,10)||0,this.second=parseInt(params.second,10)||0,this.millisecond=parseInt(params.millisecond,10)||0,this.cycleYear=MathUtils.amod(this.year,60),this.dayOfYear=parseInt(params.dayOfYear,10),"boolean"==typeof params.dst&&(this.dst=params.dst),this.newRd({cal:this.cal,cycle:this.cycle,year:this.year,month:this.month,day:this.day,hour:this.hour,minute:this.minute,second:this.second,millisecond:this.millisecond,sync:params.sync,loadParams:params.loadParams,callback:ilib.bind(this,function(rd){rd?(this.rd=rd,new TimeZone({id:this.timezone,sync:params.sync,loadParams:params.loadParams,onLoad:ilib.bind(this,function(tz){this.tz=tz,this.offset=this.tz._getOffsetMillisWallTime(this)/864e5,0!==this.offset?(this.rd=this.newRd({cal:this.cal,rd:this.rd.getRataDie()-this.offset}),this._calcLeap()):(this.leapMonth=this.rd.leapMonth,this.priorLeapMonth=this.rd.priorLeapMonth,this.leapYear=this.rd.leapYear),this._init2(params)})})):this._init2(params)})})):this._init2(params)})})},HanDate.prototype._init2=function(params){this.rd?params&&"function"==typeof params.onLoad&&params.onLoad(this):this.newRd(JSUtils.merge(params||{},{cal:this.cal,sync:params.sync,loadParams:params.loadParams,callback:ilib.bind(this,function(rd){this.rd=rd,this._calcDateComponents(),params&&"function"==typeof params.onLoad&&params.onLoad(this)})}))},HanDate.prototype.newRd=function(params){return new HanRataDie(params)},HanDate.prototype._calcYear=function(rd){var hanyear=new GregorianDate({rd:rd,timezone:this.timezone}).year+2697,newYears=this.cal.newYears(hanyear);return hanyear-(rd+RataDie.gregorianEpoch<newYears?1:0)},HanDate.prototype._calcLeap=function(){var jd=this.rd.getRataDie()+RataDie.gregorianEpoch,calc=HanCal._leapYearCalc(this.year),m2=HanCal._newMoonOnOrAfter(calc.m1+1),calc=(this.leapYear=12===Math.round((calc.m2-calc.m1)/29.530588853),this.leapYear&&(HanCal._noMajorST(calc.m1)||HanCal._noMajorST(m2))?HanCal._newMoonOnOrAfter(m2+1):m2),m2=HanCal._newMoonBefore(jd+1);this.priorLeapMonth=HanRataDie._priorLeapMonth(calc,HanCal._newMoonBefore(m2)),this.leapMonth=this.leapYear&&HanCal._noMajorST(m2)&&!this.priorLeapMonth},HanDate.prototype._calcDateComponents=function(){var jd=this.rd.getRataDie()+RataDie.gregorianEpoch,gregyear=(void 0===this.offset&&(this.tz||(this.tz=new TimeZone({id:this.timezone})),this.offset=this.tz.getOffsetMillis(this)/864e5),0!==this.offset&&(jd+=this.offset),GregorianDate._calcYear(this.rd.getRataDie())),gregyear=(this.year=gregyear+2697,HanCal._leapYearCalc(this.year)),m2=HanCal._newMoonOnOrAfter(gregyear.m1+1),newYears=(this.leapYear=12===Math.round((gregyear.m2-gregyear.m1)/29.530588853),this.leapYear&&(HanCal._noMajorST(gregyear.m1)||HanCal._noMajorST(m2))?HanCal._newMoonOnOrAfter(m2+1):m2),m2=(jd<newYears&&(this.year--,gregyear=HanCal._leapYearCalc(this.year),m2=HanCal._newMoonOnOrAfter(gregyear.m1+1),this.leapYear=12===Math.round((gregyear.m2-gregyear.m1)/29.530588853),newYears=this.leapYear&&(HanCal._noMajorST(gregyear.m1)||HanCal._noMajorST(m2))?HanCal._newMoonOnOrAfter(m2+1):m2),HanCal._newMoonBefore(jd+1));this.month=Math.round((m2-gregyear.m1)/29.530588853),this.priorLeapMonth=HanRataDie._priorLeapMonth(newYears,HanCal._newMoonBefore(m2)),this.leapMonth=this.leapYear&&HanCal._noMajorST(m2)&&!this.priorLeapMonth,this.cycle=Math.floor((this.year-1)/60),this.cycleYear=MathUtils.amod(this.year,60),this.day=Astro._floorToJD(jd)-m2+1,gregyear=jd-Astro._floorToJD(jd),gregyear=Math.round(864e5*gregyear),this.hour=Math.floor(gregyear/36e5),gregyear-=36e5*this.hour,this.minute=Math.floor(gregyear/6e4),gregyear-=6e4*this.minute,this.second=Math.floor(gregyear/1e3),gregyear-=1e3*this.second,this.millisecond=gregyear},HanDate.prototype.getCycleYears=function(){return this.cycleYear},HanDate.prototype.getCycles=function(){return this.cycle},HanDate.prototype.isLeapYear=function(){return this.leapYear},HanDate.prototype.isLeapMonth=function(){return this.leapMonth},HanDate.prototype.getDayOfWeek=function(){var rd=Math.floor(this.rd.getRataDie()+(this.offset||0));return MathUtils.mod(rd,7)},HanDate.prototype.getDayOfYear=function(){var newYears=this.cal.newYears(this.year);return HanCal._newMoonOnOrAfter(newYears+29*(this.month-1))-newYears+this.day},HanDate.prototype.getEra=function(){return this.year<1?-1:1},HanDate.prototype.getCalendar=function(){return"han"},IDate._constructors.han=HanDate,module.exports=HanDate;