/***********************************************************
  CALENDARIOS
  ----------------------------------------------------------
  Dibuja un mes del calendario
  
  Eduard Diaz: Julio 2006
************************************************************/
var Calendario = Class.create();
Calendario.prototype ={
	initialize:function(mostrarcontroles,fecha,target,dias_activados,idFieldDate){
	  var calendario = this;
	  this.field = idFieldDate || false;
 	  this.dia = 1;
	  this.mes = 1;
	  this.anno = 2000;
	  this.numdias = 30;
	  this.diainiciomes = 0;
	  this.bisiesto = false;
	  this.diasfestivos = new Array();
	  this.dias_activados = dias_activados || new Array();
	  this.nomsemanal = ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa','Do'];
	  this.meses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio','Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
	  this.numdiasmeses = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	  this.mostrarcontroles= mostrarcontroles || false;
		this.idtarget = target || 'calendario';
		
		if (this.mostrarcontroles){
		  //addEventListener
      this.eventMesAnterior = this.event_mes_anterior.bindAsEventListener(this);
      this.eventMesSiguiente = this.event_mes_siguiente.bindAsEventListener(this);
    }
		this.ini(fecha,this.idtarget,this.dias_activados);
	},
	ini:function(fecha,target,dias_activados){
		this.idtarget=target;
		if (dias_activados){
			this.dias_activados=dias_activados;
		}
		if (fecha==''){ 
			this._get_hoy();
			this._render_calendario();
		}
		else{
			var d = fecha.split('/');
			if (d.length==3){
				this._ini_calendario(d[0],d[1],d[2]);
				this._render_calendario();
   		}else {
   					alert('Error, la fecha es incorrecta\ndd/mm/aaaa');
   					return false;
   		}
   	}
	},	
	event_mes_anterior:function(event){
		if(this.mes==1){
			this.anno--;
			this.mes=12;
			this.dia=1;
		}else{
			this.mes--;
			this.dia=1;
		}
		var fecha= this.dia+'/'+this.mes+'/'+this.anno;
		this.ini(fecha,this.idtarget);
		Event.stop(event);
	},
	event_mes_siguiente:function(event){
		if(this.mes==12){
			this.anno++;
			this.mes=1;
			this.dia=1;
		}else{
			this.mes++;
			this.dia=1;
		}
		var fecha= this.dia+'/'+this.mes+'/'+this.anno;
		this.ini(fecha,this.idtarget);
		Event.stop(event);			
	},
  updateInputDate:function(strDate){
    this.field.value=strDate;
  },				
	_get_hoy: function(dia,mes,anno){
    var d = new Date();
    this.anno = d.getFullYear(); //devuelve el año como número de cuatro digitos
    this.mes = d.getMonth() + 1; //getMonth() devuelve el numero de mes de 0 a 11
    this.dia = d.getDate(); //el dia del mes de 1 a 31 segun el mes.
    d.setDate(1); //dia del mes del 1 al 31
    this._bisiesto();
    this.numdias=this.numdiasmeses[this.mes-1];
    this.diainiciomes=d.getDay();
	},			
	_ini_calendario: function(dia,mes,anno){
    var tmp=mes-1;
		var d = new Date();
		d.setFullYear(anno); //devuelve el año como número de cuatro digitos
		d.setMonth(tmp); // setMonth(mes) el numero de mes de 0 a 11
		d.setDate(dia); //el dia del mes de 1 a 31 segun el mes.
		this.anno = d.getFullYear(); //devuelve el año como número de cuatro digitos
		this.mes = d.getMonth() + 1; //getMonth() devuelve el numero de mes de 0 a 11
		this.dia = d.getDate(); //el dia del mes de 1 a 31 segun el mes.
		d.setDate(1); //dia del mes del 1 al 31
		this._bisiesto();
		this.numdias=this.numdiasmeses[this.mes-1];
		this.diainiciomes=d.getDay();
	},
	_bisiesto:function() {
    this.bisiesto=(!(this.anno % 4) && (this.anno < 1582 || this.anno % 100 || !(this.anno % 400))) ? true : false;
    if (this.bisiesto) this.numdiasmeses[1]=29;
 	},
  _get_diainiciomes:function() {
    var mes=this.mes - 1;
    var d = new Date();
		d.setDate(1); //dia del mes del 1 al 31	
		d.setMonth(this.mes); //el mes del año desde 0 (enero) hasta 11 (diciembre)
		d.setFullYear(this.anno); //el año como número de cuatro digitos
		this.diainiciomes=d.getDay();
  },
  _get_datos_calendario:function(url, parametros){
    var tmpURL=url;
    var pars=parametros;
    new Ajax.Request(tmpURL, {parameters:pars, 
    							  onSuccess:function(t){alert(t.responseText);}, 
    							  onFailure:function(t){alert('Error ' + t.status + ' -- ' + t.statusText);}
    							  }
    					 );
  },
  _render_calendario:function() {
    var calendario=this;
    var tmp=0;
    var chkinicio=false;
    var d = new Date();
    var hoy_anno = d.getFullYear(); //devuelve el año como número de cuatro digitos
    var hoy_mes = d.getMonth() + 1; //getMonth() devuelve el numero de mes de 0 a 11
    var hoy_dia = d.getDate(); //el dia del mes de 1 a 31 segun el mes.    
  	var html_calendario='<table>\n\t<tbody>\n';
  	if (this.mostrarcontroles){
	    html_calendario+='<tr><th id="'+this.idtarget+'_mes_anterior" class="cal_mes_anterior">&nbsp;<&nbsp; </th><th class="cal_titulo_mes" colspan="5"><b> '+this.meses[this.mes-1]+' '+this.anno+' </b></th><th id="'+this.idtarget+'_mes_siguiente" class="cal_mes_siguiente">&nbsp;>&nbsp;</th></tr>';
	  }else{
	    html_calendario+='<tr><th class="cal_titulo_mes" colspan="7"><b> '+this.meses[this.mes-1]+' '+this.anno+' </b></th></tr>';
	  }
		html_calendario+='<tr>';
		for(i=0;i<7;i++)
		{
		  html_calendario+='<th>'+ this.nomsemanal[i] +'</th>';
		}
		html_calendario+='</tr>';
		//html_calendario+='<tr><th> Lu </th><th> Ma </th><th> Mi </th><th> Ju </th><th> Vi </th><th> Sa </th><th> Do </th></tr>';
		var inicio=this.diainiciomes - 1;
		if (inicio < 0 ) inicio=6; //para los meses que empiezan en domingo
		for (var i=0; i<6; i++)
		{
			html_calendario+='\t\t<tr>\n';
			for (var j=0; j<7; j++)
			{
				/****************************************************
				Diferenciamos entre las posiciones de la tabla 
				anteriores al dia 1 del mes, los dias del mes y
				las posiciones de la tabla posteriores al último dia
				del mes.
				*****************************************************/
				
				if(i==0 && j==inicio)chkinicio=true;
				else if(tmp > this.numdias)	chkinicio=false;
				if(chkinicio && tmp < this.numdias)
				{	//estamos dentro de esos dias del mes
					tmp++;
					if(this.field){
  					if (hoy_anno==this.anno && hoy_mes==this.mes && hoy_dia==tmp){
  					    html_calendario+='<td class="cal_dias_hoy">';
  					}
  				  else if(this.dias_activados['d_'+tmp]){
  						html_calendario+='<td class="cal_dias_activados">';
  					}else if(j>4){
  						html_calendario+='<td class="cal_dias_finde">';
  					}else{
  						html_calendario+='<td class="cal_dias">';
  					}
  					html_calendario+='<span onclick="updateInputDate(\'' + tmp + '/'+ this.mes + '/'+this.anno+' 00:00:00\', \'' + this.field + '\');return false;">'+tmp+'</span></td>';
					  
				  }else{
  					if (hoy_anno==this.anno && hoy_mes==this.mes && hoy_dia==tmp){
  					    html_calendario+='<td class="cal_dias_hoy"> '+tmp+' </td>';
  					}
  				  else if(this.dias_activados['d_'+tmp]){
  						html_calendario+='<td class="cal_dias_activados"> <a href="'+this.dias_activados['d_'+tmp].url+'" title="'+this.dias_activados['d_'+tmp].title+'">'+tmp+'</a> </td>';
  					}else if(j>4){
  						html_calendario+='<td class="cal_dias_finde"> '+tmp+' </td>';
  					}else{
  						html_calendario+='<td class="cal_dias"> '+tmp+' </td>';
  					}
  				}
				}
				else
				{	//rellenamos las celdas con espacios en blanco
					html_calendario+='<td class="cal_vacio"> &nbsp; </td>';
				}
			}
			html_calendario+='\t\t</tr>\n';
		}
		html_calendario+='\t</tbody>\n</table>\n';
		Element.update(this.idtarget, html_calendario);
		if (this.mostrarcontroles){
      Event.observe(this.idtarget+'_mes_anterior', 'click', calendario.eventMesAnterior);
      Event.observe(this.idtarget+'_mes_siguiente', 'click', calendario.eventMesSiguiente); 
    }
   }
}

/***********************************************************
  CALENDARIOS
  ----------------------------------------------------------
  Dibuja un calendario de uno a varios meses
  
  Parámetros:
    - fecha:          date, fecha a partir de la cual se pintará el calendario
    - target:         string, id del div donde se dibujará el calendario  
    - dias_activados:  array, lista de dias activos (enlace a datos)
    - nummeses:       int, número de meses a pintar
    - strTitulo:      Título del calendario 
    - idfield:        Id del campo, utilizado para casos donde el calendario 
                      está asociado a un campo fecha
  
  Uso:
  A partir de una fecha determinada
	  var cal_1=new Calendarios('1/12/2005','calendario1',dias_activados, 3, 'trimestre', '');
	A partir del dia de hoy.
	  var cal_2=new Calendarios('','calendario2',dias_activados,6, 'semestre', '');
  
  Eduard Diaz: Julio 2006
************************************************************/
var Calendarios = Class.create();
Calendarios.prototype ={
	initialize:function(fecha,target,dias_activados,nummeses, strTitulo, idfield){
	  var calendarios= this;
	  this.field = idfield || false;
	  this.titulo = strTitulo || '';
	  this.dias_activados=dias_activados || {};
	  this.num_meses_render = nummeses || 2;
	  this.mostrarcontroles = false;
	  this.annos  = new Array();
	  this.meses  = new Array();
	  this.calendarios  = new Array();
	  this.idtarget=target || 'calendario';
		
		//addEventListener
    this.eventPeriodoAnterior = this.event_periodo_anterior.bindAsEventListener(this);
    this.eventPeriodoSiguiente = this.event_periodo_siguiente.bindAsEventListener(this);
    
	  this.cals_target=new Array();
    this.draw_container();
    if (this.num_meses_render == 1) this.mostrarcontroles=true; 
	  if(fecha==''){
      var d = new Date();
      var anno = d.getFullYear();
      var mes=d.getMonth(); //el numero de mes de 0 a 11
      this.draw_calendar(mes, anno);
    }else{
      var f = fecha.split('/');
			if (f.length==3){
			  //f[0],f[1],f[2] dia, mes , anno
			  var tmp=f[1]-1;
		    var d = new Date();
		    d.setFullYear(f[2]); //el año como número de cuatro digitos
		    d.setMonth(tmp); // setMonth(mes) el numero de mes de 0 a 11
        var anno = d.getFullYear();
        var mes=d.getMonth(); //el numero de mes de 0 a 11		    
        this.draw_calendar(mes, anno);		
      }else {
        alert('Error, el formato de fecha es incorrecto\ndd/mm/aaaa');
        return false;
   		} 
    }
	},
	draw_container: function(){
	  var html_calendario = '<div id="'+this.idtarget+'_crtl" class="cal_controles"></div>';
	  for (i=0; i<this.num_meses_render; i++){
	    this.cals_target[i]=this.idtarget+'_numcal_'+i;
	    html_calendario +='<div id="'+this.cals_target[i]+'" class="calendario"></div>';
	  }
	  html_calendario +='<div style="clear:both;">&nbsp;</div>';
	  Element.update(this.idtarget, html_calendario);	  
  },
  draw_controls: function (){
    var calendarios = this;
  	var html_calendario='<table class="tbl_cal_ctrl">\n\t<tbody>\n';
	  html_calendario+='<tr><th id="'+this.idtarget+'_mes_anterior" class="cal_mes_anterior">&nbsp;<&nbsp; </th><th class="cal_titulo_mes" ><b> '+this.titulo+' </b></th><th id="'+this.idtarget+'_mes_siguiente" class="cal_mes_siguiente">&nbsp;>&nbsp;</th></tr>';
	  html_calendario+='\t</tbody>\n</table>\n'; 
	  Element.update(this.idtarget+'_crtl', html_calendario);
    Event.observe(this.idtarget+'_mes_anterior', 'click', calendarios.eventPeriodoAnterior);
    Event.observe(this.idtarget+'_mes_siguiente', 'click', calendarios.eventPeriodoSiguiente);	  
  },
	draw_calendar:function(mes,anno){
    for (i=0; i < this.num_meses_render; i++){
      mes++;;
      this.meses[i]=mes;
      if(this.meses[i]>12){
        anno ++;
        this.annos[i]=anno;
        this.meses[i] = mes = 1;
      }else{
        this.annos[i]=anno;
      }
      this.calendarios[i]=new Calendario(this.mostrarcontroles,'1/'+this.meses[i]+'/'+this.annos[i],this.cals_target[i],this.dias_activados[this.meses[i]+'_'+this.annos[i]], this.field);
    }
    if(!this.mostrarcontroles) this.draw_controls();
  },
	event_periodo_anterior:function(event){
		var tmpmes = this.meses[0]-this.meses.length-1;
		var tmpanno = this.annos[0];
		if (tmpmes < 1){
		  tmpmes += 12;
		  tmpanno = this.annos[0] - 1;
		  this.draw_calendar(tmpmes, tmpanno);
		}else{
		  this.draw_calendar(tmpmes, tmpanno);
	  }
		Event.stop(event);
	},
	event_periodo_siguiente:function(event){
		var tmpmes = this.meses.length-1;
		var tmpanno = this.annos.length-1;
		if (this.meses[tmpmes]==12){
		  tmpmes=0;
		  tmpanno = this.annos[tmpanno] + 1;
		  this.draw_calendar(tmpmes, tmpanno);
		}else{
		  tmpmes = this.meses[tmpmes];
		  tmpanno = this.annos[tmpanno];
		  this.draw_calendar(tmpmes, tmpanno);
	  }
		Event.stop(event);			
	}			  
}