﻿var offSet = 0;
var myDate = new Date();
var aktTag = myDate.getDate();
var aktMonat = myDate.getMonth();
var aktJahr = myDate.getFullYear();
var aktFTag;
myDate.setHours(0);
myDate.setMinutes(0);
myDate.setSeconds(0);
myDate.setMilliseconds(0);

var Monat = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
var MonatsLaenge = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function Feiertag () {
	if(this.holid) delete(this.holid);
	this.holid = new Date(arguments[2], arguments[1] - 1, arguments[0]);
	this.valid = new Array();

	this.link = arguments[4];
	
	if(arguments[3]) 
		this.name = arguments[3];
	else
		this.name = "";
	
	for(i=4; i<arguments.length; i++) {
		this.valid[i] = arguments[i];		
	}
}

function Ferien (inBeginn, inEnde, inName) { 
	
	
	this.link = arguments[3];
	
	inBeginn = inBeginn.split('.');
	this.beginn = new Date(0);
	this.beginn.setDate(inBeginn[0]);
	this.beginn.setMonth(inBeginn[1]-1);
	this.beginn.setFullYear(inBeginn[2]);
	
	inEnde = inEnde.split('.');
	this.ende = new Date(0);
	this.ende.setDate(inEnde[0]);
	this.ende.setMonth(inEnde[1]-1);
	this.ende.setFullYear(inEnde[2]);
	this.name = inName;
	this.inlist = false;
}



function past(day) {
	return( 
			( (day < aktTag) && ( myDate.getMonth() == aktMonat ) ) || 
			( (myDate.getMonth() < aktMonat) && (offSet < 0 )  ) || 
			  (myDate.getFullYear() < aktJahr )
		  );
}

function bookableHoliday (dte) {
	
	refDate = new Date();
	refDate.setDate(refDate.getDate()+2);
	if(dte.getFullYear())
		return (dte >= refDate);
	else return true;
}

function bookableBreaks(inBreak) {
	refDate = new Date();
	refDate.setDate(refDate.getDate()+3);
	if(inBreak.ende < refDate) return false;
	if(inBreak.beginn >= refDate){
		return inBreak.beginn;
	} else {
		return refDate;
	}
}

function isLeapYear(inYear){
	if (inYear % 4 != 0) return 28;
	if ((inYear % 100) == 0 && (inYear % 400) != 0) 
		return 28;
	else 
		return 29;
}

function flushLists () {
	if(myBreaks)	
		for(i=0; i<myBreaks.length; i++)
			myBreaks[i].inlist = false;
		for(i=0; i<FTage.length; i++)	
			FTage[i].inlist = false;
}

function writeResultTable() {
	
	if(document.getElementById('resultTable')){
		myResTab = document.getElementById('resultTable');
		myHolidayList = myResTab.getElementsByTagName('TBODY')[0];
		myBreaksList = myResTab.getElementsByTagName('TBODY')[1];
		while(myHolidayList.firstChild) myHolidayList.removeChild(myHolidayList.firstChild);
		while(myBreaksList.firstChild) myBreaksList.removeChild(myBreaksList.firstChild);
	
	
		myLand = document.choose.land.options[document.choose.land.selectedIndex].innerHTML;
		var flag = true;
		for(var i=0; i < FTage.length; i++) {
			if(FTage[i].inlist) {
				
				if(flag) {
					myFirstRow = document.createElement('TR');
					myHeader = document.createElement('TH');
					myHeaderData = document.createTextNode('Feiertage in '  + myLand + ':');
					myHolidayList.appendChild(myFirstRow);
					myFirstRow.appendChild(myHeader);
					myHeader.appendChild(myHeaderData);
					flag = false;
				}
				myRow = document.createElement('TR');
				if( (i%2) == 0) {
					myRow.className = 'gray';
				}
				
				myFirstCell = document.createElement('TD');
				myCellContainer = document.createElement('DIV');
				myCellSpan = document.createElement('SPAN');
				myFirstCellData = document.createTextNode(FTage[i].holid.getDate() + ". " + Monat[FTage[i].holid.getMonth()]  + ": " + FTage[i].name );
				
				string = FTage[i].link;
				
				if(string!=''){
					myLink = document.createElement('A');	
					myLinkData = document.createTextNode('Angebote');
					myHref = document.createAttribute('href');
					myHref.nodeValue = string;
					myLink.setAttributeNode(myHref);
				}			
	
				myFirstCell.appendChild(myCellContainer);
				if((bookableHoliday(FTage[i].holid)) && (string!='')){
					myCellContainer.appendChild(myLink);
					myLink.appendChild(myLinkData);
				}		
				myCellSpan.appendChild(myFirstCellData);			
				myCellContainer.appendChild(myCellSpan);
				myRow.appendChild(myFirstCell);
				myHolidayList.appendChild(myRow);			
			}
		}
	
		flag = true;
	
		if(myBreaks){
			for(var i=0; i < myBreaks.length; i++) {
				
				if(myBreaks[i].inlist) {
		
					if(flag) {
						myFirstRow = document.createElement('TR');
						myHeader = document.createElement('TH');
						myHeaderData = document.createTextNode('Schulferien in ' + myLand + ':');
						myHolidayList.appendChild(myFirstRow);
						myFirstRow.appendChild(myHeader);
						myHeader.appendChild(myHeaderData);
						flag = false;
					}
			
					myRow = document.createElement('TR');
					if( (i%2) == 0) {
						myRow.className = 'gray';
					}			
					myFirstCell = document.createElement('TD');
					myCellContainer = document.createElement('DIV');
					myCellSpan = document.createElement('SPAN');
					
					
					string = myBreaks[i].link;
					
					if(string!=''){
						myLink = document.createElement('A');	
						myLinkData = document.createTextNode('Angebote');
						myHref = document.createAttribute('href');
						myHref.nodeValue = string;
						myLink.setAttributeNode(myHref);
					}
					
					
					
					
					var period = myBreaks[i].beginn.getDate() + '. ';
					if(myBreaks[i].beginn.getMonth() != myBreaks[i].ende.getMonth())
						period += (Monat[myBreaks[i].beginn.getMonth()] + ' ');
					period += ('&ndash; ' + myBreaks[i].ende.getDate() + '. ');
					period += (Monat[myBreaks[i].ende.getMonth()] + ': ');
					period += myBreaks[i].name;											
																	
					myFirstCellData = document.createTextNode(period);
					myCellSpan.innerHTML = period;		
					if((bookableBreaks(myBreaks[i])) && (string!='')){
						myCellContainer.appendChild(myLink);
						myLink.appendChild(myLinkData);	
					}	
					myCellContainer.appendChild(myCellSpan);
					myFirstCell.appendChild(myCellContainer);
					myRow.appendChild(myFirstCell);
					myHolidayList.appendChild(myRow);			
				}else{
					return false;			
				}
			}
		}
	}
}


function isSchoolBreak (day, dte, firstTime) {
	heute = new Date(0);
	heute.setDate(day);
	heute.setMonth(dte.getMonth());
	heute.setFullYear(dte.getFullYear());

	state_id = document.choose.land.options[document.choose.land.selectedIndex].value
	if(!state_id) {
			return false;
	}
	
	myBreaks = ferien[state_id];
	
	if(myBreaks){
	
		for(n=0; n < myBreaks.length ; n++) {
			if( (heute >= myBreaks[n].beginn) && (heute <= myBreaks[n].ende )) {
				myBreaks[n].inlist = true;
				return true;
			}  
		}
		return false;
	}
}

function isApplicable (validArray) {
	if( validArray == "" ) {
		return true;
	} else {
		for (var m=0; m<validArray.length; m++) {
			if (validArray[m] == document.choose.land.options[document.choose.land.selectedIndex].value)
				return true;
		}
		return false; 
	} 
}

function isHoliday(day, dte) {
	aktFTag = false;

	for(var k=0; k<FTage.length; k++) {
		
		if( (day == FTage[k].holid.getDate()) && (dte.getMonth() == FTage[k].holid.getMonth()) && 
			((( dte.getFullYear() == FTage[k].holid.getFullYear() )  || (!FTage[k].holid.getFullYear() ) ))
		  ) {
		  	if (isApplicable(FTage[k].valid)){
			
				FTage[k].inlist = true;
				aktFTag = FTage[k];
				return FTage[k].name;
				
			} //else return true;
		}
	}
	return false;
}


function fillCalendars(move) {
	offSet += move;
	//myDate.setFullYear( myDate.getFullYear() + parseInt( (myDate.getMonth() + offSet) / 12 ) );
	//myDate.setMonth((myDate.getMonth() + offSet) % 12);
	myDate.setMonth(myDate.getMonth() + offSet );
	
	MonatsLaenge[1] = isLeapYear(myDate.getFullYear());
	for(var h=0; h<3; h++) {
	
		myDate.setDate(1);
		myDate.setMonth(myDate.getMonth() + h);
		
		switch (h) {
			
			case 0:
				myTable = document.getElementById('firstMonthTable');
				break;
				
			case 1:
				myTable = document.getElementById('secondMonthTable');
				break;
				
			case 2:
				myTable = document.getElementById('thirdMonthTable');
				break;				
				

		}
		
		if(myTable){
			myTable.getElementsByTagName('CAPTION')[0].lastChild.data = Monat[myDate.getMonth()] + " " + myDate.getFullYear();
			monthLength = MonatsLaenge[myDate.getMonth()];		
			day = 1;
			for (i=1; i<7; i++) {
				if(i==1) {
					for(j=0; j<7; j++) {
						if(j < ( (myDate.getDay() - (myDate.getDate()%7) + 7 )%7 ) ){ // Wochentag des Monatsersten
							myTable.rows[i].cells[j].innerHTML = "&nbsp;";
							myTable.rows[i].cells[j].className = "";
							myTable.rows[i].cells[j].title = "";
						} else {
							/*
							if( past(day) )
								myTable.rows[i].cells[j].style.fontWeight = "normal";
							else
								myTable.rows[i].cells[j].style.fontWeight = "bold";
							*/
							if(isSchoolBreak (day, myDate))	
								myTable.rows[i].cells[j].className = "break";
							else
								myTable.rows[i].cells[j].className = "";
								
							if( strg = isHoliday(day, myDate)) {
								myTable.rows[i].cells[j].className = "holiday";
								myTable.rows[i].cells[j].title = strg;
							} else {
								if(isSchoolBreak (day, myDate))	
									myTable.rows[i].cells[j].className = "break";
								else
								if( j>4 ) {
									myTable.rows[i].cells[j].className = "wkEnd";
								} else {
									myTable.rows[i].cells[j].className = "";								
								}
								myTable.rows[i].cells[j].title = "" ;
							}
								
							myTable.rows[i].cells[j].innerHTML = "<div>" + day + "</div>";
							day++;
						}
					}
				} else {	
					for(j=0; j<7; j++) {
						/*
						if( past(day) )
							myTable.rows[i].cells[j].style.fontWeight = "normal";
						else
							myTable.rows[i].cells[j].style.fontWeight = "bold";
						*/	
						if(isSchoolBreak (day, myDate, h))	
							myTable.rows[i].cells[j].className = "break";
						else
							myTable.rows[i].cells[j].className = "";	
							
						if( strg = isHoliday(day, myDate)) {
							myTable.rows[i].cells[j].className = "holiday";
							myTable.rows[i].cells[j].title = strg;
						} else {
							if(isSchoolBreak (day, myDate))	
								myTable.rows[i].cells[j].className = "break";
							else
								if( j>4 ) {
									myTable.rows[i].cells[j].className = "wkEnd";
								} else {
									myTable.rows[i].cells[j].className = "";								
								}
							myTable.rows[i].cells[j].title = "" ;
						}
	
								
						myTable.rows[i].cells[j].innerHTML = "<div>" + day + "</div>";
						if(day < monthLength)
							day++;
						else {
							day = "&nbsp;";
							if(myTable.rows[i].cells[j].innerHTML != monthLength )
								if( j>4 ) {
									myTable.rows[i].cells[j].className = "wkEnd";
								} else {
									myTable.rows[i].cells[j].className = "";								
								}
						}
					}
				}
			}
			myDate.setFullYear(aktJahr);
			myDate.setMonth(aktMonat + offSet);
		}
		
	}
	myDate.setMonth(aktMonat);
	myDate.setDate(aktTag);
	myDate.setFullYear(aktJahr);
	writeResultTable();
}


window.onload = function () {
	fillCalendars(0);
}