਍⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀഀ
///// Jalali (Shamsi) Calendar Date Picker (JavaScript) /////਍⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀⼀ഀഀ
਍瘀愀爀 搀愀琀攀倀椀挀欀攀爀䐀椀瘀䤀䐀 㴀 ∀搀愀琀攀瀀椀挀欀攀爀∀㬀ഀഀ
var iFrameDivID = "datepickeriframe";਍ഀഀ
var dayArrayShort = new Array('&#1588;' , '&#1740;', '&#1583;', '&#1587;', '&#1670;', '&#1662;', '&#1580;');਍瘀愀爀 搀愀礀䄀爀爀愀礀䴀攀搀 㴀 渀攀眀 䄀爀爀愀礀⠀✀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀ Ⰰ ✀☀⌀㄀㜀㐀　㬀☀⌀㄀㜀　㔀㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀Ⰰ ✀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㘀　㠀㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀Ⰰ ✀☀⌀㄀㔀㠀㜀㬀☀⌀㄀㘀　㜀㬀☀⌀㌀㈀㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀Ⰰ ✀☀⌀㄀㘀㜀　㬀☀⌀㄀㘀　㜀㬀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀ Ⰰ ✀☀⌀㄀㘀㘀㈀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㠀　㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀✀ Ⰰ ✀☀⌀㄀㔀㠀　㬀☀⌀㄀㘀　㔀㬀☀⌀㄀㔀㤀㌀㬀☀⌀㄀㘀　㜀㬀✀⤀㬀ഀഀ
var dayArrayLong = dayArrayMed;਍瘀愀爀 洀漀渀琀栀䄀爀爀愀礀匀栀漀爀琀 㴀 渀攀眀 䄀爀爀愀礀⠀✀☀⌀㄀㘀　㄀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㘀　㠀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㜀㐀　㬀☀⌀㄀㘀　㘀㬀✀Ⰰ✀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㜀㐀　㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㔀㜀㠀㬀✀Ⰰ✀☀⌀㄀㔀㠀㈀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㔀㠀㌀㬀✀Ⰰ✀☀⌀㄀㔀㜀㠀㬀☀⌀㄀㜀㐀　㬀☀⌀㄀㔀㠀㔀㬀✀Ⰰ✀☀⌀㄀㘀　㔀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㔀㠀㌀㬀✀Ⰰ✀☀⌀㄀㔀㠀㠀㬀☀⌀㄀㘀　㜀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㜀㐀　㬀☀⌀㄀㘀　㠀㬀☀⌀㄀㔀㠀㔀㬀✀Ⰰ✀☀⌀㄀㘀　㔀㬀☀⌀㄀㘀　㜀㬀☀⌀㄀㔀㠀㔀㬀✀Ⰰ✀☀⌀㄀㔀㜀　㬀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㘀　㘀㬀✀Ⰰ✀☀⌀㄀㔀㜀　㬀☀⌀㄀㔀㠀㐀㬀☀⌀㄀㔀㠀㔀㬀✀Ⰰ✀☀⌀㄀㔀㠀㌀㬀☀⌀㄀㜀㐀　㬀✀Ⰰ✀☀⌀㄀㔀㜀㘀㬀☀⌀㄀㘀　㜀㬀☀⌀㄀㘀　㔀㬀☀⌀㄀㘀　㘀㬀✀Ⰰ✀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㔀㠀㜀㬀☀⌀㄀㘀　㄀㬀☀⌀㄀㘀　㘀㬀☀⌀㄀㔀㠀㌀㬀✀⤀㬀ഀഀ
var monthArrayMed = monthArrayShort;਍瘀愀爀 洀漀渀琀栀䄀爀爀愀礀䰀漀渀最 㴀 洀漀渀琀栀䄀爀爀愀礀匀栀漀爀琀㬀ഀഀ
 ਍⼀⼀ 琀栀攀猀攀 瘀愀爀椀愀戀氀攀猀 搀攀昀椀渀攀 琀栀攀 搀愀琀攀 昀漀爀洀愀琀琀椀渀最 眀攀✀爀攀 攀砀瀀攀挀琀椀渀最 愀渀搀 漀甀琀瀀甀琀琀椀渀最⸀ഀഀ
// If you want to use a different format by default, change the defaultDateSeparator਍⼀⼀ 愀渀搀 搀攀昀愀甀氀琀䐀愀琀攀䘀漀爀洀愀琀 瘀愀爀椀愀戀氀攀猀 攀椀琀栀攀爀 栀攀爀攀 漀爀 漀渀 礀漀甀爀 䠀吀䴀䰀 瀀愀最攀⸀ഀഀ
var defaultDateSeparator = "/";        // common values would be "/" or "."਍瘀愀爀 搀攀昀愀甀氀琀䐀愀琀攀䘀漀爀洀愀琀 㴀 ∀礀洀搀∀    ⼀⼀ 瘀愀氀椀搀 瘀愀氀甀攀猀 愀爀攀 ∀洀搀礀∀Ⰰ ∀搀洀礀∀Ⰰ 愀渀搀 ∀礀洀搀∀ഀഀ
var dateSeparator = defaultDateSeparator;਍瘀愀爀 搀愀琀攀䘀漀爀洀愀琀 㴀 搀攀昀愀甀氀琀䐀愀琀攀䘀漀爀洀愀琀㬀ഀഀ
਍昀甀渀挀琀椀漀渀 搀椀猀瀀氀愀礀䐀愀琀攀倀椀挀欀攀爀⠀搀愀琀攀䘀椀攀氀搀一愀洀攀Ⰰ 搀椀猀瀀氀愀礀䈀攀氀漀眀吀栀椀猀伀戀樀攀挀琀Ⰰ 搀琀䘀漀爀洀愀琀Ⰰ 搀琀匀攀瀀⤀ഀഀ
{਍  瘀愀爀 琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀 㴀 搀漀挀甀洀攀渀琀⸀最攀琀䔀氀攀洀攀渀琀猀䈀礀一愀洀攀 ⠀搀愀琀攀䘀椀攀氀搀一愀洀攀⤀⸀椀琀攀洀⠀　⤀㬀ഀഀ
  // if we weren't told what node to display the datepicker beneath, just display it਍  ⼀⼀ 戀攀渀攀愀琀栀 琀栀攀 搀愀琀攀 昀椀攀氀搀 眀攀✀爀攀 甀瀀搀愀琀椀渀最ഀഀ
  if (!displayBelowThisObject)਍    搀椀猀瀀氀愀礀䈀攀氀漀眀吀栀椀猀伀戀樀攀挀琀 㴀 琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀㬀ഀഀ
 ਍  ⼀⼀ 椀昀 愀 搀愀琀攀 猀攀瀀愀爀愀琀漀爀 挀栀愀爀愀挀琀攀爀 眀愀猀 最椀瘀攀渀Ⰰ 甀瀀搀愀琀攀 琀栀攀 搀愀琀攀匀攀瀀愀爀愀琀漀爀 瘀愀爀椀愀戀氀攀ഀഀ
  if (dtSep)਍    搀愀琀攀匀攀瀀愀爀愀琀漀爀 㴀 搀琀匀攀瀀㬀ഀഀ
  else਍    搀愀琀攀匀攀瀀愀爀愀琀漀爀 㴀 搀攀昀愀甀氀琀䐀愀琀攀匀攀瀀愀爀愀琀漀爀㬀ഀഀ
 ਍  ⼀⼀ 椀昀 愀 搀愀琀攀 昀漀爀洀愀琀 眀愀猀 最椀瘀攀渀Ⰰ 甀瀀搀愀琀攀 琀栀攀 搀愀琀攀䘀漀爀洀愀琀 瘀愀爀椀愀戀氀攀ഀഀ
  if (dtFormat)਍    搀愀琀攀䘀漀爀洀愀琀 㴀 搀琀䘀漀爀洀愀琀㬀ഀഀ
  else਍    搀愀琀攀䘀漀爀洀愀琀 㴀 搀攀昀愀甀氀琀䐀愀琀攀䘀漀爀洀愀琀㬀ഀഀ
 ਍  瘀愀爀 砀 㴀 搀椀猀瀀氀愀礀䈀攀氀漀眀吀栀椀猀伀戀樀攀挀琀⸀漀昀昀猀攀琀䰀攀昀琀㬀ഀഀ
  var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight ;਍ ഀഀ
  // deal with elements inside tables and such਍  瘀愀爀 瀀愀爀攀渀琀 㴀 搀椀猀瀀氀愀礀䈀攀氀漀眀吀栀椀猀伀戀樀攀挀琀㬀ഀഀ
  while (parent.offsetParent) {਍    瀀愀爀攀渀琀 㴀 瀀愀爀攀渀琀⸀漀昀昀猀攀琀倀愀爀攀渀琀㬀ഀഀ
    x += parent.offsetLeft;਍    礀 ⬀㴀 瀀愀爀攀渀琀⸀漀昀昀猀攀琀吀漀瀀 㬀ഀഀ
  }਍  搀爀愀眀䐀愀琀攀倀椀挀欀攀爀⠀琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀Ⰰ 砀Ⰰ 礀⤀㬀ഀഀ
}਍ഀഀ
/**਍䐀爀愀眀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 漀戀樀攀挀琀 ⠀眀栀椀挀栀 椀猀 樀甀猀琀 愀 琀愀戀氀攀 眀椀琀栀 挀愀氀攀渀搀愀爀 攀氀攀洀攀渀琀猀⤀ 愀琀 琀栀攀ഀഀ
specified x and y coordinates, using the targetDateField object as the input tag਍琀栀愀琀 眀椀氀氀 甀氀琀椀洀愀琀攀氀礀 戀攀 瀀漀瀀甀氀愀琀攀搀 眀椀琀栀 愀 搀愀琀攀⸀ഀഀ
਍吀栀椀猀 昀甀渀挀琀椀漀渀 眀椀氀氀 渀漀爀洀愀氀氀礀 戀攀 挀愀氀氀攀搀 戀礀 琀栀攀 搀椀猀瀀氀愀礀䐀愀琀攀倀椀挀欀攀爀 昀甀渀挀琀椀漀渀⸀ഀഀ
*/਍昀甀渀挀琀椀漀渀 搀爀愀眀䐀愀琀攀倀椀挀欀攀爀⠀琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀Ⰰ 砀Ⰰ 礀⤀ഀഀ
{਍  瘀愀爀 搀琀 㴀 最攀琀䘀椀攀氀搀䐀愀琀攀⠀琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀⸀瘀愀氀甀攀⤀㬀ഀഀ
 ਍  ⼀⼀ 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 琀愀戀氀攀 眀椀氀氀 戀攀 搀爀愀眀渀 椀渀猀椀搀攀 漀昀 愀 㰀搀椀瘀㸀 眀椀琀栀 愀渀 䤀䐀 搀攀昀椀渀攀搀 戀礀 琀栀攀ഀഀ
  // global datePickerDivID variable. If such a div doesn't yet exist on the HTML਍  ⼀⼀ 搀漀挀甀洀攀渀琀 眀攀✀爀攀 眀漀爀欀椀渀最 眀椀琀栀Ⰰ 愀搀搀 漀渀攀⸀ഀഀ
  if (!document.getElementById(datePickerDivID)) {਍    ⼀⼀ 搀漀渀✀琀 甀猀攀 椀渀渀攀爀䠀吀䴀䰀 琀漀 甀瀀搀愀琀攀 琀栀攀 戀漀搀礀Ⰰ 戀攀挀愀甀猀攀 椀琀 挀愀渀 挀愀甀猀攀 最氀漀戀愀氀 瘀愀爀椀愀戀氀攀猀ഀഀ
    // that are currently pointing to objects on the page to have bad references਍    ⼀⼀搀漀挀甀洀攀渀琀⸀戀漀搀礀⸀椀渀渀攀爀䠀吀䴀䰀 ⬀㴀 ∀㰀搀椀瘀 椀搀㴀✀∀ ⬀ 搀愀琀攀倀椀挀欀攀爀䐀椀瘀䤀䐀 ⬀ ∀✀ 挀氀愀猀猀㴀✀搀瀀䐀椀瘀✀㸀㰀⼀搀椀瘀㸀∀㬀ഀഀ
    var newNode = document.createElement("div");਍    渀攀眀一漀搀攀⸀猀攀琀䄀琀琀爀椀戀甀琀攀⠀∀椀搀∀Ⰰ 搀愀琀攀倀椀挀欀攀爀䐀椀瘀䤀䐀⤀㬀ഀഀ
    newNode.setAttribute("class", "dpDiv");਍    渀攀眀一漀搀攀⸀猀攀琀䄀琀琀爀椀戀甀琀攀⠀∀猀琀礀氀攀∀Ⰰ ∀瘀椀猀椀戀椀氀椀琀礀㨀 栀椀搀搀攀渀㬀∀⤀㬀ഀഀ
    document.body.appendChild(newNode);਍  紀ഀഀ
 ਍  ⼀⼀ 洀漀瘀攀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 搀椀瘀 琀漀 琀栀攀 瀀爀漀瀀攀爀 砀Ⰰ礀 挀漀漀爀搀椀渀愀琀攀 愀渀搀 琀漀最最氀攀 琀栀攀 瘀椀猀椀戀氀椀琀礀ഀഀ
  var pickerDiv = document.getElementById(datePickerDivID);਍  瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀瀀漀猀椀琀椀漀渀 㴀 ∀愀戀猀漀氀甀琀攀∀㬀ഀഀ
  pickerDiv.style.left = x + "px";਍  瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀琀漀瀀 㴀 礀 ⬀ ∀瀀砀∀㬀ഀഀ
  pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");਍  瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀搀椀猀瀀氀愀礀 㴀 ⠀瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀搀椀猀瀀氀愀礀 㴀㴀 ∀戀氀漀挀欀∀ 㼀 ∀渀漀渀攀∀ 㨀 ∀戀氀漀挀欀∀⤀㬀ഀഀ
  pickerDiv.style.zIndex = 10000000;਍ ഀഀ
  // draw the datepicker table਍  爀攀昀爀攀猀栀䐀愀琀攀倀椀挀欀攀爀⠀琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀⸀渀愀洀攀Ⰰ 搀琀嬀　崀Ⰰ 搀琀嬀㄀崀Ⰰ 搀琀嬀㈀崀⤀㬀ഀഀ
}਍ഀഀ
਍⼀⨀⨀ഀഀ
This is the function that actually draws the datepicker calendar.਍⨀⼀ഀഀ
function refreshDatePicker(dateFieldName, year, month, day)਍笀ഀഀ
  // if no arguments are passed, use today's date; otherwise, month and year਍  ⼀⼀ 愀爀攀 爀攀焀甀椀爀攀搀 ⠀椀昀 愀 搀愀礀 椀猀 瀀愀猀猀攀搀Ⰰ 椀琀 眀椀氀氀 戀攀 栀椀最栀氀椀最栀琀攀搀 氀愀琀攀爀⤀ഀഀ
  var thisDay = getTodayPersian();਍  瘀愀爀 眀攀攀欀搀愀礀 㴀 ⠀琀栀椀猀䐀愀礀嬀㌀崀 ⴀ 琀栀椀猀䐀愀礀嬀㈀崀 ⬀ ㄀⤀─㜀㬀ഀഀ
  if(!day)਍ऀ  搀愀礀 㴀㄀㬀ഀഀ
  if ((month >= 1) && (year > 0)) {਍ऀ  琀栀椀猀䐀愀礀 㴀 挀愀氀挀倀攀爀猀椀愀渀⠀礀攀愀爀Ⰰ洀漀渀琀栀Ⰰ㄀⤀㬀ഀഀ
	  weekday = thisDay[3];਍ऀ  琀栀椀猀䐀愀礀 㴀 渀攀眀 䄀爀爀愀礀⠀礀攀愀爀Ⰰ洀漀渀琀栀Ⰰ搀愀礀Ⰰ眀攀攀欀搀愀礀⤀㬀ഀഀ
	  thisDay[2] = 1;਍  紀 攀氀猀攀 笀ഀഀ
    	day = thisDay[2];਍    ऀ琀栀椀猀䐀愀礀嬀㈀崀 㴀 ㄀㬀ഀഀ
  }਍ ഀഀ
  // the calendar will be drawn as a table਍  ⼀⼀ 礀漀甀 挀愀渀 挀甀猀琀漀洀椀稀攀 琀栀攀 琀愀戀氀攀 攀氀攀洀攀渀琀猀 眀椀琀栀 愀 最氀漀戀愀氀 䌀匀匀 猀琀礀氀攀 猀栀攀攀琀Ⰰഀഀ
  // or by hardcoding style and formatting elements below਍  瘀愀爀 挀爀氀昀 㴀 ∀尀爀尀渀∀㬀ഀഀ
  var TABLE = "<table cols='7' class='dpTable'  cellspacing='2px' cellpadding='2px'>" + crlf;਍  瘀愀爀 砀吀䄀䈀䰀䔀 㴀 ∀㰀⼀琀愀戀氀攀㸀∀ ⬀ 挀爀氀昀㬀ഀഀ
  var TR = "<tr class='dpTR'>";਍  瘀愀爀 吀刀开琀椀琀氀攀 㴀 ∀㰀琀爀㸀∀㬀ഀഀ
  var TR_days = "<tr class='dpDayTR'>";਍  瘀愀爀 吀刀开琀漀搀愀礀戀甀琀琀漀渀 㴀 ∀㰀琀爀 挀氀愀猀猀㴀✀搀瀀吀漀搀愀礀䈀甀琀琀漀渀吀刀✀㸀∀㬀ഀഀ
  var xTR = "</tr>" + crlf;਍  瘀愀爀 吀䐀 㴀 ∀㰀琀搀 挀氀愀猀猀㴀✀搀瀀吀䐀✀ 漀渀䴀漀甀猀攀伀甀琀㴀✀琀栀椀猀⸀挀氀愀猀猀一愀洀攀㴀尀∀搀瀀吀䐀尀∀㬀✀ 漀渀䴀漀甀猀攀伀瘀攀爀㴀✀ 琀栀椀猀⸀挀氀愀猀猀一愀洀攀㴀尀∀搀瀀吀䐀䠀漀瘀攀爀尀∀㬀✀ ∀㬀    ⼀⼀ 氀攀愀瘀攀 琀栀椀猀 琀愀最 漀瀀攀渀Ⰰ 戀攀挀愀甀猀攀 眀攀✀氀氀 戀攀 愀搀搀椀渀最 愀渀 漀渀䌀氀椀挀欀 攀瘀攀渀琀ഀഀ
  var TD_title = "<td colspan=5 class='dpTitleTD'>";਍  瘀愀爀 吀䐀开戀甀琀琀漀渀猀 㴀 ∀㰀琀搀 挀氀愀猀猀㴀✀搀瀀䈀甀琀琀漀渀吀䐀✀ 眀椀搀琀栀㴀✀㄀　─✀㸀∀㬀ഀഀ
  var TD_todaybutton = "<td colspan=7 class='dpTodayButtonTD'><hr/>";਍  瘀愀爀 吀䐀开搀愀礀猀 㴀 ∀㰀琀搀 挀氀愀猀猀㴀✀搀瀀䐀愀礀吀䐀✀㸀∀㬀ഀഀ
  var TD_selected = "<td class='dpDayHighlightTD' onMouseOut='this.className=\"dpDayHighlightTD\";' onMouseOver='this.className=\"dpTDHover\";' ";    // leave this tag open, because we'll be adding an onClick event਍  瘀愀爀 砀吀䐀 㴀 ∀㰀⼀琀搀㸀∀ ⬀ 挀爀氀昀㬀ഀഀ
  var DIV_title = "<div class='dpTitleText'>";਍  瘀愀爀 䐀䤀嘀开猀攀氀攀挀琀攀搀 㴀 ∀㰀搀椀瘀 挀氀愀猀猀㴀✀搀瀀䐀愀礀䠀椀最栀氀椀最栀琀✀㸀∀㬀ഀഀ
  var xDIV = "</div>";਍ ഀഀ
  // start generating the code for the calendar table਍  瘀愀爀 栀琀洀氀 㴀 吀䄀䈀䰀䔀㬀ഀഀ
 ਍  ⼀⼀ 琀栀椀猀 椀猀 琀栀攀 琀椀琀氀攀 戀愀爀Ⰰ 眀栀椀挀栀 搀椀猀瀀氀愀礀猀 琀栀攀 洀漀渀琀栀 愀渀搀 琀栀攀 戀甀琀琀漀渀猀 琀漀ഀഀ
  // go back to a previous month or forward to the next month਍  栀琀洀氀 ⬀㴀 ∀㰀琀爀 挀氀愀猀猀㴀✀搀瀀吀椀琀氀攀吀刀✀㸀㰀琀搀 挀漀氀猀瀀愀渀㴀✀㜀✀ 瘀愀氀椀最渀㴀✀琀漀瀀✀㸀㰀琀愀戀氀攀 眀椀搀琀栀㴀✀㄀　　─✀ 挀攀氀氀猀瀀愀挀椀渀最㴀✀　瀀砀✀ 挀攀氀氀瀀愀搀搀椀渀最㴀✀　瀀砀✀㸀∀ഀഀ
  html += TR_title;਍  栀琀洀氀 ⬀㴀 吀䐀开戀甀琀琀漀渀猀 ⬀ 最攀琀䈀甀琀琀漀渀䌀漀搀攀夀攀愀爀⠀搀愀琀攀䘀椀攀氀搀一愀洀攀Ⰰ 琀栀椀猀䐀愀礀Ⰰ ⴀ㄀Ⰰ ∀☀氀琀㬀☀氀琀㬀∀⤀ ⬀ 砀吀䐀㬀⼀⼀ 㰀㰀 ⼀⼀ഀഀ
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, -1, "&lt;") + xTD;// < //਍  栀琀洀氀 ⬀㴀 吀䐀开琀椀琀氀攀 ⬀ 䐀䤀嘀开琀椀琀氀攀 ⬀ 洀漀渀琀栀䄀爀爀愀礀䰀漀渀最嬀 琀栀椀猀䐀愀礀嬀㄀崀 ⴀ ㄀ 崀⬀ 琀栀椀猀䐀愀礀嬀　崀 ⬀ 砀䐀䤀嘀 ⬀ 砀吀䐀㬀ഀഀ
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, 1, "&gt;") + xTD ;// > //਍  栀琀洀氀 ⬀㴀 吀䐀开戀甀琀琀漀渀猀 ⬀ 最攀琀䈀甀琀琀漀渀䌀漀搀攀夀攀愀爀⠀搀愀琀攀䘀椀攀氀搀一愀洀攀Ⰰ 琀栀椀猀䐀愀礀Ⰰ ㄀Ⰰ ∀☀最琀㬀☀最琀㬀∀⤀ ⬀ 砀吀䐀 㬀⼀⼀ 㸀㸀 ⼀⼀ഀഀ
  html += xTR;਍  栀琀洀氀 ⬀㴀 ∀㰀⼀琀愀戀氀攀㸀㰀⼀琀搀㸀㰀⼀琀爀㸀∀ഀഀ
 ਍  ⼀⼀ 琀栀椀猀 椀猀 琀栀攀 爀漀眀 琀栀愀琀 椀渀搀椀挀愀琀攀猀 眀栀椀挀栀 搀愀礀 漀昀 琀栀攀 眀攀攀欀 眀攀✀爀攀 漀渀ഀഀ
  html += TR_days;਍  瘀愀爀 椀㬀ഀഀ
  for(i = 0; i < dayArrayShort.length; i++)਍    栀琀洀氀 ⬀㴀 吀䐀开搀愀礀猀 ⬀ 搀愀礀䄀爀爀愀礀匀栀漀爀琀嬀椀崀 ⬀ 砀吀䐀㬀ഀഀ
  html += xTR;਍ ഀഀ
  // now we'll start populating the table with days of the month਍  栀琀洀氀 ⬀㴀 吀刀㬀ഀഀ
 ਍  ⼀⼀ 昀椀爀猀琀Ⰰ 琀栀攀 氀攀愀搀椀渀最 戀氀愀渀欀猀ഀഀ
  if(weekday != 6)਍  ऀ昀漀爀 ⠀椀 㴀 　㬀 椀 㰀㴀 眀攀攀欀搀愀礀㬀 椀⬀⬀⤀ഀഀ
    		html += TD + "&nbsp;" + xTD;਍ ഀഀ
  // now, the days of the month਍  瘀愀爀 氀攀渀 㴀 ㌀㄀㬀ഀഀ
  if( thisDay[1] > 6)਍ऀ  氀攀渀 㴀 ㌀　㬀ഀഀ
  if( thisDay[1] == 12 && !leap_persian(thisDay[0]))਍ऀ  氀攀渀 㴀 ㈀㤀㬀ഀഀ
਍  昀漀爀⠀瘀愀爀 搀愀礀一甀洀 㴀 琀栀椀猀䐀愀礀嬀㈀崀㬀 搀愀礀一甀洀 㰀㴀 氀攀渀㬀 搀愀礀一甀洀⬀⬀⤀ 笀ഀഀ
    TD_onclick = " onclick=\"updateDateField('" + dateFieldName + "', '" + getDateString(thisDay) + "');\">";਍    ഀഀ
    if (dayNum == day)਍      栀琀洀氀 ⬀㴀 吀䐀开猀攀氀攀挀琀攀搀 ⬀ 吀䐀开漀渀挀氀椀挀欀 ⬀ 䐀䤀嘀开猀攀氀攀挀琀攀搀 ⬀ 搀愀礀一甀洀 ⬀ 砀䐀䤀嘀 ⬀ 砀吀䐀㬀ഀഀ
    else਍      栀琀洀氀 ⬀㴀 吀䐀 ⬀ 吀䐀开漀渀挀氀椀挀欀 ⬀ 搀愀礀一甀洀 ⬀ 砀吀䐀㬀ഀഀ
    ਍    ⼀⼀ 椀昀 琀栀椀猀 椀猀 愀 䘀爀椀搀愀礀Ⰰ 猀琀愀爀琀 愀 渀攀眀 爀漀眀ഀഀ
    if (weekday == 5)਍ऀ    栀琀洀氀 ⬀㴀 砀吀刀 ⬀ 吀刀㬀ഀഀ
    weekday++;਍    眀攀攀欀搀愀礀 㴀 眀攀攀欀搀愀礀 ─ 㜀㬀ഀഀ
    ਍    ⼀⼀ 椀渀挀爀攀洀攀渀琀 琀栀攀 搀愀礀ഀഀ
    thisDay[2]++;਍  紀 ഀഀ
 ਍  ⼀⼀ 昀椀氀氀 椀渀 愀渀礀 琀爀愀椀氀椀渀最 戀氀愀渀欀猀ഀഀ
  if (weekday > 0) {਍    昀漀爀 ⠀椀 㴀 㘀㬀 椀 㸀眀攀攀欀搀愀礀㬀 椀ⴀⴀ⤀ഀഀ
      html += TD + "&nbsp;" + xTD;਍  紀ഀഀ
  html += xTR;਍ ഀഀ
  // add a button to allow the user to easily return to today, or close the calendar਍  栀琀洀氀 ⬀㴀 吀刀开琀漀搀愀礀戀甀琀琀漀渀 ⬀ 吀䐀开琀漀搀愀礀戀甀琀琀漀渀㬀ഀഀ
  var today = getTodayPersian();਍  栀琀洀氀 ⬀㴀 ∀㰀戀甀琀琀漀渀 挀氀愀猀猀㴀✀搀瀀吀漀搀愀礀䈀甀琀琀漀渀✀ 漀渀䌀氀椀挀欀㴀✀爀攀昀爀攀猀栀䐀愀琀攀倀椀挀欀攀爀⠀尀∀∀ ⬀ 搀愀琀攀䘀椀攀氀搀一愀洀攀 ⬀ ∀尀∀Ⰰ ∀ഀഀ
       + today[0] + ", " + today[1] + ", " + today[2] + ");'>&#1575;&#1605;&#1585;&#1608;&#1586;</button> ";਍⼀⼀  栀琀洀氀 ⬀㴀 ∀㰀戀甀琀琀漀渀 挀氀愀猀猀㴀✀搀瀀吀漀搀愀礀䈀甀琀琀漀渀✀ 漀渀䌀氀椀挀欀㴀✀爀攀昀爀攀猀栀䐀愀琀攀倀椀挀欀攀爀⠀尀∀∀ ⬀ 搀愀琀攀䘀椀攀氀搀一愀洀攀 ⬀ ∀尀∀⤀㬀✀㸀☀⌀㄀㔀㜀㔀㬀☀⌀㄀㘀　㔀㬀☀⌀㄀㔀㠀㔀㬀☀⌀㄀㘀　㠀㬀☀⌀㄀㔀㠀㘀㬀㰀⼀戀甀琀琀漀渀㸀 ∀㬀ഀഀ
  html += "<button class='dpTodayButton' onClick='updateDateField(\"" + dateFieldName + "\");'>&#1576;&#1587;&#1578;&#1606;</button>";਍  栀琀洀氀 ⬀㴀 砀吀䐀 ⬀ 砀吀刀㬀ഀഀ
 ਍  ⼀⼀ 愀渀搀 昀椀渀愀氀氀礀Ⰰ 挀氀漀猀攀 琀栀攀 琀愀戀氀攀ഀഀ
  html += xTABLE;਍ ഀഀ
  document.getElementById(datePickerDivID).innerHTML = html;਍  ⼀⼀ 愀搀搀 愀渀 ∀椀䘀爀愀洀攀 猀栀椀洀∀ 琀漀 愀氀氀漀眀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 琀漀 搀椀猀瀀氀愀礀 愀戀漀瘀攀 猀攀氀攀挀琀椀漀渀 氀椀猀琀猀ഀഀ
  adjustiFrame();਍紀ഀഀ
਍ഀഀ
/**਍䌀漀渀瘀攀渀椀攀渀挀攀 昀甀渀挀琀椀漀渀 昀漀爀 眀爀椀琀椀渀最 琀栀攀 挀漀搀攀 昀漀爀 琀栀攀 戀甀琀琀漀渀猀 琀栀愀琀 戀爀椀渀最 甀猀 戀愀挀欀 漀爀 昀漀爀眀愀爀搀ഀഀ
a month.਍⨀⼀ഀഀ
function getButtonCode(dateFieldName, dateVal, adjust, label)਍笀ഀഀ
  var newMonth = (dateVal[1] + adjust) % 12;਍  瘀愀爀 渀攀眀夀攀愀爀 㴀 搀愀琀攀嘀愀氀嬀　崀 ⬀ 瀀愀爀猀攀䤀渀琀⠀⠀搀愀琀攀嘀愀氀嬀㄀崀 ⬀ 愀搀樀甀猀琀⤀ ⼀ ㄀㈀⤀㬀ഀഀ
  if (newMonth < 1) {਍    渀攀眀䴀漀渀琀栀 ⬀㴀 ㄀㈀㬀ഀഀ
    newYear += -1;਍  紀ഀഀ
 ਍  爀攀琀甀爀渀 ∀㰀戀甀琀琀漀渀 挀氀愀猀猀㴀✀搀瀀䈀甀琀琀漀渀✀ 漀渀䌀氀椀挀欀㴀✀爀攀昀爀攀猀栀䐀愀琀攀倀椀挀欀攀爀⠀尀∀∀ ⬀ 搀愀琀攀䘀椀攀氀搀一愀洀攀 ⬀ ∀尀∀Ⰰ ∀ ഀഀ
                                + newYear + ", " + newMonth + ");'>" + label + "</button>";਍紀ഀഀ
਍昀甀渀挀琀椀漀渀 最攀琀䈀甀琀琀漀渀䌀漀搀攀夀攀愀爀⠀搀愀琀攀䘀椀攀氀搀一愀洀攀Ⰰ 搀愀琀攀嘀愀氀Ⰰ 愀搀樀甀猀琀Ⰰ 氀愀戀攀氀⤀ഀഀ
{਍  瘀愀爀 渀攀眀䴀漀渀琀栀 㴀 搀愀琀攀嘀愀氀嬀㄀崀㬀ഀഀ
  var newYear = (dateVal[0] + adjust);਍ഀഀ
  return "<button class='dpButton' onClick='refreshDatePicker(\"" + dateFieldName + "\", " ਍                                ⬀ 渀攀眀夀攀愀爀 ⬀ ∀Ⰰ ∀ ⬀ 渀攀眀䴀漀渀琀栀 ⬀ ∀⤀㬀✀㸀∀ ⬀ 氀愀戀攀氀 ⬀ ∀㰀⼀戀甀琀琀漀渀㸀∀㬀ഀഀ
}਍⼀⨀⨀ഀഀ
Convert a JavaScript Date object to a string, based on the dateFormat and dateSeparator਍瘀愀爀椀愀戀氀攀猀 愀琀 琀栀攀 戀攀最椀渀渀椀渀最 漀昀 琀栀椀猀 猀挀爀椀瀀琀 氀椀戀爀愀爀礀⸀ഀഀ
*/਍昀甀渀挀琀椀漀渀 最攀琀䐀愀琀攀匀琀爀椀渀最⠀搀愀琀攀嘀愀氀⤀ഀഀ
{਍  瘀愀爀 搀愀礀匀琀爀椀渀最 㴀 ∀　　∀ ⬀ 搀愀琀攀嘀愀氀嬀㈀崀㬀ഀഀ
  var monthString = "00" + (dateVal[1]);਍  搀愀礀匀琀爀椀渀最 㴀 搀愀礀匀琀爀椀渀最⸀猀甀戀猀琀爀椀渀最⠀搀愀礀匀琀爀椀渀最⸀氀攀渀最琀栀 ⴀ ㈀⤀㬀ഀഀ
  monthString = monthString.substring(monthString.length - 2);਍ ഀഀ
  switch (dateFormat) {਍    挀愀猀攀 ∀搀洀礀∀ 㨀ഀഀ
      return dayString + dateSeparator + monthString + dateSeparator + dateVal[0];਍    挀愀猀攀 ∀礀洀搀∀ 㨀ഀഀ
      return dateVal[0] + dateSeparator + monthString + dateSeparator + dayString;਍    挀愀猀攀 ∀洀搀礀∀ 㨀ഀഀ
    default :਍      爀攀琀甀爀渀 洀漀渀琀栀匀琀爀椀渀最 ⬀ 搀愀琀攀匀攀瀀愀爀愀琀漀爀 ⬀ 搀愀礀匀琀爀椀渀最 ⬀ 搀愀琀攀匀攀瀀愀爀愀琀漀爀 ⬀ 搀愀琀攀嘀愀氀嬀　崀㬀ഀഀ
  }਍紀ഀഀ
਍ഀഀ
/**਍䌀漀渀瘀攀爀琀 愀 猀琀爀椀渀最 琀漀 愀 䨀愀瘀愀匀挀爀椀瀀琀 䐀愀琀攀 漀戀樀攀挀琀⸀ഀഀ
*/਍昀甀渀挀琀椀漀渀 最攀琀䘀椀攀氀搀䐀愀琀攀⠀搀愀琀攀匀琀爀椀渀最⤀ഀഀ
{਍  瘀愀爀 搀愀琀攀嘀愀氀㬀ഀഀ
  var dArray;਍  瘀愀爀 搀Ⰰ 洀Ⰰ 礀㬀ഀഀ
 ਍  琀爀礀 笀ഀഀ
    dArray = splitDateString(dateString);਍    椀昀 ⠀搀䄀爀爀愀礀⤀ 笀ഀഀ
      switch (dateFormat) {਍        挀愀猀攀 ∀搀洀礀∀ 㨀ഀഀ
          d = parseInt(dArray[0], 10);਍          洀 㴀 瀀愀爀猀攀䤀渀琀⠀搀䄀爀爀愀礀嬀㄀崀Ⰰ ㄀　⤀㬀ഀഀ
          y = parseInt(dArray[2], 10);਍          戀爀攀愀欀㬀ഀഀ
        case "ymd" :਍          搀 㴀 瀀愀爀猀攀䤀渀琀⠀搀䄀爀爀愀礀嬀㈀崀Ⰰ ㄀　⤀㬀ഀഀ
          m = parseInt(dArray[1], 10);਍          礀 㴀 瀀愀爀猀攀䤀渀琀⠀搀䄀爀爀愀礀嬀　崀Ⰰ ㄀　⤀㬀ഀഀ
          break;਍        挀愀猀攀 ∀洀搀礀∀ 㨀ഀഀ
        default :਍          搀 㴀 瀀愀爀猀攀䤀渀琀⠀搀䄀爀爀愀礀嬀㄀崀Ⰰ ㄀　⤀㬀ഀഀ
          m = parseInt(dArray[0], 10);਍          礀 㴀 瀀愀爀猀攀䤀渀琀⠀搀䄀爀爀愀礀嬀㈀崀Ⰰ ㄀　⤀㬀ഀഀ
          break;਍      紀ഀഀ
      dateVal = new Array(y, m, d);਍    紀 攀氀猀攀 椀昀 ⠀搀愀琀攀匀琀爀椀渀最⤀ 笀ഀഀ
      dateVal = getTodayPersian();਍    紀 攀氀猀攀 笀ഀഀ
      dateVal = getTodayPersian();਍    紀ഀഀ
  } catch(e) {਍    搀愀琀攀嘀愀氀 㴀 最攀琀吀漀搀愀礀倀攀爀猀椀愀渀⠀⤀㬀ഀഀ
  }਍ ഀഀ
  return dateVal;਍紀ഀഀ
਍ഀഀ
/**਍吀爀礀 琀漀 猀瀀氀椀琀 愀 搀愀琀攀 猀琀爀椀渀最 椀渀琀漀 愀渀 愀爀爀愀礀 漀昀 攀氀攀洀攀渀琀猀Ⰰ 甀猀椀渀最 挀漀洀洀漀渀 搀愀琀攀 猀攀瀀愀爀愀琀漀爀猀⸀ഀഀ
If the date is split, an array is returned; otherwise, we just return false.਍⨀⼀ഀഀ
function splitDateString(dateString)਍笀ഀഀ
  var dArray;਍  椀昀 ⠀搀愀琀攀匀琀爀椀渀最⸀椀渀搀攀砀伀昀⠀∀⼀∀⤀ 㸀㴀 　⤀ഀഀ
    dArray = dateString.split("/");਍  攀氀猀攀 椀昀 ⠀搀愀琀攀匀琀爀椀渀最⸀椀渀搀攀砀伀昀⠀∀⸀∀⤀ 㸀㴀 　⤀ഀഀ
    dArray = dateString.split(".");਍  攀氀猀攀 椀昀 ⠀搀愀琀攀匀琀爀椀渀最⸀椀渀搀攀砀伀昀⠀∀ⴀ∀⤀ 㸀㴀 　⤀ഀഀ
    dArray = dateString.split("-");਍  攀氀猀攀 椀昀 ⠀搀愀琀攀匀琀爀椀渀最⸀椀渀搀攀砀伀昀⠀∀尀尀∀⤀ 㸀㴀 　⤀ഀഀ
    dArray = dateString.split("\\");਍  攀氀猀攀ഀഀ
    dArray = false;਍ ഀഀ
  return dArray;਍紀ഀഀ
਍⼀⨀⨀ഀഀ
Update the field with the given dateFieldName with the dateString that has been passed,਍愀渀搀 栀椀搀攀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀⸀ 䤀昀 渀漀 搀愀琀攀匀琀爀椀渀最 椀猀 瀀愀猀猀攀搀Ⰰ 樀甀猀琀 挀氀漀猀攀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 眀椀琀栀漀甀琀ഀഀ
changing the field value.਍ഀഀ
Also, if the page developer has defined a function called datePickerClosed anywhere on਍琀栀攀 瀀愀最攀 漀爀 椀渀 愀渀 椀洀瀀漀爀琀攀搀 氀椀戀爀愀爀礀Ⰰ 眀攀 眀椀氀氀 愀琀琀攀洀瀀琀 琀漀 爀甀渀 琀栀愀琀 昀甀渀挀琀椀漀渀 眀椀琀栀 琀栀攀 甀瀀搀愀琀攀搀ഀഀ
field as a parameter. This can be used for such things as date validation, setting default਍瘀愀氀甀攀猀 昀漀爀 爀攀氀愀琀攀搀 昀椀攀氀搀猀Ⰰ 攀琀挀⸀ 䘀漀爀 攀砀愀洀瀀氀攀Ⰰ 礀漀甀 洀椀最栀琀 栀愀瘀攀 愀 昀甀渀挀琀椀漀渀 氀椀欀攀 琀栀椀猀 琀漀 瘀愀氀椀搀愀琀攀ഀഀ
a start date field:਍⨀⼀ഀഀ
਍昀甀渀挀琀椀漀渀 搀愀琀攀倀椀挀欀攀爀䌀氀漀猀攀搀⠀搀愀琀攀䘀椀攀氀搀⤀ഀഀ
{਍  瘀愀爀 搀愀琀攀伀戀樀 㴀 最攀琀䘀椀攀氀搀䐀愀琀攀⠀搀愀琀攀䘀椀攀氀搀⸀瘀愀氀甀攀⤀㬀ഀഀ
  var today = new Date();਍  琀漀搀愀礀 㴀 最攀琀吀漀搀愀礀倀攀爀猀椀愀渀㄀⠀⤀㬀⼀⼀渀攀眀 䐀愀琀攀⠀琀漀搀愀礀⸀最攀琀䘀甀氀氀夀攀愀爀⠀⤀Ⰰ 琀漀搀愀礀⸀最攀琀䴀漀渀琀栀⠀⤀Ⰰ 琀漀搀愀礀⸀最攀琀䐀愀琀攀⠀⤀⤀㬀ഀഀ
  //if (dateField.name == "StartDate") {਍    椀昀 ⠀⠀搀愀琀攀伀戀樀嬀　崀 㴀㴀 琀漀搀愀礀嬀　崀⤀ ☀☀ ⠀搀愀琀攀伀戀樀嬀㄀崀 㴀㴀 琀漀搀愀礀嬀㄀崀⤀ ☀☀ ⠀搀愀琀攀伀戀樀嬀㈀崀 㸀㴀 琀漀搀愀礀嬀㈀崀⤀⤀笀ഀഀ
      // if the date is before today, alert the user and display the datepicker again਍      愀氀攀爀琀⠀∀䐀㜆䄆✆ ⨀✆ㄆ찆⸆찆 䈀⠆䐆 ✀㈆ ✀䔆ㄆ䠆㈆ ㄀✆ ✀䘆⨆⸆✆⠆ ꤀䘆찆⼆∆⤀㬀ഀഀ
      dateField.value = "";਍      ⼀⼀搀漀挀甀洀攀渀琀⸀最攀琀䔀氀攀洀攀渀琀䈀礀䤀搀⠀搀愀琀攀倀椀挀欀攀爀䐀椀瘀䤀䐀⤀⸀猀琀礀氀攀⸀瘀椀猀椀戀椀氀椀琀礀 㴀 ∀瘀椀猀椀戀氀攀∀㬀ഀഀ
      //adjustiFrame();਍    紀 攀氀猀攀 椀昀 ⠀搀愀琀攀伀戀樀嬀　崀 㰀㴀 ∀㄀㌀㠀㔀∀⤀笀ഀഀ
      alert("اطلاعات قبل از سال 1386 دردسترس نمی باشد");਍      搀愀琀攀䘀椀攀氀搀⸀瘀愀氀甀攀 㴀 ∀∀㬀ഀഀ
    }਍    攀氀猀攀笀ഀഀ
      // if the date is okay, set the EndDate field to 7 days after the StartDate਍      ⼀⼀搀愀琀攀伀戀樀⸀猀攀琀吀椀洀攀⠀搀愀琀攀伀戀樀⸀最攀琀吀椀洀攀⠀⤀ ⬀ ⠀㜀 ⨀ ㈀㐀 ⨀ 㘀　 ⨀ 㘀　 ⨀ ㄀　　　⤀⤀㬀ഀഀ
      //var endDateField = document.getElementsByName ("EndDate").item(0);਍      ⼀⼀攀渀搀䐀愀琀攀䘀椀攀氀搀⸀瘀愀氀甀攀 㴀 最攀琀䐀愀琀攀匀琀爀椀渀最⠀搀愀琀攀伀戀樀⤀㬀ഀഀ
      Anthem_InvokePageMethod('ShowMyDate',[dateObj[0],dateObj[1],dateObj[2]]);਍    紀ഀഀ
  //}਍紀ഀഀ
਍ഀഀ
function updateDateField(dateFieldName, dateString)਍笀ഀഀ
  var targetDateField = document.getElementsByName (dateFieldName).item(0);਍  椀昀 ⠀搀愀琀攀匀琀爀椀渀最⤀笀ഀഀ
    targetDateField.value = dateString;਍ 紀ഀഀ
  var pickerDiv = document.getElementById(datePickerDivID);਍  瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀瘀椀猀椀戀椀氀椀琀礀 㴀 ∀栀椀搀搀攀渀∀㬀ഀഀ
  pickerDiv.style.display = "none";਍ ഀഀ
  adjustiFrame();਍  琀愀爀最攀琀䐀愀琀攀䘀椀攀氀搀⸀昀漀挀甀猀⠀⤀㬀ഀഀ
 ਍  ⼀⼀ 愀昀琀攀爀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀 栀愀猀 挀氀漀猀攀搀Ⰰ 漀瀀琀椀漀渀愀氀氀礀 爀甀渀 愀 甀猀攀爀ⴀ搀攀昀椀渀攀搀 昀甀渀挀琀椀漀渀 挀愀氀氀攀搀ഀഀ
  // datePickerClosed, passing the field that was just updated as a parameter਍  ⼀⼀ ⠀渀漀琀攀 琀栀愀琀 琀栀椀猀 眀椀氀氀 漀渀氀礀 爀甀渀 椀昀 琀栀攀 甀猀攀爀 愀挀琀甀愀氀氀礀 猀攀氀攀挀琀攀搀 愀 搀愀琀攀 昀爀漀洀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀⤀ഀഀ
  if ((dateString) && (typeof(datePickerClosed) == "function"))਍  笀ഀഀ
    datePickerClosed(targetDateField);਍    紀㬀ഀഀ
}਍ഀഀ
਍⼀⨀⨀ഀഀ
Use an "iFrame shim" to deal with problems where the datepicker shows up behind਍猀攀氀攀挀琀椀漀渀 氀椀猀琀 攀氀攀洀攀渀琀猀Ⰰ 椀昀 琀栀攀礀✀爀攀 戀攀氀漀眀 琀栀攀 搀愀琀攀瀀椀挀欀攀爀⸀ 吀栀攀 瀀爀漀戀氀攀洀 愀渀搀 猀漀氀甀琀椀漀渀 愀爀攀ഀഀ
described at:਍ഀഀ
http://dotnetjunkies.com/WebLog/jking/archive/2003/07/21/488.aspx਍栀琀琀瀀㨀⼀⼀搀漀琀渀攀琀樀甀渀欀椀攀猀⸀挀漀洀⼀圀攀戀䰀漀最⼀樀欀椀渀最⼀愀爀挀栀椀瘀攀⼀㈀　　㌀⼀㄀　⼀㌀　⼀㈀㤀㜀㔀⸀愀猀瀀砀ഀഀ
*/਍昀甀渀挀琀椀漀渀 愀搀樀甀猀琀椀䘀爀愀洀攀⠀瀀椀挀欀攀爀䐀椀瘀Ⰰ 椀䘀爀愀洀攀䐀椀瘀⤀ഀഀ
{਍  ⼀⼀ 眀攀 欀渀漀眀 琀栀愀琀 伀瀀攀爀愀 搀漀攀猀渀✀琀 氀椀欀攀 猀漀洀攀琀栀椀渀最 愀戀漀甀琀 琀栀椀猀Ⰰ 猀漀 椀昀 眀攀ഀഀ
  // think we're using Opera, don't even try਍  瘀愀爀 椀猀开漀瀀攀爀愀 㴀 ⠀渀愀瘀椀最愀琀漀爀⸀甀猀攀爀䄀最攀渀琀⸀琀漀䰀漀眀攀爀䌀愀猀攀⠀⤀⸀椀渀搀攀砀伀昀⠀∀漀瀀攀爀愀∀⤀ ℀㴀 ⴀ㄀⤀㬀ഀഀ
  if (is_opera)਍    爀攀琀甀爀渀㬀ഀഀ
  ਍  ⼀⼀ 瀀甀琀 愀 琀爀礀⼀挀愀琀挀栀 戀氀漀挀欀 愀爀漀甀渀搀 琀栀攀 眀栀漀氀攀 琀栀椀渀最Ⰰ 樀甀猀琀 椀渀 挀愀猀攀ഀഀ
  try {਍    椀昀 ⠀℀搀漀挀甀洀攀渀琀⸀最攀琀䔀氀攀洀攀渀琀䈀礀䤀搀⠀椀䘀爀愀洀攀䐀椀瘀䤀䐀⤀⤀ 笀ഀഀ
      // don't use innerHTML to update the body, because it can cause global variables਍      ⼀⼀ 琀栀愀琀 愀爀攀 挀甀爀爀攀渀琀氀礀 瀀漀椀渀琀椀渀最 琀漀 漀戀樀攀挀琀猀 漀渀 琀栀攀 瀀愀最攀 琀漀 栀愀瘀攀 戀愀搀 爀攀昀攀爀攀渀挀攀猀ഀഀ
      //document.body.innerHTML += "<iframe id='" + iFrameDivID + "' src='javascript:false;' scrolling='no' frameborder='0'>";਍      瘀愀爀 渀攀眀一漀搀攀 㴀 搀漀挀甀洀攀渀琀⸀挀爀攀愀琀攀䔀氀攀洀攀渀琀⠀∀椀䘀爀愀洀攀∀⤀㬀ഀഀ
      newNode.setAttribute("id", iFrameDivID);਍      渀攀眀一漀搀攀⸀猀攀琀䄀琀琀爀椀戀甀琀攀⠀∀猀爀挀∀Ⰰ ∀樀愀瘀愀猀挀爀椀瀀琀㨀昀愀氀猀攀㬀∀⤀㬀ഀഀ
      newNode.setAttribute("scrolling", "no");਍      渀攀眀一漀搀攀⸀猀攀琀䄀琀琀爀椀戀甀琀攀 ⠀∀昀爀愀洀攀戀漀爀搀攀爀∀Ⰰ ∀　∀⤀㬀ഀഀ
      document.body.appendChild(newNode);਍    紀ഀഀ
    ਍    椀昀 ⠀℀瀀椀挀欀攀爀䐀椀瘀⤀ഀഀ
      pickerDiv = document.getElementById(datePickerDivID);਍    椀昀 ⠀℀椀䘀爀愀洀攀䐀椀瘀⤀ഀഀ
      iFrameDiv = document.getElementById(iFrameDivID);਍    ഀഀ
    try {਍      椀䘀爀愀洀攀䐀椀瘀⸀猀琀礀氀攀⸀瀀漀猀椀琀椀漀渀 㴀 ∀愀戀猀漀氀甀琀攀∀㬀ഀഀ
      iFrameDiv.style.width = pickerDiv.offsetWidth;਍      椀䘀爀愀洀攀䐀椀瘀⸀猀琀礀氀攀⸀栀攀椀最栀琀 㴀 瀀椀挀欀攀爀䐀椀瘀⸀漀昀昀猀攀琀䠀攀椀最栀琀 㬀ഀഀ
      iFrameDiv.style.top = pickerDiv.style.top;਍      椀䘀爀愀洀攀䐀椀瘀⸀猀琀礀氀攀⸀氀攀昀琀 㴀 瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀氀攀昀琀㬀ഀഀ
      iFrameDiv.style.zIndex = pickerDiv.style.zIndex - 1;਍      椀䘀爀愀洀攀䐀椀瘀⸀猀琀礀氀攀⸀瘀椀猀椀戀椀氀椀琀礀 㴀 瀀椀挀欀攀爀䐀椀瘀⸀猀琀礀氀攀⸀瘀椀猀椀戀椀氀椀琀礀 㬀ഀഀ
      iFrameDiv.style.display = pickerDiv.style.display;਍    紀 挀愀琀挀栀⠀攀⤀ 笀ഀഀ
    }਍ ഀഀ
  } catch (ee) {਍  紀ഀഀ
 ਍紀ഀഀ
਍⼀⨀ഀഀ
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=਍  ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ഀഀ
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=਍                䴀漀搀甀氀甀猀 昀甀渀挀琀椀漀渀 眀栀椀挀栀 眀漀爀欀猀 昀漀爀 渀漀渀ⴀ椀渀琀攀最攀爀猀⸀ ⴀⴀ㸀 㰀㰀㰀㰀㰀 䌀愀氀挀甀氀愀琀攀 倀攀爀猀椀愀渀 䐀愀琀攀 㸀㸀㸀㸀㸀ഀഀ
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=਍  ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ⴀ㴀ഀഀ
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=਍ഀഀ
*/਍ഀഀ
function mod(a, b)਍笀ഀഀ
    return a - (b * Math.floor(a / b));਍紀ഀഀ
਍昀甀渀挀琀椀漀渀 樀眀搀愀礀⠀樀⤀ഀഀ
{਍    爀攀琀甀爀渀 洀漀搀⠀䴀愀琀栀⸀昀氀漀漀爀⠀⠀樀 ⬀ ㄀⸀㔀⤀⤀Ⰰ 㜀⤀㬀ഀഀ
}਍ഀഀ
var Weekdays = new Array( "Sunday", "Monday", "Tuesday", "Wednesday",਍                          ∀吀栀甀爀猀搀愀礀∀Ⰰ ∀䘀爀椀搀愀礀∀Ⰰ ∀匀愀琀甀爀搀愀礀∀ ⤀㬀ഀഀ
਍⼀⼀  䰀䔀䄀倀开䜀刀䔀䜀伀刀䤀䄀一  ⴀⴀ  䤀猀 愀 最椀瘀攀渀 礀攀愀爀 椀渀 琀栀攀 䜀爀攀最漀爀椀愀渀 挀愀氀攀渀搀愀爀 愀 氀攀愀瀀 礀攀愀爀 㼀ഀഀ
਍昀甀渀挀琀椀漀渀 氀攀愀瀀开最爀攀最漀爀椀愀渀⠀礀攀愀爀⤀ഀഀ
{਍    爀攀琀甀爀渀 ⠀⠀礀攀愀爀 ─ 㐀⤀ 㴀㴀 　⤀ ☀☀ഀഀ
            (!(((year % 100) == 0) && ((year % 400) != 0)));਍紀ഀഀ
਍⼀⼀  䜀刀䔀䜀伀刀䤀䄀一开吀伀开䨀䐀  ⴀⴀ  䐀攀琀攀爀洀椀渀攀 䨀甀氀椀愀渀 搀愀礀 渀甀洀戀攀爀 昀爀漀洀 䜀爀攀最漀爀椀愀渀 挀愀氀攀渀搀愀爀 搀愀琀攀ഀഀ
਍瘀愀爀 䜀刀䔀䜀伀刀䤀䄀一开䔀倀伀䌀䠀 㴀 ㄀㜀㈀㄀㐀㈀㔀⸀㔀㬀ഀഀ
਍昀甀渀挀琀椀漀渀 最爀攀最漀爀椀愀渀开琀漀开樀搀⠀礀攀愀爀Ⰰ 洀漀渀琀栀Ⰰ 搀愀礀⤀ഀഀ
{਍    爀攀琀甀爀渀 ⠀䜀刀䔀䜀伀刀䤀䄀一开䔀倀伀䌀䠀 ⴀ ㄀⤀ ⬀ഀഀ
           (365 * (year - 1)) +਍           䴀愀琀栀⸀昀氀漀漀爀⠀⠀礀攀愀爀 ⴀ ㄀⤀ ⼀ 㐀⤀ ⬀ഀഀ
           (-Math.floor((year - 1) / 100)) +਍           䴀愀琀栀⸀昀氀漀漀爀⠀⠀礀攀愀爀 ⴀ ㄀⤀ ⼀ 㐀　　⤀ ⬀ഀഀ
           Math.floor((((367 * month) - 362) / 12) +਍           ⠀⠀洀漀渀琀栀 㰀㴀 ㈀⤀ 㼀 　 㨀ഀഀ
                               (leap_gregorian(year) ? -1 : -2)਍           ⤀ ⬀ഀഀ
           day);਍紀ഀഀ
਍⼀⼀  䨀䐀开吀伀开䜀刀䔀䜀伀刀䤀䄀一  ⴀⴀ  䌀愀氀挀甀氀愀琀攀 䜀爀攀最漀爀椀愀渀 挀愀氀攀渀搀愀爀 搀愀琀攀 昀爀漀洀 䨀甀氀椀愀渀 搀愀礀ഀഀ
਍昀甀渀挀琀椀漀渀 樀搀开琀漀开最爀攀最漀爀椀愀渀⠀樀搀⤀ 笀ഀഀ
    var wjd, depoch, quadricent, dqc, cent, dcent, quad, dquad,਍        礀椀渀搀攀砀Ⰰ 搀礀椀渀搀攀砀Ⰰ 礀攀愀爀Ⰰ 礀攀愀爀搀愀礀Ⰰ 氀攀愀瀀愀搀樀㬀ഀഀ
਍    眀樀搀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀樀搀 ⴀ 　⸀㔀⤀ ⬀ 　⸀㔀㬀ഀഀ
    depoch = wjd - GREGORIAN_EPOCH;਍    焀甀愀搀爀椀挀攀渀琀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀搀攀瀀漀挀栀 ⼀ ㄀㐀㘀　㤀㜀⤀㬀ഀഀ
    dqc = mod(depoch, 146097);਍    挀攀渀琀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀搀焀挀 ⼀ ㌀㘀㔀㈀㐀⤀㬀ഀഀ
    dcent = mod(dqc, 36524);਍    焀甀愀搀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀搀挀攀渀琀 ⼀ ㄀㐀㘀㄀⤀㬀ഀഀ
    dquad = mod(dcent, 1461);਍    礀椀渀搀攀砀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀搀焀甀愀搀 ⼀ ㌀㘀㔀⤀㬀ഀഀ
    year = (quadricent * 400) + (cent * 100) + (quad * 4) + yindex;਍    椀昀 ⠀℀⠀⠀挀攀渀琀 㴀㴀 㐀⤀ 簀簀 ⠀礀椀渀搀攀砀 㴀㴀 㐀⤀⤀⤀ 笀ഀഀ
        year++;਍    紀ഀഀ
    yearday = wjd - gregorian_to_jd(year, 1, 1);਍    氀攀愀瀀愀搀樀 㴀 ⠀⠀眀樀搀 㰀 最爀攀最漀爀椀愀渀开琀漀开樀搀⠀礀攀愀爀Ⰰ ㌀Ⰰ ㄀⤀⤀ 㼀 　ഀഀ
                                                  :਍                  ⠀氀攀愀瀀开最爀攀最漀爀椀愀渀⠀礀攀愀爀⤀ 㼀 ㄀ 㨀 ㈀⤀ഀഀ
              );਍    洀漀渀琀栀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀⠀⠀⠀礀攀愀爀搀愀礀 ⬀ 氀攀愀瀀愀搀樀⤀ ⨀ ㄀㈀⤀ ⬀ ㌀㜀㌀⤀ ⼀ ㌀㘀㜀⤀㬀ഀഀ
    day = (wjd - gregorian_to_jd(year, month, 1)) + 1;਍ഀഀ
    return new Array(year, month, day);਍紀ഀഀ
਍⼀⼀  䰀䔀䄀倀开倀䔀刀匀䤀䄀一  ⴀⴀ  䤀猀 愀 最椀瘀攀渀 礀攀愀爀 愀 氀攀愀瀀 礀攀愀爀 椀渀 琀栀攀 倀攀爀猀椀愀渀 挀愀氀攀渀搀愀爀 㼀ഀഀ
਍昀甀渀挀琀椀漀渀 氀攀愀瀀开瀀攀爀猀椀愀渀⠀礀攀愀爀⤀ഀഀ
{਍    爀攀琀甀爀渀 ⠀⠀⠀⠀⠀⠀礀攀愀爀 ⴀ ⠀⠀礀攀愀爀 㸀 　⤀ 㼀 㐀㜀㐀 㨀 㐀㜀㌀⤀⤀ ─ ㈀㠀㈀　⤀ ⬀ 㐀㜀㐀⤀ ⬀ ㌀㠀⤀ ⨀ 㘀㠀㈀⤀ ─ ㈀㠀㄀㘀⤀ 㰀 㘀㠀㈀㬀ഀഀ
}਍ഀഀ
//  PERSIAN_TO_JD  --  Determine Julian day from Persian date਍ഀഀ
var PERSIAN_EPOCH = 1948320.5;਍瘀愀爀 倀䔀刀匀䤀䄀一开圀䔀䔀䬀䐀䄀夀匀 㴀 渀攀眀 䄀爀爀愀礀⠀∀퐂저∀Ⰰ ∀케퐀저∀Ⰰഀഀ
                                 "Óå ÔäÈå", "åÇÑÔäÈå",਍                                 ∀脀찀 퐀저∀Ⰰ ∀찀∀Ⰰ ∀퐀저∀⤀㬀ഀഀ
਍昀甀渀挀琀椀漀渀 瀀攀爀猀椀愀渀开琀漀开樀搀⠀礀攀愀爀Ⰰ 洀漀渀琀栀Ⰰ 搀愀礀⤀ഀഀ
{਍    瘀愀爀 攀瀀戀愀猀攀Ⰰ 攀瀀礀攀愀爀㬀ഀഀ
਍    攀瀀戀愀猀攀 㴀 礀攀愀爀 ⴀ ⠀⠀礀攀愀爀 㸀㴀 　⤀ 㼀 㐀㜀㐀 㨀 㐀㜀㌀⤀㬀ഀഀ
    epyear = 474 + mod(epbase, 2820);਍ഀഀ
    return day +਍            ⠀⠀洀漀渀琀栀 㰀㴀 㜀⤀ 㼀ഀഀ
                ((month - 1) * 31) :਍                ⠀⠀⠀洀漀渀琀栀 ⴀ ㄀⤀ ⨀ ㌀　⤀ ⬀ 㘀⤀ഀഀ
            ) +਍            䴀愀琀栀⸀昀氀漀漀爀⠀⠀⠀攀瀀礀攀愀爀 ⨀ 㘀㠀㈀⤀ ⴀ ㄀㄀　⤀ ⼀ ㈀㠀㄀㘀⤀ ⬀ഀഀ
            (epyear - 1) * 365 +਍            䴀愀琀栀⸀昀氀漀漀爀⠀攀瀀戀愀猀攀 ⼀ ㈀㠀㈀　⤀ ⨀ ㄀　㈀㤀㤀㠀㌀ ⬀ഀഀ
            (PERSIAN_EPOCH - 1);਍紀ഀഀ
਍⼀⼀  䨀䐀开吀伀开倀䔀刀匀䤀䄀一  ⴀⴀ  䌀愀氀挀甀氀愀琀攀 倀攀爀猀椀愀渀 搀愀琀攀 昀爀漀洀 䨀甀氀椀愀渀 搀愀礀ഀഀ
਍昀甀渀挀琀椀漀渀 樀搀开琀漀开瀀攀爀猀椀愀渀⠀樀搀⤀ഀഀ
{਍    瘀愀爀 礀攀愀爀Ⰰ 洀漀渀琀栀Ⰰ 搀愀礀Ⰰ 搀攀瀀漀挀栀Ⰰ 挀礀挀氀攀Ⰰ 挀礀攀愀爀Ⰰ 礀挀礀挀氀攀Ⰰഀഀ
        aux1, aux2, yday;਍ഀഀ
਍    樀搀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀樀搀⤀ ⬀ 　⸀㔀㬀ഀഀ
਍    搀攀瀀漀挀栀 㴀 樀搀 ⴀ 瀀攀爀猀椀愀渀开琀漀开樀搀⠀㐀㜀㔀Ⰰ ㄀Ⰰ ㄀⤀㬀ഀഀ
    cycle = Math.floor(depoch / 1029983);਍    挀礀攀愀爀 㴀 洀漀搀⠀搀攀瀀漀挀栀Ⰰ ㄀　㈀㤀㤀㠀㌀⤀㬀ഀഀ
    if (cyear == 1029982) {਍        礀挀礀挀氀攀 㴀 ㈀㠀㈀　㬀ഀഀ
    } else {਍        愀甀砀㄀ 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀挀礀攀愀爀 ⼀ ㌀㘀㘀⤀㬀ഀഀ
        aux2 = mod(cyear, 366);਍        礀挀礀挀氀攀 㴀 䴀愀琀栀⸀昀氀漀漀爀⠀⠀⠀㈀㄀㌀㐀 ⨀ 愀甀砀㄀⤀ ⬀ ⠀㈀㠀㄀㘀 ⨀ 愀甀砀㈀⤀ ⬀ ㈀㠀㄀㔀⤀ ⼀ ㄀　㈀㠀㔀㈀㈀⤀ ⬀ഀഀ
                    aux1 + 1;਍    紀ഀഀ
    year = ycycle + (2820 * cycle) + 474;਍    椀昀 ⠀礀攀愀爀 㰀㴀 　⤀ 笀ഀഀ
        year--;਍    紀ഀഀ
    yday = (jd - persian_to_jd(year, 1, 1)) + 1;਍    洀漀渀琀栀 㴀 ⠀礀搀愀礀 㰀㴀 ㄀㠀㘀⤀ 㼀 䴀愀琀栀⸀挀攀椀氀⠀礀搀愀礀 ⼀ ㌀㄀⤀ 㨀 䴀愀琀栀⸀挀攀椀氀⠀⠀礀搀愀礀 ⴀ 㘀⤀ ⼀ ㌀　⤀㬀ഀഀ
    day = (jd - persian_to_jd(year, month, 1)) + 1;਍    爀攀琀甀爀渀 渀攀眀 䄀爀爀愀礀⠀礀攀愀爀Ⰰ 洀漀渀琀栀Ⰰ 搀愀礀⤀㬀ഀഀ
}਍ഀഀ
function calcPersian(year,month,day)਍笀ഀഀ
    var date,j;਍ഀഀ
    j = persian_to_jd(year,month,day);਍    搀愀琀攀 㴀 樀搀开琀漀开最爀攀最漀爀椀愀渀⠀樀⤀㬀ഀഀ
    weekday = jwday(j);਍    爀攀琀甀爀渀 渀攀眀 䄀爀爀愀礀⠀搀愀琀攀嬀　崀Ⰰ 搀愀琀攀嬀㄀崀Ⰰ 搀愀琀攀嬀㈀崀Ⰰ眀攀攀欀搀愀礀⤀㬀ഀഀ
}਍ഀഀ
//  calcGregorian  --  Perform calculation starting with a Gregorian date਍昀甀渀挀琀椀漀渀 挀愀氀挀䜀爀攀最漀爀椀愀渀⠀礀攀愀爀Ⰰ洀漀渀琀栀Ⰰ搀愀礀⤀ഀഀ
{਍    洀漀渀琀栀ⴀⴀ㬀ഀഀ
਍    瘀愀爀 樀Ⰰ 眀攀攀欀搀愀礀㬀ഀഀ
਍    ⼀⼀  唀瀀搀愀琀攀 䨀甀氀椀愀渀 搀愀礀ഀഀ
਍    樀 㴀 最爀攀最漀爀椀愀渀开琀漀开樀搀⠀礀攀愀爀Ⰰ 洀漀渀琀栀 ⬀ ㄀Ⰰ 搀愀礀⤀ ⬀ഀഀ
           (Math.floor(0 + 60 * (0 + 60 * 0) + 0.5) / 86400.0);਍ഀഀ
    //  Update Persian Calendar਍    瀀攀爀猀挀愀氀 㴀 樀搀开琀漀开瀀攀爀猀椀愀渀⠀樀⤀㬀ഀഀ
    weekday = jwday(j);਍    爀攀琀甀爀渀 渀攀眀 䄀爀爀愀礀⠀瀀攀爀猀挀愀氀嬀　崀Ⰰ 瀀攀爀猀挀愀氀嬀㄀崀Ⰰ 瀀攀爀猀挀愀氀嬀㈀崀Ⰰ眀攀攀欀搀愀礀⤀㬀ഀഀ
}਍ഀഀ
function getTodayGregorian()਍笀ഀഀ
    var t = new Date();਍    瘀愀爀 琀漀搀愀礀 㴀 渀攀眀 䐀愀琀攀⠀⤀㬀ഀഀ
਍    瘀愀爀 礀 㴀 琀漀搀愀礀⸀最攀琀夀攀愀爀⠀⤀㬀ഀഀ
    if (y < 1000) {਍        礀 ⬀㴀 ㄀㤀　　㬀ഀഀ
    }਍ഀഀ
    return new Array(y, today.getMonth() + 1, today.getDate(),t.getDay());਍紀ഀഀ
਍昀甀渀挀琀椀漀渀 最攀琀吀漀搀愀礀倀攀爀猀椀愀渀⠀⤀ഀഀ
{਍    瘀愀爀 琀 㴀 渀攀眀 䐀愀琀攀⠀⤀㬀ഀഀ
    var today = getTodayGregorian();਍ഀഀ
    var persian = calcGregorian(today[0],today[1],today[2]);਍    爀攀琀甀爀渀 渀攀眀 䄀爀爀愀礀⠀瀀攀爀猀椀愀渀嬀　崀Ⰰ瀀攀爀猀椀愀渀嬀㄀崀Ⰰ瀀攀爀猀椀愀渀嬀㈀崀Ⰰ琀⸀最攀琀䐀愀礀⠀⤀⤀㬀ഀഀ
}਍ഀഀ
function getTodayPersian1()਍笀ഀഀ
    var t = new Date();਍    瘀愀爀 琀漀搀愀礀 㴀 最攀琀吀漀搀愀礀䜀爀攀最漀爀椀愀渀⠀⤀㬀ഀഀ
਍    瘀愀爀 瀀攀爀猀椀愀渀 㴀 挀愀氀挀䜀爀攀最漀爀椀愀渀⠀琀漀搀愀礀嬀　崀Ⰰ琀漀搀愀礀嬀㄀崀Ⰰ琀漀搀愀礀嬀㈀崀⤀㬀ഀഀ
    return new Array(persian[0],persian[1],persian[2]);਍紀ഀഀ
਍ഀഀ
਍ഀഀ
