function KeyboardController( )
{

    system.addEventListener("onloadSystem", activate);

    system.registerEvent("onreadline");
    system.registerEvent("onchangeLanguage");
    system.registerEvent("onchangeCaseMode");

    system.addEventListener("onchangeLanguage", changeLanguage);
    system.addEventListener("onchangeCaseMode", changeCaseMode);

    
    var nextLanguage = 
    {
        English : "Russian",
        Russian : "English"
    };
    var table = 
    { 
        upperEnglish :  upperEnglishChar,
        lowerEnglish :  lowerEnglishChar,
        upperRussian :  upperRussianChar,
        lowerRussian :  lowerRussianChar
    };


    var shiftCaseMode = { "lower" : "upper", "upper" : "lower" };
    var caseMode = "lower";
    var currentLanguage = "English";
    var line;
    
    this.activate = activate;
   
    function activate()
    {
        try
        {
            window.addEventListener( "keydown", reactionDown, true );
            window.addEventListener( "keyup", block, true );
            window.addEventListener( "keypress", block, true );
        }
        catch( e )
        {
            document.body.attachEvent( "onkeydown", reactionDown );
            document.body.attachEvent( "onkeyup", block);
            document.body.attachEvent( "onkeypress", block);
        }
    }

    function block( event )
    {
    try
    {
        if ( (event.keyCode == 8)||(event.keyCode == 32)||
             (event.keyCode == 38)||(event.keyCode == 40) )
        {   
            try
            {
                event.preventDefault();
                event.stopPropagation();
            }
            catch( e )
            {
                if ( event.cancellBubble )
                    event.cancellBubble = true;
            }       
        }
    return false;
    }
    catch( error )
    {
    }
    }
                    
    function reactionDown( event )
    {
        if ( event.keyCode == 38 )
        {
            if ( event.ctrlKey ) system.dispatchEvent("onScrollUp" , 1);
                else system.dispatchEvent("onpointerToUp");
            return;
        }
        if ( event.keyCode == 40 )
        {
            if ( event.ctrlKey ) system.dispatchEvent("onScrollDown" , 1);
                else system.dispatchEvent("onpointerToDown");
            return;
        }
        if ( event.keyCode == 37 )
        {
            system.dispatchEvent("onpointerToLeft");
            return;
        }
        if ( event.keyCode == 39 )
        {
            system.dispatchEvent("onpointerToRight");
            return;
        }
        if ( event.keyCode == 46 ) // delete
        {
            system.dispatchEvent("ondeleteChar");
            return;
        }
        if ( event.keyCode == 8 ) // backspace
        {   
            system.dispatchEvent("ondeleteChar", "back");
            try
            {
                event.preventDefault();
                event.stopPropagation();
            }
            catch( e )
            {
                if ( event.cancellBubble )
                    event.cancellBubble = true;
            }
            return false;
        }
        if ( event.altKey && event.shiftKey )
        {
            system.dispatchEvent("onchangeLanguage", nextLanguage[ currentLanguage ]);
            return;
        }
        if ( event.keyCode == 13 )
        {
            var obj = {};
            system.dispatchEvent("ongetLastInput", obj );
            system.dispatchEvent("onreadline", obj.input );
        }
        if ( event.keyCode == 20)
        {
            system.dispatchEvent("onchangeCaseMode", shiftCaseMode[ caseMode ]);
        }
        if ( ( !event.shiftKey )&&table[ caseMode + currentLanguage ][ event.keyCode ] )
        {
            system.dispatchEvent("onreadChar", table[ caseMode + currentLanguage ][ event.keyCode ]);           
        }
        if ( event.shiftKey&&table[ caseMode + currentLanguage ][ event.keyCode ] )
        {
           system.dispatchEvent("onreadChar", table[ shiftCaseMode[caseMode] + currentLanguage ][ event.keyCode ]);
        }
    }
    
    function changeLanguage( language )
    {
        if ( nextLanguage[ language ] )
            currentLanguage = language;
    }

    function changeCaseMode( mode )
    {
        if ( (mode != "upper")&&(mode != "lower") )
            return;
        caseMode = mode;
    }
}
