

JSwasLoaded = true;


var Netscape, MSIE, Opera, Unknown, NN1, NN2, Ffox=false;
var Win, Mac, Other;
var NetscapeVer, MSIEVer, OperaVer, NetscapeOK, AlertMsg;
var strOperaPos;

var Br = "1";

// detect browser

Netscape = navigator.appName == "Netscape";
MSIE = navigator.appName == "Microsoft Internet Explorer";
Opera = navigator.userAgent.indexOf("Opera") > -1;

Unknown = !(Netscape || MSIE || Opera);

NetscapeOK = false;

// detect platform
var n;
Win = navigator.userAgent.indexOf("Win") > -1;
Mac = navigator.userAgent.indexOf("Mac") > -1;
Other = !(Win || Mac);

// now extract version numbers

if(Netscape)
{
  NetscapeVer = parseFloat(navigator.appVersion);
  if (NetscapeVer>4)
  {
    n = navigator.userAgent;
           
    if (n.indexOf("Netscape/") != -1)
    {
       NN1 = n.substr(n.indexOf("Netscape/")+9);
       NN1 = parseFloat(NN1);
    }
    NN1 = n.substr(n.indexOf("rv:")+3);
    NN1 = parseFloat(NN1); 

    if (NN1 >= "1.3")
        NetscapeOK = true;
  }
  if (NetscapeOK)
  {
      Br="NN";    
      if (n.indexOf("Firefox") != -1) Ffox = true;
  }
}
else if(MSIE)
{
  n = navigator.userAgent;
  MSIEVer = n.substr(n.indexOf("MSIE ")+("MSIE ").length, 4);
  MSIEVer = parseFloat(MSIEVer); 
  // converts it into a floatint point number

  if(Opera)
  {
     strOperaPos = n.indexOf("Opera/"); // "Opera " or "Opera/"
     if (strOperaPos == -1)
       OperaVer = n.substr(n.indexOf("Opera ")+("Opera ").length, 4);
     else
       OperaVer = n.substr(strOperaPos + ("Opera/").length, 4);    
        
     OperaVer = parseFloat(OperaVer);
  }
  else
    Br = "IE";
}
else if(Opera)  // Opera does not identify itself as MSIE
{
  n = navigator.userAgent;
  strOperaPos = n.indexOf("Opera/"); // "Opera " or "Opera/"

  if (strOperaPos == -1)
      OperaVer = n.substr(n.indexOf("Opera ")+("Opera ").length, 4);
  else
      OperaVer = n.substr(strOperaPos + ("Opera/").length, 4);    
        
  OperaVer = parseFloat(OperaVer);        
}


 var KbdVariant1 = {          
    "~": "Æ",
    "`": "æ",
    "Ё": "Æ",
    "ё": "æ"
  };

        
//////////////////////////////////////////////////////////
        
        
var Symbols = "~`Ёё";
     
        
if (Opera)
 if (OperaVer >= 8) Br = "NN"; // Opera 8 works as Mozilla


function changeKey (textControl, evt, keyChecker1)
{
  
  if (evt.ctrlKey)
     return true;
      
  var keyChecker = eval(keyChecker1); // function name
  var keyCode = void 0;

  keyCode = evt.keyCode ? evt.keyCode :
               evt.charCode ? evt.charCode :
               evt.which ? evt.which : void 0;   

  if (evt.which == 0)
     return true;
		
  var CurrentKey;

  if (keyCode)
     CurrentKey = String.fromCharCode(keyCode);
  
  var keyCheck = keyChecker(keyCode, CurrentKey);
  
  if (keyCode && window.event && !window.opera)   // IE
  {
    if (keyCheck.cancelKey)
      return false;
    else if (keyCheck.replaceKey)  
    {
      window.event.keyCode = keyCheck.newKeyCode;
      if (window.event.preventDefault)
          window.event.preventDefault();
      return true;
    }
    else
      return true;
  }
  else if (typeof textControl.setSelectionRange != 'undefined') // NN
  {
    if (keyCheck.cancelKey)
    {
      if (evt.preventDefault)
         evt.preventDefault();
      return false;
    }
    else if (keyCheck.replaceKey)
    {
      // cancel the key event and insert the newKey for the current selection
      if (evt.preventDefault)
         evt.preventDefault();
 
      var oldSelectionStart = textControl.selectionStart;
      var oldSelectionEnd = textControl.selectionEnd;
      var selectedText = textControl.value.substring(oldSelectionStart, oldSelectionEnd);
      var newText = typeof keyCheck.newKey != 'undefined' ?
                    keyCheck.newKey : String.fromCharCode(keyCheck.newKeyCode);
                    

      var scrollTop, scrollLeft;                                            
      if (textControl.type == 'textarea' && typeof textControl.scrollTop != 'undefined')
      {                                                        
         scrollTop  = textControl.scrollTop;                                 
         scrollLeft = textControl.scrollLeft;                               
      }                                                                     
      textControl.value =                                                   
               textControl.value.substring(0, oldSelectionStart) +          
               newText +                                                    
               textControl.value.substring(oldSelectionEnd);                
               
      if (typeof scrollTop != 'undefined')
      {                                
         textControl.scrollTop  = scrollTop;                                 
         textControl.scrollLeft = scrollLeft;                               
      }                                                                     
      textControl.setSelectionRange(oldSelectionStart + newText.length,     
                                    oldSelectionStart + newText.length);
      return false;
    }
    else
      return true;
  }          // Other browser:
  else if (keyCheck.cancelKey)
  {
    if (evt.preventDefault)
        evt.preventDefault();
    return false;
  }
  else
   return true;
}


function fIE (keyCode, CurrentKey) {
 
  if (Symbols.indexOf(CurrentKey) == -1)
       return { cancelKey: false };

  var newKeyOut = KbdVariant1[CurrentKey];
  if (newKeyOut)
      return { replaceKey: true, newKeyCode: newKeyOut.charCodeAt(), newKey: newKeyOut };    
  else
      return { cancelKey: false };
  
}
  // Copyright (c) 2005  Paul Gorodyansky http://RusWin.net http://Klava.RusWin.net
function fNN (keyCode, CurrentKey) {

  if (Symbols.indexOf(CurrentKey) == -1)
       return { cancelKey: false };

  var newKeyOut = KbdVariant1[CurrentKey];
  if (newKeyOut)
      return { replaceKey: true, newKeyCode: keyCode, newKey: newKeyOut };
  else
      return { cancelKey: false };
}

function fOther (keyCode, CurrentKey) {
 
  if (Symbols.indexOf(CurrentKey) == -1)
       return { cancelKey: false };

  var newKeyOut = KbdVariant1[CurrentKey];
  if (newKeyOut)
  {
      txtControl.value += newKeyOut;
      return { cancelKey: true };
  }
  else
      return { cancelKey: false };
  
}



/************ End of main, typing related code *************************************/

           
function saveCaret(elem)
{          
  if ( elem.isTextEdit ) 
    elem.caretPos = document.selection.createRange();
}          
           
function insertAtCaret(textElement, newText)
{   
  if ( textElement.isTextEdit )
  { 
    if ( !textElement.caretPos )
    {
       saveCaret(textElement);       
    }
    
    var caretPos = textElement.caretPos;
    caretPos.text = newText;
    caretPos.select(); 
  } 
}   

 

var ListName = "æÆёЁ	";  
function letter(LetNumber, evt)
{
  var CurrentKey; 
     
  //var ShiftNum = 2;
        
    //if (evt.shiftKey)
        CurrentKey =  ListName.charAt(LetNumber);
   // else
    //    CurrentKey =  ListName.charAt(LetNumber+ShiftNum);
    
    txtControl.focus();

    if (Br == "NN")
    {
       if (typeof txtControl.setSelectionRange != 'undefined')
       {
         var oldSelectionStart = txtControl.selectionStart;
         var oldSelectionEnd = txtControl.selectionEnd;
         var selectedText = txtControl.value.substring(oldSelectionStart, oldSelectionEnd);
         var newText = CurrentKey;
         
         var scrollTop, scrollLeft;                                            
         if (txtControl.type == 'textarea' &&                                  
             typeof txtControl.scrollTop != 'undefined')                       
         {                                                                     
            scrollTop  = txtControl.scrollTop;                                 
            scrollLeft = txtControl.scrollLeft;  
         }                                                                     
         txtControl.value =                                                                                 
                  txtControl.value.substring(0, oldSelectionStart) +                                        
                  newText +                                                                                 
                  txtControl.value.substring(oldSelectionEnd);                                              
                                                                                                           
         if (typeof scrollTop != 'undefined')                                                               
         {                              
            txtControl.scrollTop  = scrollTop;                                                              
            txtControl.scrollLeft = scrollLeft;                                                            
         }                                                                                                  
         txtControl.setSelectionRange(oldSelectionStart + newText.length,                                   
                                      oldSelectionStart + newText.length);                                  
       }
    }
    else if (Br == "IE")
         { 
            insertAtCaret(txtControl,CurrentKey);
         }
         else
            txtControl.value += CurrentKey;
   
}

/* Paul Gorodyansky, author of the site
   "Cyrillic (Russian): instructions for Windows and Internet": 
   http://ourworld.compuserve.com/homepages/PaulGor/ (same as http://RusWin.net)
   and Virtual Cyrillic Keyboard - http://Klava.RusWin.net
*/


