/**
 * declension.js
 *
 * @package   expjs
 * @author    dAllonE
 * @copyright moskva.ru 2008
 */

go.declension = new (function() {

this.formName = (
	function(name, form, sex, pog, pod)
	{
		if (form == "i") {
			return name;
		}
		if ((sex) && (name.substr(-1, 1) == "й")) {
			var root = name.substr(0, name.length - 1);
			if (form == "r") return root + "я";
			if (form == "v") return root + "я";
			if (form == "d") return root + "ю";
			if (form == "t") return root + "ем";
			if (form == "p") return root + "е";			
		}
		var res = getFormWord(name, form, sex ? 1 : 2, 1);
		if ((pog) && (vowel[name.charAt(0).toLowerCase()])) {
			res = pog + res;
		} else if ((pod) && (!vowel[name.charAt(0)])) {
			res = pod + res;
		}
		return res;
	}	
);
this.formSurname = (
	function(name, form, sex, pog, pod)
	{
		if (form == "i") {
			return name;
		}
		var res = getFormWord(name, form, sex ? 1 : 2, 2);
		if ((pog) && (vowel[name.charAt(0).toLowerCase()])) {
			res = pog + res;
		} else if ((pod) && (!vowel[name.charAt(0)])) {
			res = pod + res;
		}
		return res;
	}
);

var ending = {
	"mrm"    : ["", "", "я","ю","я","ем","е"],        
	"mrt"    : ["", "", "а","у","а","ом","е"],
	"mrmya"  : ["", "", "и","е","ю","ей","е"],       
	"mrtya"  : ["", "", "и","е","ю","ей","е"],
	"mrma"   : ["", "", "и","е","у","ей","е"],        
	"mrta"   : ["", "", "а","е","у","ей","е"],
	"mrij"   : ["", "", "ого","ому","ого","им","ом"], 
	"grmya"  : ["", "", "и","е","ю","ей","е"],
	"grtya"  : ["", "", "и","е","ю","ей","е"],        
	"grmaya" : ["", "", "ой","ой","ую","ой","ой"],
	"grtaya" : ["", "", "ой","ой","ую","ой","ой"],    
	"grta"   : ["", "", "ы","е","у","ой","е"],
	"grma"   : ["", "", "и","е","у","ой","е"],        
	"grva"   : ["", "", "ой","ой","у","ой","ой"]
}

var padg = {"r": 2, "d": 3, "v": 4, "t": 5, "p": 6};

function getFormWord(word, form, sex, type)
{	
	form = padg[form];
	var morphoAndType = syntaxAnalize(word.toLowerCase(), sex, type);
	if (!morphoAndType) {
		return word;
	}	
	var root = word.substr(0, morphoAndType["root"].length);
	var ed = ending[morphoAndType["type"]];
	if (!ed) {
		return word;
	}
	ed = ed[form];
	return root + ed;
}

var vowel = {"а":1,"е":1,"ё":1,"и":1,"о":1,"у":1,"э":1,"ю":1,"я":1,"ы":1};
var voiced_consonant = {"б":1,"в":1,"г":1,"д":1,"ж":1,"з":1,"л":1,"м":1,"н":1,"р":1,"ц":1,"щ":1};

function syntaxAnalize(word, sex, typeWord){	
	if (!/[а-яё]{2}/i.test(word)) {
		return false;
	}
	var length  =  word.length
	var ending2symbol = word.substr(length - 1);
	var ending1symbol = word.substr(length - 2, 1);
	var ending3symbol = word.substr(length - 3, 1);
	var ending = ending1symbol+ending2symbol;
	var type   = false;	
	var root   = false;
	
	if(length  == 1){
		return false;
	}

	if(length < 3 && vowel[ending2symbol]){
		return  false;
	}

	if ((vowel[ending2symbol]) && !(ending2symbol == 'а' || ending2symbol == 'я')){
		return  false;
	}
	
	if ((vowel[ending1symbol] && (vowel[ending2symbol]) || ending2symbol == 'й')){
		if(sex == 1){
			type  +=  'mr';
		}else{
			type  +=  'gr';
		}
		if(!(ending == 'ия' || ending == 'ея' || ending == 'ей' || (ending == 'ий' && sex == 1) || (ending == 'ая' && sex == 2))){
			return  false;
		}
		if(voiced_consonant[ending3symbol]){
			type  +=  't';
		}else{
			type  +=  'm';
		}		
		switch(ending){
			case 'ий':
				type  =  'mrij';
				root  =  word.substr(0, length - 2);
			break;
			case 'ая':
				type  =  'graya';
				root  =  word.substr(0, length - 2);
			break;
		}
	}
	if((sex == 2) && (ending == 'ва') && (typeWord == 2)){
		type  =  'grva';
		root  =  word.substr(0, length - 1);
	}
	if(!root){
		if(sex == 1){
			type  =  'mr';
		}else{
			type  =  'gr';
		}			
		if(voiced_consonant[ending1symbol]){
			type  +=  't';
		}else{
			type  +=  'm';
		}
		if ((!vowel[ending2symbol]) && sex == 1){
			if(ending2symbol == 'ь' || ending2symbol  ==  'й'){
				type  =  'mrm';
				root  =  word.substr(0, length - 1);
			} else {
				type  =  'mrt';
				root  =  word;
			}
		} else if ((!vowel[ending2symbol]) && sex == 2){
			return  false;
		}	
		if(ending2symbol  ==  'я'){
			type  +=  'ya';
			root   =  word.substr(0, length - 1);
		}
		if(ending2symbol == 'а') {
			type +=  'a';
			root  =  word.substr(0, length - 1);
		}
	}
		
	return  {'root':root, 'type':type};
}

})(); 