Mira Igonfil, no tengo mucho tiempo de leer tu código ahora mismo pero io siempre uso esta función para validar los dnis y funciona
    
Código Javascript
:
Ver original- function compruebaDni(nif) 
-     { 
-         numero = nif.substr(0,nif.length-1); 
-         let = nif.substr(nif.length-1,1); 
-         numero = numero % 23; 
-         letra='TRWAGMYFPDXBNJZSQVHLCKET'; 
-         letra=letra.substring(numero,numero+1); 
-         if (letra!=let)  
-         { 
-             document.getElementById("username").value = ""; 
-             document.getElementById("dnimsg").style.color='red'; 
-             return (false); 
-         } 
-         else 
-         { 
-             document.getElementById("dnimsg").style.color= '#646464'; 
-             return (true); 
-         } 
-   
-     }; 
Desde el formulario en php mando el valor del input text. Si tiene el formato adecuado(8 números y una letra) iamo a la función que te he puesto ahí arriba. En esta función v acío el campo y pongo el label de color rojo si en el evento onblur da faios.
Puedes adaptar fácilmente el código según tus necesidades. 
Un saludo!!