9º Digito em São Paulo

Boa noite pessoal!.

Passei hoje uma boa parte da manhã hoje tentando fazer uma function javascript para mascarar um campo de telefone que acetasse a regra do 9° digito dos celulares paulistanos.
Usando o MaskedInput, achei pessoas que faziam de um jeito que o ultimo digito não fosse obrigatorio, no entanto, quando o campo perdesse o foco esse digito era movido para depois do DDD. Isso é muito confuso, o usuario teria que digitar o numero antigo e colocar o 9 no final para ao sair do campo, esse 9 vá para o começo.

$('#telefone1')  
        .mask("(99) 9999-9999?9")  
        .live('focusout', function (event) {  
            var target, phone, element;  
            target = (event.currentTarget) ? event.currentTarget : event.srcElement;  
            phone = target.value.replace(/\D/g, '');  
            element = $(target);  
            element.unmask();  
            if(phone.length > 10) {  
                element.mask("(99) 99999-999?9");  
            } else {  
                element.mask("(99) 9999-9999?9");  
            }  
        });[/code]

Depois eu encontrei outro, porém com um sério bug que permite o usuário selecionar um texto qualquer e arrastar para dentro do input.
[url]http://jsfiddle.net/NJMSj/30/[/url]

Por fim, tentei fazer a minha com a seguinte logica:
O usuário começa a digitar, a cada keypress eu valido pela expressão regular e quando perceber que o usuário está tentando inserir um número de um celular paulistano [(11) 9...] eu mudo a mascara sem perder o que ele já havia digitado... não está dando certo... mas está quase!

Deem uma olhada e veja o "efeito poltergeist" e onde pode ser melhorado.
[code]<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script src="http://gqferreira.com.br/libs/jquery.maskedinput.js"></script>

        <script type="text/javascript">
        
            $(document).ready(function(){
                $("#telefone").mask("(99) 9999-9999");
                phoneSp = false;
    
                $("#telefone").keypress(function (){
                    if ($(this).val().match(/^(\(11\) 9(5[0-9]|6[0-9]|7[01234569]|8[0-9]|9[0-9])[0-9]{1})/g)){
                        if (!phoneSp){
                            phoneSp = true;
                            var valor = $(this).val().substring(0, 9)+"_-____";;
                            $(this).unmask();
                            $(this).val(null);
                            $(this).mask("(99) 99999-9999");
                            $(this).focus();
                            $(this).val(valor);
                        }
                    }
                    else if ($(this).val()=="(__) _____-____"){
                        phoneSp = false;
                        $(this).unmask();
                        $(this).val(null);
                        $(this).mask("(99) 9999-9999");
                        $(this).focus();
                    }
                });
            });
        </script>
    </head>
    <body>
        <input type="text" id="telefone" />
    </body>
</html>

Tópico movido para o fórum de JavaScript.