/*
 *  Kirylaca project
 *  Latin javascript charset
 *  copyright (c) zedlik 2006
 *  www.zedlik.com
 *  http://www.zedlik.com/pragramy/kirylaca/
 *
 *
 *  Note! IE6 ignores javascript line
 *  following by a cyrillic // commentary.
 */


var deadKeyATableLatin = new Array();
var deadKeyBTableLatin = new Array();


var deadKeyAPressed = false;
var deadKeyBPressed = false;


// auxillary characters
deadKeyATableLatin["`"] = "``";
deadKeyATableLatin[" "] = "`";
deadKeyATableLatin["~"] = "";
deadKeyBTableLatin["~"] = "~~";
deadKeyBTableLatin[" "] = "~";
deadKeyBTableLatin["`"] = "";

// subject characters

// lacin
// dead `
// lacinka
deadKeyATableLatin["c"] = String.fromCharCode(0x0107);
deadKeyATableLatin["C"] = String.fromCharCode(0x0106);
deadKeyATableLatin["n"] = String.fromCharCode(0x0144);
deadKeyATableLatin["N"] = String.fromCharCode(0x0143);
deadKeyATableLatin["s"] = String.fromCharCode(0x015B);
deadKeyATableLatin["S"] = String.fromCharCode(0x015A);
deadKeyATableLatin["z"] = String.fromCharCode(0x017A);
deadKeyATableLatin["Z"] = String.fromCharCode(0x0179);

//useful stuff
deadKeyATableLatin["a"] = String.fromCharCode(0x00E1);
deadKeyATableLatin["A"] = String.fromCharCode(0x00C1);
deadKeyATableLatin["e"] = String.fromCharCode(0x00E9);
deadKeyATableLatin["E"] = String.fromCharCode(0x00C9);
deadKeyATableLatin["i"] = String.fromCharCode(0x00ED);
deadKeyATableLatin["I"] = String.fromCharCode(0x00CD);
// deadKeyATableLatin["l"] = String.fromCharCode(0x013E);
// deadKeyATableLatin["L"] = String.fromCharCode(0x013D);
deadKeyATableLatin["o"] = String.fromCharCode(0x00F3);
deadKeyATableLatin["O"] = String.fromCharCode(0x00D3);
deadKeyATableLatin["u"] = String.fromCharCode(0x00FA);
deadKeyATableLatin["U"] = String.fromCharCode(0x00DA);
deadKeyATableLatin["y"] = String.fromCharCode(0x00FD);
deadKeyATableLatin["Y"] = String.fromCharCode(0x00DD);
deadKeyATableLatin[","] = String.fromCharCode(0x00AB); // &laquo;
deadKeyATableLatin["."] = String.fromCharCode(0x00BB); // &raquo;
deadKeyBTableLatin["<"] = String.fromCharCode(0x201E); // double low-9 quotation mark
deadKeyBTableLatin[">"] = String.fromCharCode(0x201C); // left fouble quotation mark
deadKeyATableLatin["-"] = String.fromCharCode(0x2014); // mdash

// dead ~
// lacinka
deadKeyBTableLatin["c"] = String.fromCharCode(0x010D);
deadKeyBTableLatin["C"] = String.fromCharCode(0x010C);
deadKeyBTableLatin["l"] = String.fromCharCode(0x0142);
deadKeyBTableLatin["L"] = String.fromCharCode(0x0141);
deadKeyBTableLatin["s"] = String.fromCharCode(0x0161);
deadKeyBTableLatin["S"] = String.fromCharCode(0x0160);
deadKeyBTableLatin["u"] = String.fromCharCode(0x016D);
deadKeyBTableLatin["U"] = String.fromCharCode(0x016C);
deadKeyBTableLatin["z"] = String.fromCharCode(0x017E);
deadKeyBTableLatin["Z"] = String.fromCharCode(0x017D);

// useful stuff
deadKeyBTableLatin["x"] = String.fromCharCode(0x017C); // dotted z
deadKeyBTableLatin["X"] = String.fromCharCode(0x017B); // dotted Z
deadKeyBTableLatin["a"] = String.fromCharCode(0x0105); // an
deadKeyBTableLatin["A"] = String.fromCharCode(0x0104); // An
deadKeyBTableLatin["e"] = String.fromCharCode(0x0119); // en
deadKeyBTableLatin["E"] = String.fromCharCode(0x0118); // En
deadKeyBTableLatin["-"] = String.fromCharCode(0x2013); // ndash


function addTextToCurrentPosition_LatinSelection(s, el)
{
    var tb = el;
    var pretext = tb.value.substring(0, tb.selectionStart);
    var posttext = tb.value.substr(tb.selectionEnd);
    var fh = pretext + s;
    tb.value = fh + posttext;
    tb.setSelectionRange(fh.length, fh.length);

    return false;
}

function addTextToCurrentPosition_LatinRange(s, el)
{
    var range;
    range = document.selection.createRange();
    range.text = "";
    range.collapse();

    range = document.selection.createRange();
    range.select();
    range.text = s;
    range.collapse();

    return false;
}


var addTextToCurrentPosition_Latin = 0;

function addTextToCurrentPosition(s, el)
{
    return addTextToCurrentPosition_Latin(s, el);
}


function setFunctions(which)
{
    if (!addTextToCurrentPosition_Latin)
    {
        addTextToCurrentPosition_Latin = which ?
          addTextToCurrentPosition_LatinSelection : addTextToCurrentPosition_LatinRange;
    }
}

function onKeyPressHandler(e, el)
{
    var key = window.event ? e.keyCode : e.which;
    var keychar = String.fromCharCode(key);

    var result = true;

    setFunctions(e.which);

    if (key >= 32 && !e.ctrlKey && !e.altKey && !(e.which == 0))
    {
        if (deadKeyAPressed)
        {
            if (deadKeyATableLatin[keychar])
            {
                addTextToCurrentPosition(deadKeyATableLatin[keychar], el);
                result = false;
            }
            else
            {
                addTextToCurrentPosition("`", el);
                    if (pCyrillicMap[keychar])
                    {
                            addTextToCurrentPosition(keychar, el);
                        result = false;
                    }
            }
            if (keychar != "`")
                deadKeyAPressed = false;
        }

        if (deadKeyBPressed)
        {
            if (deadKeyBTableLatin[keychar])
            {
                addTextToCurrentPosition(deadKeyBTableLatin[keychar], el);
                result = false;
            }
            else
            {
                addTextToCurrentPosition("~", el);
            }
            if (keychar != "~")
                deadKeyBPressed = false;
        }

        switch (keychar)
        {
            case "`":
                deadKeyAPressed = !deadKeyAPressed;
                result = false;
                break;
            case "~":
                deadKeyBPressed = !deadKeyBPressed;
                result = false;
                break;
        }
    }
    else
    {
                   result = true;
    }
    return result;
}
