
function stemm(s, re, to)
{
    res=s.replace(re, to);
    return res;
}

function mstem(s, re)
{
    return re.test(s);
}

function stem_word(word)
{
    //var Stem_Caching = 0;
    //var Stem_Cache = array();
    var VOWEL = /аеиоуыэюя/;
    //    var PERFECTIVEGROUND = /((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/;
    var PERFECTIVEGROUND = /((ив|ивши|ившись|ыв|ывши|ывшись)|((.?)(в|вши|вшись)))$/;
    var REFLEXIVE = /(с[яь])$/;
    var ADJECTIVE = /(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/;
    //    var PARTICIPLE = /((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/;
    var PARTICIPLE = /((ивш|ывш|ующ)|((.?)(ем|нн|вш|ющ|щ)))$/;
    //var VERB = /((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/;
    //var VERB = /((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((.?)(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/;
    var VERB = /((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю))$/;
    var NOUN = /(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/;
    var RVRE = /^(.*?[аеиоуыэюя])(.*)$/;
    //    var DERIVATIONAL = /[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/;
    var DERIVATIONAL = /[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(.?)сть?$/;


    word = word.toLowerCase();
    //word = replace('ё', 'е', flags)
    //word = strtr($word, 'ё', 'е');
    var stem=word;
    var oldstem="";
    do{
        oldstem=stem;
        do {
            //alert(word);
            p=stem.match(RVRE);
            //          alert(p);
            if (p==null) {
                break;
            }
            //alert(p[0]);
            start = p[1];
            RV = p[2];
            //alert(p)
            if (RV==null) {
                break;
            }

            //# Step 1
            var orig=RV;
            RV=stemm(RV, PERFECTIVEGROUND, '');
            if (orig==RV) {
                RV=stemm(RV, REFLEXIVE, '');

                orig=RV;
                RV=stemm(RV, ADJECTIVE, '');
                if (orig!=RV) {
                    RV=stemm(RV,PARTICIPLE, '');
                } else {
                    orig=RV;
                    RV=stemm(RV, VERB, '');
                    if (orig==RV)
                        RV=stemm(RV, NOUN, '');
                }
            }

            //# Step 2
            RV=stemm(RV, /и$/, '');

            //# Step 3
            if (mstem(RV, DERIVATIONAL)){
                RV=stemm(RV, /ость?$/, '');
            }

            //# Step 4
            orig=RV;
            RV=stemm(RV, /ь$/, '');
            if (orig==RV) {
                RV=stemm(RV, /ейше?/, '');
                RV=stemm(RV, /нн$/, 'н');
            }

            stem = start+RV;
        } while(false);
    //alert(stem);
    //alert(oldstem);
    }while (stem!=oldstem);

    if (stem==""){
        stem=word;
    }
    return stem;
}