

//funcion para cambiar de fecha el calendario (modo anual))
function changeCalendarDateMonth(calID, year)
{
	//primero, lo recojo
	var curYear=parseInt(year); //calendarValuesTable.get("currentYear"+calID);
	var curMonth=calendarValuesTable.get("currentMonth"+calID); //calendarValuesTable.get("currentYear"+calID);

	//guardo el anyo en el hastable
	calendarValuesTable.put("currentYear"+calID, curYear);
	
	//Cambio el titulo del anyo
//	var yTitle=document.getElementById("year_"+calID);
//	if(yTitle)
	document.getElementById("year_"+calID).innerHTML=curYear; //+" "+curYear
	
	//recojo la funcion javascript a llamar
	var jsAction=calendarValuesTable.get("jsAction"+calID);
	var jsExtra=calendarValuesTable.get("jsExtra"+calID);
	if(!jsExtra)
		jsExtra='';
	
	//recojo el lenguaje (en ingles, la semana empieza en domingo
	var language=calendarValuesTable.get("language"+calID);
	
	var today=new Date();
	
	for(var currentMonth=0;currentMonth<12;currentMonth++)
	{
		var obj=document.getElementById(calID+"_row_"+currentMonth);
		if(obj)
		{
			var isToday=(today.getMonth()==currentMonth && today.getFullYear()==curYear);
			obj.innerHTML="<a class='"+(isToday?"linkToday":"linkData")+"' href=\"javascript:"+jsAction+"('1/"+currentMonth+"/"+curYear+"' "+jsExtra+");\">"+(eval("months"+calID+"["+(currentMonth-1)+"]"))+"</A>";
			//comparo el mes con (curMonth-1) porque en el objeto Date el mes empieza en cero
			if(isToday)
				obj.className="calToday";
			else
				obj.className="calData";
		}
	}
}

//funcion para cambiar de fecha el calendario (modo dias)
function changeCalendarDate(calID, month, year)
{
	//primero, cambio el mes actual
	var curMonth=parseInt(month);
	var curYear=parseInt(year); //calendarValuesTable.get("currentYear"+calID);
	if(curMonth==0)
	{
		curMonth=12;
		curYear--;
	}
	else if(curMonth==13)
	{
		curMonth=1;
		curYear++;
	}
	//guardo el mes en el hastable
	calendarValuesTable.put("currentMonth"+calID, curMonth);
	calendarValuesTable.put("currentYear"+calID, curYear);
	
	//Cambio el titulo del mes
	var monthTitle=document.getElementById("month_"+calID);
	if(monthTitle)
		monthTitle.innerHTML="<nobr>" + eval("months"+calID+"["+(curMonth-1)+"]") + "</nobr>"; //+" "+curYear
	
	//Cambio el titulo del anyo
//	var yTitle=document.getElementById("year_"+calID);
//	if(yTitle)
		document.getElementById("year_"+calID).innerHTML=curYear; //+" "+curYear
	
	//recojo la funcion javascript a llamar
	var jsAction=calendarValuesTable.get("jsAction"+calID);
	var jsExtra=calendarValuesTable.get("jsExtra"+calID);
	if(!jsExtra)
		jsExtra='';
	
	//recojo el lenguaje (en ingles, la semana empieza en domingo
	var language=calendarValuesTable.get("language"+calID);
	
	//Cambio los dias
	//Calculo el nuevo dia 1
	var firstDay=new Date(curYear, curMonth-1, 1); //le resto -1 a curMonth porque en esta funcion el mes empieza en cero
	var indexFirstDay=firstDay.getDay()==0?6:firstDay.getDay()-1;
	//Para el ingles, si el primer dia no es el domingo, incremento el offset en uno
	var indexSaturday=5;
	var indexSunday=6;
	if(language=="EN")
	{
		if(indexFirstDay<6)
			indexFirstDay++;
		else	//si es domingo, lo convierto en el primer dia
			indexFirstDay=0;
		indexSaturday=6;
		indexSunday=0;
	}
	var currentDay=1;
	var maxDays=getMaxDays(curMonth, curYear);
	//Recorro cada fila
	for(var row=0;row<6;row++)
	{
		for(var col=0;col<7;col++)
		{
			if(row==0 && col<indexFirstDay)	//offset del dia 1 (relleno de blanco hasta el)
			{
				var obj=document.getElementById("row_"+row+"_"+col+"_"+calID);
				if(obj)
				{
					obj.innerHTML="&nbsp;";
					obj.className="calEmpty";
				}
			}
			else if(currentDay>maxDays)	//offset de la ultima semana
			{
				var obj=document.getElementById("row_"+row+"_"+col+"_"+calID);
				if(obj)
				{
					obj.innerHTML="&nbsp;";
					obj.className="calEmpty";
				}
			}
			else
			{
				var obj=document.getElementById("row_"+row+"_"+col+"_"+calID);
				if(obj)
				{
					var today=new Date();
					var isToday=(today.getDate()==currentDay && today.getMonth()==(curMonth-1) && today.getFullYear()==curYear);
					obj.innerHTML="<a class='"+(isToday?"linkToday":"linkData")+"' href=\"javascript:"+jsAction+"('"+currentDay+"/"+curMonth+"/"+curYear+"'"+jsExtra+");\">"+currentDay+"</A>";
					//comparo el mes con (curMonth-1) porque en el objeto Date el mes empieza en cero
					if(isToday)
						obj.className="calToday"
					else
						obj.className=col==indexSaturday || col==indexSunday?"calWeekend":"calData";
				}
				currentDay++;
			}
		}
	}
}





//muestra la capa del calendario
function showCalendar(name)
{
	var timeout=calendarValuesTable.get("timeout"+name);
	if(timeout)
		window.clearTimeout(timeout);
	var obj=document.getElementById("cal"+name);
	if(obj)
		obj.style.display="block";
}

//muestra la capa del calendario
function hideCalendar(name)
{
	var obj=document.getElementById("cal"+name);
	if(obj)
		obj.style.display="none";
}

function hideTimeoutCalendar(name)
{
	var timeout=calendarValuesTable.get("timeout"+name);
	if(timeout)
		window.clearTimeout(timeout);
	timeout=window.setTimeout("hideCalendar('"+name+"')", 1000);
	calendarValuesTable.put("timeout"+name, timeout);
}


///////////////////////////////////////////////////////////////////////////////////////////
/////////////// OBJETO HASHTABLE EN JAVASCRIPT ////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
function HashTable()
{
	this.a = new Array();
	this.b = new Array();
	this.size = 0;
	this.put = put;
	this.get = get;
	this.keys = this.a;
	this.values = this.b;
	this.remove = remove;
	this.removeAll = removeAll;	
}
function removeAll(){
	with(this){
		a = new Array();
		b = new Array();
		size = this.a.length
		keys = this.a
		values = this.b
	}	
}

function remove(x){
	n = this.size;
	for(i=0;i<n;i++){
		if(x == this.a[i])
			break;
	}
	if(i == n)
		return;
	tKeys = new Array();
	tValues = new Array();
	count = 0
	for(j=0;j<n;j++){		
		if(j!= i){
			tKeys[count] = this.a[j]
			tValues[count] = this.b[j]
			count++;
		}
	}	
	this.a = tKeys
	this.b = tValues
	this.size = this.a.length
}

function get(x){
	n = this.size;
	for(i=0;i<n;i++){
		if(x == this.a[i])
			return this.b[i];
	}
	return null;
}

function put(x,y){
	n = this.size;
	for(i=0;i<n;i++){
		if(x == this.a[i]){
			this.b[i] = y;
			return;
		}
	}
	this.a[this.a.length] = x
	this.b[this.b.length] = y
	this.size = this.a.length;
}

/////////////////////////////////////////////////////////////////////////////////

//devuelve el numero de dias del mes
function getMaxDays(month, year)
{
	var days;
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
		days=31;
	else if (month==4 || month==6 || month==9 || month==11)
		days=30;
	else if (month==2) 
	{
		if (isLeapYear(year))
			days=29;
		else
			days=28;
	}
	return (days);
}

//comprueba si un anyo es bisiesto
function isLeapYear (Year)
{
	if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0))
		return (true);
	else
		return (false);
}



var calendarValuesTable=new HashTable();
