// ==UserScript==
// @name           SA YouTube Inline Links
// @namespace      http://evercrest.com/greasemonkey
// @description    Displays YouTube links inline on SA Forums
// @include        http://forums.somethingawful.com/showthread.php*
// @Author         biznatchio
// @Contributors   Not UNIX, moho
// @Version        1.2
// ==/UserScript==

var SAYT_UVIDEO_WIDTH = 450;
var SAYT_UVIDEO_HEIGHT = 370;

var SAYT_GVIDEO_WIDTH = 450;
var SAYT_GVIDEO_HEIGHT = 370;

function sayt_processRemoveLink(e, linkNode, embedEl)
{
	var targetEl = e.target;
	embedEl.parentNode.insertBefore(linkNode, embedEl);
	embedEl.parentNode.removeChild(embedEl);
	targetEl.parentNode.removeChild(targetEl);
	e.preventDefault();
}

function sayt_insertRemoveLink(linkNode, embedEl)
{
	var aEl = document.createElement("A");
	aEl.href = document.location.href;
	aEl.appendChild(document.createTextNode("[hide]"));
	aEl.addEventListener('click', function(e) { sayt_processRemoveLink(e, linkNode, embedEl); }, false);
	embedEl.parentNode.insertBefore(aEl, embedEl);
}

function sayt_vidClick(e, linkNode, videoId)
{
	var embedEl = document.createElement("EMBED");
	embedEl.setAttribute('width', SAYT_UVIDEO_WIDTH);
	embedEl.setAttribute('height', SAYT_UVIDEO_HEIGHT);
	embedEl.setAttribute('quality',"high");
	embedEl.setAttribute('bgcolor',"#FFFFFF");
	embedEl.setAttribute('type', "application/x-shockwave-flash");
	embedEl.setAttribute('wmode', "transparent");
	embedEl.setAttribute('src', "http://www.youtube.com/v/" + videoId);

	if (!embedEl.outerHTML)
	{
		linkNode.parentNode.insertBefore(embedEl, linkNode);
		sayt_insertRemoveLink(linkNode, embedEl);
		linkNode.parentNode.removeChild(linkNode);
	}
	else
	{
		var span = document.createElement("SPAN");
		linkNode.parentNode.insertBefore(span, linkNode);
		sayt_insertRemoveLink(linkNode, span);
		linkNode.parentNode.removeChild(linkNode);
		span.innerHTML = embedEl.outerHTML;
	}

	e.preventDefault();

	return;
}

function sayt_vidGoogleClick(e, linkNode, domain, videoId)
{
	var embedEl = document.createElement("EMBED");
	embedEl.setAttribute('width', SAYT_UVIDEO_WIDTH);
	embedEl.setAttribute('height', SAYT_UVIDEO_HEIGHT);
	embedEl.setAttribute('type', 'application/x-shockwave-flash');
	embedEl.setAttribute('flashvars', '');
	embedEl.setAttribute('src', 'http://video.google.' + domain + '/googleplayer.swf?docId=' + videoId + '&hl=en');

	if (!embedEl.outerHTML)
	{
		linkNode.parentNode.insertBefore(embedEl, linkNode);
		sayt_insertRemoveLink(linkNode, embedEl);
		linkNode.parentNode.removeChild(linkNode);
	}
	else
	{
		var span = document.createElement("SPAN");
		linkNode.parentNode.insertBefore(span, linkNode);
		sayt_insertRemoveLink(linkNode, span);
		linkNode.parentNode.removeChild(linkNode);
		span.innerHTML = embedEl.outerHTML;
	}

	e.preventDefault();

	return;
}

function sayt_vidDmClick(e, linkNode, href)
{
	var pwText = document.createTextNode("[[Please wait...]]");
	linkNode.parentNode.insertBefore(pwText, linkNode);
	linkNode.parentNode.removeChild(linkNode);

	var xx = function(responseDetails)
	{
		var resNode = null;
		if (responseDetails.status == 200)
		{
			resNode = sayt_extractDmPlayer(responseDetails.responseText);
		}
		else
		{
			resNode = sayt_extractDmPlayer(null);
		}

		pwText.parentNode.insertBefore(resNode, pwText);
		sayt_insertRemoveLink(linkNode, resNode);
		pwText.parentNode.removeChild(pwText);
	};
    GM_xmlhttpRequest({
			method: "GET",
			url: href,
			onload: xx,
			onerror: xx
		});

	e.preventDefault();
	return;
}

function sayt_extractDmPlayer(txt)
{
	var res = document.createTextNode("[[Unable to retrieve player]]");
	var INPUTTEXT = '<input id="video_player_embed_code_text"';
	var STARTTEXT = 'value="';
	var ENDTEXT = '"';

	if (txt != null && txt.indexOf(INPUTTEXT) != -1)
	{
		try
		{
			var idx = txt.indexOf(INPUTTEXT);
			var subt = txt.substr(idx);
			idx = subt.indexOf(STARTTEXT);
			subt = subt.substr(idx + STARTTEXT.length);
			idx = subt.indexOf(ENDTEXT);
			subt = subt.substr(0, idx);
			var tc = document.createElement("div");
			tc.innerHTML = subt;
			tc.innerHTML = tc.textContent;
			res = tc;
		}
		catch(err) { }
	}
	return res;
}

function sayt_prepareVideoPlayer(linkNode, videoId)
{
	linkNode.style.backgroundColor = "#ffcccc !important";
	linkNode.vidid = videoId;
	linkNode.addEventListener('click', function(e) { sayt_vidClick(e, e.target, videoId); }, false);
}

function sayt_prepareGoogleVideoPlayer(linkNode, videoDomain, videoId)
{
	linkNode.style.backgroundColor = "#ffcccc !important";
	linkNode.vidid = videoId;
	linkNode.addEventListener('click', function(e) { sayt_vidGoogleClick(e, e.target, videoDomain, videoId); }, false);
}

function sayt_prepareDmVideoPlayer(linkNode, href)
{
	linkNode.style.backgroundColor = "#ffcccc !important";
	linkNode.vidid = href;
	linkNode.addEventListener('click', function(e) { sayt_vidDmClick(e, e.target, href); }, false);
}

function sayt_init()
{
	var links = document.evaluate('//a[starts-with(@href, "http")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<links.snapshotLength; i++)
	{
		var thisLink = links.snapshotItem(i);

		var href = thisLink.href;
		var hrefmatch = href.match(/^http\:\/\/(www\.)?youtube\.com\/watch\?v=([-_0-9a-zA-Z]+)/);
		if (hrefmatch)
		{
			var vidid = hrefmatch[2];
			sayt_prepareVideoPlayer(thisLink, vidid);
		}
		else
		{
			var ghrefmatch = href.match(/^http\:\/\/video\.google\.(com|ca|co\.uk)\/videoplay\?docid=([-0-9]+)/);
			if (ghrefmatch)
			{
				var gviddomain = ghrefmatch[1];
				var gvidid = ghrefmatch[2];
				sayt_prepareGoogleVideoPlayer(thisLink, gviddomain, gvidid);
			}
			else
			{
				var dmmatch = href.match(/^(http\:\/\/(.*\.)?dailymotion\.com\/(.*\/)?video\/.*)$/);
				if (dmmatch)
				{
					var hh = dmmatch[1];
					sayt_prepareDmVideoPlayer(thisLink, hh);
				}
			}
		}
	}
}

sayt_init();

