// pukiwiki の #contentsを隠せるようにしたり、右上に目次/差分を固定表示したりするスクリプト  2009/02/06
// ※#include の対応は極めていい加減
_d = document;
isMSIE = !!(window.attachEvent && !window.opera);

// {{{1 その pukiwiki の #contents を隠す/表示するリンクを出力
function contents_show_hide(arg) {
	// 再レンダリングを減らす為、writeする
	_d.write(
		'<span class="contents_show_hide">[<a href="javascript:void(0)" onclick="'
			+ "var sty = _d.getElementById('contents_" +arg+ "').style;"
			+ "if (sty.display === 'none') {"
				+ "sty.display = 'block';"
				+ "this.innerHTML = '目次を隠す';"
			+ "} else {"
				+ "sty.display = 'none';"
				+ "this.innerHTML = '目次を表示';"
			+ "}"
		+ '" title="印刷する場合、隠した方がページを節約出来ます">目次を隠す</a>]</span>'
	)
}

// }}}


// {{{1 右上に目次/差分のListBoxを表示
function create_contents_select() {
	var i, name, n, cnt, ii;  i = name = n = cnt = 0;  ii = 1;
	var str, str_popup, tmp;  str = str_popup = '';
	while (true) {
		var obj = _d.getElementById('content_'+ii+'_'+i);
		// 次の目次へ移動 OR 終了
		if (!obj) {
			++ii;
			i = n = 0;
			if (tmp = _d.getElementById('content_'+ii+'_0')) {
				// #include で他のページを読み込んでいる
				
				// <H1> を探す
				while (tmp = tmp.previousSibling) {
					if (!tmp || tmp.tagName === 'H1' || name === 'H2' || name === 'H3' || name === 'H4')
						break;
				}
				if (!tmp)
					break;
				
				if (str.indexOf('以下挿入場所不明') === -1) {
					str += '<option style="background-color:#777; color:white">以下挿入場所不明</option>';
					str_popup += '<a style="background-color:#777; color:white; text-align:center; font-weight:bold">以下挿入場所不明</a>';
					// もう面倒＆大変なので、#includeの位置を調べるのはやめた。#include したページで更に #include してたりするとHTML作るのも面倒だし…
				}
				
				// <H1>
				tmp.id = 'content_' + ii;
				++cnt;
				str += '<option value="content_'+ii+'" title="#content_'+ii+' (include)" style="background-color:#dfd">['+tmp.innerHTML.replace(/\s*<A [^>]+>(?:†|Edit|編集)<\/A>\s*/ig,'').replace(/<[^>]+>/g,'').replace(/^\s+|\s+$/g,'')+']</option>';
				str_popup += '<a href="#content_'+ii+'" title="#content_'+ii+' (include)"'+(cnt % 2 ? '' : ' class="popup_contents_light"')+' style="font-weight:bold">['+tmp.innerHTML.replace(/\s*<A [^>]+>(?:†|Edit|編集)<\/A>\s*/ig,'').replace(/<[^>]+>/g,'').replace(/^\s+|\s+$/g,'')+']</a>';
				var break_flg = false;
				obj = _d.getElementById('content_'+ii+'_0');
				if (!obj) continue;
			} else {
				if (!break_flg) {
					// PukiWiki1.4.7UTF-8版のバグ？ 数を飛ばしてしまう事がある
					break_flg = true;
					continue;
				}
				break;
			}
		}
		name = obj.nodeName;
		if (name === 'H2' || name === 'H3' || name === 'H4' || name === 'H1') {
			// pukiwiki の #contents と同じようにインデントさせる
			name = name.substr(1,1)-2;
			tmp = '';
			while (name > 0) {
				tmp += '&nbsp; &nbsp;&nbsp;';
				--name;
			}
			
			// #content_1_2 などだと、ページを編集すると使えなくなってしまうので、.anchor_super が無い場合のみ使用するようにする
			var tags = obj.getElementsByTagName('A');
			var tags_len = tags.length;
			var i_tags = 0;
			while (tags_len > i_tags) {
				if (tags[i_tags].className === 'anchor_super')
					break;
				++i_tags;
			}
			
			++cnt;
			str += '<option value="'+(tags[i_tags] ? tags[i_tags].id : ii+'_'+n)+'" title="#'+(tags[i_tags] ? tags[i_tags].id : ii+'_'+n)+'">'+tmp+' '+obj.innerHTML.replace(/\s*<A [^>]+>(?:†|Edit|編集)<\/A>\s*/ig,'').replace(/<[^>]+>/g,'')+'</option>';
			str_popup += '<a href="#'+(tags[i_tags] ? tags[i_tags].id : ii+'_'+n)+'" title="#'+(tags[i_tags] ? tags[i_tags].id : ii+'_'+n)+'" id="popup_contents_'+(tags[i_tags] ? tags[i_tags].id : ii+'_'+n)+'"'+(cnt % 2 ? '' : ' class="popup_contents_light"')+'>'+tmp+' '+obj.innerHTML.replace(/\s*<A [^>]+>(?:†|Edit|編集)<\/A>\s*/ig,'').replace(/<[^>]+>/g,'')+'</a>';
			// ↑<li>でインデントしてもいいかも
			++n;
		}
		++i;
	}
	if (str) {
		str = '<select id="content_select" style="visibility:hidden; filter:Alpha(Opacity=92); -moz-opacity:0.92; opacity:0.92;" onchange="'
			+ "if (this.value) {"
				+ "if (/^[0-9]+_[0-9]+$/.test(''+this.value))"
					+ "location.href = '#content_' + this.value;"
				+ "else "
					+ "location.href = '#' + this.value;"
			+ "}"
		+ '"><option>目次</option><option value="header" title="#header" style="background-color:#dfd">[header]</option>' +str+ '</select>'
		+ '<input type="checkbox" onclick="'
			+ "if (this.a) {"
				+ "_d.getElementById('content_select').style.visibility = 'hidden';"
				+ "this.a = 0;"
			+ "} else {"
				+ "_d.getElementById('content_select').style.visibility = 'visible';"
				+ "this.a = 1;"
			+ "}"
		+ '" title="目次表示／非表示" />';
		var content_select_div = _d.createElement('DIV');
		content_select_div.id = 'content_select_div';  // CSS用
		content_select_div.style.cssText = 'position:fixed; top:0px; right:0px; text-align:right';
		content_select_div.innerHTML = str;
		_d.body.appendChild(content_select_div);
		
		// メモリキャッシュのせいでチェックが入ったままになる事があるのを修正
		setTimeout(function(){
			_d.getElementById('content_select').nextSibling.checked = false;
		}, 0);
		
		// position:fixed 未対応ブラウザ用 (IE6)
		if (isMSIE && typeof _d.documentElement.style.msInterpolationMode === 'undefined') {
			// 右上のListBoxをスクロールに合わせてスライドさせる
			content_select_div.style.position = 'absolute';
			window.onscroll = function(){
				content_select_div.style.top = (_d.body.scrollTop || _d.documentElement.scrollTop) + 'px';
			};
			//if (navigator.appName.charAt(0) === 'N')
			//	window.onmousemove = window.onkeyup = window.onscroll;
		}
		
		// Headlineタグをクリックすると、ポップアップを表示
		var str_popup_css = ''
			+ '#popup_contents a { color:#215dc6; display:block; width:100%; background-color:#eef; text-decoration:none }'
			+ '#popup_contents a.popup_contents_light { background-color:#ddf }'
			+ '#popup_contents a:visited { color:#a63d21 }'
			+ '#popup_contents a:hover { color:#215dc6; background-color:#ccf }'
		;
		var obj = _d.createElement('DIV');
		obj.id = 'popup_contents';
		obj.style.cssText = 'position:absolute; top:0px; left:0px; border:1px solid gray; background-color:#eef; padding:1px; width:35%; font-size:small; z-index:500; visibility:hidden;'
			+ 'filter:Alpha(Opacity=95); -moz-opacity:0.95; opacity:0.95;'
		;
		obj.innerHTML = 
		'<a href="javascript:void(0)" onclick="_d.getElementById(\'popup_contents\').style.visibility=\'hidden\'" style="font-weight:bold; color:navy; text-align:center">目次　（クリックで隠す）</a>'
		+ '<a href="#header" title="#header" class="popup_contents_light" style="font-weight:bold">[header]</a>'
		+ str_popup
		+ (isMSIE ? '<style type="text/css">' +str_popup_css+ '</style>' : '')  // ここで追加してもWebKitの場合適用されないので、後で追加する（MSIEの場合逆にここで追加しないとエラーが出る）
		;
		_d.body.appendChild(obj);
		if (!isMSIE) {
			var obj = document.createElement('style');
			obj.type = 'text/css';
			obj.appendChild(_d.createTextNode(str_popup_css));
			_d.getElementsByTagName('head').item(0).appendChild(obj);
		}
		
		_d.body.onclick = function(arg){
			var e = window.event ? event : arg;
			var style = _d.getElementById('popup_contents').style;
			var obj = e.srcElement || e.target;
			var name = obj.tagName;
			if (window._popup_contents_a)
				_popup_contents_a.style.cssText = '';
			if (name === 'H1' || name === 'H2' || name === 'H3' || name === 'H4') {
				/*
				var sl = (_d.body.scrollLeft || _d.documentElement.scrollLeft);
				var st = (_d.body.scrollTop || _d.documentElement.scrollTop);
				var xy = Position.cumulativeOffset(arg_obj);
				var x = xy[0] > 100 ? xy[0] - 100 : 0;
				var y = xy[1] - 178;
				var obj_style = obj.style;
				obj_style.left = x > sl
					? x + 314 > _d.documentElement.clientWidth + sl
						? _d.documentElement.clientWidth + sl - 314
						: x
					: sl;
				obj_style.top = y > st ? y : xy[1] + 30;
				*/
				style.top = (e.pageY || (e.clientY + (_d.body.scrollTop || _d.documentElement.scrollTop))) + 'px';
				var sl = (e.pageX || (e.clientX + (_d.body.scrollLeft || _d.documentElement.scrollLeft)));
				if (sl + _d.getElementById('popup_contents').offsetWidth  >  _d.documentElement.clientWidth)
					sl = Math.floor(_d.documentElement.clientWidth - _d.getElementById('popup_contents').offsetWidth);
				style.left = sl + 'px';
				style.visibility = 'visible';
				
				var tmp = obj.innerHTML.match(/<a [^>]*?id=["']?([\w-]+)['"]?/i);
				if (tmp) {
					tmp = 'popup_contents_' + tmp[1].replace(/^["']/, '').replace(/['"]$/, '');
					_popup_contents_a = _d.getElementById(tmp);
					_popup_contents_a.style.cssText = 'color:navy; background-color:#93bcff;';
					
				}
			} else
				style.visibility = 'hidden';
		};
	} else if (/(?:^\?|&)cmd=(?:diff|backup)(?:&|$)/i.test(location.search) && _d.getElementsByTagName('PRE').length) {
		/* 差分を見やすくするListBox表示 */
		var obj = _d.getElementsByTagName('PRE')[0].getElementsByTagName('SPAN');
		var len = obj.length;
		var str = '<select id="select_diff" style="position:fixed; top:0px; right:0px" onchange="'
				+ "if (this.selectedIndex)"
					+ "scrollTo(0, _d.getElementsByTagName('PRE')[0].getElementsByTagName('SPAN')[this.selectedIndex-1].offsetTop);"
			+ '">'
			+ '<option>追加削除合わせて'+len+'行</option>';
		var n = 0;
		for (var i=0; i<len; ++i) {
			if (obj[i].className === 'diff_removed')
				str += '<option style="color:red; background-color:#fdd">' +(++n)+ '/' +len+ ': 削除'+(obj[i].innerHTML.length ? '' : '（空行）')+'</option>';
			else if (obj[i].className === 'diff_added')
				str += '<option style="color:blue; background-color:#ddf">' +(++n)+ '/' +len+ ': 追加'+(obj[i].innerHTML.length ? '' : '（空行）')+'</option>';
			else
				str += '<option>ERROR</option>';
		}
		
		var obj = _d.createElement('SPAN');
		obj.innerHTML = str + '</select>';
		_d.body.appendChild(obj);
		
		// position:fixed 未対応ブラウザ用 (IE6)
		if (isMSIE && typeof _d.documentElement.style.msInterpolationMode === 'undefined') {
			// 右上のListBoxをスクロールに合わせてスライドさせる
			_d.getElementById('select_diff').style.position = 'absolute';
			window.onscroll = function(){
				_d.getElementById('select_diff').style.top = (_d.body.scrollTop || _d.documentElement.scrollTop) + 'px';
			};
			//if (navigator.appName.charAt(0) === 'N')
			//	window.onmousemove = window.onkeyup = window.onscroll;
		}
	}
}
if (window.addEventListener)
	addEventListener('load', create_contents_select, false);
else if (window.attachEvent)
	attachEvent('onload', create_contents_select);
else
	setTimeout(create_contents_select, 1000);

// }}}
