/********************************************************************************
  JavaScript Virtual Keyboard

  Copyright (C) 2006 Dmitry Khudorozhkov (mailto:kh_dmitry2001@mail.ru)

  This software is provided "as-is", without any express or implied warranty. In 
  no event will the author be held liable for any damages arising from the use 
  of this software.

  Permission is granted to anyone to use this software for any purpose, including 
  commercial applications, and to alter it and redistribute it freely, subject to 
  the following restrictions:

  1. The origin of this software must not be misrepresented; you must not claim 
     that you wrote the original software. If you use this software in a product, 
     an acknowledgment in the product documentation would be appreciated but is 
     not required.

  2. Altered source versions must be plainly marked as such, and must not be 
     misrepresented as being the original software.

  3. This notice may not be removed or altered from any source distribution.

********************************************************************************/

var kbArray = new Array();

var agent = navigator.userAgent.toLowerCase();
var msie = (agent.indexOf("msie") != -1);

function setup_event(elem, eventType, handler)
{
  if(elem.attachEvent)
  {
    elem.attachEvent('on' + eventType, handler);
  }
  else if(elem.addEventListener)
  {
    elem.addEventListener(eventType, handler, false);
  }
}

function detach_event(elem, eventType, handler)
{
  if(elem.detachEvent)
  {
    elem.detachEvent('on' + eventType, handler);
  }
  else if(elem.removeEventListener)
  {
    elem.removeEventListener(eventType, handler, false);
  }
}

function get_event_source(e)
{
  var event = e ? e : window.event;
  return event.srcElement ? event.srcElement : event.target;
}

function setup_style(element, top, left, width, height, position, border_color, text_align, line_height, font_weight, font_size, padding_left, padding_right)
{
  if(top != "") element.style.top = top;
  if(left != "") element.style.left = left;
  if(width != "") element.style.width = width;
  if(height != "") element.style.height = height;
  if(position != "") element.style.position = position;

  if(border_color != undefined) element.style.border = "1px solid " + String(border_color);
  if(line_height != undefined) element.style.lineHeight = line_height;
  if(text_align != undefined) element.style.textAlign = text_align;

  if((padding_left != undefined) && (padding_left != "")) element.style.paddingLeft = padding_left;
  if((padding_right != undefined) && (padding_right != "")) element.style.paddingRight = padding_right;

  element.style.fontWeight = (font_weight != undefined) ? font_weight : "bold";
  element.style.fontSize = (font_size != undefined) ? font_size : "14px";

  if(msie) element.UNSELECTABLE = "on";
}

function setup_key_element(install_default_event, top, left, width, height, border_color, text_align, line_height, font_weight, font_size, padding_left, padding_right)
{
  var key = document.createElement("DIV");
  setup_style(key, top, left, width, height, "absolute");

  var key_sub = document.createElement("DIV");
  key.appendChild(key_sub);

  if(msie)
    /* Standards-compliant ("strict") mode: */
    setup_style(key_sub, "", "", key.style.pixelWidth - 2 - (String(padding_left) != "undefined" ? padding_left.substring(0, padding_left.indexOf("px")) : 0) - (String(padding_right) != "undefined" ? padding_right.substring(0, padding_right.indexOf("px")) : 0), "", "", border_color, text_align, line_height, font_weight, font_size, padding_left, padding_right);
    /* Quirks/Transitional/pre-HTML-4 mode: */
//  setup_style(key_sub, "", "", key.style.pixelWidth, "", "", border_color, text_align, line_height, font_weight, font_size, padding_left, padding_right);
  else
    /* All other browsers: */
    setup_style(key_sub, "", "", "", "", "", border_color, text_align, line_height, font_weight, font_size, padding_left, padding_right);

  if(install_default_event)
    setup_event(key_sub, 'mousedown', generic_callback_proc);

  var retObj = new Object();
  retObj.main = key;
  retObj.sub = key_sub;

  return retObj;
}

function ShowVKeyboard(container_id, callback_proc, shownhide_on_change)
{
  var ct = document.getElementById(container_id);
  var vkboard = kbArray[container_id];

  if(vkboard)
  {
    var changed = false;

    if((vkboard.Callback != callback_proc) && (String(callback_proc).length > 0))
    {
      vkboard.Callback = callback_proc;
      changed = true;
    }

    if(!changed || (changed && (shownhide_on_change == true)))
    {
      vkboard.Show = !vkboard.Show;
      ct.style.display = (vkboard.Show ? "block" : "none");

      if(!vkboard.Show)
      {
        var menu = document.getElementById(container_id + "___lang_menu");
        if(menu)
        {
          if(vkboard.LayoutMenuOpened == true)
          {
            menu.style.display = "none";
            vkboard.LayoutMenuOpened = false;
          }
        }
      }
    }
  }
  else
  {
    vkboard = new Object;

    vkboard.Show = true;
    vkboard.Callback = callback_proc;
    vkboard.Caps = false;
    vkboard.Shift = false;
    vkboard.AltGr = false;
    vkboard.CurrentLayout = "Us";
    vkboard.LayoutMenuOpened = false;
    vkboard.keys = new Array();

    kbArray[container_id] = vkboard;

    var kb_main = document.createElement("DIV");
    ct.appendChild(kb_main);

    kb_main.style.width = "540px";          // Should be 542px if in Quirks mode with MS IE/Opera
    kb_main.style.height = "131px";         // Should be 133px if in Quirks mode with MS IE/Opera
    kb_main.style.border = "1px solid #999";
    kb_main.style.position = "relative";
    kb_main.style.cursor = "default";

    // Row of numbers:

    for(var i = 0; i < 13; i++)
    {
      var key = setup_key_element(false, "1px", String(i * 26 + 1) + "px", "25px", "25px", "#777", "center", "23px");
      key.sub.id = container_id + "___key" + String(i);
      kb_main.appendChild(key.main);

      vkboard.keys[i] = key.sub;
    }

    var kb_kbp = setup_key_element(true, "1px", "339px", "74px", "25px", "#777", "right", "23px", "normal", "14px", "", "4px");
    kb_kbp.sub.innerHTML = "BackSpace";
    kb_kbp.sub.id = container_id + "___kbp";
    kb_main.appendChild(kb_kbp.main);

    // First row of letters:

    var kb_tab = setup_key_element(true, "27px", "1px", "37px", "25px", "#777", "left", "23px", "normal", "14px", "4px");
    kb_tab.sub.innerHTML = "Tab";
    kb_tab.sub.id = container_id + "___tab";
    kb_main.appendChild(kb_tab.main);

    for(; i < 26; i++)
    {
      var key = setup_key_element(false, "27px", String((i - 13) * 26 + 39) + "px", "25px", "25px", "#777", "center", "23px");
      key.sub.id = container_id + "___key" + String(i);
      kb_main.appendChild(key.main);

      vkboard.keys[i] = key.sub;
    }

    var kb_enter_top = setup_key_element(true, "27px", "377px", "36px", "27px", "#777", "center", "25px");
    kb_enter_top.sub.style.borderBottom = "0px";
    kb_enter_top.sub.innerHTML = "&nbsp;";
    kb_enter_top.sub.subst = "Enter";                   // Special expando
    kb_enter_top.sub.id = container_id + "___enter_top";
    kb_main.appendChild(kb_enter_top.main);

    // Second row of letters:

    var kb_caps = setup_key_element(true, "53px", "1px", "50px", "25px", "#777", "left", "23px", "normal", "14px", "4px");
    kb_caps.sub.innerHTML = "Caps";
    kb_caps.sub.id = container_id + "___caps";
    kb_main.appendChild(kb_caps.main);

    for(; i < 38; i++)
    {
      var key = setup_key_element(false, "53px", String((i - 26) * 26 + 52) + "px", "25px", "25px", "#777", "center", "23px");
      key.sub.id = container_id + "___key" + String(i);
      kb_main.appendChild(key.main);

      vkboard.keys[i] = key.sub;
    }

    var kb_enter_l = setup_key_element(true, "53px", "364px", "16px", "25px", "#777", "right", "23px", "normal", "14px", "", "4px");
    kb_enter_l.sub.style.borderRightColor = "#FFF";
    kb_enter_l.sub.innerHTML = "&nbsp";
    kb_enter_l.sub.subst = "Enter";
    kb_enter_l.sub.id = container_id + "___enter_l";
    kb_main.appendChild(kb_enter_l.main);

    var kb_enter = setup_key_element(true, "53px", "377px", "36px", "25px", "#777", "right", "23px", "normal", "14px", "", "4px");
    kb_enter.sub.style.borderTopColor = "#FFF";
    kb_enter.sub.style.borderLeftColor = "#FFF";
    kb_enter.sub.innerHTML = "Enter";
    kb_enter.sub.id = container_id + "___enter";
    kb_main.appendChild(kb_enter.main);

    // Third row of letters:

    var kb_shift = setup_key_element(true, "79px", "1px", "63px", "25px", "#777", "left", "23px", "normal", "14px", "4px");
    kb_shift.sub.innerHTML = "Shift";
    kb_shift.sub.id = container_id + "___shift";
    kb_main.appendChild(kb_shift.main);

    for(; i < 48; i++)
    {
      var key = setup_key_element(false, "79px", String((i - 38) * 26 + 65) + "px", "25px", "25px", "#777", "center", "23px");
      key.sub.id = container_id + "___key" + String(i);
      kb_main.appendChild(key.main);

      vkboard.keys[i] = key.sub;
    }

    var kb_shift_r = setup_key_element(true, "79px", "325px", "88px", "25px", "#777", "right", "23px", "normal", "14px", "", "4px");
    kb_shift_r.sub.innerHTML = "Shift";
    kb_shift_r.sub.id = container_id + "___shift_r";
    kb_main.appendChild(kb_shift_r.main);

    // Language selector:
    var kb_res_1 = setup_key_element(false, "105px", "1px", "33px", "25px", "#F77", "left", "23px", "normal", "14px", "4px");
    kb_res_1.sub.id = container_id + "___lang";
    setup_event(kb_res_1.sub, 'mousedown', handle_lang_choice_menu);

    var kb_res_2 = setup_key_element(false, "105px", "35px", "33px", "25px", "#CCC", "center", "23px");
    kb_res_2.sub.innerHTML = "&nbsp;";
    kb_res_2.sub.id = container_id + "___res_2";

    var kb_res_3 = setup_key_element(false, "105px", "69px", "33px", "25px", "#CCC", "center", "23px");
    kb_res_3.sub.innerHTML = "&nbsp;";
    kb_res_3.sub.id = container_id + "___res_3";

    var kb_space = setup_key_element(true, "105px", "103px", "157px", "25px", "#777", "center", "23px");
    kb_space.sub.innerHTML = "&nbsp;";
    kb_space.sub.id = container_id + "___space";

    var kb_alt_gr = setup_key_element(true, "105px", "261px", "33px", "25px", "#777", "center", "23px", "normal", "11px");
    kb_alt_gr.sub.innerHTML = "AltGr";
    kb_alt_gr.sub.id = container_id + "___alt_gr";

    var kb_res_5 = setup_key_element(false, "105px", "295px", "33px", "25px", "#CCC", "center", "23px");
    kb_res_5.sub.innerHTML = "&nbsp;";
    kb_res_5.sub.id = container_id + "___res_5";

    var kb_res_6 = setup_key_element(false, "105px", "329px", "33px", "25px", "#CCC", "center", "23px");
    kb_res_6.sub.innerHTML = "&nbsp;";
    kb_res_6.sub.id = container_id + "___res_6";

    kb_main.appendChild(kb_res_1.main);
    kb_main.appendChild(kb_res_2.main);
    kb_main.appendChild(kb_res_3.main);
    kb_main.appendChild(kb_space.main);
    kb_main.appendChild(kb_alt_gr.main);
    kb_main.appendChild(kb_res_5.main);
    kb_main.appendChild(kb_res_6.main);

    // Numeric keypad:
    var kb_pad_eur = setup_key_element(true, "1px", "436px", "25px", "25px", "#777", "center", "23px");
    kb_pad_eur.sub.innerHTML = "&#x20AC;";
    kb_pad_eur.sub.id = container_id + "___pad_eur";

    var kb_pad_slash = setup_key_element(true, "1px", "462px", "25px", "25px", "#777", "center", "23px");
    kb_pad_slash.sub.innerHTML = "/";
    kb_pad_slash.sub.id = container_id + "___pad_slash";

    var kb_pad_star = setup_key_element(true, "1px", "488px", "25px", "25px", "#777", "center", "23px");
    kb_pad_star.sub.innerHTML = "*";
    kb_pad_star.sub.id = container_id + "___pad_star";

    var kb_pad_minus = setup_key_element(true, "1px", "514px", "25px", "25px", "#777", "center", "23px");
    kb_pad_minus.sub.innerHTML = "-";
    kb_pad_minus.sub.id = container_id + "___pad_minus";

    var kb_pad_7 = setup_key_element(true, "27px", "436px", "25px", "25px", "#777", "center", "23px");
    kb_pad_7.sub.innerHTML = "7";
    kb_pad_7.sub.id = container_id + "___pad_7";

    var kb_pad_8 = setup_key_element(true, "27px", "462px", "25px", "25px", "#777", "center", "23px");
    kb_pad_8.sub.innerHTML = "8";
    kb_pad_8.sub.id = container_id + "___pad_8";

    var kb_pad_9 = setup_key_element(true, "27px", "488px", "25px", "25px", "#777", "center", "23px");
    kb_pad_9.sub.innerHTML = "9";
    kb_pad_9.sub.id = container_id + "___pad_9";

    var kb_pad_plus = setup_key_element(true, "27px", "514px", "25px", "51px", "#777", "center", "49px");
    kb_pad_plus.sub.innerHTML = "+";
    kb_pad_plus.sub.id = container_id + "___pad_plus";

    var kb_pad_4 = setup_key_element(true, "53px", "436px", "25px", "25px", "#777", "center", "23px");
    kb_pad_4.sub.innerHTML = "4";
    kb_pad_4.sub.id = container_id + "___pad_4";

    var kb_pad_5 = setup_key_element(true, "53px", "462px", "25px", "25px", "#777", "center", "23px");
    kb_pad_5.sub.innerHTML = "5";
    kb_pad_5.sub.id = container_id + "___pad_8";

    var kb_pad_6 = setup_key_element(true, "53px", "488px", "25px", "25px", "#777", "center", "23px");
    kb_pad_6.sub.innerHTML = "6";
    kb_pad_6.sub.id = container_id + "___pad_6";

    var kb_pad_1 = setup_key_element(true, "79px", "436px", "25px", "25px", "#777", "center", "23px");
    kb_pad_1.sub.innerHTML = "1";
    kb_pad_1.sub.id = container_id + "___pad_1";

    var kb_pad_2 = setup_key_element(true, "79px", "462px", "25px", "25px", "#777", "center", "23px");
    kb_pad_2.sub.innerHTML = "2";
    kb_pad_2.sub.id = container_id + "___pad_2";

    var kb_pad_3 = setup_key_element(true, "79px", "488px", "25px", "25px", "#777", "center", "23px");
    kb_pad_3.sub.innerHTML = "3";
    kb_pad_3.sub.id = container_id + "___pad_3";

    var kb_pad_enter = setup_key_element(true, "79px", "514px", "25px", "51px", "#777", "center", "49px", "normal", "9px");
    kb_pad_enter.sub.innerHTML = "Enter";
    kb_pad_enter.sub.id = container_id + "___pad_enter";

    var kb_pad_0 = setup_key_element(true, "105px", "436px", "51px", "25px", "#777", "left", "23px", "bold", "14px", "7px");
    kb_pad_0.sub.innerHTML = "0";
    kb_pad_0.sub.id = container_id + "___pad_0";

    var kb_pad_period = setup_key_element(true, "105px", "488px", "25px", "25px", "#777", "center", "23px");
    kb_pad_period.sub.innerHTML = ".";
    kb_pad_period.sub.id = container_id + "___pad_period";

    kb_main.appendChild(kb_pad_eur.main);
    kb_main.appendChild(kb_pad_slash.main);
    kb_main.appendChild(kb_pad_star.main);
    kb_main.appendChild(kb_pad_minus.main);

    kb_main.appendChild(kb_pad_7.main);
    kb_main.appendChild(kb_pad_8.main);
    kb_main.appendChild(kb_pad_9.main);
    kb_main.appendChild(kb_pad_plus.main);

    kb_main.appendChild(kb_pad_4.main);
    kb_main.appendChild(kb_pad_5.main);
    kb_main.appendChild(kb_pad_6.main);

    kb_main.appendChild(kb_pad_1.main);
    kb_main.appendChild(kb_pad_2.main);
    kb_main.appendChild(kb_pad_3.main);
    kb_main.appendChild(kb_pad_enter.main);

    kb_main.appendChild(kb_pad_0.main);
    kb_main.appendChild(kb_pad_period.main);

    refresh_layout(container_id);
  }
}

function set_key_state(key, onoff, textcolor, bordercolor, backgroundcolor)
{
  if(key && key.style)
  {
    if(backgroundcolor) key.style.backgroundColor = backgroundcolor;
    if(bordercolor) key.style.borderColor = bordercolor;
    if(textcolor) key.style.color = textcolor;

    detach_event(key, 'mousedown', generic_callback_proc);
    if(onoff)
      setup_event(key, 'mousedown', generic_callback_proc);
  }
}

function refresh_layout(container_id)
{
  var vkboard = kbArray[container_id];

  var layout_name = vkboard.CurrentLayout;
  var arr_type = vkboard.AltGr ? (vkboard.Shift ? "alt_gr_shift" : "alt_gr") : (vkboard.Shift ? "shift" : (vkboard.Caps ? "caps" : "normal"));

  eval("var caps_arr = typeof(" + layout_name + "_caps) != 'undefined'");
  if(caps_arr)
    eval("caps_arr = " + layout_name + "_caps.length == 48;");

  eval("var shift_arr = typeof(" + layout_name + "_shift) != 'undefined'");
  if(shift_arr)
    eval("shift_arr = " + layout_name + "_shift.length == 48;");

  eval("var alt_gr_arr = typeof(" + layout_name + "_alt_gr) != 'undefined'");
  if(alt_gr_arr)
    eval("alt_gr_arr = " + layout_name + "_alt_gr.length == 48;");

  eval("var alt_gr_shift_arr = alt_gr_arr && typeof(" + layout_name + "_alt_gr_shift) != 'undefined'");
  if(alt_gr_shift_arr)
    eval("alt_gr_shift_arr = " + layout_name + "_alt_gr_shift.length == 48;");

  var caps = document.getElementById(container_id + "___caps");
  var shift = document.getElementById(container_id + "___shift");
  var shift_r = document.getElementById(container_id + "___shift_r");
  var alt_gr = document.getElementById(container_id + "___alt_gr");

  if(shift_arr)
  {
    set_key_state(shift, true, "#000", "#777", vkboard.Shift ? "#DDD" : "#FFF");
    set_key_state(shift_r, true, "#000", "#777", vkboard.Shift ? "#DDD" : "#FFF");
  }
  else
  {
    set_key_state(shift, false, "#CCC", "#CCC", "#FFF");
    set_key_state(shift_r, false, "#CCC", "#CCC", "#FFF");

    if(arr_type == "shift")
    {
      arr_type = "normal";
      vkboard.Shift = false;
    }
  }

  if(alt_gr_arr)
  {
    set_key_state(alt_gr, true, "#000", "#777", vkboard.AltGr ? "#DDD" : "#FFF");

    if((arr_type == "alt_gr") || (arr_type == "alt_gr_shift"))
    {
      if(alt_gr_shift_arr)
      {
        set_key_state(shift, true, "#000", "#777", "");
        set_key_state(shift_r, true, "#000", "#777", "");
      }
      else
      {
        set_key_state(shift, false, "#CCC", "#CCC", "#FFF");
        set_key_state(shift_r, false, "#CCC", "#CCC", "#FFF");

        arr_type = "alt_gr";
        vkboard.Shift = false;
      }
    }
  }
  else
  {
    set_key_state(alt_gr, false, "#CCC", "#CCC", "#FFF");

    if(arr_type == "alt_gr")
    {
      arr_type = "normal";
      vkboard.AltGr = false;
    }
    else if(arr_type == "alt_gr_shift")
    {
      arr_type = "normal";
      vkboard.AltGr = false;
      vkboard.Shift = false;

      shift.style.backgroundColor = "#FFF";
      shift_r.style.backgroundColor = "#FFF";
    }
  }

  if(caps_arr && (arr_type != "alt_gr") && (arr_type != "alt_gr_shift"))
  {
    set_key_state(caps, true, "#000", "#777", vkboard.Caps ? "#DDD" : "#FFF");
  }
  else
  {
    set_key_state(caps, false, "#CCC", "#CCC", "#FFF");

    vkboard.Caps = false;
    if(arr_type == "caps") arr_type = "normal";
  }

  for(var i = 0; i < 48; i++)
  {
    eval("var key_val = " + layout_name + "_" + arr_type + "[" + String(i) + "];");
    var key = vkboard.keys[i];

    if(vkboard.Shift && vkboard.Caps)
    {
      var ndx = "[" + String(i) + "]";

      eval("var key_nrm = " + layout_name + "_normal" + ndx);
      eval("var key_cps = " + layout_name + "_caps" + ndx);
      eval("var key_shf = " + layout_name + "_shift" + ndx);

      if((key_cps == key_shf) && (key_nrm != key_cps))
        key_val = key_nrm;
    }

    if(key_val != "")
    {
      key.innerHTML = key_val;
      set_key_state(key, true, "", "#777", "");
    }
    else
    {
      key.innerHTML = "&nbsp;";
      set_key_state(key, false, "", "#CCC", "");
    }
  }

  document.getElementById(container_id + "___lang").innerHTML = layout_name;
}

function handle_lang_choice_menu(event)
{
  var in_el = get_event_source(event);
  var container_id = in_el.id.substring(0, in_el.id.indexOf("___"));

  var menu = document.getElementById(container_id + "___lang_menu");
  var vkboard = kbArray[container_id];

  if(menu)
  {
    if(vkboard.LayoutMenuOpened == true)
    {
      menu.style.display = "none";
      vkboard.LayoutMenuOpened = false;
    }
    else
    {
      menu.style.display = "block";
      vkboard.LayoutMenuOpened = true;
    }
  }
  else
  {
    var ct = document.getElementById(container_id);

    var menu = document.createElement("DIV");
    ct.appendChild(menu);

    menu.id = container_id + "___lang_menu";
    menu.style.display = "block";
    menu.style.width = "102px";
    menu.style.height = String(avail_langs.length * 26 + 1) + "px";
    menu.style.top = "1px";
    menu.style.left = "0px";
    menu.style.border = "1px solid #777";
    menu.style.position = "relative";
    menu.style.cursor = "default";

    for(var j = 0; j < avail_langs.length; j++)
    {
      var item = setup_key_element(false, String(26 * j + 1) + "px", "1px", "100px", "25px", "#CCC", "left", "23px", "normal", "14px", "4px");
      menu.appendChild(item.main);

      item.sub.id = container_id + "___lang_" + String(j);
      item.sub.innerHTML = avail_langs[j][1];

      setup_event(item.sub, 'mousedown', handle_lang_choice_item);
      setup_event(item.sub, 'mouseover', handle_lang_choice_item_over);
      setup_event(item.sub, 'mouseout', handle_lang_choice_item_out);
    }

    vkboard.LayoutMenuOpened = true;
  }
}

function handle_lang_choice_item(event)
{
  var in_el = get_event_source(event);

  var ndx = in_el.id.indexOf("___lang_");
  var lng = in_el.id.substring(ndx + 8, in_el.id.length);

  var container_id = in_el.id.substring(0, ndx);
  var vkboard = kbArray[container_id];

  vkboard.CurrentLayout = avail_langs[lng][0];
  refresh_layout(container_id);

  document.getElementById(container_id + "___lang_menu").style.display = "none";
  vkboard.LayoutMenuOpened = false;
}

function handle_lang_choice_item_over(event)
{
  get_event_source(event).style.backgroundColor = "#DDD";
}

function handle_lang_choice_item_out(event)
{
  get_event_source(event).style.backgroundColor = "#FFF";
}

function generic_callback_proc(event)
{
  event.cancelBubble = true;
  event.returnValue = false;

  var in_el = get_event_source(event);
  var container_id = in_el.id.substring(0, in_el.id.indexOf("___"));

  var vkboard = kbArray[container_id];
  var val = in_el.subst ? in_el.subst : in_el.innerHTML;

  if (val == "") return;

  else if (val == "Caps")
  {
    vkboard.Caps = !vkboard.Caps;
    refresh_layout(container_id);
    return;
  }

  else if (val == "Shift")
  {
    vkboard.Shift = !vkboard.Shift;
    refresh_layout(container_id);
    return;
  }

  else if (val == "AltGr")
  {
    vkboard.AltGr = !vkboard.AltGr;
    refresh_layout(container_id);
    return;
  }

  else if (val == "&lt;") val = "<";
  else if (val == "&gt;") val = ">";
  else if (val == "&amp;") val = "&";
  else if (val == "&nbsp;") val = " ";
  else if (val == "&quot;") val = "\"";
  else if (val == "Tab") val = "   ";

  if((vkboard.Callback != undefined) && (vkboard.Callback != ""))
    eval(vkboard.Callback + (val == "\"" ? "('" + val + "')" : (val == "\\" ? "(\"\\\\\")" : "(\"" + val + "\")")));
}

// Layout info:

var avail_langs = new Array(Array("Us", "English (US)"), Array("Ca", "Canadian"),
                            Array("Ru", "Russian"),      Array("De", "German"),
                            Array("Fr", "French"),       Array("Es", "Spanish"),
                            Array("It", "Italian"),      Array("Cz", "Czech"),
                            Array("El", "Greek"),        Array("He", "Hebrew"));

// Us International:

var Us_normal = new Array("&#x0060;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x005B;", "&#x005D;", "&#x005C;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x003B;", "&#x0027;", "",
                          "&#x007A;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x002F;");

var Us_caps = new Array("&#x0060;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x005B;", "&#x005D;", "&#x005C;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x003B;", "&#x0027;", "",
                        "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x002F;");

var Us_shift = new Array("&#x007E;", "&#x0021;", "&#x0040;", "&#x0023;", "&#x0024;", "&#x0025;", "&#x005E;", "&#x0026;", "&#x002A;", "&#x0028;", "&#x0029;", "&#x005F;", "&#x002B;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x007B;", "&#x007D;", "&#x007C;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x003A;", "&#x0022;", "",
                         "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x003C;", "&#x003E;", "&#x003F;");

var Us_alt_gr = new Array("", "&#x00A1;", "&#x00B2;", "&#x00B3;", "&#x00A4;", "&#x20AC;", "&#x00BC;", "&#x00BD;", "&#x00BE;", "&#x0091;", "&#x0092;", "&#x00A5;", "&#x00D7;",
                          "&#x00E4;", "&#x00E5;", "&#x00E9;", "&#x00AE;", "&#x00FE;", "&#x00FC;", "&#x00FA;", "&#x00ED;", "&#x00F3;", "&#x00F6;", "&#x00AB;", "&#x00BB;",
                          "&#x00AC;", "&#x00E1;", "&#x00DF;", "&#x0111;", "", "", "", "", "", "&#x00F8;", "&#x00B6;", "&#x00B4;", "", "&#x00E6;", "", "&#x00A9;", "", "",
                          "&#x00F1;", "&#x00B5;", "&#x00E7;", "", "&#x00BF;");

var Us_alt_gr_shift = new Array("", "&#x00B9;", "", "", "&#x00A3;", "", "", "", "", "", "", "", "&#x00F7;", "&#x00C4;", "&#x00C5;", "&#x00C9;", "", "&#x00DE;", "&#x00DC;",
                                "&#x00DA;", "&#x00CD;", "&#x00D3;", "&#x00D6;", "", "", "&#x00A6;", "&#x00C1;", "&#x00A7;", "&#x0110;", "", "", "", "", "", "&#x00D8;",
                                "&#x00B0;", "&#x00A8;", "", "&#x00C6;", "", "&#x00A2;", "", "", "&#x00D1;", "", "&#x00C7;", "", "");

// Canadian (multilingual standard):

var Ca_normal = new Array("&#x002F;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x02C6;", "&#x00E7;", "&#x00F9;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x003B;", "&#x00E8;", "&#x00E0;",
                          "&#x007A;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x00E9;");

var Ca_caps = new Array("&#x002F;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x02C6;", "&#x00C7;", "&#x00D9;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x003B;", "&#x00C8;", "&#x00C0;",
                        "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x00C9;");

var Ca_shift = new Array("&#x005C;", "&#x0021;", "&#x0040;", "&#x0023;", "&#x0024;", "&#x0025;", "&#x003F;", "&#x0026;", "&#x002A;", "&#x0028;", "&#x0029;", "&#x005F;", "&#x002B;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00A8;", "&#x00C7;", "&#x00D9;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x003A;", "&#x00C8;", "&#x00C0;",
                         "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x0027;", "&#x0022;", "&#x00C9;");

var Ca_alt_gr = new Array("&#x007C;", "", "", "", "", "", "", "&#x007B;", "&#x007D;", "&#x005B;", "&#x005D;", "", "&#x00AC;", "", "", "", "", "", "", "", "", "", "", "&#x0060;",
                          "&#x007E;", "", "", "", "", "", "", "", "", "", "", "&#x00B0;", "", "", "&#x00AB;", "&#x00BB;", "", "", "", "", "", "&#x003C;", "&#x003E;", "");

// Russian:

var Ru_normal = new Array("&#x0451;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                          "&#x0439;", "&#x0446;", "&#x0443;", "&#x043A;", "&#x0435;", "&#x043D;", "&#x0433;", "&#x0448;", "&#x0449;", "&#x0437;", "&#x0445;", "&#x044A;", "&#x005C;",
                          "&#x0444;", "&#x044B;", "&#x0432;", "&#x0431;", "&#x043F;", "&#x0440;", "&#x043E;", "&#x043B;", "&#x0434;", "&#x0436;", "&#x044D;", "",
                          "&#x044F;", "&#x0447;", "&#x0441;", "&#x043C;", "&#x0438;", "&#x0442;", "&#x044C;", "&#x0431;", "&#x044E;", "&#x002E;");

var Ru_caps = new Array("&#x0401;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                        "&#x0419;", "&#x0426;", "&#x0423;", "&#x041A;", "&#x0415;", "&#x041D;", "&#x0413;", "&#x0428;", "&#x0429;", "&#x0417;", "&#x0425;", "&#x042A;", "&#x005C;",
                        "&#x0424;", "&#x042B;", "&#x0412;", "&#x0411;", "&#x041F;", "&#x0420;", "&#x041E;", "&#x041B;", "&#x0414;", "&#x0416;", "&#x042D;", "",
                        "&#x042F;", "&#x0427;", "&#x0421;", "&#x041C;", "&#x0418;", "&#x0422;", "&#x042C;", "&#x0411;", "&#x042E;", "&#x002E;");

var Ru_shift = new Array("&#x0401;", "&#x0021;", "&#x0022;", "&#x0023;", "&#x003B;", "&#x0025;", "&#x003A;", "&#x003F;", "&#x002A;", "&#x0028;", "&#x0029;", "&#x005F;", "&#x002B;",
                         "&#x0419;", "&#x0426;", "&#x0423;", "&#x041A;", "&#x0415;", "&#x041D;", "&#x0413;", "&#x0428;", "&#x0429;", "&#x0417;", "&#x0425;", "&#x042A;", "&#x002F;",
                         "&#x0424;", "&#x042B;", "&#x0412;", "&#x0411;", "&#x041F;", "&#x0420;", "&#x041E;", "&#x041B;", "&#x0414;", "&#x0416;", "&#x042D;", "",
                         "&#x042F;", "&#x0427;", "&#x0421;", "&#x041C;", "&#x0418;", "&#x0422;", "&#x042C;", "&#x0411;", "&#x042E;", "&#x002C;");

// German:

var De_normal = new Array("&#x005E;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x03B2;", "&#x02CA;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x007A;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x00FC;", "&#x002B;", "&#x003C;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x00F6;", "&#x00E4;", "&#x0023;",
                          "&#x0079;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x002D;");

var De_caps = new Array("&#x02C6;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x03B2;", "&#x02CA;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x005A;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00DC;", "&#x002B;", "&#x003C;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00D6;", "&#x00C4;", "&#x0023;",
                        "&#x0059;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x002D;");

var De_shift = new Array("&#x00BA;", "&#x0021;", "&#x0022;", "&#x00A7;", "&#x0024;", "&#x0025;", "&#x0026;", "&#x002F;", "&#x0028;", "&#x0029;", "&#x003D;", "&#x003F;", "&#x02CB;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x005A;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00DC;", "&#x002A;", "&#x003E;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00D6;", "&#x00C4;", "&#x0027;",
                         "&#x0059;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x003B;", "&#x003A;", "&#x005F;");

var De_alt_gr = new Array("", "", "&#x00B2;", "&#x00B3;", "", "", "", "&#x007B;", "&#x005B;", "&#x005D;", "&#x007D;", "&#x005C;", "", "&#x0040;", "", "&#x20AC;", "", "", "", "", "",
                          "", "", "", "&#x007E;", "&#x007C;", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "&#x00B5;", "", "", "");

// French:

var Fr_normal = new Array("&#x00B2;", "&#x0026;", "&#x00E9;", "&#x0022;", "&#x0027;", "&#x0028;", "&#x007C;", "&#x00E8;", "&#x005F;", "&#x00E7;", "&#x00E0;", "&#x0029;", "&#x003D;",
                          "&#x0061;", "&#x007A;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x005E;", "&#x0024;", "&#x003C;",
                          "&#x0071;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x006D;", "&#x00F9;", "&#x002A;",
                          "&#x0077;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x002C;", "&#x003B;", "&#x003A;", "&#x0021;");

var Fr_caps = new Array("&#x00B2;", "&#x0026;", "&#x00C9;", "&#x0022;", "&#x0027;", "&#x0028;", "&#x007C;", "&#x00C8;", "&#x005F;", "&#x00C7;", "&#x00C0;", "&#x0029;", "&#x003D;",
                        "&#x0041;", "&#x005A;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x005E;", "&#x0024;", "&#x003C;",
                        "&#x0051;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x004D;", "&#x00D9;", "&#x002A;",
                        "&#x0057;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x002C;", "&#x003B;", "&#x003A;", "&#x0021;");

var Fr_shift = new Array("", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x00BA;", "&#x002B;",
                         "&#x0041;", "&#x005A;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00A8;", "&#x00A3;", "&#x003E;",
                         "&#x0051;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x004D;", "&#x0025;", "&#x00B5;",
                         "&#x0057;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x003F;", "&#x005F;", "&#x002F;", "&#x00A7;");

var Fr_alt_gr = new Array("", "", "", "&#x0023;", "&#x007B;", "&#x005B;", "&#x007C;", "", "&#x005C;", "&#x005E;", "&#x0040;", "&#x005D;", "&#x007D;", "", "", "", "", "", "", "", "",
                          "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");

// Spanish:

var Es_normal = new Array("&#x00BA;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x0092;", "&#x00A1;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x0060;", "&#x002B;", "&#x003C;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x00F1;", "&#x00B4;", "&#x00E7;",
                          "&#x007A;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x002D;");

var Es_caps = new Array("&#x00BA;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x0092;", "&#x00A1;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x0060;", "&#x002B;", "&#x003C;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00D1;", "&#x00B4;", "&#x00C7;",
                        "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x002D;");

var Es_shift = new Array("&#x00AA;", "&#x0021;", "&#x0022;", "&#x0027;", "&#x0024;", "&#x0025;", "&#x0026;", "&#x002F;", "&#x0028;", "&#x0029;", "&#x003D;", "&#x003F;", "&#x00BF;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x005E;", "&#x002A;", "&#x003E;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00D1;", "&#x00A8;", "&#x00C7;",
                         "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x003B;", "&#x003A;", "&#x005F;");

var Es_alt_gr = new Array("&#x005C;", "&#x007C;", "&#x0040;", "&#x0023;", "", "", "&#x00AC;", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "&#x005B;",
                          "&#x005D;", "", "", "", "", "", "", "", "", "", "", "", "&#x007B;", "&#x007D;", "", "", "", "", "", "", "", "", "", "");

// Italian:

var It_normal = new Array("&#x005C;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x0092;", "&#x00EC;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x00E8;", "&#x002B;", "&#x003C;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x00F2;", "&#x00E0;", "&#x00F9;",
                          "&#x007A;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x002D;");

var It_caps = new Array("&#x005C;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x0092;", "&#x00EC;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00C8;", "&#x002B;", "&#x003C;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00D2;", "&#x00C0;", "&#x00D9;",
                        "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x002D;");

var It_shift = new Array("&#x007C;", "&#x0021;", "&#x0022;", "&#x00A3;", "&#x0024;", "&#x0025;", "&#x0026;", "&#x002F;", "&#x0028;", "&#x0029;", "&#x003D;", "&#x003F;", "&#x005E;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00E9;", "&#x002A;", "&#x003C;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x00E7;", "&#x00B0;", "&#x00A7;",
                         "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x003B;", "&#x003A;", "&#x005F;");

var It_alt_gr = new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "&#x005B;", "&#x005D;",
                          "", "", "", "", "", "", "", "", "", "", "&#x0040;", "&#x0023;", "", "", "", "", "", "", "", "", "", "", "");

var It_alt_gr_shift = new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "&#x007B;",
                                "&#x007D;", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");

// Czech:

var Cz_normal = new Array("&#x003B;", "&#x002B;", "&#x011B;", "&#x0161;", "&#x010D;", "&#x0159;", "&#x017E;", "&#x00FD;", "&#x00E1;", "&#x00ED;", "&#x00E9;", "&#x003D;", "&#x02CA;",
                          "&#x0071;", "&#x0077;", "&#x0065;", "&#x0072;", "&#x0074;", "&#x0079;", "&#x0075;", "&#x0069;", "&#x006F;", "&#x0070;", "&#x00FA;", "&#x0029;", "&#x005C;",
                          "&#x0061;", "&#x0073;", "&#x0064;", "&#x0066;", "&#x0067;", "&#x0068;", "&#x006A;", "&#x006B;", "&#x006C;", "&#x016F;", "&#x00A7;", "&#x00A8;",
                          "&#x007A;", "&#x0078;", "&#x0063;", "&#x0076;", "&#x0062;", "&#x006E;", "&#x006D;", "&#x002C;", "&#x002E;", "&#x002D;");

var Cz_caps = new Array("&#x003B;", "&#x002B;", "&#x011A;", "&#x0160;", "&#x010C;", "&#x0158;", "&#x017D;", "&#x00DD;", "&#x00C1;", "&#x00CD;", "&#x00C9;", "&#x003D;", "&#x02CA;",
                        "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x00DA;", "&#x0029;", "&#x005C;",
                        "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x016E;", "&#x00A7;", "",
                        "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x002C;", "&#x002E;", "&#x002D;");

var Cz_shift = new Array("&#x00BA;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x0025;", "&#x02C7;",
                         "&#x0051;", "&#x0057;", "&#x0045;", "&#x0052;", "&#x0054;", "&#x0059;", "&#x0055;", "&#x0049;", "&#x004F;", "&#x0050;", "&#x002F;", "&#x0028;", "&#x007C;",
                         "&#x0041;", "&#x0053;", "&#x0044;", "&#x0046;", "&#x0047;", "&#x0048;", "&#x004A;", "&#x004B;", "&#x004C;", "&#x0022;", "&#x0021;", "&#x0027;",
                         "&#x005A;", "&#x0058;", "&#x0043;", "&#x0056;", "&#x0042;", "&#x004E;", "&#x004D;", "&#x003F;", "&#x003A;", "&#x005F;");

var Cz_alt_gr = new Array("&#x0060;", "&#x0021;", "&#x0040;", "&#x0023;", "&#x0024;", "&#x0025;", "&#x005E;", "&#x0026;", "&#x002A;", "&#x0028;", "&#x0029;", "&#x002D;", "&#x003D;",
                          "", "", "&#x20AC;", "", "", "", "", "", "", "", "&#x005B;", "&#x005D;", "&#x03B2;", "", "", "", "", "", "", "", "", "", "&#x003B;", "&#x00A4;", "&#x005C;",
                          "", "", "", "", "", "", "", "&#x003C;", "&#x003E;", "&#x002F;");

var Cz_alt_gr_shift = new Array("&#x007E;", "", "", "", "", "", "", "", "", "", "", "&#x005F;", "&#x002B;", "", "", "&#x20AC;", "", "", "", "", "", "", "", "&#x007B;", "&#x007D;",
                                "&#x00A8;", "", "", "", "", "", "", "", "", "", "&#x003A;", "&#x005E;", "&#x007C;", "", "", "", "", "", "", "", "&#x00D7;", "&#x00F7;", "&#x003F;");

// Greek:

var El_normal = new Array("&#x0091;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                          "&#x003B;", "&#x03C2;", "&#x03B5;", "&#x03C1;", "&#x03C4;", "&#x03C5;", "&#x03B8;", "&#x03B9;", "&#x03BF;", "&#x03C0;", "&#x005B;", "&#x005D;", "&#x003C;",
                          "&#x03B1;", "&#x03C3;", "&#x03B4;", "&#x03C6;", "&#x03B3;", "&#x03B7;", "&#x03BE;", "&#x03BA;", "&#x03BB;", "&#x0092;", "&#x00B4;", "&#x005C;",
                          "&#x03B6;", "&#x03C7;", "&#x03C8;", "&#x03C9;", "&#x03B2;", "&#x03BD;", "&#x03BC;", "&#x002C;", "&#x002E;", "&#x002F;");

var El_caps = new Array("&#x0091;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                        "&#x003B;", "&#x03C2;", "&#x0395;", "&#x03A1;", "&#x03A4;", "&#x03A5;", "&#x0398;", "&#x0399;", "&#x039F;", "&#x03A0;", "&#x005B;", "&#x005D;", "&#x003C;",
                        "&#x0391;", "&#x03A3;", "&#x0394;", "&#x03A6;", "&#x0393;", "&#x0397;", "&#x039E;", "&#x039A;", "&#x039B;", "&#x0092;", "&#x00B4;", "&#x005C;",
                        "&#x0396;", "&#x03A7;", "&#x03A8;", "&#x03A9;", "&#x0392;", "&#x039D;", "&#x039C;", "&#x002C;", "&#x002E;", "&#x002F;");

var El_shift = new Array("&#x007E;", "&#x0021;", "&#x0040;", "&#x0023;", "&#x0024;", "&#x0025;", "&#x005E;", "&#x0026;", "&#x002A;", "&#x0028;", "&#x0029;", "&#x005F;", "&#x002B;",
                         "&#x003A;", "&#x02C6;", "&#x0395;", "&#x03A1;", "&#x03A4;", "&#x03A5;", "&#x0398;", "&#x0399;", "&#x039F;", "&#x03A0;", "&#x007B;", "&#x007D;", "&#x003E;",
                         "&#x0391;", "&#x03A3;", "&#x0394;", "&#x03A6;", "&#x0393;", "&#x0397;", "&#x039E;", "&#x039A;", "&#x039B;", "&#x00A8;", "&#x0022;", "&#x007C;",
                         "&#x0396;", "&#x03A7;", "&#x03A8;", "&#x03A9;", "&#x0392;", "&#x039D;", "&#x039C;", "&#x003C;", "&#x003E;", "&#x003F;");

var El_alt_gr = new Array("", "", "&#x00B2;", "&#x00B3;", "&#x00A3;", "&#x00A7;", "&#x00B6;", "", "&#x00A4;", "&#x00A6;", "&#x00B0;", "&#x00B1;", "&#x00BD;", "", "", "", "", "",
                          "", "", "", "", "", "&#x00AB;", "&#x00BB;", "", "", "", "", "", "", "", "", "", "", "&#x02C6;", "", "&#x00AC;", "", "", "", "", "", "", "", "", "", "");

// Hebrew:

var He_normal = new Array("&#x003B;", "&#x0031;", "&#x0032;", "&#x0033;", "&#x0034;", "&#x0035;", "&#x0036;", "&#x0037;", "&#x0038;", "&#x0039;", "&#x0030;", "&#x002D;", "&#x003D;",
                          "&#x002F;", "&#x0027;", "&#x05E7;", "&#x05E8;", "&#x05D0;", "&#x05D8;", "&#x05D5;", "&#x05DF;", "&#x05DD;", "&#x05E4;", "&#x005D;", "&#x005B;", "&#x005C;",
                          "&#x05E9;", "&#x05D3;", "&#x05D2;", "&#x05DB;", "&#x05E2;", "&#x05D9;", "&#x05D7;", "&#x05DC;", "&#x05DA;", "&#x05E3;", "&#x002C;", "&#x005C;",
                          "&#x05D6;", "&#x05E1;", "&#x05D1;", "&#x05D4;", "&#x05E0;", "&#x05DE;", "&#x05E6;", "&#x05EA;", "&#x05E5;", "&#x002E;");

var He_shift = new Array("&#x007E;", "&#x0021;", "&#x0040;", "&#x0023;", "&#x0024;", "&#x0025;", "&#x005E;", "&#x0026;", "&#x002A;", "&#x0029;", "&#x0028;", "&#x005F;", "&#x002B;",
                         "&#x002F;", "&#x0027;", "&#x05E7;", "&#x05E8;", "&#x05D0;", "&#x05D8;", "&#x05D5;", "&#x05DF;", "&#x05DD;", "&#x05E4;", "&#x007D;", "&#x007B;", "&#x007C;",
                         "&#x05E9;", "&#x05D3;", "&#x05D2;", "&#x05DB;", "&#x05E2;", "&#x05D9;", "&#x05D7;", "&#x05DC;", "&#x05DA;", "&#x003A;", "&#x0022;", "&#x007C;",
                         "&#x05D6;", "&#x05E1;", "&#x05D1;", "&#x05D4;", "&#x05E0;", "&#x05DE;", "&#x05E6;", "&#x003C;", "&#x003E;", "&#x003F;");

var He_alt_gr = new Array("", "", "", "", "", "", "", "", "", "", "", "&#x05BE;", "", "", "", "", "", "", "", "&#x05F0;", "", "", "", "",
                          "", "", "", "", "", "", "", "&#x05F2;", "&#x05F1;", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");