// if two digit year input dates after this year considered 20 century.
var NUM_CENTYEAR = 30;
var calendars = [];
var RE_NUM = /^\-?\d+$/;
function calendar1(obj_target) {
// assigning methods
	this.gen_date = cal_gen_date1;
	this.gen_tsmp = cal_gen_tsmp1;
	this.prs_date = validaDataCal;
	this.prs_tsmp = cal_prs_tsmp1;
	this.popup	= calendario;
// 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.maxDate='';
	this.minDate='';
	
	// register in global collections
	this.id = calendars.length;
	calendars[this.id] = this;
}
function calendario (str_data) {
	if (str_data) {
		this.dt_current = this.prs_tsmp(str_data);
	}
	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('calendar.asp?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		'Calendar', 'width=280,height=210,status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes');
	obj_calwindow.opener = window;
	obj_calwindow.focus();
}
// timestamp generating function
function cal_gen_tsmp1 (dt_datetime) {
	return(this.gen_date(dt_datetime));
}
// date generating function
function cal_gen_date1 (dt_datetime) {
	return (
		dt_datetime.getFullYear() + "-" 
		+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "-"
		+ (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate()
	);
}
// timestamp parsing function
function cal_prs_tsmp1 (str_data) {
	// se o campo data estiver vazio devolve a data atual
	if (!str_data)
		return (new Date());
// if positive integer treat as milliseconds from epoch
	if (RE_NUM.exec(str_data))
		return new Date(str_data);
// else treat as date in string format
	return this.prs_date(str_data);
}
// date parsing function
function validaDataCal (str_date) {
var data = str_date.split('-');
if (data.length != 3) return cal_error ("Formato de Data Inválido: '" + str_date + "'.\nIndicar data no formato dd-mm-yyyy.");
	if (!data[2]) return cal_error ("Formato de Data Inválido: '" + str_date + "'.\nAno inválido.");
	if (!RE_NUM.exec(data[2])) return cal_error ("Ano Inválido: '" + data[0] + "'.\nSó valores inteiros permitidos.");
	if (!data[1]) return cal_error ("Formato de Data Inválido: '" + str_date + "'.\nMês inválido.");
	if (!RE_NUM.exec(data[1])) return cal_error ("Mês Inválido: '" + data[1] + "'.\nSó valores inteiros permitidos.");
	if (!data[0]) return cal_error ("Formato de Data Inválido: '" + str_date + "'.\nDia inválido.");
	if (!RE_NUM.exec(data[0])) return cal_error ("Dia do Mês Inválido: '" + data[2] + "'.\nSó valores inteiros permitidos.");
var dt_date = new Date();
	dt_date.setDate(1);
if (data[1] < 1 || data[1] > 12) return cal_error ("Mês Inválido: '" + data[1] + "'.\nIntroduza um número entre 01-12.");
	dt_date.setMonth(data[1]-1);
if (data[0] < 100) data[0] = Number(data[0]) + (data[0] < NUM_CENTYEAR ? 2000 : 1900);
	dt_date.setFullYear(data[0]);
var dt_numdays = new Date(data[0], data[1], 0);
	dt_date.setDate(data[2]);
	if (dt_date.getMonth() != (data[1]-1)) return cal_error ("Dia do Mês Inválido: '" + data[2] + "'.\nIntroduza um número entre 01-"+dt_numdays.getDate()+".");
return (dt_date);
}
function cal_error (str_message) {
	alert (str_message);
	return null;
}

