// ==UserScript==
// @name           Nico multi-pop-drag-resize
// @namespace      http://andre-garden.com
// @description    Allows to pop multiple videos in page, drag and resize them around... Pop button is next to video's title.
// @include        http://www.nicovideo.jp/*
// @exclude        http://www.nicovideo.jp/watch/*
// ==/UserScript==


window.addEventListener(
	'load',
	function() { init(); },
	true
);

var init_w = "575";
var init_h = "560";
var init_t = "1";
var init_l = "1";
var init_zindex = 1000;

var body, player, divBorder//;, divPlayerInnerHTML;
var imgResize, imgPopup, imgPopup, imgDownload, imgCloseWindow, imgMaxWindow;
var arrayDragObj = new Array();
var idVideoHandled;
var video_frame = {};
var arrayVideoId = new Array();

function matchTitle(link) 
{
    var lcn = link.className;
    if (lcn != null) {
        var p = "video";
        return (link.className.search(new RegExp(p)) == 0);
    }
    return false;
}

function getArrayVideoId() {
    var videoArray = new Array();
    var divs = document.getElementsByTagName("div");
    for (var i=0;i<divs.length;i++) {
        if (divs[i].id.indexOf("divsm") == 0) {
            videoArray.push(divs[i].id.replace(/div/,""));
        }
    }
    return videoArray;
}

function init_video_frame() {
    video_frame.top = init_t;
    video_frame.left = init_l;
    video_frame.height = init_h;
    video_frame.width = init_w;
    video_frame.manual = "off";
    video_frame.zindex = init_zindex;
}

function initHotKey() {
    shortcut.add("i",function() {
        //ポップアップの位置、サイズを初期化します。
        if (window.confirm(decodeURIComponent("%E3%83%9D%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%80%81%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82"))) {
            init_video_frame();
            GM_setValue("video_frame_data", video_frame.toSource());
        }    
    },
    {'disable_in_input':true}    
    );

    shortcut.add("m",function() {
        //マニュアルモードにしますか？
        //ＯＫ:ポップアップ内で変更したスクロールバーの位置は維持されます。
        //キャンセル:自動調整します。
        if (window.confirm(decodeURIComponent("%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%EF%BC%AF%EF%BC%AB%E3%81%AA%E3%82%89%E3%83%9D%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97%E5%86%85%E3%81%A7%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%90%E3%83%BC%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AF%E7%B6%AD%E6%8C%81%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0D%0A%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%BB%E3%83%AB%E3%81%AA%E3%82%89%E8%87%AA%E5%8B%95%E8%AA%BF%E6%95%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0D%0A"))) {
            video_frame.manual = "on";
        } else 
            video_frame.manual = "off";
            
        GM_setValue("video_frame_data", video_frame.toSource());
    },
    {'disable_in_input':true}    
    );

    shortcut.add("r",function() {
        //リロード
        imgPopupReload();
    },
    {'disable_in_input':true}    
    );

    shortcut.add("d",function() {
        //全てのポップアップを閉じる
        for (var i=0;i<arrayVideoId.length;i++) {
            var div = document.getElementById("div" + arrayVideoId[i]);
            div.parentNode.removeChild(div);
            var player = document.getElementById("player" + arrayVideoId[i]);
            player.parentNode.removeChild(player);
        }    
    },
    {'disable_in_input':true}    
    );
}

function init()
{
	//init vars
	body = document.getElementsByTagName("body")[0];

	initImages();	
	initHotKey();
    init_video_frame();	
	
	//popup
	imgPopupload();
}

function imgPopupReload() {
    var imgs = document.getElementsByTagName("img");
    for (var i=0;i<imgs.length;i++) {
        if (imgs[i].id.indexOf("imgpop") == 0) {
            imgs[i].parentNode.removeChild(imgs[i]);
        }
    }
    imgPopupload();
}

function imgPopupload() {
	//popup
	var img;
	var links = document.getElementsByTagName('a');
	for( i=0; i<links.length; i++ )
	{
		if(matchTitle(links[i])){
			img = imgPopup.cloneNode(false);
			img.id = "imgpop" + i;
			img.addEventListener('click',popupVideo,false);
			links[i].parentNode.appendChild(img);
		}
	}
}

function createVideo(video_id, player)
{
	var p=null, d=null;
	p=document.getElementById('player'+video_id);
	d=document.getElementById('div'+video_id);
	if(p && d){
		p.style.left = d.style.left = init_l + "px";
		p.style.top = (parseInt(init_t) + 17) + "px";
		d.style.top = init_t + "px";	
		return;
	}

	var a, dragObj = new Object();
	dragObj.id = video_id;
	dragObj.zIndex = 998;
	arrayDragObj[arrayDragObj.length] = dragObj;

    try {
	    var v = GM_getValue("video_frame_data");
	    if (v)
	        video_frame = eval(v);
	} catch(e) {/*GM_log(e);*/}

	if( ! player )
	{
		player = document.createElement("iframe");
		player.src = "http://www.nicovideo.jp/watch/" + video_id + (video_frame.manual == "on" ? "#flvplayer_container_m" : "#flvplayer_container");
        if (!video_frame || video_frame.width == "" || video_frame.height == "") {
		    player.width = init_w + "px";
		    player.height = init_h + "px";
		} else {
		    player.width = video_frame.width + "px";
		    player.height = video_frame.height + "px";
		}    
		body.appendChild(player);
    }

	dragObj.player = player;
	
	video_frame.zindex = video_frame.zindex + 2;
	//player
	player.setAttribute('id','player'+video_id);
	player.style.position = 'fixed';
	player.style.zIndex = video_frame.zindex;
	
	//div 
	divBorder = document.createElement('div');
	divBorder.setAttribute('id','div'+video_id);
	divBorder.style.position = 'fixed';
	divBorder.style.zIndex = video_frame.zindex - 1;
	divBorder.style.background = '#CDCECD';
	divBorder.style.width = (parseInt(player.getAttribute('width'))) +"px";
	divBorder.style.height = (parseInt(player.getAttribute('height')) + 17) +"px";
	player.parentNode.appendChild(divBorder);	
	divBorder.style.cursor = 'move';

	//img
	divBorder.appendChild(imgResize.cloneNode(false));
	divBorder.appendChild(imgCloseWindow.cloneNode(false));

	//position both
    if (!video_frame || video_frame.left == "" || video_frame.top == "") {
	    player.style.left = divBorder.style.left = init_l + "px";
	    player.style.top = (parseInt(init_t) + 17) + "px";
	    divBorder.style.top = init_t + "px";
	    //player.style.top = divBorder.style.top;
    } else {
	    player.style.left = divBorder.style.left = video_frame.left + "px";

	    if (arrayVideoId.length > 0 ) 
	        video_frame.top = parseInt(video_frame.top) + 50;

	    player.style.top = (parseInt(video_frame.top) + 17) + "px";
	    divBorder.style.top = video_frame.top + "px";
	    //divBorder.style.top = video_frame.top + "px";
    }    	
	//setup event
	divBorder.addEventListener('mousedown',dragStart,false);

    arrayVideoId.push(video_id);
    GM_setValue("video_frame_data", video_frame.toSource());
}


function popupVideo(e)
{
	var cont = 0;
	var sib = previousSibling(e.target);
	while(cont++<50  && sib.tagName!='A')
		sib = previousSibling(sib);
	var videoid = sib.getAttribute('href').replace(/.*watch\//,'');
	createVideo(videoid, null);
}

function previousSibling(vSibling) 
{
    var cont = 0;
	
	vSibling = vSibling.previousSibling;
	while ( cont++<50 && vSibling.nodeType==3)  // Fix for Mozilla/FireFox Empty Space becomes a TextNode 
		vSibling = vSibling.previousSibling;
		
	return vSibling;
}

function initImages()
{
	imgResize = document.createElement('div');
	imgResize.setAttribute('id','idResizeHandle');
	imgResize.style.position = 'absolute';
	imgResize.style.cursor = 'nw-resize';
	imgResize.style.height = "20px";
	imgResize.style.width = "20px";
	imgResize.style.right = "-20px";
	imgResize.style.bottom = "-20px";


	imgPopup = document.createElement('img');
	imgPopup.style.cursor = 'pointer';
	imgPopup.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%10%08%06%00%00%00%16%18_%1B%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%00%B0IDATx%DAb%FC%FF%FF%3F%035%01%13%03%95%01%0B%3EI%1B%1B%9B%A5%C4%18r%E4%C8%91h%A2%0C%04%81%89%13'F%E1%93%CF%CF%CF_F%B4%0BA%C0%CF%CF%0F%AF%BC%A2%A2%22%F1%5E~%F5%EA%95%D8%D3%A7O%F1%1A%A8%A6%A6%26%86%D3%40%23%23%A3%F5%C8%7C%1E%1E%9E%2F%14G%8A%A9%A9i%00%8C%BDf%CD%1A%CAc9%22%04%11f%14%1B%F8%E5%CB%17%1EGWo0%FB%EA%C5%93%0C%EF%DE%BDc%60ddD%D1%A0%AA%AA%BA%87%ECtx%E5%C2%09%0C%B1%C0%D0X%86%5B%B7n%B9%92l%A0%B6%BE%F9%20%CDz%C0t%B5%87%12%03%19%07%7Di%03%10%60%00%B3%5C%2F%F6%92%BA*%D1%00%00%00%00IEND%AEB%60%82";
	
	imgCloseWindow = document.createElement('img');
	imgCloseWindow.setAttribute('id','idCloseWindow');
	imgCloseWindow.style.cursor = 'pointer';	
	imgCloseWindow.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%0F%08%02%00%00%00%8D%D3%B3F%00%00%0A7iCCPPhotoshop%20ICC%20profile%00%00x%9C%9C%96wTS%D9%16%87%CF%BD7%BDP%92%10%8A%94%D0khR%02H%0D%BDH%91.*1%09%10J%C0%90%00%226DTpDQ%91%A6%082(%E0%80%A3C%91%B1%22%8A%85%01Q%B1%EB%04%19D%D4qp%14%1B%96Id%AD%19%DF%BCy%EF%CD%9B%DF%1F%F7~k%9F%BD%CF%DDg%EF%7D%D6%BA%00%90%FC%83%05%C2LX%09%80%0C%A1X%14%E1%E7%C5%88%8D%8Bg%60%07%01%0C%F0%00%03l%00%E0p%B3%B3B%16%F8F%02%99%02%7C%D8%8Cl%99%13%F8%17%BD%BA%0E%20%F9%FB*%D3%3F%8C%C1%00%FF%9F%94%B9Y%221%00P%98%8C%E7%F2%F8%D9%5C%19%17%C98%3DW%9C%25%B7O%C9%98%B64M%CE0J%CE%22Y%822V%93s%F2%2C%5B%7C%F6%99e%0F9%F32%84%3C%19%CBs%CE%E2e%F0%E4%DC'%E3%8D9%12%BE%8C%91%60%19%17%E7%08%F8%B92%BE%26c%83tI%86%40%C6o%E4%B1%19%7CN6%00(%92%DC.%E6sSdl-c%92(2%82-%E3y%00%E0H%C9_%F0%D2%2FX%CC%CF%13%CB%0F%C5%CE%CCZ.%12%24%A7%88%19%26%5CS%86%8D%93%13%8B%E1%CF%CFM%E7%8B%C5%CC0%0E7%8D%23%E21%D8%99%19Y%1C%E1r%00f%CF%FCY%14ym%19%B2%22%3B%D88980m-m%BE(%D4%7F%5D%FC%9B%92%F7v%96%5E%84%7F%EE%19D%1F%F8%C3%F6W~%99%0D%00%B0%A6e%B5%D9%FA%87mi%15%00%5D%EB%01P%BB%FD%87%CD%60%2F%00%8A%B2%BEu%0E%7Dq%1E%BA%7C%5ER%C4%E2%2Cg%2B%AB%DC%DC%5CK%01%9Fk)%2F%E8%EF%FA%9F%0E%7FC_%7C%CFR%BE%DD%EF%E5ax%F3%938%92t1C%5E7nfz%A6D%C4%C8%CE%E2p%F9%0C%E6%9F%87%F8%1F%07%FEu%1E%16%11%FC%24%BE%88%2F%94ED%CB%A6L%20L%96%B5%5B%C8%13%88%05%99B%86%40%F8%9F%9A%F8%0F%C3%FE%A4%D9%B9%96%89%DA%F8%11%D0%96X%02%A5!%1A%40~%1E%00(*%11%20%09%7Bd%2B%D0%EF%7D%0B%C6G%03%F9%CD%8B%D1%99%98%9D%FB%CF%82%FE%7DW%B8L%FE%C8%16%24%7F%8EcGD2%B8%12Q%CE%EC%9A%FCZ%024%20%00E%40%03%EA%40%1B%E8%03%13%C0%04%B6%C0%11%B8%00%0F%E0%03%02A(%88%04q%601%E0%82%14%90%01D%20%17%14%80%B5%A0%18%94%82%AD%60'%A8%06u%A0%114%836p%18t%81c%E048%07.%81%CB%60%04%DC%01R0%0E%9E%80)%F0%0A%CC%40%10%84%85%C8%10%15R%87t%20C%C8%1C%B2%85X%90%1B%E4%03%05C%11P%1C%94%08%25CBH%02%15%40%EB%A0R%A8%1C%AA%86%EA%A1f%E8%5B%E8(t%1A%BA%00%0DC%B7%A0Qh%12%FA%15z%07%230%09%A6%C1Z%B0%11l%05%B3%60O8%08%8E%84%17%C1%C9%F028%1F.%82%B7%C0%95p%03%7C%10%EE%84O%C3%97%E0%11X%0A%3F%81%A7%11%80%10%11%3A%A2%8B0%11%16%C2FB%91x%24%09%11!%AB%90%12%A4%02i%40%DA%90%1E%A4%1F%B9%8AH%91%A7%C8%5B%14%06EE1PL%94%0B%CA%1F%15%85%E2%A2%96%A1V%A16%A3%AAQ%07P%9D%A8%3E%D4U%D4(j%0A%F5%11MFk%A2%CD%D1%CE%E8%00t%2C%3A%19%9D%8B.FW%A0%9B%D0%1D%E8%B3%E8%11%F48%FA%15%06%83%A1c%8C1%8E%18%7FL%1C%26%15%B3%02%B3%19%B3%1B%D3%8E9%85%19%C6%8Ca%A6%B1X%AC%3A%D6%1C%EB%8A%0D%C5r%B0bl1%B6%0A%7B%10%7B%12%7B%05%3B%8E%7D%83%23%E2tp%B68_%5C%3CN%88%2B%C4U%E0Zp'pWp%13%B8%19%BC%12%DE%10%EF%8C%0F%C5%F3%F0%CB%F1e%F8F%7C%0F~%08%3F%8E%9F!(%13%8C%09%AE%84HB*a-%A1%92%D0F8K%B8KxA%24%12%F5%88N%C4p%A2%80%B8%86XI%3CD%3CO%1C%25%BE%25QHf%246)%81%24!m!%ED'%9D%22%DD%22%BD%20%93%C9Fd%0Fr%3CYL%DEBn%26%9F!%DF'%BFQ%A0*X*%04(%F0%14V%2B%D4(t*%5CQx%A6%88W4T%F4T%5C%AC%98%AFX%A1xDqH%F1%A9%12%5E%C9H%89%AD%C4QZ%A5T%A3tT%E9%86%D2%B42U%D9F9T9Cy%B3r%8B%F2%05%E5G%14%2C%C5%88%E2C%E1Q%8A(%FB(g(cT%84%AAOeS%B9%D4u%D4F%EAY%EA8%0DC3%A6%05%D0Ri%A5%B4oh%83%B4)%15%8A%8A%9DJ%B4J%9EJ%8D%CAq%15)%1D%A1%1B%D1%03%E8%E9%F42%FAa%FAu%FA%3BU-UOU%BE%EA%26%D56%D5%2B%AA%AF%D5%E6%A8y%A8%F1%D5J%D4%DA%D5F%D4%DE%A93%D4%7D%D4%D3%D4%B7%A9w%A9%DF%D3%40i%98i%84k%E4j%EC%D18%AB%F1t%0Em%8E%CB%1C%EE%9C%929%87%E7%DC%D6%845%CD4%234Wh%EE%D3%1C%D0%9C%D6%D2%D6%F2%D3%CA%D2%AA%D2%3A%A3%F5T%9B%AE%ED%A1%9D%AA%BDC%FB%84%F6%A4%0EU%C7MG%A0%B3C%E7%A4%CEc%86%0A%C3%93%91%CE%A8d%F41%A6t5u%FDu%25%BA%F5%BA%83%BA3z%C6zQz%85z%EDz%F7%F4%09%FA%2C%FD%24%FD%1D%FA%BD%FAS%06%3A%06!%06%05%06%AD%06%B7%0D%F1%86%2C%C3%14%C3%5D%86%FD%86%AF%8D%8C%8Db%8C6%18u%19%3D2V3%0E0%CE7n5%BEkB6q7Yf%D2%60r%CD%14c%CA2M3%DDmz%D9%0C6%B37K1%AB1%1B2%87%CD%1D%CC%05%E6%BB%CD%87-%D0%16N%16B%8B%06%8B%1BL%12%D3%93%99%C3le%8EZ%D2-%83-%0B-%BB%2C%9FY%19X%C5%5Bm%B3%EA%B7%FAhmo%9Dn%DDh%7D%C7%86b%13hSh%D3c%F3%AB%AD%99-%D7%B6%C6%F6%DA%5C%F2%5C%DF%B9%AB%E7v%CF%7Dngn%C7%B7%DBcw%D3%9Ej%1Fb%BF%C1%BE%D7%FE%83%83%A3%83%C8%A1%CDa%D2%D1%C01%D1%B1%D6%F1%06%8B%C6%0Acmf%9DwB%3By9%ADv%3A%E6%F4%D6%D9%C1Y%EC%7C%D8%F9%17%17%A6K%9AK%8B%CB%A3y%C6%F3%F8%F3%1A%E7%8D%B9%EA%B9r%5C%EB%5D%A5n%0C%B7D%B7%BDnRw%5Dw%8E%7B%83%FB%03%0F%7D%0F%9EG%93%C7%84%A7%A9g%AA%E7A%CFg%5E%D6%5E%22%AF%0E%AF%D7lg%F6J%F6)o%C4%DB%CF%BB%C4%7B%D0%87%E2%13%E5S%EDs%DFW%CF7%D9%B7%D5w%CA%CF%DEo%85%DF)%7F%B4%7F%90%FF6%FF%1B%01Z%01%DC%80%E6%80%A9%40%C7%C0%95%81%7DA%A4%A0%05A%D5A%0F%82%CD%82E%C1%3D!pH%60%C8%F6%90%BB%F3%0D%E7%0B%E7w%85%82%D0%80%D0%ED%A1%F7%C2%8C%C3%96%85%7D%1F%8E%09%0F%0B%AF%09%7F%18a%13Q%10%D1%BF%80%BA%60%C9%82%96%05%AF%22%BD%22%CB%22%EFD%99DI%A2z%A3%15%A3%13%A2%9B%A3_%C7x%C7%94%C7Hc%ADbW%C6%5E%8A%D3%88%13%C4u%C7c%E3%A3%E3%9B%E2%A7%17%FA%2C%DC%B9p%3C%C1%3E%A18%E1%FA%22%E3Ey%8B.%2C%D6X%9C%BE%F8%F8%12%C5%25%9C%25G%12%D1%891%89-%89%EF9%A1%9C%06%CE%F4%D2%80%A5%B5K%A7%B8l%EE.%EE%13%9E%07o%07o%92%EF%CA%2F%E7O%24%B9%26%95'%3DJvM%DE%9E%3C%99%E2%9ER%91%F2T%C0%16T%0B%9E%A7%FA%A7%D6%A5%BEN%0BM%DB%9F%F6)%3D%26%BD%3D%03%97%91%98qTH%11%A6%09%FB2%B53%F32%87%B3%CC%B3%8A%B3%A4%CB%9C%97%ED%5C6%25%0A%125eC%D9%8B%B2%BB%C54%D9%CF%D4%80%C4D%B2%5E2%9A%E3%96S%93%F3%267%3A%F7H%9Er%9E0o%60%B9%D9%F2M%CB'%F2%7D%F3%BF%5E%81Z%C1%5D%D1%5B%A0%5B%B0%B6%60t%A5%E7%CA%FAU%D0%AA%A5%ABzW%EB%AF.Z%3D%BE%C6o%CD%81%B5%84%B5ik%7F(%B4.%2C%2F%7C%B9.f%5DO%91V%D1%9A%A2%B1%F5~%EB%5B%8B%15%8AE%C576%B8l%A8%DB%88%DA(%D88%B8i%EE%A6%AAM%1FKx%25%17K%ADK%2BJ%DFo%E6n%BE%F8%95%CDW%95_%7D%DA%92%B4e%B0%CC%A1l%CFV%CCV%E1%D6%EB%DB%DC%B7%1D(W.%CF%2F%1F%DB%1E%B2%BDs%07cG%C9%8E%97%3B%97%EC%BCPaWQ%B7%8B%B0K%B2KZ%19%5C%D9%5DeP%B5%B5%EA%7DuJ%F5H%8DWM%7B%ADf%ED%A6%DA%D7%BBy%BB%AF%EC%F1%D8%D3V%A7UWZ%F7n%AF%60%EF%CDz%BF%FA%CE%06%A3%86%8A%7D%98%7D9%FB%1E6F7%F6%7F%CD%FA%BA%B9I%A3%A9%B4%E9%C3~%E1~%E9%81%88%03%7D%CD%8E%CD%CD-%9A-e%ADp%AB%A4u%F2%60%C2%C1%CB%DFx%7F%D3%DD%C6l%ABo%A7%B7%97%1E%02%87%24%87%1E%7F%9B%F8%ED%F5%C3A%87%7B%8F%B0%8E%B4%7Dg%F8%5Dm%07%B5%A3%A4%13%EA%5C%DE9%D5%95%D2%25%ED%8E%EB%1E%3E%1Ax%B4%B7%C7%A5%A7%E3%7B%CB%EF%F7%1F%D3%3DVs%5C%E5x%D9%09%C2%89%A2%13%9FN%E6%9F%9C%3E%95u%EA%E9%E9%E4%D3c%BDKz%EF%9C%89%3Ds%AD%2F%BCo%F0l%D0%D9%F3%E7%7C%CF%9D%E9%F7%EC%3Fy%DE%F5%FC%B1%0B%CE%17%8E%5Ed%5D%EC%BA%E4p%A9s%C0~%A0%E3%07%FB%1F%3A%06%1D%06%3B%87%1C%87%BA%2F%3B%5D%EE%19%9E7%7C%E2%8A%FB%95%D3W%BD%AF%9E%BB%16p%ED%D2%C8%FC%91%E1%EBQ%D7o%DEH%B8!%BD%C9%BB%F9%E8V%FA%AD%E7%B7sn%CF%DCYs%17%7D%B7%E4%9E%D2%BD%8A%FB%9A%F7%1B~4%FD%B1%5D%EA%20%3D%3E%EA%3D%3A%F0%60%C1%83%3Bc%DC%B1'%3Fe%FF%F4~%BC%E8!%F9a%C5%84%CED%F3%23%DBG%C7%26%7D'%2F%3F%5E%F8x%FCI%D6%93%99%A7%C5%3F%2B%FF%5C%FB%CC%E4%D9w%BFx%FC20%15%3B5%FE%5C%F4%FC%D3%AF%9B_%A8%BF%D8%FF%D2%EEe%EFt%D8%F4%FDW%19%AFf%5E%97%BCQ%7Fs%E0-%EBm%FF%BB%98w%133%B9%EF%B1%EF%2B%3F%98~%E8%F9%18%F4%F1%EE%A7%8CO%9F~%13%8F%C1%BA%08%00%00%00%04gAMA%00%00%B1%8E%7C%FBQ%93%00%00%00%20cHRM%00%00z%25%00%00%80%83%00%00%F9%FF%00%00%80%E6%00%00u.%00%00%EA_%00%00%3A%97%00%00%17oi%E4%C4%2B%00%00%00%81IDATx%9Cb%60%60%A8'%15%01%04%10%03%10%FF'%05%005%00%04%10T%CF~%E2%40%7D%3D%D0%1E%06%80%00%22G%0F%40%00%A1%EB%81%08!%ABC%16%81%E8%01%08%20%2C%F6%20%2BB3%02%A2%07%20%80%B0%BB%8D%01%09%60%BA%0D%20%80p%FA%07S%03%5C%0F%40%00%91c%0F%40%00%91%E3%1F%80%00%22'%DC%00%02%88%9C%F8%01%08%20r%F4%00%04%10TO%3D%D1%00%A8%01%20%80%18%20%E9%94%24%00%10%60%00nY%8B6%03%00Ea%00%00%00%00IEND%AEB%60%82";
	imgCloseWindow.style.position = 'absolute';
	imgCloseWindow.style.cursor = 'pointer';
	imgCloseWindow.style.left = "1px";
	imgCloseWindow.style.top = "1px";	
}








/*
	Drag code modified from:
	http://www.brainjar.com/dhtml/drag/demo.html
*/
function switchToVideo(id){
	//set player and divBorder being handled
	divBorder = document.getElementById('div'+idVideoHandled);
	player = document.getElementById('player'+idVideoHandled);
}

function dragStart(event) 
{
	var el;
	var x, y;


	//get video id 
	idVideoHandled = event.target.getAttribute('id');
	if( idVideoHandled.search(/^(div)\S+/) > -1)
		idVideoHandled = event.target.getAttribute('id').replace(/div/,'');		
	else
		idVideoHandled = event.target.parentNode.getAttribute('id').replace(/div/,'');//divBorder
		
		
	switchToVideo(idVideoHandled);
	
	
	//close button?
	if(event.target.getAttribute('id').search(/idCloseWindow/) > -1){
		player.parentNode.removeChild(player);
		divBorder.parentNode.removeChild(divBorder);
		player = null;
		divBorder = null;
		
		arrayVideoId = getArrayVideoId();
		if (arrayVideoId.length == 0) {
		    video_frame.zindex = 1000;
            GM_setValue("video_frame_data", video_frame.toSource());
		}    
		return;
	}
	
	//get dragObj
	dragObj = getDragObject(idVideoHandled);
  
	// If an element id was given, find it. Otherwise use the element being
	// clicked on.
	dragObj.elNode = event.target;

	// If this is a text node, use its parent element.
	if (dragObj.elNode.nodeType == 3)
		dragObj.elNode = dragObj.elNode.parentNode;

	// Get cursor position with respect to the page.
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;

	// Save starting positions of cursor and element.
	dragObj.cursorStartX = x;
	dragObj.cursorStartY = y;
	dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
	dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

	if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
	if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

	// Update element's z-index.
	//dragObj.elNode.style.zIndex = ++dragObj.zIndex;
	player.style.visibility = 'hidden';	
	divBorder.style.zIndex++;
	player.style.zIndex--;

	// Capture mousemove and mouseup events on the page.
	document.addEventListener("mousemove", dragGo,   true);
	document.addEventListener("mouseup",   dragStop, true);
	event.preventDefault();
}



function dragGo(event) {

  var x, y;

  // Get cursor position with respect to the page.
  x = event.clientX + window.scrollX;
  y = event.clientY + window.scrollY;

  dragObj = getDragObject(idVideoHandled);
  
  //drag
  if( dragObj.elNode.getAttribute('id') != 'idResizeHandle' ){  
    
	// Move drag element by the same amount the cursor has moved.
    divBorder.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    //divBorder.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY - 17) + "px";
    divBorder.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";
    player.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY + 17) + "px";//�����Ƃ邽��
  
  //resize
  }else{  
  
	var w, h;
	
	w = parseInt(player.getAttribute('width'));
	h = parseInt(player.getAttribute('height'));
	
	w += (dragObj.elStartLeft + x - dragObj.cursorStartX);
	//w -= (dragObj.elStartLeft + x - dragObj.cursorStartX);
	h += (dragObj.elStartTop  + y - dragObj.cursorStartY);
	//h -= (dragObj.elStartTop  + y - dragObj.cursorStartY);
	
	divBorder.style.width = w + "px";
	divBorder.style.height = (h + 17) + "px";
  }

  event.preventDefault();
}


function dragStop(event) {

  // Stop capturing mousemove and mouseup events.
  document.removeEventListener("mousemove", dragGo,   true);
  document.removeEventListener("mouseup",   dragStop, true);
  
  dragObj = getDragObject(idVideoHandled);  

  // Apply changes  
  if( dragObj.elNode.getAttribute('id') == 'idResizeHandle' ){     
	//resize
      player.setAttribute('width', divBorder.style.width );
      player.setAttribute('height', parseInt(divBorder.style.height.match(/\d+/)[0]) - 17);	  
  }else{
      // move 
      player.style.left = dragObj.elNode.style.left;
      player.style.top  = parseInt(dragObj.elNode.style.top.match(/\d+/)[0]) + 17;
  }

  idVideoHandled = null;
   
  divBorder.style.zIndex--;
  player.style.zIndex++;
  player.style.visibility = 'visible';

  //set video frame data;
  video_frame.top = player.style.top.match(/\d+/)[0];
  video_frame.left = player.style.left.match(/\d+/)[0];
  video_frame.height = player.getAttribute("height").match(/\d+/)[0];
  video_frame.width = player.getAttribute("width").match(/\d+/)[0];
  GM_setValue("video_frame_data", video_frame.toSource());
}



function getDragObject(id)
{
	for(i=0; i<arrayDragObj.length; i++)
	{
		if(arrayDragObj[i].id == id){
			//alert("found "+);
			return arrayDragObj[i];
		}
	}
	return null;
}


/**
 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 * Version : 2.01.A
 * By Binny V A
 * License : BSD
 */
shortcut = {
	'all_shortcuts':{},//All the shortcuts are stored in this array
	'add': function(shortcut_combination,callback,opt) {
		//Provide a set of default options
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		}
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}

		var ele = opt.target
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();

		//The function to be called at keypress
		var func = function(e) {
			e = e || window.event;
			
			if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;

				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
	
			//Find Which key is pressed
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			var character = String.fromCharCode(code).toLowerCase();
			
			if(code == 188) character=","; //If the user presses , when the type is onkeydown
			if(code == 190) character="."; //If the user presses , when the type is onkeydown
	
			var keys = shortcut_combination.split("+");
			//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
			var kp = 0;
			
			//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			}
			//Special Keys - and their codes
			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
	
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
				
				'pause':19,
				'break':19,
				
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
				
				'pageup':33,
				'page_up':33,
				'pu':33,
	
				'pagedown':34,
				'page_down':34,
				'pd':34,
	
				'left':37,
				'up':38,
				'right':39,
				'down':40,
	
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123
			}
	
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	//Meta is Mac specific
			};
                        
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
                        
			for(var i=0; k=keys[i],i<keys.length; i++) {
				//Modifiers
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;

				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;

				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1) { //If it is a special key
					if(special_keys[k] == code) kp++;
					
				} else if(opt['keycode']) {
					if(opt['keycode'] == code) kp++;

				} else { //The special keys did not match
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}

			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
	
				if(!opt['propagate']) { //Stop the event
					//e.cancelBubble is supported by IE - this will kill the bubbling process.
					e.cancelBubble = true;
					e.returnValue = false;
	
					//e.stopPropagation works in Firefox.
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		}
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		//Attach the function with the event
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},

	//Remove the shortcut - just specify the shortcut and I will remove the binding
	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination])
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];

		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
}
