ウゴレターポップアップ(2)

はい、第2回です。前回から進化し、ウゴレターのリスト表示が整形してできます。さらに、既読のレターにはチェックが、未読のメールにはnewのアイコンがつきます。
ちなみに、アイコンはfamfamfamさんからお借りしました。base64なので、ほかの画像に置き換えることも可能です。
そして、クリックするとさらにAjaxでレターを読み込んで下に表示します。Ajax読み込みでも既読になるようなので、一安心。

もうかなり完成に近いですが、
・閉じるボタンをつける
・マウスを乗せた瞬間ではなく、数秒後にポップアップ
・デザインの見直し(影や、丸角)
というところでしょうか。
というか、最近のfirefoxgooglechromeは-moz-とかをつけなくても影が使えるようになったんでしょうか。

とにかく、現状コード。ぐちょぐちょです。あと、テスト用データや、コメントアウトが残ってます。後で整理します。

var isLetterLoading = false;
function PopupLetter()
{
	if($e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotLength == 0){ if(console)console.log("PopupLetter : オブジェクトが存在しません。5秒後再実行します。"); setTimeout(PopupLetter,5000);return; }
	var letterPopup = document.createElement("div")
	letterPopup.style.cssText = "visibility:hidden;position:absolute;top:0px;left:0px;width:300px;height:300px;background-color:white;border:black 3px double" ;
	document.body.appendChild(letterPopup);
	$e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotItem(0).addEventListener("mouseover",
	function(e){
	 letterPopup.style.top = e.pageY + "px";
	 letterPopup.style.left = e.pageX + "px";
	 letterPopup.style.visibility = "visible";
	 if(isLetterLoading == false)
	 {
		 letterPopup.textContent = "Now Loading...";
		 var timeOutTimer = setTimeout(function(){ letterPopup.textContent = "タイムアウトしました。" ; isLetterLoading = false; }, 10000);
		 var xhr = new (Ten.XHR)("http://ugomemo.hatena.ne.jp/letters", null, function (xhr) {
		 clearTimeout(timeOutTimer);
		 var range = document.createRange();
		 var ele = document.evaluate("id('main')/ul/li/div",range.createContextualFragment(xhr.responseText),null,7,null);
		 letterPopup.innerHTML = "";
		 var div = document.createElement("div");
		 div.style.height = "100px";
		 div.style.overflow = "auto";
		 var ul = document.createElement("ul");
		 ul.style.textAlign = "left";
		 div.appendChild(ul);
		 for(i = 0 ; i < ele.snapshotLength ; i++)
		 {
			var link = document.evaluate("a",ele.snapshotItem(i),null,7,null).snapshotItem(0);

			var title = document.evaluate("div[@class='info']/div[@class='username']",ele.snapshotItem(i),null,7,null).snapshotItem(0).textContent;
			var a = document.createElement("a");
			a.textContent = title;
			a.href="javascript:;";
			linktest = link.href +";"+ i;
			(function()
			{
			var linkValue = link.href;
			a.addEventListener("click",function()
			{
				$id("letterPrev").textContent = "Now Loading..."
				var timeOutTimer = setTimeout(function(){ $id("letterPrev").textContent = "タイムアウトしました。" }, 10000);
				var xhr2 = new (Ten.XHR)(linkValue, null, function (xhr2) {
				 clearTimeout(timeOutTimer);
				 var range = document.createRange();
				 var ele = range.createContextualFragment(xhr2.responseText);
				 //var data = document.evaluate("id('main')",ele,null,7,null).snapshotItem(0);
				Hatena.Test = ele;
		//		$e("id('main')/div/div/span/div[@class='container']/div[@class='news-body']",ele,null,7,null).snapshotItem(0).style.cssText = "padding:0px";
				$id("letterPrev").innerHTML = document.evaluate("id('main')/div/div/span/div[@class='container']",ele,null,7,null).snapshotItem(0).innerHTML;
				}); 
			},false);

			})();
			 
			 
			//a.target = "letterPrev";
			var li = document.createElement("li");
			var img = document.createElement("img");
			img.src = (link.firstChild.src.indexOf("unread") == -1) ? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABlklEQVR42tXP2y+CcRzH8e7QtRubi/4BNheS07I5Xlh7lEMO1SMhaTMjSqenPAwpezY3WUTK5rzUpplxqZBx7ZL5Jxw+1FaWwx7ceV9/X9/f98fh/LtavFUM4Wmwss19WbOXZLQHSqj35Kh3kQa2+YzEyxZmMNgN17UN9JkBikArKu1BI5tLlsAD+wrMX1GYu7KA3GiDkBZAMLyVnR7qjXCqVeGT3o+Y8CwziZNn4xbMxM3Jl8sp0VP+8N07VkfIClWYedCfaiHbLBhK4yUP078rw8ylCdOXRsj9LSiz1mRi1eFsnSp0ez8V1WM+boXUr35qXl0cErmLHH07nZi6MII+16NrXYJSS1kmTtTozstR7kuhO9Zg4WYSdNSAgaAC2pAS9ug4bOfj6PSJITDnPn/CqWp9R9z2AAFtWJn85/TFBKiYDlRUh/a1JghMmpdvcXqJ44hLuBvQs90BW2wM5rMRSL0ESoxqdpyq1uHj1jmFbydL0LoiAn+i7+c4VeHoDbfCzkexwfnII3lZbPNflljyZ/zbXgEHDcz+YDjlCgAAAABJRU5ErkJggg==" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVR42u2RP0uCURSHLw0tjRJ9g4amPkA01NLg4tBHqNGt2ooIe09FtPTHCKI2q6WpUgqaEip4ISGxKCErG1QoU9TMJ8/7opRzowcOv8u95/ndc+41ph2m24oFMjKQU62JmXmRubc+a3cpL57PmEzcncn01ax0HlQDiaFviYy7uea3xRtXNQpTzEJoGIXJp5015TxkE/B6CfF9WOmCkzEnFSZzC6s9mIKEi1QKqIne6oDnk6iRY6hgMVPfm4JkxM3DUXh/IikjKdOE7KALNgy+Sm4Hzxdwsw0fKcjdOyDpa3gMsyN2pGngqI7S0sGxDEZZ7HANH47q4+xBtQJbvVTno76/BgpqtHTQHNPegFO/W7NgcH6h8eKqXmtzXQ9US1Ir6y9oB/2WZ1lNfFYo+LvGtON/4gedlVB9mLzL5AAAAABJRU5ErkJggg==";
			li.appendChild(img);
			li.appendChild(a);
			ul.appendChild(li);
		 }
		 letterPopup.appendChild(div);
		 
		 
		 iframe = document.createElement("div");
		 iframe.src = "about:blank";
		 iframe.name = "letterPrev";
		 iframe.style.cssText = "width:300px;height:200px;text-align:left;";
		 iframe.id = "letterPrev";
		 letterPopup.appendChild(iframe);
		 //letterPopup.addEventListener("load",function(e){ e.  },false);
		 
		 
		 isLetterLoading = false;
		});
		isLetterLoading = true;
	}
	
	},false);