function VTCalendar() {
	this.arrivalDate = '';
	
	this.initializeCalendar = function(iso_code) {
		YAHOO.namespace("vt.calendar");
		var arrivalDateSelected = function(type, args, obj) {
			var selected = args[0];
			var d = new Date(selected[0][0], parseInt(selected[0][1]) - 1, selected[0][2]);
			Calendar.arrivalDate = d;
			document.getElementById('hidden-arrival').value = selected[0][0]+'-'+Calendar.zeropad(selected[0][1], 2)+'-'+Calendar.zeropad(selected[0][2], 2);
			document.getElementById('arrival').value = Calendar.zeropad(selected[0][2], 2)+'-'+Calendar.zeropad(selected[0][1], 2)+'-'+selected[0][0];//+' ('+texts.uge+' '+d.getWeek()+')';
			this.hide();
			
			// update search results
			updateSearchScore()
		}
		
		var mindate = new Date();
		
		// arrival calendar
		YAHOO.vt.calendar.arrivalCalendar = new YAHOO.widget.CalendarGroup("arrivalCalendar",
																			"arrival_calendar_container",
																			{ 	pages: 				1,
																				SHOW_WEEK_HEADER:	true, 
																				title: 				"Vælg ankomstdato:",
																				close: 				true,
																				LOCALE_WEEKDAYS: 	"short",
																				START_WEEKDAY: 		1,
																				mindate: 			mindate
																			} );
		// Hvad er vores udgangsdato
		// Lav objekt
		var arrival = $("#hidden-arrival").val();
		if (arrival) {
			this.arrivalDate = new Date(arrival.substring(0,4), parseInt(arrival.substring(5,7)) - 1, arrival.substring(8,10));
			var currentDate = new Date();

			// Ligger datoen i fortiden eller i dag
			if (this.arrivalDate.getTime() <= currentDate.getTime()) {
				this.getNextSaturday();
			}
			this.localizeCalendar(YAHOO.vt.calendar.arrivalCalendar, iso_code);

			// Select-event handling
			YAHOO.vt.calendar.arrivalCalendar.selectEvent.subscribe(arrivalDateSelected, YAHOO.vt.calendar.arrivalCalendar, true);

			this.renderCalendar();

			YAHOO.util.Event.addListener("datepicker", "click", this.showArrivalCalendar, YAHOO.vt.calendar.arrivalCalendar, true);
		}
	}
	
	this.zeropad = function (num, count) {
		var num = num+''; // Så bliver det en streng
		while (num.length < count) {
			num = "0"+num;
		}
		return num;
	}
	
	this.insertDate = function(arrivalDate) {
		// Så indsætter vi datoen
		$("#hidden-arrival").val(this.zeropad(arrivalDate.getFullYear(), 2)+'-'+this.zeropad((arrivalDate.getMonth() + 1), 2)+'-'+arrivalDate.getDate());
		$("#arrival").val(this.zeropad(arrivalDate.getDate(), 2)+'-'+this.zeropad((arrivalDate.getMonth() + 1), 2)+'-'+arrivalDate.getFullYear()+' ('+texts.uge+' '+arrivalDate.getWeek()+')');
	}
	
	// Renders the calendar and makes the nescessary preprocessing of dates
	// regarding minivacation or not.
	this.renderCalendar = function() {
		if ( ! $("#minivacation").is(':checked')) {
			var today = new Date();
			// Så er der ikke tale om en miniferie - og eneste gyldige udgangspunkt er en lørdag
			if (this.arrivalDate.getDay() != 6) {
				this.getNextSaturday();
			}
			else if (this.arrivalDate.getDay() == 6 
				&& this.arrivalDate.getFullYear() == today.getFullYear()
				&& this.arrivalDate.getMonth() == today.getMonth()
				&& this.arrivalDate.getDate() == today.getDate()) {
				this.getNextSaturday();
			}
			
			var renderOnlySaturdays = function (workingDate, cell) {
				cell.innerHTML = workingDate.getDate();
				YAHOO.util.Dom.addClass(cell, workingDate.getDay() == 6 ? "selectable" : "not_selectable");
				return YAHOO.widget.Calendar.STOP_RENDER;
			}
			
			// Kun muligt at ankomme om lørdagen
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(1, renderOnlySaturdays);
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(2, renderOnlySaturdays);
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(3, renderOnlySaturdays);
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(4, renderOnlySaturdays);
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(5, renderOnlySaturdays);
			YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(6, renderOnlySaturdays);
		}
		else {
			YAHOO.vt.calendar.arrivalCalendar.removeRenderers();
			function customHighlightRenderer(workingDate, cell) {
                var found = false;
                for(i = 0; i < minivacation_periods.length; i++) {
					var from 	= minivacation_periods[i].from;
					var to 		= minivacation_periods[i].to;
					if(workingDate.getTime() > from.getTime() && workingDate.getTime() < to.getTime()) {
						$(cell).addClass("selectable");
						$(cell).removeClass("not_selectable");
						found = true;
						break;
					}
                }
                if ( ! found) {
                	$(cell).html(workingDate.getDate());
					$(cell).addClass("not_selectable");
					$(cell).addClass("previous");
					$(cell).removeClass("selectable");
					return YAHOO.widget.Calendar.STOP_RENDER;
                }
            }
			
            for (var i = 1; i <= 7; i++) {
            	YAHOO.vt.calendar.arrivalCalendar.addWeekdayRenderer(i, customHighlightRenderer);
            }
		}
		
		this.insertDate(this.arrivalDate);
		
		// make sure the previously chosen date is marked as such
		YAHOO.vt.calendar.arrivalCalendar.deselectAll();
		YAHOO.vt.calendar.arrivalCalendar.select(this.arrivalDate);
		
		// Make sure we're on the right page
		var selectedDate = YAHOO.vt.calendar.arrivalCalendar.getSelectedDates();
		if (selectedDate = selectedDate.shift()) {
			YAHOO.vt.calendar.arrivalCalendar.cfg.setProperty('pagedate', selectedDate);
		}
		YAHOO.vt.calendar.arrivalCalendar.render();
	}
	
	this.getNextSaturday = function() {
		var postData = {'currently_selected': $("#hidden-arrival").val()};
			$.post('/index.php?page_label=ajax&mode=next_saturday', postData, function (data, textStatus) {
				if (textStatus == 'success') {
					var saturday = data.saturday.toString();
					var date = new Date(saturday.substring(0,4), parseInt(saturday.substring(5,7)) - 1, saturday.substring(8,10));
					Calendar.arrivalDate = date;
					Calendar.insertDate(Calendar.arrivalDate);
				}
			}, 'json');
	}
	
	this.showArrivalCalendar = function() {
		var coordinates = YAHOO.util.Dom.getXY("datepicker");
		YAHOO.vt.calendar.arrivalCalendar.show();
		YAHOO.util.Dom.setXY('arrival_calendar_container', coordinates);
	}
	
	this.localizeCalendar = function(calendar, iso_code)  {
		// Correct formats for Denmark: dd.mm.yyyy, dd.mm, mm.yyyy
		calendar.cfg.setProperty("DATE_FIELD_DELIMITER", ".");
		calendar.cfg.setProperty("MDY_DAY_POSITION", 1);
		calendar.cfg.setProperty("MDY_MONTH_POSITION", 2);
		calendar.cfg.setProperty("MDY_YEAR_POSITION", 3);
		calendar.cfg.setProperty("MD_DAY_POSITION", 1);
		calendar.cfg.setProperty("MD_MONTH_POSITION", 2);
		switch (iso_code) {
			case 'de':
				// Date labels for German locale
				calendar.cfg.setProperty("MONTHS_SHORT",   ["Jan", "Feb", "M\u00E4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]);
				calendar.cfg.setProperty("MONTHS_LONG",    ["Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
				calendar.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "D", "M", "D", "F", "S"]);
				calendar.cfg.setProperty("WEEKDAYS_SHORT", ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]);
				calendar.cfg.setProperty("WEEKDAYS_MEDIUM",["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"]);
				calendar.cfg.setProperty("WEEKDAYS_LONG",  ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]);
			break;
			case 'en':
				// Shouldn't be nescessary to do anything...
			break;
			case 'da':
			default:
				// Date labels for Danish locale
				calendar.cfg.setProperty("MONTHS_SHORT",   ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"]);
				calendar.cfg.setProperty("MONTHS_LONG",    ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"]);
				calendar.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "O", "T", "F", "L"]);
				calendar.cfg.setProperty("WEEKDAYS_SHORT", ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø"]);
				calendar.cfg.setProperty("WEEKDAYS_MEDIUM",["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"]);
				calendar.cfg.setProperty("WEEKDAYS_LONG",  ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"]);
			break;
		}
		
		return calendar
	}
}

Date.prototype.getWeek = function() {
	var onejan = new Date(this.getFullYear(),0,1);
	return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
}
