parece que la situacion es un tanto obvia. tu funcion recibe un parametro (valor) y este es el que usas para validar en cada segmento. no es lo adecuado. lo correcto seria en tu funcion accesar a cada campo en cada segmento de validacion y leer el valor de campo. es decir, asi como haces para mover el foco al mismo campo, de la misma forma haces para leer la propiedad value de dicho campo. respecto a la expresion regular, a continuacion una forma como yo lo haria segun el formato que se usa en EU y sus terrotorios.
Código:
/^(?:\(\d{2,3}\)|\d{2,3})(.)\d{3}\1\d{4}$/;