/*********************************
 * FitTextLength
 * ドキュメント中の文字列を指定幅に収まるように末尾を切り捨てる。
 * ドキュメント中で "TRUNC:ss:nn_mm_ww_hh"形式の id を持つ<span>要素が処理対象となる。
 * ss = 末尾切り捨てが発生した場合に、末尾に表示するリーダ文字列
 *      省略形は "TRUNCnn_mm_ww_hh" で、リーダ無し
 * nn = 任意のユニークID。ただし _(アンダーバー)と:(コロン)を含んではならない。
 * mm = 最大文字数。innerHTMLの即時再描画をしないブラウザの場合、この文字数で末尾を切り捨てる。
 * ww = 最大幅サイズ
 * hh = 折り畳みテキストの最大行数。省略時は１行。
**********************************/
function FitTextLength()
{
	var elems = document.documentElement.getElementsByTagName('span');
	element_loop:
	for (cnt = 0;cnt < elems.length;cnt++)
	{
		node = elems[cnt];
		if (node.id.length <= 0)
			continue;

		maxLetters = 0;
		maxWidth = 0;
		maxHeight = 0;
		leader = '';
		if (node.id.match(/^TRUNC(.*?)_(\d+)_(\d+)$/))
		{
			leader = RegExp.$1;
			maxLetters = RegExp.$2;
			maxWidth = RegExp.$3;
			maxHeight = 1;
		}
		if (node.id.match(/^TRUNC(.*?)_(\d+)_(\d+)_(\d+)$/))
		{
			leader = RegExp.$1;
			maxLetters = RegExp.$2;
			maxWidth = RegExp.$3;
			maxHeight = RegExp.$4;
		}
		if (maxWidth == 0)
			continue;

		if (leader.match(/^:(.*):/))
			leader = RegExp.$1;
		else
			leader = '';

		elm = document.getElementById(node.id);
		orgText = elm.innerHTML;
		elm.innerHTML = orgText.slice(0,maxLetters + maxLetters / 2);
		////####elm.style.visibility = "hidden";
		elm.innerHTML = "轟";
		////####elm.style.visibility = "visible";
		height1 = elm.offsetHeight;
		////####elm.style.visibility = "hidden";
		elm.innerHTML = "轟<br>轟";
		////####elm.style.visibility = "visible";
		height2 = elm.offsetHeight;
		if (height1 == height2)
		{
			////####elm.style.visibility = "hidden";
			elm.innerHTML = orgText.slice(0,maxLetters - leader.length) + leader;
			////####elm.style.visibility = "visible";
			continue element_loop;
		}

		maxHeight = (height1 + (height2 - height1 * 2)) * maxHeight + 1;
		////####elm.style.visibility = "hidden";
		elm.innerHTML = orgText.slice(0,maxLetters + maxLetters / 2);
		////####elm.style.visibility = "visible";
		while ((elm.offsetHeight > maxHeight) || (elm.offsetWidth > maxWidth))
		{
			oldlen = elm.innerHTML.length;
			////####elm.style.visibility = "hidden";
/**********
			if (elm.innerHTML.match(/(<\s*br\s*\/*>\s*)$/i))
				elm.innerHTML = elm.innerHTML.slice(0,elm.innerHTML.length - RegExp.$1.length);
			else
***********/
			if (elm.innerHTML.match(/(&..;\s*)$/i) ||
			    elm.innerHTML.match(/(&...;\s*)$/i) ||
			    elm.innerHTML.match(/(&....;\s*)$/i) ||
			    elm.innerHTML.match(/(&.....;\s*)$/i))
				elm.innerHTML = elm.innerHTML.slice(0,elm.innerHTML.length - RegExp.$1.length);
			else
				elm.innerHTML = elm.innerHTML.slice(0,elm.innerHTML.length - 1);

			////####elm.style.visibility = "visible";
			if (oldlen == elm.innerHTML.length)
			{
				////####elm.style.visibility = "hidden";
				elm.innerHTML = orgText.slice(0,maxLetters);
				if (elm.innerHTML != orgText)
					elm.innerHTML = orgText.slice(0,maxLetters - leader.length) + leader;
				////####elm.style.visibility = "visible";
				continue element_loop;
			}
		}

		if (elm.innerHTML != orgText)
		{
			orgLength = elm.innerHTML.length;
			////####elm.style.visibility = "hidden";
			elm.innerHTML = elm.innerHTML + leader;
			////####elm.style.visibility = "visible";
			while ((elm.offsetHeight > maxHeight) || (elm.offsetWidth > maxWidth))
			{
				////####elm.style.visibility = "hidden";
/**********
				if (elm.innerHTML.match(/(<\s*br\s*\/*>\s*)$/i))
					orgLength -= RegExp.$1.length;
				else
***********/
				if (elm.innerHTML.match(/(&..;\s*)$/i) ||
				    elm.innerHTML.match(/(&...;\s*)$/i) ||
				    elm.innerHTML.match(/(&....;\s*)$/i) ||
				    elm.innerHTML.match(/(&.....;\s*)$/i))
					orgLength -= RegExp.$1.length;
				else
					orgLength--;
				elm.innerHTML = elm.innerHTML.slice(0,orgLength);
				elm.innerHTML = elm.innerHTML + leader;
				////####elm.style.visibility = "visible";
				if (orgLength == elm.innerHTML.length)
				{
					////####elm.style.visibility = "hidden";
					elm.innerHTML = orgText.slice(0,maxLetters);
					if (elm.innerHTML != orgText)
						elm.innerHTML = orgText.slice(0,maxLetters - leader.length) + leader;
					////####elm.style.visibility = "visible";
					continue element_loop;
				}
			}
		}
	}
}

