window.onload = function() {
	// 共通。
	ore_AddDiv_CiteToBlockquote();
	ore_AddHashToTitle();
	ore_AddBlockclassToInsAndDel();
	ore_AddExternalclassToA();
	// IE のみ。
	if(navigator.userAgent.match("MSIE")) {
		ore_AddQuoteToQ();
		ore_AddHighresoviewToImg();
		}
	// IE 以外。
	else {
		ore_AddHighresoviewToObject();
		}
	}

////////////////////////////////////////////////////////////////////////////////////////////
// blockquote に cite/title 属性から生成した div.cite を追加。
// なんで cite 要素じゃなくて div.cite なのかって？
// それは色々と理由があるのだけど説明が面倒なのさ！
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddDiv_CiteToBlockquote() {
	// blockquote のノードリストを取得。
	var aryBlockquote = document.getElementsByTagName("blockquote");
	// ループでＧｏ
	for(i = 0; i < aryBlockquote.length; i++) {
		// とりあえず title か cite のどちらかが無いと話にならない。
		if(aryBlockquote[i].getAttribute("title") || aryBlockquote[i].getAttribute("cite")) {
			// div 要素を生成。
			var tagDiv_Cite = document.createElement("div");
			// class を設定。
			tagDiv_Cite.className = "cite";
			// 内容にテキスト「cite: 」を設定。
			tagDiv_Cite.appendChild(document.createTextNode("cite: "));
			// cite 属性がある場合。
			if(aryBlockquote[i].getAttribute("cite")) {
				// a 要素を生成。
				tagA = document.createElement("a");
				// blockquote の cite 属性値を href 属性値として設定。
				tagA.setAttribute("href", aryBlockquote[i].getAttribute("cite"));
				// さらに title 属性値がある場合。
				if(aryBlockquote[i].getAttribute("title")) {
					// title 属性値をテキストノードとして a 要素の子要素として設定。
					tagA.appendChild(document.createTextNode(aryBlockquote[i].getAttribute("title")));
					}
				//  title 属性が無い場合。
				else {
					// cite 属性値を a 要素の子要素にも設定。
					tagA.appendChild(document.createTextNode(aryBlockquote[i].getAttribute("cite")));
					}
				// a 要素を div.cite の子要素として追加。
				tagDiv_Cite.appendChild(tagA);
				}
			// cite 属性が無い(title 属性のみの)場合。
			else {
				// title 属性値をテキストノードとして div.cite の子要素として追加。
				tagDiv_Cite.appendChild(document.createTextNode(aryBlockquote[i].getAttribute("title")));
				}
			// div.cite を blockquote の子要素として追加。
			aryBlockquote[i].appendChild(tagDiv_Cite);
			}
		}
	return;
	}

////////////////////////////////////////////////////////////////////////////////////////////
// フラグメント識別子付きの URI でのアクセス時に
// ブラウザのタイトルに追記する。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddHashToTitle() {
	// フラグメント識別子がある場合
	if(location.hash) {
		var strHash = location.hash;
		
		// 日モードでなければ終了。
		if(!location.search.match(/date=[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]/)) {
			return;
			}
		// コメントかトラックバックへのリンクだったら終了。
		if(strHash.match(/^#comment/) || strHash.match(/^#trackback/)) {
			return;
			}
		
		// 先頭の「#」を除去。
		strHash = strHash.slice(1, strHash.length);
		// id が strHash と等しい h3 要素。
		var tagH3 = document.getElementById(strHash);
		// h3 内の a 要素。
		var tagA = tagH3.getElementsByTagName("a")[0];
		// a 要素の内容。
		var strTitle = tagA.innerText || tagA.textContent;
		// ブラウザタイトルに追記。
		if(strTitle) {
			document.title += " : " + strTitle;
			}
		}
	return;
	}
////////////////////////////////////////////////////////////////////////////////////////////
// div.section 直下の ins や del にクラス名「block」を追加。
// IE が子要素セレクタに対応してないのがいけないんだ…。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddBlockclassToInsAndDel() {
	var nodes = document.getElementsByTagName("ins");
	for(i = 0; i < nodes.length; i++) {
		if(nodes[i].parentNode.className == "section") {
			nodes[i].className = "block";
			// ついでに datetime があれば div.datetime として表示。
			if(nodes[i].getAttribute("datetime")) {
				var datetime = document.createElement("div");
				datetime.className = "datetime";
				datetime.appendChild(document.createTextNode(nodes[i].getAttribute("datetime")));
				nodes[i].appendChild(datetime);
				}
			}
		}
	var nodes = document.getElementsByTagName("del");
	for(i = 0; i < nodes.length; i++) {
		if(nodes[i].parentNode.className == "section") {
			nodes[i].className = "block";
			}
		}
	}

////////////////////////////////////////////////////////////////////////////////////////////
// 外部リンクのアンカーテキストに「external」クラスを追加。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddExternalclassToA() {
	var nodes =  document.getElementsByTagName("a");
	for(i = 0; i < nodes.length; i++) {
		if(nodes[i].getAttribute("href").match(/^http:\/\//) &&
			!nodes[i].getAttribute("href").match(/^http:\/\/winterzeit\.org/) &&
			!nodes[i].getAttribute("href").match(/^http:\/\/b\.hatena\.ne\.jp\/entry\//) &&
			!nodes[i].getAttribute("href").match(/^http:\/\/blogram\.jp\/users\/agent\/vote\/\?uid=32321#ref=vote$/)) {
			nodes[i].className = "external";
			}
		}
	}
////////////////////////////////////////////////////////////////////////////////////////////
// 拡大画像がありそうな object 要素。
// ファイル名が「_400x300」で終わる画像ファイルであったらば hiresoimg.php に投げる。
// hiresoimg.php は「_800x600」とか「_1024x768」とかで終わる名前の画像ファイルを
// 探して返す。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddHighresoviewToObject() {
	// object 要素のノードリストを取得。
	var aryObjects = document.getElementsByTagName("object");
	// ループでございまーす。
	for(i = 0; i < aryObjects.length; i++) {
		// data が「_400x300」で終わる画像ファイル。
		if(aryObjects[i].getAttribute("data").match(/_400x300\.(jpg|png|gif)$/)) {
			// スタイル。
			aryObjects[i].style.cursor = "pointer";
			// マウスオーバー時のイベント。
			aryObjects[i].addEventListener("mouseover", function(event) {
				// div 要素を生成。
				var tagDiv = document.createElement("div");
				tagDiv.appendChild(document.createTextNode("クリックすると高解像度画像が出るかもよ！"));
				// スタイル。
				with(tagDiv.style) {
					position = "absolute";
					background = "#FFF";
					color = "#333";
					padding = "5px";
					margin = "5px";
					}
				// event.target の前に tagDiv を追加。
				event.target.parentNode.insertBefore(tagDiv, event.target);
				}, false);
			// マウスアウト時のイベント。
			aryObjects[i].addEventListener("mouseout", function(event) {
				// tagDiv を削除。
				event.target.parentNode.removeChild(event.target.previousSibling);
				}, false);
			// クリック時のイベント。
			aryObjects[i].addEventListener("click", function(event) {
				// 既に他の高解像度画像が表示されていたら削除。
				if(document.getElementById("detail_image")) {
					document.body.removeChild(document.getElementById("detail_image"));
					}
				// div 要素を生成。
				var tagDiv = document.createElement("div");
				// ID を設定。
				tagDiv.setAttribute("id", "detail_image");
				// 縦スクロール位置。
				intTop = document.documentElement.scrollTop || document.body.scrollTop;
				// 横スクロール位置。
				intLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
				// スタイル。
				with(tagDiv.style) {
					position = "absolute";
					top =  intTop + 10 + "px";
					left = intLeft + 10 + "px";
					zIndex = "10";
					backgroundColor = "#FFF";
					padding = "3px";
					borderStyle = "outset";
					borderWidth = "1px";
					}
				// img 要素を生成。
				var tagImg = document.createElement("img");
				// src 属性を設定。
				tagImg.setAttribute("src", "/script/highresoimg?img=" + event.target.getAttribute("data"));
				// alt 属性を設定。
				tagImg.setAttribute("alt", "");
				// オンクリック。
				tagImg.addEventListener("click", function(event) {
					// ノードを削除。
					document.body.removeChild(document.getElementById("detail_image"));
					}, false);
				// img 要素を div 要素の子要素に追加。
				tagDiv.appendChild(tagImg);
				// div を document の子要素に設定。
				document.body.appendChild(tagDiv);
				}, false);
			}
		}
	}

////////////////////////////////////////////////////////////////////////////////////////////
// q 要素の前後に引用符追加(IE 用)。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddQuoteToQ() {
	// q 要素のノードリストを取得。
	var aryQ = document.getElementsByTagName("q");
	// ループ入りまーす。
	for(i = 0; i < aryQ.length; i++) {
		// q 要素の最初の子要素の前に「"」を追加。
		aryQ[i].insertBefore(document.createTextNode("\""), aryQ[i].firstChild);
		// q 要素の最後に「"」を追加。
		aryQ[i].appendChild(document.createTextNode("\""));
		}
	return;
	}

////////////////////////////////////////////////////////////////////////////////////////////
// 高解像度画像がありあそうな img 要素。IE 専用。
// IE では data が画像名 object 要素をサーバーサイドで img に書き換えて出力しているので
// やってることの概要は ore_AddHighresoviewToObject と概ね同じ。
// 要所々々を IE 用とそれ以外用に書き換えるのもコードが美しくないので
// 関数まるごと専用に用意してやる。
////////////////////////////////////////////////////////////////////////////////////////////
function ore_AddHighresoviewToImg() {
	// img 要素のノードリストを取得。
	var aryImgs = document.getElementsByTagName("img");
	// ループる。
	for(i = 0; i < aryImgs.length; i++) {
		// src が「_400x300」で終わる画像ファイル。
		if(aryImgs[i].getAttribute("src").match(/_400x300\.(jpg|png|gif)$/)) {
			// スタイル。
			aryImgs[i].style.cursor = "pointer";
			// マウスオーバー時のイベント。
			aryImgs[i].onmouseover = function() {
				// div を生成。
				tagDiv = document.createElement("div");
				tagDiv.appendChild(document.createTextNode("クリックすると高解像度画像が出るかもよ！"));
				// スタイル。
				with(tagDiv.style) {
					position = "absolute";
					background = "#FFF";
					color = "#333";
					padding = "5px";
					margin = "5px";
					}
				// img の前に追加。
				window.event.srcElement.parentNode.insertBefore(tagDiv, window.event.srcElement);
				}
			// マウスアウト時のイベント。
			aryImgs[i].onmouseout = function() {
				// div を削除。
				window.event.srcElement.parentNode.removeChild(window.event.srcElement.previousSibling)
				}
			// クリック時のイベント。
			aryImgs[i].onclick = function() {
				// 既に他の高解像度画像が表示されていたら削除。
				if(document.getElementById("detail_image")) {
					document.body.removeChild(document.getElementById("detail_image"));
					}
				// div 要素を生成。
				var tagDiv = document.createElement("div");
				// ID を設定。
				tagDiv.setAttribute("id", "detail_image");
				// 縦スクロール位置。
				intTop = document.documentElement.scrollTop || document.body.scrollTop;
				// 横スクロール位置。
				intLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
				// スタイル。
				with(tagDiv.style) {
					position = "absolute";
					top =  intTop + 10 + "px";
					left = intLeft + 10 + "px";
					zIndex = "10";
					backgroundColor = "#FFF";
					padding = "3px";
					borderStyle = "outset";
					borderWidth = "1px";
					}
				// img 要素を生成。
				var tagImg = document.createElement("img");
				// src 属性を設定。
				tagImg.setAttribute("src", "/script/highresoimg?img=" + window.event.srcElement.getAttribute("src"));
				// alt 属性を設定。
				tagImg.setAttribute("alt", "");
				// オンクリック。
				tagImg.onclick =  function() {
					// ノードを削除。
					document.body.removeChild(document.getElementById("detail_image"));
					}
				// 何故か width と height が 400 と 300 で設定されてるので除去。良く判らん。
				tagImg.removeAttribute("width");
				tagImg.removeAttribute("height");
				// img 要素を div 要素の子要素に追加。
				tagDiv.appendChild(tagImg);
				// div を document の子要素に設定。
				document.body.appendChild(tagDiv);
				}
			}
		}
	}
