
function BahaiDate(timeToConvert, longitude, latitude)
 {
  var now = 'x'

  if(typeof(timeToConvert)=='string') 
   {
    now = new Date()
    now.setTime(Date.parse(timeToConvert))
   }

  if(isNaN(now)) 
   {
    if(isNaN(timeToConvert))   
     {
      now = new Date()
     }
    else 
     if(timeToConvert.constructor==Date) 
      {
       now = new Date(timeToConvert.getTime())
      }
     else  
      {
       now = new Date()
       now.setTime(timeToConvert)
      }
   }

  if(now==null) return   


  this.gDateTime = new Date(now.getTime())

 
  var gYear = now.getFullYear()


  var NawRuz = new Date(gYear,2,20)
      NawRuz.sunset(longitude, latitude)
      NawRuz.normalize(now)

  var lastNawRuz = new Date(gYear-1,2,20)
      lastNawRuz.sunset(longitude, latitude)
      lastNawRuz.normalize(now)

  var Loftiness1 = new Date(gYear,2,1)
      Loftiness1.sunset(longitude, latitude)
      Loftiness1.normalize(now)

  var AyyamiHa1 = new Date(gYear,1,25)
      AyyamiHa1.sunset(longitude, latitude)
      AyyamiHa1.normalize(now)

   
  var gDateSunset = new Date(now.getTime())
      gDateSunset.sunset(longitude, latitude)

  
  if(now < gDateSunset)
   {
    gDateSunset.setDate(gDateSunset.getDate()-1)
    gDateSunset.sunset(longitude, latitude)
   }
  gDateSunset.normalize(now)

    
  var afterNawRuz = (gDateSunset >= NawRuz)

  
  this.year = gYear - 1844 + afterNawRuz
  this.vahid = 1 + (this.year / 19)
  this.kullishay = 1 + (this.vahid / 19)

   
  if     (afterNawRuz)              { var sectionStart = NawRuz }
  else if(gDateSunset < AyyamiHa1)  { var sectionStart = lastNawRuz }
  else if(gDateSunset >= Loftiness1){ var sectionStart = Loftiness1 }
  else                              { var sectionStart = AyyamiHa1 }

  if     (sectionStart==Loftiness1) { this.month = 19 }
  else if(sectionStart==AyyamiHa1)  { this.month = 0 }
  else                              { this.month = 1 + (((gDateSunset - sectionStart) * msToDays) / 19) }

  this.day = 1 + (((gDateSunset - sectionStart) * msToDays) % 19)

  
  this.hours = ((now - gDateSunset)) * msToDays * 24
  this.minutes = (this.hours - Math.floor(this.hours)) * 60
  this.seconds = (this.minutes - Math.floor(this.minutes)) * 60

  
  for(e in this)
   {
    if(!isNaN(this[e])) { this[e]=Math.floor(this[e]) }
   }
 }



BahaiDate.prototype.toString = function()
 {
  return this.year + '/' + this.month + '/' + this.day
 }

BahaiDate.prototype.toValue = function()
 {
  return this.gDateTime.valueOf()
 }


BahaiDate.prototype.monthName = function(lang, variation)
 {
  return bDateNames[validateLang(lang,variation)][this.month]
 }

BahaiDate.prototype.dayName = function(lang, variation)
 {
  if(this.month!=0)
   {
    return bDateNames[validateLang(lang,variation)][this.day]
   }
  else
   {
    return bAyyamiHa[validateLang(lang,variation)][this.day-1]
   }
 }

BahaiDate.prototype.toStringDateTime = function()
 {
  return this.year + '/' + this.month + '/' + this.day + ' ' + this.hours + ':' + this.minutes
 }

BahaiDate.prototype.toNames = function(lang, variation)
 {
  return this.dayName(lang, variation) + ' of ' + this.monthName(lang, variation) + ', ' + this.year + ' BE'
 }



Date.prototype.sunset = function(longitude, latitude)
 {


  this.setHours(18,50,0,0)
 }


Date.prototype.normalize = function(compareTime)
 {

  if(!isNaN(compareTime))   
   {
    this.setMinutes(this.getMinutes() + compareTime.getTimezoneOffset() - this.getTimezoneOffset())
   }
 }


var daysToMS = 24 * 60 * 60 * 1000
var msToDays = 1 / daysToMS



var bDateNames = new Object
bDateNames['fa'+'noaccents']=['Ayyam-i-Ha','Baha','Jalal','Jamal','\'Azamat','Nur','Rahmat','Kalimat','Kamal','Asma\'','\'Izzat','Mashiyyat','\'Ilm','Qudrat','Qawl','Masa\'il','Sharaf','Sultan','Mulk','\'Ala']
bDateNames['fa'+'accents']=['Ayy&aacute;m-i-H&aacute;','Bah&aacute;','Jal&aacute;l','Jam&aacute;l','\'Azamat','N&uacute;r','Rahmat','Kalim&aacute;t','Kam&aacute;l','Asm&aacute;\'','\'Izzat','Ma<u>sh</u>&iacute;yyat','\'Ilm','Qudrat','Qawl','Mas&aacute;\'il','<u>Sh</u>araf','Sult&aacute;n','Mulk','\'Al&aacute;\'']
bDateNames['en']=['los Dias Intercalares','Esplendor','Gloria','Belleza','Grandeza','luz','Misericordia','Palabras','Perfecci&oacute;n','Nombres','Fuerza','Voluntad','Conocimiento','Poder','Expresion','Preguntas','Honor','Soberan&iacute;a','Dominio','Sublimidad']

var bAyyamiHa = new Object
bAyyamiHa['fa'+'noaccents']=['1','2','3','4','5']
bAyyamiHa['fa'+'accents']=['1','2','3','4','5']
bAyyamiHa['en']=['Primer','Segundo','Tercer','Cuarto','Quinto']

function validateLang(lang, variation)
 {
  switch (lang)
   {
    case 'en':  
      variation = ''
      break
    case 'fa': 
      if(variation!='noaccents') variation = 'accents'
      break
    default:
      lang = 'fa'
      variation = 'accents'
   }

  return lang + variation
 }


