/* はてふスクリプト by yaneurao */
// http://blog.livedoor.jp/dankogai/archives/50637027.html
// http://blog.livedoor.jp/dankogai/archives/50643245.html
// を参考にさせていただいきました。

// tabは 2 tab推奨

// --- from  yanejslib.js ------------------------------------------------------------------------
function addEvent(eventName , callbackFunction)
{
	window.addEventListener ?
	  window.addEventListener(eventName,callbackFunction, false) :
	  window.attachEvent('on'+eventName,callbackFunction );
}

// css class名から、その一覧を返すhelper
function getElementsByClass(className)
{
    var classElements = new Array();
    var allElements = document.getElementsByTagName('*');
    for (var i = 0 ; i < allElements.length; i++)
		{
			if (allElements[i].className == className)
			    classElements.push( allElements[i] );
    }
    return classElements;
}
// -----------------------------------------------------------------------------------------------

function HateBJSON(callback){
	this.proxy = 'http://b.hatena.ne.jp/entry/json/';
	this.callback    = callback;
	this.parse = function(uri){
	var script = document.createElement('script'); 
	script.id = this.proxy + '?url=' + encodeURIComponent(uri) 
		+ '&callback=' + this.callback;
	script.charset = 'UTF-8';
	script.src = script.id; 

	document.lastChild.appendChild(script);
//	document.removeChild(script);
  };
  return this;
}

var Hatefu = function(url)
{
	var hatebjson = new HateBJSON('onLoadedHatebjson');
	hatebjson.parse(url /*,tagname */);
	// tagnameを動的に切り替えられるようにしようかと思ったが、
	// JSONのcallbackが静的なので複数呼び出した場合、
	// 逐次的に処理しないと、どのcallbackなのかわからなくなるんだな…。
}

function onLoadedHatebjson(json)
{
//	$('result').innerHTML = (new JKL.Dumper()).dump(json);
  if (! json) return ;

  var bm = json.bookmarks;
  if (! bm) return;

  function useruri(user){ return 'http://b.hatena.ne.jp/' + bm[i].user + '/' }
  function usericon(user){
    var src = 'http://www.hatena.ne.jp/users/' 
      + user.substr(0,2) + '/' + user + '/profile_s.gif';
    return "<img src='" + src + "' alt='" + user+ "' style='border:none'>";
  }

  function comment2str(str){
    var regex = /(http:\/\/[\x21-\x7e]+|[<>&\"])/g;
    str = str.replace(regex, function(m0,m1){
      return m1.substr(0,5) == 'http:' 
        ? '<a target="_blank" href="' + m1 + '">' + m1 + '</a>' 
        : {'<':'&lt;', '>':'&gt;','&':'&amp;', '"':'&quot;'}[m1];
    });
    return str;
  }

  // はてな付箋コメント可能領域
  var hatefu = getElementsByClass('hatefu');

  for (var i = 0; i < bm.length; i++){
//  for (var i = bm.length-1; i >=0 ; i--){
// debug用逆ループ。

     // bm[i]がuser名 , bm[i].commentがユーザーコメント。このコメントが
     // コメントに適格する場所を探して、そこに貼り付ける。

	for(var j = 0;j<hatefu.length ; j++)
	{

		var target = hatefu[j].innerHTML;
		// このなかに文字が含まれているか？

		var comment = bm[i].comment;
		if (comment=='')
			continue;

		// [hatefu]コメントをつけたい文字列:コメント
		// の書式になっているはず。

		var c = comment.split(':');
		if (c.length <= 1) continue;

		var index = target.indexOf(comment2str(c[0]));
		// c[0],c[1]から特殊文字は除外する。
		// ここではescapeするのにcomment2strを使い回す。もっとましな方法で実装すべき。

		if (index!=-1)
		{ // 見つかったのでコメントを挿入する。

			var headerStr = target.substring(0,index);

			// タグのなかにコメントを埋め込まれる可能性がある。
			// しかしcomment2strでescapeされているので、c[0],c[1]には、特殊記号は含まないので
			// タグをまたぐことはない。また、タグの内側に対するコメントは無効にする。

			// タグの内側ならばスキップ
			if (headerStr.lastIndexOf('>') < headerStr.lastIndexOf('<'))
				continue;

			// 本当は、この後続文字列に引用部があるかを判定する必要があるが、
			// こんなタグの内側にあるような紛らわしい文字列を使う奴が悪いんじゃないかと言うことで
			// それは考えないことにする。

			// 埋め込んだ「はてふ」に対してコメントされると嫌なので、user commnetの内側かどうかを
			// 判定するために、usercomment_begin～usercomment_endというidを持つダミーのdivを挿入して
			// それで判定する。

			if (headerStr.lastIndexOf('usercomment_end') < headerStr.lastIndexOf('usercomment_begin'))
				continue;

			target = headerStr
			// 引用部まで

			+"<div name='usercomment_begin' style='display:inline'></div>"

			 + "<div class='hatefu_head' style='display:inline'>" + target.substring(index,index + c[0].length) + "</div>"
			// 引用箇所の強調表示

			+ "<a href='http://labs.yaneu.com/20090309/'>"
			+ "<img src='hatefu.gif' alt='hatefu' style='width:16px;height:12px;border:none;display:inline'>"
			+ "</a>"
			// はてな付箋のマークを入れる。はてな付箋は、"http://labs.yaneu.com/20090309/"へリンクしておく。

			// ユーザーコメント部 色などはここで調整してください。
			+"<div style='max-width:200px;display:inline' class='hatefu_body'>"

				+ usericon(bm[i].user)
				// ユーザーアイコン

				+ "<a href=" + useruri(bm[i].user)+ ">"+ bm[i].user + "</a>"
				// ユーザー名

				+ comment2str(c[1])
				// ユーザーコメント

			 + "</div>"
			// ここはJavaScriptで書かれたpopupを埋め込んでもいいと思う。

			+"<div name='usercomment_end' style='display:inline'></div>"

			+ target.substring(index+c[0].length);

			hatefu[j].innerHTML = target;
		}
	}

  }
}

