/*
	Colección de javascripts para crear e manipular obxectos calendario fantástico
*/





/*	Primeiro obxecto que me determiña en función do mes e o ano, os dias e semanas do calendarios
-----------------------------------------------------------------------------------------------------*/

// Clase CalendarioCrearArray
function CalendarioCrearArray() {


	/*	PROPIEDADES PRIVADAS
		definense con var
	--------------------------------------------------------------------------------*/
	
	

	/*	PROPIEDADES PUBLICAS
	--------------------------------------------------------------------------------*/
	this.semana = new Array(); 
	this.diasMes = 0;
	this.primerDia = 0;
	this.semanasMes =0;
	
	
	// Metoidos get 
	this.getMes = function(){return this.mes}
	this.getYiar = function(){return this.year}
	
	
	
	
	// 																	METODOS publicos
	
	
	
	this.getNumeroDiasMes = getNumeroDiasMes; // Total dias mes (?) Método "importado" 	
	this.primerDiaMes = primerDiaMes; // 1º dia da semana do mes dado (Lun, martes, etc) Método "importado"
	
	
	/*	Función que inicializa o obxecto arrayCalendario, calculando
		parámetros varios.
	------------------------------------------------------------------*/
	this.init = function(mes, year){
		
		this.mes = mes; // 0 -11
		this.year = year;		
		this.comprobaLimitesFecha(); // Inicialmente comprobamos os límites de fechas
		this.diasMes = this.getNumeroDiasMes(this.mes, this.year);
		tmp = this.primerDiaMes(this.mes, this.year); // Primer dia mes (0 domingo  6 Sábado)
		this.primerDia = (tmp == 0) ? 7 : tmp; // Poñemos o 7 coma o domingo si ocurre	
		this.tempDays = this.primerDia + this.diasMes - 1;	 //si é 7 será 6 dias antes, logo 7-1	
		this.semanasMes = Math.ceil(this.tempDays / 7); // Total de semanas (filas) necesarias
		this.rellenaCalendario(false);	// Que podemos chamar de forma externa si se quere!!!
		
	}
	
	
	
	/* 	Método que rellena as celdas do array cos números dos días
	-----------------------------------------------------------------*/
	this.rellenaCalendario = function(debug) {
		
		// "Rellena" as celdas do array cos numeros dos dias
		var counter = 1;
		if(debug)document.write("Array para " + this.mes +"/" + this.year + "<br>");;
		
		for(j = 0; j < this.semanasMes; j++) {
			this.semana[j] = new Array(); // Array multidim. creamolo así	
			for(i = 0; i < 7; i++) {
			
				//Debug
				counter++;				
				tmp = counter - this.primerDia; 
				if(tmp  < 1 || tmp >this.diasMes)this.semana[j][i] = ""; 
				else this.semana[j][i] = tmp;
				if(debug)document.write("<br>" + j + ", " + i +" ==>" +  this.semana[j][i]); 			
			}		
		}
				
	}
	
	
	
	/*	Cando se realiza un cambio nun campo select hai que ter en conta os limites de fechas
		Por exemplo si o límite e 6-2009 e estamos en 11-2008, ao cambiar de ano non pode
		aparecer seleccionado 11-2009. Ademáis no campo select de meses non aparecerán meses
		superiores ao 6-2009. O mesmo se aplica cando baixas un ano.
	---------------------------------------------------------------------------------------------*/

	this.comprobaLimitesFecha = function(){
		
		//alert("Fechas previas á comprobación (en formato JS): " + this.mes + " - " + this.year + "\nFechas limite:" + fechasLimiteH[0] + " - " +fechasLimiteH[1] + " /// " + fechasLimiteH[2] + " - " +fechasLimiteH[3]);
		// Rangos de meses para o select
		if(this.year > fechasLimiteH[1]) mesInicial = 0; // Non é o 1º ano do rango?
		else mesInicial = parseInt(fechasLimiteH[0]);    // Estamos no 1º ano do rango
		
		if(this.year != fechasLimiteH[3]) mesFinal = 11; // Non é o ultimo ano do rango
		else mesFinal = parseInt(fechasLimiteH[2]); // Estamos no ultimo ano
		
		
		// Mes para o que amosar o calendario
		if(this.year == fechasLimiteH[3] && this.mes > fechasLimiteH[2])  // Estamonos pasando de mes por arriba
		this.mes = fechasLimiteH[2];
	
		if(this.year == fechasLimiteH[1] && this.mes < fechasLimiteH[0])  // Estamonos pasando de mes por arriba
		this.mes = fechasLimiteH[0];
		
		// Debug
		//document.write('<br>(debug) Fecha do calendario: ' + this.mes + '/' +this.year );
		//document.write('<br>(debug) Limites calendario (Year ' + this.year + ') ==> <b>Mes inicial:</b> ' + mesInicial + '. <b>Mes final:</b> ' + mesFinal );
		
		
	}

	
	
	
	
} // Fin clase CalendarioCrearArray *****************************************







// Clase Calendario
function Calendario(){
	
	// arrayFechas en principio será private!!!
	var arrayMeses = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
	var arrayDias = new Array("L", "M", "Mi", "J", "V", "S", "D");
	var tipoCalendario = 1;
	
	// Propiedades PUBLICAS(get)
	this.getTipoCalendario = function(){return this.tipoCalendario}
	
	this.setTipoCalendario = function(tipo){this.tipoCalendario = tipo}
	// METODOS privileged
	
	this.xGetElementById = xGetElementById; // Para o inner html, claro que se pode devolver o string case que mellor non??
	
	this.init = function(arrayFechas){ // Recibe un obxecto coas fechas 
		this.diasMes = arrayFechas.diasMes;
		this.primerDia = arrayFechas.primerDia; // Poñemos o 7 coma o domingo si ocurre	
		this.semanasMes = arrayFechas.semanasMes; // Total de semanas (filas) necesarias	
		this.mes = arrayFechas.mes; // Recoda que en JS van de 0 a 11
		this.year = arrayFechas.year;
		this.semana = new Array();
		this.semana = arrayFechas.semana;
	}
	
	this.faiCalendario = function(){
		this.creaCabecera(); // Cabeceira do calendario
		this.creaBody(); // Calendario
		this.creaFooter(); // pecha Calendario
		return this.html;	
	}
	
	
	this.creaCabecera = function() {
		/*	1ª fila: creamos un formulario con 2 select para escoller ano e mes. Obiamente os posibles valores dependerán da fecha e onde esteamos
			e dos límites si os hai. Por norma Xeral, o limite inferior sempre será dia actual si non se define.			
			2ª fila: dias da semana					*/
		this.html = "<table id=\"tablaMes\" class=\"tablaCalendario\">";
		this.html +="<tr class=\"cabecera\"><td colspan =\"7\">" + this.creaSelect() + "</td></tr>";
		this.html +="<tr class=\"nomeDias\">";
		for (x = 0; x < arrayDias.length; x ++) this.html += "<th class=\"diaSem\">" + arrayDias[x] + "</th>";
		this.html += "</tr>";
	}
	
	
	
	this.creaSelect = function(){
		/*
			Función para poñer os select de meses e anos. Facemos un select cos meses e anos dispoñibles.
			Recorda que esos valores dependerán dos limites de fechas.
		*/
		
	
		//alert("O mes inicial será " + mesInicial + " o seleccionado será " + this.mes);
		
		res = "<a href=\"javascript:actualizaFlechas(-1)\"><img src=\"imaxes/iconos/iconoLeft.png\" alt=\"Icono Left\" title=\"Mes anterior\" class=\"flechaLeft\"></a><select id=\"selectMes\" onchange=\"javascript:actualiza()\">";
		

		
		
		
		for(x = mesInicial ; x <= mesFinal ; x++){
			
			res += "<option value=\"" + x + "\" ";
			if(this.mes == x) res += " selected=\"selected\"";
			res += ">" + arrayMeses[x] + "</option>";
		}
		res +="</select>"; // Fin select meses	
		
		// Select de anos	
		res += "<select id=\"selectYear\" onchange=\"javascript:actualiza()\">";
		
		for(x = fechasLimiteH[1] ; x <=  fechasLimiteH[3] ; x++){
			res += "<option value=\"" + x + "\"";
			if(this.year == x) res += " selected=\"selected\"";
			res += ">" + x + "</option>";
		}
		res +="</select><a href=\"javascript:actualizaFlechas(1)\"><img src=\"imaxes/iconos/iconoRight.png\" alt=\"Icono Left\" title=\"Mes siguiente\" class=\"flechaRight\"></a>"; // Fin select años
		
		return res;
	}


	
	this.creaBody = function (){
	/*
		Método principal do calendario: encargase de formatealo.
	*/

	/*
		Agora defino o array que imos empregar para realizar a comprobación de fechas
		e ver que días son seleccionables, cales no e que estilo css asignar a cada un 
		
		- Calendario edicion de dias festivos: todos os dias seleccionables e con enlace (agás os que quedan fora dos límites).
		- Calendario edición de temporadas: todos os dias seleccionables con css normal ao seleccionar.
		- Calendario para escoller fechas de reserva: non seleccionables festivos, nin días xa escollidos. Marcalos en gris.
		
	*/
		
	

						
		for(j = 0; j < this.semanasMes; j++) {
		
			this.html += "<tr>";
			
			for (i = 0; i < 7; i++) {
				/*
					Miramos que fecha é a que imos poñer 
					Comproba fecha limite inferior e superior
					NON --> poñelo en gris
					
					Comproba si ese dia está libre na BBDD. Para elo temos que comprobar o array que ten os
					datos da táboa cos dias reservados en firme.
					¿Está ese día no array? SI --> marcalo como gris
											NON --> Comprobar si ese día xa está seleccionado (Javascript)
													¿Está ese día no array? SI --> marcalo como gris
																			NON --> dia seleccionable
				*/
				
				// Comparo fechas con inferior e superior. 
				atopado = 0;
				
				
				diaTmp = strtotimeJS (this.semana[j][i]+ '-' + this.mes + '-' + this.year);
				
				//document.write('<br>(debug) diaTmp:' +diaTmp );
		
						
				textoDia = this.semana[j][i] !="" ? this.semana[j][i] : "&nbsp;";
				
				
				if(this.semana[j][i] != ""){
				
					/*	Temos un dia do mes en curso.
						Mira si está no limite de fechas. Si non o está será un dia NON seleccionable (Gris)
						--------------------------------------------------------------------------------------*/
						
								
					if( diaTmp >= fechasLimite[0] && diaTmp <= fechasLimite[1]){
					
						/* 
							Día dentro dos límites inferior e superior.
						
							Agora miro que estilo aplicar ao día:
							Si tipocalendario 0 ou 1 busco en array fechasSesion
							Si tipoCalendario 2, busco nos 3 arrays por separado
							
						*/
						
						if(fechasSesion.inArray(diaTmp) != -1)
							// Día ESTÁ no array de fechas de sesión: está marcado
							tipoDia = 2; // Seleccionado e que se pode DEseleccionar
							
							
						else if(this.tipoCalendario == 2){
								
							if(fechasBBDD.inArray(diaTmp) != -1) tipoDia = 0; // Non seleccionable
							
							else if(fechasFestivos.inArray(diaTmp) != -1) tipoDia = 3; // Festivo non seleccionable
							
							else tipoDia = 1; // Seleccionable
							
						}else if(this.tipoCalendario == 3){
							
							if(fechasBBDD.inArray(diaTmp) != -1) tipoDia = 0; // Non seleccionable
							
							else if(fechasFestivos.inArray(diaTmp) != -1) tipoDia = 3; // Festivo non seleccionable
							
							else tipoDia = 1; // Seleccionable	
							
						}else tipoDia = 1; // Día seleccionable
						
												
											
					}else tipoDia = 0; // 1 dia non seleccionable (por estar fora dos límites máximos)
					
					
				}else tipoDia = -1; // día vacío, osease que non pertence ao mes en curso!!!
				
				switch(tipoDia){
					case -1:
					case 0: css = "diaNO";	enlace ='title="Dia no seleccionable"';	break;
					
					case 1: // dia seleccionable;
						if(this.tipoCalendario == 0){css = 'dia';}
						else if(this.tipoCalendario == 1){css="diaFestivoSeleccionable";}
						else css="dia";
						enlace ='onClick="clickDia('+ this.semana[j][i] + ',' + this.mes + ',' + diaTmp +')"';
						
					break;
					
					case 2: // dia seleccionado
						if(this.tipoCalendario == 0 || this.tipoCalendario==2){css = 'diaSel';}
						if(this.tipoCalendario == 1){css="diaFestivo";}						
						enlace ='onClick="clickDia('+ this.semana[j][i] + ',' + this.mes + ',' + diaTmp +')"';
					break;
					
					case 3: // dia festivo NON seleccionable. So Cando reservamos
						css="diaFestivo";
						enlace ='title="Dia no disponible / Festivo"';
					break;
				}
				
				
				
				// Formateo o día según o css (mimá)!!!
				//this.html += "<td class=\"" + css + "\" " +  enlace +">" + this.semana[j][i] + "</td>";
				
				this.html += '<td  class="'+ css + '"' +  enlace + '>' + textoDia + '</td>';
				

				
			} // fin bucle for 2
			
			this.html += "</tr>";
		} // fin bucle for 1
		
	} // fin creaBody
	
	
	
	
	
	
	this.creaFooter = function (){
		// pecha a tabla do calendario
		this.html += "</table></form>";
		this.html += "\n \n";
	}



}// Fin clase Calendario ********************************************************








/*	Esta función chamase tras facer click nun día e según sexa o calendario actuará.
	Podería metela noutro archivo.js pero aquí teñoa máis a man.
	Hai que personalizala para cada web na que empregemos o calendarios
------------------------------------------------------------------------------------------*/
function clickDia(dia, mes, timeStamp){
	
	/*	Miramos que fase coa fecha resibida
		Dependerá do tipo de calendario meuCalendario.getTipoCalendario()
		0 -> Calendario normal, multifecha e podendo escoller calquera dia entre os limites
		1 -> Calendario para escoller dias festivos
		2 -> Calendario multifecha. podes escoller calquera dia entre os límites e sempre que non sexa un festivo ou un xa gardado na BBDD (reservado)
		3 -> Calendario de fecha única. Fas click sobre unha fecha e devolvea. Ten en conta os limites, os festivos e os dias xa gardados na BBDD
	-------------------------------------------------------------------------------------------------------------------------------------------------------------*/

	switch(meuCalendario.getTipoCalendario()){

		case 0: // Normal, multiFecha podendo escoller todolos días	
		case 1: // Festivo, multiFecha, podendo escoller todolos días
		case 2: // Normal multifecha, podendo escoller solo os días que non sexan festivos nin xa escollidos
			if(fechasSesion.inArray(timeStamp) == -1){
				// a fecha seleccionada non está no array
				fechasSesion.push(timeStamp);
				//alert("Añadindo.Ahora temos: " +fechasSesion.length);
			}else{
				// A fecha seleccionada está no array. Hai q quitala
				i = fechasSesion.inArray(timeStamp); // indice
				//alert("Borrando i:" + i);
				fechasSesion.splice(i,1); // Quitar fecha	
				//alert("Borrando.Ahora temos: " +fechasSesion.length);
			}
			//alert(fechasSesion.length);
		break;
		
		
		case 3: /*	Calendario de selección de 1 día. Ao facer click sobre o día
					devolvese a fecha a 1 función.
					En principio teranase en conta tanto dias festivos, coma dias
					non seleccionables	
					Esta función sera personalizable
				-------------------------------------------------------------------*/
			
			devolveFechaCalendario(timeStamp);
			
		break;
		


	}
	//alert(dia + ", " + mes + ", " +timeStamp) ;
	actualizaCalendario(mes,year);
}


/* Control dos campos select
-----------------------------------*/
function actualiza(){
	
	// función que se encarga de actualizar a o calendario cando se cambia de mes/ano
	mes = xGetElementById('selectMes').options[xGetElementById('selectMes').selectedIndex].value;
	year = xGetElementById('selectYear').options[xGetElementById('selectYear').selectedIndex].value;
	//var fecha = new Array("1-" + mes + "-" + year, strtotime(1, mes, year)); // Fecha para a cal amosar o calendario
	actualizaCalendario(mes,year);
	//alert("Actualizando calendario");
	
}



/* Control das flechas de mes adiante / atrás
--------------------------------------------------*/
function actualizaFlechas(i){
	totalMeses 	= xGetElementById('selectMes').length
	mesActual 	= xGetElementById('selectMes').selectedIndex;
	totalAnos 	= xGetElementById('selectYear').length
	anoActual 	= xGetElementById('selectYear').selectedIndex;
	
	// Comproba si aumentar ou disminuir mes
	switch(i){
		case -1: // mes anterior
			if(mesActual == 0 && anoActual !=0){
				xGetElementById('selectYear').selectedIndex--;
				actualiza();
				
			}else if(mesActual !=0){
				xGetElementById('selectMes').selectedIndex--;
				actualiza()
				
			}
		break;
		
		case 1: // Mes seguinte
			if(mesActual != totalMeses -1){
				xGetElementById('selectMes').selectedIndex++;
				actualiza();
				
			}else if(mesActual == totalMeses-1 && anoActual != totalAnos -1){
				xGetElementById('selectYear').selectedIndex++;
				//xGetElementById('selectMes').selectedIndex = 0;
				actualiza()
				
			}	
		break;
	}
	
	
}




/*	Actualiza / presenta o calendario en pantalla, para o mes e ano espesificado!!
-----------------------------------------------------------------------------------------*/
function actualizaCalendario(mes,year){
	mes = parseInt(mes, 10); year = parseInt(year, 10);
	// si cambias de ano subindo --> mes enero, baixando mes diciembre
	if(ArrayFechas.getYiar() < year)mes = 0;
	if(ArrayFechas.getYiar() > year)mes = 11;
	
	ArrayFechas.init(mes, year); // Preparamos calendario básico, só fechas e dia de semana
	meuCalendario.init(ArrayFechas);
	html = meuCalendario.faiCalendario(); // Fai calendario e meteo nun string
	//xGetElementById('capaCalendario').innerHTML = html; // printamos o string	
	SetContainerHTML('capaCalendario', html, true)
}







/*#########################################################################################################################

						FIN DO JS PARA XESTIONAR OBXECTOS CALENDARIO
						
#########################################################################################################################*/





