// ==UserScript==
// @name		Fast Look up nicoinfo
// @namespace	http://d.hatena.ne.jp/AOI-CAT/
// @include		*
// @exclude		http://www.nicovideo.jp/thumb*
// @version		0.4
// ==/UserScript==

/*
 * Based on:
 * Fast Look up Alc by cho45
 *  http://userscripts.org/scripts/show/12024
 * Fast Look up goo by gan2
 *  http://d.hatena.ne.jp/gan2
 *
 * Special thanks:
 * NicoVideo thuminfo Check by Sore_0
 *  http://d.hatena.ne.jp/Sore_0/
 *
 */

/*
 *関数
 *smilehyperLinkとmakeBrの作成
 *makeBrはものすごい手抜きなので例外があると思う。
*/
(function() {
    var popup = [];
    window.addEventListener("mouseup",
	    function(evt) {
	        if (!window.getSelection()) return;
			var sel = window.getSelection();
	        var selText = sel.toString();
	        var re = new RegExp(/(sm|nm|fz|za)\d+/);
	        var vid = selText.match(re);
	        if (vid == null) {
	            selText = getSelectedInnerHTML(sel);
	            vid = selText.match(re);
	            if (vid == null) return;
	        }
		vid = vid[0]
	
	        GM_xmlhttpRequest({
	            method: 'GET',
	            url: 'http://www.nicovideo.jp/api/getthumbinfo/' + vid,
	            onload: function(req) {
					// Search first 'xmlTagName', and extract its Text.
	                var $TT = function(xmlTagName) {
	                    return dom.getElementsByTagName(xmlTagName)[0].textContent;
	                }
	                var dom = (new DOMParser()).parseFromString(req.responseText, 'text/xml');
	                var apiStat = dom.getElementsByTagName('nicovideo_thumb_response')[0].getAttribute('status');
					
	                if (apiStat == "fail") {
						var errcode = $TT('code');
						switch(errcode) {
							case 'NOT_FOUND':
							     errmes = 'のヮの ＜ 見つかりませんでした。';
								 break;
							case 'DELETED':
							      errmes = '>x< ＜ 消えてるみたい。';
								  break;
							default: break;
						}
						var html = '<p style="margin: 0em 1.5em;">' + errmes + '</p>' +
						           '<dl style="margin: 0em 1em;"><dt><a href="http://www.nicovideo.jp/watch/' + this.url.match(/sm\d+/) + '">' + this.url.match(/sm\d+/) + '</a></dt><dd>' + errcode + '</dd></dt></dl>';
					} else {
		                var title = $TT('title');
		                var desc = smilehyperLink($TT('description'));
						desc = makeBr(desc);
		                var img = $TT('thumbnail_url');
		                var retrieve = $TT('first_retrieve');
		                var wurl = $TT('watch_url');
		                var len = $TT('length');
		                var cnt = $TT('view_counter');
		                var cmt = $TT('comment_num');
		                var lst = $TT('mylist_counter');
		                var lcmt = $TT('last_res_body');
						var tag = getTagList(dom);
		                var [year, month, day, hour, minute, sec] =
							retrieve.replace(/[-:T]/g, ',').replace(/\+.+$/, '').split(',');
		
		                var html =
						 '<table><tr><td>' + 
						 '<a href="%WURL%" target="_blank">' + 
						 '<img alt="%TITLE%" src="%IMG%" class="thumb_img_normal" height="70" width="94">' + 
						 '</a></td><td>' + 
						 '<p class="TXT10"><strong>%Y%/%M%/%D% %H%:%N%:%S%</strong> 投稿  </p>' + 
						 '<p class="TXT12"><a href="%WURL%" target="_blank" class="video">%TITLE%</a>' + 
						 '<br>  %DESC%</p><br><p class="TXT12">  タグ:%TAG%</p>' + 
						 '</td></tr><tr><td>' + 
						 '<p class="TXT10"><strong>%LEN%</strong>' + 
						 '<br>  再生：<strong>%CNT%</strong>' + 
						 '<br>  コメント：<strong>%CMT%</strong>' + 
						 '<br>  マイリスト：<strong>%LST%</strong></p></td>' + 
						 '<td><div class="thumb_res">' + 
						 '<p class="TXT12"><strong>%LCMT%</strong></p></div></td></tr></table>';
		
		                var cssTxt10 =
						 'style="font-size: 10px;line-height:14px;"';
						var cssTxt12 =
						 'style="font-size: 12px;line-height:16px;"';
						var cssThumbRes =
						 'style="background: #FFF none repeat scroll 0%;' + 
						 'border: 2px solid #CCC; margin-top: 4px; padding: 6px;"';
						html = html.replace(/%TITLE%/g, title).replace(/%WURL%/g, wurl).replace(/%IMG%/g, img
							      ).replace(/%LEN%/, len).replace(/%DESC%/, desc).replace(/%CNT%/, cnt
							      ).replace(/%CMT%/, cmt).replace(/%LST%/, lst).replace(/%LCMT%/, lcmt
							      ).replace(/%Y%/, year).replace(/%M%/, month).replace(/%D%/, day
							      ).replace(/%H%/, hour).replace(/%N%/, minute).replace(/%S%/, sec
							      ).replace(/%TAG%/, tag
							      ).replace(/class="thumb_res"/g, cssThumbRes
							      ).replace(/class="TXT10"/g, cssTxt10
							      ).replace(/class="TXT12"/g, cssTxt12
							      ).replace(/<img /g, '<img style="border: 0px none;" ');
					}
	
	                var div = document.createElement('div');
		                div.style.position = 'fixed';
		                div.style.bottom = '0';
		                div.style.left = '0';
		                div.style.right = '0';
		                div.style.border = '1px solid #000';
		                div.style.background = '#FFF';
		                div.style.color = '#000';
		                div.style.maxHeight = '50%';
		                div.style.overflow = 'auto';
		                div.style.opacity = '0.8';
		                div.style.textAlign = 'left';
		                div.style.zIndex = '10000'
	
	                div.addEventListener('click',
		                function(e) {
		                    e.stopPropagation();
		                },
		                false
					);
					
	                div.addEventListener('click',
		                function(e) {
		                    div.style.display = 'none';
		                },
		                false
					);
					
	                div.innerHTML = html;
	                document.body.appendChild(div);
	                popup.push(div);
	            } //end of onload
	        }); // end of GM_xmlhttpRequest
	    },
	    false
	); // end of addEventListener mouseup

    document.body.addEventListener('click',
	    function(evt) {
	        var p;
	        while (p = popup.pop()) {
	            p.parentNode.removeChild(p);
	        }
	    },
	    false
	);

	//http&sm&mylist Link
	function smilehyperLink(desc){
		  desc = desc.replace(
		    /https?:\/\/[-_.!~*'a-zA-Z0-9:\/?@&=+$,%#]+|(?:mylist|user)\/\d+|(?!mp3\D)(sm|nm|fz|am|za)\d+/g,
		    function(word){
		      if(word.indexOf("http") == 0){return word.link(word);}
		      var link = "<a href='http://www.nicovideo.jp/";
		      link = /^(?:mylist|user)\//.test(word) ? link + word : link + "watch/" + word;
		      return link + "' style='background-color:#55ffff;'>" + word + "</a>";
		  });
			return desc;
		}

	//改行を作成
	function makeBr(desc){
		desc = desc.replace(/(\s{3,})/g,"<br>");
		desc = desc.replace(/(。{1,})/g,"$1<br>");
		desc = desc.replace(/(<br>){1,}/g,"<br>");
    return(desc); 
}


	// In : object selection
	// Out: innerHTML
    function getSelectedInnerHTML(oSel) {
        if (oSel) {
            var oRange = oSel.getRangeAt(0);
            var df = oRange.cloneContents();
            var div = document.createElement('div');
            div.appendChild(df);
            return div.innerHTML;
        }
    }
	
	function getTagList(dom) {
		var tags = dom.getElementsByTagName('tag');
		var tagList = "";
		var a = '&nbsp;&nbsp;<a href="http://www.nicovideo.jp/tag/%TAGURL%" target="_blank">%TAG%</a>';
		var l = tags.length;
		for (var i = 0; i < l; i++) {
			tagList = tagList + 
			          a.replace(/%TAGURL%/, encodeURI(tags[i].textContent)
					  ).replace(/%TAG%/, tags[i].textContent);
		}
		return tagList;
	}

})();
