var currentDeliveryDate = new Date();
var months=["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"];
//var holidays=[new Date(2009, 11, 25), new Date(2009, 11, 26), new Date(2010, 0, 1), new Date(2010, 0, 2)];

function buildCal(showDate, deliveryDate)
{
	var today = new Date();
	if ((today.getHours() == 15 && today.getMinutes() >= 30) || today.getHours() > 15) // After 15:30
		today = new Date(today.getFullYear(), today.getMonth(), today.getDate()+1);

	currentDeliveryDate = deliveryDate;

	var dim=[31,0,31,30,31,30,31,31,30,31,30,31];
	dim[1]=(((showDate.getFullYear()%100!=0)&&(showDate.getFullYear()%4==0))||(showDate.getFullYear()%400==0))?29:28;

	// Calculate weekends
	deliverExtention = 4;
	var q = 1;
	var endDeliveryDate;
	while (q <= deliverExtention)
	{
		endDeliveryDate = new Date(deliveryDate.getFullYear(), deliveryDate.getMonth(), deliveryDate.getDate() + q);
		if (endDeliveryDate.getDay() == 0 || endDeliveryDate.getDay() == 1)
			deliverExtention++;
		else
			for (x=0;x<holidays.length;x++)
				if (!(endDeliveryDate < holidays[x]) && !(endDeliveryDate > holidays[x]))
					deliverExtention++;
		q++;
	}

	var firstDate		= new Date(showDate.getFullYear(), showDate.getMonth(), 1);

	if(firstDate.getDay()==0)
		var monthStartsOn = 7;
	else
		var monthStartsOn = firstDate.getDay();

	var previousMonth = showDate.getMonth()-1;
	var previousYear  = showDate.getFullYear();
	if(previousMonth == 0)
	{
		previousMonth=12;
		previousYear--;
	}

	var nextMonth	= showDate.getMonth()+1;
	var nextYear	= showDate.getFullYear();
	if(nextMonth == 13)
	{
		nextMonth = 1;
		nextYear++;
	}

	var t='<div>';
		t+='<table class="main" cols="7" cellpadding="0" border="0" cellspacing="0">';
		t+='<tr>';
			t+='<td colspan="1" align="center" class="previous_inactive" onclick="updateCalendar('+previousMonth+','+previousYear+', currentDeliveryDate);" onmouseover="this.className=\'previous_active\';" onmouseout="this.className=\'previous_inactive\';"></td>';
			t+='<td colspan="5" align="center" class="month">'+months[showDate.getMonth()]+' '+showDate.getFullYear()+'</td>';
			t+='<td colspan="1" align="center" class="next_inactive"  onclick="updateCalendar('+nextMonth+','+nextYear+', currentDeliveryDate);" onmouseover="this.className=\'next_active\';" onmouseout="this.className=\'next_inactive\';"></td>';
		t+='</tr>';
		t+='<tr>';
		for(s=0;s<7;s++)
			t+='<td class="daysofweek">'+"MDWDVZZ".substr(s,1)+'</td>';
		t+='</tr>';
		t+='<tr>';

	for(i=1;i<=42;i++)		//all days of a month. worst case scenario: month starts on Sunday, there will be a minimum of 6 weeks span.
	{
		//calculated the day of the week the month starts on. IE: month starts on Sunday, 7th day of the week ==> everything gets shifted 7 positions.
		var dateToShowID = ((i-monthStartsOn>=0)&&(i-monthStartsOn<dim[showDate.getMonth()]))? i-monthStartsOn+1 : '';
		var dateToShowText = ((i-monthStartsOn>=0)&&(i-monthStartsOn<dim[showDate.getMonth()]))? i-monthStartsOn+1 : '&nbsp;';

		var dateToShow = new Date(showDate.getFullYear(), showDate.getMonth(), i-monthStartsOn+1);

		if(dateToShowText < 10)										//all dates<10 must have a leading 0.
			dateToShowText = '0'+dateToShowText;
		
		var myClass 		  = "unselectable";
		var myJavaScriptStyle = "";

		// Selected delivery date
		if (!(dateToShow<deliveryDate) && !(dateToShow>deliveryDate))
			myClass = "delivery";
		
		// Any date after today
		else if(dateToShow > today)
		{
			myClass = "selectable";
			myJavaScriptStyle = 'onclick="selectDate('+dateToShow.getDate()+','+dateToShow.getMonth()+','+dateToShow.getFullYear()+');"';
		}

		// Possible delivery dates
		if(dateToShow > deliveryDate && dateToShow <= endDeliveryDate)
		{
			myClass = "canDeliver";
		}

		// Weekends
		if (dateToShow.getDay() == 0 || dateToShow.getDay() == 1)
		{
			myClass = "unselectable";
			myJavaScriptStyle = "";
		}

		// Holidays
		for (q=0;q<holidays.length;q++)
		{
			if (!(dateToShow<holidays[q]) && !(dateToShow>holidays[q]))
			{
				myClass = "unselectable";
				myJavaScriptStyle = "";
			}
		}

		t+='<td class="'+myClass+'" '+myJavaScriptStyle+' id="'+dateToShowID+'">'+dateToShowText+'</td>';

		if(i%7==0 && i<36)
		{
			t+='</tr>';
			if(i-monthStartsOn<dim[showDate.getMonth()])				//if the month spans on less than 6 weeks, make a break for it.
				t+='<tr>';
			else
				break;
		}
	}
		t+='</tr>';
		t+='</table>';
	t+='</div>';
	return t;
}

function selectDate(day, month, year)
{
	var selectedDate = new Date(year, month, day);
	var sendDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate() - 1);

	document.getElementById('date_input').value = Math.round(selectedDate.getTime()/1000);

	var dateString = "";
	dateString += sendDate.getDate();
	dateString += " ";
	dateString += months[sendDate.getMonth()].toLowerCase();
	dateString += " ";
	dateString += sendDate.getFullYear();
	document.getElementById('senddate_formatted').innerHTML = dateString;

	document.getElementById('calendar').innerHTML = buildCal(new Date(year, month, 1), new Date(year, month, day));
}

function updateCalendar(showMonth, showYear, delivery)
{
	document.getElementById('calendar').innerHTML = buildCal(new Date(showYear, showMonth, 1), delivery);
}