var aDiasMes = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function obtenDiasMes(sMes,sAnio){
	if(sMes==1 && esBisiesto(sAnio)){
		return 29;
	}else{
		return aDiasMes[sMes];
	}
}

function obtenDiaDeLaSemana(d, m, a){
	var fechaAux = new Date(d, m-1, a);
	return fechaAux.getDay()==0 ? 7 : fechaAux.getDay();
}

function esBisiesto(aa) {
	return (((aa % 4 == 0) && (aa % 100 != 0)) || (aa % 400 == 0)) ? 1 : 0;
}

function dateAdd(unidad,incremento,objFecha) {
	var milisegundo=1;
	var segundo=milisegundo*1000;
	var minuto=segundo*60;
	var hora=minuto*60;
	var dia=hora*24;
	var anio=dia*365;

	var newDate;
	var dVal=objFecha.valueOf();
	switch(unidad) {
		case 'ms': newDate=new Date(dVal+milisegundo*incremento); break;
		case 's': newDate=new Date(dVal+segundo*incremento); break;
		case 'mi': newDate=new Date(dVal+minuto*incremento); break;
		case 'h': newDate=new Date(dVal+hora*incremento); break;
		case 'd': newDate=new Date(dVal+dia*incremento); break;
		case 'y': newDate=new Date(dVal+anio*incremento); break;
	}
	return newDate;
}
	
function dateFormatAtn(dia,mes,anio){ 
	if(dia < 10) dia = '0' + dia;
	if(mes < 10) mes = '0' + mes;
	return (dia + '/' + mes + '/' + anio);
}

if(typeof window.XMLHttpRequest !== 'function' &&
 typeof window.ActiveXObject === 'function') {
	window.XMLHttpRequest = function() {
		try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}
		try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}
		try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}
		try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}
		throw new Error('failed to create an ActiveX XMLHTTP object');
	};
}

function ajaxCall(url, handler)  {
	var req = new XMLHttpRequest;
	if(!req)
		return null;

	req.open('GET', url, false); // get page synchronously 
	req.send(null);
	return req.responseText;
}

function ltrim(str, ch) {
	if (!ch) ch = '\\s';
	return str.replace(new RegExp('^' + ch + '+'), '');
}

function obtenAgenda(ajaxurl, mes, anio) {
	var agenda = {};
	agenda.tieneEvento = function (anio, mes, dia) {
		return agenda[new Date(anio, mes-1, dia).getTime().toString()];
	}

	var text = null;
	try {
		text = ajaxCall(ajaxurl.replace(/MES/, mes).replace(/ANIO/, anio));
	} catch(e) {}
	if (!text) return agenda;

	var eventos = text.split(/<\/evento>.*?<evento>/);
	for (var i = 0; i < eventos.length;  i++) {
		var fecha_inicio = /[^><]+(?=<\/fecha-inicio>)/.exec(eventos[i]);
		var fecha_fin = /[^><]+(?=<\/fecha-fin>)/.exec(eventos[i]);
		if (!fecha_inicio || !fecha_fin) continue;

		fecha_inicio = fecha_inicio[0].split('/', 3);
		fecha_fin = fecha_fin[0].split('/', 3);
		var i_anyo = parseInt(fecha_inicio[0]); var i_mes = parseInt(ltrim(fecha_inicio[1],'0'))-1; var i_dia = parseInt(ltrim(fecha_inicio[2],'0'));
		var f_anyo = parseInt(fecha_fin[0]); var f_mes = parseInt(ltrim(fecha_fin[1],'0'))-1; var f_dia = parseInt(ltrim(fecha_fin[2],'0'));
		var dt_fecha_inicio = new Date(i_anyo, i_mes, i_dia); var dt_fecha_fin = new Date(f_anyo, f_mes, f_dia);

		var dt_fecha = dt_fecha_inicio;
		while (dt_fecha.getTime() <= dt_fecha_fin.getTime()) {
			agenda[dt_fecha.getTime().toString()] = true;
			dt_fecha = dateAdd('d',1,dt_fecha);
		}
	}
	return agenda;
}

function pintaCalendario(mes, anio, url, ajaxurl){
	var hoy = new Date();
	var diaActual = hoy.getDate(); var mesActual = hoy.getMonth() + 1; var anioActual = hoy.getFullYear();
	var cal = dom.$('calendario');
	
	// Enlaces siguiente y anterior
	var cadenaMesAnterior = mes == 1 ? 12 : (mes - 1);
	var anioAnterior = mes == 1 ? (anio - 1) : anio;
	var enlaceAnt = dom.$('cal_ant');
	if (enlaceAnt) {
		enlaceAnt.onclick = function () {
			if (!this.disabled) {
				this.disabled=true;
				pintaCalendario(cadenaMesAnterior, anioAnterior , url, ajaxurl);
			}
			return false;
		}
	}

	var cadenaMesSiguiente = mes == 12 ? 1 : (mes + 1);
	var anioSiguiente = mes == 12 ? (anio + 1) : anio;
	var enlaceSig = dom.$('cal_sig');
	if (enlaceSig) {
		enlaceSig.onclick = function () {
			if (!this.disabled) {
				this.disabled=true;
				pintaCalendario(cadenaMesSiguiente, anioSiguiente , url, ajaxurl);
			}
			return false;
		}
	}

	// Titulo
	var tabCaption = cal.getElementsByTagName('caption')[0];
	if (tabCaption)
		tabCaption.innerHTML = aNombresMes[mes-1] + ' ' + anio;
	
	var tabTitulo = dom.$("cal_titulo");
	if (tabTitulo)
		tabTitulo.innerHTML = aNombresMes[mes-1] + ' ' + anio;
	
	// Fija  la lista de dias y el número de semanas
	var tabMes = cal.getElementsByTagName('tbody')[0];

	var primeroDeMes = obtenDiaDeLaSemana(anio,mes,1);
	var totalDiasMes = obtenDiasMes(mes - 1, anio);
	var totalSemanas = Math.ceil((totalDiasMes + primeroDeMes - 1) / 7);

	var tabSemanas = tabMes.getElementsByTagName('tr');
	if (!tabSemanas) return;
	while (totalSemanas > tabMes.getElementsByTagName('tr').length) {
		var semana = document.createElement('tr');
		for (var i = 0; i < 7; i++) {
			var dia = document.createElement('td');
			dia.innerHTML = '&nbsp;';
			semana.appendChild(dia);
		}
		tabMes.appendChild(semana);
	}
	while (totalSemanas < tabMes.getElementsByTagName('tr').length) {
		tabMes.removeChild(tabMes.getElementsByTagName('tr')[0]);
	}
	tabSemanas = tabMes.getElementsByTagName('tr');
	
	// Obten los dias
	var contadorDias = 0; var diaDeLaSemana = 0; var semana = 0;
	while (contadorDias < totalDiasMes){
		diaDeLaSemana = (diaDeLaSemana%7) + 1;
		if (diaDeLaSemana == 1) semana += 1;
		var tabDia = tabSemanas[semana-1].getElementsByTagName('td')[diaDeLaSemana-1];
		
		if(contadorDias == 0 && diaDeLaSemana < primeroDeMes) {
			tabDia.className = null;
			tabDia.innerHTML = '&nbsp;';
			continue;
		}
		contadorDias += 1;

		tabDia.className = (anio == anioActual && mes == mesActual && contadorDias == diaActual)
							? 'agendaMarcado' 
							: null;

		tabDia.innerHTML = contadorDias;
	}
	while (diaDeLaSemana<7) {
		diaDeLaSemana += 1;
		var tabDia = tabSemanas[semana-1].getElementsByTagName('td')[diaDeLaSemana-1];
		tabDia.className = null;
		tabDia.innerHTML = '&nbsp;';
	}
	
	// Pinta los eventos
	var hasJsUrl = url && url.trim().indexOf('javascript:') == 0;
	var agenda = obtenAgenda(ajaxurl, mes, anio);
	tabSemanas = tabMes.getElementsByTagName('tr');
	var diaDeLaSemana = 0; var semana = 0;
	do {
		diaDeLaSemana = (diaDeLaSemana%7) + 1;
		if (diaDeLaSemana == 1) semana += 1;
		var tabDia = tabSemanas[semana-1].getElementsByTagName('td')[diaDeLaSemana-1];
		if (!/\d+/.test(tabDia.innerHTML)) continue;
		
		var dia = parseInt(tabDia.innerHTML);
		if (!agenda.tieneEvento(anio, mes, dia)) continue;
	
		if (anio != anioActual || mes != mesActual || dia != diaActual)
			tabDia.className = 'agendaEvento';
		if (hasJsUrl) {
			tabDia.innerHTML = '<a title="' + tit_event + ' ' + dia +'" href="#" onclick="' + url.replace(/^javascript:/i, "") + ';return false;">' + dia + '</td>';
		}else{
			var data = dateFormatAtn(dia, mes, anio);
			tabDia.innerHTML = '<a title="'+ tit_event +' ' + dia +'" href="'+ url.replace(/FECHA/g, data) +'">' + dia + '</td>';
		}
	} while(semana != totalSemanas || diaDeLaSemana != 7);
	
	if (enlaceAnt) enlaceAnt.disabled=false;
	if (enlaceSig) enlaceSig.disabled=false;
}
