// if two digit year input dates after this year considered 20 century.
var NUM_CENTYEAR = 30;

var calendars = [];
var RE_NUM = /^\-?\d+$/;

function calendar( obj_target )
{	// assigning methods
	this.gen_date = cal_gen_date;
	this.prs_date = cal_prs_date;
	this.prs_tsmp = cal_prs_tsmp;
	this.popup    = cal_popup;

	// validate input parameters
	if (!obj_target)
		return cal_error("Error calling the calendar: no target control specified");
	if (obj_target.value == null)
		return cal_error("Error calling the calendar: parameter specified is not valid target control");

	this.target        = obj_target;
	this.year_scroll   = true;
	this.form_submit   = false; //Changed

	// register in global collections
	this.id            = calendars.length;
	calendars[this.id] = this;
}

function cal_popup( str_datetime )
{	if (str_datetime)
	{	this.dt_current = this.prs_tsmp(str_datetime);
	}
	else
	{	this.dt_current = this.prs_tsmp(this.target.value);
		this.dt_selected = this.dt_current;
	}
	if (!this.dt_current) return;

	var obj_calwindow = window.open(
		'kalender.htm?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		'Kalender', 'width=200,height=190,status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'
	);
	obj_calwindow.opener = window;
	obj_calwindow.focus();
}

// date generating function
function cal_gen_date( dt_datetime )
{	return (
		  (dt_datetime.getDate()  < 10 ? '0' : '') +  dt_datetime.getDate()       + "."
		+ (dt_datetime.getMonth() <  9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "."
		+  dt_datetime.getFullYear()
	);
}

// timestamp parsing function
function cal_prs_tsmp( str_datetime )
{	// if no parameter specified return current timestamp
	if (!str_datetime)
		return (new Date());

	// if positive integer treat as milliseconds from epoch
	if (RE_NUM.exec(str_datetime))
		return new Date(str_datetime);

	// else treat as date in string format
	return this.prs_date(str_datetime);
}

// date parsing function
function cal_prs_date( str_date )
{	var arr_date = str_date.split('.');

	if (arr_date.length != 3)      return cal_error ("Ungültiges Datumformat: '" + str_date    + "'.\nAkzeptiertes Format ist TT.MM.JJJJ.");
	if (!arr_date[0])              return cal_error ("Ungültiges Datumformat: '" + str_date    + "'.\nKeine Tageszahl gefunden.");
	if (!RE_NUM.exec(arr_date[0])) return cal_error ("Ungültiger Tag: '"         + arr_date[0] + "'.\nErlaubte Werte sind ganze, positive Zahlen.");
	if (!arr_date[1])              return cal_error ("Ungültiges Datumformat: '" + str_date    + "'.\nKein Monat gefunden.");
	if (!RE_NUM.exec(arr_date[1])) return cal_error ("Ungültiger Monat: '"       + arr_date[1] + "'.\nErlaubte Werte sind ganze, positive Zahlen.");
	if (!arr_date[2])              return cal_error ("Ungültiges Datumformat: '" + str_date    + "'.\nKeine Jahreszahl gefunden.");
	if (!RE_NUM.exec(arr_date[2])) return cal_error ("Ungültiges Jahr: '"        + arr_date[2] + "'.\nErlaubte Werte sind ganze, positive Zahlen.");

	var dt_date = new Date();
	dt_date.setDate(1);

	if (arr_date[1] < 1 || arr_date[1] > 12) return cal_error ("Ungültiger Monat: '" + arr_date[1] + "'.\nErlaubte Werte sind von 01 bis 12.");
	dt_date.setMonth(arr_date[1]-1);

	if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
	dt_date.setFullYear(arr_date[2]);

	var dt_numdays = new Date(arr_date[2], arr_date[1], 0);
	dt_date.setDate(arr_date[0]);
	if (dt_date.getMonth() != (arr_date[1]-1)) return cal_error ("Ungültiger Tag: '" + arr_date[0] + "'.\nErlaubte Werte sind von 01 bis "+dt_numdays.getDate()+".");

	return( dt_date )
}

function cal_error( str_message )
{	alert( str_message );
	return null;
}

