var dateLibrary = new Class({
	init: function(){},
	getMonthsNames: function(){return ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];},
	getNumberOfMonth: function(m){m = m[0].toUpperCase()+m.slice(1).toLowerCase();return this.getMonthsNames().indexOf(m)+1;},
	getMonthDays: function(m,a){
		//FIXME: si m no es numerico.
		var f = (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0)) ? 29 : 28;var months = [31,f,31,30,31,30,31,31,30,31,30,31];return months[m-1];
	},
	dateToObject: function(d){d = d.match(/([0-9]*)\-([0-9]*)\-([0-9]*)/);return {day:d[3].replace(/^0*/,""),monthNumber:d[2].replace(/^0*/,""),monthName:this.getMonthsNames()[d[2]-1],year:d[1]};},
	formatDateFriendly: function(d){
		d = d.match(/([0-9]*)\-([0-9]*)\-([0-9]*)/);
		return d[3]+" de "+this.getMonthsNames()[d[2]-1]+" de "+d[1];
	},
	formatLargeDateFriendly: function(d){d = d.match(/([0-9]*)\-([0-9]*)\-([0-9]*) ([0-9]*:[0-9]*)/); return parseInt(d[3],10)+" de "+this.getMonthsNames()[parseInt(d[2],10)-1]+" de "+d[1]+" a las "+d[4];}
});

function renderFormDate(day,month,year,daySelector,monthSelector,yearSelector, extra){
	/* Cada vez que modificamos uno de los selecctores volvemos a llamar a esta función para que
	 * recalcule el numero de dias de cada mes y si febrero es bisiesto añada 1 más. No permite
	 * fechas inferiores a 14 años desde la fecha actual.
	 */
	var restrictDate=false;
	
	var maxYear=parseInt((new Date()).getFullYear())+2;
	var h = $fix(yearSelector).empty();
	for(var a=maxYear;a>=parseInt((new Date()).getFullYear());a--){
		var se = (a == parseInt(year)) ? "selected" : "";
		var opcion = $C("OPTION",{innerHTML:a+"",value:a+"",selected:se+""},h);
	}
	h.onchange = function() { 
		renderFormDate(daySelector.value,monthSelector.value,yearSelector.value,daySelector,monthSelector,yearSelector, extra); 
		if (extra=='alta_sesion') VAR_apps['g_pacientes'].renderAgenda(daySelector.value, monthSelector.value, yearSelector.value);
	}
	if (yearSelector.value==maxYear) restrictDate=true;
	
	var maxMonth = 11;
	if (restrictDate)maxMonth=(new Date()).getMonth();
	var h = $fix(monthSelector).empty();
	$A(dateLib.getMonthsNames()).each(function(elem,num){
		var se = ((num+1) == parseInt(month)) ? "selected" : "";
		if ((restrictDate && num<=maxMonth) || !restrictDate){
			$C("OPTION",{innerHTML:elem+"",value:(num+1)+"",selected:se+""},h);
		}
	});
	h.onchange = function() { 
		renderFormDate(daySelector.value,monthSelector.value,yearSelector.value,daySelector,monthSelector,yearSelector, extra); 
		if (extra=='alta_sesion') VAR_apps['g_pacientes'].renderAgenda(daySelector.value, monthSelector.value, yearSelector.value);
	}

	var nDays = _dateLibrary.getMonthDays(month,year);
	if (restrictDate && monthSelector.value==maxMonth+1) nDays=(new Date()).getDate();
	
	var h = $fix(daySelector).empty();
	for(var a=1;a<=nDays;a++){
		var se = (a == parseInt(day)) ? "selected" : "";	
		var opcion = $C("OPTION",{innerHTML:a+"",value:a+"",selected:se+""},h);
	}
	h.onchange = function() { 
		renderFormDate(daySelector.value,monthSelector.value,yearSelector.value,daySelector,monthSelector,yearSelector, extra); 
		if (extra=='alta_sesion') VAR_apps['g_pacientes'].renderAgenda(daySelector.value, monthSelector.value, yearSelector.value);
	}
}

var dateLib = new dateLibrary();
var _dateLibrary = new dateLibrary();
