var MPD=86400000;
var FEIERTAGE_CACHE=new Array();

// Datum des Ostersonntags im Jahre j für die Jahre 1583 - 2499
function getDateOfOsterSonntag(j){
  var f=28;
  if(j % 4 ==0 && j % 100 != 0 || j % 400 ==0)
    f=29;
   
  var m=-1;
  var n=-1; 
  if(j>=1583 && j<=1699){
    m=22;
    n=2;
  }else if(j>=1700 && j<=1799){
    m=23;
    n=3;
  }else if(j>=1800 && j<=1899){
    m=23;
    n=4;
  }else if(j>=1900 && j<=2099){
    m=24;
    n=5;
  }else if(j>=2100 && j<=2199){
    m=24;
    n=6;
  }else if(j>=2200 && j<=2299){
    m=25;
    n=0;
  }else if(j>=2300 && j<=2399){
    m=26;
    n=1;
  }else if(j>=2399 && j<=2499){
    m=25;
    n=1;
  }
  
  if(m==-1)
    return null;
  
  var a=j%19;
  var b=j%4;
  var c=j%7
  var d=(19*a+m)%30;
  var e=(2*b+4*c+6*d+n)%7;
  var o=31+f+21+d+e;
  if(o-f==87)
    o=o-7;
  else if(a>10 && d==28 && o-f==86)
    o=o-7
    
  var d1=new Date(j,0,1,12,0,0,0);

  return new Date(d1.getTime()+o*MPD);
}

// "Der Buss- und Bettag ist entweder der 3. Mittwoch im November oder 
//  der 22. November, falls der 1. November ein Mittwoch ist."
function getDateOfBussundBettag(j){
    
  var d=new Date(j,10,1);
  var wd=d.getDay();
  var diff=wd-3;
  if(diff<0)
    diff=7+diff;
        
  return new Date(j,10,22-diff);
}

function Feiertag(date,desc){
  this.date=date;
  this.desc=desc;
}

function getFeiertage(j){
  if(FEIERTAGE_CACHE[j])
    return FEIERTAGE_CACHE[j];
  
  var o=getDateOfOsterSonntag(j);
  
  if(o==null)
    return null;

  var ot=o.getTime();
    
  var ft=new Array();

  ft.push(new Feiertag(new Date(j,0,1),"Neujahr")); // Neujahr
  ft.push(new Feiertag(new Date(j,0,6),"Heilige 3 Könige")); // Heilige 3 Koenige
  ft.push(new Feiertag(new Date(j,4,1),"Maifeiertag")); // Maifeiertag
  ft.push(new Feiertag(new Date(j,7,15),"Mariä Himmelfahrt")); // Mariae Himmelfahrt
  ft.push(new Feiertag(new Date(j,9,3),"Tag der Deutschen Einheit")); // Tag der Deutschen Einheit
  ft.push(new Feiertag(new Date(j,9,31),"Reformationstag")); // Reformationstag
  ft.push(new Feiertag(new Date(j,10,1),"Allerheiligen")); // Allerheiligen
  ft.push(new Feiertag(new Date(j,11,25),"1. Weihnachtstag")); // 1. Weihnachtstag
  ft.push(new Feiertag(new Date(j,11,26),"2. Weihnachtstag")); // 2. Weihnachtstag
  ft.push(new Feiertag(new Date(ot-2*MPD),"Karfreitag")); // Karfreitag
  ft.push(new Feiertag(new Date(ot+MPD),"Ostermontag")); // Ostermontag
  ft.push(new Feiertag(new Date(ot+39*MPD),"Christi Himmelfahrt")); // Christi Himmelfahrt
  ft.push(new Feiertag(new Date(ot+50*MPD),"Pfingstmontag")); // Pfingstmontag
  ft.push(new Feiertag(new Date(ot+60*MPD),"Fronleichnam")); // Fronleichnam
  ft.push(new Feiertag(getDateOfBussundBettag(j),"Buß- und Bettag")); // Buss- und Bettag

ft.push(new Feiertag(new Date(j,1,19),"Test"));
  
  FEIERTAGE_CACHE[j]=ft;
  
  return ft;
}

