/*
 *	京阪式アクセント・活用・曲用一覧作成表示スクリプト
 *
 *	2001/12/ 2(Ver.0.1)
 *
 *	2001/12/12(Ver.0.2)
 *		「行く」に対応。
 *
 *	2010/08/27(Ver.0.3)
 *		「見て・経て・来て」類のアクセントを修正。
 *		「見・経・来」類のアクセントも修正。
 *		「して」のアクセントを修正。
 *		「し」のアクセントも修正。ただしこれで良いか自信なし。
 *		一段の意向形を拗音化。ただし「1拍未然形＋よう」は除く。
 *		ナ変用の処理を追加。
 *
 */

var version = 0.3;

var osoagariFlag = 0;
var gobihikiMoji = '⌒';
var hinshiJoohoo = '';

var tango   = new Array();
var mAccent = new Array();
var sAccent = new Array();
var setsumei = new Array();
var katsuyooGobi = new Array(
	'あ','い','う','え','お','うた','ゆ',  'よ',
	'か','き','く','け','こ','いた','きゅ','きょ',
	'さ','し','す','せ','そ','した','しゅ','しょ',
	'た','ち','つ','て','と','った','ちゅ','ちょ',
	'な','に','ぬ','ね','の','んだ','にゅ','にょ',
	'は','ひ','ふ','へ','ほ','うた','ひゅ','ひょ',
	'ま','み','む','め','も','んだ','みゅ','みょ',
	'や','い','ゆ','え','よ','いた','ゆ',  'よ',
	'ら','り','る','れ','ろ','った','りゅ','りょ',
	'わ','ゐ','う','ゑ','を','うた','ゐゅ','ゐょ',
	'が','ぎ','ぐ','げ','ご','いだ','ぎゅ','ぎょ',
	'ざ','じ','ず','ぜ','ぞ','じた','じゅ','じょ',
	'だ','ぢ','づ','で','ど','ぢた','ぢゅ','ぢょ',
	'ば','び','ぶ','べ','ぼ','んだ','びゅ','びょ',
	'ぱ','ぴ','ぷ','ぺ','ぽ','ぴた','ぴゅ','ぴょ',
	'わ','い','う','え','お','うた','ゆ',  'よ',
	'ぁ','ぃ','ぅ','ぇ','ぉ','ぅた','ゅ',  'ょ',
	'ゃ','ぃ','ゅ','ぇ','ょ','ぅた','ゅ',  'ょ',
	'ん','っ');


// 表示。
function hyooji(){

	var de = '',
		saidai;

	if(!tango) return;

//	if(hinshiJoohoo){
	if(0){
		de  = '<div class="joohoo">\n';
		de += hinshiJoohoo;
		de += '<br>\n</div>';
	}
	de += '<table border="0" bordercolor="red" cellspacing="5" cellpadding="0">\n';
	saidai = tango.length;
	for(var i = 0; i < saidai; i++){
		if(tango[i] != '-'){
			de += '<tr>\n<td nowrap>\n';
			de += setsumei[i];
			de += '</td>\n';
			de += '<td nowrap>\n';
			de += '<div class="accent">\n<tt>\n';
			de += sAccent[i];
			de += '</tt>\n</div>\n';
			de += '<div class="tango">\n<tt>\n';
			de += tango[i];
			de += '</tt>\n</div>\n';
			de += '</td>\n';
			de += '<td nowrap>\n';
			de += '<div>\n';
			de += mAccent[i];
			de += '</div>\n';
			de += '</td>\n</tr>\n';
		}
		else{
			de += '<tr>\n<td colspan="3">\n<hr>\n</td>\n</tr>\n';
		}
	}
	de += '</table>\n';
	de += '<p>\n';
	de += '<small>\n文字がはみ出してしまう場合は、<br>\n←の枠を左へずらして調整してください。<br>\n</small>\n';
	de += '</p>\n';

	de += '<div>\n';
	de += '<form><input type="button" onClick="return osoagariKirikae();" value="';
	if(osoagariFlag){
		de += 'アクセントを遅上がり無しにする';
	}
	else{
		de += 'アクセントを遅上がりにする';
	}
	de += '"></form><br>\n';
	de += '</div>';

	de += '<p align="right">\n';
	de += '<small>京阪式アクセント・活用/曲用表示スクリプト Ver.';
	de += version;
	de += '</small>\n';
	de += '</p>';

	with(window.document){
		open();
		write(de);
		close();
	}

}


// ●○▼▲型アクセントに変換。
function maruAccentHenkan(go, ac){

	var nagasa,
		hakuAc,
		hakuGo,
		iAc,
		iGo,
		chiisoo,
		modori;

	modori = '[';
	nagasa = go.length;
	for(iAc = 0, iGo = 0; iGo < nagasa; ){
		hakuGo = go.charAt(iGo);
		if('ゃゅょぁぃぅぇぉ'.indexOf(hakuGo) >= 0){
			iGo++;
			continue;
		}
		hakuAc = ac.charAt(iAc);
		if(!hakuAc) break;
		if(hakuAc == '-'){
			modori += '-';
			iAc++;
			continue;
		}
		chiisoo = 0;
		if(hakuGo == gobihikiMoji &&
			(ac.charAt(iAc - 1) == 'H' || ac.charAt(iAc - 1) == 'L')){
			chiisoo = 1;
			modori += '<small>';
		}
		modori +=	(hakuAc == 'H') ? '●' :
					(hakuAc == 'L') ? '○' :
					(hakuAc == 'F') ? '▼' :
					(hakuAc == 'R') ? '▲' :
					(hakuAc == '-') ? hakuAc : '?';
		if(chiisoo) modori += '</small>';
		iAc++;
		iGo++;
	}
	return modori + ']';

}


// ＿￣＼／型アクセントに変換。
function senAccentHenkan(go, ac){

	var nagasa,
		hakuAc,
		modori = '',
		f = '';

	eval('f = "＼";');	// Netscape4は全角のバックスラッシュも\扱いする。
	if(!f) f = '￣';

	ac = yooonHosei(go, ac);
	nagasa = ac.length;
	for(var i = 0; i < nagasa; i++){
		hakuAc    = ac.charAt(i);
		modori +=	(hakuAc == 'H') ? '￣' :
					(hakuAc == 'L') ? '＿' :
					(hakuAc == 'F') ? f : // '￣' :
					(hakuAc == 'R') ? '／' :
					(hakuAc == '-') ? '' : hakuAc;
//					'<span style="color: white; background-color: white;">＿</span>';
	}
	return modori;

}


// 拗音分を補正する。
function yooonHosei(go, ac){

	var nagasa, modori, moji, haku;
	var i, j;

	nagasa = ac.length;
	modori = '';
	for(i = 0, j = 0; i < nagasa; i++, j++){
		haku = ac.charAt(i);
		moji = go.charAt(j + 1);
		if(moji && 'ゃゅょぁぃぅぇぉ'.indexOf(moji) >= 0){
			j++;
			if(haku == 'F'){
				modori += 'H';// haku='L';
			}
			else if(haku == 'R'){
				modori += 'L';// haku='H';
			}
			else modori += haku;
		}
		modori += haku;
	}
	return modori;

}


// 遅上がり処理。
function osoagariSuru(ac, hakuIchi){

	var haku, teikaFlag, modori;

	if(!osoagariFlag) return ac;
	haku = ac.charAt(0);
	if(haku == 'H' || haku == 'F') return ac;
	teikaFlag = 0;
	if(hakuIchi){
		modori   = ac.substr(hakuIchi);
	}
	else{
		hakuIchi = ac.length;
		modori   = '';
	}
	while(hakuIchi--){
		haku = ac.charAt(hakuIchi);
		if(teikaFlag){
			if(haku == 'H' || haku == 'R'){
				modori = 'L' + modori;
				continue;
			}
			else if(haku == 'L'){
				teikaFlag = 0;
			}
		}
		else if(haku == 'H' || haku == 'F'){
			teikaFlag = 1;
		}
		modori = haku + modori;
	}
	return modori;

}


// アクセントの滝が二つないかチェック。
function nijuuTakiCheck(ac){

	var taki = 0,
		haku,
		modori = '';

	for(var i = 0; i < ac.length; i++){
		haku = ac.charAt(i);
		if(taki){
			if(haku == 'H' || haku == 'F' || haku == 'R') haku = 'L';
		}
		else if(ac.substr(i, 2) == 'HL' || haku == 'F'){
			taki = 1;
		}
		modori += haku;
	}
	return modori;

}


// ●○式アクセントのrenketsu番目の次に'-'を挿入する。
function maruHyphenSoonyuu(renketsu, hajimari){

	renketsu--;
	for(var i = mAccent.length - 1; i >= hajimari; i--){
		mAccent[i] = mAccent[i].substr(0, renketsu) + '-'
			+ mAccent[i].substr(renketsu);
	}

}


// アクセントの設定。
function accentSettei(){

	var kosuu;

	kosuu = tango.length;
	for(var i = 0; i < kosuu; i++){
		if(tango[i] != '-'){
			mAccent[i] = maruAccentHenkan(tango[i], mAccent[i]);
			sAccent[i] = senAccentHenkan (tango[i], sAccent[i]);
		}
	}
}


// 三拍以上の名詞は、助詞の前において語尾引きを無効にする。
function sampakuIjooGobihiki(){

	sAccent[0] = gobihikiAccent(sAccent[0]);
	tango[0]  += gobihikiMoji;

return;

	var acGobiIchi = sAccent[0].length - 1,
		goGobiIchi = tango[0].length - 1;

	for(var i = sAccent.length - 1; i > 0; i--){
		tango[i] = tango[i].substr(0, goGobiIchi) +
			tango[i].substr(goGobiIchi + 1);
		sAccent[i] = sAccent[i].substr(0, acGobiIchi) +
			sAccent[i].substr(acGobiIchi + 1);
	}

}


// 名詞の処理。
function meishi(go, ac){

	var ac2 = ac,
		plus, saigo, nagasa, gobihikiIru = 0;
	var joshiGo = new Array(
		'', '-', 'は', 'が', 'に',
		'で', 'から', 'も', 'へ', 'や',
		'より', 'の(連体)', 'の(準体言)', 'と', 'と(引用)');
//		'-', 'どす', 'どした', 'どっしゃろ', 'です',
//		'でした', 'でしょう');
	var joshiAc = new Array(
		'', '', 'H', 'H', 'H',
		'H', 'HH', 'L', 'L', 'L',
		'LL', 'H', 'L', 'H', 'L');
//		'', 'HH', 'HLL', 'HHHL', 'HH',
//		'HLL', 'HHH');

	gobihikiIru = gobihikiCheck(ac);
	if(ac.length < 3 && gobihikiIru){
		ac2  = gobihikiAccent(ac);
		go  += gobihikiMoji;
	}

	saigo = ac2.charAt(ac2.length - 1);
	for(var i = joshiGo.length - 1; i >= 0; i--){
		setsumei[i] = '';
		if(joshiGo[i] == '-'){
			tango[i] = '-';
			sAccent[i] = '';
			continue;
		}
		tango[i] = go + joshiGo[i];
		plus = joshiAc[i];
		if(saigo == 'L' || saigo == 'F'){
			nagasa = plus.length;
			plus   = '';
			while(nagasa--) plus += 'L';
		}
		sAccent[i] = osoagariSuru(ac2 + plus, 0);
	}
	if(gobihikiIru && ac.length > 2){
		sampakuIjooGobihiki();
	}
	for(var i = sAccent.length - 1; i >= 0; i--) mAccent[i] = sAccent[i];

	maruHyphenSoonyuu(mAccent[2].length, 1)

	return;

}


// 単語情報取得。
function settei(go, ac, hi){

	var obj;

	obj = document.hikisuu;
	obj.tango.value  = go;
	obj.accent.value = ac;
	obj.hinshi.value = hi;
	window.open("./katsuyoo.html", "migi", "location=yes,menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=yes");
	return false;

}


// 動詞説明付加。
function dooshiSetsumeiFuka(){

	setsumei = Array('終止・連体形', '過去形', '連用中止形', '連用形', '仮定形', '命令形', '意向形', '', '否定形', '〃連用', '〃連用中止', '〃過去', '〃仮定', '', '使役形', '受動形', '転成名詞');

}


// 動詞の過去形を作る(ウ音便処理)。
function dooshiKakokei(gokan, gobi){

	var gokambi;
	var otoIchi;
	var saidai;

	if(gobi.charAt(0) != 'う'){
		if((gokan == 'い' || gokan == 'ゆ') && (gobi == 'いた')){
			return 'いった';
		}
		return gokan + gobi;
	}
	gokambi = gokan.charAt(gokan.length - 1);

	saidai  = katsuyooGobi.length - 2;	// 'ん'と'っ'の分。
	otoIchi = 0;
	while(otoIchi < saidai){
		for(var i = 0; i < 5; i++){
			if(gokambi == katsuyooGobi[otoIchi]){
				switch(otoIchi % 8){
					case 0:
						gokambi = katsuyooGobi[otoIchi + 4];
						break;
					case 1:
						gokambi = katsuyooGobi[otoIchi + 5];
						break;
					case 3:
						gokambi = katsuyooGobi[otoIchi + 4];
						break;
					default: ;
				}
				return gokan.substr(0, gokan.length - 1)
					+ gokambi + gobi;
			}
			otoIchi++;
		}
		otoIchi += 3;
	}
	return gokan + gobi;

}


// 連用中止形を作る。
function chuushikei(kako){

	if(kako.charAt(kako.length - 1) == 'だ'){
		return kako.substr(0, kako.length - 1) + 'で';
	}
	return kako.substr(0, kako.length - 1) + 'て';

}


// 五段動詞の活用形を作る。
function godanDooshi(go, ac){

	var gobi, kaeri, gokan, gochoo;
	var mizen, renyoo, ombin, ombin2, izen, meirei, ikoo;

	hinshiJoohoo = '五段活用';

	gochoo = go.length;
	gobi   = go.charAt(gochoo - 1);
	gokan  = go.substr(0, gochoo - 1);
	kaeri  = gyooShiraberu(gobi);
	if(kaeri == -1) return false;

	kaeri *= 8;
	mizen  = gokan + katsuyooGobi[kaeri];
	renyoo = gokan + katsuyooGobi[kaeri + 1];
	ombin  = dooshiKakokei(gokan, katsuyooGobi[kaeri + 5]);
	ombin2 = chuushikei(ombin);
	izen   = gokan + katsuyooGobi[kaeri + 3];
	meirei = izen;
	ikoo   = gokan + katsuyooGobi[kaeri + 4];

	tango = Array(
		go, ombin, ombin2, renyoo, izen + 'ば',
		meirei, ikoo + 'う', '-', mizen + 'ん', mizen + 'ず',
		mizen + 'いで', mizen + 'なんだ', mizen + 'ねば', '-',
		mizen + 'す', mizen + 'れる', renyoo
	);
	godanAccent(ac);

}


// 五段活用のアクセントを作る。
function godanAccent(ac){

	if(ac.charAt(0) == '1'){
		sAccent[0] = sAccent[0].substr(1);
		godanTakikoteiAccent();
	}
	else if(ac == 'LH' || ac == 'LL'){
		godanNiruiAccent();
	}
	else if(ac.charAt(ac.length - 1) == 'H'){
		godanIchiruiAccent();
	}
	else if(ac.substr(ac.length - 3) == 'HLL'){
		godanNiruiAccent();
	}
	else godanTakikoteiAccent(); // alert('エラー(五段アクセント)' + ac);

}


// 五段１類。
function godanIchiruiAccent()
{
	var ac;

	ac = sAccent[0].substr(0, sAccent[0].length - 1);
	sAccent[1] = ac + 'LL';
	sAccent[2] = sAccent[1];
	sAccent[3] = ac + 'L';
	sAccent[4] = ac + 'LL';
	sAccent[5] = ac + 'L';
	sAccent[6] = ac + 'HH';
	sAccent[8] = ac + 'HH';
	sAccent[9] = ac + 'HL';
	sAccent[10] = ac + 'HLL';
	sAccent[11] = ac + 'HLLL';
	sAccent[12] = ac + 'HLL';
	sAccent[14] = ac + 'HH';
	sAccent[15] = ac + 'HHH';
	sAccent[16] = ac + 'H';

}


// 五段２類。
function godanNiruiAccent()
{
	var ac;

	ac = sAccent[0].substr(0, sAccent[0].length - 2);
	sAccent[3] = ac + 'LF';
	sAccent[4] = ac + 'LHL';
	sAccent[5] = ac + 'LF';
	sAccent[6] = ac + 'HLL';
	sAccent[8] = ac + 'HLL';
	sAccent[9] = ac + 'LHL';
	sAccent[10] = ac + 'LHLL';
	sAccent[11] = ac + 'LHLLL';
	sAccent[12] = ac + 'HLLL';
	sAccent[14] = ac + 'HLL';
	sAccent[15] = ac + 'HHLL';
	sAccent[16] = ac + 'HL';

	if (tango[1].charAt(tango[1].length - 2) == 'っ')
		sAccent[1] = ac + 'LLH';
	else
		sAccent[1] = ac + 'LHL';

	sAccent[2] = sAccent[1];	// 20100827: 中止のテ形は高接か低接か定めがたし。
}


// 五段滝固定。
function godanTakikoteiAccent()
{
	var ac;

	ac = sAccent[0];
	sAccent[0] = ac;
	sAccent[1] = ac + 'L';
	sAccent[2] = sAccent[1];
	sAccent[3] = ac;
	sAccent[4] = ac + 'L';
	sAccent[5] = ac;
	sAccent[6] = ac + 'L';
	sAccent[8] = ac + 'L';
	sAccent[9] = ac + 'L';
	sAccent[10] = ac + 'LL';
	sAccent[11] = ac + 'LLL';
	sAccent[12] = ac + 'LL';
	sAccent[14] = ac + 'L';
	sAccent[15] = ac + 'LL';
	sAccent[16] = ac;

}


// 一段動詞の活用形を作る。
function ichidanDooshi(go, ac){

	var gokan;

	hinshiJoohoo = '一段活用';

	gokan  = go.substr(0, go.length - 1);

	tango = Array(
		go, gokan + 'た', gokan + 'て', gokan, gokan + 'れば',
		gokan, gokan + 'よう', '-', gokan + 'ん', gokan + 'ず',
		gokan + 'いで', gokan + 'なんだ', gokan + 'ねば', '-',
		gokan + 'さす', gokan + 'られる', gokan
	);
	ichidanIkooHosei();	// 上げよう→上ぎょう補正。不要ならコメントアウト。
	ichidanAccent(ac);
}


// 一段活用の意向形を必要なら拗音形にする。
function ichidanIkooHosei()
{
	var nagasa = tango[6].length;

	if (nagasa > 3)
	{
		var saidai = katsuyooGobi.length - 2;	// 'ん'と'っ'の分。
		var gokammatsu = tango[6].charAt(nagasa - 3);

		for (var i = 1; i < saidai; i += 8)
		{
			if (gokammatsu == katsuyooGobi[i] || gokammatsu == katsuyooGobi[i + 2])
			{
				tango[6] = tango[6].substr(0, nagasa - 3) + katsuyooGobi[i] + 'ょう';
				break;
			}
		}
	}
}


// 一段活用のアクセントを作る。
function ichidanAccent(ac){

	if(ac.charAt(0) == '1'){
		sAccent[0] = sAccent[0].substr(1);
		ichidanTakikoteiAccent();
	}
	else if(ac == 'HH'){
		nihakuIchidan1Accent();
	}
	else if(ac == 'LH' || ac == 'LL'){
		nihakuIchidan2Accent();
	}
	else if(ac == 'LHH' || ac == 'LLH'){
		sampakuIchidan3Accent();
	}
	else if(ac.charAt(ac.length - 1) == 'H'){
		ichidan1Accent();
	}
	else if(ac.substr(ac.length - 3) == 'HLL'){
		ichidan2Accent();
	}
	else ichidanTakikoteiAccent(); // alert('エラー(一段アクセント)' + ac);

}


// ２拍一段１類。
function nihakuIchidan1Accent()
{
	sAccent[1] = 'HL';
	sAccent[2] = sAccent[1];
	sAccent[3] = 'F';
	sAccent[4] = 'HLL';
	sAccent[5] = 'F';
	sAccent[6] = 'HHH';
	sAccent[8] = 'HH';
	sAccent[9] = 'HL';
	sAccent[10] = 'HLL';
	sAccent[11] = 'HLLL';
	sAccent[12] = 'HLL';
	sAccent[14] = 'HHH';
	sAccent[15] = 'HHHH';
	sAccent[16] = 'HH';

	mAccent[16] = 'H';
	tango[16] += gobihikiMoji;

}


// ２拍一段２類。
function nihakuIchidan2Accent()
{
	sAccent[1] = 'HL';
	sAccent[2] = 'HH';	// sAccent[1];
	sAccent[3] = 'H';	// 'F';	// 20100827変更。
	sAccent[4] = 'LHL';
	sAccent[5] = 'F';
	sAccent[6] = 'HLL';		// LHHかHLLか。
	sAccent[8] = 'LH';
	sAccent[9] = 'HL';
	sAccent[10] = 'HLL';
	sAccent[11] = 'HLLL';
	sAccent[12] = 'LHL';
	sAccent[14] = 'HLL';
	sAccent[15] = 'HHLL';
	sAccent[16] = 'R';

}


// ３拍一段３類。
function sampakuIchidan3Accent()
{
	sAccent[1] = 'LHL';
	sAccent[2] = sAccent[1];
	sAccent[3] = 'LF';
	sAccent[4] = 'LHLL';
	sAccent[5] = 'LF';
	sAccent[6] = 'LHHH';
	sAccent[8] = 'LHH';
	sAccent[9] = 'LHL';
	sAccent[10] = 'LHLL';
	sAccent[11] = 'LHLLL';
	sAccent[12] = 'LHLL';
	sAccent[14] = 'LHHH';
	sAccent[15] = 'LHHHH';
	sAccent[16] = 'HL';

}


// 一段１類。
function ichidan1Accent()
{
	var ac;

	ac = sAccent[0].substr(0, sAccent[0].length - 2);
	sAccent[1] = ac + 'LL';
	sAccent[2] = sAccent[1];
	sAccent[3] = ac + 'L';
	sAccent[4] = ac + 'HLL';
	sAccent[5] = ac + 'L';
	sAccent[6] = ac + 'HH';	// 'HHH';	// 20100827: 拗音化。
	sAccent[8] = ac + 'HH';
	sAccent[9] = ac + 'HL';
	sAccent[10] = ac + 'HLL';
	sAccent[11] = ac + 'HLLL';
	sAccent[12] = ac + 'HLL';
	sAccent[14] = ac+ 'HHH';
	sAccent[15] = ac + 'HHHH';
	sAccent[16] = ac + 'H';

}


// 一段２類。
function ichidan2Accent()
{
	var ac;

	ac = sAccent[0].substr(0, sAccent[0].length - 3);
	sAccent[1] = ac + 'LHL';
	sAccent[2] = sAccent[1];	// 20100827: 中止のテ形は高接か低接か定めがたし。
	sAccent[3] = ac + 'LF';
	sAccent[4] = ac + 'HLLL';
	sAccent[5] = ac + 'LF';
	sAccent[6] = ac + 'HLL';	// 'HLLL';	// 20100827: 拗音化。
	sAccent[8] = ac + 'HLL';
	sAccent[9] = ac + 'LHL';
	sAccent[10] = ac + 'LHLL';
	sAccent[11] = ac + 'LHLLL';
	sAccent[12] = ac + 'HLLL';
	sAccent[14] = ac + 'HHLL';
	sAccent[15] = ac + 'HHHLL';
	sAccent[16] = ac + 'HL';

}


// 一段滝固定。
function ichidanTakikoteiAccent()
{
	var ac;

	ac = sAccent[0];
	ac = ac.substr(0, ac.length - 1);
	sAccent[0] = ac + 'L';
	sAccent[1] = ac + 'L';
	sAccent[2] = sAccent[1];
	sAccent[3] = ac;
	sAccent[4] = ac + 'LL';
	sAccent[5] = ac;
	sAccent[6] = ac + 'LL';
	sAccent[8] = ac + 'L';
	sAccent[9] = ac + 'L';
	sAccent[10] = ac + 'LL';
	sAccent[11] = ac + 'LLL';
	sAccent[12] = ac + 'LL';
	sAccent[14] = ac + 'LL';
	sAccent[15] = ac + 'LLL';
	sAccent[16] = ac;

}


// サ変動詞の活用形を作る。
function sahenDooshi(go, ac){

	var gokan, seidaku;
	var mizen, renyoo, rentai, izen, meirei, ikoo;

	hinshiJoohoo = 'サ行変格活用';

	gokan   = go.substr(0, go.length - 2);
	seidaku = go.charAt(go.length - 2);

	switch(seidaku){
		case 'す':
			mizen  = gokan + 'せ';
			renyoo = gokan + 'し';
			rentai = gokan + 'する';
			izen   = gokan + 'すれ';
			meirei = gokan + 'せ';
			ikoo   = gokan + 'しょ';
			break;
		case 'ず':
			mizen  = gokan + 'ぜ';
			renyoo = gokan + 'じ';
			rentai = gokan + 'ずる';
			izen   = gokan + 'ずれ';
			meirei = gokan + 'ぜ';
			ikoo   = gokan + 'じょ';
			break;
		default:
			alert('エラー(サ変)' + go);
	}
	tango = Array(
		go, renyoo + 'た', renyoo + 'て', renyoo, izen + 'ば',
		meirei, ikoo + 'う', '-', mizen + 'ん', mizen + 'ず',
		mizen + 'いで', mizen + 'なんだ', mizen + 'ねば', '-',
		mizen + 'さす', mizen + 'られる', renyoo
	);

	ichidanAccent(ac);
	sAccent[2] = 'HH';	// 20100827: 「して」はHH。
	sAccent[3] = 'H';	// 20100827: 上に倣うた。これで良いか要再検証。

	sahenIkookeiHosei();
	if(go == 'する')
		suruHosei();
}


// 意向形の後ろから三拍目のアクセントを落とす。
function sahenIkookeiHosei()
{
	var nagasa = sAccent[6].length;

	sAccent[6] = sAccent[6].substr(0, nagasa - 3) + sAccent[6].substr(nagasa - 2);
}


// 'する'の使役と受動を補正する。
function suruHosei(){

	tango[14] = 'さす';
	tango[15] = 'される';
	sAccent[14] = 'HH';
	sAccent[15] = 'HHH';

}


// カ変動詞の活用形を作る。
function kahenDooshi(go, ac){

	var gokan, seidaku;
	var mizen, renyoo, rentai, izen, meirei, ikoo;

	hinshiJoohoo = 'カ行変格活用';

	gokan   = go.substr(0, go.length - 2);

	mizen  = gokan + 'こ';
	renyoo = gokan + 'き';
	rentai = gokan + 'くる';
	izen   = gokan + 'くれ';
	meirei = gokan + 'こい';
	ikoo   = gokan + 'こ';

	tango = Array(
		go, renyoo + 'た', renyoo + 'て', renyoo, izen + 'ば',
		meirei, ikoo + 'う', '-', mizen + 'ん', mizen + 'ず',
		mizen + 'いで', mizen + 'なんだ', mizen + 'ねば', '-',
		mizen + 'さす', mizen + 'られる', renyoo
	);

	sAccent = Array(
		'LH', 'HL', 'HH', 'H' /* 'F' */, 'LHL',
		'HL', 'LH', '-', 'LH', 'HL',
		'HLL', 'HLLL', 'LHL', '-',
		'HLL', 'HHLL', 'R');

}


// ナ変動詞の活用形を作る。
function nahenDooshi(go, ac)
{
	var gokan, seidaku;
	var mizen, renyoo, rentai, izen, meirei, ikoo;

	hinshiJoohoo = 'ナ行変格活用';

	gokan   = go.substr(0, go.length - 2);

	mizen  = gokan + 'な';
	renyoo = gokan + 'に';
	ombin  = gokan + 'ん';
	rentai = gokan + 'ぬる';
	izen   = gokan + 'ぬれ';
	meirei = gokan + 'ね';
	ikoo   = gokan + 'の';

	tango = Array(
		go, ombin + 'だ', ombin + 'で', renyoo, izen + 'ば',
		meirei, ikoo + 'う', '-', mizen + 'ん', mizen + 'ず',
		mizen + 'いで', mizen + 'なんだ', mizen + 'ねば', '-',
		mizen + 'す', mizen + 'れる', renyoo
	);

	sAccent = Array(
		'HHH', 'HLL', 'HLL', 'HL', 'HHLL',
		'HL', 'HHH', '-', 'HHH', 'HHL',
		'HHLL', 'HHLLL', 'HHLL', '-',
		'HHH', 'HHHH', 'HH');

}


// 末尾が'F'・'R'で終わる活用形の語尾を引く。
function dooshiGobihiki(){

	var gokan,
		i = sAccent.length;

	while(i--){
		if(sAccent[i].charAt(sAccent[i].length - 1) == 'F'){
			gokan = sAccent[i].substr(0, sAccent[i].length - 1);
			sAccent[i] = gokan + 'HL'; // 'F';
			tango[i]  += gobihikiMoji;
		}
		else if(sAccent[i].charAt(sAccent[i].length - 1) == 'R'){
			gokan = sAccent[i].substr(0, sAccent[i].length - 1);
			sAccent[i] = gokan + 'LH'; // 'R';
			tango[i]  += gobihikiMoji;
		}
	}

}


// 動詞の処理先の振り分け。
function dooshiFuriwakeru(go, ac, hi)
{
	var ichidanFlag = 0;

	sAccent[0]  = ac;
	switch(hi)
	{
		case 'D5':
			godanDooshi(go, ac);
			break;
		case 'D1':
			ichidanDooshi(go, ac);
			ichidanFlag = 1;
			break;
		case 'DS':
			sahenDooshi(go, ac);
			ichidanFlag = 1;
			break;
		case 'DK':
			kahenDooshi(go, ac);
			break;
		case 'DN':
			nahenDooshi(go, ac);
		default:
			;
	}

//	sAccent[2] = sAccent[1];	// 連用中止は過去形と同じアクセント。

	// separators.
	sAccent[7]  = '-';
	sAccent[13] = '-';

	if(ichidanFlag){		// 一段活用なら命令形に「よ」を補う。
		tango[5]   += 'よ';
		sAccent[5] += 'L';
	}

}


// アクセントの滝が促音にかかっているので一拍ずらす。
function sokuonTaisaku(hakuIchi){

	var mae, ushiro;

	mae  = sAccent[0].substr(0, hakuIchi);
	mae += mae.charAt(mae.length - 1) + 'H';
	for(var i = sAccent.length - 1; i >= 0; i--){
		sAccent[i] = mae + sAccent[i].substr(hakuIchi + 2);
	}

}


// 動詞共通の処理。
function dooshiKyootsuu(go, ac, hi){

	var renketsu,
		sokuonFlag = 0,
		maeYooso = '',
		meishiHihyooji = 0;

	if(ac.charAt(0) == '~'){
		meishiHihyooji = 1;
		ac = ac.substr(1);
	}
	renketsu = ac.lastIndexOf('-') + 1;
	if(renketsu){
		maeYooso = ac.substr(0, renketsu - 1);
		ac = ac.substr(renketsu);
	}
	dooshiFuriwakeru(go, ac, hi);

	for(var i = sAccent.length - 1; i >= 0; i--){
		sAccent[i] = nijuuTakiCheck(maeYooso + sAccent[i]);
		if(sAccent[i].charAt(0) == 'L'){	// 遅上がり処理。
			sAccent[i] = osoagariSuru(sAccent[i], renketsu);
		}
	}

/*	if(renketsu){	// アクセントの滝が促音にかかることを防ぐ。
		if(maeYooso.charAt(0) == 'L' &&
			go.charAt(maeYooso.length - 1) == 'っ')
				sokuonTaisaku(maeYooso.length - 1);
	}
*/
	for(var i = sAccent.length - 1; i >= 0; i--){
		if(mAccent[i]){
			mAccent[i] = nijuuTakiCheck(maeYooso + mAccent[i]);
			mAccent[i] = osoagariSuru(mAccent[i], renketsu);
		}
		else mAccent[i] = sAccent[i];
	}

	dooshiGobihiki();

	if(renketsu) maruHyphenSoonyuu(renketsu, 0);	// 複合語にハイフンを。
	if(renketsu || meishiHihyooji){	// 転成名詞を削除。
		tango.length--;
		sAccent.length--;
		mAccent.length--;
	}

	dooshiSetsumeiFuka();

	return;

}


// 形容詞説明付加。
function keiyooshiSetsumeiFuka(){

	setsumei = Array('終止・連体形', '連用形', '連用中止形', '過去形', '仮定形', '命令形', '推量形', '-', '否定形', '〃連用', '-', '名詞形');

}


// 形容詞語尾をつける。
function keiyooshiGobi(go){

	var gokan = go.substr(0, go.length - 1);
	var renyoo;

	if(go == 'えい' || go == 'ええ') gokan = 'よ';
	tango[0] = go;
	tango[1] = dooshiKakokei(gokan, 'う');
	tango[2] = tango[1] + 'て';
	tango[3] = gokan + 'かった';
	tango[4] = gokan + 'ければ';
	tango[5] = gokan + 'かれ';
	tango[6] = gokan + 'かろう';
	tango[7] = '-';
	tango[8] = gokan + 'からぬ';
	tango[9] = gokan + 'からず';
	tango[10] = '-';
	tango[11] = gokan + 'さ';

}


// 一類形容詞のアクセント。
function keiyooshi1Accent(){

	var gokan = sAccent[0].substr(0, sAccent[0].length - 1);

	sAccent[1] = gokan + 'L';
	sAccent[2] = gokan + 'LL';
	sAccent[3] = gokan + 'LLL';
	sAccent[4] = gokan + 'LLL';
	sAccent[5] = gokan + 'LL';
	sAccent[6] = gokan + 'LLL';
	sAccent[8] = gokan + 'LLL';
	sAccent[9] = gokan + 'LLL';
	sAccent[11] = gokan +'H';

}


// ２拍２類形容詞アクセント。
function nihaku2KeiyooshiAccent(){

	var gokan = sAccent[0].substr(0, sAccent[0].length - 2);

	sAccent[1] = gokan + 'HL';
	sAccent[2] = gokan + 'HLL';
	sAccent[3] = gokan + 'HLLL';
	sAccent[4] = gokan + 'LHLL';
	sAccent[5] = gokan + 'HLL';
	sAccent[6] = gokan + 'HLLL';
	sAccent[8] = gokan + 'HLLL';
	sAccent[9] = gokan + 'HLLL';
	sAccent[11] = gokan + 'HH';

}


// 二類形容詞のアクセント。
function keiyooshi2Accent(){

	var gokan = sAccent[0].substr(0, sAccent[0].length - 3);

	sAccent[1] = gokan + 'LHL';
	sAccent[2] = gokan + 'LHLL';
	sAccent[3] = gokan + 'LHLLL';
	sAccent[4] = gokan + 'LHLLL';
	sAccent[5] = gokan + 'LHLL';
	sAccent[6] = gokan + 'LHLLL';
	sAccent[8] = gokan + 'LHLLL';
	sAccent[9] = gokan + 'LHLLL';
	sAccent[11] = gokan +'LHH';

}


// 滝固定型形容詞アクセント。
function keiyooshiTakikoteiAccent(){
//	setsumei = Array('終止・連体形', '連用形', '連用中止形', '過去形', '仮定形', '命令形', '推量形', '-', '否定形', '〃連用', '-', '転成名詞');

	var gokan = sAccent[0].substr(0, sAccent[0].length - 1);

	sAccent[1] = gokan + 'L';
	sAccent[2] = gokan + 'LL';
	sAccent[3] = gokan + 'LLL';
	sAccent[4] = gokan + 'LLL';
	sAccent[5] = gokan + 'LL';
	sAccent[6] = gokan + 'LLL';
	sAccent[8] = gokan + 'LLL';
	sAccent[9] = gokan + 'LLL';
	sAccent[11] = gokan +'L';

}


// 形容詞共通の処理。
function keiyooshiKyootsuu(go, ac, hi){

	var maeYooso = '',
		i;

	keiyooshiGobi(go);

	renketsu = ac.lastIndexOf('-') + 1;
	if(renketsu){
		maeYooso = ac.substr(0, renketsu - 1);
		ac = ac.substr(renketsu);
	}
	sAccent[0]  = ac;
	sAccent[7]  = '-';
	sAccent[10] = '-';

	if(ac.charAt(0) == '1'){
		sAccent[0] = sAccent[0].substr(1);
		keiyooshiTakikoteiAccent();
	}
	else if(ac.charAt(0) == '2'){
		sAccent[0] = sAccent[0].substr(1);
		nihaku2KeiyooshiAccent();
	}
	else if(ac == 'LH' || ac == 'LL'){
		nihaku2KeiyooshiAccent();
	}
	else if(ac.substr(ac.length - 2) == 'HL'){
		keiyooshi1Accent();
	}
	else if(ac.substr(ac.length - 3) == 'HLL'){
		keiyooshi2Accent();
	}
	else keiyooshiTakikoteiAccent();

	i = sAccent.length;
	while(i--){
		sAccent[i] = nijuuTakiCheck(maeYooso + sAccent[i]);
		sAccent[i] = osoagariSuru(sAccent[i]);
		mAccent[i] = sAccent[i];
	}

	if(renketsu) maruHyphenSoonyuu(renketsu, 0);

	keiyooshiSetsumeiFuka();

	return;

}


// 何行かを調べる。
function gyooShiraberu(gobi)
{
	return '＿くすつぬふむゆる＿ぐずづぶぷうぅゅ'.indexOf(gobi);
}


// 単語の語尾を引く。
function gobihikiTango(gobi){

	var otoIchi;
	var saidai;

	saidai  = katsuyooGobi.length - 2;	// 'ん'と'っ'の分。
	otoIchi = 0;
	while(otoIchi < saidai){
		for(var i = 0; i < 5; i++){
			if(gobi == katsuyooGobi[otoIchi]) return "ぁぃぅぇぉ".charAt(i);
			otoIchi++;
		}
		otoIchi += 3;
	}
	return 'ー';

}


// 語尾引き仮記号を実際に表示するための文字に置き換える。
function gobihikiOkikaeru(){

	var hikiIchi;

	for(var i = tango.length - 1; i >= 0; i--){
		hikiIchi = tango[i].lastIndexOf(gobihikiMoji);
		if(hikiIchi >= 0){
			tango[i] = tango[i].substr(0, hikiIchi) +
				gobihikiTango(tango[i].charAt(hikiIchi - 1)) +
				tango[i].substr(hikiIchi + 1);
		}
	}

}


// アクセント符号の語尾を引く。
function gobihikiAccent(ac){

	var nagasa;

	nagasa = ac.length;
	switch(ac.charAt(nagasa - 1)){
		case 'F':
			return ac.substr(0, nagasa - 1) + 'HL';
		case 'R':
			return ac.substr(0, nagasa - 1) + 'LH';
			break;
		default:
			return ac;
	}

}


// 語尾引きかどうか調べる。
function gobihikiCheck(ac){

	switch(ac.charAt(ac.length - 1)){
		case 'F':
		case 'R':
			return true;
		default:
			return false;
	}

}


// 日本語を一文字として扱うタイプのブラウザかどうか調べる。
function browserCheck()
{
	if ("日本語".charAt(1) == '本')
		return true;

	with(document)
	{
		open();
		writeln('<p>');
		writeln('お使いのブラウザはこの機能に対応していません。<br>');
		writeln('(日本語を二文字としてではなく、一文字として扱うブラウザでのみご利用可)<br>');
		writeln('</p>');
		close();
	}
	return false;
}


// メイン。
function hyooKaku(go, ac, hi, os)
{
	if (ac.charAt(ac.length - 1) == '?')
		ac = ac.substr(0, ac.length - 1);

	if (!browserCheck())
		return false;

	osoagariFlag = os - 0;

	switch(hi.charAt(0))
	{
		case 'M':
			meishi(go, ac);
			break;
		case 'D':
			dooshiKyootsuu(go, ac, hi);
			break;
		case 'K':
			keiyooshiKyootsuu(go, ac, hi);
			break;
		default:
			break;
	}

	accentSettei();
	gobihikiOkikaeru();
	hyooji();

	return false;
}


// デバッグ用。
function debug(e)
{
	var i, obj, view = '';

	for(i in e){
		view += i + '=[' + e[i] + ']  ';
	}
	obj = window.open();
	obj.document.open();
	obj.document.write(view);
	obj.document.close();
	// alert(view);
}
