function Representacion_evento(v_tipo)
{
	this.tipo=v_tipo;
	this.dia=null;
	this.fecha=null;
	this.url=null;
	this.titulo=null;
}

Representacion_evento.prototype.cargar_desde_lector=function(l)
{
	this.dia=parseInt(l.posicion.atributos['d']);
	this.id=parseInt(l.posicion.atributos['id']);
	this.fecha=l.posicion.atributos['f'];
	this.url=l.posicion.atributos['url'];
	this.titulo=l.posicion.texto;
}

Representacion_evento.prototype.crear_item_listado=function()
{
	//var contenido=this.fecha+' - '+this.titulo;
	var contenido=this.titulo;

	var item=montar_elemento('li', 'item', null, null);
	var enlace=montar_enlace(this.url, null, contenido, item);

	return item;	
}

//Esta viene a ser una "extensión" del "Dia" que se puede encontrar como parte
//del Calendario_vf_extensible...

function Dia_modulo_agenda(v_fecha, v_padre)
{
	this.ARRAY_EVENTOS=Array();
	this.ARRAY_NOTICIAS=Array();

	Calendario_vf_extensible.prototype.Dia.prototype.extender.call(this, v_fecha, v_padre);
	this.crear();
}

Dia_modulo_agenda.prototype.calcular_clase=function()
{	
	if(this.ARRAY_EVENTOS.length)
	{
		this.clase_contenedor('con_evento');
	}
	else if(this.ARRAY_NOTICIAS.length)
	{
		this.clase_contenedor('con_noticia');
	}
}

Dia_modulo_agenda.prototype.poner_evento=function(l)
{
	var temp=new Representacion_evento(0);
	temp.cargar_desde_lector(l);
	this.ARRAY_EVENTOS.push(temp);
}

Dia_modulo_agenda.prototype.poner_noticia=function(l)
{
	var temp=new Representacion_evento(1);
	temp.cargar_desde_lector(l);
	this.ARRAY_NOTICIAS.push(temp);
}

Dia_modulo_agenda.prototype.generar_capa_info=function()
{
	var capa=montar_elemento('div', 'info_agenda');	
	var aquello=this;
/*
	capa.onmouseout=function(event) 
	{
		var evento=window.event ? window.event : event;
		var capa_destino=evento.relatedTarget || evento.fromElement;

		if(!es_descendiente_de(capa_destino, capa))
		{
			if(capa && capa.parentNode) 
			{
				eliminar_contenido(capa);
				capa.parentNode.removeChild(capa);
			}
		}
	}
*/

	capa.onmouseout=function(event) 
	{
		var evento=window.event ? window.event : event;
		//var capa_destino=evento.relatedTarget || evento.fromElement;
		var capa_destino=evento.relatedTarget || evento.toElement;

		if(!es_descendiente_de(capa_destino, capa))
		{
			if(capa && capa.parentNode) 
			{
				eliminar_contenido(capa);
				capa.parentNode.removeChild(capa);
			}
		}
	}

	var le=this.ARRAY_EVENTOS.length;
	var ln=this.ARRAY_NOTICIAS.length;
	var i;

	if(le)
	{
		var lista_eventos=montar_elemento('ul', 'eventos', null, capa);
		montar_elemento('li', 'titulo', MODULO_AGENDA.MENSAJES['eventos'], lista_eventos);

		for(i=0; i<le; i++)
		{
			lista_eventos.appendChild(this.ARRAY_EVENTOS[i].crear_item_listado());
		}
	}

	if(ln)
	{
		var lista_noticias=montar_elemento('ul', 'noticias', null, capa);
		montar_elemento('li', 'titulo', MODULO_AGENDA.MENSAJES['noticias'], lista_noticias);			

		for(i=0; i<ln; i++)
		{
			lista_noticias.appendChild(this.ARRAY_NOTICIAS[i].crear_item_listado());
		}
	}

	this.DOM_contenedor.appendChild(capa);
}

//Y esta es la clase principal, que tiene un poco de esto y un poco de aquello.

function Modulo_agenda()
{
	this.mes=null;
	this.anho=null;
	this.bloqueado=true;

	this.MENSAJES={por_defecto : '...'};
	this.mensajes_cargados=false;
	this.CALENDARIO=null;
	this.CARGANDO=null;
	this.DOM_CAPA_CONTENEDORA=null;

	this.DOM_MESES=null;
	this.DOM_BTN_ANTERIOR=null;
	this.DOM_BTN_SIGUIENTE=null;	
}

Modulo_agenda.prototype.comprobar=function()
{
	this.CARGANDO=document.getElementById('modulo_agenda_cargando');
	this.DOM_CAPA_CONTENEDORA=document.getElementById('modulo_agenda_calendario');

	this.DOM_MESES=document.getElementById('modulo_agenda_meses');
	this.DOM_BTN_ANTERIOR=document.getElementById('modulo_agenda_btn_anterior');
	this.DOM_BTN_SIGUIENTE=document.getElementById('modulo_agenda_btn_siguiente');

	return this.CARGANDO && this.DOM_CAPA_CONTENEDORA && this.DOM_MESES && this.DOM_BTN_ANTERIOR && this.DOM_BTN_SIGUIENTE;
}

Modulo_agenda.prototype.iniciar=function()
{
	this.generar_eventos();
	this.modificar_fecha();
	this.crear_calendario();
	this.actualizar_modulo();
}

Modulo_agenda.prototype.generar_eventos=function()
{
	var aquello=this;
	this.DOM_BTN_ANTERIOR.onclick=function() {aquello.navegar_btn_meses(-1);};
	this.DOM_BTN_SIGUIENTE.onclick=function() {aquello.navegar_btn_meses(1);};
}

Modulo_agenda.prototype.navegar_btn_meses=function(v_cantidad){if(!this.bloqueado) this.navegar(v_cantidad);}
Modulo_agenda.prototype.navegar=function(v_cantidad)
{
	var cantidad=parseInt(v_cantidad);
	var t_anho=this.anho;
	var t_mes=this.mes;

	t_mes+=cantidad;

	if(t_mes==0) 
	{
		t_mes=12;
		t_anho--;
	}
	else if(t_mes==13)
	{
		t_mes=1;
		t_anho++;
	}

	this.modificar_fecha(t_mes, t_anho);

	this.actualizar_modulo();
}

//MUCHO OJO... Aquí this NO es Modulo_agenda sino la clase Dia....
Modulo_agenda.prototype.click_dia=function()
{
	if(!this.padre.bloqueado && (this.ARRAY_NOTICIAS.length || this.ARRAY_EVENTOS.length))
	{
		this.generar_capa_info();
	}
}

Modulo_agenda.prototype.crear_calendario=function()
{
	this.CALENDARIO=new Calendario_vf_extensible('calendario');

	//Modificar la función "crear día" para poder usar la clase "Dia" 
	//personalizada... Mucho ojo, "this" aquí NO es la función sino es
	//el objeto "Calendario_extensible"..

	this.CALENDARIO.crear_dia=function(v_fecha)
	{
		var temp=new Dia_modulo_agenda(v_fecha, this);
		return temp;		
	}

	this.CALENDARIO.configurar_calendario(this.mes, this.anho);
	this.CALENDARIO.configurar_callbacks(this.click_dia);
	//this.CALENDARIO.iniciar();
}

Modulo_agenda.prototype.modificar_fecha=function(v_mes, v_anho)
{
	if(v_mes && v_anho)
	{
		this.mes=v_mes;
		this.anho=v_anho;
	}
	else
	{
		var t=new Date();
		this.mes=t.getMonth()+1;
		this.anho=t.getFullYear();
	}
}

Modulo_agenda.prototype.cargar_mensajes=function(l)
{
	var i=0;
	var cantidad=l.posicion.cuenta_nodos;
	l.bajar(0);

	for(i; i<cantidad; i++)
	{
		this.generar_mensaje(l.posicion);
		l.avanzar();
	}

	this.mensajes_cargados=true;
}

Modulo_agenda.prototype.generar_mensaje=function(v_nodo)
{
	var clave=v_nodo.atributos['clave'];
	var valor=v_nodo.texto;

	this.MENSAJES[clave]=valor;
}

Modulo_agenda.prototype.calcular_clases_calendario=function()
{
	var l=this.CALENDARIO.dias.length;
	var i;

	for(i=0; i<l; i++)
		this.CALENDARIO.dias[i].calcular_clase();
}

Modulo_agenda.prototype.actualizar_modulo=function()
{
	this.bloquear(true);

	var url=URL_WEB+'ajax/modulo_agenda.ajax.php?&modo=actualizar&m='+this.mes+'&a='+this.anho;
	var xml=new Lector_XML;
	xml.crear(url, this.procesar_actualizar_modulo, this, false);
}

Modulo_agenda.prototype.procesar_actualizar_modulo=function(v_xml)
{
	this.CALENDARIO.retirar();
	this.CALENDARIO.actualizar(this.mes, this.anho);

	var l=new Lector_doc(v_xml.raiz);
	l.bajar(0);
	
	var resultado=parseInt(l.obtener());
	var mensaje=l.obtener();

	if(resultado)
	{
		l.bajar(0);

		if(!this.mensajes_cargados)
		{
			var l_mensajes=new Lector_doc(l.posicion.actual);
			this.cargar_mensajes(l_mensajes);
		}

		l.avanzar();

		var anho=l.posicion.atributos['a'];
		var mes=l.obtener();

		this.actualizar_navegador(mes, anho);

		var l_eventos=new Lector_doc(l.posicion.actual);
		l.avanzar();
		var l_noticias=new Lector_doc(l.posicion.actual);

		this.cargar_nodos_tipo(l_eventos, 0);
		this.cargar_nodos_tipo(l_noticias, 1);

		this.calcular_clases_calendario();
	}

	this.visible_cargando(false);
	this.CALENDARIO.adjuntar(this.DOM_CAPA_CONTENEDORA);
	this.DOM_CAPA_CONTENEDORA.className='modulo_calendario';
	this.bloquear(false);

}

Modulo_agenda.prototype.actualizar_navegador=function(v_mes, v_anho) {this.DOM_MESES.innerHTML=v_mes+' '+v_anho;}
Modulo_agenda.prototype.bloquear=function(v_tipo) {this.bloqueado=v_tipo;}
Modulo_agenda.prototype.visible_cargando=function(v_tipo){this.CARGANDO.className=v_tipo===true ? '' : 'oculto';}

Modulo_agenda.prototype.cargar_nodos_tipo=function(l, v_tipo)
{
	var cantidad=l.posicion.atributos['t'];
	var i=0;
	l.bajar(0);

	for(i=0; i<cantidad; i++)
	{
		this.procesar_nodo_tipo(l, v_tipo);
		l.avanzar();
	}
}

Modulo_agenda.prototype.procesar_nodo_tipo=function(l, v_tipo)
{
	var dia=parseInt(l.posicion.atributos['d']);
	var dia_calendario=this.CALENDARIO.obtener_dia_mes_actual(dia);

	switch(v_tipo)
	{
		case 0: dia_calendario.poner_evento(l); break;
		case 1: dia_calendario.poner_noticia(l); break;
	}
}

