/*----------------------------------------------
	
	datepicker.js
	(c) 2010 Stefan Heule

----------------------------------------------*/

// NOTE: requires the method descendant from common.js
// NOTE: define dp_onclick_callback(year, month, day) in your project. this
//       method will be called, if the user selects a date.

/** datepicker variables */
var dp_year = false;
var dp_month = false;
var dp_names = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
var dp_selected = false;

/** function to select a date */
function dp_set_selection(year,month,day) {
	dp_selected = new Date(year,month,day,0,0,0,0);
}

/** reset the datepicker (current month and year) */
function dp_reset() {
	var today = new Date();
	dp_year = today.getFullYear();
	dp_month = today.getMonth();
	dp_render();
}

/** hide the datepicker */
function dp_hide() {
	document.getElementById('datepicker').innerHTML = '';
}

/** initialize the datepicker and show it */
function dp_init() {
	dp_reset();
	document.onmouseup = function(event) {
		// only when clicking on the outside of the help
		if (!event) {
			if(window.event) {
				//Internet Explorer
				event = window.event;
		    } else {
		    	//total failure, we have no way of referencing the event
		    	return;
		    }
		}
		var target = event.target || event.srcElement;
		if (descendant(document.getElementById('datepicker'), target)) return;
		
		dp_hide();
		document.onmouseup = null;
	};
	return false;
}

/** navigation in the datepicker (change month/year) */
function dp_nav(year_diff, month_diff) {
	var tmp = new Date(dp_year+year_diff, dp_month+month_diff, 1, 12, 0, 0, 0);
	dp_year = tmp.getFullYear();
	dp_month = tmp.getMonth();
	dp_render();
}

/** build the datepicker */
function dp_render() {
	
	var today = new Date();
	var it = new Date(dp_year, dp_month, 1, 0, 0, 0, 0);

	var i = it.getDay();
	if (i == 0)
		i = 7;
	i = i < 2 ? i - 1 + 7 : i - 1;
	it.setDate(it.getDate() - i);

	var html = '';
	var cl = '';

	// head (current month)
	html += '<table cellspacing="0"><tr class="dp_date"><td colspan="8"><p>'+dp_names[dp_month]+', '+dp_year+'</p></td></tr>';

	// navigation
	html += '<tr class="dp_nav"><td><p onclick="dp_nav(-1,0)">«</p></td><td><p onclick="dp_nav(0,-1)">‹</p></td>'+
		'<td colspan="4"><p onclick="dp_reset();">Heute</p></td><td><p onclick="dp_nav(0,1)">›</p></td><td><p onclick="dp_nav(1,0)">»</p></td></tr>';

	// table head
	html += '<tr class="dp_head"><td class="dp_weeknr"><p>wk</p></td><td><p>Mo</p></td><td><p>Di</p></td><td><p>Mi</p></td><td><p>Do</p>' +
		'</td><td><p>Fr</p></td><td><p class="dp_wkend">Sa</p></td><td><p class="dp_wkend">So</p></td></tr>';

	for ( var j = 0; j < 6; j++) {

		// table row start
		html += '<tr>';

		// weeknumber
		html += '<td class="dp_weeknr"><p>' + it.getWeek() + '</p></td>';

		for (i = 0; i < 7; i++) {
			
			// determin css classes
			cl = [];
			if (it.getDay() == 0 || it.getDay() == 6) cl.push('dp_wkend');
			if (it.getMonth() != dp_month) cl.push('dp_inactive');
			if (today.getDate() == it.getDate() && today.getMonth() == it.getMonth() && today.getFullYear() == it.getFullYear()) cl.push('dp_today');
			if (dp_selected && dp_selected.getDate() == it.getDate() && dp_selected.getMonth() == it.getMonth()
					&& dp_selected.getFullYear() == it.getFullYear()) cl.push('dp_selected');
			cl = cl.join(' ');
			if (cl != '') cl = ' '+cl;
			
			html += '<td class="dp_numbers'+cl+'" onclick="dp_onclick_callback('+it.getFullYear()+','+it.getMonth()+','+it.getDate()+')"><p>'+it.getDate()+'</p></td>';

			it.setDate(it.getDate() + 1);
		}

		html += '</tr>';
	}
	html += '</table>';
	
	document.getElementById('datepicker').innerHTML = html;
}


/**
 * Source (2010-01-30): http://www.meanfreepath.com/support/getting_iso_week.html
 * 
 * Returns the week number for this date. dowOffset is the day of week the week
 * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1
 * (Monday), the week returned is the ISO 8601 week number.
 * 
 * @param int
 *            dowOffset
 * @return int
 */
Date.prototype.getWeek = function(dowOffset) {
	/*
	 * getWeek() was developed by Nick Baicoianu at MeanFreePath:
	 * http://www.meanfreepath.com
	 */

	dowOffset = typeof (dowOffset) == 'int' ? dowOffset : 1; // default
																// dowOffset to
																// zero
	var newYear = new Date(this.getFullYear(), 0, 1);
	var day = newYear.getDay() - dowOffset; // the day of week the year begins
											// on
	day = (day >= 0 ? day : day + 7);
	var daynum = Math
			.floor((this.getTime() - newYear.getTime() - (this
					.getTimezoneOffset() - newYear.getTimezoneOffset()) * 60000) / 86400000) + 1;
	var weeknum;
	// if the year starts before the middle of a week
	if (day < 4) {
		weeknum = Math.floor((daynum + day - 1) / 7) + 1;
		if (weeknum > 52) {
			nYear = new Date(this.getFullYear() + 1, 0, 1);
			nday = nYear.getDay() - dowOffset;
			nday = nday >= 0 ? nday : nday + 7;
			/*
			 * if the next year starts before the middle of the week, it is week
			 * #1 of that year
			 */
			weeknum = nday < 4 ? 1 : 53;
		}
	} else {
		weeknum = Math.floor((daynum + day - 1) / 7);
	}
	return weeknum;
};






