Dynamic phonenumber formatting in Javascript


Dynamic phonenumber formatting in Javascript. It is implemented only for US/Canada, and others as international.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 <html>
<
head>
       <title>Untitled</title
>

</
head>

 <body>
<
form>
<
input name="a1" type="text" value=""  onkeyup="javascript:keyUP(this,event);" onblur="javascript:validatePhone(this);">
</
form>

 </body>
<
SCRIPT LANGUAGE="javascript">
    function keyUP(object, e) {
        if (e) {
            e = e
        } else {
            e = window.event
        }
        if (e.which) {
            var keycode = e.which
        } else {
            var keycode = e.keyCode
        }

        if (keycode >= 48) {
            ProcessString(object)
        }

    }

    function ProcessString(object) {

        validatePhone(object);
    }

    function validatePhone(obj) {
        var phoneStr = obj.value;
        phoneStr = phoneStr.replace(/^\s+|\s+$/g, '');
        var testArr = phoneStr.split("");
        var j = 0;
        var arraySize = testArr.length;
        var keychar = testArr[0];

        if (keychar == "+") //international format
        {
            for (i = 1; i < testArr.length; i++) {
                var testchar = testArr[i];
                var newchar = "";
                var remchar = -1;
               
//alert("test:"+testchar);
                var ioffset = 0;
                ioffset = PhoneFormat_International(i, newchar, remchar, testchar, testArr);

                i += ioffset;

 
                j++;
//to avoid any infinite loop..
                if (j == 300) {
                    break;
                }
            }
        }
        else {
            for (i = 0; i < testArr.length; i++) {
                var testchar = testArr[i];
                var newchar = "";
                var remchar = -1;
               
//alert("test:"+testchar);
                var ioffset = 0;
                var arrsize1 = testArr.length
                ioffset = PhoneFormat_USCanada(i, newchar, remchar, testchar, testArr);

 
                i += ioffset;

 
                j++;
//to avoid any infinite loop..
                if (j == 300) {
                    break;
                }
            }
        }

        obj.value = testArr.join("");

    }

    function PhoneFormat_USCanada(i, newchar, remchar, testchar, testArr) {
        var ret = 0;
        if (i > 13) {
            testArr.splice(i, 1);
            ret = -1;
            return ret;
        }

        switch (i) {
            case 0:
                if (testchar != "(") {
                    newchar = "(";
                }
                else {
                    remchar = 0;
                }
                break;
            case 4:
                if (testchar != ")") {
                    newchar = ")";
                }
                else {
                    remchar = 0;
                }
                break;
            case 5:

 
                if (testchar != ' ') {
                    newchar = ' ';
                }
                else {
                    remchar = 0;
                }
                break;
            case 9:
                if (testchar != "-") {
                    newchar = "-";
                }
                else {
                    remchar = 0;
                }
                break;

            default:
                if (isNaN(testchar) && testchar != ' ')
                    remchar = 1;

        }

        if (remchar != 0 && (isNaN(testchar) || testchar == ' '))
 
        { remchar = 1; }
       
else
        { remchar = 0; }

        if (newchar.length > 0)   //char to be concatenated for the phone number format
        {
            testArr.splice(i, remchar, newchar);             
//if remchar=1, the character is invalid and remove it while
adding a char

        }
        else if (remchar == 1)   
//if 1, the character is invalid and remove it
        {
            testArr.splice(i, remchar);
            ret = -1;     
//only deletion, the same index char needs to be examined    
        }
        return ret;
    }

 
    function PhoneFormat_International(i, newchar, remchar, testchar, testArr) {
        var ret = 0;
        remchar = 1;
        if (!isNaN(testchar)) {
            remchar = 0;
        }
        else if (testchar == " ") {

            remchar = 0;

        }        else if (testchar == "-") {
            remchar = 0;
        }

 
        if (remchar == 1) 
//if 1, the character is invalid and remove it

        {            testArr.splice(i, remchar);            ret = -1;      //only deletion, the same index char needs to be examined    
       }
         return ret;
    } 

</SCRIPT> 
</html>