//===========================================================
//  Interface
//===========================================================
kernel = {
    onMouseMove:      {},
    onMouseDown:      {},
    onMouseUp:        {},
    onClick:          {},
    onResize:         {},
    onKeyUp:          {},
    onKeyDown:        {},
    onKeyPress:       {},
    onLoad:           {},

    uagent:           "",
    is_safari:        false,
    is_opera:         false,
    is_webtv:         false,
    is_ie:            false,
    is_ie4:           false,
    is_moz:           false,
    is_ns:            false,
    is_ns4:           false,
    is_kon:           false,
    ie:               false,

    is_win:           false,
    is_mac:           false,
    ua_vers:          false,

    error:            "",
    allow:            false,
    document:         null,
    init:             null,
    echo:             null
};

//===========================================================
//  Implementation
//===========================================================
kernel.init = function()
{
    this.uagent    = navigator.userAgent.toLowerCase();
    this.is_safari = ((this.uagent.indexOf('safari') != -1) || (navigator.vendor == "Apple Computer, Inc."));
    this.is_opera  = (this.uagent.indexOf('opera') != -1);
    this.is_webtv  = (this.uagent.indexOf('webtv') != -1);
    this.is_ie     = ((this.uagent.indexOf('msie') != -1) && (!this.is_opera) && (!this.is_safari) && (!this.is_webtv));
    this.is_ie4    = ((this.is_ie) && (this.uagent.indexOf("msie 4.") != -1));
    this.is_moz    = ((navigator.product == 'Gecko')  && (!this.is_opera) && (!this.is_webtv) && (!this.is_safari));
    this.is_ns     = ((this.uagent.indexOf('compatible') == -1) && (this.uagent.indexOf('mozilla') != -1) && (!this.is_opera) && (!this.is_webtv) && (!this.is_safari));
    this.is_ns4    = ((this.is_ns) && (parseInt(navigator.appVersion) == 4));
    this.is_kon    = (this.uagent.indexOf('konqueror') != -1);
    this.ie        = document.all ? true : false;

    this.is_win    = ((this.uagent.indexOf("win") != -1) || (this.uagent.indexOf("16bit") !=- 1));
    this.is_mac    = ((this.uagent.indexOf("mac") != -1) || (navigator.vendor == "Apple Computer, Inc."));
    this.ua_vers   = parseInt(navigator.appVersion);

    this.allow = true;
};

kernel.echo = function( html )
{
    this.document.write( html );
};

function kernel_onMouseMove(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onMouseMove )
    {
        if( kernel.onMouseMove[i] != null )
        {
            try
            {
                var processor = kernel.onMouseMove[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onMouseDown(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onMouseDown )
    {
        if( kernel.onMouseDown[i] != null )
        {
            try
            {
                var processor = kernel.onMouseDown[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onMouseUp(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onMouseUp )
    {
        if( kernel.onMouseUp[i] != null )
        {
            try
            {
                var processor = kernel.onMouseUp[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onClick(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onClick )
    {
        if( kernel.onClick[i] != null )
        {
            try
            {
                var processor = kernel.onClick[i];
                processor();
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onResize(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onResize )
    {
        if( kernel.onResize[i] != null )
        {
            try
            {
                var processor = kernel.onResize[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onKeyUp(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onKeyUp )
    {
        if( kernel.onKeyUp[i] != null )
        {
            try
            {
                var processor = kernel.onKeyUp[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onKeyDown(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onKeyDown )
    {
        if( kernel.onKeyDown[i] != null )
        {
            try
            {
                var processor = kernel.onKeyDown[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onKeyPress(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onKeyPress )
    {
        if( kernel.onKeyPress[i] != null )
        {
            try
            {
                var processor = kernel.onKeyPress[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }
};

function kernel_onLoad(e)
{
    if( !kernel.allow ) return;

    for( var i in kernel.onLoad )
    {
        if( kernel.onLoad[i] != null && kernel.onLoad[i] != 'undefined' && i != 'post' )
        {
            try
            {
                var processor = kernel.onLoad[i];
                processor(e);
            }
            catch(e)
            {
                kernel.error = e.toString();
            }
        }
    }

    if( kernel.onLoad['post'] )
    {        var processor = kernel.onLoad['post'];
        processor(e);
    }
};

//===========================================================
//  Fast init
//===========================================================
//------------------------------------------
//  Redeclare functions
//------------------------------------------

var trans = [];
for (var i = 0x410; i <= 0x44F; i++)
    trans[i] = i - 0x350; // А-Яа-я
trans[0x401] = 0xA8;      // Ё
trans[0x451] = 0xB8;      // ё

// Сохраняем стандартную функцию escape()
var escapeOrig = window.escape;

// Переопределяем функцию escape()
window.escape = function( str )
{
    var ret = [];
    // Составляем массив кодов символов, попутно переводим кириллицу
    for( var i = 0; i < str.length; i++ )
    {
        var n = str.charCodeAt( i );
        if( typeof trans[n] != 'undefined' ) n = trans[n];
        if( n <= 0xFF ) ret.push( n );
    }
    return escapeOrig( String.fromCharCode.apply( null, ret ) );
}

if( kernel.is_ie )
{
    document.captureEvents( Event.MOUSEMOVE );
    document.captureEvents( Event.MOUSEUP );
    document.captureEvents( Event.MOUSEDOWN );
    document.captureEvents( Event.CLICK );
    document.captureEvents( Event.RESIZE );
    document.captureEvents( Event.KEYUP );
    document.captureEvents( Event.KEYDOWN );
    document.captureEvents( Event.KEYPRESS );
    document.captureEvents( Event.LOAD );
}
document.onmousemove   = kernel_onMouseMove;
document.onmouseup     = kernel_onMouseUp;
document.onmousedown   = kernel_onMouseDown;
document.onclick       = kernel_onClick;
document.onresize      = kernel_onResize;
document.onkeyup       = kernel_onKeyUp;
document.onkeydown     = kernel_onKeyDown;
document.onkeypress    = kernel_onKeyPress;
document.onload        = kernel_onLoad;

kernel.document = window.document;
kernel.init();
