(function ($) {
    var ageent_time_stamp = new String();
    var ageent_max_key = 0;
    var en_to_ru = new Array();
    $(document).ready(function(){
        value_all_lengvitc = $(".resizable").text();
        $(".resizable").blur(function(){
            if($(this).text()=='') $(this).text(value_all_lengvitc);
        });
        
        $(".resizable").focus(function(){
            if($(this).text()==value_all_lengvitc) $(this).text("");
        });
        
        $(".array_rules").change(function() {
           rules = $(this).val();
           rules = rules.split(",");
           en_to_ru = new Array();

           for(key in rules) {
               now_val = rules[key];
               reg=/ /g 
               now_val = now_val.replace(reg, "")
               pos = strpos(now_val, ":");
               long_text = now_val.length; 
               real_key = substr(now_val, 1, pos-2);
               real_value = substr(substr(now_val, pos+2, long_text),0,-1);
               en_to_ru[real_key] = real_value;
           }
        });

        function strpos( haystack, needle, offset) {  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
            var i = haystack.indexOf( needle, offset ); // returns -1
            return i >= 0 ? i : false;
        }

        function substr( f_string, f_start, f_length ) {    // original by: Martijn Wieringa
            if(f_start < 0) {
                f_start += f_string.length;
            }

            if(f_length == undefined) {
                f_length = f_string.length;
            } else if(f_length < 0){
                f_length += f_string.length;
            } else {
                f_length += f_start;
            }
            
            if(f_length < f_start) {
                f_length = f_start;
            }
            return f_string.substring(f_start, f_length);
        }

        $(window).load( function() {
           en_to_ru={"YE":"Є", "I":"І", "G":"Ѓ", "i":"і", "#":"№", "ye":"є", "g":"ѓ", "A":"А", "B":"Б", "V":"В", "G":"Г", "D":"Д", "E":"Е", "YO":"Ё", "ZH":"Ж", "Z":"З", "I":"И", "J":"Й", "K":"К", "L":"Л", "M":"М", "N":"Н", "O":"О", "P":"П", "R":"Р", "S":"С", "T":"Т", "U":"У", "F":"Ф", "X":"Х", "C":"Ц", "CH":"Ч", "SH":"Ш", "SHH":"Щ", "\'":"Ъ", "Y":"Ы", "":"Ь", "E":"Э", "YU":"Ю", "YA":"Я", "a":"а", "b":"б", "v":"в", "g":"г", "d":"д", "e":"е", "yo":"ё", "zh":"ж", "z":"з", "i":"и", "j":"й", "k":"к", "l":"л", "m":"м", "n":"н", "o":"о", "p":"п", "r":"р", "s":"с", "t":"т", "u":"у", "f":"ф", "x":"х", "c":"ц", "ch":"ч", "sh":"ш", "shh":"щ", "":"ъ", "y":"ы", "":"ь", "e":"э", "yu":"ю", "ya":"я", "":"«", "":"»", "-":"—"};
        });
        
        $(".ageent_trans").keypress(function(e) {
           translate_letter(e,this); 
        });
/**
  * evnt object событие
  * obect object 
*/
function translate_letter(evnt, obect) {
    // get count max key in array. only once 
        for (x in en_to_ru) {
          if(ageent_max_key < x.length) {
              ageent_max_key = x.length;
          }
    }
    get_translate(evnt, en_to_ru, obect);

    /**
      * Функция транслита для сех, кроме IE
      * evnt object объект события
      * en_to_ru  array   массив с првилами
      * obect object 
    */
    function get_translate(evnt,en_to_ru, obect) {
           if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
                txt = String.fromCharCode(evnt.keyCode)
                event_to(txt, en_to_ru, obect);
            } else {
                var code = evnt.which ? evnt.which : void 0;
                if (!evnt.which) {
                    return true;
                }
                if ((code && code > 33) && (!(evnt.ctrlKey || evnt.altKey)) && (!(code>=37 && code<=40)) ) {
                        txt = String.fromCharCode(code);
                        ageent_time_stamp += txt;
                        if(ageent_time_stamp.length>ageent_max_key) {
                          ageent_time_stamp = ageent_time_stamp.substring(1);
                        }
                        if (evnt.preventDefault) {
                            evnt.preventDefault();
                        }
                        pretxt = obect.value.substring(0, obect.selectionStart);
                        therest = obect.value.substr(obect.selectionEnd);

                        for (i=0; i<ageent_time_stamp.length; i++) {
                            if(ageent_time_stamp.length==i+1) {
                                if(array_key_exists(ageent_time_stamp.substring(i),en_to_ru)) {     
                                        if ((therest.length + pretxt.length) == 0) {
                                            obect.value = en_to_ru[ageent_time_stamp.substring(i)];
                                            return false;
                                        }

                                        txt = en_to_ru[ageent_time_stamp.substring(i)];
                                        get_current_position = getCaretPos(obect); 
                                        obect.value = pretxt + txt + therest;
                                        goTo(get_current_position + 1, obect);
                                    } else {
                                        if ((therest.length + pretxt.length) == 0) {
                                            obect.value = txt;
                                            return false;
                                        }
                                        get_current_position = getCaretPos(obect); 
                                        txt = txt;
                                        obect.value = pretxt + txt + therest;
                                        goTo(get_current_position + 1, obect)
                                    }
                                } else {
                                    //alert(ageent_time_stamp.substring(i))
                                    if(array_key_exists(ageent_time_stamp.substring(i),en_to_ru)) {
                                        get_current_position = getCaretPos(obect); 
                                        txt = en_to_ru[ageent_time_stamp.substring(i)];
                                        if(array_key_exists(ageent_time_stamp.substring(i-1),en_to_ru)) {

                                          pretxt = pretxt.substring(0, pretxt.length - (ageent_time_stamp.substring(i).length)+ageent_time_stamp.substring(i-1).length-1);
                                          cursor = (get_current_position - ageent_time_stamp.substring(i).length) + ageent_time_stamp.substring(i-1).length;
                                        } else {
                                          pretxt = pretxt.substring(0, pretxt.length - (ageent_time_stamp.substring(i).length-1)); 
                                          cursor = (get_current_position - ageent_time_stamp.substring(i).length) + 2;
                                        }
                                        obect.value = pretxt + txt + therest;
                                        goTo(cursor, obect);
                                      break;
                                    } 
                                }
                            }
                }
                return false;
           }
    }

    /**  
      * Функция транслита только для ie
      * txt  string
      * en_to_ru array rules
      * obect object 
    */ 

    function event_to(txt,en_to_ru,obect) {
        ageent_time_stamp += txt;
        if(ageent_time_stamp.length>ageent_max_key) {
          ageent_time_stamp = ageent_time_stamp.substring(1);
        }

        for (i=0; i<ageent_time_stamp.length; i++) {
            if(ageent_time_stamp.length==i+1) {
                if(array_key_exists(ageent_time_stamp.substring(i),en_to_ru)) {
                  txt = en_to_ru[ageent_time_stamp.substring(i)]; 
                  event.keyCode = txt.charCodeAt();
                } else {
                  event.keyCode = txt.charCodeAt();
                }
            } else {
                if(array_key_exists(ageent_time_stamp.substring(i),en_to_ru)) {
                  txt = en_to_ru[ageent_time_stamp.substring(i)]; 
                  get_current_position = getCaretPos(obect);
                  if(array_key_exists(ageent_time_stamp.substring(i-1),en_to_ru)) {
                      count_slice = (get_current_position - (ageent_time_stamp.substring(i).length)+ageent_time_stamp.substring(i-1).length-1);
                     cursor = count_slice+1;
                  } else {
                     count_slice = (get_current_position - (ageent_time_stamp.substring(i).length-1));
                     cursor = count_slice+1;
                  }
                  first_text = obect.value.slice(0,count_slice); // text before the cursor
                  end_text = obect.value.slice(get_current_position, get_current_position+(obect.value.length-get_current_position)); // text after the cursor
                  obect.value = first_text+txt+end_text;
                  goTo(cursor,obect);
                  event.keyCode = "";
                  break;
                } 
            }
        }
    }

    /**  
      * Функция для опредления позиции указателя
      * obj  object
    */
    function getCaretPos(obj) {
        obj.focus();
        if (obj.selectionStart) return obj.selectionStart; //Gecko
        else if (document.selection) //IE
        {
            var sel = document.selection.createRange();
            var clone = sel.duplicate();
            sel.collapse(true);
            clone.moveToElementText(obj);
            clone.setEndPoint('EndToEnd', sel);
            return clone.text.length;
        }
        return 0;
    }
    /** 
      * Функция для перемещения указателя 
      * n  int     позиция в которую нужно переместить указатель.
      * o  object
    */
    function goTo(n, o) {
        if (!document.all) {
            var end = o.value.length;
            o.setSelectionRange(n, n);
            o.focus();
        } else {
            var r = o.createTextRange();
            r.collapse(true);
            r.moveStart("character", n);
            r.moveEnd("character", 0);
            r.select();
        }
    }
    function array_key_exists ( key, search ) {   // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        if( !search || (search.constructor !== Array && search.constructor !== Object) ){
            return false;
        }
        return search[key] !== undefined;
    }
}
});
})(jQuery);