/*
	駄日記ページと購入記録ページで、ISBNコードがついてる購入書籍について Amazon と bk1 の該当ページへのリンクを自動付加する
	(jbook も検索できるかと思ったんだがさっき試したらダメだった…詳細不明)
	(該当ページとは言っても「検索結果のページ」だが)
	AmazonはASINでisbn10を使っているので検索結果ではなく商品ページをダイレクトに表示できた

	Win版 IE 5.0 と 5.5 (たぶん) では何も表示されなかった。まァそういうもんか。
	表示されないと致命的、というものでもないしな…。
	(ひょっとして調整は可能かもしれないけどメンドくさいからやらない。Google MapなんかだってIE6以上対象だし)
*/

// from http://blog.goo.ne.jp/fm315/e/5c90a030f5f234fd073b2b15376d07db
function getElementsByClass(searchClass) {
	var classElements = new Array();
	var allElements = document.getElementsByTagName("*");
	for (i = 0, j = 0; i < allElements.length; i++) {
		if (allElements[i].className == searchClass) {
			classElements[j++] = allElements[i];
		}
	}
	return classElements;
}

function addisbnlink () {
	var all_li = get_all_li_of_purc();
	for (var i = 0; i < all_li.length; i++) {
		var isbncode;
		if (isbncode = get_isbn(all_li[i])) {
			insert_node(all_li[i], create_isbnlink('Amazon', 'http://www.amazon.co.jp/exec/obidos/ASIN/', isbn13_to_isbn10(isbncode)));
			insert_node(all_li[i], create_isbnlink('bk1', 'http://www.bk1.jp/webap/user/SchDetailBibList.do?sortType=00&searchFlg=9&hdnPageMax=10&reviewFlg=9&rootType=0&isbn=', isbncode));
//			insert_node(all_li[i], create_isbnlink('jbook', 'http://sch.jbook.jp/s.asp?category_id=11&field=I&key=', isbncode));
		}
	}
}

// 直下の子ノードのみ拾う
// (childNodes だと子孫ノードを全部拾っちゃうみたいなんで…) (←これ違うかも?)
// v0 は検索起点となる親ノード、tag の指定がある時はそれにマッチしたTAGのノードのみ
// 動作はムダ気味 (というかかなりムダ) だがまァとりあえず動けばいいや
function getFirstLevelChildNodes (v0, tag) {
	var nodes = new Array();
	var v = v0.childNodes;
	for (var i = 0; i < v.length; i++) {
		if (v[i].parentNode == v0 && (!tag || tag == v[i].tagName)) {
			nodes.push(v[i]);
		}
	}
	return nodes;
}

// div.purc > ul > li > string =~ isbn\d+
function get_all_li_of_purc () {
	var all_li = new Array();
	var all_purc = getElementsByClass('purc').concat(getElementsByClass('purc-box'));

	for (var i = 0; i < all_purc.length; i++) {
		var all_ul = getFirstLevelChildNodes(all_purc[i], 'UL');
		for (var j = 0; j < all_ul.length; j++) {
			all_li = all_li.concat(getFirstLevelChildNodes(all_ul[j], 'LI'));
		}
	}
	return all_li;
}

function get_isbn (li) {
	// 駄日記と不完全購入記録のISBN部分はurn:isbn: でアンカー打たれてるはずなのでそれから拾う
	var li_child = getFirstLevelChildNodes(li, 'A');
	for (var i = 0; i < li_child.length; i++) {
		var v = li_child[i];
		if (v.tagName == 'A' && v.getAttribute('href').match(/^urn:isbn:([0-9Xx-]+)/)) {
			return RegExp.$1.replace(RegExp('-', 'g'), '');
		}
	}
}

function create_isbnlink (text, url, isbncode) {
	var link = document.createElement('span');
	var classatr = document.createAttribute('class');
	classatr.value = 'isbnlink';
	link.setAttributeNode(classatr);
	var anchor = document.createElement('a');
	anchor.href = url + isbncode;
	anchor.title = text + "へのリンク：アフィリエイトに非ず";
//	anchor.appendChild(document.createTextNode('≫' + text));
	anchor.appendChild(document.createTextNode(text));
	link.appendChild(document.createTextNode(' ['));
	link.appendChild(anchor);
	link.appendChild(document.createTextNode('] '));
	return link;
}

// 直下子ノードに script タグ、または ul class="notep" タグがある場合はその直前に、ない場合は末尾にノード挿入
// 駄日記生成スクリプトが吐き出す HTML の構造に依存
function insert_node (pnode, cnode) {
	var childs = getFirstLevelChildNodes(pnode);
	// 'className' は腐れIE対策
	for (var i = 0; i < childs.length; i++) {
		var obj = childs[i];
		if (obj.tagName == 'SCRIPT' ||
			(obj.tagName == 'UL' &&
			 (obj.getAttribute('class') == 'notep' || obj.getAttribute('className') == 'notep'))) {
			pnode.insertBefore(cnode, obj);
			return;
		}
	}
	pnode.appendChild(cnode);
}


function isbn13_to_isbn10 (isbn) {
	if (isbn.match(/^9784/) && isbn.length == 13) {
		isbn = isbn.substr(3, 9) + checkcode_isbn10_from_isbn13(isbn);
	}
	return isbn;
}

function checkcode_isbn10_from_isbn13 (isbn) {
	var x = 0;
	for (var i = 0; i < 9; i++) {
		x += (i + 1) * parseInt(isbn.substr(i + 3, 1));
	}
	x %= 11;
	if (x == 10) {
		x = 'X';
	}
	return  x;
}
