var Map=new Array(255);
var MapVedic = new Array(255)

var NUM_MC_CODES = 4;
var MCK_LC_Codes = new Array(NUM_MC_CODES);
var MCK_UC_Codes = new Array(NUM_MC_CODES);
var MCK_Strings = new Array(NUM_MC_CODES);

var NUKTA_PRE_KEY_CHAR = ']';
var NUKTA_PRE_KEY_CODE = 93;

var PRINTABLE_CHAR_START_CODE = 32;
var PRINTABLE_CHAR_END_CODE = 126;

var NCCodes = new Array(16);
var NCValues = new Array(16);

var UC_POS_MULTIPLIER = 128;
var NUM_KB_KEYS = 50;

var langCode = -1;
var langOffset = 0;

var prevKeyCode = 0;
var STR_NO_CHAR = "";
var LKIDs = new Array(NUM_KB_KEYS);
var UKIDs = new Array(NUM_KB_KEYS);

var strShiftButtonId = "bShift";
var strNuktaButtonId = "b93b125";
var strHelpButtonId = "bHelp";

var s_strDDLSelectLangID = "_ddlSelectLanguage";
var s_strIDIndicKeypadContainer = "__pnlIndicEntryKeypadPanel";

var debugMode = false;
var MSG_HELP = "Choose the language of your choice.\r\nEnter characters using your computer key board or the on-screen key pad buttons.\r\nThe language key positions on your computer keyboard correspond to those shown in the on-screen keypad.\r\nChoose an output language and click the 'Transliterate' button to transliterate the entered text to the chosen output language";

var bShift = false;
var bNukta = false;

var strIDPrevBtnIndicEntry = null;
var strIDCurrentBtnIndicEntry = null;

var s_strIDAssociatedControl = null;
var s_strColorNormalBtnIndicEntry = "";

var arrIndicEntryBtnIDs = new Array();
var arrIndicEntryCtrlLanguages = new Array();

var NUM_INDIC_LANGUAGES = 9;
var INDIC_LABEL_CHAR_CODE = 0x0905;
var arrIndicLanguageLabels = new Array(NUM_INDIC_LANGUAGES);
var bInternalSelection = false;

function InitializeData()
{
   for(var i = 0; i < arrIndicLanguageLabels.length; i++)
   {
        arrIndicLanguageLabels[i] = '' + String.fromCharCode(INDIC_LABEL_CHAR_CODE + i * UC_POS_MULTIPLIER);
   }
   
    LoadMaps();
    InitializeKBButtons();
}
function InitializeKBButtons()
{
    for(var i = 0; i < NUM_KB_KEYS; i++)
    {
        LKIDs[i] = 0;
        UKIDs[i] = 0;
    }
    
    LKIDs[0]=49;UKIDs[0]=33;LKIDs[1]=50;UKIDs[1]=64;LKIDs[2]=51;UKIDs[2]=35;LKIDs[3]=52;UKIDs[3]=36;LKIDs[4]=53;UKIDs[4]=37;LKIDs[5]=54;UKIDs[5]=94;LKIDs[6]=55;UKIDs[6]=38;LKIDs[7]=56;UKIDs[7]=42;LKIDs[8]=57;UKIDs[8]=40;LKIDs[9]=48;UKIDs[9]=41;LKIDs[10]=45;UKIDs[10]=95;LKIDs[11]=61;UKIDs[11]=43;
    LKIDs[12]=113;UKIDs[12]=81;LKIDs[13]=119;UKIDs[13]=87;LKIDs[14]=101;UKIDs[14]=69;LKIDs[15]=114;UKIDs[15]=82;LKIDs[16]=116;UKIDs[16]=84;LKIDs[17]=121;UKIDs[17]=89;LKIDs[18]=117;UKIDs[18]=85;LKIDs[19]=105;UKIDs[19]=73;LKIDs[20]=111;UKIDs[20]=79;LKIDs[21]=112;UKIDs[21]=80;
    LKIDs[22]=97;UKIDs[22]=65;LKIDs[23]=115;UKIDs[23]=83;LKIDs[24]=100;UKIDs[24]=68;LKIDs[25]=102;UKIDs[25]=70;LKIDs[26]=103;UKIDs[26]=71;LKIDs[27]=104;UKIDs[27]=72;LKIDs[28]=106;UKIDs[28]=74;LKIDs[29]=107;UKIDs[29]=75;LKIDs[30]=108;UKIDs[30]=76;LKIDs[31]=59;UKIDs[31]=58;LKIDs[32]=39;UKIDs[32]=34;
    LKIDs[33]=122;UKIDs[33]=90;LKIDs[34]=120;UKIDs[34]=88;LKIDs[35]=99;UKIDs[35]=67;LKIDs[36]=118;UKIDs[36]=86;LKIDs[37]=98;UKIDs[37]=66;LKIDs[38]=110;UKIDs[38]=78;LKIDs[39]=109;UKIDs[39]=77;LKIDs[40]=44;UKIDs[40]=60;LKIDs[41]=46;UKIDs[41]=62;LKIDs[42]=47;UKIDs[42]=63;
    // Out of order assignments - TODO: Correct later
    LKIDs[43]=96;UKIDs[43]=126;
    LKIDs[44]=91;UKIDs[44]=123;LKIDs[45]=93;UKIDs[45]=125;LKIDs[46]=92;UKIDs[46]=124;
    
    RenameButtonKeys();
}

function LoadMaps()
{            
    DebugAlert('Load Start');
   
    for (var i = 0; i < Map.length; i++)
    {
        Map[i] = i;
    }
      
    Map[96]=2378;Map[49]=2407;Map[50]=2408;Map[51]=2409;Map[52]=2410;Map[53]=2411;Map[54]=2412;Map[55]=2413;Map[56]=2414;Map[57]=2415;Map[48]=2406;Map[45]=45;Map[61]=2371;
    Map[113]=2380;Map[119]=2376;Map[101]=2366;Map[114]=2368;Map[116]=2370;Map[121]=2348;Map[117]=2361;Map[105]=2327;Map[111]=2342;Map[112]=2332;Map[91]=2337;Map[93]=2364;Map[92]=2377;
    Map[97]=2379;Map[115]=2375;Map[100]=2381;Map[102]=2367;Map[103]=2369;Map[104]=2346;Map[106]=2352;Map[107]=2325;Map[108]=2340;Map[59]=2330;Map[39]=2335;
    Map[122]=2374;Map[120]=2306;Map[99]=2350;Map[118]=2344;Map[98]=2357;Map[110]=2354;Map[109]=2360;Map[44]=44;Map[46]=46;Map[47]=2351;
    Map[126]=2322;Map[33]=2305;Map[64]=2386;Map[35]=35;Map[36]=36;Map[37]=37;Map[94]=94;Map[38]=38;Map[42]=42;Map[40]=40;Map[41]=41;Map[95]=2307;Map[43]=43;
    Map[81]=2324;Map[87]=2320;Map[69]=2310;Map[82]=2312;Map[84]=2314;Map[89]=2349;Map[85]=2329;Map[73]=2328;Map[79]=2343;Map[80]=2333;Map[123]=2338;Map[125]=2334;Map[124]=2321;
    Map[65]=2323;Map[83]=2319;Map[68]=2309;Map[70]=2311;Map[71]=2313;Map[72]=2347;Map[74]=2353;Map[75]=2326;Map[76]=2341;Map[58]=2331;Map[34]=2336;
    Map[90]=2318;Map[88]=2305;Map[67]=2339;Map[86]=2345;Map[66]=2356;Map[78]=2355;Map[77]=2358;Map[60]=2359;Map[62]=2404;Map[63]=2399;
    Map[33] = 2317;
    Map[43] = 2315;
    
    MCK_LC_Codes[0]=53;MCK_LC_Codes[1]=54;MCK_LC_Codes[2]=55;MCK_LC_Codes[3]=56;
    MCK_UC_Codes[0]=37;MCK_UC_Codes[1]=94;MCK_UC_Codes[2]=38;MCK_UC_Codes[3]=42;
    
    MCK_Strings[0] = String.fromCharCode(2332) + String.fromCharCode(2381) + String.fromCharCode(2334);
    MCK_Strings[1] = String.fromCharCode(2340) + String.fromCharCode(2381) + String.fromCharCode(2352);
    MCK_Strings[2] = String.fromCharCode(2325) + String.fromCharCode(2381) + String.fromCharCode(2359);
    MCK_Strings[3] = String.fromCharCode(2358) + String.fromCharCode(2381) + String.fromCharCode(2352);
    
    NCCodes[0]=107;NCCodes[1]=75;NCCodes[2]=105;NCCodes[3]=112;NCCodes[4]=91;NCCodes[5]=123;NCCodes[6]=72;NCCodes[7]=43;
    NCCodes[8]=61;NCCodes[9]=70;NCCodes[10]=102;NCCodes[11]=82;NCCodes[12]=114;NCCodes[13]=88;NCCodes[14]=62;NCCodes[15]=0;

    NCValues[0] = 2392; NCValues[1] = 2393; NCValues[2] = 2394; NCValues[3] = 2395; NCValues[4] = 2396; NCValues[5] = 2397; NCValues[6] = 2398; NCValues[7] = 2400;
    NCValues[8] = 2372; NCValues[9] = 2316; NCValues[10] = 2402; NCValues[11] = 2401; NCValues[12] = 2403; NCValues[13] = 2384; NCValues[14] = 2365; NCValues[15] = 0;
    
    // NEW // -- Vedic Mapping
    
    for (var i = 0; i < MapVedic.length; i++)
    {
        MapVedic[i] = 0;
    }
    
    // Keyboard row 1 numbers
    MapVedic[49] = 61828;MapVedic[51] = 61829;MapVedic[56] = 61808;MapVedic[57] = 61801;MapVedic[45] = 61734;

    // Keyboard row 2 Q-P
    MapVedic[113] = 61875;MapVedic[119] = 61879;MapVedic[101] = 0;MapVedic[114] = 61814;MapVedic[121] = 61760;MapVedic[117] = 61745;MapVedic[105] = 61749;MapVedic[111] = 61766;MapVedic[112] = 61762;MapVedic[91] = 61758;
    // same code for caps and no caps
    MapVedic[81] = 61875;MapVedic[87] = 61879;MapVedic[69] = 0;MapVedic[82] = 61814;MapVedic[89] = 61760;MapVedic[85] = 61745;MapVedic[73] = 61749;MapVedic[79] = 61766;MapVedic[80] = 61762;MapVedic[23] = 61758;

    // Keyboard row 3 A-L
    MapVedic[97] = 61859; MapVedic[115] = 61863; MapVedic[100] = /*57351*/2385; MapVedic[102] = /*61858*/2386; MapVedic[103] = 61867; MapVedic[104] = 61787; MapVedic[106] = 61795; MapVedic[107] = 0; MapVedic[108] = 61792; MapVedic[59] = 0;
    // same code for caps and no caps
    MapVedic[65] = 61859; MapVedic[83] = 61863; MapVedic[68] = /*57351*/2385; MapVedic[70] = /*61858*/2386; MapVedic[71] = 61867; MapVedic[72] = 61787; MapVedic[74] = 61795; MapVedic[75] = 0; MapVedic[76] = 61792; MapVedic[58] = 0;

    // Keyboard row 4 Z-M
    MapVedic[118] = 8747;MapVedic[98] = 57345;MapVedic[110] = 61782;MapVedic[109] = 0;MapVedic[44] = 0;MapVedic[46] = 61727;MapVedic[47] = 2384;
    // same code for caps and no caps
    MapVedic[86] = 8747; MapVedic[66] = 57345; MapVedic[78] = 61782; MapVedic[77] = 0; MapVedic[60] = 0; MapVedic[62] = 61727; MapVedic[63] = 2384;
    
    // NEW //
    
    DebugAlert('LoadMaps: End');
}

function DebugAlert(msg)
{
    if(debugMode)
    {
        alert(msg);
    }
}

function HandleAssociatedControlFocus(strIndicEntryButtonID, strControlID, strColorSelectedBtnIndicEntry)
{
    ChangeLanguageSelection(strIndicEntryButtonID, strControlID, strColorSelectedBtnIndicEntry, false);
}

function HandleIndicEntryLinkClick(strIDBtnIndicEntry, strControlID, strColorSelectedBtnIndicEntry)
{       
    ChangeLanguageSelection(strIDBtnIndicEntry, strControlID, strColorSelectedBtnIndicEntry, true);
}

function ChangeLanguageSelection(strIDBtnIndicEntry, strControlID, strColorSelectedBtnIndicEntry, toggleKeyPad)
{
    if((strControlID == null) || (strControlID == ''))
    {
        alert('Associated ControlID was null');
        return;
    }
    
    s_strIDAssociatedControl = strControlID;
 
    // If button id not entered in global language codes array, enter this button id
    AddToGlobalLangBtnMap(strIDBtnIndicEntry);

    strIDCurrentBtnIndicEntry = strIDBtnIndicEntry;
    for(var i = 0; i < arrIndicEntryBtnIDs.length; i++)
    {
        if(arrIndicEntryBtnIDs[i] == strIDBtnIndicEntry)
        {
            // Change the language selection in indic entry control
            //bInternalSelection = true;
            document.getElementById(s_strIDSelectLanguage + '_' + s_strDDLSelectLangID).selectedIndex 
                = arrIndicEntryCtrlLanguages[i] + 1;
            
            //alert('test2');
            OnInputLangChanged();
            break;
        }
    }
    
    var btnCurrent = document.getElementById(strIDBtnIndicEntry);
    var ctrlIndicKeypadContainer = document.getElementById(s_strIDIndicKeypadContainer);
        
    if(strIDPrevBtnIndicEntry != null)
    {   
        var btnOld = document.getElementById(strIDPrevBtnIndicEntry);
        
        // Restore old 
        btnOld.style.backgroundColor = s_strColorNormalBtnIndicEntry;
        btnOld.style.fontWeight = 'normal';
        btnOld.style.fontStyle = 'normal';
        if(strIDPrevBtnIndicEntry == strIDBtnIndicEntry)
        {
            strIDPrevBtnIndicEntry = null;
            if(toggleKeyPad)
            {
                //ctrlIndicKeypadContainer.style.visibility = 'hidden';
                ctrlIndicKeypadContainer.style.display = 'none';
            }
            return;
        }
        
        if(toggleKeyPad)
        {
            ctrlIndicKeypadContainer.style.display = 'block';
        }
    }
    
    ctrlIndicKeypadContainer.style.display = 'block';
    
    // Save new
    strIDPrevBtnIndicEntry = strIDBtnIndicEntry;
    s_strIDAssociatedControl = strControlID;
    s_strColorNormalBtnIndicEntry = btnCurrent.style.backgroundColor;
            
    // Change new
    btnCurrent.style.backgroundColor = strColorSelectedBtnIndicEntry;
    btnCurrent.style.fontWeight = 'bold';
    btnCurrent.style.fontStyle = 'italic';    
}

function RenameButtonKeys()
{   
    var strIDBtn = "";
    var codeLCBtn = 0;
    var codeUCBtn = 0;
    var objButton;
   
    for(var i = 0; i < NUM_KB_KEYS; i++)
    {
        codeLCBtn = LKIDs[i];
        codeUCBtn = UKIDs[i];
        
        if((codeLCBtn == 0) || (codeUCBtn == 0))
            continue;
            
        strIDBtn = "b" + codeLCBtn + "b" + codeUCBtn;
        objButton = document.getElementById(strIDBtn);
        
        var lcCode = 0;
        var ucCode = 0;
      
        if(langCode < 0) // English
        {
            lcCode = codeLCBtn;
            ucCode = codeUCBtn;
        }
        else if(bVedic)
        {
            lcCode = MapVedic[codeLCBtn];
            ucCode = MapVedic[codeUCBtn];
        }
        else // Indic
        {
            lcCode = Map[codeLCBtn];
            ucCode = Map[codeUCBtn];
            
            if(lcCode > 255) // Valid deva code
            {
                lcCode = lcCode + langOffset;
            }
            if(ucCode > 255) // Valid deva code
            {
                ucCode = ucCode + langOffset;
            }    
        }
        
        if(!bShift)
        {
            //objButton.value = String.fromCharCode(codeUCBtn) + " " + String.fromCharCode(lcCode);
            var strButtonText = " " + String.fromCharCode(lcCode);
            objButton.value = strButtonText;
        }
        else
        {
            //objButton.value = String.fromCharCode(codeUCBtn) + " " + String.fromCharCode(ucCode);
            var strButtonText = " " + String.fromCharCode(ucCode);
            objButton.value = strButtonText;
        }
        //objButton.Attributes.Add("onclick", "KBClk()");
    
    }
    
    
    //DebugAlert("RenameButtonKeys: Loop: " + NUM_MC_CODES);
    
    if((langCode < 0) || (bVedic))
    {
        return;
    }
   
    for(var i = 0; i < NUM_MC_CODES; i++)
    {
        DebugAlert("RenameButtonKeys: Index" + i);
        codeLCBtn = MCK_LC_Codes[i];
        codeUCBtn = MCK_UC_Codes[i];
        strIDBtn = "b" + codeLCBtn + "b" + codeUCBtn;
        DebugAlert(strIDBtn);
        objButton = document.getElementById(strIDBtn);
        DebugAlert("RenameButtonKeys: objButton" + objButton);
        
        if(!bShift)
        {
            objButton.value = String.fromCharCode(Map[codeLCBtn] + langOffset) 
        }
        else
        {
            objButton.value = GetTranslatedMultiCharString(i);
        }
        
        DebugAlert(i);
    }
    
    
    DebugAlert("RenameButtonKeys: End");
}

function HandleAssociatedControlKeyPress(strIndicEntryButtonID, strControlID, strColorSelectedBtnIndicEntry)
{
    //alert('1');
    //var txtBox = document.getElementById(strControlID);
    var txtBox = event.srcElement;
    var keyCode = event.keyCode;
    
    if ((keyCode < PRINTABLE_CHAR_START_CODE) || (keyCode > PRINTABLE_CHAR_END_CODE))
    {
        return;
    }

    var strConv = TranslateKeyCodeToLanguageString(keyCode, prevKeyCode, langCode);
    prevKeyCode = keyCode;

    txtBox.value = txtBox.value + strConv;
        
    event.cancelBubble = true;
    event.returnValue = "";
}
function HandleAssociatedControlKeyUp(strIndicEntryButtonID, strControlID, strColorSelectedBtnIndicEntry) 
{
    //alert('2');
}

function AddToGlobalLangBtnMap(strIDBtnIndicEntry)
{
    // If button id not entered in global language codes array, enter this button id
    for(var i = 0; i < arrIndicEntryBtnIDs.length; i++)
    {
        if(arrIndicEntryBtnIDs[i] == strIDBtnIndicEntry)
        {
            return; // Do nothing
        }
    }
    
    //alert('AddToGlobalLangBtnMap:add');
    var pos = arrIndicEntryBtnIDs.length;
    arrIndicEntryBtnIDs[pos] = strIDBtnIndicEntry;
    arrIndicEntryCtrlLanguages[pos] = 0;
}

function IsMultiCharKey(code)
{
    for(var i = 0; i < NUM_MC_CODES; i++)
    {
        if(code == MCK_UC_Codes[i])
            return true;
    }
    
    return false;
}

function GetTranslatedMultiCharString(index)
{
    DebugAlert("GetTranslatedMultiCharString: Start: index: " + index);
    var baseStr = MCK_Strings[index];
    var translatedStr = "";
    
    for(var i = 0; i < baseStr.length; i++)
    {
        translatedStr += String.fromCharCode(baseStr.charCodeAt(i) + langOffset);
    }
    
    DebugAlert("GetTranslatedMultiCharString: End: translatedStr: " + translatedStr);
    
    return translatedStr;
}

function TranslateKeyCodeToLanguageString(code, prevCode, langCode)
{
    var strConv = STR_NO_CHAR;
    
    if (code > 255)
    {
        strConv += String.fromCharCode(code);
    }
    // New //
    else if (bVedic)
    {
        var vedicCode = MapVedic[code];
        strConv = String.fromCharCode(vedicCode);
        return strConv;
    }
    // New //
    else if (code == NUKTA_PRE_KEY_CODE)
    {
        strConv = STR_NO_CHAR;
    }
    else if (prevCode == NUKTA_PRE_KEY_CODE)
    {
        for(var i = 0; i < NCCodes.length; i++)
        {
            if (code == NCCodes[i])
            {
                strConv = String.fromCharCode(NCValues[i]);
                break;
            }
        }
    }
    else if (IsMultiCharKey(code))
    {
        for(var j = 0; j < NUM_MC_CODES; j++)
        {
            if(code == MCK_UC_Codes[j])
                return GetTranslatedMultiCharString(j);
        }
    }
    else if ((code < PRINTABLE_CHAR_START_CODE) || (code > PRINTABLE_CHAR_END_CODE))
    {
        strConv = STR_NO_CHAR;
    }
    else
    {
        strConv += String.fromCharCode(Map[code]);
    }
    
    var strOutput = "";
    var devaCode = 0;
    var transCode = 0;
    for(var i = 0; i < strConv.length; i++)
    {
        devaCode = strConv.charCodeAt(i);
        if(devaCode <= 255) // No deva code
        {
            transCode = devaCode;
        }
        else
        {            
            transCode = devaCode + langOffset;
        }
        var strTrans = String.fromCharCode(transCode);
        
        strOutput += strTrans;
    }

    return strOutput;
}

function OnInputLangChanged()
{
    var str = document.getElementById(s_strIDSelectLanguage + '_' + s_strDDLSelectLangID).value;
    //alert('1');
    var selectedLangCode = parseInt(str) - 1;
    ChangeIndicEntryLanguage(selectedLangCode);
    
    // Rename keypad keys
    RenameButtonKeys();
    
    // Change language label of indic entry link button
    document.getElementById(strIDCurrentBtnIndicEntry).innerText = arrIndicLanguageLabels[selectedLangCode];

    // Store selected language corresponding to indic entry button id in global array
    for(var i = 0; i < arrIndicEntryBtnIDs.length; i++)
    {
        if(arrIndicEntryBtnIDs[i] == strIDCurrentBtnIndicEntry)
        {
            arrIndicEntryCtrlLanguages[i] = selectedLangCode;
        }
    }
}

function ChangeIndicEntryLanguage(selectedLangCode)
{
    langCode = selectedLangCode;
    langOffset = langCode * UC_POS_MULTIPLIER;
}

var defaultBackColor="";
var selectedBackColor = 'white';
function ChangeButtonStyle(strID, selected)
{
    var btn = document.getElementById(strID);
        
    if(selected)
    {
        //backColor = btn.style.backgroundColor;
        //btn.style.borderStyle='dotted';
        btn.style.backgroundColor = selectedBackColor;
    }
    else
    {
        //btn.style.borderStyle = 'None';
        btn.style.backgroundColor = defaultBackColor;
    }
}

// NEW //
var strVedicButtonId = "bVedic";
var bVedic = false;
// NEW //

function KBClk()
{      
    var strID = event.srcElement.id;     
    // NEW
    if(strID == strVedicButtonId)
    {
        if(bVedic)
        {
            bVedic = false;
            ChangeButtonStyle(strVedicButtonId, bVedic);
        }
        else
        {
            bVedic = true;
            ChangeButtonStyle(strVedicButtonId, bVedic);
        }
        
        RenameButtonKeys();
        
        return;
    }
    // NEW

    if(strID == strHelpButtonId)
    {
        alert(MSG_HELP);
        return;
    }
    if( strID == strShiftButtonId)
    {
        if (bVedic)
            return;
                   
        if(!bShift)
        {
            bShift = true;
            //ChangeButtonStyle(strShiftButtonId, true);
        }
        else
        {
            bShift = false;
            //ChangeButtonStyle(strShiftButtonId, false);
        }
        
        RenameButtonKeys();
    }
    
    else if(strID == strNuktaButtonId)
    {
        if(bShift == false)   
        {
            if(!bNukta)
            {
                //ChangeButtonStyle(strNuktaButtonId, true);
                prevKeyCode = NUKTA_PRE_KEY_CODE;
                bNukta = true;
            }
            else
            {
                //ChangeButtonStyle(strNuktaButtonId, false);
                prevKeyCode = 0;
                bNukta = false;
            }
        }
    }
    else
    {
        //ChangeButtonStyle(strShiftButtonId, false);
        //ChangeButtonStyle(strNuktaButtonId, false);
        
        var index1 = strID.indexOf("b");
        var index2 = strID.lastIndexOf("b");
        var len = strID.length;
        var strCode1 = strID.substr(index1 + 1, index2 - index1 - 1);
        var code1 = parseInt(strCode1);
        var strCode2 = strID.substr(index2 + 1, len - index2 - 1);
        var code2 = parseInt(strCode2);
        var strConv = "";
        
        var txtBox = document.getElementById(s_strIDAssociatedControl);
        
        if(bShift == false)
        {
            strConv = TranslateKeyCodeToLanguageString(code1, prevKeyCode, langCode);
            prevKeyCode = code1;
        }
        else
        {
            strConv = TranslateKeyCodeToLanguageString(code2, prevKeyCode, langCode);
            prevKeyCode = code2;
            //bShift = false;
        }
        
        txtBox.value = txtBox.value + strConv;
        //bShift = false;
        //bNukta = false;
    }
    
    ChangeButtonStyle(strShiftButtonId, bShift);
    ChangeButtonStyle(strNuktaButtonId, bNukta);
}

