<?
class calendario{
   var $sem;//Array com os dias da semana como �ndice
   var $mes;//Array com os meses do ano

   function inicializa(){//Atribui valores para $sem e $mes.

$this->sem=array('Sun'=>1,'Mon'=>2,'Tue'=>3,'Wed'=>4,'Thu'=>5,'Fri'=>6,'Sat'=>7);

$this->mes=array('1'=>'JANEIRO','2'=>'FEVEREIRO','3'=>'MAR�O','4'=>'ABRIL','5'=>'MAIO','6'=>'JUNHO','7'=>'JULHO','8'=>'AGOSTO','9'=>'SETEMBRO','10'=>'OUTUBRO','11'=>'NOVEMBRO','12'=>'DEZEMBRO');
   }

   function aux($i){//Complementa a tabela com espa�os em branco
      $retval="";
      for($k=0;$k < $i;$k++){
         $retval.="<td width=\"20\">&nbsp;</td>";
      }
      return $retval;
   }

/*
$dia inteiro de 1 a 31
$mes inteiro de 1 a 12
$ano inteiro de 1901 a 2038
$marca vari�vel que termina se o valor do dia ser� marcado ou n�o.
       Se diferente de zero marca.
*/
   function cria($dia,$mes,$ano,$marca=0){
      $this->inicializa();
      $verf=date ("d/n/Y", mktime (0,0,0,$mes,$dia,$ano));/*Corrige qualquer data invalida*/
      $pieces=explode("/",$verf);
      $dia=$pieces[0];
      $mes=$pieces[1];
      $ano=$pieces[2];
      $last=date ("d", mktime (0,0,0,$mes+1,0,$ano));/*Inteiro do ultimo dia do m�s*/
      $diasem=date ("D", mktime (0,0,0,$mes,1,$ano));/*String com dia da semana em ingl�s*/
      if($this->sem[$diasem] != 1){/*Se dia semana diferente de domingo,completa com colunas em branco*/
         $valor=$this->sem[$diasem]-1;
         $str="<tr align=center bgcolor=\"#FFFFCC\">".$this->aux($valor);
      }
      for($i=1;$i < ($last+1);$i++){
         $diasem=date ("D", mktime (0,0,0,$mes,$i,$ano));
         if($this->sem[$diasem] == 1){/*Se domingo,a data recebe uma colora��o diferente e inicia nova linha na tabela.*/
            $str.="<tr align=\"center\" bgcolor=\"#FFFFCC\">";
            $s="<font color=\"#FF0000\">$i</font>";
         }else{
            $s="$i";
         }
         if($marca != 0){
            if($dia == $i){
               $s="<b>$s</b>";
            }
         }
         $str.="<td width=\"20\">$s</td>";
         if($this->sem[$diasem] == 7){//Se for sabado fecha linha.
            $str.="</tr>";
         }
      }
      $diasem=date ("D", mktime (0,0,0,$mes,$last,$ano));
      if($this->sem[$diasem] != 7){/*Se dia da semana diferente de s�bado,completa a tabela com espa�os vazios*/.
         $valor=7-$this->sem[$diasem];
         $str=$str.$this->aux($valor)."</tr>";
      }
      $str="<table border=\"1\"  cellspacing=\"0\" cellpadding=\"0\"
bordercolor=\"#000000\"><tr>
    <td ><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
        <tr bgcolor=\"#6CABF9\" align=\"center\">
          <td width=\"100%\" colspan=\"7\"><font
size=\"1\"><b>".$this->mes[$mes]."&nbsp;$ano"."</b></font></i></td>
        </tr><tr bgcolor=\"#6CABF9\" align=\"center\">
          <td width=\"20\">D</td><td width=\"20\">S</td>
          <td width=\"20\">T</td><td width=\"20\">Q</td>
          <td width=\"20\">Q</td><td width=\"20\">S</td>
          <td width=\"20\">S</td></tr>".$str."</table></td></tr></table>";
      echo $str;
   }
}
$teste=new calendario;
$teste->cria(date("d"),date("n"),date("Y"),1);//Exemplo
?>