/* 
 JavaScript
*/
var roma2 = {};
roma2.hiragana = function(text){return roma2x(text,"hiragana")}
roma2.katakana = function(text){return roma2x(text,"katakana")}
roma2.fuzzy = function(text){return roma2reg(text)}
function roma2x(text,to){
	var nstr = [];
	var temp,kana;
	var skip = 0;
	var latin = /[a-zA-Z.,-]/;
	for(var pos=0; pos<text.length; pos++){
		if (skip > 0) {skip--; continue}
		temp = text.charAt(pos);
		if (!latin.test(temp)) {nstr.push(temp); continue}
		var slen = 5;
		var f = false;
		while(--slen){
			temp = text.slice(pos,pos+slen);
			if (!roma[to].hasOwnProperty(temp)) continue;
			f = true;
			kana = roma[to][temp];
			skip = (slen == 2) ? 1 : slen-1;
			//caso de ?A volver uno
			slen == 2 && kana.charAt(0) == roma[to].tt && pos--;
			nstr.push(kana);
			break
		}
		!f && nstr.push(temp)
	}
	return nstr.join("");
}
//patron correct
function roma2reg(text){
	var nstr = [];
	var temp,kana;
	var hira,kata;
	var skip = 0;
	var h = "hiragana";
	var k = "katakana";
	var latin = /[a-zA-Z.,-]/;
	for(var pos=0;pos<text.length;pos++){
		if (skip > 0) {skip--;continue}
		temp = text.charAt(pos);
		if(!latin.test(temp)){nstr.push([temp]);continue}
		var slen = 5;
		var f = false;
		while(--slen){
			temp = text.slice(pos,pos+slen);
			if(!roma[h].hasOwnProperty(temp)) continue;
			f = true;
			hira = roma[h][temp];
			kata = roma[k][temp];
			skip = (slen == 2) ? 1 : slen-1;
			//caso de ?A volver uno
			slen == 2 && hira.charAt(0) == roma[h].tt && pos--;
			var last_m = nstr[nstr.length-1] ? nstr[nstr.length-1][0] : "";
			nstr.push(
				(hira == kata) ? [temp,hira] : 
				// tta ?¨ [tt,?A],[a,??]
				(last_m && roma[h][last_m] == roma[h].tt
				 && last_m.length == 2
				 && temp.charAt(0) == last_m.charAt(1)
				) ? [temp.slice(1),hira,kata] :
				[temp,hira,kata]
			);
			break
		}
		!f && nstr.push([temp])
	}
	nstr.toString = function(){
		var to_esc = {"-" : "\\-" , "." : "\\."};
		var reg_esc = "\\[](){}+*?^$|";
		var buf = [];
		for(var i=0; i<this.length; i++){
			var chars = this[i];
			buf.push(
				(chars.length == 1) ?
					(reg_esc.indexOf(chars[0]) != -1) ? "\\" + chars[0] : chars[0] :

				(chars.length == 3 && chars[1].charAt(0) == chars[2].charAt(0)) ?
					["(?:",
					 chars[0], "|" , chars[1].charAt(0), "[",
					 chars[1].charAt(1) , chars[2].charAt(1),
					"])"].join("") :

				(to_esc.hasOwnProperty(chars[0])) ? 
					"(?:\\" + chars.join("|") + ")" : "(?:" + chars.join("|") + ")"
			);
		}
		return buf.join("")
	}
	return nstr;
}
var roma = {};
roma.hiragana = {"a":"あ","i":"い","yi":"い","u":"う","wu":"う","e":"え","o":"お","la":"ら","li":"り","lu":"る","le":"れ","lo":"ろ","xa":"ぁ","xi":"ぃ","xu":"ぅ","xe":"ぇ","xo":"ぉ","lla":"じぁ","lli":"じぃ","llu":"じゅ","lle":"じぇ","llo":"じょ","ka":"か","ca":"か","ki":"き","qui":"き","ku":"く","cu":"く","qu":"く","ke":"け","que":"け","ko":"こ","co":"こ","ga":"が","gi":"ひ","gui":"ぎ","gu":"ぐ","gue":"げ","go":"ご","kya":"きゃ","kyu":"きゅ","kyo":"きょ","gya":"ぎゃ","gyi":"ぎぃ","gyu":"ぎゅ","gye":"ぎぇ","gyo":"ぎょ","sa":"さ","si":"し","ci":"し","shi":"し","su":"す","se":"せ","ce":"せ","so":"そ","za":"さ","zi":"し","zu":"す","ze":"せ","zo":"そ","sha":"しゃ","shi":"し","shu":"しゅ","she":"しぇ","sho":"しょ","ja":"は","jya":"じゃ","ji":"ひ","ju":"ふ","jyu":"じゅ","je":"へ","jye":"じぇ","jo":"ほ","jyo":"じょ","ta":"た","ti":"てぃ","chi":"ち","tu":"とぅ","tsu":"つ","te":"て","to":"と","da":"だ","di":"でぃ","du":"どぅ","de":"で","do":"ど","cha":"ちゃ","chi":"ち","chu":"ちゅ","che":"ちぇ","cho":"ちょ","na":"な","ni":"に","nu":"ぬ","ne":"ね","no":"の","ha":"あ","hi":"い","hu":"う","fu":"ふ","he":"え","je":"へ","ge":"へ","ho":"お","jo":"ほ","ba":"ば","bi":"び","bu":"ぶ","be":"べ","bo":"ぼ","pa":"ぱ","pi":"ぴ","pu":"ぷ","pe":"ぺ","po":"ぽ","fa":"ふぁ","fi":"ふぃ","fu":"ふ","fe":"ふぇ","fo":"ふぉ","va":"う゛ぁ","vi":"う゛ぃ","vu":"う゛","ve":"う゛ぇ","vo":"う゛ぉ","ma":"ま","mi":"み","mu":"む","me":"め","mo":"も","ya":"や","yu":"ゆ","ye":"え","yo":"よ","xya":"ゃ","xyu":"ゅ","xyo":"ょ","ra":"ら","ri":"り","ru":"る","re":"れ","ro":"ろ","rya":"りゃ","ryi":"りぃ","ryu":"りゅ","rye":"りぇ","ryo":"りょ","wa":"わ","wo":"を","n":"ん","nn":"ん","n'":"ん",".":"。",",":"、","kk":"っ","tt":"っ","nha":"にゃ","nhi":"にぃ","nhu":"にゅ","nhe":"にぇ","nho":"にょ","-":"ー","r":"る","s":"す","z":"す","d":"ど","y":"い","l":"る","p":"ぷ","c":"く","g":"ぐ","b":"ぶ","y":"い","m":"ん","f":"ふ","t":"と","x":"す","xo":"くそ","xi":"ひ"};

roma.katakana = {"a":"ア","i":"イ","yi":"イ","u":"ウ","wu":"ウ","e":"エ","o":"オ","la":"ラ","li":"リ","lu":"ル","le":"レ","lo":"ロ","xa":"ァ","xi":"ィ","xu":"ゥ","xe":"ェ","xo":"ォ","lla":"ジャ","lli":"じぃ","llu":"ジュ","lle":"ジェ","llo":"ジョ","ka":"カ","ca":"カ","ki":"キ","qui":"キ","ku":"ク","cu":"ク","qu":"ク","ke":"ケ","que":"ケ","ko":"コ","co":"コ","ga":"ガ","gi":"ヒ","gui":"ギ","gu":"グ","gue":"ゲ","go":"ゴ","kya":"キャ","kyu":"キュ","kyo":"キョ","gya":"ギャ","gyi":"ギィ","gyu":"ギュ","gye":"ギェ","gyo":"ギョ","sa":"サ","si":"シ","ci":"シ","shi":"シ","su":"ス","se":"セ","ce":"セ","so":"ソ","za":"サ","zi":"シ","zu":"ス","ze":"セ","zo":"ソ","sha":"シャ","shi":"シ","shu":"シュ","she":"シェ","sho":"ショ","ja":"ハ","jya":"ジャ","ji":"ヒ","ju":"フ","jyu":"ジュ","je":"ヘ","jye":"ジェ","jo":"ホ","jyo":"ジョ","ta":"タ","ti":"ティ","chi":"チ","tu":"トゥ","tsu":"ツ","te":"テ","to":"ト","da":"ダ","di":"ディ","du":"ドゥ","de":"デ","do":"ド","cha":"チャ","chi":"チ","chu":"チュ","che":"チェ","cho":"チョ","na":"ナ","ni":"ニ","nu":"ヌ","ne":"ネ","no":"ノ","ha":"ア","hi":"イ","hu":"ウ","fu":"フ","he":"エ","je":"ヘ","ge":"ヘ","ho":"オ","jo":"ホ","ba":"バ","bi":"ビ","bu":"ブ","be":"ベ","bo":"ボ","pa":"パ","pi":"ピ","pu":"プ","pe":"ペ","po":"ポ","fa":"ファ","fi":"フィ","fu":"フ","fe":"フェ","fo":"フォ","va":"ヴァ","vi":"ヴィ","vu":"ヴ","ve":"ヴェ","vo":"ヴォ","ma":"マ","mi":"ミ","mu":"ム","me":"メ","mo":"モ","ya":"ヤ","yu":"ユ","ye":"エ","yo":"ヨ","xya":"ャ","xyu":"ュ","xyo":"ョ","ra":"ラ","ri":"リ","ru":"ル","re":"レ","ro":"ロ","rya":"リャ","ryi":"リィ","ryu":"リュ","rye":"リェ","ryo":"リョ","wa":"ワ","wo":"ヲ","n":"ン","nn":"ン","n'":"ン",".":"。",",":"、","kk":"ッ","nha":"ニャ","nhi":"ニィ","nhu":"ニュ","nhe":"ニェ","nho":"ニョ","tt":"ッ","-":"ー","r":"ル","s":"ス","z":"ス","d":"ド","y":"イ","l":"ル","p":"プ","c":"ク","g":"グ","b":"ブ","y":"イ","m":"ン","f":"フ","t":"ト","x":"ス","xo":"クソ","xi":"ヒ"};
