うごメモはてなを拡張

  • /*
     * @title うごメモはてなを拡張
     * @description うごメモはてなをいろいろと拡張します。「http://www.geocities.jp/ugomemo_harimau/」ブックマークレット版です。レット版では一部うまくいかない可能性がありますので、お試し程度にどうぞ。
     * @license  未定
     * @include		http://ugomemo.hatena.ne.jp/*
     * @include		http://d.hatena.ne.jp/ugomemohatena/*
     * @require 
     */
    
    function init()
    {
    	AddGoogleSearch();
    	StopFavorite();
    	ReplaceUgoPlayer();
    	AddDownloadLink();
    	//AddDowloadLink2();
     	CommentReloder();
     	PopupLetter();
     	AccountPopup();
    }
    
    //ベンリ関数
    $id = function(id){return document.getElementById(id)};
    $class = function(class){return document.getElementsByClassName(class)};
    $tag = function(tag){return document.getElementsByTagName(tag)};
    $e = function(XPath){ return document.evaluate(XPath,document,null,7,null);};
    $e2 = function(xpath,target){ return document.evaluate(xpath,target,null,7,null); }
    $create = function(tagname){ return document.createElement(tagname); }
    $createFromHtml = function(html,tag) { if(tag == undefined)tag = "div"; var temporary = $create(tag);temporary.innerHTML = html;return temporary;}
    $createFromElement = function(element,tag) { if(tag == undefined)tag = "div";var temporary = $create(tag);temporary.appendChild(element);return temporary;}
    
    function GetRequest(uri,callback)
    {
    	if(window.opera)
    	{
    		xhe = new Ten.XHR(uri,null,callback);
    	}else
    	{
    	GM_xmlhttpRequest({
        method: 'GET',
        url: uri,
        headers: {},
        onload: function(responseDetails) { callback(responseDetails); }
        });
    	}
    }
    
    //パスを保持
    var BaseFLVPath;
    
    if( location.href.indexOf('my.widget.iframe') == -1  ) {
    		(function(){init();})();
    }
    
    
    //################## Google検索 ##################
    function AddGoogleSearch()
    {
    var t = $id("global-search");
    if(t == null)return false;
    
    //aタグを作成
    var a = document.createElement("a");
    a.className = "search";
    a.href="javascript:void()";
    a.addEventListener("click", function()
    {
    document.location = "http://www.google.co.jp/search?q=" + encodeURI($id("global-search-input-area").value)
      + "&domains=ugomemo.hatena.ne.jp&sitesearch=ugomemo.hatena.ne.jp";
    },false);
    
    
    //imgタグを作成
    var img = document.createElement("img");
    img.style.cssText="margin-bottom:-3px"
    img.src = 'data:image/gif;base64,'+
        'R0lGODlhEAAQAPcAANQuJDSmJOSalDzKRJzOnAxKpGy6bOymLLzO7DSOLDSuPFSe5OySjNzu3Ex6'+
        'vIRWLOTu9LTK5HzCbDSaPPS6LFy+PFSCzOw6NJy23PTivOz69OxmZESmPMw+JESyRJTClPTerHym'+
        '3CRy1OzGbDyaTPSuLDySNDyiPPz+/OQ6LPTCLKzWtPze3Ey2POy2TOz2/KTGpCR61BRevOy6XESy'+
        'NOz27ESaPPS+PDSK5JzKnPzmjOSyPJTSrDSKPGyu7OyWlPzy3MRWNOTy/PS+NFS+RJzC7JTCnJyy'+
        '1PTWjPQ2LDR61ESuPHSiLGzKRJTSpIS6hMza/GSm5OyWjPy6xHzGfDyePPS2NFSK1PRGRPzytPz6'+
        '9PRuZOw+LEy2ROzSdOyuNDySPPTCRMzi9PT6/BRezMxeNGS+RHyu5EyyPOwuHDyiNPyqtFTGRKTS'+
        'nBRSrJyuZOSqLLTS7EyKLEyi5PSSjOzy5Dx6zNzq/HzCdDyaPFyKxOw+NJy65PzivPT69OxqZESq'+
        'PMyejKzexFSO3MRGLPTCxBRmzCx+3CR23PTGNPz25PTetDyOPKTG7JzGnPTWdNTm9MRiNJTGlESe'+
        'PPQ6LPS6NOyyNDyWPHyy5EyyRESiPOw6LPT2/OyyPOzy/Fy+RDx61EyuPBODgwB8fCAA4OkAb5QA'+
        'F3wAAGAApQAA/5UAgHwAfP8AAP8AAP8AAP8AAF0AAAABAJUAAHwAAOoZAPQsAICDAHx8AAAwtADo'+
        'ABYTAAAAAAD0VAAr6QCDEwB8ABgAAXgAABYAAAAAAADR6AHp6AATEwAAAAAMCwCh8wBPgAAAfPda'+
        'qPQA+4AAE3wAABw02OjpmhMTgwAAfBidqHhk/xaDgAB8fABw/wC9/wBP/wAA/wCcpQDI/wBPgAAA'+
        'fAoAiAIBgQAAQgAAAAAw4ADobwATFwAAAAUAAAMBAAAAAAAAABi40QBk6QCDEwB8AAABZAAAZAAA'+
        'gwAAfAAA7gAAOQAAAAB8AEMYZDroZAATg4gAfEwuakpncVtpSLRmACH5BAAAAAAALAAAAAAQABAA'+
        'Bwj/AFGggBDljCcUhTb8+bOl4R8WKMb4wBEDk0A6abhw2cNlkxQUL+bgQDTo4JpNmzRySfEDBacF'+
        'h0TYiYMQS5IklDal+IiiCBkyoMSgkNKhTKQghAAwEOLyih0+KOq8YcJmACA5DwKFaATB0x0UDSRU'+
        'aPKpRaZMCiRZkGEhgsA2ASqYqdAlFCBNBBwUcKNHYAM8aFp0QQOIgxoCR47EgSIQRQ0qgEIt4cDB'+
        'hqQxKLLoeIQEiGMDaihPqiIJhZcbiVRQGOHZSZUTk/KYIKAFTqUhNyx9WYSCxwQbeWQ70rLDkiUr'+
        'Xzr1QfEkwYRLl8CU7jPjwAEXi8YIImHCBBgTPWAID9RCXgsKPys+OFr/AYafgAA7';
    
    //一番下のspan作成
    var back = document.createElement("span");
    back.className = "commandosearch";
    
    //その上のspan作成
    var lsp = document.createElement("span");
    lsp.className = "search-left";
    lsp.style.cssText = "padding-left:5px";
    
    //それぞれ乗っけていく
    lsp.appendChild(img)
    a.appendChild(lsp);
    back.appendChild(a);
    t.appendChild(back);
    t.cssText = "white-space: nowrap;";//googleChromeの表示崩れ対策
    }
    //################## End Google検索 ##################
    
    //################## お気に入り誤爆防止 ##################
    function StopFavorite()
    {
    	if($class("follow-btn").length != 0)
    	{
    	for(var i = 0 ; i < $class("follow-btn").length ;i++)
    	{
    	if($class("follow-btn")[i].childNodes.item(1).getAttribute("addedevent") == null)
    	{
    		$class("follow-btn")[i].childNodes.item(1).addEventListener("click",
    		function(e){ if(!confirm("お気に入りに追加します。よろしいですか?")){ e.preventDefault();} },false);
    		$class("follow-btn")[i].childNodes.item(1).setAttribute("addedevent","true");
    	}
    	}
    	}
    }
    
    function ReplaceUgoPlayer()
    {
    
    	if($tag("object").length != 0)
    	{
    		var path = unescape($e("//param[@name='FlashVars']").snapshotItem(0).value.split("video=")[1]);
    		BaseFLVPath = path;
    		var parent = $tag("object")[0].parentNode;
    		var obj = parent.removeChild($tag("object")[0]);
        	var player = document.createElement( "embed" );
            player.setAttribute( "height", 220 );
            player.setAttribute( "width", 256 );
            player.setAttribute( "type", "application/x-shockwave-flash" );
            player.setAttribute( "src", "http://player.longtailvideo.com/player.swf" );
            player.setAttribute( "id", "UgoPlayer" );
            player.setAttribute( "allowscriptaccess", "true" );
            player.setAttribute( "allowfullscreen", "false" );
            player.setAttribute( "flashvars", 'file=' + path + '&autostart=true');
            player.style.cssText = "display:inline";
            parent.appendChild( player );
            
            var btn = document.createElement("input");
            btn.type = "button";
            btn.value = "元";
            btn.addEventListener("click",function(){
            parent.innerHTML = "";
            parent.appendChild( obj );
            },false);
            parent.appendChild( btn );
    	}
    }
    
    
    function AddDownloadLink()
    {
    		if(BaseFLVPath == undefined)
    		{
    		if($e("//param[@name='FlashVars']").snapshotLength != 0)
    		{
    			BaseFLVPath = unescape($e("//param[@name='FlashVars']").snapshotItem(0).value.split("video=")[1]);
    		}else{return;}
    		}
    		var flv = BaseFLVPath;
    		var path = new Array();
    		path["FLV"] = "http://image.ugomemo.hatena.ne.jp/flv/" + flv.split("/flv/")[1];
    		path["ppm"] = "http://image.ugomemo.hatena.ne.jp/ppm/" + flv.split("/flv/")[1].replace("flv","ppm");
    		path["3gp"] = "http://image.ugomemo.hatena.ne.jp/3gp/" + flv.split("/flv/")[1].replace("flv","3gp");
    		path["3g2"] = "http://image.ugomemo.hatena.ne.jp/3g2/" + flv.split("/flv/")[1].replace("flv","3g2");
    		path["静GIF"] = "http://image.ugomemo.hatena.ne.jp/thumbnail/" + flv.split("/flv/")[1].replace(".flv","_m.gif");
    		path["動GIF"] = "http://image.ugomemo.hatena.ne.jp/thumbnail/" + flv.split("/flv/")[1].replace(".flv","_as.gif");
    		
    		var ul = document.createElement("ul");
    		ul.style.cssText = "float:right;";
    		for( var name in path )
    		{
    			var li = document.createElement("li");
    			var a = document.createElement("a");
    			a.href = path[name];
    			a.textContent = name;
    			li.appendChild(a);
    			ul.appendChild(li);
    			li.style.cssText = "background-color:#FFA;border:2px white dotted";
    		}
    		$e("id('main')/div[@class='box screen']/div[@class='box-container']").snapshotItem(0).appendChild(ul);
    }
    
    function AddDowloadLink2()
    {
    		if($e("//param[@name='FlashVars']").snapshotLength != 0)
    		{
    		BaseFLVPath = unescape($e("//param[@name='FlashVars']").snapshotItem(0).value.split("video=")[1]);
    		var flv = BaseFLVPath;
    		var path = new Array();
    		path["FLV"] = "http://image.ugomemo.hatena.ne.jp/flv/" + flv.substring("/flv/")[1];
    		path["ppm"] = "http://image.ugomemo.hatena.ne.jp/ppm/" + flv.substring("/flv/")[1].replace("flv","ppm");
    		path["3gp"] = "http://image.ugomemo.hatena.ne.jp/3gp/" + flv.substring("/flv/")[1].replace("flv","3gp");
    		path["3g2"] = "http://image.ugomemo.hatena.ne.jp/3g2/" + flv.substring("/flv/")[1].replace("flv","3g2");
    		path["GIF"] = "http://image.ugomemo.hatena.ne.jp/thumbnail/" + flv.substring("/flv/")[1].replace(".flv","_as.gif");
    		
    		var div = document.createElement("div");
    		div.style.cssText = "padding-top:10px";
    		for( var name in path )
    		{
    			var a = document.createElement("a");
    			a.href = path[name];
    			a.textContent = name;
    			a.style.cssText = "margin-top:20px;border:2px solid white;background-color:pink;";
    			div.appendChild(a);
    		}
    		$e("id('main')/div[@class='box screen']/div[@class='box-container']").snapshotItem(0).appendChild(div);
    		$e("//div[@id='google_afc_container_1']/div/span").snapshotItem(0).innerHTML = "";
    		}
    }
    
    
    function CommentReloder()
    {
        if($e("id('comment')/div[@class='box-title']").snapshotLength == 1)
        {
    	var but = document.createElement("input");
    	but.type = "button";
    	but.value = "再読み込み";
    	but.addEventListener("click",function(){
    	  var url = location.href;
          url = url.replace('/movie/','/movie.comment/');
          document.getElementById('comment_load_area').innerHTML = '<img src="http://ugomemo.hatena.ne.jp/images/indicator_alpha.gif" /><br>Loading';
    
          url = url.split('#')[0];
          url = url.replace(/[?&]id=\d+/,''); //?id=を取る
          if (url.indexOf('?') == -1 && url.indexOf('&') > -1) url = url.replace(/&/, '?'); // 先頭が&なら?にする
          url = url + ((url.indexOf('?') > -1) ? '&' : '?') + new Date().getTime();
          url = url.replace(/(\?|&)\d+=(&|$)/, '$1$2').replace(/&&/, '&').replace(/\?&/, '?');
          location.href = "javascript:Hatena.UgoMemo.AjaxComment.loadComment(\"" + url + "\")";
          },false);
    	$e("id('comment')/div[@class='box-title']").snapshotItem(0).appendChild(but);
    	}
    }
    
    var PLRetryCount = 0;
    var PLShowTimer;
    var isPLShowTimer = false;
    var isPLLoading = false;
    function PopupLetter()
    {
    	//メニュー判定
    	if($e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotLength == 0)
    	{
    	 PLRetryCount++;
    	 if(PLRetryCount < 5)
    	 {
    		 if(console)console.log("PopupLetter : オブジェクトが存在しません。5秒後に再実行します");
    		 setTimeout(PopupLetter,5000);
    	 }else
    	 {
    		 if(console)console.log("PopupLetter : オブジェクトが存在しません。タイムアウト(時間切れ)しました。レターポップアップは無効です");
    	 }
    	}	//End メニュー判定
    	
    	//ポップアップエリアの作成
    	var popup = $create("div");
    	popup.style.cssText = "visibility:hidden;position:absolute;top:0px;left:0px;width:350px;height:400px;background-color:white;border:#AAA 1px solid;box-shadow:4px 4px 5px #AAA;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px" ;
    	document.body.appendChild(popup);
    	
    	var popupHeader = $create("div");
    	popupHeader.style.cssText = "width:320px;height:20px;background-color:#7F7;text-align:center;float:left;border:#7F7 solid 1px;border-top-left-radius:5px";
    	popupHeader.textContent = "うごレター";
    	popup.appendChild(popupHeader);
    	
    	var close = document.createElement("a");
    	close.textContent = "×";
    	close.style.cssText = "border:1px green solid;padding:0px 5px";
    	close.href = "javascript:;";
    	close.addEventListener("click",function(){ popup.style.visibility = "hidden";},false);
    	popup.appendChild(close);
    	
    	var popupList = $create("div");
    	popupList.style.cssText = "height:100px;overflow:auto;clear:both;";
    	popup.appendChild(popupList);
    	
    	var popupPrev = $create("div");
    	popupPrev.style.cssText = "width:100%;height:270px;text-align:left;overflow:auto;border-top:2px green solid;";
    	popup.appendChild(popupPrev);
    	//End ポップアップエリア
    	
    	//mouseOut
    	if($e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotItem(0))
    		$e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotItem(0).addEventListener("mouseout",
    		function(){
    			clearTimeout(PLShowTimer);	//表示タイマーを解除する
    		},false)
    	
    	//mouseOver
    	if($e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotItem(0))
    		$e("id('hatena-user-info')/li[contains(concat(' ', @class, ' '), 'menu-ugoletter')]").snapshotItem(0).addEventListener("mouseover",
    		function(e){
    		if(isPLShowTimer == false)	//表示タイマーセットされていない場合のみタイマーを仕掛ける
    		{
    		PLShowTimer = setTimeout(function(){	//表示タイマー
    			popup.style.top = e.pageY + "px";
    			popup.style.left = (e.pageX - 50) + "px";
    			popup.style.visibility = "visible";
    			if(isPLLoading == false)	//Ajax通信が行われていない
    			{
    				isPLLoading = true;
    				popupList.textContent = "一覧を取得しています";
    				var ListTimeOutTimer = setTimeout(function(){
    					popupList.textContent = "タイムアウト(時間切れ)しました。ポップアップを一度閉じて開きなおしてください。";
    					isPLLoading = false;
    				},10000);	//ListTimeOutTimer
    				GetRequest("http://ugomemo.hatena.ne.jp/letters",function(xhr)
    				{
    					clearTimeout(ListTimeOutTimer);
    					isPLLoading = false;
    					var tmp = $createFromHtml(xhr.responseText);
    					var listEle = $e2(".//div[@id='main']/ul/li/div",tmp);	//メール一覧を取得
    					popupList.innerHTML = "";
    					var ul = $create("ul");
    					ul.style.textAlign = "left";
    					popupList.appendChild(ul);
    					for(i = 0 ; i < listEle.snapshotLength ; i++)
    					{
    						var title = $e2("./div[@class='info']/div[@class='username']",listEle.snapshotItem(i)).snapshotItem(0).textContent;
    						var time = $e2("./div[@class='info']/div[@class='timestamp']/time",listEle.snapshotItem(i)).snapshotItem(0);
    						
    						var link = $e2("./a",listEle.snapshotItem(i)).snapshotItem(0);	//アンカー取得
    						//Hatena.Test = listEle;
    						
    						var a = $create("a");
    						a.textContent = title;
    						a.href = "javascript:;";
    						(function()	//NoName Function(A)
    						{
    							var href = link.href;
    							a.addEventListener("click",function()
    							{
    								popupPrev.textContent = "レターを読み込み中・・・";
    								var PrevTimeOutTimer = setTimeout(function(){ 
    								popupPrev.textContent = "タイムアウト(時間切れ)しました。もう一度レターを選択してください。" 
    								},10000)	//End PrevTimeOutTimer
    								
    								GetRequest(href,function(x)
    								{
    									clearTimeout(PrevTimeOutTimer);
    									
    									var tmp2 = $createFromHtml( x.responseText );
    									//Hatena.Test = tmp2;
    									popupPrev.innerHTML = $e2(".//div[@id='main']/div/div/span/div[@class='container']",tmp2).snapshotItem(0).innerHTML
    									var head = $e2(".//div[@class='info-head' or @class='news-head']",popupPrev).snapshotItem(0);
    									if(head)
    									{
    										var t = head.textContent;
    										var tLink = $create("a");
    										tLink.href = href;
    										tLink.textContent = t;
    										head.innerHTML = "";
    										head.appendChild(tLink);
    										head.style.backgroundColor = "#DDF";
    									}
    								})//End Letter XHR
    							},false);//End AddEvent Click
    						})()//End NoName Function(A)
    						
    						
    			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);
    			time.style.cssText = "color:#AAA;font-size:10px;";
    			li.appendChild(time);
    			ul.appendChild(li);
    						
    					} //End For
    					if(listEle.snapshotLength == 0)popupList.textContent = "うごレターはありません";
    				});//End GetRequest
    				
    			}	//End isPLLoading
    		},1000);//End ShowTimer		
    		}//End isShowTimer
    	},false);	//End MouseOver Event
    	
    }
    
    
    
    
    
    var APRetryCount = 0;
    var APShowTimer;
    var isAPShowTimer = false;
    var isAPLoading = false;
    var clickedHref = "";
    var isCommentAdded = false;	//for GC
    var reloadFunc;
    function AccountPopup()
    {
    	//ポップアップエリアの作成
    	var popup = $create("div");
    	popup.style.cssText = "visibility:hidden;position:absolute;top:0px;left:0px;width:430px;height:500px;background-color:white;border:#AAA 1px solid;box-shadow:4px 4px 5px #AAA;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px" ;
    	document.body.appendChild(popup);
    	
    	var popupHeader = $create("div");
    	popupHeader.style.cssText = "width:370px;height:20px;background-color:#7F7;text-align:center;float:left;border:#7F7 solid 1px;border-top-left-radius:5px;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;";
    	popupHeader.textContent = "ユーザー情報";
    	popup.appendChild(popupHeader);
    	
    	var close = document.createElement("a");
    	close.textContent = "×";
    	close.style.cssText = "border:1px green solid;padding:0px 20px";
    	close.href = "javascript:;";
    	close.addEventListener("click",function(){ popup.style.visibility = "hidden";
    			 tabProf.style.visibility =  tabProf2.style.visibility = tabComment.style.visibility = tabChannel.style.visibility = "hidden";},false);
    	popup.appendChild(close);
    	
    	var popupList = $create("div");
    	popupList.style.cssText = "height:72px;overflow:auto;clear:both;";
    	popup.appendChild(popupList);
    	
    	var userProf = $create("div");
    	userProf.style.cssText="width:430px;height:50px;background-color:#CCC;text-align:left;";
    	popupList.appendChild(userProf);
    	
    	var tabArea = $create("div");
    	tabArea.style.cssText = "clear:both;width:100%;height:20px;overflow:hidden;padding-top:1px;";
    	popupList.appendChild(tabArea);
    	
    	var popupPrev = $create("div");
    	popupPrev.id = "popupPrev";
    	popupPrev.style.cssText = "width:100%;height:400px;text-align:left;overflow:auto;border-top:2px green solid;line-height:100% !important";
    	popup.appendChild(popupPrev);
    	
    	/* Tabs */
    	var tabProf = $create("a");
    	tabProf.textContent = "プロフィール";
    	tabProf.style.cssText = "margin:5px 0px 0px 0px;padding:0px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabProf);
    	tabProfDiv = $create("div");
    	tabProf.addEventListener("click",function(){reloadFunc = undefined;loadData(tabProfDiv,function(){ popupPrev.textContent = "読み込み中かタイムアウト(時間切れ)しました。または内部エラーです。読み込み中でない場合は一度閉じて開きなおしてください。" },false)},false);
    	
    	
    	var tabProf2 = $create("a");
    	tabProf2.textContent = "プロフ2";
    	tabProf2.style.cssText = "margin:10px 0px 0px 0px;padding:0px 2px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabProf2);
    	tabProf2Div = $create("div");
    	tabProf2.addEventListener("click",function(){reloadFunc = undefined;loadData(tabProf2Div,function(){ popupPrev.textContent = "読み込み中かタイムアウト(時間切れ)しました。または内部エラーです。読み込み中でない場合は一度閉じて開きなおしてください。" },false)},false);
    	
    	var tabMemo = $create("a");
    	tabMemo.textContent = "作品";
    	tabMemo.style.cssText = "margin:5px 0px 0px 0px;padding:0px 5px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabMemo);
    	tabMemoDiv = $create("div");
    	var tabMemoFunc = function(){
    	if(clickedHref != "")
    		loadData(tabMemoDiv,function(loader){
    		GetRequest(clickedHref,function(e){ loader(  MemoListCreater($createFromHtml(e.responseText)).innerHTML) ;})
    		reloadFunc = tabMemoFunc;
    		},true)
    	 };
    	tabMemo.addEventListener("click",tabMemoFunc,true);
    	 
    	var tabStar = $create("a");
    	tabStar.textContent = "スター";
    	tabStar.style.cssText = "margin:5px 0px 0px 0px;padding:0px 3px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabStar);
    	tabStarDiv = $create("div");
    	tabStarFunc = function(){
    	if(clickedHref != "")
    		loadData(tabStarDiv,function(loader){
    		GetRequest(clickedHref + "favorites",function(e){ loader(MemoListCreater($createFromHtml(e.responseText)).innerHTML) ;})
    		reloadFunc = tabStarFunc;
    		},true)
    		};
    	tabStar.addEventListener("click",tabStarFunc,true);
    	
    	
    	var tabComment = $create("a");
    	tabComment.textContent = "コメント";
    	tabComment.style.cssText = "margin:5px 0px 0px 0px;padding:0px 3px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabComment);
    	tabCommentDiv = $create("div");
    	tabCommentFunc = function(){
    	if(clickedHref != "")
    		loadData(tabCommentDiv,function(loader){
    		GetRequest(clickedHref + "comments",function(e){ loader( MemoListCreater($createFromHtml(e.responseText)).innerHTML) ;})
    		reloadFunc = tabCommentFunc;
    		},true)
    	 };
    	tabComment.addEventListener("click",tabCommentFunc,true);
    	
    	var tabChannel = $create("a");
    	tabChannel.textContent = "チャンネル";
    	tabChannel.style.cssText = "margin:5px 0px 0px 0px;padding:0px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    	tabArea.appendChild(tabChannel);
    	tabChannelDiv = $create("div");
    	tabChannelFunc = function(){
    	if(clickedHref != "")
    		loadData(tabChannelDiv,function(loader){
    		GetRequest(clickedHref + "channels",function(e){ loader(MakeChannelListCreater($createFromHtml(e.responseText)).innerHTML) ;})
    		reloadFunc = tabChannelFunc;
    		},true)
    	 };
    	tabChannel.addEventListener("click",tabChannelFunc,true);
    	 
    	var reloadButton = $create("a");
    	reloadButton.innerHTML = "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaUlEQVR42p2T3UtTcRzGDwyqPyCILiYohhaUWWC+9HJSaTqbLmdC6cgzdb4sY4jGdDq345zz5Nxs01O+TRMNM3BOaZpTdHPiypZOCOlGvEoEb8O7p1w3TpdGn8sfz/N9Lj78COIfyOk/pyDVJOek3F8RsHV+nvFUz7Eh6cwit3TaKZfY7Q7x6NTOo6EsZPfycb8jFSVvn4AaeIx4ZZYpZLlsejJB6li10S4F2r16dH81o3fVglc+I8yfXqBtWQeduwEiiwCXZGPa4OWJRW7xJGMzLGsxuN4F9ksbXvvaYfncCqO3GYyHhtZdD9W8Ahmt9xBRyGOCDhTavfL6uSr0r7Ho9pnRutSEomEx7jTFI6H+Oq5VX0amMQ3pTCoiCnLMxGHyRlYceldDYLHFTSO5JWYrSSM1HMxcKBryhxd8sBKhEFk3tgXsmT2ecfMnqfuxm6iaazycCcv/riRIgpM3cpoSDfioTFZIpRvXqbvNLEVkWF5SKUwudZveoOJqrVRsZThFzpOcivkZ5dGxyEYBy9/9M2bdS1Tpt4lQPJ27Yi2dnvIffHvQM2vIsJzdMniafltpRrX9Ga5WJTuOlGXOYbN2qRbqhecQvxMh940Awq40lI9KwLjogFK9R4OHnVmILtfIg8rlH7MZ2q3A8LfegNK+tc4gpZqFmoBSyWA+ostktghxEjfogGR8XKt0VqJvtSOgtGOlDSZvC5glLdSzNZC9L4KwnY8oaZQtjBpMIEKR079nqhgrRslIAVKYm7hFxyGuNhYxlc6dizKxI7LQJD8vnuASx7H/cUjdpp/4b9QE50adUHFSbJ9fCMBCClfUMYwAAAAASUVORK5CYII='>";
    	reloadButton.style.cssText = "height:18px;margin:0px 0px 0px 0px;padding:0 5px;border:1px solid green;font-size:10px;float:right;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;";
    	reloadButton.title = "更新";
    	tabArea.appendChild(reloadButton);
    	reloadButton.addEventListener("click",function(){
    		tabMemoDiv.innerHTML = tabStarDiv.innerHTML = tabCommentDiv.innerHTML = tabChannelDiv.innerHTML = "";
    		if(reloadFunc)reloadFunc();
    	 },true);
    	/* End Tabs */
    	//End ポップアップエリア
    	
    	AddShowButton = function()
    	{
    	
    	var eles = $e("//*[@class='username' or @class='name authorname']/a/..");
    
    	for(i = 0 ; i < eles.snapshotLength ; i++)
    	{
    	if(eles.snapshotItem(i).children[0].className == "popupClicker")
    	{
    		eles.snapshotItem(i).removeChild(eles.snapshotItem(i).children[0]);
    	}
    	var ele = eles.snapshotItem(i);
    	var clicker = $create("span");
    	clicker.className = "popupClicker";
    	clicker.textContent = "▼";	
    	clicker.style.color = "blue";
    	ele.insertBefore(clicker,ele.firstChild);
    
    	clicker.addEventListener("click",function(e){
    		tabProfDiv.innerHTML = tabProf2Div.innerHTML = tabMemoDiv.innerHTML = tabStarDiv.innerHTML = tabCommentDiv.innerHTML = tabChannelDiv.innerHTML = "";
    		tabProf.style.visibility = tabProf2.style.visibility = tabComment.style.visibility = tabChannel.style.visibility = "visible";
    		clickedHref = e.target.parentNode.children[1].href != undefined ? e.target.parentNode.children[1].href : (e.target.parentNode.children[2].href != undefined ? e.target.parentNode.children[2].href : e.target.parentNode.children[3].href);
    		var el = ele;
    		popup.style.top = e.pageY + "px";
    		popup.style.left = (e.pageX - 50) + "px";
    		popup.style.visibility = "visible";
    		
    		if(isAPLoading == false)
    		{
    			 popupPrev.innerHTML = "";
    			isAPLoading = true;
    			userProf.textContent = "基本プロファイルを読み込んでいます。";
    			var ListTimeOutTimer = setTimeout(function(){
    				userProf.textContent = "タイムアウト(時間切れ)しました。一度ポップアップを閉じて開きなおしてください。";
    				isAPLoading = false;
    			},15000);	//ListTimeOutTimer
    			GetRequest(clickedHref,function(xhr)
    			{
    			 isAPLoading = false;
    			 clearTimeout(ListTimeOutTimer);
    			 
    			 var userid = "";
    			 									
    			 var tmp = $createFromHtml(xhr.responseText);
    			 var prof = $e2(".//div[@class='userheader-container']",tmp).snapshotItem(0);
    			 prof.children[0].style.cssText = "float:left;display:block;height:50px;";
    			 
    			 if($e2(".//span[@class='username']",prof).snapshotLength==1)
    			 {
    			 userid = $e2(".//span[@class='username']",prof).snapshotItem(0).textContent.replace("id:","");
    			 clickedHref = "http://ugomemo.hatena.ne.jp/" + userid + "/";
    			 }else if($e2(".//span[@class='ugomemousername']",prof).snapshotLength==1)
    			 {
    			 	userid = $e2(".//span[@class='ugomemousername']",prof).snapshotItem(0).textContent.replace("id:","");
    			 	clickedHref = clickedHref.replace("/my","/");
    			 }
    			 
    			 if(userid != "")
    			 {
    			 var dhatena = $create("a");
    			 dhatena.href = "http://d.hatena.ne.jp/" + userid;
    			 dhatena.innerHTML = "<img src='http://d.hatena.ne.jp/favicon.ico'>";
    			 prof.appendChild(dhatena);
    			 var hhatena = $create("a");
    			 hhatena.href = "http://h.hatena.ne.jp/" + userid;
    			 hhatena.innerHTML = "<img src='http://h.hatena.ne.jp/favicon.ico'>";
    			 prof.appendChild(hhatena);
    			 var bhatena = $create("a");
    			 bhatena.href = "http://b.hatena.ne.jp/" + userid;
    			 bhatena.innerHTML = "<img src='http://cdn-ak.favicon.st-hatena.com/?url=http://b.hatena.ne.jp'>";
    			 prof.appendChild(bhatena);
    			 var ahatena = $create("a");
    			 ahatena.href = "http://a.hatena.ne.jp/" + userid;
    			 ahatena.innerHTML = "<img src='http://a.hatena.ne.jp/favicon.ico'>";
    			 prof.appendChild(ahatena);
    			 }
    			 
    			 
    			 var a = $create("a");
    			 if($e2(".//span[@class='ugomemoname']",prof).snapshotLength == 0)	//IDのみ
    			 {
    				  if( $e2(".//span[@class='ugomemousername']",prof).snapshotLength != 0)
    				 {
    				 var a = $create("a");
    				 var nameE2 = $e2(".//span[@class='ugomemousername']",prof).snapshotItem(0);
    				 a.textContent = nameE2.textContent;
    				 a.style.cssText = "font-size:small";
    				 a.href = "http://ugomemo.hatena.ne.jp/" + $e2(".//span[@class='ugomemousername']",prof).snapshotItem(0).textContent.replace("id:","") + "/my";
    				 nameE2.innerHTML = "";
    				 nameE2.appendChild(a);
    				 
    				 var a2 = $create("a");
    				 a2.textContent = "はてなマイページ";
    				 a2.style.cssText = "font-size:small";
    				 a2.href = "http://www.hatena.ne.jp/" + $e2(".//span[@class='ugomemousername']",prof).snapshotItem(0).textContent.replace("id:","");
    				 nameE2.innerHTML += " ";
    				 nameE2.appendChild(a2);
    				 }
    			 }
    			 else{
    			 var nameE =$e2(".//span[@class='ugomemoname']",prof).snapshotItem(0); 
    			 a.textContent = nameE.textContent;
    			 a.href = clickedHref;
    			 nameE.innerHTML = "";
    			 nameE.appendChild(a);
    			 var a = $create("a");
    			 if( $e2(".//span[@class='username']",prof).snapshotLength != 0)
    			 {
    			 var a2 = $create("a");
    			 var nameE2 = $e2(".//span[@class='username']",prof).snapshotItem(0);
    			 a2.textContent = nameE2.textContent;
    			 a2.style.cssText = "font-size:small";
    			 a2.href = "http://www.hatena.ne.jp/" + $e2(".//span[@class='username']",prof).snapshotItem(0).textContent.replace("id:","");
    			 nameE2.innerHTML = "";
    			 nameE2.appendChild(a2);
    			 }
    			 }
    			 userProf.innerHTML = prof.innerHTML;
    			 
    			 tabProf.style.cssText ="margin:10px 0px 0px 0px;padding:0px 5px;border:1px solid green;border-top-left-radius:5px;border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;";
    
    			 var prof1 = $e2(".//div[@class='freetext']",tmp).snapshotItem(0);
    			 var prof2 = $e2(".//div[@class='more']",tmp).snapshotItem(0);
    			 
    			 var prof3;
    			 if($e2(".//table[@class='info']",tmp).snapshotLength != 0)
    				 prof3 = $createFromElement($e2(".//table[@class='info']",tmp).snapshotItem(0));
    			 else 
    			 	prof3 = $createFromHtml("このユーザーの情報はありません");
    			 var prof4 = $e2(".//div[@class='star-country']",tmp).snapshotItem(0);
    			 if(prof4)
    			 {
    			 for(i = 0 ; i < prof4.children[1].children[0].children.length ; i++)
    			 {
    			  prof4.children[1].children[0].children[i].style.cssText = "float:left";
    			 }
    			 prof4.innerHTML += "<div style='clear:both'></div>";
    			 }
    			 
    			 var prof5;
    			 if($e2(".//div[@id='follow-box']/div[@class='box-body']",tmp).snapshotLength != 0)
    			 {
    			 prof5 = $e2(".//div[@id='follow-box']/div[@class='box-body']",tmp).snapshotItem(0);
    			 for(i = 0 ; i < prof5.children[0].children[0].children.length ; i++)
    			 {
    			 	if(prof5.children[0].children[0].children[i].children.length != 0)
    			 	{
    			 		var elem = prof5.children[0].children[0].children[i].children[0];
    			 		if(elem.tagName != "IMG")
    			 		{
    			 			elem = elem.children[0];
    			 		}
    				 	elem.style.cssText = "width:48px;height:32px;";
    			 	}
    			 }
    			 }else{ prof5 = $createFromHtml("このユーザーの情報はありません") }
    			 
    			 var prof6;
    			 if($e2(".//div[@id='comment-box']/div[@class='box-body']",tmp).snapshotLength != 0)
    			 {
    			 prof6 = $e2(".//div[@id='comment-box']/div[@class='box-body']",tmp).snapshotItem(0);
    			 
    			 for(i = 0 ; i < prof6.children[0].children.length ; i++)
    			 {
    			 prof6.children[0].children[i].style.cssText = "clear:both";
    			 prof6.children[0].children[i].children[0].children[0].style.cssText = "float:left";
    			 prof6.children[0].children[i].children[3].innerHTML = "<br>" + prof6.children[0].children[i].children[3].innerHTML ;
    			 prof6.children[0].children[i].children[3].style.cssText = "clear:both";
    			 }
    			 }else{ prof6 = $createFromHtml("このユーザーの情報はありません") }
    			 
    			 var prof7;
    			 if( $e2(".//div[@id='channel-box']/div[@class='box-body']",tmp).snapshotLength != 0)
    			 {
    			 prof7 = $e2(".//div[@id='channel-box']/div[@class='box-body']",tmp).snapshotItem(0);
    			 }else prof7 = $createFromHtml("このユーザーの情報はありません");
    
    			 if($e2(".//span[@class='ugomemoname']",prof).snapshotLength != 0)
    			 tabProf2Div.innerHTML = prof3.innerHTML + "<hr>" + (prof4 ? prof4.innerHTML : "星をつけた国リストが存在しません") + "<hr>" + prof5.innerHTML + 
    			 "<hr>" + prof6.innerHTML + "<hr style='clear:both'>" + prof7.innerHTML;
    			 
    			 tabMemoDiv.appendChild(MemoListCreater( tmp ));
    			 if($e2(".//span[@class='username']",prof).snapshotLength != 0)
    			 {
    				 tabProfDiv.innerHTML = (prof1 ? prof1.innerHTML : "このユーザーのプロフィールは書かれていません") + "<br>" + (prof2 && prof2.textContent == "Myはてなのプロフィールを見る" ? prof2.innerHTML : "");
    			 	 popupPrev.innerHTML = tabProfDiv.innerHTML;
    			 }
    			 else
    			 {
    			 if($e2(".//span[@class='ugomemoname']",prof).snapshotLength != 0)
    			 {
    				 popupPrev.innerHTML = tabProf2Div.innerHTML;
    				 tabProf.style.visibility = tabComment.style.visibility = tabChannel.style.visibility = "hidden";
    			  }else{//ID Only
    				 popupPrev.innerHTML = tabMemoDiv.innerHTML;
    				 tabProf.style.visibility = tabProf2.style.visibility = "hidden";
    			  }
    			 }
    			 
    			 StopFavorite();
    			 			 
    				});/* GetRequest */
    		}	/* isAPLoading */
    	},false);/* end click */
    	}
    	}/* End AddShowButton function */
    	AddShowButton();
    	
    	//Hatenaオブジェクトへアクセス可能 OR アンセーフウィンドウにアクセス可能
    	if(window.Hatena != undefined || window.wrappedJSObject != undefined)
    	{
    		if((window.wrappedJSObject || window).Hatena.UgoMemo.AjaxComment)
    		(window.wrappedJSObject || window).Hatena.UgoMemo.AjaxComment.addEventListener("loaded",AddShowButton);
    	
    	}else //いずれにも非対応対応である たぶん、webkit
    	{
    		document.body.addEventListener('DOMNodeInserted',function(evt){
    			if(isCommentAdded == false)
    			{
    				if(event.target.getAttribute && event.target.getAttribute("data-author-name") != null)
    				{
    					setTimeout(function(){
    						AddShowButton();
    						isCommentAdded = false;
    					},200);//timeout
    					isCommentAdded = true;
    				}
    			}/* if isCommentAdded */
    	}, false); // end addEvent
    	}
    	
    	/* 
    	from @ ページが読み込まれているdiv
    	loader @ 未ロード時にページを読み込む関数
    	isStarLoad @ 星をセットを行う
    	 */
    	function loadData(from,loader,isStarLoad)
    	{
    	 if( from.innerHTML == "")
    	 {
    	 popupPrev.textContent = "読み込んでいます・・・";
    	 loader(function(e){ popupPrev.innerHTML = from.innerHTML = e;
    	 if(isStarLoad == true)
    	location.href = "javascript:Hatena.UgoMemo.Star.loadThumbnailStarCount(document.getElementById('popupPrev'));Hatena.UgoMemo.watchThumbnails();";
    	 });
    	 }
    	 else{
    	 popupPrev.innerHTML = from.innerHTML;
    	if(isStarLoad == true)location.href = "javascript:Hatena.UgoMemo.Star.loadThumbnailStarCount(document.getElementById('popupPrev'));Hatena.UgoMemo.watchThumbnails();";
    	}
    	}
    	function MemoListCreater(e)
    	{
    		var main = $e2(".//ul[@class='floatlist memolist']",e).snapshotItem(0);
    		if(main)
    		{
    		for(var i = 0 ; i < main.children.length  ; i++)
    		{
    			main.children[i].style.cssText = "border:1px solid #AAA;list-style-type:none;float:left;background-image:none;margin:0px  !important;height:115px;width:130px !important;;";
    			main.children[i].children[0].style.cssText = "padding:0px;";
    			main.children[i].children[0].children[0].style.cssText = "height:96px;";
    			main.children[i].children[0].children[0].children[0].style.cssText = "margin:0px";
    			main.children[i].children[0].children[1].style.cssText = "width:100px;font-size:10px";
    		}
    		var tmp = $create("div");
    		tmp.appendChild(main);
    		return tmp;
    		}
    		else
    		return $createFromHtml("エラー");
    	}
    	function MakeChannelListCreater(e)
    	{
    		var div = $create("div");
    		var main = $e2(".//div[@id='main']",e).snapshotItem(0);
    		main.id = "";
    		main.style.cssText = "width:240px;float:left;font-color:black;margin:0px";
    		if(main.children[0].children[0].textContent != "作成したチャンネルはありません")
    		{
    		for(var i =0  ; i < main.children[0].children.length ; i++)
    		{
    			main.children[0].children[i].style.cssText = "width:240px;height:120px;margin:0px;padding:0px;border:1px dashed green;";
    		div.appendChild(main);
    		}
    		}else{
    		div.appendChild(document.createTextNode("作成したチャンネルはありません。"));
    		 }
    		
    		var side = $e2(".//div[@id='channelbox']/div[@class='box-body']",e).snapshotItem(0);
    		side.style.cssText = "width:160px;float:right;font-size:12px;";
    		for(var i = 0 ; i < side.children[0].children.length ; i ++)
    		{
    		 side.children[0].children[i].children[0].children[0].style.cssText = "width:32px;float:left;";
    		 side.children[0].children[i].children[0].style.cssText = "height:32px;display:block;";
    		side.children[0].children[i].style.cssText = "clear:both;border-bottom:1px blue dashed;overflow:hidden"
    		}
    		div.appendChild(side);
    		
    		return div;
    	} /* ユーザー名要素列挙end */
    	
    }
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2011/04/27 18:40:23 - 2011-04-27