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>