フォームのフォーカスをエンターキーで次に移動するには!その2

こういう制御は、WEBの世界では嫌われているようですが、個人的には必要です。
なので、過去に書いたものを、ちょっと書き直しました。
なんと[Shift]+[Enter]で、1つ前に戻ります。
ボタンをクリックするするときは、[Ctrl]+[Enter]です。
同じように、checkbox や radio なども [Ctrl]+[Enter] でセットできます
テキストエリアは、[Ctrl]+[Enter]で次に移動。
テキストエリアの1つ前に戻すには、[Ctrl]+[Shift]+[Enter]で可能です

//エンターキーで次のフォームにフォーカスを移す
//@cc_on

(function ( Listener ) {
  document./*@if( @_jscript ) attachEvent('on' + @else@*/ addEventListener( /*@end@*/ 'keypress', Listener, false );
  window./*@if( @_jscript ) attachEvent('on' + @else@*/ addEventListener( /*@end@*/ 'unload', function ( ) {
    document./*@if( @_jscript ) detachEvent('on' + @else@*/ removeEventListener( /*@end@*/ 'keypress', Listener, false );
    window./*@if( @_jscript ) detachEvent('on' + @else@*/ removeEventListener( /*@end@*/ 'unload', arguments.callee, false );
  }, false );
})(
    //Listener
    (function ( getN, getP ) {
      return function ( evt ) {
        var e       = evt./*@if( @_jscript ) srcElement @else@*/ target /*@end@*/;
        var keyCode = evt./*@if( @_jscript ) keyCode @else@*/ which /*@end@*/;
        var shift   = evt.shiftKey;
        var ctrl    = evt.ctrlKey;
        var flag = true, n;

        if( !/INPUT|TEXTAREA|SELECT/.test( e.nodeName ) ) return;

        if( 27 == keyCode ) return e.blur();
        if( 13 == keyCode ) {
          if( /radio/.test( e.type ) && ctrl ) e.checked = true;
          if( /checkbox/.test( e.type ) && ctrl ) e.checked = !e.checked;
          if( /submit|reset|button/.test( e.type ) && ctrl ) flag = false;
          if( 'TEXTAREA' === e.nodeName && !ctrl ) flag = false;
          if( flag ) {
            n = shift ? getP( e ): getN( e );
            if( n ) try { n.focus(); } catch( err ) { ;}
            return evt./*@if( @_jscript ) returnValue = false @else@*/ preventDefault() /*@end@*/;
          }
        }
      };
    })(
      function ( n ) {
        var e;
        do {
          if( !( e = n.firstChild ) )
            while( !( e = n.nextSibling ) )
              if( !( n = n.parentNode ) ) return null;
          n = e;
        } while ( 1 !== n.nodeType || !/INPUT|TEXTAREA|SELECT/.test( n.nodeName ) || 'hidden' === n.type );
        return n;
      },

      function ( n ) {
        var e, e2;
        do {
          if( e = n.previousSibling )
            while( e2 = e.lastChild ) e = e2;
          n = e || n.parentNode ;
        } while ( !n || 1 !== n.nodeType || !/INPUT|TEXTAREA|SELECT/.test( n.nodeName ) || 'hidden' === n.type );
        return n;
      }
    )
  );