/*



* This script was adapted from C sources written by



* Scott E. Lee, which contain the following copyright notice:



*



* Copyright 1993-1995, Scott E. Lee, all rights reserved.



* Permission granted to use, copy, modify, distribute and sell so



long as



* the above copyright and this permission statement are retained



in all



* copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK.



*



* Bill Hastings



* RBI Software Systems



* bhastings@rbi.com



*/



var GREG_SDN_OFFSET = 32045,



DAYS_PER_5_MONTHS = 153,



DAYS_PER_4_YEARS = 1461,



DAYS_PER_400_YEARS = 146097;



var HALAKIM_PER_HOUR = 1080,



HALAKIM_PER_DAY = 25920,



HALAKIM_PER_LUNAR_CYCLE = ((29 * HALAKIM_PER_DAY) + 13753),



HALAKIM_PER_METONIC_CYCLE = (HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7));



var HEB_SDN_OFFSET = 347997,



NEW_MOON_OF_CREATION = 31524,



NOON = (18 * HALAKIM_PER_HOUR),



AM3_11_20 = ((9 * HALAKIM_PER_HOUR) + 204),



AM9_32_43 = ((15 * HALAKIM_PER_HOUR) + 589);



var SUN = 0,



MON = 1,



TUES = 2,



WED = 3,



THUR = 4,



FRI = 5,



SAT = 6;



var today = null,



hebrewMonth = 0,



hebrewDate = 0,



hebrewYear = 0,



metonicCycle = 0,



metonicYear = 0,



moladDay = 0,



moladHalakim = 0;



var gWeekday = new weekdayarr("Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Шабат");



var gMonth = new gregmontharr("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");



var hMonth = new hebrewmontharr("Тишрей","Хешван","Кислев","Тевет","Шват","Адар1","Адар2","Нисан","Ияр","Сиван","Тамуз","Ав","Элуль");



var mpy = new monthsperyeararr(12,12,13,12,12,13,12,13,12,12,13,12,12,13,12,12,13,12,13);



function weekdayarr(d0,d1,d2,d3,d4,d5,d6)



{



this[0] = d0; this[1] = d1; this[2] = d2; this[3] = d3;



this[4] = d4; this[5] = d5; this[6] = d6;



}



function gregmontharr(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11)



{



this[0] = m0; this[1] = m1; this[2] = m2; this[3] = m3;



this[4] = m4; this[5] = m5; this[6] = m6; this[7] = m7;



this[8] = m8; this[9] = m9; this[10] = m10; this[11] = m11;



}



function hebrewmontharr(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13)



{



this[0] = m0; this[1] = m1; this[2] = m2; this[3] = m3;



this[4] = m4; this[5] = m5; this[6] = m6; this[7] = m7;



this[8] = m8; this[9] = m9; this[10] = m10; this[11] = m11;



this[12] = m12; this[13] = m13;



}



function monthsperyeararr(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,



m10,m11,m12,m13,m14,m15,m16,m17,m18)



{



this[0] = m0; this[1] = m1; this[2] = m2; this[3] = m3;



this[4] = m4; this[5] = m5; this[6] = m6; this[7] = m7;



this[8] = m8; this[9] = m9; this[10] = m10; this[11] = m11;



this[12] = m8; this[13] = m13; this[14] = m14; this[15] = m15;



this[16] = m16; this[17] = m17; this[18] = m18;



}



function getToday()



{



if(today == null)



today = new Date();



}



function displayWeekday()



{



getToday();



document.writeln(gWeekday[today.getDay()]);



}



function displaydaytoShabbat()



{



getToday();



var n;



var a=gWeekday[today.getDay()];



if (a=="Воскресенье"){n="До субботы 6 дней";}



if (a=="Понедельник"){n="До субботы 5 дней";}



if (a=="Вторник"){n="До субботы 4 дня";}



if (a=="Среда"){n="До субботы 3 дня";}



if (a=="Четверг"){n="До субботы 2 дня";}



if (a=="Пятница"){n="До субботы 1 день";}



if (a=="Шабат"){n="Суббота";}



document.writeln(n);



}



function displayGregorianDate()



{



getToday();


if (today.getYear() < 2000){
document.writeln(gMonth[today.getMonth()] + " " +



today.getDate() + ", " + (today.getYear() +1900));
}
if (today.getYear() > 2000){
document.writeln(gMonth[today.getMonth()] + " " +



today.getDate() + ", " + (today.getYear()));
}

}



function displayHebrewDate()



{



if(hebrewDate != 0 && hebrewMonth != 0 && hebrewYear != 0)


if (hebrewYear > 5500){
document.writeln(hebrewDate + " " +



hMonth[hebrewMonth-1] + " " + hebrewYear);
}
if (hebrewYear < 5500){
document.writeln(hebrewDate + " " +



hMonth[hebrewMonth-1] + " " + (hebrewYear+1900));
}


}



function GregorianToSdn(inputYear,inputMonth,inputDay)



{



var year = 0,



month = 0,



sdn;



getToday();



// Make year a positive number



if (inputYear < 0)



year = inputYear + 4801;



else



year = inputYear + 4800;



// Adjust the start of the year



if (inputMonth > 2) {



month = inputMonth - 3;



}



else {



month = inputMonth + 9;



year--;



}



sdn = Math.floor((Math.floor(year / 100) * DAYS_PER_400_YEARS) / 4);



sdn += Math.floor(((year % 100) * DAYS_PER_4_YEARS) / 4);



sdn += Math.floor((month * DAYS_PER_5_MONTHS + 2) / 5);



sdn += inputDay - GREG_SDN_OFFSET;



return sdn;



}



function SdnToHebrew(sdn)



{



var inputDay,



tishri1 = 0,



tishri1After = 0,



yearLength = 0,



inputDay = sdn - HEB_SDN_OFFSET;



FindTishriMolad(inputDay);



tishri1 = Tishri1(metonicYear,moladDay,moladHalakim);



if (inputDay >= tishri1) {



// It found Tishri 1 at the start of the year.



hebrewYear = metonicCycle * 19 + metonicYear + 1;



if (inputDay < tishri1 + 59) {



if (inputDay < tishri1 + 30) {



hebrewMonth = 1;



hebrewDate = inputDay - tishri1 + 1;



}



else {



hebrewMonth = 2;



//////////////////////////////////////////////////////////////////hebrewDate = inputDay - tishri1 - 37;
hebrewDate = inputDay - tishri1 - 29;


}



return;



}



// We need the length of the year to figure this out,so find Tishri 1 of the next year.



moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear];



moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY);



moladHalakim = moladHalakim % HALAKIM_PER_DAY;



tishri1After = Tishri1((metonicYear + 1) % 19,moladDay,moladHalakim);



}



else {



// It found Tishri 1 at the end of the year.



hebrewYear = metonicCycle * 19 + metonicYear;



if (inputDay >= tishri1 - 177) {



// It is one of the last 6 months of the year.



if (inputDay > tishri1 - 30) {



hebrewMonth = 13;



hebrewDate = inputDay - tishri1 + 30;



}



else if (inputDay > tishri1 - 60) {



hebrewMonth = 12;



hebrewDate = inputDay - tishri1 + 60;



}



else if (inputDay > tishri1 - 89) {



hebrewMonth = 11;



hebrewDate = inputDay - tishri1 + 89;



}



else if (inputDay > tishri1 - 119) {



hebrewMonth = 10;



hebrewDate = inputDay - tishri1 + 119;



}



else if (inputDay > tishri1 - 148) {



hebrewMonth = 9;



hebrewDate = inputDay - tishri1 + 148;



}



else {



hebrewMonth = 8;



hebrewDate = inputDay - tishri1 + 178;



}



return;



}



else {



if (mpy[(hebrewYear - 1) % 19] == 13) {



hebrewMonth = 7;



hebrewDate = inputDay - tishri1 + 207;



if (hebrewDate > 0)



return;



hebrewMonth--;



hebrewDate += 30;



if (hebrewDate > 0)



return;



hebrewMonth--;



hebrewDate += 30;



}



else {



hebrewMonth = 6;



hebrewDate = inputDay - tishri1 + 207;



if (hebrewDate > 0)



return;



hebrewMonth--;



hebrewDate += 30;



}



if (hebrewDate > 0)



return;



hebrewMonth--;



hebrewDate += 29;



if (hebrewDate > 0)



return;



// We need the length of the year to figure this out,so find Tishri 1 of this year.



tishri1After = tishri1;



FindTishriMolad(moladDay - 365);



tishri1 = Tishri1(metonicYear,moladDay,moladHalakim);



}



}



yearLength = tishri1After - tishri1;



moladDay = inputDay - tishri1 - 29;



if (yearLength == 355 || yearLength == 385) {



// Heshvan has 30 days



if (moladDay <= 30) {



hebrewMonth = 2;



hebrewDate = moladDay;



return;



}



moladDay -= 30;



}



else {



// Heshvan has 29 days



if (moladDay <= 29) {



hebrewMonth = 2;



hebrewDate = moladDay;



return;



}



moladDay -= 29;



}



// It has to be Kislev.



hebrewMonth = 3;



hebrewDate = moladDay;



}



function FindTishriMolad(inputDay)



{



// Estimate the metonic cycle number. Note that this may be an under



// estimate because there are 6939.6896 days in a metonic cycle not



// 6940,but it will never be an over estimate. The loop below will



// correct for any error in this estimate.



metonicCycle = Math.floor((inputDay + 310) / 6940);



// Calculate the time of the starting molad for this metonic cycle.



MoladOfMetonicCycle();



// If the above was an under estimate,increment the cycle number until



// the correct one is found. For modern dates this loop is about 98.6%



// likely to not execute,even once,because the above estimate is



// really quite close.



while (moladDay < inputDay - 6940 + 310) {



metonicCycle++;



moladHalakim += HALAKIM_PER_METONIC_CYCLE;



moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY);



moladHalakim = moladHalakim % HALAKIM_PER_DAY;



}



// Find the molad of Tishri closest to this date.



for (metonicYear = 0; metonicYear < 18; metonicYear++) {



if (moladDay > inputDay - 74)



break;



moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear];



moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY);



moladHalakim = moladHalakim % HALAKIM_PER_DAY;



}



}



function MoladOfMetonicCycle()



{



var r1,r2,d1,d2;



// Start with the time of the first molad after creation.



r1 = NEW_MOON_OF_CREATION;



// Calculate gMetonicCycle * HALAKIM_PER_METONIC_CYCLE. The upper 32



// bits of the result will be in r2 and the lower 16 bits will be in r1.



r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE&0xFFFF);



r2 = r1 >> 16;



r2 += metonicCycle * ((HALAKIM_PER_METONIC_CYCLE >> 16)&0xFFFF);



// Calculate r2r1 / HALAKIM_PER_DAY. The remainder will be in r1,the



// upper 16 bits of the quotient will be in d2 and the lower 16 bits



// will be in d1.



d2 = Math.floor(r2 / HALAKIM_PER_DAY);



r2 -= d2 * HALAKIM_PER_DAY;



r1 = (r2 << 16) | (r1&0xFFFF);



d1 = Math.floor(r1 / HALAKIM_PER_DAY);



r1 -= d1 * HALAKIM_PER_DAY;



moladDay = (d2 << 16) | d1;



moladHalakim = r1;



}



function Tishri1(metonicYear,moladDay,moladHalakim)



{



var tishri1 = moladDay;



var dow = tishri1 % 7;



var leapYear = metonicYear == 2 || metonicYear == 5 || metonicYear == 7 || metonicYear == 10 || metonicYear == 13 || metonicYear == 16 || metonicYear == 18;



var lastWasLeapYear = metonicYear == 3 || metonicYear == 6 || metonicYear == 8 || metonicYear == 11 || metonicYear == 14 || metonicYear == 17 || metonicYear == 0;



// Apply rules 2,3 and 4



if ((moladHalakim >= NOON) ||((!leapYear) && dow == TUES && moladHalakim >= AM3_11_20) ||(lastWasLeapYear && dow == MON && moladHalakim >= AM9_32_43))



{



tishri1++;



dow++;



if (dow == 7)



dow = 0;



}



// Apply rule 1 after the others because it can cause an additional delay of one day.



if (dow == WED || dow == FRI || dow == SUN) {



tishri1++;



}



return tishri1;



}
function dadadada()
{
displayGregorianDate();
//displayWeekday();
document.writeln("&nbsp;");
document.writeln("<br>");
SdnToHebrew(GregorianToSdn(today.getYear(),today.getMonth()+1,today.getDate()));
displayHebrewDate();
}