Bueno pues yo siempre lo he echo asi, el select del  departamento lo cargas normalmente, y en el head, copias esta funcion, y con el evento onchango en el select del departamento, llamas la funcion.
la funcion es la siguiente:
<script Language="JavaScript" Type="text/javascript">
  function CargaMunic() {
   var i=0;
   var j=0;
   var munis= new Array;
   var valor;
   valor=document.empresa.id_departamento.value;
    <?
    $consult2 ="SELECT * FROM departamento ORDER BY nombre";
   $result2=mysql_query($consult2);
    $num_result2 = mysql_num_rows($result2);
   
    for ($i=0;$i<$num_result2;$i++)
       {
       $rows2=mysql_fetch_array($result2);
      $id_depar=$rows2["id_departamento"];
      
      $consult3 ="SELECT * FROM municipio WHERE id_departamento = '".$id_depar."' ORDER BY nombre";
       $result3=mysql_query($consult3);
        $num_result3= mysql_num_rows($result3);
   
       echo " if (valor=='$id_depar') {";
       echo " munis[i++]=new Option('');";
       for ($j=0;$j<$num_result3;$j++)
           {
          $rows3=mysql_fetch_array($result3);
           $cdmun=$rows3["id_municipio"];
           $dsmun=$rows3["nombre"];
         $dsmun=strtolower($dsmun);
         $dsmun=ucfirst($dsmun);
         echo "   munis[i++]=new Option('$dsmun','$cdmun');";
         echo "   j=j+1;";
           echo "   document.empresa.id_municipio.options[j]=munis[j];";
            }
       echo "   document.empresa.id_municipio.length=munis.length;";
       echo " }";
        } 
   ?>
  }
</script>