<!--

////////////////////////////////////////////////////////
// Copyright 2003, Timothy James Forsythe, all rights reserved.
// Permission granted to use, copy, modify, and distribute so long as
// the above copyright and this permission statement are retained in all
// copies.  THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
//
////////////////////////////////////////////////////////
// based on the algorithms of Project Pluto
// http://www.projectpluto.com/calendar.htm#jalali
//////////////////////////////////////////////////////////

var JALALI_ZERO        = 1947954;
var LOWER_PERSIAN_YEAR = -1096;
var UPPER_PERSIAN_YEAR = 2327;

function JalaliDate()
{
  this.mstr  = "";
  this.d     = "";
  this.m     = "";
  this.y     = "";
}

function JDNToJalali(jdn)
{
  var MO_LEN = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
  var MONTHS = new Array("Farvardin", "Ordibehesht", "Khordad", "Tir", "Mordad", "Shahrivar", "Mehr", "Aban", "Azar", "Dey", "Bahman", "Esfand");

  var date = new JalaliDate();
  var days = new Array(0,0);

  var day;
  var month;
  var year;
  var i;
  var curr_jdn;
  var error = false;
  var done = false;
  
  year = Math.floor((jdn - JALALI_ZERO) / 365);

  do
  {
    if (( year >= LOWER_PERSIAN_YEAR) && (year <= UPPER_PERSIAN_YEAR))
    {
      days[0] = jalali_jd0(year) + 1;
      days[1] = jalali_jd0(year + 1) + 1;

      if ((days[0] != 0) && (days[1] != 0))
      {
    	// The first six months have 31 days.  The next five have 30  
    	// days.  The last month has 29 days in ordinary years,  30   
    	// in leap years.                                             
    	MO_LEN[11] = (days[1] - days[0]) - 336;
  
        // get_calendar_data
        // New Years Day of the following year.  If you have 
        // days1 <= JDN < days2,  JDN is in the current year. 
        days[1] = days[0];
        
        for(i=0; i<12; i++)
        {
           days[1] += MO_LEN[i];
        }

	// day_to_dmy
        if(days[0] > jdn)
           year--;
        if(days[1] <= jdn)
           year++;
      }
      else
      {
        error = true;
      }
    }
    else
    {
      error = true;
    }  
  }
  while(((days[0] > jdn) || (days[1] <= jdn)) && (!error));

  if (!error)  
  {
    curr_jdn = days[0];
    month = -1;
    for(i=0; i<12 && !done; i++)
    {
      day = (jdn - curr_jdn);
   	 
      if(day < MO_LEN[i])
      {
        month = i + 1;
        day++;
        done = true;
      }
      else
      {
        curr_jdn += MO_LEN[i];
      }  
    }

    date.d = day;
    date.m = month;
    date.y = year;
    date.mstr = MONTHS[month-1];
  }  

  return date;
}

function jalali_jd0 (year)
{
   var BREAKS = new Array(-708,-221,-3,6,394,720,786,1145,1635,1701,1866,2328);
   var DELTAS = new Array(1108,1047,984,1249,952,891,930,866,869,844,848,852);

   var i;
   var rval = -1; // out of range

   if (( year >= LOWER_PERSIAN_YEAR) && (year <= UPPER_PERSIAN_YEAR))
   {
     for(i=0; i<12; i++)
     {
       if(year < BREAKS[i])
       {
         rval = JALALI_ZERO + (year * 365) + Math.floor((DELTAS[i] + (year * 303)) / 1250);
         
         // zero point drops one day in first three blocks 
         if( i < 3) 
         {
            rval--;
         }
         
         break;
       }
     } // end for loop  
   }
   
   return rval; 
}

-->

