function calendario(id,d,m,a,w,h,classNormal,classHoy,codeTarget,actoz){
	this.firstTime = true;
	this.contenidoz = "";
	
	this.idObj=id;
	this.meses=["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"];
	this.dias=["l","m","x","j","v","s","d"];
	this.numdias=[31,28,31,30,31,30,31,31,30,31,30,31];
	this.mini=[1,2000];
	this.maxi=[12,2030];
	this.inicial=new Date(a,m,d);
	this.actual=new Array(42);	
	this.classNormal=classNormal;
	this.classHoy=classHoy;
	this.codeTarget=codeTarget;
	this.w=w;
	this.h=h;
	this.wCell=parseInt(w/8);//múltiplo de 8
	this.hCell=parseInt((h-10)/7);//múltiplo de 7
	this.actos=[];
	for (var i=0; i<actoz.length; i++) this.actos[i] = actoz[i];
	this.selecciona(a,m-1,d);
}

calendario.prototype.primerDia=function(){// calcula el primer dia del mes actual
	var f=new Date(this.anioActual,this.mesActual-1,1);
	var dini=(f.getDay()==0)?6:f.getDay()-1;
	return dini;
}
calendario.prototype.calcula=function(ini){
	// el calendario va a ser un array de 6*7 = 42	posiciones con el
	// numero de dia que es o null si no pertenece a ese mes
	var diaIni=this.primerDia();
	var numDias=(this.mesActual==2&&this.bisiesto())?29:this.numdias[this.mesActual-1];
	for(var i=0;i<diaIni;i++)this.actual[i]=null;
	for(var i=diaIni;i<diaIni+numDias;i++)this.actual[i]=i-diaIni+1;
	for(var i=diaIni+numDias;i<42;i++)this.actual[i]=null;
	if(ini==null) this.muestra();
}
calendario.prototype.muestra=function(){
	//línea mes/año y navegación
	
	var t = '<div id="interiorCalendario">';
		t += '	<table width="217" cellpadding="0" cellspacing="0" border="0" id="calendarEve">';
		t += '	  <tr height="31">';
		t += '		<td id="avanza" width="28" align="center"><a href=javascript:'+this.idObj+'.retrocede()>&lt;&lt;</a></td>';
		t += '		<td colspan="5" class="encabezado" height="28"><b>'+this.meses[this.mesActual-1]+' '+this.anioActual+'</b></td>';
		t += '		<td id="retrocede" width="28" align="center"><a href=javascript:'+this.idObj+'.avanza()>&gt;&gt;</a></td>';
		t += '	  </tr>';

		t += '	  <tr height="31">';
		t += '		<td width="28" height="31" class="gris_o"><b>L</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>M</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>X</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>J</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>V</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>S</b></td>';
		t += '		<td width="28" height="31" class="gris_o"><b>D</b></td>';
		t += '	  </tr>';


	var dia = 0;
	for(var i=0;i<6;i++){
		t += '	  <tr height="31">';
		
		for(var j=0;j<7;j++){
		
			// vemos si es un día con evento
			var diaActual = this.actual[dia]+" "+this.meses[this.mesActual-1].toUpperCase()+" "+this.anioActual;
			var indice = this.getActo(diaActual);
			if (indice!=null){
				t += '		<td width="28" height="31" class="gris_n" onMouseOver="showDay('+indice+', '+i+', '+j+')" onMouseOut="hideDay()">'+this.actual[dia]+'</td>';				
			} else {
				fechaTemp = new Date(this.anioActual,this.mesActual-1,this.actual[dia]);
				fechaTemp2 = new Date(this.anioActual,this.mesActual-1,this.actual[dia]+1);
				var clasez = (this.actual[dia]==null)? 'gris_vacio' : (fechaTemp<this.inicial)? 'gris_c' : ((fechaTemp<=this.inicial)&&(fechaTemp2>this.inicial))? 'gris_cHoy' : 'gris_b';
				var diaz = (this.actual[dia]==null)? '&nbsp;' : this.actual[dia];
				
				t += '		<td width="28" height="31" class="'+clasez+'">'+diaz+'</td>';	
			}
			dia++;
		}
		t+='	</tr>';
	}
	
	t+="</table>";
	t+='</div>';
	//pinto
	if (this.firstTime){
		this.firstTime = false;
		this.contenidoz = t;
	} else {
		var target = document.getElementById(this.codeTarget);
			target.innerHTML = t;
	}
}

calendario.prototype.selecciona=function(a,m,d){
	this.mesActual=m+1;
	this.anioActual=a;
	this.inicial=new Date(a,m,d);
	this.calcula();
}
calendario.prototype.formatZero=function(i){return (i<10)?"0"+i:i;}
calendario.prototype.minimo=function(m,a){this.mini=[m,a];}
calendario.prototype.maximo=function(m,a){this.maxi=[m,a];}
calendario.prototype.bisiesto=function(){return(this.anioActual%4==0&&((this.anioActual%100!=0)||(this.anioActual%400==0)));}
calendario.prototype.ponActual=function(a,m,d){this.mesActual=m;this.anioActual=a;this.inicial=new Date(a,m-1,d);this.calcula("no");}
calendario.prototype.ponMeses=function(m){this.meses=m;}
calendario.prototype.avanza=function(){
	if(this.mesActual==12){this.mesActual=1;this.anioActual++;}else this.mesActual++;
	this.calcula();
}
calendario.prototype.retrocede=function(){
	if(this.mesActual==1){this.mesActual=12;this.anioActual--;}else this.mesActual--;
	this.calcula();
}
calendario.prototype.tieneSig=function(){return((this.anioActual<this.maxi[1])||(this.anioActual==this.maxi[1]&&this.mesActual<this.maxi[0]));}
calendario.prototype.tieneAnt=function(){return((this.anioActual>this.mini[1])||(this.anioActual==this.mini[1]&&this.mesActual>this.mini[0]));}

calendario.prototype.getActo=function(diaA){
	var coincide = false;
	for (var k=0; k<this.actos.length; k++){
		if (this.actos[k][0] == diaA){
			coincide = true;
			dataz = k;
		}
	}
	return (coincide)? dataz : null;
}

