// ==UserScript==
// @name		RubyistMagazineReadSupporter
// @namespace	http://www.kanasansoft.com/
// @description This memorizes where reading Rubyist Magazine.
// @include		http://jp.rubyist.net/magazine/*
// ==/UserScript==

(function(){

//	var REGEXP_FEATURE=/^http:\/\/jp.rubyist.net\/magazine\/(\?[0-9a-zA-Z-]*)?$/;
	var REGEXP_FEATURE=/^\.\/(\?[0-9a-zA-Z-]*)?$/;

	var IMAGE_URI_DO_NOT_READ=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA"+
		"AHJQTFRFAAAAAwICDggIDwkJEQoKEgsLFg0NHhISHxMTMx8fNB8fPCQkQigo%2Fw"+
		"AAhE9PjFRUmFtbpmRkr2lpsGpqtGxst25uvXFxw3V1xXZ2yHh4y3p6039%2F1H9%"+
		"2F14GB2IKC3oWF5YmJ6YyM85KS%2FZiY%2FpiY%2F5mZc%2FDQrQAAAGZJREFUGN"+
		"Nj4EUDDLyqKAAmoMSAV0CcmZmZAYiZFYjVogjSwcDABKTgKoS5GXn4kLTIcsgyyr"+
		"EKwQWk2EVUGVXFWPhVIAICbKKqQAFVGU4uCbCApLwqWEBVWVAabq0qD5o7kD2HBg"+
		"CDCxllTkYJigAAAABJRU5ErkJggg%3D%3D";
	var IMAGE_URI_READING=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAAXNSR0IArs4c6QAA"+
		"ADBQTFRFAAAAAQEBAgMCBwsHKEIoMlQyQGtAAP8Aj%2B%2BPkvOSkvSSlPaUlPeU"+
		"lfmVlvqWmf%2BZpI%2FGOQAAAD5JREFUCNdjKIcChvr%2FYPAdxPh2H8r4cB7GeA"+
		"9mTDA2MDboBzImAaU%2BozDgUhNhIluAjK%2Fr0czBYEAshTkDADkwYcZZZmY7AA"+
		"AAAElFTkSuQmCC";
	var IMAGE_URI_READ=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA"+
		"AMlQTFRFAAAAAgIDAgIEBAQHBQUICQkPDg4XDg4YEBAaAAD%2FEhIeExMfFBQiFR"+
		"UjFxcmGhorIyM7JiZAKChDKipGLi5MMzNVNjZaNzdbNzdcODhdOztiPT1mPj5nQE"+
		"BrSkp7TEx%2FVVWNVlaPWFiSXFyaYGCgY2OlZmaqbW21bW22bm63cHC6c3O%2Fd3"+
		"fGeHjIenrMfHzOfn7Sf3%2FTgYHXgoLZg4PbhYXdjY3rkZHxkpLzkpL0k5P1lJT3"+
		"lZX5lpb6l5f7l5f8mJj9mJj%2BmZn%2Fc0sRowAAAJJJREFUGNNj4EQDDJxOKAAk"+
		"YGgGYtnJwgWUuPSBLGsGuICThowQMwsbGyszG1jARs3RyUmHQ9VOSAWiwkJU1M7J"+
		"yYiPWxqmxVFK01xLhkeCQ94IaoaDnjCLuq2TATO%2FLkRAW8CJkRcIGGC2iCs7Mo"+
		"H0M0IFjNktTZi5gQCqwl5Q0UpEDkmFqZi9gqQNshZ0z6EBAAGTJyZGAIa3AAAAAE"+
		"lFTkSuQmCC";
	var IMAGE_URI_DO_NOT_DECIDE_WHETHER_TO_READ=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA"+
		"AJNQTFRFAAAAAQEBAwMCBAQCBgYEBwcECQkFDg4IDw8JFhYNFxcOHx8TIiIUIyMV"+
		"JCQWKysaMjIeMzMfNTUgOzsjPDwkSUksWFg1b29DdnZHe3tKm5tdnp5foKBgoqJh"+
		"o6NirKxnr69pt7duublvysp5y8t61NR%2F2tqD3NyE8fGR%2F%2F8A9vaU9%2FeU"+
		"%2BPiV%2BfmV%2B%2FuX%2Fv6Y%2F%2F%2BZILaE4gAAAHJJREFUGNNj0EQDDJoG"+
		"KAAqoK%2BkiywgI84jrMLFyM7BoAERYJZWNzDQY9M2YNOHCLBq8KkaKAoa6HBCtO"+
		"izyPGLqnHLqiqLQAQkhCUVxASktIS45KGGMnFwcDAAMRPMFhCDwQBCk6uCF%2Bps"+
		"QYRfUDyHBgAzQSPNc6E2uAAAAABJRU5ErkJggg%3D%3D";
	var IMAGE_URI_WILL_NOT_READ=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA"+
		"AKJQTFRFAAAAAQEBAgICBwcHCQkJCgoKCwsLDg4OEBAQExMTGhoaHBwcHR0dICAg"+
		"ISEhIyMjKioqLy8vMjIyNzc3OTk5Pz8%2FQUFBRERESUlJSkpKTU1NUFBQVVVVWF"+
		"hYX19fY2NjZGRkZWVlcXFxcnJydXV1e3t7fX19f39%2FhYWFhoaGh4eHiIiIiYmJ"+
		"i4uLjo6Oj4%2BPkZGRkpKSk5OTl5eXmJiYmZmZUDU7ygAAAIZJREFUGNNjYMAApi"+
		"gALmAoqA8XYGBmZjCVZpVCCJgq8Ktya3PJwwWMOKX5NE11eUX1oQISHALczECN4k"+
		"JQAS1OOSDLGMkMZQYWFiBi0YAKqOmwawJVKMFVCLHK8KgwqLNJwbWYiAgCVWhwKs"+
		"IE9MT0DRhNTNUkIQJMQJWyrMJofkHyHBoAAAfVHFaq8XR%2FAAAAAElFTkSuQmCC";
	var IMAGE_URI_NOT_ARTICLE=
		"data:image/png;base64,"+
		"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA"+
		"AGxQTFRFAAAAAgICAwMDCQkJCgoKDAwMEBAQExMTHh4eKioqLS0tMDAwNTU1Nzc3"+
		"RkZGV1dXWlpaZWVlZmZmfn5%2BjIyMkZGRlpaWmZmZmpqan5%2BfoKCgp6enu7u7"+
		"vr6%2BwsLCxcXFycnJysrKy8vLzMzMzJIySQAAAGVJREFUGNN9z9cKgEAMRNHE3n"+
		"uv687%2F%2F6PKig30Ph7CQCh7RRke7SBGBMAggUhB4UmG9MsWpABhxTJxBJ3Q9D"+
		"ylHS4gfYtvwPv8Hcjc%2Br%2F42KgfMGuAuGC0rRi54R6wHI8J9dyrFVRpFwE2ml"+
		"1sAAAAAElFTkSuQmCC";

	var ReadStatus={
		"DO_NOT_DECIDE_WHETHER_TO_READ":"do_not_decide_whether_to_read",
		"DO_NOT_READ":"do_not_read",
		"READING":"reading",
		"READ":"read",
		"WILL_NOT_READ":"will_not_read",
		"NOT_ARTICLE":"not_article"
	}

	var ReadStatusInformation={};
	ReadStatusInformation[ReadStatus.DO_NOT_DECIDE_WHETHER_TO_READ]={
		"icon":IMAGE_URI_DO_NOT_DECIDE_WHETHER_TO_READ,
		"caption":"読むかどうか決めてない"
	}
	ReadStatusInformation[ReadStatus.DO_NOT_READ]={
		"icon":IMAGE_URI_DO_NOT_READ,
		"caption":"読んでない"
	}
	ReadStatusInformation[ReadStatus.READING]={
		"icon":IMAGE_URI_READING,
		"caption":"読んでいる途中"
	}
	ReadStatusInformation[ReadStatus.READ]={
		"icon":IMAGE_URI_READ,
		"caption":"読んだ"
	},
	ReadStatusInformation[ReadStatus.WILL_NOT_READ]={
		"icon":IMAGE_URI_WILL_NOT_READ,
		"caption":"読まないつもり"
	}
	ReadStatusInformation[ReadStatus.NOT_ARTICLE]={
		"icon":IMAGE_URI_NOT_ARTICLE,
		"caption":"記事ではない"
	}

	var ReadStatusSort=[
		ReadStatus.DO_NOT_DECIDE_WHETHER_TO_READ,
		ReadStatus.DO_NOT_READ,
		ReadStatus.READING,
		ReadStatus.READ,
		ReadStatus.WILL_NOT_READ,
		ReadStatus.NOT_ARTICLE
	];

	//common
	var StringUtility
		=function(){
		}

	StringUtility.Encode
		=function(){
		}

	StringUtility.Decode
		=function(){
		}

	StringUtility.Convert
		=function(){
		}

	StringUtility.Encode.HTML
		=function(str){
			return str.
			replace(/&/ig,"&amp;").
			replace(/</ig,"&lt;").
			replace(/>/ig,"&gt;").
			replace(/'/ig,"&apos;").
			replace(/"/ig,"&quot;").
			replace(/ /ig,"&nbsp;");
		}

	StringUtility.Decode.HTML
		=function(str){
			return str.
			replace(/&nbsp;/ig," ").
			replace(/&quot;/ig,"\"").
			replace(/&apos;/ig,"'").
			replace(/&gt;/ig,">").
			replace(/&lt;/ig,"<").
			replace(/&amp;/ig,"&");
		}

	StringUtility.Encode.HTMLforBookmarklet
		=function(str){
			return str.
			replace(/&/ig,"&amp;").
			replace(/</ig,"&lt;").
			replace(/>/ig,"&gt;").
			replace(/'/ig,"&apos;").
			replace(/"/ig,"&quot;");
		}

	StringUtility.Encode.JavaScript
		=function(str){
			return str.
			replace(/\\/ig,"\\\\").
/*			replace(/\b/ig,"\\b").*/
			replace(/\f/ig,"\\f").
			replace(/\n/ig,"\\n").
			replace(/\r/ig,"\\r").
			replace(/\t/ig,"\\t").
			replace(/'/ig,"\\'").
			replace(/"/ig,"\\\"");
		}

	StringUtility.Encode.JavaScriptComplete
		=function(str){
			var rtn="";
			for(var i=0;i<str.length;i++){
				rtn+="\\u"+
					(("0000"+(str.charCodeAt(i).toString(16))).slice(-4));
			}
			return rtn;
		}

	StringUtility.Convert.TabToSpace
		=function(str,tabNumber){

			var linesRN=str.split("\r\n");
			for(var lineCntRN=0;lineCntRN<linesRN.length;lineCntRN++){
				var linesN=linesRN[lineCntRN].split("\n");
				for(var lineCntN=0;lineCntN<linesN.length;lineCntN++){
					var linesR=linesN[lineCntN].split("\r");
					for(var lineCntR=0;lineCntR<linesR.length;lineCntR++){
						var wordsT=linesR[lineCntR].split("\t");
						for(var wordsCntT=0;wordsCntT<wordsT.length-1;wordsCntT++){
							wordsT[wordsCntT]+=
							StringUtility.getRepeatString(
								" ",
								tabNumber-
									(StringUtility.getLengthByByte(
										wordsT[wordsCntT])%tabNumber
									)
							)
						}
						linesR[lineCntR]=wordsT.join("");
					}
					linesN[lineCntN]=linesR.join("\r");
				}
				linesRN[lineCntRN]=linesN.join("\n");
			}
			var	rtn=linesRN.join("\r\n");

			return rtn;

		}

	StringUtility.Convert.NewLineCodeToTag
		=function(str){
			return
			str.
			replace(/\r\n/ig,"<br />").
			replace(/\r/ig,"<br />").
			replace(/\n/ig,"<br />");
		}

	StringUtility.getLengthByByte
		=function(str){
			var count=0;
			for(var i=0;i<str.length;i++){
				var code=str.charCodeAt(i);
				while(code!=0){
					count++;
					code>>>=8;
				}
			}
			return count;
		}

	StringUtility.getRepeatString
		=function(str,num){
			var rtn="";
			for(var i=0;i<num;i++){
				rtn+=str;
			}
			return rtn;
		}
/*
	var JSON=
		function(){}

	JSON.encode
		=function(obj){
			var rtn;
			if(obj==null){
				rtn="null";
			}else{
				switch(true){
				case (obj instanceof Boolean):
				case (typeof(obj)=="boolean"):
					rtn=obj?"true":"false";
					break;
				case (obj instanceof Number):
				case (typeof(obj)=="number"):
					rtn=isNaN(obj)||!isFinite(obj)?"null":obj.toString(10);
					break;
				case (obj instanceof String):
				case (typeof(obj)=="string"):
					rtn="\""+StringUtility.Encode.JavaScript(obj)+"\"";
					break;
				case (obj instanceof Array):
//				case (typeof(obj)=="array"):
					var buf=[];
					for(var i=0;i<obj.length;i++){
						buf.push(arguments.callee(obj[i]));
					}
					rtn="["+buf.join(",")+"]";
					break;
				case (obj instanceof Function):
				case (typeof(obj)=="function"):
					rtn="null";
					break;
				case (obj instanceof Object):
//				case (typeof(obj)=="object"):
					var buf=[];
					for(var key in obj){
						if(obj.hasOwnProperty(key)){
							buf[buf.length]=
								arguments.callee(key)+":"+
								arguments.callee(obj[key]);
						}
					}
					rtn="{"+buf.join(",")+"}";
					break;
				default:
					rtn="null";
					break;
				}
			}
			return rtn;
		}

	JSON.encodeComplete
		=function(obj){
			var rtn;
			if(obj==null){
				rtn="null";
			}else{
				switch(true){
				case (obj instanceof Boolean):
				case (typeof(obj)=="boolean"):
					rtn=obj?"true":"false";
					break;
				case (obj instanceof Number):
				case (typeof(obj)=="number"):
					rtn=isNaN(obj)||!isFinite(obj)?"null":obj.toString(10);
					break;
				case (obj instanceof String):
				case (typeof(obj)=="string"):
					rtn="\""+StringUtility.Encode.JavaScriptComplete(obj)+"\"";
					break;
				case (obj instanceof Array):
//				case (typeof(obj)=="array"):
					var buf=[];
					for(var i=0;i<obj.length;i++){
						buf.push(arguments.callee(obj[i]));
					}
					rtn="["+buf.join(",")+"]";
					break;
				case (obj instanceof Function):
				case (typeof(obj)=="function"):
					rtn="null";
					break;
				case (obj instanceof Object):
//				case (typeof(obj)=="object"):
					var buf=[];
					for(var key in obj){
						if(obj.hasOwnProperty(key)){
							buf[buf.length]=
								arguments.callee(key)+":"+
								arguments.callee(obj[key]);
						}
					}
					rtn="{"+buf.join(",")+"}";
					break;
				default:
					rtn="null";
					break;
				}
			}
			return rtn;
		}

	JSON.decode
		=function(str){
			var rtn;
			eval("rtn="+str);
			return rtn;
		}
*/
    var formatDate=
	function(date){
	    var format=
		function(num,digit){
		    var zero="";
		    for(var i=0;i<digit;i++){
			zero+="0";
		    }
		    return (zero+num).slice(-digit);
		}
	    if(!date){return "----/--/-- --:--:--";}
	    return format(date.getFullYear()+0,4)+"/"+
		format(date.getMonth()+1,2)+"/"+
		format(date.getDate()+0,2)+" "+
		format(date.getHours()+0,2)+":"+
		format(date.getMinutes()+0,2)+":"+
		format(date.getSeconds()+0,2);
    }

	var getLinkObjectByXPathAndURLRegExp=
		function(xpath,urlRegExp){
			var links=getLinksByXPathAndURLRegExp(xpath,urlRegExp);
			var rtn={};
			for(var i=0;i<links.length;i++){
				var link=links[i];
				var url=link.getAttribute("href");
				rtn[url]={};
			}
			return rtn;
		}

	var getLinksByXPathAndURLRegExp=
		function(xpath,urlRegExp){
			var links=
				document.evaluate(
					xpath,
					document,
					null,
					XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
					null
				);
			var rtn=[];
			for(var i=0;i<links.snapshotLength;i++){
				var link=links.snapshotItem(i);
				var url=link.getAttribute("href");
				if(urlRegExp.test(url)){
					rtn.push(link);
				}
			}
			return rtn;
		}

	var mergeObject=
		function(left,right,judgment){
			var rtn={};
			for(var key in right){
				rtn[key]=right[key];
			}
			for(var key in left){
				if(!(key in rtn) || judgment(left[key],right[key])){
					rtn[key]=left[key];
				}
			}
			return rtn;
		}

	var displayIcons=
		function(outer,inners,statusNow,open){
			if(open){
				var innerNow=inners[statusNow];
				while(innerNow.previousSibling){
					innerNow.parentNode.appendChild(
						innerNow.parentNode.firstChild
					);
				}
			}
//			outer.style.border=open?"1px solid #000000":"0px none";
			for(var key in inners){
/*				inners[key].style.border=
					(open&&key==statusNow)?"1px solid #ff0000":"0px none";*/
				inners[key].style.display=
					(open||key==statusNow)?"inline":"none";
			}
		}

	var loadDatas=
		function(){
			var storedData=GM_getValue("datas");
			 return storedData?JSON.parse(storedData):{};
		}

	var saveDatas=
		function(datas){
			var storedData=datas?datas:{};
			GM_setValue("datas",JSON.stringify(storedData));
		}

	var displayStatusList=
		function(){

		    var linksLoad=loadDatas();

			var trs=[];

		    for(var key in linksLoad){

				var url=key;

				var time=linksLoad[key].time;
				if(!time){time=undefined;}else{time=new Date(time)};
				var status=linksLoad[key].status;
				if(!status){status=ReadStatus.DO_NOT_DECIDE_WHETHER_TO_READ;};
				var caption=ReadStatusInformation[status].caption;
				var icon=ReadStatusInformation[status].icon;

				var tr=document.createElement("tr");

				var td=document.createElement("td");
				var link=document.createElement("a");
				var text=document.createTextNode(url);

				link.setAttribute("href",url);

				link.appendChild(text);
				td.appendChild(link);
				tr.appendChild(td);

				var td=document.createElement("td");
				var text=document.createTextNode(formatDate(time));
				td.appendChild(text);
				tr.appendChild(td);

				var td=document.createElement("td");
				var image=document.createElement("img");

				image.setAttribute("src",icon);

				td.appendChild(image);
				tr.appendChild(td);

				var td=document.createElement("td");
				var text=document.createTextNode(caption);
				td.appendChild(text);
				tr.appendChild(td);

				trs.push({"toString":(function(url){return function(){return url;}})(url),"data":tr});

		    }

			trs.sort();

		    var table=document.createElement("table");
			for(var i=0;i<trs.length;i++){
				table.appendChild(trs[i].data);
			}

		    var body=document.getElementsByTagName("body")[0];
		    body.appendChild(table);


		    return;
		    var doc=win.document;
		    var body=doc.getElementsByTagName("body")[0];
		    var linksLoad=loadDatas();
		    GM_log("00--");

		    for(var key in linksLoad){
			GM_log("s:"+key);
			var url=doc.createTextNode(key);
			var link=doc.createElement("a");
			link.setAttribute("url",key);
			link.appendChild(url);
			var time=linksLoad[key].time;
			var status=linksLoad[key].status;
			body.appendChild(link);
			body.appendChild(doc.createTextNode("ddd"));
			GM_log("e:"+key);
		    }
		}
/*
	var makeCheckDigit=
		function(text){
			var CHECK_DIGIT_NUMBER=8;
			var len=text.length;
			var digits=[];
			for(var i=0;i<CHECK_DIGIT_NUMBER;i++){
				digits[i]=0;
			}
			for(var i=0;i<len;i++){
				digits[i%CHECK_DIGIT_NUMBER]=
					(digits[i%CHECK_DIGIT_NUMBER])^(text.charCodeAt(i));
			}
			for(var i=0;i<CHECK_DIGIT_NUMBER;i++){
				digits[i]=("00"+digits[i].toString(16)).slice(-2);
			}
			return digits.join("");
		}
*/
	var exportDatas=
		function(){

			var linksLoad=loadDatas();

			var datas=prompt(
				"通読状態のデータを出力\n"+
　					"\n"+
					"移行データを表示しています。\n"+
					"文字列をコピーして下さい。\n"+
					"文字列を書き換えないように注意して下さい。",
				JSON.stringify(linksLoad));

		}

	var importDatas=
		function(){

			var datas=prompt(
				"通読状態のデータを入力\n"+
　					"\n"+
					"移行データを入力して下さい。\n"+
					"既存のデータが全て上書きされます。",
				"");

			if(!datas){alert("処理が中止されました。");return;}

			if(!confirm("よろしいですか?")){alert("処理が中止されました。");return;}

			datas=JSON.parse(datas);

			saveDatas(datas);

			alert("処理が完了しました。");

		}

	var unionDatas=
		function(){

			var datas=prompt(
				"通読状態のデータを結合\n"+
　					"\n"+
					"移行データを入力して下さい。\n"+
					"既存のデータとの結合を行います。\n"+
					"衝突した場合、新しいデータが優先されます。",
				"");

			if(!datas){alert("処理が中止されました。");return;}

			if(!confirm("よろしいですか?")){alert("処理が中止されました。");return;}

			datas=JSON.parse(datas);

			var reflectNewerLink=
				function(r,l){
					var rtime=r.time;
					var ltime=l.time;
					if(!rtime){rtime=0;}
					if(!ltime){ltime=0;}
					return (rtime>=ltime);
			}

			var linksLoad=loadDatas();
			var linksAll=mergeObject(datas,linksLoad,reflectNewerLink);
			saveDatas(linksAll);

			alert("処理が完了しました。");

		}

	var onLoad=
		function(){
/*
			GM_registerMenuCommand(
				"るびま通読サポーター - 通読一覧表示",
				displayStatusList
			);
*/
			GM_registerMenuCommand(
				"るびま通読サポーター - 通読状態のデータを出力",
				exportDatas
			);

			GM_registerMenuCommand(
				"るびま通読サポーター - 通読状態のデータを入力",
				importDatas
			);

			GM_registerMenuCommand(
				"るびま通読サポーター - 通読状態のデータを結合",
				unionDatas
			);

			var linksDisplay=getLinkObjectByXPathAndURLRegExp(
				"//a[@href]",REGEXP_FEATURE);
			var linksLoad=loadDatas();
			var linksAll=mergeObject(
				linksDisplay,linksLoad,function(r,l){return false;});
			saveDatas(linksAll);

			var linkObjects=getLinksByXPathAndURLRegExp(
				"//div[@class='section']//a[@href]",REGEXP_FEATURE);

			var changeStatus=
				function(url,status){
					var linksClick={};
					linksClick[url]={
						"status":status,
						"time":(new Date()).getTime()
					};
					var linksLoad=loadDatas();
					var linksAll=mergeObject(
						linksLoad,linksClick,function(r,l){return false;});
					saveDatas(linksAll);
				}

			var handler=function(url,outer,inners,open){
				var _url=url,_outer=outer,_inners=inners,_open=open;
				return function(status){
					var _status=status;
					return function(){
						if(_open){changeStatus(_url,_status);}
						_open=!_open;
						displayIcons(_outer,_inners,_status,_open);
					}
				}
			};

			for(var i=0;i<linkObjects.length;i++){
				var url=linkObjects[i].getAttribute("href");
				var outer=document.createElement("span");
				var inners={};
				var info=ReadStatusInformation;
				var sort=ReadStatusSort;
				outer.setAttribute("style","margin:0px 2px;");
				for(var j=0;j<sort.length;j++){
					var inner=document.createElement("span");
					var image=document.createElement("img");
					image.setAttribute("alt",info[sort[j]].caption);
					image.setAttribute("title",info[sort[j]].caption);
					image.setAttribute("src",info[sort[j]].icon);
					image.setAttribute("style","margin:0px;vertical-align:text-bottom;cursor:pointer;");
					inner.appendChild(image);
					outer.appendChild(inner);
					inners[sort[j]]=inner;
				}
				var open=false;
				var handlerForLink=handler(url,outer,inners,open);
				for(var key in inners){
					var handlerForIcon=handlerForLink(key);
					inners[key].addEventListener("click",handlerForIcon,true);
				}

				var statusNow=linksAll[url].status;
				if(!statusNow){statusNow=ReadStatus.DO_NOT_DECIDE_WHETHER_TO_READ;};

				displayIcons(outer,inners,statusNow,open);

				linkObjects[i].parentNode.insertBefore(
					outer,linkObjects[i]
				);
			}

		}

	window.addEventListener("load",onLoad,true);

})();
