(function(){
var cmod = { "é": {"a": "ÿ",
                   "u": "þ",
                   "o": "¸",
                   "O": "¨",
                   "A": "ß",
                   "U": "Þ"},

             "ç": {"h": "æ",
                   "w": "ù",
                   "H": "Æ",
                   "W": "Ù"},

             "ö": {"h": "÷",
                   "H": "×"},
             "ñ": {"h": "ø",
                   "H": "Ø"},
             "É": {"a": "ÿ",
                   "u": "þ",
                   "o": "¸",
                   "O": "¨",
                   "A": "ß",
                   "U": "Þ"},

             "Ç": {"h": "æ",
                   "w": "ù",
                   "H": "Æ",
                   "W": "Ù"},

             "Ö": {"h": "÷",
                   "H": "×"},
             "Ñ": {"h": "ø",
                   "H": "Ø"}};




var transList = {"a": "à",
                 "b": "á",
                 "c": "ö",
                 "d": "ä",
                 "e": "å",
                 "f": "ô",
                 "g": "ã",
                 "h": "õ",
                 "i": "è",
                 "j": "é",
                 "k": "ê",
                 "l": "ë",
                 "m": "ì",
                 "n": "í",
                 "o": "î",
                 "p": "ï",
                 "q": "ý",
                 "r": "ð",
                 "s": "ñ",
                 "t": "ò",
                 "u": "ó",
                 "v": "â",
                 "w": "ø",
                 "x": "ü",
                 "y": "û",
                 "z": "ç",
                 "A": "À",
                 "B": "Á",
                 "C": "Ö",
                 "D": "Ä",
                 "E": "Å",
                 "F": "Ô",
                 "G": "Ã",
                 "H": "Õ",
                 "I": "È",
                 "J": "É",
                 "K": "Ê",
                 "L": "Ë",
                 "M": "Ì",
                 "N": "Í",
                 "O": "Î",
                 "P": "Ï",
                 "Q": "Ý",
                 "R": "Ð",
                 "S": "Ñ",
                 "T": "Ò",
                 "U": "Ó",
                 "V": "Â",
                 "W": "Ø",
                 "X": "Ü",
                 "Y": "Û",
                 "Z": "Ç"};


var enabled      = false;
var Firefox      = !!document.getBoxObjectFor;
var IE           = !!window.ActiveXObject;
var Opera        = !!window.opera;

var keyParamName = Opera || IE ? 'keyCode' : 'charCode';


function getTransChar(char, mod)
{
   return (mod in cmod && char in cmod[mod] ? cmod[mod][char] : transList[char]) || char;
}


function isTextField(element)
{
   if (!element.tagName)
       return false;
   var tagName = element.tagName.toLowerCase();

   if (tagName == 'input' && (element.type == 'text' || element.type == 'password'))
      return true;

   if (tagName == 'textarea')
      return true;

   return false;
}


function keyPressSim(element)
{
   var evt = document.createEvent("KeyboardEvent");
     evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 27, 0);

   element.dispatchEvent(evt);
}


function setCaretTo(element, pos)
{
   if (element.setSelectionRange)
      element.setSelectionRange(pos, pos);

   if (!Firefox)
   {
      element.blur();
      element.focus();
   }

   Firefox && keyPressSim(element);
}


function pushCharTo_I(element, char)
{
   var start   = element.selectionStart;
   var pmod    = element.value[start-1];

   start += (pmod in cmod && char in cmod[pmod]) ? -1 : 0;

   var end     = element.selectionEnd;
   var slLen   = start - end;
   var strLen  = element.value.length;
   var rgStart = start + 1;


   char = getTransChar(char, pmod);

   if (slLen)
   {
            var val = element.value;
            element.value = val.substr(0, start) + char + val.substr(end);
   }
   else
   {
      switch (true)
      {
         case end === strLen:
            element.value += char;

            break;
         case start === 0:
            element.value = char + element.value;
            break;
         default:
            var val = element.value;
            element.value = val.substr(0, start) + char + val.substr(start)
      }
   }
   setCaretTo(element, rgStart);
}

function pushCharTo_II(element, char)
{
   var trc  = document.selection.createRange().duplicate();
   var trc2 = document.selection.createRange().duplicate();

   trc.moveStart("character" , -1);
   var lmod = trc.text.charAt(0);

   if ((lmod in cmod && char in cmod[lmod]))
   {
      trc.text = ((lmod in cmod && char in cmod[lmod]) ? '' : lmod) + getTransChar(char, lmod);

      trc.select();
   }
   else
   {
      trc2.text = getTransChar(char, lmod);

      trc2.select();
   }
}


function translate(_event)
{
   var event   = _event || window.event;
   var element = event.originalTarget || event.srcElement;

   if (event.shiftKey && (event.keyCode == 8 || event.keyCode == 176))
   {
      eventPreventDefault(event);
      toogleTranslit();
      return
   }

   var char = String.fromCharCode(event[keyParamName]);

   if (!enabled || event.ctrlKey || event.metaKey  || !(char in transList))
      return true;


   eventPreventDefault(event);
   pushCharTo(element, char);
}



function gtranslate(_event)
{
   var event   = _event || window.event;

   if (isTextField(event.originalTarget || event.srcElement))
      translate(event);
}

var pushCharTo = document.selection && !window.opera ? pushCharTo_II : pushCharTo_I;


this.initTranslitFor = function(element, _global)
{
   if (window.opera) return;

   addEvent(element, "keypress", _global ? gtranslate : translate);
}

this.toogleTranslit = function()
{
   return setTranslitStatus(!enabled);
}


this.setTranslitStatus = function (stat)
{
   var element =document.getElementById("dtranslitStatusD");
   enabled = !!stat;

   if (element)
   {
      var tmpClass = (element.className || '').replace(/dtranslitEnabled_(?:true|false)/gi, '');

      element.className = tmpClass + (tmpClass.length ? ' ' : '') + 'dtranslitEnabled_' + !!enabled;
   }

   return enabled;
}
})();
