//// Helper methods to manipulate date/time
Date.prototype.addDays = function(value ) 
{  
    this.setTime( this.getTime() + value * 86400000 );  
    return this;  
};
  
Date.prototype.subtractDays = function(value ) 
{    
    this.setTime( this.getTime() - value * 86400000 );  
    return this;
};  


// Get the date of easter sunday in year 'a'
function getEaster(a)
{
   /// Start Calculate the date of easter sunday for the given year
   /// From: http://javascript.internet.com/math-related/calculator-for-easter-sunday.html
   if (a >= 2100) c=5;
   if (a < 2100) c=6;
   if (a > 2199) alert("you must enter a date between 1583 - 2199");
   if ( a<=1582) alert("you must enter a date between 1583 - 2199");
   s = a/4
   var b = Math.floor( s ) ;
   sn=(b+a+c)/7
   var d = Math.floor( sn ) ;
   sundaynumber = (sn-d)*7
   m =(a*1)+1
   g = m/19
   var e = Math.floor( g ) ;
   var goldennumber = (g-e)*19;
   var sundaynumber= Math.round(sundaynumber) ;
   if(a>2199) sundaynumber=7;
   if(a<=1582) sundaynumber=7;
   var goldennumber= Math.round(goldennumber) ;

   var t1= "April 16April 17April 18April 19April 20April 21April 15" ;
   var t2= "April  9April 10April  4April  5April  6April  7April  8" ;
   var t3= "March 26March 27March 28March 29March 30March 24March 25" ;
   var t4= "April 16April 17April 18April 12April 13April 14April 15" ;
   var t5= "April  2April  3April  4April  5April  6April  7April  1";
   var t6= "April 23April 24April 25April 19April 20April 21April 22" ;
   var t7= "April  9April 10April 11April 12April 13April 14April 15" ;
   var t8= "April  2April  3April  4March 29March 30March 31April  1";
   var t9= "April 23April 17April 18April 19April 20April 21April 22" ;
   var t10= "April  9April 10April 11April 12April  6April  7April  8" ;
   var t11= "March 26March 27March 28March 29March 30March 31April  1" ;
   var t12= "April 16April 17April 18April 19April 20April 14April 15" ;
   var t13= "April  9April  3April  4April  5April  6April  7April  8" ;
   var t14= "March 26March 27March 28March 29March 23March 24March 25" ;
   var t15= "April 16April 17April 11April 12April 13April 14April 15" ;
   var t16= "April  2April  3April  4April  5April  6March 31April  1" ;
   var t17= "April 23April 24April 18April 19April 20April 21April 22" ;
   var t18= "April  9April 10April 11April 12April 13April 14April 8" ;
   var t19= "April  2April  3March 28March 29March 30March 31April  1" ;

   if (goldennumber == 1) chart=t1;
   if (goldennumber == 2) chart=t2;
   if (goldennumber == 3) chart=t3;
   if (goldennumber == 4) chart=t4;
   if (goldennumber == 5) chart=t5;
   if (goldennumber == 6) chart=t6;
   if (goldennumber == 7) chart=t7;
   if (goldennumber == 8) chart=t8;
   if (goldennumber == 9) chart=t9;
   if (goldennumber == 10) chart=t10;
   if (goldennumber == 11) chart=t11;
   if (goldennumber == 12) chart=t12;
   if (goldennumber == 13) chart=t13;
   if (goldennumber == 14) chart=t14;
   if (goldennumber == 15) chart=t15;
   if (goldennumber == 16) chart=t16;
   if (goldennumber == 17) chart=t17;
   if (goldennumber == 18) chart=t18;
   if (goldennumber == 19) chart=t19;

   var easterSundaySpec = "Unknown";
   if (sundaynumber==6)  easterSundaySpec = (chart.substring(8,16) )+", "+a;
   if (sundaynumber==5)  easterSundaySpec = (chart.substring(16,24) )+", "+a;
   if (sundaynumber==4)  easterSundaySpec = (chart.substring(24,32) )+", "+a;
   if (sundaynumber==3)  easterSundaySpec = (chart.substring(32,40) )+", "+a;
   if (sundaynumber==2)  easterSundaySpec = (chart.substring(40,48) )+", "+a;
   if (sundaynumber==1)  easterSundaySpec = (chart.substring(48,56) )+", "+a;
   if (sundaynumber==0)  easterSundaySpec = (chart.substring(0,8) )+", "+a;

   easter = new Date(easterSundaySpec);
   return easter;
}


function ShowSeason(datespec)
{
  var now = new Date(datespec);

  var epiphany = new Date(now);
  epiphany.setDate(6);
  epiphany.setMonth(0);

  var easter = getEaster(now.getFullYear());

  // Lent - 7th Wednesday before Easter
  var lent = new Date(easter);
  lent.subtractDays((7 * 7) - 4);

  // HolyWeek - One week before Easter
  var holyWeek = new Date(easter);
  holyWeek.subtractDays(7);

  /// Pentecost - 7 weeks after Easter Sunday
  var pentecost = new Date(easter);
  pentecost.addDays(7 * 7);

  /// Start of trinity - one week after pentecost
  var trinity = new Date(pentecost);
  trinity.addDays(7);

  /// Start of normal/default - Sunday before Sept 12
  var normal = new Date(now);
  normal.setDate(12);
  normal.setMonth(8);
  normal.subtractDays((normal.getDay()==0)? 7: normal.getDay());

  /// Christmas
  var christmas = new Date(now);
  christmas.setMonth(11,24);

  /// Start of Advent - 4th sunday before Christmas
  var advent = new Date(christmas);
  advent.subtractDays((christmas.getDay()==0)? 7: christmas.getDay() + 3*7);

  // Determine which season we're currently in
  function season(name, start, end){
    this.start = start;
    this.end = end;
    this.name = name;
  }

  // Next epiphany
  var nextEpiphany = new Date(epiphany);
  nextEpiphany.setFullYear(epiphany.getFullYear() + 1);

  // Defines the seasons for "this" year
  var seasons = [
    new season("Epiphany", epiphany, lent),
    new season("Lent", lent, holyWeek),
    new season("Holyweek", holyWeek, easter),
    new season("Easter", easter, pentecost),
    new season("Pentecost", pentecost, trinity),
    new season("Trinity", trinity, normal),
    new season("Default", normal, advent),
    new season("Advent", advent, christmas),
    new season("Christmas", christmas, nextEpiphany)
  ];

  // Determine which season we're in now
  var currentSeason = "default";
//  document.writeln("<table border=1 cellpadding=7>");
  for (var i = 0; i < seasons.length; i++) {
//      document.writeln("<tr><td>"+seasons[i].name + "</td><td>" + seasons[i].start.toDateString() + "</td><td>" + seasons[i].end.toDateString() + "</td></tr>");
      if (now.getTime() >= seasons[i].start.getTime() && now.getTime() < seasons[i].end.getTime()){
         currentSeason = seasons[i].name;
      }
  }
//  document.writeln("</table>");

  return currentSeason;
}
