popThumb.version 		= "2.26 2014/09/15";
popThumb.version_num	= 20140915;
/************************************
*	popThumb_FA	 Version 2.26	*
*************************************
Version 2.17	2013/10/20	マウスがリンクに載った時の待ち時間設定（popThumb.wait）を追加
Version 2.17a	2013/10/20	watchページでpopThumb.waitを使うとマウスを外してもポップアップされるバグ修正
Version 2.17b	2013/10/21	popThumb_FA版getFullDescの保守ができないので削除・video.arrayデータ対応（getFullDesc用）
Version 2.18	2013/10/26	video.arrayデータ対応の削除（XMLデータをそのままjson化してlocalstorageに保存できなかった）
							削除動画/有料動画でhttp://i.nicovideo.jp/v3/video.array鯖を使うように変更
Version 2.18a	2013/10/26	削除動画/有料動画でhttp://i.nicovideo.jp/v3/video.array鯖を使うときにキャッシュが使われていなかったので修正
Version 2.18b	2013/10/26	popThumb.use_always_check = true;時のバグ修正 (13:40)
Version 2.19	2013/11/19	削除済み動画の場合、削除アイコンを表示 /local/delete.gifが必要
Version 2.19a	2013/11/22	document.querySelectorが使えない場合に対応
Version 2.20	2013/12/14	/api/getthumbinfo/の説明文にtagが入るようになったので対応
Version 2.21	2013/12/15	video.arrayでも情報がない動画で無限ループに陥るバグ修正・eachSmidが取得できなかった場合はpop_smid(コミュ動画等じゃなければ)を使うように変更
Version 2.22test2013/12/31	getthumbinfoに投稿者名が含まれている場合は表示するようにした
							動画情報をobject形式で保存するオプション追加(popThumb.use_ObjectData)
							説明文・タグにある動画のリンク化をpopThumb_FA.js内で行なえる設定追加（popThumb.use_in_JS_to_link）
Version 2.22t1	2014/01/02	バグ修正（video.arrayで複数動画取得時。popThumb_FA単体では問題なし）
Version 2.22t2	2014/01/03	watch/[0-9]+形式の動画のキャッシュ情報の反映
							本体nlFilter（getthumbinfo/video.array(?nlFilter)の出力で「<」「>」を実体参照「&lt;」「&gt;」）に対応
Version 2.22t3	2014/01/04	nlFilterの使用する/しないをuse_ObjectDataではなく、use_in_JS_to_linkで決定するようにした。（true:nlFilter無し）
							データ保存(localStorage)のバグ修正。saveを通信ごとに行なうようにした（複数のタブ間でデータが同期されます）。
Version 2.22t4	2014/01/04	データ保存(localStorage)のバグ修正。(運営がいまだに古い1.5.1.1のprototype.jsを使っているため、JSON化でバグが発生していたので対策)
Version 2.22t5	2014/01/25	IE9で発生していたバグ修正（xml.querySelectorが使えなかった）。
Version 2.22t6	2014/02/02	コミュ・公式動画以外（＝sm～）でvideo.arrayを使ってpopupさせるとエラーで表示されないバグ修正。（popThumb.use_VideoArrayAPI = true; or 削除動画）
Version 2.23	2014/03/04	jQuery1.11に対応（$(selector).live(type, fn)→$(document).on(type, selector, fn)）
Version 2.24	2014/04/26	use_ObjectData = trueのときチャンネル動画でデータが保存されていなかったバグ修正。 / 投稿日に曜日も表示
Version 2.25	2014/08/31	有料動画かの確認で不明の時の情報を表示・コメント情報が無いAPI使用時に別APIから手動取得できるように（[APIの仕様で最新コメント表示不可]をクリック）
Version 2.26	2014/09/15	tagの無い動画だとエラーになっていたのを修正 thx>http://anago.2ch.net/test/read.cgi/software/1387102469/591


uses with NicoCache_nl (推奨・別途nlフィルターを使用するとキャッシュの有無も分かります)
	動画IDにカーソルを合わせたときにサムネ情報を表示
	 + GetOwnerName（htmlをいじるフィルタ不要ver）　popThumb.use_WatchGetOwner変数
	IE・Chrome・firefoxは動作確認・operaは不明
	
	
	・Ctrlキー押しながらで固定表示(sticky)や移動もできます。
	・Shiftキー押しながらで再取得可能
	
	
	
	
popThumb.data // コンテナ・下のほうで定義してます

['t_' + thumb_id]			 					= ['name' , TextData]	smile鯖
['u_' +  user_id] 								= ['name' , TextData]	www鯖
[pop_smid]										= ['api'  , TextData]	ext鯖	http://ext.nicovideo.jp/api/getthumbinfo/sm9
['va_' + pop_smid] 								= ['array', TextData]	i鯖		http://i.nicovideo.jp/v3/video.array?v=sm9
['obj_' + pop_smid] 							= ['object',Object]		ext or i鯖 titleやdescriptionなどをオブジェクト形式で保存：api or arrayで取得すれば自動的に保存される
[pop_smid] 										= ['ext'  , TextData]	ext鯖	http://ext.nicovideo.jp/thumb/sm9
['w_' + watch_id]								= ['watch', TextData]	www鯖
[(user|channel|community|mylist)_(co|ch)?\d+]	= ['other', TextData]	ext鯖
[(sg|im|mg)\d+]									= ['seiga', TextData]
[lv\d+]											= ['live' , TextData]
*/

/**********************************************************************/
/******************************* 設定 *********************************/
/**********************************************************************/

// iframeで表示させる場合はtrue (flashの手前になるようになる)
popThumb.use_iframe = /^http:[/][/](?:www|nine|live)[.]nicovideo[.]jp[/](?:watch|playlist[/]mylist)[/]/.test(location.href);

// リンクにマウスが載った時の待ち時間 [ms]
// (この時間だけマウスがリンク上から出なければ、通信＆ポップアップ作製)
// popThumb(path, sticky, wait)の第3引数waitに数字が指定されてあればそちらを使う。（非指定の時にこちらを使う。）
// 0にすれば即時表示（従来通り）　※通信時間は必要
popThumb.wait = 0;


// 専ブラ風に表示 設定値は数字(ms)
// ポップアップしたものからさらにポップアップしたいとき用
// リンクからpopupした部分への移動にかかる時間以上必要
// 各自調節してもらえれば。
popThumb.use_SenBroStyle = 300;

// 使用APIの種類
// false : http://ext.nicovideo.jp/api/getthumbinfoからデータ取得（従来と同じ）
// true  : http://i.nicovideo.jp/v3/video.arrayからデータ取得
//   メリット：説明文に改行・リンクなどが反映される、有料動画か判別可能
//   デメリット：投稿ユーザーID、動画サイズ、ビットレート、最新コメントが取得できない
// ※falseでも従来のAPIが使えなかった場合は新APIで取得します。（削除動画・有料動画）
popThumb.use_VideoArrayAPI = false;
// 公式動画（so～形式のみ。数字IDはgetthumbinfoで問題なし）でvideo.arrayを使う（trueだとコメント数を表示できるが、一部動画(キャッシュされない動画：公式映画・リトバス等で情報が取得できない)）
popThumb.use_VideoArrayAPI_so = true;

// 上記の設定（popThumb.use_VideoArrayAPI）がfalseの場合でもvideo.arrayのキャッシュがあれば、そちらから説明文を持ってくる
popThumb.use_cachedVideoArrayAPI = true;
/*******************************************/
/*********** NicoCache_nl 関連 *************/
/*******************************************/
// NicoCache_nlを使っていたらtrue
popThumb.use_NicoCache_nl = false;

// NicoCacheのnlMovieFetcherを使っていたらtrueでfetch可能
popThumb.use_NicoFetch = true;

// localStorageで動画情報をキャッシュする際に、
// キャッシュの有無が変更されているときに備えて
// (cacheが確認されていない動画は)毎回cache済みかだけ調べる。(/cache/へのみの通信・外へは無し)
popThumb.use_always_check = true;

// キャッシュ済みの場合はキャッシュタイトルも取得
popThumb.use_getCacheTitle = true;

// nlMovieFetcherを使用中 & ブラウザ == IEの場合のみ & (ニコニコ動画以外のページでfetchする場合)
// インターネットオプション→プライバシー→詳細設定→Cookieをすべて受け入れるにしている場合(iframe内のCookieを許可) -> true
// falseでも一応動きますが、scriptとして埋め込むのでエラー出まくりです（alertなどは無し）
popThumb.AllowCookie = false;
/*************** ここまで *******************/
// ['obj_' + pop_smid]形式でデータを保存する。
popThumb.use_ObjectData = true;

// リンク化をこのjs内で行なう（use_in_JS_to_linkがtrueの場合：nlFilterは通りません）
popThumb.use_in_JS_to_link = true;

// 投稿者名も取得(通信が増えるのでfalse推奨)
popThumb.use_getOwner = false;
/*************************** 設定ここまで *****************************/
//<!--nlFilter設定用-->

function popThumb (path, sticky, wait) {
	if (/\/(bk|nw)/.test(path)) return;		// ニュースと本？はpopUpしない（できない）
	if (popThumb.key_now === 65) return;	// Aキーを押していたらpopUpしない。(作者設定)
	if (popThumb.move) return;
	if (typeof wait === "undefined") wait = popThumb.wait;
	if (typeof wait !== "number") wait = 0;
	if (wait > 0) {
		popThumb.wait_setTimeoutId = window.setTimeout(function(){
			popThumb (path, sticky, 0);
		}, wait);
		return;
	}
	if (popThumb.use_iframe && popThumb.inIframe && location.search.slice(1) != path) {
		var ppT = window.parent.popThumb;
		if (popThumb.key_now) ppT.key_now = popThumb.key_now;
		if (popThumb.framePos) {
			// false(undefined)の場合は大抵おかしい
			ppT.mouseX = popThumb.framePos.mouseX + popThumb.clientX;
			ppT.mouseY = popThumb.framePos.mouseY + popThumb.clientY;
			ppT.clientX = ppT.mouseX - (window.parent.document.documentElement.scrollLeft || window.parent.document.body.scrollLeft);
			ppT.clientY = ppT.mouseY - (window.parent.document.documentElement.scrollTop || window.parent.document.body.scrollTop);
		}
		return ppT(path, sticky, wait);
	}
	var ClassName = 'pop_movie';
	if (typeof path === 'string'){
		if(path.match(/^thumb_([a-z]+)/i)) ClassName = 'pop_' + RegExp.$1;
		else if(path.match(/^thumb\/sg/i)) ClassName = 'pop_seiga';
		else if(path.match(/^thumb\/(im|mg)/i)) ClassName = 'pop_seiga_' + RegExp.$1;
		else if(path.match(/^embed\/lv/i)) ClassName = 'pop_live';
	}
	// Ctrlキー[17]を押して入れば sticky に
	sticky = (popThumb.key_now == 17) ? true : sticky;
	var HttpRequest = popThumb.HttpRequest;
	// 動画の場合はapiから取得
	if (path.match(/thumb\/(..\d+)/) || path.match(/thumb_([^\/]*?\/(co|ch)?\d+)/) || path.match(/embed\/(lv\d+)/)) {
		var pop_smid = popThumb.pop_smid = RegExp.$1.replace("/", "_");
		var use_VideoArrayAPI_this = popThumb.use_VideoArrayAPI;
		if (popThumb.use_VideoArrayAPI_so && pop_smid.indexOf("so") === 0) {
			use_VideoArrayAPI_this = true;
		}
		if (typeof popThumb.cancelTimeout === "function") popThumb.cancelTimeout(pop_smid);
		var elm = $('thumb_' + pop_smid);
		var search = popThumb.use_NicoCache_nl ? "?nlFilter" : "";
		// shiftをおしていた場合は一旦要素を削除して作り直す。＝更新
		var updateData = popThumb.key_now === 16 && !popThumb.recent_connect(pop_smid);
		if (updateData) {
			if (elm) {
				$('nico_popThumb_container').removeChild(elm);
				elm = null;
			}
			popThumb.debugLog(["updateData", pop_smid]);
			/*
			var isVideo = pop_smid.indexOf("_") === -1 && !/^(sg|im|mg)/.test(pop_smid) && pop_smid.indexOf('lv') !== 0;
			var propname_pop_smid = (isVideo && popThumb.use_VideoArrayAPI ? "va_" : "") + pop_smid;
			// 削除動画などでvideo.arrayから取得した場合用
			var delVideoArray = isVideo && !popThumb.use_VideoArrayAPI && popThumb.data[pop_smid] && !/<thumbnail_url>(.+)<\/thumbnail_url>/.test(popThumb.data[pop_smid][1]);
			delete popThumb.data[propname_pop_smid];
			if (delVideoArray) delete popThumb.data["va_" + pop_smid];
			if (popThumb.use_iframe && popThumb.isTop && typeof popThumb.save === "function") {
				popThumb.save(propname_pop_smid);
				if (delVideoArray) popThumb.save("va_" + pop_smid);
			}
			// 
			// ここもなくて良い。
			delete popThumb.data[pop_smid];
			delete popThumb.data["va_" + pop_smid];
			delete popThumb.data["obj_" + pop_smid];
			if (popThumb.use_iframe && popThumb.isTop && typeof popThumb.save === "function") {
				popThumb.save([pop_smid, "va_" + pop_smid, "obj_" + pop_smid]);
			}
			//*/
			if (popThumb.use_NicoCache_nl) search += "&" + new Date().getTime();
		}
		if (popThumb.use_in_JS_to_link) {
			search = search.replace(/nlFilter&?/, "");
			if (search === "?") search = "";
		}
		if (!elm && !popThumb.recent_connect(pop_smid)) {
			if (popThumb.use_iframe && popThumb.isTop){
				addIframe(pop_smid);
			} else {
				try {
					if (updateData) throw "updateData";
					if (pop_smid.indexOf("_") !== -1) {
						make_other(popThumb.data[pop_smid][1], pop_smid);
					} else if(/^(sg|im|mg)/.test(pop_smid)) {
						make_other(popThumb.data[pop_smid][1], pop_smid);
					} else if(pop_smid.indexOf('lv') === 0){
						make_other(popThumb.data[pop_smid][1], pop_smid);
					} else {
						if (popThumb.use_ObjectData) {
							make_from_object("", pop_smid, popThumb.data["obj_" + pop_smid][1]);
						} else {
							if (use_VideoArrayAPI_this) {
								make(popThumb.data["va_" + pop_smid][1], pop_smid);
							} else {
								make(popThumb.data[pop_smid][1], pop_smid);
							}
						}
					}
				} catch(e) {
					popThumb.recent_connect(pop_smid, 'add connection');	// 同じ動画の場合5秒間は再通信できないように
					if (pop_smid.indexOf("_") != -1) {
						HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb_" + pop_smid.replace("_", "/") + '?pop_FA', make_other, true, pop_smid, ['other', pop_smid]);
					} else if(/^(sg|im|mg)/.test(pop_smid)) {
						HttpRequest("http://" + location.host + "/pr_Redirect_ext.seiga.nicovideo.jp/thumb/" + pop_smid + '?pop_FA', make_other, true, pop_smid, ['seiga', pop_smid]);
					} else if(pop_smid.indexOf('lv') == 0){
						HttpRequest("http://" + location.host + "/pr_Redirect_live.nicovideo.jp/embed/" + pop_smid + '?pop_FA', make_other, true, pop_smid, ['live', pop_smid]);
					} else {
				//		var url = popThumb.use_VideoArrayAPI ? "i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&") : "ext.nicovideo.jp/api/getthumbinfo/" + pop_smid + search;
				//		var type = popThumb.use_VideoArrayAPI ? "array" : "api";
				//		HttpRequest("http://" + location.host + "/pr_Redirect_" + url, make, true, pop_smid, [type, pop_smid]);
						if (popThumb.use_ObjectData) {
							if (use_VideoArrayAPI_this) {
								HttpRequest("http://" + location.host + "/pr_Redirect_" + "i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&"), make_from_object, true, pop_smid, ["array", "va_" + pop_smid]);
							} else {
								HttpRequest("http://" + location.host + "/pr_Redirect_" + "ext.nicovideo.jp/api/getthumbinfo/" + pop_smid + search, make_from_object, true, pop_smid, ["api", pop_smid]);
							}
						} else {
							if (use_VideoArrayAPI_this) {
								HttpRequest("http://" + location.host + "/pr_Redirect_" + "i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&"), make, true, pop_smid, ["array", "va_" + pop_smid]);
							} else {
								HttpRequest("http://" + location.host + "/pr_Redirect_" + "ext.nicovideo.jp/api/getthumbinfo/" + pop_smid + search, make, true, pop_smid, ["api", pop_smid]);
							}
						}
					}
				}
			}
			return;	// 非同期通信でやるから一旦return. 取得できたらもう一回popThumb
		}
		// iframe内の場合はこれ以降未使用
		if (popThumb.use_iframe && popThumb.inIframe) return;
		// (マウスを素早く動かした場合など)要素ができてない場合は終了
		if(!elm) return;
		// popup	イベントでマウス位置が取得できてる場合
		if (popThumb.support) {
			// [f]を押しているときにfetchするように。keycode==70
			var fetchLink;
			if (popThumb.use_NicoCache_nl && popThumb.use_NicoFetch && popThumb.key_now == 70 && (fetchLink = $('nicofetch_pop_' + pop_smid, pop_smid))) {
				popThumb.nicofetch(fetchLink, pop_smid);
			}
			// [e]を押しているときに(作成者仕様)	keycode==69
			// if (popThumb.key_now == 69)	HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb/" + pop_smid + "?FL", function () { },	true, pop_smid);
			
			if ((popThumb.use_iframe || elm.tagName.toLowerCase() === "iframe") && popThumb.isTop) {
				var element = $('thumb_' + pop_smid, pop_smid);
				if (element) {
					elm.style.display = "block";
					element = element.getElementsByTagName("*")[0];
					elm.style.height = element.offsetHeight + 10 + "px";
					elm.style.width = element.offsetWidth + 10 + "px";
				}
			}
			popThumb.show(elm, pop_smid);
			// watchページでは 表示領域の上から10pxに固定（プレイヤーの奥にいってしまうため）
			if (/http:\/\/(www|nine)\.nicovideo\.jp\/watch\//.test(location.href) && !(popThumb.use_iframe || elm.tagName.toLowerCase() === "iframe")) {
				if(popThumb.useFixed){
					elm.style.top = '10px';
				} else {
					elm.style.top = (10 + (popThumb.mouseY - popThumb.clientY)) + 'px';
				}
			}
			// sticky==trueならnd()が動作しないように
			if (sticky) {
				popThumb.pop_smid = "";
			}
			popThumb.isSticky[pop_smid] = !!sticky;
		} else {
			if(typeof overlib === 'function'){
				ol_text = elm.innerHTML;
				ol_sticky = sticky;
				overlib();
			}
		}
		return;
	} else {
		if(typeof overlib == 'function'){
			var domain = /thumb\/(sg|im|mg)/.test(path) ? "ext.seiga.nicovideo.jp" : "ext.nicovideo.jp";
			var isThumb = location.href.indexOf("nicovideo.jp/thumb") != -1;
			ol_vauto = isThumb ? 0 : 1;
			ol_hauto = isThumb ? 0 : 1;
			ol_fgcolor = "white";
			ol_bgcolor = "#cccccc";
			ol_border = 5;
			ol_offsetx = 5;
			ol_offsety = 10;
			ol_sticky = sticky;
			ol_width = 565;
			ol_height = 290;
			ol_text = '<iframe width="555" height="290" src="http://' + domain + '/' + path + '" scrolling="no" style="border:solid 1px #CCC; z-index:15000;" frameborder="0"></iframe>';
			overlib();
		}
	}
	return;
	// 実行部分ここまで
	
	// 関数群は外に出したい
	
	// ここから関数群
	// getElementByIdのやつ
	function $(B, C) {
		if (typeof B === "string") {
			if (C && popThumb.isTop && (popThumb.use_iframe || $('thumb_' + C).tagName.toLowerCase() === "iframe")) {
				try {
					return $('thumb_' + C).contentWindow.document.getElementById(B);
				} catch(e){
					return null;
				}
			} else {
				return document.getElementById(B);
			}
		} else {
			return null;
			alert('popThumb_FA : $()がおかしい');
		}
	}
	function get_cache_title(eachSmid, pop_smid) {
		if(!popThumb.use_getCacheTitle) return;
		HttpRequest("http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_info?" + eachSmid, function (res, pop_smid) {
			if(res.match(/^OK(?:,[^,]*){3},0,(.*)$/)){
				var title = RegExp.$1 || 'null';
				var elem = $('pop_cache_title_' + pop_smid);
				if (!elem){
					window.setTimeout(function(){
						arguments.callee(res, pop_smid);
					}, 1000);
					return;
				}
				elem.innerHTML = title;
				elem.title = "クリックでキャッシュタイトルを変更できます(NicoCache_nl)";
				var func = function () {
					var input = document.createElement('input');
					input.type = 'text';
					input.value = title;
					input.title = '空欄で現在のニコニコでの動画タイトルに';
					input.style.width = '350px';
					input.style.width = '100%';
					input.style.border = 'solid 1px black';
					input.onkeydown = function(e){
						if (!e) e = window.event;
						if((e.keyCode || e.charCode || e.which) == 13){
							this.onblur();
						}
					};
					input.onblur = function () {
						this.onblur = null;
						var new_title = elem.firstChild.value;
						if (new_title != title) {
							HttpRequest("http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_title?" + eachSmid + (new_title != "" ? '-' + encodeURIComponent(new_title.replace(/[+]/g, "%2B")) : ""), function (res) {
								title = res.match(/^OK (.+)$/) ? RegExp.$1 : "";
								elem.innerHTML = title;
							},
							false);
						} else {
							elem.innerHTML = title;
						}
						elem.onclick = func;
					};
					
					elem.onclick = function(){};
					//elem.replaceChild(input, elem.firstChild);
					while (elem.firstChild) elem.removeChild(elem.firstChild);
					elem.appendChild(input);
					elem.firstChild.focus();
					elem.firstChild.select();
				};
				elem.onclick = func;
			}
		},
		true, pop_smid);
	}
	function make_from_object(res, pop_smid, object) {
		var pop_html = "";
		if (typeof object === "object") {
			var isVideoArray = !!object.usingAPI.videoarray;
			var isGetthumbinfo = !!object.usingAPI.getthumbinfo;
			
			var thumb_url = object.thumbnail_url;
			var isDeleted = object.deleted > 0;
			var needPay = object.video_options_ppv_type === 2; // 0：無料, 1:会員のみ, 2:有料 // video.arrayのみ判定可能のはず
			var title = object.title;
			var desc = object.description;
			if (popThumb.use_cachedVideoArrayAPI && object.description_videoarray) desc = object.description_videoarray;
			if (popThumb.use_in_JS_to_link) {
				// デコードした文字列(desc)を渡すとリンク化されて帰ってくる
				desc = popThumb.desc_to_link(desc, "popThumb_FA_link", pop_smid);
			}
			var cache = object.cache;
			var eachSmid = object.video_id;
			if (!eachSmid && /^[a-z]{2}/.test(pop_smid)) { 
				eachSmid = pop_smid;
			}
			if(!eachSmid){
				prompt("eachSmidが空（なにかのフィルタが誤爆している可能性あり）", "eachSmid = " + eachSmid + " : pop_smid = " + pop_smid + ':' + res);
			}
			
			var propname_pop_smid = "obj_" + pop_smid;
			if (popThumb.use_always_check && cache !== 'icon' && popThumb.data[propname_pop_smid] && popThumb.data[propname_pop_smid][2]) {// [2]過去のキャッシュから表示している時
				var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_info?" + eachSmid;
				var func = function (res) {
					if (res.match(/^OK,([^,]*),[^,]*,[^,]*,0,/)) {
						cache = RegExp.$1 === 'low' ? 'economy' : 'icon';
						popThumb.data[propname_pop_smid][1].cache = cache;
					}
				};
				var Async = false;
				HttpRequest(url, func, Async);
			}
			
			
			var posting = object.first_retrieve.match(/(20(\d+))-(\d+)-(\d+)T([0-9:]+).+/);
			if (posting) {
				var posting_day = "(" + ["日", "月", "火", "水", "木", "金", "土"][new Date(posting[1] + '/' + posting[3] + '/' + posting[4] + ' ' + posting[5]).getDay()] + ")";
				posting = posting[2] + '/' + posting[3] + '/' + posting[4] + posting_day + ' ' + posting[5];
			} else {
				posting = "error";
			}
			popThumb.debugLog(posting);
			// 動画長(秒), 動画長([分:秒]形式), 動画サイズ, コメント数, ビットレート, 最新コメント
			var length_s = object.length_in_seconds;
			var length = object.length;
			var size_high = Math.ceil(object.size_high / 1024 / 1024 * 10) / 10;
			var size_low = Math.ceil(object.size_low / 1024 / 1024 * 10) / 10;
			var movie_type = object.movie_type || 'error';
			var view = object.view_counter;
			var mylist = object.mylist_counter;
			var comment = object.comment_counter;
			var bit_rate = size_high ? Math.round(object.size_high / 1024 * 8 / length_s) : "(不明)";
			size_high = size_high || "(不明)";
			if(movie_type === 'swf' && size_high === size_low) size_low = 0;
			var last_res = object.last_res_body;
			if (!last_res) {
				// VideoArrayのみの時、公式動画の時最新コメントは取得できない
				if (!isGetthumbinfo || pop_smid.indexOf("so") === 0) {
					last_res = '<span style="color: blue; display:block;" title="クリックで最新コメント・コメント数受信" onclick="popThumb.getCommentInfo(this, \'' + pop_smid + '\')">[APIの仕様で最新コメント表示不可]</span>';
				} else {
					last_res = '<span style="color: #ccc">コメントはありません</span>';
				}
			}
		//	if (!last_res && res.match(/<thumb_type>mymemory<\/thumb_type>/)) {
		//		last_res = '<span style="color: blue">[マイメモリー]</span>';
		//	}
			var tags = {};
			var TagG = ['jp']; //['jp','tw', 'es', 'de']; // いつのまにか日本のタグしか見つからないようになってた。2013/10/25
			for (var tags_obj = object.tags, len = tags_obj.length, i = 0; i < len; i++) {
				for (var g = 0; TagG[g]; g++) {
					if (!tags[TagG[g]]) tags[TagG[g]] = [];
					if (tags_obj[i].domain === TagG[g]) {
						tags[TagG[g]].push(tags_obj[i]);
						break;
					}
				}
			}
			function tag_to_link(tag_obj){
				var result = '';
				if (tag_obj.category) {
					result += '<img src="http://res.nimg.jp/img/watch/ctg.png" alt="カテゴリ" style="vertical-align:middle; margin-right:2px;">';
				}
				if (tag_obj.lock) {
					result += '<span style="color:#f90; display:inline;" title="ロックされているタグ">★</span>';
				}
				var tag_encode = tag_obj.text;
				var tag_text = tag_encode.replace(/<[^<>]+>/g, "");//.replace(/<[a-z][^>]*>/ig, '');//.replace(/%/g, '%25').replace(/&quot;/g, '%22').replace(/#/g, '%23');
		//		desc = desc.replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&nbsp;/g, "").replace(/&amp;/g, "&");
				if (popThumb.use_in_JS_to_link) {
					tag_encode = popThumb.desc_to_link(tag_encode, "popThumb_FA_link", pop_smid);
				}
				//最初の [リンク以外のテキスト]を、そのタグ全ての文字列のTAG検索へ置換
				result += tag_encode.replace(/(^|<\/[^>]+>)([^<>]+)/, '$1<a href="http://www.nicovideo.jp/tag/' + tag_text + '">$2</a>');
				result += '　';
				
				return ' <nobr style="margin-right:3px;">' + result.replace(/　$/, "</nobr> ");
		//		return ' <span style="margin-right:3px;">' + result.replace(/　$/, "</span> ");
		//		return result;
			}
			var getTag = '<strong>TAG</strong> : ';
			getTag += '[ jp:'
			getTag += tags['jp'] ? tags['jp'].length : 0 ;
			for (var g = 1; TagG[g]; g++) {
				if (tags[TagG[g]]) {
					getTag += ' <span class="InternationalTag"><a href="javascript:void(0)" onclick="this.className= this.className ? \'\' : \'InternationalTag\';return false;" title="クリックでこの海外タグを表示 / 非表示">' + TagG[g] + ':' + tags[TagG[g]].length + '</a>';
					getTag += '<span>　【　';
					for (var i = 0; tags[TagG[g]][i]; i++) {
						getTag += tag_to_link(tags[TagG[g]][i]);
					}
					getTag += '】 </span>';
					getTag += '</span>';
				}
			}
			getTag += ' ] ';

			if (tags['jp']) {
				for (var i = 0; tags['jp'][i]; i++) {
					getTag += tag_to_link(tags['jp'][i]);
				}
				getTag = getTag.replace(/\s$/, "");
			} else {
				getTag += 'タグがありません  ';
			}
			var owner_link = '<span style="color:orange;">community !</span>';
			var user_id = object.user_id;
			if (user_id) {
				owner_link = '<a onmouseover="return popThumb(\'thumb_user/' + user_id + '\', 0)" onmouseout="return nd();" title="プロフィールへ"  href="http://www.nicovideo.jp/user/' + user_id + '" style="margin-left:5px;">投稿者ID: ' + user_id + '</a>';
				var user_name = object.user_nickname;
				if (user_name) {
					owner_link += ' ： <a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight: bold;">' + user_name + '</A>';
				} else {
					var thumb_id = thumb_url.match(/[/]smile[?]i=(\d+)/) ? RegExp.$1 : "";
					if (thumb_id && (popThumb.use_getOwner || popThumb.data['t_' + thumb_id]) || popThumb.data['u_' + user_id] || popThumb.data['user_' + user_id] && popThumb.data['user_' + user_id][0] != 'error') {
						owner_link += ' ： ';
						try { //コンテナにcacheがある場合
							if (typeof popThumb.data['u_' + user_id] !== "undefined") {
								var user_name = popThumb.data['u_' + user_id][1].match(/<title>([^<]*?)さんのユーザーページ/);
							} else if (typeof popThumb.data['user_' + user_id] !== "undefined" && popThumb.data['user_' + user_id][0] !== 'error') {
								var user_name = popThumb.data['user_' + user_id][1].match(/<title>([^<]*?)さんのプロフィール/);
							} else {
								var user_name = popThumb.data['t_' + thumb_id][1].match(/<strong>([^<]*?)<\/strong>\s+が投稿した動画/);
							}
							if (user_name) {
								user_name = user_name[1];
								owner_link += '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight: bold;">' + user_name + '</A>';
							} else {
								owner_link += '<span style="color:blue;">削除！</span>';
							}
						} catch(e) {
							owner_link += '<span id="nico_name_' + thumb_id + '"></span>';
							try {
								HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb_user/" + user_id, function (res, thumb_id) {
										var user_name = res.match(/<title>([^<]*?)さんのプロフィール/)[1];
										$('nico_name_' + thumb_id).innerHTML = '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight:bold;">' + user_name + '</a>';
								}, true, thumb_id, ['other', 'user_' + user_id]);
							} catch(e) {
								HttpRequest("http://" + location.host + "/pr_Redirect_www.upload.nicovideo.jp/allegation/" + thumb_id, function (res, thumb_id) {
									if (res.match(/<strong>([^<]*)<\/strong>\s+が投稿した動画/)) {
										var user_name = RegExp.$1;
										$('nico_name_' + thumb_id).innerHTML = '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight:bold;">' + user_name + '</a>';
									} else {
										$('nico_name_' + thumb_id).innerHTML = '<span style="color:blue;">削除！</span>';
									}
								}, true, thumb_id, ['name', 't_' + thumb_id]);
							}
						}
					} else {
						thumb_id = "";
					}
				}
			} else if (object.ch_id){
				owner_link = '<a style="color:orange;" href="http://ch.nicovideo.jp/channel/ch' + object.ch_id + '">' + (object.ch_name || 'community !') + '</a>';
			} else if(isVideoArray && !isGetthumbinfo){
				owner_link = '<span style="color:orange;">APIの仕様で投稿ユーザー不明</span>';
			}

			pop_html = '<div class="pop_thumb_frm ' + ClassName + '">';
			pop_html += '<div style="padding:4px;">';
			pop_html += '<p class="font10">';
			pop_html += ' 再生：<strong>' + popThumb.addFigure(view) + '</strong>';
			pop_html += ' コメント：<strong id="popThumb_FA_commentCount_' + pop_smid + '">' + popThumb.addFigure(comment) + '</strong>';
			pop_html += ' マイリスト：<strong>' + popThumb.addFigure(mylist) + '</strong>';
			// ここから [chart] - [ML-S] - [Dic]  
			pop_html += '<a style="margin-left:10px;" href="http://www.nicochart.jp/watch/' + eachSmid + '" title="NicoChart : ' + eachSmid + '">' + pop_smid + '</a>';
			pop_html += '<a style="margin-left:10px;" href="http://www.nicovideo.jp/openlist/' + eachSmid + '" title="公開マイリストを検索">Op-ML</a>';
			pop_html += '<a style="margin-left:10px;" href="http://dic.nicovideo.jp/v/' + eachSmid + '" title="この動画の大百科">DIC</a>';
			// ここまで
			if (popThumb.use_NicoCache_nl) {
				pop_html += '<a style="margin-left:10px; color:red;" title="キャッシュを消します(NicoCache_nl)" href="http://www.nicovideo.jp/cache/rm?' + eachSmid + '" onclick="return popThumb.delCache(\'' + eachSmid + '\', 0, this);">DEL</a>';
				pop_html += '<a style="margin-left:10px;" href="javascript:void(0);" title="クリックでキャッシュ移動用セレクトボックスが出ます(NicoCache_nl)" onclick="popThumb.cacheMove_init(this, \'' + eachSmid + '\', \'' + pop_smid + '\'); return false;">移動</a>';
			}
				
			pop_html += '</p>';
			pop_html += '<table border="0" cellpadding="0" cellspacing="0" summary="" style="margin-top:2px;"><tr valign="top">';
			pop_html += '<td class="font10"><p>';
			pop_html += '<a href="http://www.nicovideo.jp/watch/' + pop_smid + '">';
			pop_html += '<img alt="" src="' + thumb_url + '" class="video_img" />';
			pop_html += '</a>';
			if (cache) {
				pop_html += '<span class="cacheicon"><span>';
				pop_html += '<a href="http://www.nicovideo.jp/cache/' + eachSmid + '.flv">';
				pop_html += '<img src="http://www.nicovideo.jp/local/cache' + cache + '.gif" alt="キャッシュ" /></a></span></span>';
			}
			if (isDeleted) {
				pop_html += '<span  class="delicon"><span>';
				pop_html += '<img src="http://' + (popThumb.use_NicoCache_nl ? "www.nicovideo.jp/local" : "local.ptron") + '/Delete.gif" alt="Deleted" /></span></span>';
			}
			pop_html += '</p><p style="margin-top:2px;" class="popThumb_clearfix"><strong>' + length + '</strong>';
			if (eachSmid.indexOf("so") === 0) {
				if (isVideoArray) {
					if (needPay) pop_html += '<strong style="color:red; float:right;">有料</strong>';
					else pop_html += '<span style="float:right;">無料</span>';
				} else {
					pop_html += '<span style="float:right;"><a title="クリックで課金情報確認" href="javascript:void(0)" onclick="popThumb.getPaymentInfo(this, \'' + pop_smid + '\')">無料?</a></span>';
				}
			}
			pop_html +=  '</p>';
			
			pop_html += '<table border="0" cellpadding="0" cellspacing="0" class="movie_type font10"><tbody>';
			if (isGetthumbinfo) {
				pop_html += '<tr><td>通常画質</td><td>：</td><td>' + size_high + 'MB</td></tr>';
				pop_html += '<tr><td>レート</td><td>：</td><td>' + bit_rate + 'kbps</td></tr>';
			}
			pop_html += '<tr style="color:' + (!size_low ? 'blue' : 'red') + '"><td>エコノミー</td>	<td>：</td><td>' + size_low + 'MB</td></tr>';
			pop_html += '<tr><td>動画形式</td><td>：</td><td class="'+movie_type+'">' + movie_type + '</td></tr>';
			pop_html += '</tbody></table>';
			
			pop_html += '<td style="padding-left:4px; width:100%;"><p class="font10">';
			pop_html += '<strong>' + posting + '</strong> ';
			pop_html += '投稿 ';
			if (popThumb.use_NicoCache_nl && popThumb.use_NicoFetch){
				pop_html += '<a href="javascript:void(0)" onclick="popThumb.nicofetch(this,\'' + pop_smid + '\')" style="font-size:10px;" id="nicofetch_pop_' + pop_smid + '">fetch</a> ';
			}
			pop_html += owner_link;
			pop_html += '</p><p class="font12">';
			pop_html += '<a href="http://www.nicovideo.jp/watch/' + pop_smid + '" class="watch ' + (cache ? cache === "icon" ? "nico_cached" : "nico_cached_economy" : "") + '">' + title + '</a>';
			pop_html += '</p>';
			if (cache && popThumb.use_getCacheTitle) {
				pop_html += '<p class="font12" id="pop_cache_title_' + pop_smid + '">キャッシュタイトル受信中...</p>';
				get_cache_title(eachSmid, pop_smid);
			}
			pop_html += '<p class="font12">' + getTag + '</p>';
			pop_html += '<p class="font12 popThumb_FA_desc">' + desc + '</p></td></tr></table>';
			pop_html += '<div class="video_res">' + last_res + '</div>';
			pop_html += '</div></div>';
		} else { // 削除・コミュニティの場合
			function make_ext(res) {
				var pop_html = "";
				// 念のため<strong>の有無で確認
				if (res.indexOf('<strong>') != -1) {
					pop_html = '<div class="pop_thumb_frm ' + ClassName + '">';
					pop_html += res.match(/(<div style="padding:4px;">[\s\S]+?)<\/body>/im) ? RegExp.$1 : 'error';
					pop_html += '</div>';

					if (pop_html.match(/pop_cache_title_([^\"]*)/)) {
						if (popThumb.use_getCacheTitle) {
							var eachSmid = RegExp.$1;
							pop_html = pop_html.replace(new RegExp('pop_cache_title_' + eachSmid, "i"), 'pop_cache_title_' + pop_smid);
							get_cache_title(eachSmid, pop_smid);
						} else {
							pop_html = pop_html.replace('id="pop_cache_title_', 'style="display:none;" $&');
						}
					}
				}
				return pop_html;
			}
			// video.arrayから取得する設定じゃない（＝getthumbinfoから取得する設定）　かつ　getthumbinfoから取得
			if (!use_VideoArrayAPI_this && res.indexOf('<nicovideo_thumb_response') !== -1){
				// 削除動画・有料動画はvideo.arrayから取得
				HttpRequest("http://" + location.host + "/pr_Redirect_i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&"), make_from_object, true, pop_smid, ['array', "va_" + pop_smid]);
				return;
			}
			// video.arrayから取得する設定　かつ　video.arrayから取得
			if (use_VideoArrayAPI_this && res.indexOf('<nicovideo_video_response') !== -1){
				// ストリーミング配信動画（公式映画など）はgetthumbinfoから取得
				HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/api/getthumbinfo/" + pop_smid + search, make_from_object, true, pop_smid, ["api", pop_smid]);
				return;
			}
			try {
				if (popThumb.data[pop_smid][0] !== 'ext') {
					throw '強制エラー';
				}
				pop_html = make_ext(popThumb.data[pop_smid][1]);
			} catch(e) {
				pop_html = HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb/" + pop_smid + '?pop_FA', make_ext, false, null, ['ext', pop_smid]);
			}
		}
		addelm(pop_html, pop_smid);
	}
	function make(res, pop_smid) {
		var pop_html = "";
		var isVideoArray = /<count>\d+<\/count>/.test(res) && popThumb.data["va_" + pop_smid] && popThumb.data["va_" + pop_smid][0] === "array";
		var isGetthumbinfo = !isVideoArray && popThumb.data[pop_smid] && popThumb.data[pop_smid][0] === "api";
		// サムネurlは削除・コミュニティの場合は null なので除外
		if ((isVideoArray || isGetthumbinfo) && res.match(/<thumbnail_url>(.+)<\/thumbnail_url>/)) {
			var thumb_url = RegExp.$1;
			var isDeleted = /<deleted>[1-9][0-9]*<\/deleted>/.test(res);
			var needPay = /<ppv_type>2<\/ppv_type>/.test(res);// 0：無料, 1:会員のみ, 2:有料
			var title = res.match(/<title>(.+)<\/title>/) ? RegExp.$1 : '';
			var desc = res.match(/<description>([\s\S]+)<\/description>/) ? RegExp.$1 : '';
			if(popThumb.use_cachedVideoArrayAPI && !isVideoArray && popThumb.data["va_" + pop_smid] && popThumb.data["va_" + pop_smid][1].match(/<description>(.+?)<\/description>/)){
				desc = RegExp.$1;
			}
			desc = popThumb.unescapeHTML(desc);
	//		desc = desc.replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&nbsp;/g, "").replace(/&amp;/g, "&");
			if (popThumb.use_in_JS_to_link) {
				// デコードした文字列(desc)を渡すとリンク化されて帰ってくる
				desc = popThumb.desc_to_link(desc, "popThumb_FA_link", (isVideoArray ? "va_" : "") + pop_smid);
			}
			
			/* 現在のfirefoxでは word-break:break-all;は実装済み
			if (navigator.userAgent.indexOf("Gecko") > -1 && navigator.userAgent.indexOf("KHTML") == -1) {
				// firefoxはword-break:break-all;が未実装だった・・・
				desc = desc.replace(/(([^<>]|^)(<[^>]+>)*)/igm,'$1<wbr />');
			}
			*/
			// getthumbinfo / video.array
			var eachSmid = res.match(isGetthumbinfo ? /<video_id>(.+)<\/video_id>/ : /<video><id>(\w{2}\d+)<\/id>/) ? RegExp.$1 : "";
			var cache = res.match(/<cache>([^<]+)<\/cache>/) ? RegExp.$1 : '';
			if(eachSmid === "" && /^[a-z]{2}/.test(pop_smid)){ 
				eachSmid = pop_smid;
			}
			if(eachSmid === ""){
				prompt("eachSmidが空（なにかのフィルタが誤爆している可能性あり）", "eachSmid = " + eachSmid + " : pop_smid = " + pop_smid + ':' + res);
			}
			
			var propname_pop_smid = (use_VideoArrayAPI_this ? "va_" : "") + pop_smid;
			if (popThumb.use_always_check && cache !== 'icon' && popThumb.data[propname_pop_smid] && popThumb.data[propname_pop_smid][2]) {// [2]過去のキャッシュから表示している時
				var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_info?" + eachSmid;
				var func = function (res) {
					if (res.match(/^OK,([^,]*),[^,]*,[^,]*,0,/)) {
						cache = RegExp.$1 === 'low' ? 'economy' : 'icon';
						popThumb.data[propname_pop_smid][1] = popThumb.data[propname_pop_smid][1].replace(/<cache>[^<]+<\/cache>/g, '').replace(/<\/video_id>|<video><id>[^<]+<\/id>/, '$&<cache>' + cache + '</cache>');
					}
				};
				var Async = false;
				HttpRequest(url, func, Async);
			}
			
			
			var posting = object.first_retrieve.match(/(20(\d+))-(\d+)-(\d+)T([0-9:]+).+/);
			if (posting) {
				var posting_day = "(" + ["日", "月", "火", "水", "木", "金", "土"][new Date(posting[1] + '/' + posting[3] + '/' + posting[4] + ' ' + posting[5]).getDay()] + ")";
				posting = posting[2] + '/' + posting[3] + '/' + posting[4] + posting_day + ' ' + posting[5];
			} else {
				posting = "error";
			}
			
			// 動画長(秒), 動画長([分:秒]形式), 動画サイズ, コメント数, ビットレート, 最新コメント
			var length_s, length, size_high = "(不明)", comment = "不明", bit_rate = "(不明)", last_res;
			var movie_type = res.match(/<movie_type>(.*)<\/movie_type>/) ? RegExp.$1 : 'error';
			var size_low = res.match(/<size_low>(\d+)<\/size_low>/) ? Math.ceil(RegExp.$1 / 1024 / 1024 * 10) / 10 : 0;
			var view = res.match(/<view_counter>(.+)<\/view_counter>/) ? RegExp.$1 : 'error';
			var mylist = res.match(/<mylist_counter>(.+)<\/mylist_counter>/) ? RegExp.$1 : 'error';
			var tags = {};
			var TagG = ['jp']; //['jp','tw', 'es', 'de']; // いつのまにか日本のタグしか見つからないようになってた。2013/10/25
			if (isVideoArray) {
				length_s = res.match(/<length_in_seconds>(.+)<\/length_in_seconds>/) ? parseInt(RegExp.$1) : 1;
				var length_m = length_s / 60 | 0;
				length = length_m + ":" + ("0" + (length_s - length_m * 60)).slice(-2);
				comment = res.match(/<num_res>([1-9]\d*)<\/num_res>/) ? RegExp.$1 : comment;
				// 公式アニメではコメント数が0になる
	//			if (comment === "0" && eachSmid.indexOf("so") === 0) comment = "不明";
				last_res = '<span style="color: blue">[APIの仕様で最新コメント表示不可]</span>';
				// TAG の取得
				var tmp_all_tags = res.match(new RegExp('<tag_info>([\\s\\S]*?)</tag_info>', "g")) || [];
				for (var len = tmp_all_tags.length, i = 0; i < len; i++) {
					for (var g = 0; TagG[g]; g++) {
						if (!tags[TagG[g]]) tags[TagG[g]] = [];
						if (tmp_all_tags[i].match(new RegExp('(<tag>[\\s\\S]*?</tag>)<area>' + TagG[g] + '</area>', ""))) {
							tags[TagG[g]].push(RegExp.$1);
							break;
						}
					}
				}
			} else {
				length = res.match(/<length>(.+)<\/length>/) ? RegExp.$1 : 'error';
				length_s = length.match(/^(\d+):(\d+)$/) ? parseInt(RegExp.$2) + parseInt(RegExp.$1) * 60 : 1;
				size_high = res.match(/<size_high>(\d+)<\/size_high>/) ? Math.ceil(RegExp.$1 / 1024 / 1024 * 10) / 10 : 0;
				if(movie_type == 'swf' && size_high == size_low) size_low = 0;
				bit_rate = res.match(/<size_high>(\d+)<\/size_high>/) ? Math.round(RegExp.$1 / 1024 * 8 / length_s) : 0;
				comment = res.match(/<comment_num>(.+)<\/comment_num>/) ? RegExp.$1 : 'error';
				last_res = res.match(/<last_res_body>(.+)<\/last_res_body>/) ? RegExp.$1 : '';
				last_res = popThumb.unescapeHTML(last_res);
				if (!last_res && res.match(/<thumb_type>mymemory<\/thumb_type>/)) {
					last_res = '<span style="color: blue">[マイメモリー]</span>';
				}
				
				// TAG の取得
				for (var g = 0; TagG[g]; g++) {
					var reg = new RegExp('<tags domain="' + TagG[g] + '">([\\s\\S]*?)</tags>', "");
					tags[TagG[g]] = (res.match(reg) ? RegExp.$1 : '').match(/<tag[^>]*>(.*)<\/tag>/g);
				}
			}
			function tag_to_link(text){
				text = popThumb.unescapeHTML(text);
				var result = '';
				if(/<tag\s[^>]*?category="1"/.test(text)){
					result += '<img src="http://res.nimg.jp/img/watch/ctg.png" alt="カテゴリ" style="vertical-align:middle; margin-right:2px;">';
				}
				if(/<tag\s[^>]*?lock="1"/.test(text)){
					result += '<span style="color:#f90; display:inline;" title="ロックされているタグ">★</span>';
				}
				if(text.match(/<tag[^>]*>(.*?)<\/tag>/)){	// HTMLエンード
					var tag_encode = RegExp.$1;
					var tag_text   = tag_encode.replace(/<[^>]*>/g, '').replace(/%/g, '%25').replace(/&quot;/g, '%22').replace(/#/g, '%23');
			//		desc = desc.replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&nbsp;/g, "").replace(/&amp;/g, "&");
					if (popThumb.use_in_JS_to_link) {
						tag_encode = popThumb.desc_to_link(tag_encode, "popThumb_FA_link", (isVideoArray ? "va_" : "") + pop_smid);
					}
					//最初の [リンク以外のテキスト]を、そのタグ全ての文字列のTAG検索へ置換
					result += tag_encode.replace(/(^|<\/[^>]+>)([^<>]+)/, '$1<a href="http://www.nicovideo.jp/tag/' + tag_text + '">$2</a>');
					result += '　';
				}
				return ' <nobr style="margin-right:3px;">' + result.replace(/　$/, "</nobr> ");
				return ' <span style="margin-right:3px;">' + result.replace(/　$/, "</span> ");
				return result;
			}
			var getTag = '<strong>TAG</strong> : ';
			getTag += '[ jp:'
			getTag += tags['jp'] ? tags['jp'].length : 0 ;
			for (var g = 1; TagG[g]; g++) {
				if (tags[TagG[g]]) {
					getTag += ' <span class="InternationalTag"><a href="javascript:void(0)" onclick="this.className= this.className ? \'\' : \'InternationalTag\';return false;" title="クリックでこの海外タグを表示 / 非表示">' + TagG[g] + ':' + tags[TagG[g]].length + '</a>';
					getTag += '<span>　【　';
					for (var i = 0; tags[TagG[g]][i]; i++) {
						getTag += tag_to_link(tags[TagG[g]][i]);
					}
					getTag += '】 </span>';
					getTag += '</span>';
				}
			}
			getTag += ' ] ';

			if (tags['jp']) {
				for (var i = 0; tags['jp'][i]; i++) {
					getTag += tag_to_link(tags['jp'][i]);
				}
				getTag = getTag.replace(/\s$/, "");
			} else {
				getTag += 'タグがありません  ';
			}
			var owner_link = '<span style="color:orange;">community !</span>';
			if (res.match(/<user_id>(\d+)<\/user_id>/)) {
				var user_id = RegExp.$1;
				var thumb_id = res.match(/<thumbnail_url>[^<]*?\/smile\?i=(\d+)<\/thumbnail_url>/) ? RegExp.$1 : "";
				owner_link = '<a onmouseover="return popThumb(\'thumb_user/' + user_id + '\', 0)" onmouseout="return nd();" title="プロフィールへ"  href="http://www.nicovideo.jp/user/' + user_id + '" style="margin-left:5px;">投稿者ID: ' + user_id + '</a>';
				if (thumb_id && (popThumb.use_getOwner || popThumb.data['t_' + thumb_id]) || popThumb.data['u_' + user_id] || popThumb.data['user_' + user_id] && popThumb.data['user_' + user_id][0] != 'error') {
					owner_link += ' ： ';
					try { //コンテナにcacheがある場合
						if (typeof popThumb.data['u_' + user_id] !== "undefined") {
							var user_name = popThumb.data['u_' + user_id][1].match(/<title>([^<]*?)さんのユーザーページ/);
						} else if (typeof popThumb.data['user_' + user_id] !== "undefined" && popThumb.data['user_' + user_id][0] !== 'error') {
							var user_name = popThumb.data['user_' + user_id][1].match(/<title>([^<]*?)さんのプロフィール/);
						} else {
							var user_name = popThumb.data['t_' + thumb_id][1].match(/<strong>([^<]*?)<\/strong>\s+が投稿した動画/);
						}
						if (user_name) {
							user_name = user_name[1];
							owner_link += '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight: bold;">' + user_name + '</A>';
						} else {
							owner_link += '<span style="color:blue;">削除！</span>';
						}
					} catch(e) {
						owner_link += '<span id="nico_name_' + thumb_id + '"></span>';
						try {
							HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb_user/" + user_id, function (res, thumb_id) {
									var user_name = res.match(/<title>([^<]*?)さんのプロフィール/)[1];
									$('nico_name_' + thumb_id).innerHTML = '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight:bold;">' + user_name + '</a>';
							}, true, thumb_id, ['other', 'user_' + user_id]);
						} catch(e) {
							HttpRequest("http://" + location.host + "/pr_Redirect_www.upload.nicovideo.jp/allegation/" + thumb_id, function (res, thumb_id) {
								if (res.match(/<strong>([^<]*)<\/strong>\s+が投稿した動画/)) {
									var user_name = RegExp.$1;
									$('nico_name_' + thumb_id).innerHTML = '<a title=ニコニコチャートへ href="http://www.nicochart.jp/name/?s=' + encodeURIComponent(user_name) + '" style="color:#F30; font-weight:bold;">' + user_name + '</a>';
								} else {
									$('nico_name_' + thumb_id).innerHTML = '<span style="color:blue;">削除！</span>';
								}
							}, true, thumb_id, ['name', 't_' + thumb_id]);
						}
					}
				} else {
					thumb_id = "";
				}
			} else if(isVideoArray){
				owner_link = '<span style="color:orange;">APIの仕様で投稿ユーザー不明</span>';
			}

			pop_html = '<div class="pop_thumb_frm ' + ClassName + '">';
			pop_html += '<div style="padding:4px;">';
			pop_html += '<p class="font10">';
			pop_html += ' 再生：<strong>' + popThumb.addFigure(view) + '</strong>';
			pop_html += ' コメント：<strong>' + popThumb.addFigure(comment) + '</strong>';
			pop_html += ' マイリスト：<strong>' + popThumb.addFigure(mylist) + '</strong>';
			// ここから [chart] - [ML-S] - [Dic]  
			pop_html += '<a style="margin-left:10px;" href="http://www.nicochart.jp/watch/' + eachSmid + '" title="NicoChart : ' + eachSmid + '">' + pop_smid + '</a>';
			pop_html += '<a style="margin-left:10px;" href="http://www.nicovideo.jp/openlist/' + eachSmid + '" title="公開マイリストを検索">Op-ML</a>';
			pop_html += '<a style="margin-left:10px;" href="http://dic.nicovideo.jp/v/' + eachSmid + '" title="この動画の大百科">DIC</a>';
			// ここまで
			if (popThumb.use_NicoCache_nl) {
				pop_html += '<a style="margin-left:10px; color:red;" title="キャッシュを消します(NicoCache_nl)" href="http://www.nicovideo.jp/cache/rm?' + eachSmid + '" onclick="return popThumb.delCache(\'' + eachSmid + '\', 0, this);">DEL</a>';
				pop_html += '<a style="margin-left:10px;" href="javascript:void(0);" title="クリックでキャッシュ移動用セレクトボックスが出ます(NicoCache_nl)" onclick="popThumb.cacheMove_init(this, \'' + eachSmid + '\', \'' + pop_smid + '\'); return false;">移動</a>';
			}
				
			pop_html += '</p>';
			pop_html += '<table border="0" cellpadding="0" cellspacing="0" summary="" style="margin-top:2px;"><tr valign="top">';
			pop_html += '<td class="font10"><p>';
			pop_html += '<a href="http://www.nicovideo.jp/watch/' + pop_smid + '">';
			pop_html += '<img alt="" src="' + thumb_url + '" class="video_img" />';
			pop_html += '</a>';
			if (cache) {
				pop_html += '<span class="cacheicon"><span>';
				pop_html += '<a href="http://www.nicovideo.jp/cache/' + eachSmid + '.flv">';
				pop_html += '<img src="http://www.nicovideo.jp/local/cache' + cache + '.gif" alt="キャッシュ" /></a></span></span>';
			}
			if (isDeleted) {
				pop_html += '<span  class="delicon"><span>';
				pop_html += '<img src="http://' + (popThumb.use_NicoCache_nl ? "www.nicovideo.jp/local" : "local.ptron") + '/Delete.gif" alt="Deleted" /></span></span>';
			}
			pop_html += '</p><p style="margin-top:2px;"><strong>' + length + '</strong>';
			if (needPay) pop_html += '<strong style="color:red; float:right;">有料</strong>';
			pop_html +=  '</p>';
			
			pop_html += '<table border="0" cellpadding="0" cellspacing="0" class="movie_type font10"><tbody>';
			if (isGetthumbinfo) {
				pop_html += '<tr><td>通常画質</td><td>：</td><td>' + size_high + 'MB</td></tr>';
				pop_html += '<tr><td>レート</td><td>：</td><td>' + bit_rate + 'kbps</td></tr>';
			}
			pop_html += '<tr style="color:' + (!size_low ? 'blue' : 'red') + '"><td>エコノミー</td>	<td>：</td><td>' + size_low + 'MB</td></tr>';
			pop_html += '<tr><td>動画形式</td><td>：</td><td class="'+movie_type+'">' + movie_type + '</td></tr>';
			pop_html += '</tbody></table>';
			
			pop_html += '<td style="padding-left:4px; width:100%;"><p class="font10">';
			pop_html += '<strong>' + posting + '</strong> ';
			pop_html += '投稿 ';
			if (popThumb.use_NicoCache_nl && popThumb.use_NicoFetch){
				pop_html += '<a href="javascript:void(0)" onclick="popThumb.nicofetch(this,\'' + pop_smid + '\')" style="font-size:10px;" id="nicofetch_pop_' + pop_smid + '">fetch</a> ';
			}
			pop_html += owner_link;
			pop_html += '</p><p class="font12">';
			pop_html += '<a href="http://www.nicovideo.jp/watch/' + pop_smid + '" class="watch ' + (cache ? cache === "icon" ? "nico_cached" : "nico_cached_economy" : "") + '">' + title + '</a>';
			pop_html += '</p>';
			if (cache && popThumb.use_getCacheTitle) {
				pop_html += '<p class="font12" id="pop_cache_title_' + pop_smid + '">キャッシュタイトル受信中...</p>';
				get_cache_title(eachSmid, pop_smid);
			}
			pop_html += '<p class="font12">' + getTag + '</p>';
			pop_html += '<p class="font12 popThumb_FA_desc">' + desc + '</p></td></tr></table>';
			if (!use_VideoArrayAPI_this) {
				pop_html += '<div class="video_res">';
				pop_html += last_res || '<span style="COLOR: #ccc">コメントはありません</span>';
				pop_html += '</div>';
			}
			pop_html += '</div></div>';
		} else { // 削除・コミュニティの場合
			function make_ext(res) {
				var pop_html = "";
				// 念のため<strong>の有無で確認
				if (res.indexOf('<strong>') != -1) {
					pop_html = '<div class="pop_thumb_frm ' + ClassName + '">';
					pop_html += res.match(/(<div style="padding:4px;">[\s\S]+?)<\/body>/im) ? RegExp.$1 : 'error';
					pop_html += '</div>';

					if (pop_html.match(/pop_cache_title_([^\"]*)/)) {
						if (popThumb.use_getCacheTitle) {
							var eachSmid = RegExp.$1;
							pop_html = pop_html.replace(new RegExp('pop_cache_title_'+eachSmid, "i"), 'pop_cache_title_'+pop_smid);
							get_cache_title(eachSmid, pop_smid);
						} else {
							pop_html = pop_html.replace('id="pop_cache_title_', 'style="display:none;" $&');
						}
					}
				}
				return pop_html;
			}
		//	if (res.indexOf("<code>COMMUNITY</code>") !== -1 || res.indexOf("<code>NOT_FOUND</code>") !== -1){
			if (!isVideoArray) {
				// 削除動画・有料動画はvideo.arrayから取得
				try {
					make(popThumb.data["va_" + pop_smid][1], pop_smid);
				} catch (e) {
					HttpRequest("http://" + location.host + "/pr_Redirect_i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&"), make, true, pop_smid, ['array', "va_" + pop_smid]);
				}
				return;
			}
			try {
				if (popThumb.data[pop_smid][0] !== 'ext') {
					throw '強制エラー';
				}
				pop_html = make_ext(popThumb.data[pop_smid][1]);
			} catch(e) {
				pop_html = HttpRequest("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/thumb/" + pop_smid + '?pop_FA', make_ext, false, null, ['ext', pop_smid]);
			}
		}
		addelm(pop_html, pop_smid);
	}
	function make_other(res, pop_smid) {
		var pop_html = "";
		if (res.match(/<body[^>]*>([\s\S]*?)<\/body>/im)) {
			var body = RegExp.$1;
			pop_html = '<div class="' + ClassName + '">';
			if (pop_smid.match(/^(community|channel|lv[0-9])/i)) {
				pop_html += body.replace(/(<[^<>]*)\sid=/ig, '$1 class=');
			} else {
				// 漫画mg～
				if (body.match(/((?:<div style="padding:4px;">|<div class="blogpartsArea">)[\s\S]+)$/im)){
					pop_html += RegExp.$1;
				} else {	// 非公開ページ(主にuser用)
					popThumb.data[pop_smid][0] = 'error';
					pop_html += body.match(/<\/table>([\s\S]+)$/im) ? RegExp.$1 : 'error';
				}
			}
			pop_html += '</div>';
		}
		addelm(pop_html, pop_smid);
	}
	function addIframe(pop_smid){
		var element = document.createElement('iframe');
		var base = popThumb.use_NicoCache_nl ? "www.nicovideo.jp/local" : "local.ptron";
		var stickyParam = sticky ? "&sticky=1" : "";
		element.src = "http://" + location.host + "/pr_Redirect_" + base + "/popThumb_FA_iframe.html?" + path + stickyParam;
		element.id = 'thumb_' + pop_smid;
		element.style.display = 'none';
		$('nico_popThumb_container').appendChild(element);
		if (popThumb.use_SenBroStyle) {
			var from = null;
			element.onmouseover = function(e){
				if (popThumb.isSticky[pop_smid]) return popThumb.history = ",";
				popThumb.cancelTimeout(pop_smid);
//				console.log("ndキャンセル" + id);
				if (!from || from.tagName === "IFRAME_no_match") {
					if (!e) e = window.event;
					from = e.fromElement || e.relatedTarget || from;
				}
				if (!popThumb.history.match(",thumb_" + pop_smid + ",")) popThumb.history += "thumb_" + pop_smid + ",";
			};
			element.onmouseout = function(e){
				if (popThumb.isSticky[pop_smid]) return;
				if (popThumb.move) return;
				if (!e) e = window.event;
				if ((e.target || e.srcElement) == element) {
					var to = e.toElement || e.relatedTarget || {tagName:"null"};
					if (to.tagName === "IFRAME" && to.style.zIndex > this.style.zIndex) return;
					this.style.display = "none";
					popThumb.HideHistorys(pop_smid, to.id);
				}
			};
			popThumb.isSticky[pop_smid] = !!sticky;
		}
	}
	function addelm(pop_html, pop_smid){
		pop_html = pop_html.replace(new RegExp("popThumb[0-9]?\\('thumb[/_]" + pop_smid.replace(/_/, "/") + "(?:[?][^']*)?'[^\"]*(\"[^>]*?)onmouseout.*?\"[^\"]*\"", "ig"), '$1 title="canceled same popup."');
		var element = document.createElement('div');
		element.id = 'thumb_' + pop_smid;
		var close = "";
		if (!popThumb.use_iframe) {
			element.onmousedown = function(){
				this.style.zIndex = popThumb.z_index();
				if(popThumb.key_now === 17){
					popThumb.move = ['thumb_' + pop_smid];
					popThumb.isSticky[pop_smid] = true;
				}
			};
			element.onmouseup = function(){
				popThumb.move = false;
			};
			element.onselectstart = function(){
				if(popThumb.move){
					return false;
				}
			};
			element.style.display = 'none';
			close = '<p style="top: 0px; right:0px; position:absolute;" class="font12" onmouseover="document.getElementById(\'thumb_' + pop_smid + '\').style.display = \'none\';">閉じる</p>';
		} else {
			if (popThumb.inIframe) {
				element.onmousedown = function(){
					window.parent.document.getElementById('thumb_' + pop_smid).style.zIndex = window.parent.popThumb.z_index();
					window.parent.popThumb.key_now = "";
					if(popThumb.key_now === 17){
						popThumb.move = ['thumb_' + pop_smid];
						window.parent.popThumb.isSticky[pop_smid] = true;
					}
				};
				element.onmouseup = function(){
					popThumb.move = false;
				};
				element.onselectstart = function(){
					if(popThumb.move){
						return false;
					}
				};
				close = '<p style="top: 0px; right:0px; position:absolute;" class="font12" onmouseover="window.parent.document.getElementById(\'thumb_' + pop_smid + '\').style.display = \'none\';">閉じる</p>';
			}
		}
		if (pop_html) {
			pop_html += close;
		} else {	//	存在しないsmid(桁数が多い場合)
			pop_html = '<div class="font12 pop_error"><P>エラーだって</P>';
			pop_html += close;
			pop_html += "<p>正id候補↓(元：" + pop_smid + ")</p>";
			sticky = true;
			for (var i = 1; i <= 2; i++) {
				var cut = pop_smid.slice(0, -i);
				pop_html += '<p><a onmouseover="return popThumb(\'thumb/' + cut + '\', 0);" onmouseout="return nd();" class="watch" href="http://www.nicovideo.jp/watch/' + cut + '">' + cut + '</a></p>';
			}
			pop_html += '</div>';
		}
		element.innerHTML = pop_html;
		$('nico_popThumb_container').appendChild(element);
		if (popThumb.use_SenBroStyle && !popThumb.use_iframe) {
			element.onmouseover = function(){
				if (popThumb.isSticky[pop_smid]) return popThumb.history = ",";
				popThumb.cancelTimeout(pop_smid);
				if (!popThumb.history.match(",thumb_" + pop_smid + ",")) popThumb.history += "thumb_" + pop_smid + ",";
			};
			element.onmouseout = function (e) {
				if (popThumb.isSticky[pop_smid]) return popThumb.EventStop(e);
				if (popThumb.move) return popThumb.EventStop(e);
				if (!e) e = window.event;
				var to = e.toElement || e.relatedTarget || {};
				if ((e.target || e.srcElement) == this) {
					while(to){
						// 内側へ移動(mouseout)なら消さない
						if (to == this) return popThumb.EventStop(e);
						if ((to.parentNode || {}).id === "nico_popThumb_container") popThumb.HideHistorys(pop_smid, to.id);
						to = to.parentNode;
					}
					this.style.display = "none";
					popThumb.HideHistorys(pop_smid, "");
					return;
				}
				// cacheタイトル変更時に消えてしまうの対策
				// 対象の場所が移動する(deleteやreplace)とアウト？
				if (to.parentNode === null) return popThumb.EventStop(e);
				while(to){
					if (to == this || to.id === "nico_popThumb_container") return popThumb.EventStop(e);
					if ((to.parentNode || {}).id === "nico_popThumb_container" && to.style.zIndex < this.style.zIndex)  popThumb.HideHistorys(pop_smid, to.id);
					to = to.parentNode;
				}
	//			console.log("element.onmouseout();");
				this.style.display = "none";
				popThumb.HideHistorys(pop_smid, "");
			};
		}
		popThumb.isSticky[pop_smid] = !!sticky;
		if (pop_smid == popThumb.pop_smid || sticky){
			popThumb(path, sticky, 0);
		}
		if (popThumb.use_iframe && popThumb.inIframe) {
			if (pop_smid == window.parent.popThumb.pop_smid || sticky) {
				window.setTimeout(function(){
					window.parent.popThumb(path, sticky, 0);
				}, 20);
			}
		}
	}
}

(function (A) {
	// 色々定義
	A.inIframe = location.pathname.indexOf("/popThumb_FA_iframe.html") !== -1;
	// parent自身であるか、一つ上にpopThumbが存在しない場合 / popThumb_FA_iframe.htmlでない場合これがTop
	try {
		A.isTop = window == window.parent || !A.inIframe || !window.parent.popThumb;
	} catch (e){
		A.isTop = true;
	}
	A.useFixed = false; // trueならスクロールしても位置が固定だが、fixedに対応していれば全てのページで安定した表示
	A.z_index = (function () {
		var i = 10000;
		return function () {
			return i++;
		};
	})();
	//	最後にpopupしたid
	A.pop_smid = '';
	//	キャッシュ
	A.data = [];
	//	移動中?
	A.move = false;
	A.isIE = false;
	//	マウス位置取得の可否
	A.support = true;
	// ニコニコ動画内( = cookie使用可能)
	A.inNicoVideo = location.host.indexOf(".nicovideo.jp") != -1;
	// 専ブラ風に表示 数字以外の場合は無効に
	if (A.use_SenBroStyle && typeof A.use_SenBroStyle !== "number") A.use_SenBroStyle = false;
	// 専ブラ風に表示させるとき、上下どちら側に表示させているか。
	if (A.use_SenBroStyle) {
		A.ichi = {};
		A.timeoutID = {};
		A.cancelTimeout = function(pop_smid){
			var id = popThumb.timeoutID[pop_smid];
			if (id) {
				window.clearTimeout(id);
				delete popThumb.timeoutID[pop_smid];
			}
			
		}
		if (A.use_iframe && A.inIframe) {
			A.ichi = window.parent.popThumb.ichi;
			A.timeoutID = window.parent.popThumb.timeoutID;
		}
	}
	// マウスが出ても消さない要素を保存
	A.isSticky = {};
	// keyが押されている場合に'A.key_now'他　にkeycodeを保存。
	var move = function () { // 移動用function	Ctrlを押してマウスダウンで移動開始可能
		if (A.move) {
			if (A.use_iframe && A.inIframe) {
				if (typeof A.move[1] === "undefined") {
					A.move[1] = A.mouseX;
					A.move[2] = A.mouseY;
				}
				A.framePos.mouseX += A.mouseX - A.move[1];
				A.framePos.mouseY += A.mouseY - A.move[2];
				if(window.parent.popThumb.useFixed){
					var mouseX = A.framePos.mouseX - (window.parent.document.documentElement.scrollLeft || window.parent.document.body.scrollLeft);
					var mouseY = A.framePos.mouseY - (window.parent.document.documentElement.scrollTop || window.parent.document.body.scrollTop);
				} else {
					var mouseX = A.framePos.mouseX;
					var mouseY = A.framePos.mouseY;
				}
				var elm = window.parent.document.getElementById(A.move[0]);
				elm.style.top = mouseY + 'px';
				elm.style.left = mouseX + 'px';
			} else {
				var elm = document.getElementById(A.move[0]);
				if (typeof A.move[1] === "undefined") {
					A.move[1] = parseInt(elm.style.left) - A.mouseX;
					A.move[2] = parseInt(elm.style.top) - A.mouseY;
				}
				elm.style.left = A.mouseX + A.move[1] + 'px';
				elm.style.top = A.mouseY + A.move[2] + 'px';
			}
			try {
				document.getElementById('nico_popThumb_container').className = "draggable";
			} catch(e) {}
		} else {
			if (A.key_now !== 17){
				try {
					document.getElementById('nico_popThumb_container').className = "";
				} catch(e) {}
			}
		}
	};
	// キーボードが押されたときに起動する関数の配列
	A.keyDownFuncs = [];
	A.keyDownFuncs.push(function(event, keyCode){
		// Ctrlだったら
		if (keyCode === 17){
			try {
				document.getElementById('nico_popThumb_container').className = "draggable";
			} catch(e) {}
		}
	});
	// キーボードが上がったときに起動する関数の配列
	A.keyUpFuncs = [];
	A.keyUpFuncs.push(function(event, keyCode){
		try {
			document.getElementById('nico_popThumb_container').className = "";
		} catch(e) {}
	});
	if (typeof window.addEventListener === "function") {
		window.addEventListener("mousemove", function (event) {
			if (popThumb.use_SenBroStyle) {
				A.preMouseY = A.mouseY;
			}
			A.mouseX = event.pageX;
			A.mouseY = event.pageY;
			A.clientX = event.clientX;
			A.clientY = event.clientY;
			move();
		}, false);
		document.body.addEventListener("keydown", function (event) {
			A.key_now = event.which;
			for (var i = 0,len = A.keyDownFuncs.length; i < len; i++){
				A.keyDownFuncs[i](event, A.key_now);
			}
		}, false);
		window.addEventListener("keydown", function (event) {
			A.key_now = event.which;
			for (var i = 0,len = A.keyDownFuncs.length; i < len; i++){
				A.keyDownFuncs[i](event, A.key_now);
			}
		}, false);
		document.body.addEventListener("keyup", function (event) {
			A.key_now = "";
			for (var i = 0,len = A.keyUpFuncs.length; i < len; i++){
				A.keyUpFuncs[i](event, A.key_now);
			}
		}, false);
		window.addEventListener("keyup", function (event) {
			A.key_now = "";
			for (var i = 0,len = A.keyUpFuncs.length; i < len; i++){
				A.keyUpFuncs[i](event, A.key_now);
			}
		}, false);
		window.addEventListener("blur", function () {
			A.key_now = "";
			A.move = false;
		}, false);
	} else if (window.attachEvent){
		document.body.attachEvent('onmousemove', function () {
			if (popThumb.use_SenBroStyle) {
				A.preMouseY = A.mouseY;
			}
			A.mouseX = window.event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft);
			A.mouseY = window.event.clientY + (document.documentElement.scrollTop || document.body.scrollTop);
			A.clientX = window.event.clientX;
			A.clientY = window.event.clientY;
			move();
		});
		document.body.attachEvent('onkeydown', function () {
			A.key_now = window.event.keyCode;
			for (var i = 0,len = A.keyDownFuncs.length; i < len; i++){
				A.keyDownFuncs[i](event, A.key_now);
			}
		});
		document.body.attachEvent('onkeyup', function () {
			A.key_now = "";
			for (var i = 0,len = A.keyUpFuncs.length; i < len; i++){
				A.keyUpFuncs[i](event, A.key_now);
			}
		});
		window.attachEvent('onblur', function () {
			A.key_now = "";
			A.move = false;
		});
		A.isIE = true;
	} else {
		alert('popThumb_FA : マウス位置の取得ができないため全ての機能を使えません。\r\n見栄えも悪いです。');
		A.support = false;
	}
	A.addEvent = function(obj, type, func, useCapture){
		if (typeof window.addEventListener === "function") {
			obj.addEventListener(type, func, !!useCapture );
		} else if (window.attachEvent) {
			obj.attachEvent('on' + type, func);
		}
	};
	A.EventStop = function (evt) {
		if (evt.preventDefault) {
			evt.preventDefault();
			evt.stopPropagation();
		} else {
			evt.returnValue = false;
			evt.cancelBubble = true;
		}
	};
	// 移動中は選択されないように
	A.addEvent(document.body, "selectstart", function(e){
		if(popThumb.move){
			popThumb.EventStop(e);
			return false;
		}
	}, false);
	// 表示順
	A.history = ",";
	A.HideHistorys = function (pop_smid, toID){
		if (popThumb.history.match(",thumb_" + pop_smid + ",")) {
			var hist = popThumb.history.split("," + toID + ",");
			if (hist.length === 1) {
				// id付きiframe以外 → 全部非表示
				var arr = hist[0].split(",").slice(1,-1);
				popThumb.history = ",";
			} else {
				// 一部非表示
				var arr = hist[1].split(",").slice(0,-1);
				popThumb.history = hist[0] + ",";
			}
			for (var i = 0, len = arr.length; i < len; i++){
				document.getElementById(arr[i]).style.display = "none";
			}
		}
	};
	A.recent_connect = (function(){
		var timeoutID;
		var last_id = ',';
		return function(pop_smid, connect){
			if (connect) {
				last_id += pop_smid + ',';
				if(timeoutID) window.clearTimeout(timeoutID);
				timeoutID = window.setTimeout(function(){
					last_id = ',';
				}, 5000);
			} else {
				return !!last_id.match(',' + pop_smid + ',');
			}
		}
	})();
	if (A.use_iframe && A.inIframe){
		A.recent_connect = window.parent.popThumb.recent_connect;
	}
	A.show = function (elm, pop_smid) {
		if(A.useFixed){
			var mouseX = A.clientX;
			var mouseY = A.clientY;
			elm.style.position = 'fixed';
		} else {
			var mouseX = A.mouseX;
			var mouseY = A.mouseY;
			elm.style.position = 'absolute';
		}
		// popupさせる要素全体が画面内に入るようにずらす(画面が小さくてずらしても入らない場合は当然無理=右と下が切れる)
		elm.style.display = 'block';
		var dif_X = 10 + elm.offsetWidth;
		if (A.clientX > dif_X) {
			mouseX -= dif_X;
		} else {
			mouseX += 10;
		}
		
		// 右端が途切れたら左にずらす
		var over_X = mouseX + elm.offsetWidth - document.body.offsetWidth;
		if (over_X > 0){
			mouseX -= over_X;
		}
		
		var dif_Y = 10 + elm.offsetHeight;
		if (A.clientY > dif_Y) {
			// 上に表示
			mouseY -= dif_Y;
			if (A.use_SenBroStyle) A.ichi[pop_smid] = true;
		} else {
			// 下に表示
			mouseY += 10;
			if (A.use_SenBroStyle) A.ichi[pop_smid] = false;
		}
		elm.style.top = mouseY + 'px';
		elm.style.left = mouseX + 'px';
		elm.style.zIndex = A.z_index();
		if (elm.tagName === "IFRAME") {
			elm.contentWindow.popThumb.framePos = {};
			elm.contentWindow.popThumb.framePos.mouseX = mouseX;
			elm.contentWindow.popThumb.framePos.mouseY = mouseY;
		}
	};
	A.popThumb2 = function (path, sticky, wait) {
		var delay_orig = window.ol_delay;
		if (typeof wait !== "undefined") window.ol_delay = wait;
		if (/^(mylist|user|community|channel)\//.test(path)) {
			path = "thumb_" + path;
		} else if (path.indexOf("co", 0) == 0) {
			path = "thumb_community/" + path;
		} else if (path.indexOf("ch", 0) == 0) {
			path = "thumb_channel/" + path;
		} else if (path.indexOf("lv", 0) == 0) {
			path = "embed/" + path;
		} else if (path.indexOf("watch/co", 0) == 0) {
			path = "thumb_community/" + path.substring(6);
		} else if (path.indexOf("watch/ch", 0) == 0) {
			path = "thumb_channel/" + path.substring(6);
		} else if (path.indexOf("watch/lv", 0) == 0) {
			path = "embed/" + path.substring(6);
		} else if (path.indexOf("gate/lv", 0) == 0) {
			path = "embed/" + path.substring(5);
		} else if (path.indexOf("watch/", 0) == 0) {
			path = "thumb/" + path.substring(6);
		} else if (path.indexOf("seiga/", 0) == 0) {
			path = "thumb/" + path.substring(6);
		} else {
			path = "thumb/" + path;
		}
		var result = popThumb(path, sticky, wait);
		if (typeof wait !== "undefined") window.ol_delay = delay_orig;
		return result;
	};
	A.delCache = function (smid, fn, elem){
		var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_rm?" + smid;
		var func = function (res){
			if (typeof fn === "function") fn(res);
			if (elem) {
				elem.innerHTML = res;
				if (res.indexOf('OK') == 0) {
					elem.onclick = function(){ return false };
					elem.title = "キャッシュの削除に成功しました。";
				} else {
					elem.title = "キャッシュの削除に失敗しました。";
				}
			}
			return false;
		};
		var Async = false;
		A.HttpRequest(url, func, Async);
		return false;
	};
	A.HttpRequest = function (url, fn, Async, h, data_num) {
		/*
		popThumb_FA用通信関数
		url（必須） : 言わずもがな
		fn : 通信終了時に実行するコールバック関数。第一引数はレスポンステキスト、第二引数はHttpRequest()の第4引数、第三引数は動画APIでの取得ならその情報を含んだオブジェクト（video.arrayで複数ならその配列）
			例：func(httpObj.responseText, h, objects.length <= 1 ? objects[0] : objects);
		Async : 非同期通信か否か（デフォルト：false=同期）
		h : コールバック関数funcに渡す引数（文字列でも数字でも配列でもなんでもOK。なくてもOK
		data_num : 通信内容をpopThumb.dataに保存する際に必要。["array", "va_" + pop_smid]配列形式。data_num[0]は通信のタイプ、data_num[1]は保存ID
		*/
		if (typeof url !== "string") return;
		if (!popThumb.use_NicoCache_nl && url.indexOf(".nicovideo.jp/cache/") !== -1) return "";
		if (typeof fn !== "function") fn = function(){};
		// 古いIEは切り捨て
		var httpObj = new XMLHttpRequest();
		var result = '';
		var OK = function(){
			var res = httpObj.responseText;
			if (url.indexOf(".nicovideo.jp/cache/ajax_info") !== -1 && !/^(OK|NG)/.test(res)) popThumb.use_NicoCache_nl = false;
			// 動画情報の場合、objectに変換
			var isGetthumbinfo = url.indexOf("http://" + location.host + "/pr_Redirect_ext.nicovideo.jp/api/getthumbinfo") === 0 || url.indexOf("http://ext.nicovideo.jp/api/getthumbinfo") === 0;
			var isVideoArray = url.indexOf("http://" + location.host + "/pr_Redirect_i.nicovideo.jp/v3/video.array?v=") === 0 || url.indexOf("http://i.nicovideo.jp/v3/video.array?v=") === 0;
			if (popThumb.use_ObjectData && (isGetthumbinfo || isVideoArray)) {
				// make_from_object用
				var resXML = httpObj.responseXML;
				function getText(xml){
					if (!xml) return "";
					if (typeof xml.textContent !== "undefined") return xml.textContent;
					else if (xml.firstChild === null) return "";
					else return xml.firstChild.nodeValue || "";
				}
				function addObj_new(parent, prefix, ret_object){
					if (parent && parent.childNodes) {
						var xmls = parent.childNodes;
					} else {
						return;
					}
					prefix = prefix || "";
					ret_object = ret_object || {};
					for (var i = 0, len = xmls.length; i < len; i++) {
						var child = xmls[i];
						// 最下層のデータのみobjectにとりあえず保存
						if (child && typeof child.getElementsByTagName !== "undefined" && child.getElementsByTagName("*").length === 0) {
							var tagName = child.tagName;
							var text = getText(child);
					//		var text = child.textContent;
							ret_object[prefix + tagName] = /^(?:\d|[1-9]\d+)$/.test(text) ? parseInt(text) : text;
					//		ret_object[tagName] = /^option_flag_/.test(tagName) ? parseInt(child.textContent) : child.textContent;
						}
					}
					/* 最初は数値化するのに項目名を羅列したけど、やめた
					var toInt = "size_high,size_low,view_counter,comment_num,mylist_counter,embeddable,no_live_play,user_id,ch_id,deleted,length_in_seconds,default_thread".split(",");
					for (var i = 0, len = toInt.length; i < len; i++) {
						var index = toInt[i];
						if (ret_object[index]) ret_object[index] = parseInt(ret_object[index]);
					}
					//*/
					return ret_object;
				}
				function extendObj(oldObj, newObj) {
					for (var index in newObj) {
						if (typeof newObj[index] !== "undefined") {
							if ((index === "thread_num_res" || index === "channel_thread_num_res" || index === "comment_num" || index === "comment_counter" || index === "last_res_body") && !newObj[index] && oldObj[index]) continue;
							oldObj[index] = newObj[index];
						}
					}
					// コメント数
					oldObj.comment_counter = Math.max(oldObj.comment_num || 0, oldObj.num_res || 0, oldObj.thread_num_res || 0, oldObj.channel_thread_num_res || 0);
					popThumb.debugLog(["comment_counter", oldObj.video_id, oldObj.comment_counter]);
					return oldObj;
				}
				//********************
				var tmp = resXML.getElementsByTagName("popThumb_FA_cached_smid_list")[0];
				tmp = tmp ? getText(tmp).split(",") : "";
		//		tmp = tmp ? tmp.textContent.split(",") : "";
				var popThumb_FA_cached_smid_list = {};
				for (var i = 0, len = tmp.length; i < len; i++) {
					if (tmp[i].match(/(\w{2}\d+)(low)?/)) {
						popThumb_FA_cached_smid_list[RegExp.$1] = RegExp.$2 === "low" ? 2 : 1;
						// 通常キャッシュ：1, エコノミー：2, キャッシュなし：undefined
					}
				}
				//********************
				var objects = [];
				var videoCount = 1;
				if (isVideoArray) {
					videoCount = parseInt(getText(resXML.getElementsByTagName("count")[0]));
			//		videoCount = parseInt(resXML.querySelector("nicovideo_video_response > count").textContent);
					for (var i = 0; i < videoCount; i++) {
						var xml_tmp = resXML.getElementsByTagName("video_info")[i];
				//		var xml_tmp = resXML.querySelectorAll("nicovideo_video_response > video_info")[i];
						var object = addObj_new(xml_tmp.getElementsByTagName("video")[0]);
				//		var object = addObj(xml_tmp.querySelectorAll("video > *"));
						// video_id
						object.video_id = object.id;
							
						addObj_new(xml_tmp.getElementsByTagName("thread")[0], "thread_", object);
						addObj_new(xml_tmp.getElementsByTagName("channel_thread")[0], "channel_thread_", object);
						addObj_new(xml_tmp.getElementsByTagName("video_options")[0], "video_options_", object);
				//		addObj(xml_tmp.querySelectorAll("thread > *"), "thread_", object);
				//		addObj(xml_tmp.querySelectorAll("channel_thread > *"), "channel_thread_", object);
				//		addObj(xml_tmp.querySelectorAll("video_options > *"), "video_options_", object);
						// 動画時間
						var length_in_seconds = object.length_in_seconds;
						var length_m = length_in_seconds / 60 | 0;
						object.length = length_m + ":" + ("0" + (length_in_seconds - length_m * 60)).slice(-2);
						
						// tags						
						var old_tags = {};
						if (popThumb.data['obj_' + object.id]) {
							var old_tags_array = popThumb.data['obj_' + object.id][1].tags;
							if (old_tags_array) {
								for(var j = 0, len = old_tags_array.length; j < len; j++){
									var ot = old_tags_array[j];
									old_tags[ot.text] = ot;
								}
							}
						}
						var tags = xml_tmp.getElementsByTagName("tag_info");
				//		var tags = xml_tmp.querySelectorAll("tags > tag_info");
						var tagsArray = [];
						for (var j = 0, len = tags.length; j < len; j++) {
							var tag = tags[j];
							var tagT = getText(tag.getElementsByTagName("tag")[0]);
				//			var tagT = tag.querySelector("tag").textContent;
							var area = getText(tag.getElementsByTagName("area")[0]);
				//			var area = tag.querySelector("area").textContent;
							tagsArray.push({
								text : tagT,
								category : (old_tags[tagT] ? old_tags[tagT].category : null),
								lock : (old_tags[tagT] ? old_tags[tagT].lock : null),
								domain : area,
								area : area
							});
						}
						object.tags = tagsArray;
						
						object.popThumb_FA_cached_smid_list = popThumb_FA_cached_smid_list;
						
						if (popThumb.data["obj_" + object.video_id]) object = extendObj(popThumb.data["obj_" + object.video_id][1], object);
						object.usingAPI = object.usingAPI || {};
						object.usingAPI.videoarray = true;
						object.description_videoarray = object.description;
						
						if (object.video_options_channel_id) object.ch_id = object.video_options_channel_id;
						
						objects.push(object);
					}
				} else {
					// getthumbinfo
					if (resXML.getElementsByTagName("nicovideo_thumb_response")[0].getAttribute("status") === "ok") {
		//			if (resXML.querySelector("nicovideo_thumb_response").getAttribute("status") === "ok") {
						var object = addObj_new(resXML.getElementsByTagName("thumb")[0]);
		//				var object = addObj(resXML.querySelectorAll("nicovideo_thumb_response > thumb > *"));
						
						// 動画時間（秒換算）
						object.length_in_seconds = object.length.match(/^(\d+):(\d+)$/) ? parseInt(RegExp.$2) + parseInt(RegExp.$1) * 60 : 0;
						// tag
						var tags = resXML.getElementsByTagName("tag");
						var tagDomain = resXML.getElementsByTagName("tags")[0].getAttribute("domain");
			//			var tags = resXML.querySelectorAll("nicovideo_thumb_response > thumb > tags > tag")
			//			var tagDomain = resXML.querySelector("nicovideo_thumb_response > thumb > tags").getAttribute("domain");
						var tagsArray = [];
						for (var i = 0, len = tags.length; i < len; i++){
							var tag = tags[i];
				//			var tagT = tag.textContent;
							var tagT = getText(tag);
							// tagT:<a href="/watch/sm9">sm9</a>や<哲学>も存在するので自動識別を試みる
						
						// todo:nlFilterを通った後は正しいXMLに変換しているので、以下の変換は不要。（のはず）
						
						
							tagT = tagT.replace(/<a [^<>]+>[^<>]+<[/]a>|[<>&\"]/g, function(all){
								if (all === "<") return "&lt;";
								if (all === ">") return "&gt;";
								if (all === "&") return "&amp;";
								if (all === '"') return "&quot;";
								// ↓のamp;変換必要？
								return all.replace(/&/g, "&amp;");
							});
							tagsArray.push({
								text : tagT,
								category : parseInt(tag.getAttribute("category")),
								lock : parseInt(tag.getAttribute("lock")),
								domain : tagDomain,
								area : tagDomain
							});
						}
						object.tags = tagsArray;
						
						object.popThumb_FA_cached_smid_list = popThumb_FA_cached_smid_list;
						
						if (popThumb.data["obj_" + object.video_id]) object = extendObj(popThumb.data["obj_" + object.video_id][1], object);
						object.usingAPI = object.usingAPI || {};
						object.usingAPI.getthumbinfo = true;
						// タグが使われている動画では&amp;lt;が存在するので、escapeHTMLはしない。
				//		object.description_getthumbinfo = object.description = popThumb.escapeHTML(object.description);
						// その場合、[<&>]が存在するので対応
						if (/(^|>)[^<>]*>|<[^<>]*</.test(object.description)) {
							popThumb.debugLog(["getthumbinfo:XML loaded(description original)", object.description]);
							// めんどいのでブラウザにやらせる
							var a = document.createElement("a");
							a.innerHTML = object.description;
							object.description = a.innerHTML;
							popThumb.debugLog(["getthumbinfo:XML loaded(description changed)", object.description]);
						}
						object.description_getthumbinfo = object.description;
						
						
						objects.push(object);
					}
				}
				for (var i = 0, len = objects.length; i < len; i++){
					var object = objects[i];
					// コメント数
					object.comment_counter = Math.max(object.comment_num || 0, object.num_res || 0, object.thread_num_res || 0, object.channel_thread_num_res || 0);
					popThumb.debugLog(["comment_counter", object.video_id, object.comment_counter]);
					var video_id = object.video_id;
					// smidと数字のみのIDがあるので、両方に保存
					var thread_id = object.thread_id || ((object.watch_url || "").match("/watch/([0-9]+)") ? RegExp.$1 : "");
					if (thread_id) {
						if (popThumb.data["obj_" + thread_id]) object = extendObj(popThumb.data["obj_" + thread_id][1], object);
						popThumb.data["obj_" + thread_id] = ["object", object];
						popThumb.debugLog(["thread_id", thread_id, object]);
					}
					var channel_thread = object.channel_thread;
					if (channel_thread && (channel_thread !== thread_id)) {
						if (popThumb.data["obj_" + channel_thread]) object = extendObj(popThumb.data["obj_" + channel_thread][1], object);
						popThumb.data["obj_" + channel_thread] = ["object", object];
						popThumb.debugLog(["channel_thread", channel_thread, object]);
					}
					popThumb.data["obj_" + video_id] = ["object", object];
					popThumb.debugLog(["video_id", video_id, object]);
				}
				if (data_num) {
					popThumb.data[data_num[1]] = [data_num[0], res];
					// // 複数個の動画を呼んだ場合は、従来の形式で保存しない
		//			if (videoCount === 1) popThumb.data[(isVideoArray ? "va_" : "") + video_id] = [(isVideoArray ? "array" : "api"), res];
				}
				// 複数個の動画を呼んだ場合は、配列でobjectを渡す。0（：存在しない動画など）ならundefined
				result = fn(res, h, objects.length <= 1 ? objects[0] : objects);
				/*
				if (popThumb.use_iframe && popThumb.inIframe && typeof popThumb.save === "function") {
					window.setTimeout(popThumb.save, 300);
				}
				*/
			} else {
				// api以外
				var base = url.match("^(https?://)(?:[^/]+/pr_Redirect_|)([^/]+)") ? RegExp.$1 + RegExp.$2 : "";
				if (res.match(/<base [^>]*?href=[\"\']?([^\"\'>]+)/i)) base = RegExp.$1;
				var styles = "";
				res = res.replace('<div id="nico_popThumb_container"></div>', "")
							.replace(/<iframe (?![^>]*?cache\/ajax_topmove)[^>]*>[\s\S]*?<\/iframe>/igm, "")
							.replace(/<script [^>]*>[\s\S]*?<\/script>/igm, "")
							.replace(/<style [^>]*>[\s\S]*?<\/style>/igm, function(A){
								styles += A;
								return "";
							}).replace(/<link [^>]*>/igm, "")
							.replace(/&apos;/igm, "'")
							.replace(/&amp;(quot|amp|lt|gt|apos);/igm, "&$1;")
							.replace(new RegExp('(<img [^>]*src=["\']?)(?!["\']?http)', "igm"), "$1" + base);
				if (popThumb.use_iframe && popThumb.inIframe) res = res.replace(/(<\/body>|$)/i, styles + "$1");
				if (data_num) {
					popThumb.data[data_num[1]] = [data_num[0], res];
					/*
					if (popThumb.use_iframe && popThumb.inIframe && typeof popThumb.save === "function") {
						window.setTimeout(popThumb.save, 300);
					}
					*/
				}
				result = fn(res, h);
			}
			if (data_num && typeof popThumb.save === "function") {
				if (popThumb.save.timeoutId) window.clearTimeout(popThumb.save.timeoutId);
				popThumb.save.timeoutId = window.setTimeout(popThumb.save, 1000);
			}
		};
		httpObj.abort();
		httpObj.open('GET', url, !!Async);
		httpObj.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
		if (navigator.userAgent.toLowerCase().indexOf("msie") === -1) { //　IE以外=firefox等
			httpObj.onload = OK;
		} else {
			httpObj.onreadystatechange = function () {
				if (httpObj.readyState == 4) {
					OK();
				}
			};
		}
		httpObj.send(null);
		return result;
	};
	if (A.use_NicoCache_nl) {
		(function(){
			return;	//通信が目障りだったｗ
			var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_info?sm9";
			var func = function (res){
				A.use_NicoCache_nl = /^(OK|NG)/.test(res);
			};
			var Async = true;
			A.HttpRequest(url, func, Async);
		})();
	}
	A.isCached = function(smid){
		var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_info?" + smid;
		var func = function (res){
			return /^OK(?:,[^,]*){3},0,/.test(res);
		};
		var Async = false;
		return A.HttpRequest(url, func, Async);
	};
	A.cacheMove_init = function(elm, smid, pop_smid) {
		function parseJSON(s){
			if (window.JSON && typeof window.JSON.parse === "function"){
				return JSON.parse(s);
			} else {
				return eval("(" + s + ")");
			}
		}
		var default_folder = "cache直下(default)";
		
//		var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/cachelist.json";
		var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/rsearch/" + smid + "(low)%3F_"; // (low)?_
		var func = function (res) {
			var cachelist = parseJSON(res);
			var B;
			if (B = (cachelist[smid] || cachelist[smid + 'low'])) {
				var dirList;
				var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/dirlist.json";
				var func = function (res) {
					dirList = parseJSON(res);
				};
				var Async = false;
				A.HttpRequest(url, func, Async);
				var select = document.createElement('select');
				select.onchange = function () {
					var value = dirList[this.value];
					var url = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/ajax_move?" + smid + '-' + encodeURI(value);
					var func = function (res) {
						if (res == 'OK') {
							alert('フォルダ：' + (value || default_folder) + 'に移動しました。');
						} else {
							alert('フォルダ移動を失敗しました。');
						}
					};
					var Async = true;
					A.HttpRequest(url, func, Async);
				}
				for (var i = 0, len = dirList.length; i < len; i++) {
					var option = document.createElement("option");
					option.setAttribute("value", String(i));
					option.appendChild(document.createTextNode(dirList[i] || default_folder));
					if (dirList[i] == B[1]) {
						option.selected = true;
					}
					select.appendChild(option);
				}
				elm.parentNode.replaceChild(select, elm);
				// use_SenBroStyle用
				if (popThumb.use_SenBroStyle){
					if (popThumb.use_iframe) {
						var popup = window.parent.document.getElementById('thumb_' + pop_smid);
					} else {
						var popup = $('thumb_' + pop_smid);
					}
					var tmp_mouseout = popup.onmouseout;
					select.onfocus = function(){
						popup.onmouseout = function(){};
					};
					select.onblur = function(){
						popup.onmouseout = tmp_mouseout;
					};
				}
			} else {
				elm.title = 'Cacheが有りません';
			}
		};
		var Async = true;
		A.HttpRequest(url, func, Async);
	};
	A.isDebug = false;
	A.debugLog = function(arg1){
		if (A.isDebug && window.console && typeof window.console.log !== "undefined") window.console.log(arg1);
	};
	A.escapeHTML = function (str) {
		return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
	};
	A.unescapeHTML = function (str) {
		return str.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
	};
	A.addFigure = function (str) {
		var num = new String(str).replace(/,/g, "");
		while (num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
		return num;
	};
	A.desc_to_link = function(text, className_prefix, smid){
		/*
		text : リンク化したいテキスト。すでにタグが含まれていてもOK（むしろ&gt;&lt;はNG）
		className_prefix : リンク化した要素につけるクラスの名前の接頭辞（指定なしはpopThumb_FA_link）。動画なら_movie（キャッシュ済みは_movie_cacheも）, URLなら_URLなどがつく
		smid : 動画ID. popThumb.data["obj_" + smid] / popThumb.data[smid]からキャッシュ情報を取得するために必要（<popThumb_FA_cached_smid_list>）
		*/
		var start = new Date().getTime();
		text = String(text);
		className_prefix = typeof className_prefix === "string" ? className_prefix : "popThumb_FA_link";
		var cacheList = {};
		// 通常キャッシュ：1, エコノミー：2, キャッシュなし：undefined
		if (smid && popThumb.data["obj_" + smid]) cacheList = popThumb.data["obj_" + smid][1].popThumb_FA_cached_smid_list || {}; // 一応存在しなかった時のために空オブジェクトを
		// objectを使わない古い方用
		var cacheList_tmp = [];
		if (smid && popThumb.data[smid] && popThumb.data[smid][1].match(/<popThumb_FA_cached_smid_list>([^<>]+),<[/]popThumb_FA_cached_smid_list>/)) cacheList_tmp = RegExp.$1.split(",");
		for (var i = 0, len = cacheList_tmp.length; i < len; i++) {
			if (cacheList_tmp[i].match(/(\w{2}\d+)(low)?/)) {
				cacheList[RegExp.$1] = RegExp.$2 ? 2 : 1;
				// 通常キャッシュ：1, エコノミー：2, キャッシュなし：undefined
			}
		}
		
//		var preRegExp = "((?:^|<(?:font|br|b|strong|u)(?:\\s[^<>]*)?>|</[^>]+>)[^<>]*?)";
		var preRegExp = "()";
		// 次の状況での置換を禁止→ <この中> | <a >この中</a> | <a >この中<fontとか/fontとか ></a>
		var postRegExp = "(?![^<>]*>|(?:[^<]|<(?!a ))*?</a>)";
		var inNicovideoRegExp = "nico[.]ms/(?:sm|nm|so|ca|ax|yo|nl|ig|na|cw|z[a-e]|om|sk|yk|im|sg|mg|lv|co|ch|ar|nc|user/|mylist/|[0-9]{10}|l/)|www[.]nicovideo[.]jp/(?:watch/|mylist/|user/)|live[.]nicovideo[.]jp/watch/lv|seiga[.]nicovideo[.]jp/(?:seiga|watch)/|com[.]nicovideo[.]jp/community/co|ch[.]nicovideo[.]jp/(?:channel/ch|article/)|www[.]niconicommons[.]jp/material/";
		// URL
		text = text.replace(new RegExp(preRegExp + "(h?(ttps?://(?!" + inNicovideoRegExp + ")[A-Za-z0-9:./?!&~#=_%;+-]+))" + postRegExp, "g"),
			 '$1<a href="h$3" class="' + className_prefix + '_URL">$2</a>');
		// リンク化された動画IDなどを解除
//		text = text.replace(new RegExp('<a href="https?://www[.]nicovideo[.]jp/(?:watch/|mylist/|user/|community/co|channel/ch)[^"]+" class="' + className_prefix + '_URL">([^<>]+)</a>', "g"), '$1');
		// 動画：smid形式
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]nicovideo[.]jp/|/)?watch/|h?ttp://nico[.]ms/)?((?:sm|nm|so|ca|ax|yo|nl|ig|na|cw|z[a-e]|om|sk|yk)[0-9]{1,8}(?:[?]eco=1)?))" + postRegExp, "g"), function(all, before, linkText, smid){
			var className = className_prefix + '_movie';
			if (cacheList[smid]) {
				className += " " + className_prefix + '_movie_cache';
				if (cacheList[smid] === 2) className += " " + className_prefix + '_movie_cache_economy';
			}
			 return before + '<a href="http://www.nicovideo.jp/watch/' + smid + '" class="' + className + '" onmouseover="popThumb(\'thumb/' + smid + '\')" onmouseout="nd()">' + linkText + '</a>';
		});
		// 動画：IDが数字のみ（マイメモリー or 公式・コミュニティ動画）
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]nicovideo[.]jp/|/)?watch/|(?:h?ttp://)?nico[.]ms/)([0-9]{10}(?:[?]eco=1)?))" + postRegExp, "g"), function(all, before, linkText, threadId){
			var className = className_prefix + '_movie ' + className_prefix + '_movie_only_num';
			if (cacheList[threadId]) {
				className += " " + className_prefix + '_movie_cache';
				if (cacheList[threadId] === 2) className += " " + className_prefix + '_movie_cache_economy';
			}
			 return before + '<a href="http://www.nicovideo.jp/watch/' + threadId + '" class="' + className + '" onmouseover="popThumb(\'thumb/' + threadId + '\')" onmouseout="nd()">' + linkText + '</a>';
		});
//		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]nicovideo[.]jp/|/)?watch/|(?:h?ttp://)?nico[.]ms/)([0-9]{10}(?:[?]eco=1)?))" + postRegExp, "g"),
//			 '$1<a href="http://www.nicovideo.jp/watch/$3" class="' + className_prefix + '_movie ' + className_prefix + '_movie_only_num" onmouseover="popThumb(\'thumb/$3\')" onmouseout="nd()">$2</a>');
		// マイリスト
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]nicovideo[.]jp/|/|(?:h?ttp://)?nico[.]ms/)?mylist/(?:[0-9]+/)?)([0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://www.nicovideo.jp/mylist/$3" class="' + className_prefix + '_mylist" onmouseover="popThumb(\'thumb_mylist/$3\')" onmouseout="nd()">$2</a>');
		// ユーザー
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]nicovideo[.]jp/|/|(?:h?ttp://)?nico[.]ms/)?user/)([0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://www.nicovideo.jp/user/$3" class="' + className_prefix + '_user" onmouseover="popThumb(\'thumb_user/$3\')" onmouseout="nd()">$2</a>');
		// 生放送
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://live[.]nicovideo[.]jp/|/)?watch/|(?:h?ttp://)?nico[.]ms/)?(lv[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://live.nicovideo.jp/watch/$3" class="' + className_prefix + '_live" onmouseover="popThumb(\'embed/$3\')" onmouseout="nd()">$2</a>');
		// 静画
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://seiga[.]nicovideo[.]jp/|/)?watch/|(?:h?ttp://)?nico[.]ms/)?((?:sg|mg)[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://seiga.nicovideo.jp/watch/$3" class="' + className_prefix + '_seiga" onmouseover="popThumb(\'thumb/$3\')" onmouseout="nd()">$2</a>');
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://seiga[.]nicovideo[.]jp/|/)?seiga/|(?:h?ttp://)?nico[.]ms/)?((?:im)[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://seiga.nicovideo.jp/seiga/$3" class="' + className_prefix + '_seiga" onmouseover="popThumb(\'thumb/$3\')" onmouseout="nd()">$2</a>');
		// コミュニティ生放送
		text = text.replace(new RegExp(preRegExp + "((?:h?ttp://)?nico[.]ms/l/(co[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://nico.ms/l/$3" class="' + className_prefix + '_community" onmouseover="popThumb(\'thumb_community/$3\')" onmouseout="nd()">$2</a>');
		// コミュニティ
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://com[.]nicovideo[.]jp/|/)?community/|(?:h?ttp://)?nico[.]ms/)?(co[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://com.nicovideo.jp/community/$3" class="' + className_prefix + '_community" onmouseover="popThumb(\'thumb_community/$3\')" onmouseout="nd()">$2</a>');
		// チャンネル
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://ch[.]nicovideo[.]jp/|/)?channel/|(?:h?ttp://)?nico[.]ms/)?(ch[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://ch.nicovideo.jp/channel/$3" class="' + className_prefix + '_channel" onmouseover="popThumb(\'thumb_channel/$3\')" onmouseout="nd()">$2</a>');
		// ブロマガ？
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://ch[.]nicovideo[.]jp/|/)?article/|(?:h?ttp://)?nico[.]ms/)?(ar[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://ch.nicovideo.jp/article/$3" class="' + className_prefix + '_ch_article">$2</a>');
		// ニコニ・コモンズ
		text = text.replace(new RegExp(preRegExp + "((?:(?:h?ttp://www[.]niconicommons[.]jp/|/)?material/|(?:h?ttp://)?nico[.]ms/)?(nc[0-9]+))" + postRegExp, "g"),
			 '$1<a href="http://www.niconicommons.jp/material/$3" class="' + className_prefix + '_niconicommons">$2</a>');
//		popThumb.debugLog("リンク化の実行時間[ms]：" + (new Date().getTime()-start));
		return text;
	};
	/*	test
	popThumb.desc_to_link('\n\
	sm9\n\
	http://www.nicovideo.jp/\n\
	ttp://www.nicovideo.jp/\n\
	http://www.nicovideo.jp/watch/sm9\n\
	ttp://www.nicovideo.jp/watch/sm9\n\
	<font >asdvsm9</font>\n\
	<font title="asdvsm9">aaa</font>\n\
	<a href="/watch/sm9">sm9</a>\n\
	<a href="/watch/sm9"><a href="/watch/sm9">sm9</a></a>\n\
	<a href="/aaaaaaaaaa"><font >sm9</font></a>\n\
	');
	
	*/
	A.getPaymentInfo = function(elem, pop_smid){
		var search = popThumb.use_NicoCache_nl ? "?nlFilter" : "";
		if (popThumb.use_in_JS_to_link) {
			search = search.replace(/nlFilter&?/, "");
			if (search === "?") search = "";
		}
		var url = "http://" + location.host + "/pr_Redirect_" + "i.nicovideo.jp/v3/video.array?v=" + pop_smid + search.replace("?", "&");
		var func = function (res, pop_smid, object) {
			var parent = elem.parentNode;
			if (typeof object === "object") {
				var needPay = object.video_options_ppv_type === 2; // 0：無料, 1:会員のみ, 2:有料 // video.arrayのみ判定可能のはず
				var text = document.createTextNode(needPay ? "有料" : "無料");
				if (needPay) {
					parent.style.color = "red";
					parent.style.fontWeight = "bold";
				}
			} else {
				var text = document.createTextNode("課金情報：不明");
			}
			parent.replaceChild(text, elem);
		};
		var Async = true;
		popThumb.HttpRequest(url, func, Async, pop_smid, ["array", "va_" + pop_smid]);
	};
	A.getCommentInfo = function(elem, pop_smid){
		var search = popThumb.use_NicoCache_nl ? "?nlFilter" : "";
		if (popThumb.use_in_JS_to_link) {
			search = search.replace(/nlFilter&?/, "");
			if (search === "?") search = "";
		}
		var url = "http://" + location.host + "/pr_Redirect_" + "ext.nicovideo.jp/api/getthumbinfo/" + pop_smid + search;
		var func = function (res, pop_smid, object) {
			var parent = elem.parentNode;
			if (typeof object === "object") {
				var last_res = object.last_res_body;
				var text = document.createTextNode(last_res || "コメント情報取得失敗");
				parent.replaceChild(text, elem);
				
				var commentCount = $("popThumb_FA_commentCount_" + pop_smid);
				var comment = object.comment_counter;
				if (commentCount && typeof comment !== "undefined") {
					commentCount.innerText = popThumb.addFigure(comment);
				}
			}
		};
		var Async = true;
		popThumb.HttpRequest(url, func, Async, pop_smid, ["api", pop_smid]);
	};
})(window.popThumb);

(function (){
	//localStorage 使用
	if (window.localStorage && window.JSON && window.JSON.parse) {
		try {
			// \u2028などが含まれている文字列をeval()するとエラーが発生していた
			// http://www.nicovideo.jp/watch/sm18406343 (video.array取得時)
			// ニコ動がprototype.jsの古いもの（Version1.5.1.1）を使っているため、配列[]に古い間違ったtoJSON関数が存在し、それが間違っているので、個別に対策が必要
			// （JSON.stringifyではtoJSON関数が存在すればそれが使われる）
			// JSON.stringify({a:[1,2,3]}) は文字列 {"a":[1,2,3]} となるべきだが、prototypeが存在するページでは {"a":"[1, 2, 3]"} となってしまう。
			// http://ja.softuses.com/13276
			// （そのためevalが必要だったが、Array.prototype.toJSONを変換時にdeleteすることで対応。変換終了で元に戻す）
			function getData(){
				return window.JSON.parse(window.localStorage['popThumb.data'] || '{}');
			}
			popThumb.data = getData();
	//		for (var key in popThumb.data) {
	//			popThumb.data[key] = eval(popThumb.data[key]);
	//		}
			function save(del_smid){
				var start = new Date().getTime();
				var tmp = getData();
				var data = popThumb.data;
				for (var key in tmp) {
					if (data[key]){
						if (data[key][2]){
	//						tmp[key] = eval(tmp[key]);
							if (data[key][2] < tmp[key][2]){
								data[key] = tmp[key];
							}
						}
					} else {
						data[key] = tmp[key];
		//				data[key] = eval(tmp[key]);
					}
				}
				// iframe使用時に消すため
				if (typeof del_smid !== "undefined") {
					if (typeof del_smid === "string") del_smid = [del_smid];
					for (var i = 0, len = del_smid.length; i < len; i++) {
						delete data[del_smid[i]];
					}
				}
		//		popThumb.debugLog("popThumb.save:" + location.href);
		//		popThumb.debugLog(["popThumb.save.data:", data]);
				var now = new Date().getTime();
				var day = 1000 * 60 * 60 * 24;
				var min = 1000 * 60;
				var expire;
				for (var key in data) {
					if (expire = data[key][2]) {
						if (expire < now) {
							if (data[key][0] !== "ext") {
								delete data[key];
							} else if ((expire + day * 7) < now) {
								// (たぶん)削除済み動画は保存期間を延長(7日)
								delete data[key];
							}
						}
					} else {
						if(key.indexOf('lv') === 0){
							var html = data[key][1];
							if (html.indexOf("http://live.nicovideo.jp/img/embed/img_yotei.gif") !== -1) {
								// 放送予定 30分間隔
								data[key][2] = now + min * 30;
							} else if (html.indexOf("http://live.nicovideo.jp/img/embed/img_onair.gif") !== -1){
								// 放送中 15分間隔
								data[key][2] = now + min * 15;
							} else {
								// その他(=放送終了だけ?) 1日間隔
								data[key][2] = now + day * 1;
							}
						} else if (key.indexOf('_') === -1 || key.indexOf('obj_') === 0 || key.indexOf('va_') === 0 || key.indexOf('mylist_') === 0) {
							// 動画・マイリス 1日
							data[key][2] = now + day * 1;
						} else {
							// 他 7日
							data[key][2] = now + day * 7;
						}
					}
				}
				// 古いprototype.jsがバグの元
				var old_Array_prototype_toJSON = null;
				if (Array && Array.prototype && Array.prototype.toJSON) {
					old_Array_prototype_toJSON = Array.prototype.toJSON;
					delete Array.prototype.toJSON;
				}
				window.localStorage.setItem('popThumb.data', window.JSON.stringify(data));
				if (old_Array_prototype_toJSON !== null) Array.prototype.toJSON = old_Array_prototype_toJSON;
//				alert('localStorage save OK');
				popThumb.debugLog("popThumb.saveの実行時間[ms]：" + (new Date().getTime()-start));
			}
			popThumb.save = save;
			/*
			popThumb.addEvent(window, "beforeunload", function(){
				// iframeの中の場合、通信直後に保存しているので除外。(なぜかcacheSearchで同時保存が発生していた)
			//	if (!(popThumb.use_iframe && popThumb.inIframe)) save();
			// iframeがあると、データの管理がめんどいので除外
				if (window == window.parent) save();
			});
			window.setInterval(save, 1000 * 60 * 10);
			*/
			window.addEventListener("storage", function (event) {
				if (popThumb.use_iframe && popThumb.inIframe) return;
				if (event.key === "popThumb.data") {
					popThumb.data = getData();
					popThumb.debugLog("event::storageが発火:" + event.url);
				}
			});
			popThumb.deleteAllData = function(){
				popThumb.data = {};
				window.localStorage.setItem('popThumb.data', window.JSON.stringify({}));
				popThumb.save();
			};
		} catch (e) {
			popThumb.data={};
			localStorage.setItem('popThumb.data',"");
			var err = 'popThumb_FA : localStorage error : ' +  (e.message || e);
			if (window.console && typeof console.log == "function") {
				console.log(err);
			} else {
	//			alert(err);
			}
		}
	}
})();

// overlibの関数nd()を上書き。

(function () {
	var nd_bk = window.nd;
	window.nd = function (id) {
	//	popThumb.debugLog(arguments);
		if (typeof popThumb.wait_setTimeoutId === "number") {
			window.clearTimeout(popThumb.wait_setTimeoutId);
			popThumb.wait_setTimeoutId = null;
		}
		var pop_smid = popThumb.pop_smid;
		if (popThumb.key_now == 17) pop_smid = "";
		if (typeof id === "string" && /[0-9]/.test(id)) pop_smid = id;
		if (popThumb.use_iframe && popThumb.inIframe) {
			if (popThumb.use_SenBroStyle) {
				window.parent.popThumb.preMouseY = window.parent.popThumb.mouseY + popThumb.preMouseY - popThumb.mouseY;
			}
//			window.parent.console.log("parent nd発動 will");
			return window.parent.nd();
		}
		var result;
		if (typeof nd_bk === "function") {
			result = nd_bk(arguments);
		}
		if (popThumb.use_SenBroStyle && pop_smid && typeof popThumb.ichi[pop_smid] !== "undefined") {
			// 上側に表示(true)  === マウスが上に移動してリンクから外れた
			// or
			// 下側に表示(false) === マウスが下に移動してリンクから外れた
			if (popThumb.ichi[pop_smid] === popThumb.preMouseY > popThumb.mouseY){
				delete popThumb.ichi[pop_smid];
				popThumb.timeoutID[pop_smid] = window.setTimeout(function(){
//					console.log("timer nd発動"+popThumb.timeoutID[pop_smid]);
					window.nd(pop_smid);
					popThumb.cancelTimeout(pop_smid);
				}, popThumb.use_SenBroStyle);
				popThumb.pop_smid = "";
				return result;
			}
		}
		// 固定表示でない場合に、直前にpopupさせた'pop_smid'のエレメントを隠す。
		if (pop_smid) {
			var elem = document.getElementById('thumb_' + pop_smid)
			if (elem) {
//				console.log("nd発動");
				elem.style.display = 'none';
			}
		}
		if (pop_smid !== id) popThumb.pop_smid = "";
		return result;
	};
	if (nd_bk && typeof nd_bk !== "function" && typeof nd_bk.toString === "function") {
		window.nd.toString = function(){
			return nd_bk.toString();
		}
//		alert('popThumb_FA : nd_bk = ' + nd_bk);
	}
	nd.nd_bk = nd_bk; 
	// overlibを実行させてないのにndを実行するとエラー出まくりなので対策。
	if (typeof nd_bk === "function" && typeof overlib === "function" && over === null) {
		over = document.createElement('div');
	}
	if(location.host == "dic.nicovideo.jp"){
		var fn = arguments.callee;
		setTimeout(function(){
			if(!/popThumb.pop_smid/.test(String(window.nd))){
				fn();
			}
		}, 3000);
	}
})();

if(typeof window.nicofetch === 'function' && typeof window.nlMovieFetcher === 'function'){
	popThumb.nicofetch = window.nicofetch;
} else {
		
	// nlMovieFetcher.js 091228
	// ・以下変更点
	// 背景色変化・リクエストURLのリダイレクト設定・nlMovieFetcherの登録先(popThumb)
	// nlMovieFetcher.fetch内callAPI部文・__updateStatus関数
	// __modifyAnchor();は不使用(idが未定義・というかpopThumbなのでそこからクリックすることはほぼ無い。)
	
	popThumb.nicofetch = function (elem, id, parent) {
		if (elem && elem.__fetching) return;
		var frm = null;
		if (isNaN(parent)) {
			frm = elem;
			while (frm) {
				if (frm.className) {
					if (typeof parent == 'string' && frm.className.indexOf(parent) > -1)
					break;
					if (frm.className.indexOf("thumb_frm") > -1 ||
						frm.className.indexOf("bg_grade" ) > -1 ||
						frm.className.indexOf("channel_video_bg") > -1)
					break;
				}
				frm = frm.parentNode;
			}
			if (frm) {
				frm.style.borderColor = 'red';
			} else {
				frm = elem.parentNode;
			}
		} else {
			for (frm = elem; parent > 0; parent--)
				frm = frm.parentNode;
		}
		var fetcher;
		if (id.indexOf('&') > 0) {
			var params = id.split('&');
			fetcher = new popThumb.nlMovieFetcher(params[0], elem, frm, "watch/"+params[0]);
			fetcher.params = params;
		} else {
			fetcher = new popThumb.nlMovieFetcher(id, elem, frm, "watch/"+id);
		}
		fetcher.fetch();
	};
	
	// 外部サムネやユーザースクリプトを考慮してPrototype.jsは使わずに実装
	popThumb.nlMovieFetcher = function () {
		this.initialize.apply(this, arguments)
	};
	popThumb.nlMovieFetcher.prototype = {
		// 最低限、動画IDさえ渡せば動作OK
		initialize: function (id, elem, frame, anchor) {
			this.id = id; // 動画ID(必須)
			this.elem = this.__getElem(elem); // ステータスを表示するElement
			this.frame = this.__getElem(frame); // 背景色を変更するElement
			this.anchor = this.__getElem(anchor); // 動画を開くアンカーElement
			this.params = [id]; // APIに渡すパラメータ配列
			this.bgColor1 = '#FFFF99'; // 背景色(1段階目)
			this.bgColor2 = '#00ffff'; // 背景色(2段階目)
			this.interval = 2000; // ステータス取得間隔(ミリ秒)
		},
		fetch: function () {
			var fetch_text = "fetching...";
			if (this.elem) {
				if (this.elem.__fetching) return;
				this.elem.__fetching = true;
				this.__setText(fetch_text);
			}
			if (this.frame) {
				if (this.__marking()) {
					if (this.frame.className.indexOf("marked") < 0) this.frame.className += " marked";
				} else {
					this.bgImage0 = this.frame.style.backgroundImage;
					this.bgColor0 = this.frame.style.backgroundColor;
					this.frame.style.backgroundImage = 'none';
					this.frame.style.backgroundColor = this.bgColor1;
				}
			}
			var self = this;
			if (popThumb.inNicoVideo) {
				this.callAPI(this.params.join('&'), function (r) {
					var text = r.responseText;
					if (r.status == 200 && text.indexOf("OK") == 0) {
						if (text.indexOf("accepted") > 0) {
							self.__updateStatus();
						} else {
							self.__setText(text.substring(3));
							self.__finish(text.indexOf("cached") > 0);
						}
					} else {
						self.__setText(fetch_text + " FAILED!");
						self.__finish(false);
					}
				});
			} else {
				var fetch_url = 'http://www.nicovideo.jp/cache/fetch?' + this.params.join('&');
				if (!popThumb.isIE || popThumb.AllowCookie) {
					var iframe = document.createElement('iframe');
					iframe.src = fetch_url;
					iframe.style.display = 'none';
					document.body.appendChild(iframe);
					window.setTimeout(function(){
						document.body.removeChild(iframe);
					}, 10000);
			//		alert("FA fetch OK");
				} else if (true){ // 邪道
					var j = document.createElement("script");
					j.type = "text/javascript";
					j.src = fetch_url;
					document.body.appendChild(j);
				} else {
					var w_1 = window.open(fetch_url,'nicofetch','toolber=no,menuber=no,width=100,height=100');
					window.focus();
					window.setTimeout(function(){
						w_1.close();
					}, 200);
				}
				window.setTimeout(function(){
					self.__updateStatus();
				}, 1000);
			}
		},
		callAPI: function (param, callback) {
			var FETCH_API_URL = "http://" + location.host + "/pr_Redirect_www.nicovideo.jp/cache/fetch?";
			var xhr = null;
			if (window.XMLHttpRequest) {
				xhr = new XMLHttpRequest();
			} else if (window.ActiveXObject) {
				try {
					xhr = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						xhr = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {}
				}
			}
			if (xhr == null) {
				this.__setText("AJAX ERROR!");
				return;
			}
			xhr.open('GET', FETCH_API_URL + param, true);
			xhr.onreadystatechange = function () {
				if (xhr.readyState == 4 && callback) callback(xhr);
			}
			xhr.send(null);
		},
		__getElem: function (name) {
			return (typeof name == 'string') ? document.getElementById(name) : name;
		},
		__setText: function (text) {
			if (!this.elem) return;
			if (this.elem.textContent) {
				this.elem.textContent = text;
			} else if (this.elem.innerText) {
				this.elem.innerText = text;
			} else {
				this.elem.innerHTML = text;
			}
		},
		__updateStatus: function () {
			if (!this.elem) return;
			var self = this;
			var timer = setInterval(function () {
				self.callAPI("status=" + self.id, function (r) {
					if (r.status != 200) {
						if(!popThumb.inNicoVideo){
							if(popThumb.isCached(self.id)){
								self.__setText('already cached.');
							} else {
								self.__setText('FAILED!');
							}
							clearInterval(timer);
							self.__finish(true);
						}
						return;
					}
					var text = r.responseText;
					self.__setText(text);
					if (!/( wait|\d%)$/.test(text)) {
						clearInterval(timer);
						self.__finish(/ done\.$/.test(text));
					}
				});
			}, this.interval);
		},
		__modifyAnchor: function () {
			if (!this.anchor || this.anchor.__fetched) return;
			var self = this;
			var rmfunc = function () {
				self.callAPI("rm=" + self.id);
				if (self.frame && self.frame != self.elem) {
					if (self.__marking()) {
						self.frame.className = self.frame.className.replace(/\s+marked/, "");
					} else {
						self.frame.style.backgroundImage = self.bgImage0;
						self.frame.style.backgroundColor = self.bgColor0;
					}
				}
			}
			if (this.anchor.addEventListener) {
				this.anchor.addEventListener('click', rmfunc, true);
			} else if (this.anchor.attachEvent) {
				this.anchor.attachEvent('onclick', rmfunc);
			}
			this.anchor.target = '_blank';
			this.anchor.__fetched = true;
		},
		__finish: function (cached) {
			if (!this.elem) return;
			if (cached) {
				if (this.frame && this.frame != this.elem) {
					if (!this.__marking()) {
						this.frame.style.backgroundColor = this.bgColor2;
					}
				}
				this.elem.removeAttribute('href');
				this.elem.removeAttribute('onclick');
			}
			this.elem.__fetching = false;
		},
		__marking: function () { // marking.js 対応
			return this.frame.className && this.frame.className.indexOf("marking") > -1;
		},
		__empty: function () {}
	};
}

if (typeof window.popThumb2 !== "function"){
	window.popThumb2 = popThumb.popThumb2;
}


(function(){
	var nicoURL = "//(?!blog)(?:[^.]+.nicovideo.jp/(?:.*?%2F)?(watch|gate|community(?=/co)|mylist|user|channel(?=/ch)|seiga)|nico.ms)(?:/|%2F)((?!nw)[a-z0-9]{2}[0-9]+)";
	// href
	if (location.href.match("^http://www.nicovideo.jp/(watch/|my/watchlist|playlist/mylist/)|^http://search.nicovideo.jp/|^http://twitter.com/|^http://www.google.co(m|.jp)/search")){
		popThumb.addEvent(document.body, "mouseover", function (event){
			var target = event.target;
			while (!/^(A|BODY)$/.test(target.tagName)) target = target.parentNode;
			if (target.tagName === "A" && !target.onmouseover && target.href.match(nicoURL)) {
				var path = (RegExp.$1 || "watch") + "/" + RegExp.$2;
				popThumb.debugLog("watch:popThumb2");
				popThumb.debugLog(target);
				var targetA = target;
				// 何が問題になるだろう?↓
				if (1 || popThumb.pop_smid.match("(^|[^0-9])" + RegExp.$2 + "([^0-9]|$)")) while (target = target.parentNode) {
					if (target.id === "nico_popThumb_container") return;
				}
				popThumb.popThumb2(path, 0);
				// 一度popupしたリンク要素はイベント登録。
				targetA.onmouseover = function(){
					popThumb.popThumb2(path, 0);
				};
				targetA.onmouseout = function(){
					nd();
				};
			}
		});
		popThumb.addEvent(document.body, "mouseout", function (event){
			var target = event.target;
			while (!/^(A|BODY)$/.test(target.tagName)) target = target.parentNode;
			if (target.tagName === "A" && !target.onmouseout && target.href.match(nicoURL)) {
				if (popThumb.pop_smid.match("(^|[^0-9])" + RegExp.$2 + "([^0-9]|$)")) {
					popThumb.debugLog("watch:nd");
					popThumb.debugLog(target);
					while (target = target.parentNode)	if (target.id === "nico_popThumb_container") return;
					nd();
				}
			}
		});
	}
	// title / innerHTML
	if (location.href.match("^http://twitter.com/")){
		popThumb.addEvent(window, "mouseover", function (event){
			var target = event.target;
			if (target.tagName === "SPAN" && target.parentNode.innerText.match(nicoURL)) {
				popThumb.popThumb2((RegExp.$1 || "watch") + "/" + RegExp.$2, 0);
			}
		});
		popThumb.addEvent(window, "mouseout", function (event){
			var target = event.target;
			if (target.tagName === "SPAN" && target.parentNode.innerText.match(nicoURL)) {
				nd();
			}
		});
		
		popThumb.addEvent(window, "mouseover", function (event){
			var target = event.target;
			if (target.tagName === "A" && (target.title.match(nicoURL) || ("http://" + target.innerText).match(nicoURL))) {
				popThumb.popThumb2((RegExp.$1 || "watch") + "/" + RegExp.$2, 0);
			}
		});
		popThumb.addEvent(window, "mouseout", function (event){
			var target = event.target;
			if (target.tagName === "A" && (target.title.match(nicoURL) || ("http://" + target.innerText).match(nicoURL))) {
				nd();
			}
		});
		// ハッシュタグ
		popThumb.addEvent(window, "mouseover", function (event){
			var target = event.target;
			if (target.tagName === "B" && target.previousSibling && target.previousSibling.innerText === "#" && target.innerHTML.match("^((?:sm|so|\d{2})[0-9]+)$")) {
				popThumb.popThumb2("watch/" + RegExp.$1, 0);
			}
		});
		popThumb.addEvent(window, "mouseout", function (event){
			var target = event.target;
			if (target.tagName === "B" && target.previousSibling && target.previousSibling.innerText === "#" &&  target.innerHTML.match("^((?:sm|so|\d{2})[0-9]+)$")) {
				nd();
			}
		});
	}
	if (location.href.match("^http://www.nicovideo.jp/watch/") && typeof jQuery === "function"){
		// ZeroWatch tag
		var nicoURL_tag = "/tag/[^?]*((?:sm|nm|so)[1-9][0-9]*)";
//		jQuery("#videoTagContainer .videoHeaderTag a").live("mouseover", function(){
		jQuery(document).on("mouseover", "#videoTagContainer .videoHeaderTag a", function(){
		    if (this.href.match(nicoURL_tag)) popThumb.popThumb2("watch/" + RegExp.$1, 0);
		});
//		jQuery("#videoTagContainer .videoHeaderTag a").live("mouseout", function(){
		jQuery(document).on("mouseout", "#videoTagContainer .videoHeaderTag a", function(){
		    if (this.href.match(nicoURL_tag)) nd();
		});	
	}
})();
// html構造がバグっているサイト用（</div>が足りなかったりすると、body直下に#nico_popThumb_containerが無いことがある。例：いつだかのニコ動）
if (document.getElementById("nico_popThumb_container") && document.getElementById("nico_popThumb_container").parentNode != document.body){
	if (typeof jQuery === "function") {
		jQuery(function (){
			document.body.appendChild(document.getElementById("nico_popThumb_container"));
		});
	} else {
		popThumb.addEvent(window, "load", function (){
			document.body.appendChild(document.getElementById("nico_popThumb_container"));
		});
	}
}