var today = null;

function translateMyDate(yr,mm,dd,hr,mn)
{
	// Year must be a four digit year
	mm -= 1; // months go from 0 - 11
	dToday=new Date(yr, mm, dd);
	dToday.setHours(0);
	dToday.setMinutes(0);
	dToday.setSeconds(0);
	dToday.setMilliseconds(0);

	// If after sundown then consider it one day later.
	// this assumes that שקיעת החמה is always at 7:00 pm
	if (hr >= 19)
	{
		var onesec=1000; //1000 milliseconds
		var onemin=60*onesec;
		var onehour=60*onemin;
		var oneday=onehour*24;
		dToday.setTime(dToday.getTime()+oneday);
	}

	today = dToday;
	
	//alert(dToday);	
	try 
	{
		if (bReturn)
		{
			return (FormatDateH(GregToHeb(dToday)));
		}
		else
		{
			document.writeln(FormatDateH(GregToHeb(dToday)));
		}
	}
	catch(exception)
	{
		document.writeln(FormatDateH(GregToHeb(dToday)));
	}
}

function translateToHebrewNums(numToTranslate)
{
	var hebNumValues = new Array(); 
	hebNumValues[0] = new Array(); hebNumValues[0][0] = 400; hebNumValues[0][1] = "ת";
	hebNumValues[1] = new Array(); hebNumValues[1][0] = 300; hebNumValues[1][1] = "ש";
	hebNumValues[2] = new Array(); hebNumValues[2][0] = 200; hebNumValues[2][1] = "ר";
	hebNumValues[3] = new Array(); hebNumValues[3][0] = 100; hebNumValues[3][1] = "ק";
	hebNumValues[4] = new Array(); hebNumValues[4][0] = 90; hebNumValues[4][1] = "צ";
	hebNumValues[5] = new Array(); hebNumValues[5][0] = 80; hebNumValues[5][1] = "פ";
	hebNumValues[6] = new Array(); hebNumValues[6][0] = 70; hebNumValues[6][1] = "ע";
	hebNumValues[7] = new Array(); hebNumValues[7][0] = 60; hebNumValues[7][1] = "ס";
	hebNumValues[8] = new Array(); hebNumValues[8][0] = 50; hebNumValues[8][1] = "נ";
	hebNumValues[9] = new Array(); hebNumValues[9][0] = 40; hebNumValues[9][1] = "מ";
	hebNumValues[10] = new Array(); hebNumValues[10][0] = 30; hebNumValues[10][1] = "ל";
	hebNumValues[11] = new Array(); hebNumValues[11][0] = 20; hebNumValues[11][1] = "כ";
	hebNumValues[12] = new Array(); hebNumValues[12][0] = 19; hebNumValues[12][1] = "יט";
	hebNumValues[13] = new Array(); hebNumValues[13][0] = 18; hebNumValues[13][1] = "יח";
	hebNumValues[14] = new Array(); hebNumValues[14][0] = 17; hebNumValues[14][1] = "יז";
	hebNumValues[15] = new Array(); hebNumValues[15][0] = 16; hebNumValues[15][1] = "טז";
	hebNumValues[16] = new Array(); hebNumValues[16][0] = 15; hebNumValues[16][1] = "טז";
	hebNumValues[17] = new Array(); hebNumValues[17][0] = 14; hebNumValues[17][1] = "יד";
	hebNumValues[18] = new Array(); hebNumValues[18][0] = 13; hebNumValues[18][1] = "יג";
	hebNumValues[19] = new Array(); hebNumValues[19][0] = 12; hebNumValues[19][1] = "יב";
	hebNumValues[20] = new Array(); hebNumValues[20][0] = 11; hebNumValues[20][1] = "יא";
	hebNumValues[21] = new Array(); hebNumValues[21][0] = 10; hebNumValues[21][1] = "י";
	hebNumValues[22] = new Array(); hebNumValues[22][0] = 9; hebNumValues[22][1] = "ט";
	hebNumValues[23] = new Array(); hebNumValues[23][0] = 8; hebNumValues[23][1] = "ח";
	hebNumValues[24] = new Array(); hebNumValues[24][0] = 7; hebNumValues[24][1] = "ז";
	hebNumValues[25] = new Array(); hebNumValues[25][0] = 6; hebNumValues[25][1] = "ו";
	hebNumValues[26] = new Array(); hebNumValues[26][0] = 5; hebNumValues[26][1] = "ה";
	hebNumValues[27] = new Array(); hebNumValues[27][0] = 4; hebNumValues[27][1] = "ד";
	hebNumValues[28] = new Array(); hebNumValues[28][0] = 3; hebNumValues[28][1] = "ג";
	hebNumValues[29] = new Array(); hebNumValues[29][0] = 2; hebNumValues[29][1] = "ב";
	hebNumValues[30] = new Array(); hebNumValues[30][0] = 1; hebNumValues[30][1] = "א";

	var indx;
	var num = numToTranslate;
	var hebNum = "";
	
	if (num > 5000)
	{
		num -= 5000;
	}
	
	for (indx=0; indx < 31; indx++)
	{
		if ( num >= hebNumValues[indx][0] )
		{
			num -= hebNumValues[indx][0];
			hebNum += hebNumValues[indx][1];
		}
		if ( num == 0 )
		{
			break;
		}
	}
	
	if ( hebNum.length >= 2 )
	{
		hebNum = hebNum.substr(0,hebNum.length-1) + '"' + hebNum.substr(hebNum.length-1,hebNum.length);
	}
	else if ( hebNum.length == 1 )
	{
		hebNum += "'";
	}
	return hebNum;
}

function MonSinceFirstMolad(nYearH) {
  var nMonSinceFirstMolad
  nYearH --

  nMonSinceFirstMolad = Math.floor(nYearH / 19) * 235
  nYearH = nYearH % 19
  nMonSinceFirstMolad += 12 * nYearH
  if (nYearH >= 17) {
    nMonSinceFirstMolad += 6
  } else if  (nYearH >= 14) {
    nMonSinceFirstMolad += 5
  } else if  (nYearH >= 11) {
    nMonSinceFirstMolad += 4
  } else if  (nYearH >= 8) {
    nMonSinceFirstMolad += 3
  } else if  (nYearH >= 6) {
    nMonSinceFirstMolad += 2
  } else if  (nYearH >= 3) {
    nMonSinceFirstMolad += 1
  }
  return nMonSinceFirstMolad
}

function IsLeapYear(nYearH) {
   var nYearInCycle

  nYearInCycle = nYearH % 19
  return ( nYearInCycle ==  3 ||
           nYearInCycle ==  6 ||
           nYearInCycle ==  8 ||
           nYearInCycle == 11 ||
           nYearInCycle == 14 ||
           nYearInCycle == 17 ||
           nYearInCycle == 0)
}

function Tishrei1(nYearH) {
  var nMonthsSinceFirstMolad
  var nChalakim
  var nHours
  var nDays
  var nDayOfWeek
  var dTishrei1

  nMonthsSinceFirstMolad = MonSinceFirstMolad(nYearH)
  nChalakim = 793 * nMonthsSinceFirstMolad
  nChalakim += 204
  nHours = Math.floor(nChalakim / 1080)
  nChalakim = nChalakim % 1080

  nHours += nMonthsSinceFirstMolad * 12
  nHours += 5

  nDays = Math.floor(nHours / 24)
  nHours = nHours % 24

  nDays += 29 * nMonthsSinceFirstMolad
  nDays += 2

  nDayOfWeek = nDays % 7

  if (!IsLeapYear(nYearH) &&
      nDayOfWeek == 3 &&
      (nHours * 1080) + nChalakim >= (9 * 1080) + 204) {
    nDayOfWeek = 5
    nDays += 2
  }
  else if ( IsLeapYear(nYearH - 1) &&
            nDayOfWeek == 2 &&
            (nHours * 1080) + nChalakim >= (15 * 1080) + 589 ) {
    nDayOfWeek = 3
    nDays += 1
  }
  else {
    if (nHours >= 18) {
      nDayOfWeek += 1
      nDayOfWeek = nDayOfWeek % 7
      nDays += 1
    }
    if (nDayOfWeek == 1 ||
        nDayOfWeek == 4 ||
        nDayOfWeek == 6) {
      nDayOfWeek += 1
      nDayOfWeek = nDayOfWeek % 7
      nDays += 1
    }
  }

  nDays -= 2067025
  dTishrei1 = new Date(1900, 0, 1)
  dTishrei1.setDate(dTishrei1.getDate() + nDays)

  return dTishrei1
}

function LengthOfYear(nYearH) {
  var dThisTishrei1
  var dNextTishrei1
  var diff

  dThisTishrei1 = Tishrei1(nYearH)
  dNextTishrei1 = Tishrei1(nYearH + 1)
  diff = (dNextTishrei1 - dThisTishrei1) / ( 1000 * 60 * 60 * 24)
  return Math.round(diff)
}

function GregToHeb(dGreg) {
  var nYearH
  var nMonthH
  var nDateH
  var nOneMolad
  var nAvrgYear
  var nDays
  var dTishrei1
  var nLengthOfYear
  var bLeap
  var bHaser
  var bShalem
  var nMonthLen
  var bWhile
  var d1900 = new Date(1900, 0, 1)

  nOneMolad = 29 + (12 / 24) + (793 / (1080 * 24))
  nAvrgYear = nOneMolad * (235 / 19)
  nDays = Math.round((dGreg - d1900) / (24 * 60 * 60 * 1000))
  nDays += 2067025
  nYearH = Math.floor(nDays / nAvrgYear) + 1
  dTishrei1 = Tishrei1(nYearH)

  if (SameDate(dTishrei1, dGreg)) {
    nMonthH = 1
    nDateH = 1
  }
  else  {
    if (dTishrei1 < dGreg) {
      while (Tishrei1(nYearH + 1) <= dGreg) {
        nYearH += 1
      }
    }
    else {
      nYearH -= 1
      while (Tishrei1(nYearH) > dGreg) {
        nYearH -= 1
      }
    }

    nDays = (dGreg - Tishrei1(nYearH)) / (24 * 60 * 60 * 1000)
    nDays = Math.round(nDays)
    nLengthOfYear = LengthOfYear(nYearH)
    bHaser = nLengthOfYear == 353 || nLengthOfYear == 383
    bShalem = nLengthOfYear == 355 || nLengthOfYear == 385
    bLeap = IsLeapYear(nYearH)

    nMonthH = 1
    do {

      switch (nMonthH) {
        case 1:
        case 5:
        case 6:
        case 8:
        case 10:
        case 12:
          nMonthLen = 30
          break
        case 4:
        case 7:
        case 9:
        case 11:
        case 13:
          nMonthLen = 29
          break
        case 6:
          nMonthLen = 30
          break
        case 2:
          nMonthLen = (bShalem ? 30 : 29)
          break
        case 3:
          nMonthLen = (bHaser ? 29: 30)
          break
      }

      if (nDays >= nMonthLen) {
        bWhile = true
        if (bLeap || nMonthH != 5) {
          nMonthH ++
        }
        else {
          nMonthH += 2
        }
        nDays -= nMonthLen
      }
      else {
        bWhile = false
      }
    } while (bWhile)
    nDateH = nDays + 1
  }
  return nMonthH + "/" + nDateH + "/" + nYearH
}

function SameDate(d1, d2) {
  return (d1.getFullYear() == d2.getFullYear() && 
          d1.getMonth() == d2.getMonth() && 
          d1.getDate() == d2.getDate())
             
} 

function FormatDateH(cDate) {
  var aDate = new Array()
  var cFormatDate

  aDate = cDate.split("/")
  switch (Number(aDate[0])) {
    case 1:
      cFormatDate = "תשרי"
      break
    case 2:
      cFormatDate = "חשון"
      break
    case 3:
      cFormatDate = "כסלו"
      break
    case 4:
      cFormatDate = "טבת"
      break
    case 5:
      cFormatDate = "שבט"
      break
    case 6:
      cFormatDate = "אדר א'"
      break
    case 7:
      cFormatDate = (IsLeapYear(Number(aDate[2])) ? "אדר ב'" : "אדר")
      break
    case 8:
      cFormatDate = "ניסן"
      break
    case 9:
      cFormatDate = "אייר"
      break
    case 10:
      cFormatDate = "סיון"
      break
    case 11:
      cFormatDate = "תמוז"
      break
    case 12:
      cFormatDate = "אב"
      break
    case 13:
      cFormatDate = "אלול"
      break
  }
  cFormatDate = translateToHebrewNums(aDate[1]) + " " + cFormatDate + " " + translateToHebrewNums(aDate[2])
  return cFormatDate
}
