(function($){
	var cyrillic = [
		"a", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о",
    	"п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь", "ю", "я",
    	"А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О",
    	"П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ь", "Ю", "Я",
		"á", "é", "í", "ó", "ö", "ő", "ú", "ü", "ű", "Á", "É", "Í", "Ó", "Ö", "Ő",
		"Ú", "Ü", "Ű",
        "ö", "ü", "ó", "ő", "ú", "é", "á", "ű", "í", "Ö", "Ü", "Ó", "Ő", "Ú", "É",
        "Á", "Ű", "Í", "Ä", "ä", "À", "Á", "Â", "Ã", "Ä", "Å", "Ç", "È", "É", "Ê",
        "Ë", "Ì", "Í", "Î", "Ï", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü",
        "Ý", "à", "á", "â", "ã", "ä", "å", "ç", "è", "é", "ê", "ë", "ì", "í", "î",
        "ï", "ñ", "ò", "ó", "ô", "õ", "ö", "ù", "ú", "û", "ü", "ý", "ÿ", "ā", "Ă",
        "ă", "Ą", "ą", "Ć", "ć", "Ĉ", "ĉ", "Ċ", "ċ", "Č", "č", "Ď", "ď", "đ", "Ē",
        "ē", "Ĕ", "ĕ", "Ė", "ė", "Ę", "ę", "Ě", "ě", "Ĝ", "ĝ", "Ğ", "ğ", "Ġ", "ġ",
        "Ģ", "ģ", "Ĥ", "ĥ", "Ĩ", "ĩ", "Ī", "ī", "Ĭ", "ĭ", "Į", "į", "İ", "Ń", "ń",
        "Ņ", "ņ", "Ň", "ň", "ŉ", "Ŋ", "ŋ", "Ō", "ō", "Ŏ", "ŏ", "Ő", "ő", "Ŕ", "ŕ",
        "Ŗ", "ŗ", "Ř", "ř", "Ś", "ś", "Ŝ", "ŝ", "Ş", "ş", "Š", "š", "Ţ", "ţ", "Ť",
        "ť", "Ŧ", "ŧ", "Ũ", "ũ", "Ū", "ū", "Ŭ", "ŭ", "Ů", "ů", "Ű", "ű", "Ų", "ų",
        "Ŵ", "ŵ", "Ŷ", "ŷ", "Ÿ", "Ź", "ź", "Ż", "ż", "Ž", "ž"
	];

	var latin = [
		"a", "b", "v", "g", "d", "e", "zh", "z", "i", "y", "k", "l", "m", "n", "o",
		"p", "r", "s", "t", "u", "f", "h", "ts", "ch", "sh", "sht", "a", "y", "yu", "ya",
    	"A", "B", "B", "G", "D", "E", "Zh", "Z", "I", "Y", "K", "L", "M", "N", "O",
    	"P", "R", "S", "T", "U", "F", "H", "Ts", "Ch", "Sh", "Sht", "A", "Y", "Yu", "Ya",
		"a", "e", "i", "o", "o", "o", "u", "u", "u", "A", "E", "I", "O", "O", "O",
		"U", "U", "U",
        "o", "u", "o", "o", "u", "e", "a", "u", "i", "o", "u", "o", "o", "u", "e",
        "a", "u", "i", "a", "a", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e",
        "e", "i", "i", "i", "i", "n", "o", "o", "o", "o", "o", "u", "u", "u", "u",
        "y", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i",
        "i", "n", "o", "o", "o", "o", "o", "u", "u", "u", "u", "y", "y", "a", "a",
        "a", "a", "a", "c", "c", "c", "c", "c", "c", "c", "c", "d", "d", "d", "e",
        "e", "e", "e", "e", "e", "e", "e", "e", "e", "g", "g", "g", "g", "g", "g",
        "g", "g", "h", "h", "i", "i", "i", "i", "i", "i", "l", "j", "i", "n", "n",
        "n", "n", "n", "n", "n", "n", "n", "o", "o", "o", "o", "o", "o", "r", "r",
        "r", "r", "r", "r", "s", "s", "s", "s", "s", "s", "s", "s", "t", "t", "t",
        "t", "t", "t", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u",
        "w", "w", "y", "y", "y", "z", "z", "z", "z", "z", "z"
	];

	var string = '';

	$.fn.friendurl = function(options){
		var defaults = {
			divider : '-',
			transliterate: false,
			limit: false
		};

		var options = $.extend(defaults, options);

		return this.each(function(){

			$(this).keyup(function(){
			    var url =$(this).val()
			        .toLowerCase()
                ;
    			if (options.transliterate) {
    				url = convert(url);
    			}
				var url = url
    				.toLowerCase()
    				.replace(/[ ]+/g,options.divider)
    				.replace(/[_]+/g,options.divider)
    				.replace(/[-]+/g,options.divider)
    				.replace(/[^a-z0-9-]/g,"")
    			;

				$('#' + options.id).val(url);
			});

		});
		
		function checkLastCharacter(s)
		{
			stringLength = s.length;
			for (currentStringLength = stringLength; currentStringLength != 0; currentStringLength--) {
				if (s.charAt(currentStringLength-1) == '-') {
					s = s.substring(0,currentStringLength-1);
				} else {
					return s;
				}
			}
			return s;
		}
		
		function convert (text) {
			//text = checkLastCharacter(text);
			string = str_replace(cyrillic, latin, text);
			string = str_length_limit(string, options.limit);
			string = checkLastCharacter(string);
			return string;
		}
		function str_replace (search, replace, subject, count) {
		    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
		            f = [].concat(search),
		            r = [].concat(replace),
		            s = subject,
		            ra = r instanceof Array, sa = s instanceof Array;
		    s = [].concat(s);
		    if (count) {
		        this.window[count] = 0;
		    }
		    for (i=0, sl=s.length; i < sl; i++) {
		        if (s[i] === '') {
		            continue;
		        }
		        for (j=0, fl=f.length; j < fl; j++) {
		            temp = s[i]+'';
		            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
		            s[i] = (temp).split(f[j]).join(repl);
		            if (count && s[i] !== temp) {
		                this.window[count] += (temp.length-s[i].length)/f[j].length;}
		        }
		    }
		    
		    return sa ? s : s[0];
		}
        function str_length_limit (text, limit) {
            if (limit !== false && text.length > limit) {
                return text.substring(0, limit);
            }
            return text;
        }
	};
})(jQuery);
