STS Helper

In Steam Translation Server, add many features to make translate easier.

当前为 2014-10-04 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name     		STS Helper
// @namespace		iFantz7E.StsHelper
// @version			1.20
// @description		In Steam Translation Server, add many features to make translate easier.
// @match      		http://translation.steampowered.com/*
// @match      		https://translation.steampowered.com/*
// @icon      		http://translation.steampowered.com/public/favicon.ico
// @grant       	GM_addStyle
// @copyright		2014, 7-elephant
// ==/UserScript==

function attachOnLoad(callback)
{
	window.addEventListener("load", function (e) 
	{
		callback();
	});
}

function attachOnReady(callback) 
{
	document.addEventListener("DOMContentLoaded", function (e) 
	{
		callback();
	});
}

function addKeyCtrl(ele, input, keyCode, keyName)
{
	if (ele != null && input != null)
	{
		//if (input.getAttribute("disabled") == null)
		//	return;
			
		if (keyName != null && keyName != "")
		{
			input.value += " (Ctrl+" + keyName + ")";
		}
		
		ele.addEventListener("keydown", function (e) 
		{
			//console.log("Key: " + e.keyCode);
			
			if (e.ctrlKey && e.keyCode == keyCode) 
			{
				input.click();
				return false;
			}
		}, true);
	}
}

function addKeyAlt(ele, input, keyCode, keyName)
{
	if (ele != null && input != null)
	{
		if (keyName != null && keyName != "")
		{
			input.value += " (Alt+" + keyName + ")";
		}
		
		ele.addEventListener("keydown", function (e) 
		{
			if (e.altKey && e.keyCode == keyCode) 
			{
				input.click();
				return false;
			}
		}, true);
	}
}

function addKeyCtrlEnter(form, input)
{
	addKeyCtrl(form, input, 13, "Enter")
}

function resizeSuggestionBox()
{
	// Original: STS Suggestions Box Height
	// Edit from: http://userscripts.org/scripts/show/119655

	var script = document.createElement('script');

	script.innerHTML = "if ($) { function showSuggestionsBox(url){g_suggestionsBoxIsOpen=true;$('suggestions_box_outer').appear({duration:0.1});$('suggestions_iframe').setAttribute('src',url);if(!Prototype.Browser.IE){$('suggestions_iframe').focus();}$('suggestions_iframe').style.height=(document.viewport.getHeight()*0.99)+'px';return false;}}"

	document.getElementById('pageContainer').appendChild(script);
}

function getQueryByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

function main() 
{

	var url = document.documentURI;

	GM_addStyle(
		"  #logout { position: fixed; z-index: 1001; right: 12px; top: 10px; line-height: 24px; text-align: right; } "
		+ "#suggestionmain > div:nth-child(4) > form:nth-child(2) > div:nth-child(1) "
		+ " { text-align: left; } "
		+ "form.lbAction:nth-child(2) > div:nth-child(2) > input:nth-child(1) "
		+ " { width: 97%; height: 30px; margin-top: 5px; } "
		+ "form.lbAction:nth-child(1) > div:nth-child(2) > input:nth-child(1) "
		+ " { width: 90%; margin-top: 5px; } "
		+ "div.suggestion form.lbAction textarea"
		+ " { width: 700px !important; min-height: 50px; } "
		+ "div.suggestion form.lbAction input[type=submit]"
		+ " { vertical-align: top; margin-top: 1px; } "
		+ ".progress td { vertical-align: top; } "
		+ "div#suggestions_nav { z-index: 3; position: absolute; width: 425px; left: 560px; top: 6px; text-align: right; line-height: 26px; } "
		+ "#suggestionmain .smallcopy { width: 550px; } "
		+ "#leftAreaContainer > table:nth-child(5) > tbody:nth-child(1) > tr > td:nth-child(1) { vertical-align: top; } "
		+ "#leftAreaContainer > table:nth-child(5), #leftAreaContainer > table:nth-child(5) th, #leftAreaContainer > table:nth-child(5) td "
		+ " { border: 1px solid; border-collapse: collapse; padding: 4px; } "
		+ "#suggestions_box { margin-top: 1px !important; } "
		+ "#suggestions_iframe { min-height: 100px !important; } "
		+ "#keylist td:nth-child(1) > div:hover  "
		+ " { background-repeat: no-repeat; background-position: center; background-color: #0D0D0D !important; } "
		+ ".stsh_btn { width: 90px; } "
		+ ".stsh_btnLong { width: 130px; } "
		+ ".stsh_suggestion_header { color: #A4B23C; } "
		+ ".stsh_suggestion_comment:before { background-color: #CF8B37 !important; } "
		+ ".stsh_suggestion_pending:before { background-color: #FFF !important; } "
		+ ".stsh_suggestion_approved:before { background-color: #A4B23C !important; } "
		+ ".stsh_suggestion_declined:before { background-color: red !important; } "
		+ ".stsh_suggestion_applied:before { background-color: #2EBCEB !important; } "
		+ ".stsh_suggestion_removed:before { background-color: #555 !important; } "
		+ ".stsh_suggestion { list-style: none; } "
		+ ".stsh_suggestion:before "
		+ " { content: ''; display: inline-block; position: relative; height: 6px; width: 6px; "
		+ "   border-radius: 3px; background-clip: padding-box; margin-right: -6px; top: -1px; left: -12px; background-color: green; }"
		+ "#stsh_frame { text-align: center; } "
		+ ".stsh_blue { color: #2ebceb; } "
		+ ".suggestion_signature input[value~='APPROVE'], .suggestion_signature input[value~='Next'] { color: #A4B23C } "
		+ ".suggestion_signature input[value~='DECLINE'], .suggestion_signature input[value~='Next']:nth-child(5) { color: #F22 } "
		+ ".suggestion_signature input[disabled='disabled'] { color: #777 !important; } "
    );

	// Clean links
	{
		var pattT1 = /\?t=[0-9]{6,}&/g;
		var pattT2 = /\&t=[0-9]{6,}&/g;
	
		var as = document.querySelectorAll("a");
		for (var i = 0; i < as.length; i++)
		{
			var href = as[i].href;
			if (pattT1.test(href))
			{
				as[i].href = href.replace(pattT1,"?");
			}
			else if (pattT2.test(href))
			{
				as[i].href = href.replace(pattT2,"&");
			}
		}
	}

	var eleLogout = document.querySelector("#logout");
	if (eleLogout != null)
	{
		var logoutHtml = ' <input value="My Profile" type="button" onmouseup="window.open(\'/user_activity.php\',\'_blank\'); return false;" /> '
			+ ' <input name="login_button" value="Logout?" type="submit" onmouseup="return confirm(\'Logout?\');" /> ';
			
		var d = new Date();
		if ((d.getUTCMonth() > 8) || 
			(d.getUTCMonth() == 8 && d.getUTCDate() >= 25) || (d.getUTCMonth() == 0 && d.getUTCDate() <= 1))
		{
			
			logoutHtml += ' <br/> <input value="Year-end Rally" type="button" onmouseup="window.open(\'/rally.php\',\'_blank\'); return false;" /> ';
		}
		
		eleLogout.innerHTML = logoutHtml;
	}

	if (url.indexOf("Us_And_Them.php") > -1)
	{
		var container = "\"";
		var tdEng = document.querySelector("#leftAreaContainer > table:nth-child(5) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)");
		if (tdEng != null)
		{
			tdEng.innerHTML = container + tdEng.innerHTML + container;
		}
	
		var h1 = document.querySelector("#leftAreaContainer > h1:nth-child(2)");
		if (h1 != null)
		{
			var header = h1.textContent.trim();
			var key = header.split(" ")[0];
			h1.innerHTML = header.replace(key, "<a href='http://translation.steampowered.com/translate.php?search_input=" 
				+ encodeURIComponent(key) + "' >" + key + "</a>");
			document.title = key + " - " + document.title;
		}
	
	} // End Us_And_Them.php

	if (url.indexOf("suggestions.php") > -1)
	{
		var ele = document.querySelector("#suggestionmain > div:nth-child(4) > form:nth-child(2) > div:nth-child(1) > textarea:nth-child(1)");
		if (ele != null)
		{
			ele.style.width = "960px";
			ele.style.height = "64px";
			ele.style.marginLeft = "3px";
		}
	
		var input = document.querySelector("form.lbAction:nth-child(2) > div:nth-child(2) > input:nth-child(2)");
		if	(input == null)
		{
			input = document.querySelector("form.lbAction:nth-child(2) > div:nth-child(3) > input:nth-child(2)");
		}
	
		var form = document.querySelector("form.lbAction:nth-child(2)");
	
		addKeyCtrlEnter(form, input);
	
		var inputClose = document.querySelector("#suggestions_nav > input:nth-child(3)");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
		}
	
		var td = document.querySelector(".progress > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(3)");
		if (td != null && td.textContent.trim() == "")
		{
			td.innerHTML = ' <input value="Move Suggestion Box Here" type="button" onmouseup="moveSuggestionBox(); return false;" /> ';
		}
	
		var textarea = document.querySelector("form.lbAction > div:nth-child(1) > textarea:nth-child(1)");
		if (textarea != null)
		{
			textarea.focus();
			textarea.style.height = textarea.scrollHeight + "px";
		}
	
		var br = document.querySelector("form.lbAction:nth-child(2) > div:nth-child(2) > br:nth-child(1)");
		if (br != null)
		{
			br.parentElement.removeChild(br);
		}
		
		var key = "";
	
		var divNav = document.querySelector("div#suggestions_nav");
		if (divNav != null)
		{
			var insert = "";
			var spliter = "_";
			var regApp = /[0-9]{2,}/;
		
			var aKey = document.querySelector(".smallcopy > font:nth-child(2) > a:nth-child(1)");
			if (aKey != null)
			{
				insert += ' <br/> &nbsp; ';
				key = encodeURIComponent(aKey.textContent.trim());
			
				if (key == "token-key")
				{
					aKey = document.querySelector(".smallcopy > a:nth-child(3)");
					if (aKey != null)
					{
						key = encodeURIComponent(aKey.textContent.trim());
					}
				}
			
				if (key != "")
				{
					document.title = key + " - " + document.title;
					
					if (key.split(spliter).length > 1)
					{
						if (key.indexOf("%23") == 0)
						{						
							var firstSpliter = key.indexOf(spliter);
							var keySharp = key.substring(0, firstSpliter);
							insert += ' <input value="Search by Sharp" type="button" onmouseup="window.open(\'/translate.php?search_input=' 
								+ keySharp + '\',\'_blank\'); return false;"> ';
						}
					
						var lastSpliter = key.lastIndexOf(spliter);
						var keyGroup = key.substring(0, lastSpliter);
						insert += ' <input value="Search by Group" type="button" onmouseup="window.open(\'/translate.php?search_input=' 
							+ keyGroup + '\',\'_blank\'); return false;"> ';
					}
					insert += ' <input value="Search by Key" type="button" onmouseup="window.open(\'/translate.php?search_input=' 
						+ key + '\',\'_blank\'); return false;"> ';
				}
			}
		
			var tdText = document.querySelector(".progress > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(1)");
			if (tdText != null)
			{
				if (tdText.textContent.trim() == "")
				{
					tdText = document.querySelector(".progress > tbody:nth-child(2) > tr:nth-child(3) > td:nth-child(1)");
				}
			}
			if (tdText != null)
			{
				var text = encodeURIComponent(tdText.textContent.trim()).replace(/(%20|%09)/g,"+")
					.replace(/'/g,"\\'").replace("%0A","+").replace(/\++/g,"+").substr(0, 80);
					
				if (text.length >= 80)
				{
					text = text.substr(0,text.lastIndexOf("+"));
				}
				
				if (text != "")
				{
					insert += ' <br/> &nbsp; <input value="Search by String" type="button" onmouseup="window.open(\'/translate.php?search_input=' 
						+ text + '\',\'_blank\'); return false;"> ';
				}
			}
		
			var app = regApp.exec(key.replace("%23",""));
			if (key.indexOf("faq") < 0 && app != null)
			{
				insert += ' <br/> &nbsp; ';
			
				if (key.indexOf("SharedFiles_App_") == 0)
				{
					insert += ' <input value="View Workshop" type="button" onmouseup="window.open(\'http://steamcommunity.com/workshop/browse?appid=' 
						+ app + '\',\'_blank\'); return false;"> ';
				}
			
				insert += ' <input value="View Community" type="button" onmouseup="window.open(\'http://steamcommunity.com/app/' 
					+ app + '/\',\'_blank\'); return false;"> '
			
				insert += ' <input value="View App" type="button" onmouseup="window.open(\'http://store.steampowered.com/app/' 
					+ app + '/\',\'_blank\'); return false;"> ';
			}
		
			var src = document.documentURI;
			var insertBefore = " <input value=\"Refresh\" onmouseup=\"location.reload(); return false;\" type=\"button\"> "
				+ " <input value=\"Frame\" onmouseup=\"window.open('" 
				+ src + "','_blank'); return false;\" type=\"button\"> ";
		
			var innerNew = divNav.innerHTML
				.replace('<input value="Previous','&nbsp;&nbsp;<input value="Prev')
				.replace('<input value="Close','&nbsp;&nbsp;<input value="Close');
		
			divNav.innerHTML = insertBefore + innerNew + insert;
		}
	
		var divSgts = document.querySelectorAll("body > div > div.suggestions_list");
		if (divSgts.length > 0)
		{
			var noResult = "No results";
			var br = "<br>";
			var brSpace = " <br> ";
			var tag = "<";
			var colon = ":";
			var comma = ",";
			var isEdit = false;
		
			var p = divSgts[divSgts.length - 1].nextSibling;
			var glossaries = p.innerHTML.split(br);
			for (var i = 0; i < glossaries.length; i++)
			{
				var glossary = glossaries[i].trim();
				if (glossary.length > 0 && glossary.indexOf(tag) != 0 && glossary != noResult)
				{
					var colonIndex = glossary.indexOf(colon);
					var contentHead = glossary.substr(0, colonIndex + 2);
					var contentAll = glossary.substr(colonIndex + 1);
					var contents = contentAll.split(comma).sort();
				
					var contentsNew = contents.filter(function(elem, pos) 
					{
						return contents.indexOf(elem) == pos;
					});
				
					for (var j = 0; j < contentsNew.length; j++)
					{
						contentsNew[j] = " <span onclick='clickToSelect(this)'>" 
							+ contentsNew[j].trim() + "</span>";
					}
				
					glossaries[i] = contentHead + contentsNew.join(comma);
					isEdit = true;
				}
			}
		
			if (isEdit)
			{
				p.innerHTML = glossaries.join(brSpace);
			}
		}
	
		var regUrl = /http[^ "]+/ig;
		var eleComments = document.querySelectorAll("div.suggestion > div:nth-child(2) > i:nth-child(3), "
			+ ".suggestion_signature > div:nth-child(2) > div:nth-child(1) > i:nth-child(6), "
			+ ".row0 > td:nth-child(2), .row1 > td:nth-child(2), .row2 > td:nth-child(2)");
			
		for (var i = 0; i < eleComments.length; i++)
		{
			var comment = eleComments[i].innerHTML + " ";
			if (comment.indexOf("<a") == -1)
			{
				var commentUrls = comment.match(regUrl) || [];
				for (var j = 0; j < commentUrls.length; j++)
				{
					var commentUrl = commentUrls[j] + " ";
					comment = comment.replace(commentUrl,"<a target='_blank' href='" + commentUrls[j] + "' >" + commentUrls[j] + "</a> ");
				}
				eleComments[i].innerHTML = comment;
			}
			
			var eleAs = eleComments[i].querySelectorAll("a");
			for (var j = 0; j < eleAs.length; j++)
			{
				var href = eleAs[j].getAttribute("href");
				if (href.indexOf("#") > -1)
				{
					eleAs[j].setAttribute("href", href.replace("#","%23"));
				}
			}
		}
	
		var divIntro = document.querySelector("#suggestionmain > div.smallcopy");
		if (divIntro != null)
		{
			var htmlToken = "You are editing token-key:";
			var htmlTokenReplace = "Token-key:";
			var htmlIntro = "Enter and submit new suggestions below. Do not alter HTML tags or variables.";
			var htmlIntroReplace = ' <a href="mailto:[email protected]"><font style="color:white;">Report Tokens</font></a>';
			var htmlContact = 'Please report truncated tokens to: <a href="mailto:[email protected]"><font style="color:white;">[email protected]</font></a>';
			
			var htmlAfter = "";
			
			var qFile = getQueryByName("filename");
			if (qFile != "")
			{
				htmlAfter += ' >> <font style="color:#2ebceb;" onclick="clickToSelect(this)">' + qFile + '</font>';
			}
			
			if (key != "")
			{
				htmlAfter += ' <br/>Share: <font style="color:#2ebceb; font-size: 0.8em;" onclick="clickToSelect(this)">'
					+ 'http://translation.steampowered.com/translate.php?search_input=' + key
					+ "</font>";
			}
			
			divIntro.innerHTML = divIntro.innerHTML
				.replace(htmlToken, htmlTokenReplace)
				.replace(htmlIntro, htmlIntroReplace)
				.replace(htmlContact, 'File: <font style="color:#2ebceb;" onclick="clickToSelect(this)">')
				.trim() + "</font>"
				+ htmlAfter;
		}
	
		var formComments = document.querySelectorAll("div.suggestion form.lbAction");
		for (var i = 0; i < formComments.length; i++)
		{
			var formComment = formComments[i];
			var inputComment = formComment.querySelector("input[type=submit]");
			if (inputComment != null)
			{
				addKeyCtrlEnter(formComment, inputComment);
			}
		}
		
		var inputApprove = document.querySelector(".suggestion_signature input[value~='APPROVE']");
		if (inputApprove != null)
		{
			addKeyAlt(document, inputApprove, 219, "[");	// [
			addKeyAlt(document, inputApprove, 0, "");		// [
			addKeyAlt(document, inputApprove, 79, "");		// O
			addKeyAlt(document, inputApprove, 65, "");		// A
		}
		
		var inputApproveNext = document.querySelector(".suggestion_signature input[value~='Next']");
		if (inputApproveNext != null)
		{
			inputApproveNext.value = "Next";
			addKeyAlt(document, inputApproveNext, 221, "]");	// ]
			addKeyAlt(document, inputApproveNext, 188, "");		// ]
			addKeyAlt(document, inputApproveNext, 80, "");		// P
			addKeyAlt(document, inputApproveNext, 83, "");		// S
		}
		
		var inputDeclineNext = document.querySelector(".suggestion_signature input[value~='Next']:nth-child(5)");
		if (inputDeclineNext != null)
		{
			inputDeclineNext.value = "Next";
		}
		
		var inputPrev = document.querySelector("#suggestions_nav > input[value^='Prev']");
		if (inputPrev != null)
		{
			addKeyCtrl(document, inputPrev, 219, "[");
			addKeyCtrl(document, inputPrev, 0, "");
		}
		
		var inputPrev = document.querySelector("#suggestions_nav > input[value~='Next']");
		if (inputPrev != null)
		{
			addKeyCtrl(document, inputPrev, 221, "]");
			addKeyCtrl(document, inputPrev, 188, "");
		}
	
	} // End suggestions.php

	if (url.indexOf("translate.php") > -1)
	{
		if (url.indexOf("search_input=") > -1)
		{
			var searchText = decodeURIComponent(url.replace(/^.*search_input=/i,"").replace(/&.*$/i,"")).replace(/\+/g," ").trim();
			if (searchText != "")
			{
				document.title = searchText + " - " + document.title;
			}
		}
	
		var outer = document.getElementById("suggestions_box_outer");
		if (outer != null)
		{
			outer.setAttribute("onclick","hideSuggestionsBox();");
		}
	
		var divBtn = document.createElement("div");
		document.body.appendChild(divBtn);
		divBtn.innerHTML = ' \
<div style="position: fixed; z-index: 3; right: 12px; top: 84px; line-height: 24px; text-align: right;"> \
	&nbsp; <input value="Hide App" class="stsh_btn" type="button" onmouseup="hideKeyAppInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide Game" class="stsh_btn" type="button" onmouseup="hideKeyGameInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide FAQ" class="stsh_btn" type="button" onmouseup="hideKeyFaqInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide Support" class="stsh_btn" type="button" onmouseup="hideKeySupportInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Hide not similar" class="stsh_btnLong" type="button" onmouseup="hideStrNotMatchInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide very long" class="stsh_btnLong" type="button" onmouseup="hideStrLongInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Hide no Suggestion" class="stsh_btnLong" type="button" onmouseup="hideSgtNoneInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide Suggested" class="stsh_btnLong" type="button" onmouseup="hideSgtSuggestedInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide Translated" class="stsh_btnLong" type="button" onmouseup="hideSgtTranslatedInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Sort by Key" class="stsh_btn" type="button" onmouseup="sortKeyInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Refresh" class="stsh_btn" type="button" onmouseup="hideSuggestionsBox(); return false;" /> \
	<br/> &nbsp; <input value="Show All" class="stsh_btn" type="button" onmouseup="showKey(); return false;" /> \
	<br/><br/> &nbsp; <span id="spanShowing" style="color: white;"></span> \
</div> \
';

		function countShowing()
		{
			var trKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr");
			var countAll = trKeys.length;
			var countShow = 0;
			for (var i = 0; i < trKeys.length; i++)
			{
				if (trKeys[i].style.display != "none")
				{
					countShow++
				}
			}
			var spanShowing = document.getElementById("spanShowing");
			if (spanShowing != null)
			{
				spanShowing.textContent = "Showing " + countShow + " of " + countAll;
			}
		}
		setInterval(countShowing, 500);
	
		resizeSuggestionBox();
	
		var ifrm = document.querySelector("#suggestions_iframe");
		if (ifrm != null)
		{
			ifrm.addEventListener("DOMAttrModified", function (ev) 
			{
				if (ev.attrName === "src")
				{
					var divFrame = document.querySelector("#stsh_frame");
					if (divFrame == null)
					{
						var divOuter = document.querySelector("#suggestions_box_outer");
						if (divOuter != null)
						{
							divFrame = document.createElement("div");
							divFrame.id = "stsh_frame";
							divOuter.appendChild(divFrame);
						}
					}
					if (divFrame != null)
					{
						var src = ifrm.getAttribute("src");
						divFrame.innerHTML = "<br/><input value=\"Frame\" onmouseup=\"window.open('" 
							+ src + "','_blank'); return false;\" type=\"button\">";
					}
				}
			}, false);
		}
	
	} // End translate.php

	if (url.indexOf("user_activity.php") > -1)
	{	
		var aAvatars = document.querySelectorAll(".friend_block_avatar > a");
		for (var i = 0; i < aAvatars.length; i++)
		{
			aAvatars[i].href = aAvatars[i].href.replace("https://steamcommunity.com","http://steamcommunity.com");
		}

		var h3s = document.querySelectorAll("#leftAreaContainer h3");
		if (h3s.length == 2)
		{
			try
			{
				var td = h3s[1].parentElement;
				var user = url.replace("http://translation.steampowered.com/user_activity.php?user=","");
				var name = td.innerHTML.match(/<\/h3>.+<br>/i)[0].replace("</h3>-","").replace("-<br>","");
				var urlNew = "";
				if (user.indexOf("http") == 0)
				{
					urlNew = "</h3><a class='stsh_blue' target='_blank' href='http://steamcommunity.com/my'>" + name + "</a><br>"
				}
				else
				{
					urlNew = "</h3><a class='stsh_blue' target='_blank' href='http://steamcommunity.com/profiles/"
						+ user + "'>" + name + "</a><br>"
				}
				td.innerHTML = td.innerHTML.replace(/<\/h3>.+<br>/i, urlNew);
				
				if (name != null && name.trim() != "")
				{
					document.title = name.replace("<br>","").trim() + " - " + document.title;
				}
			}
			catch (ex)
			{
			}
		}
		
		var countWord = "Words";
		var countSugg = "Suggestions";
		
		var inputDials = document.querySelectorAll("#leftAreaContainer input.dial");
		if (inputDials.length == 2)
		{
			countWord = inputDials[0].getAttribute("title");
			countSugg = inputDials[1].getAttribute("title");
		}
		
		var tdCount = document.querySelector("#leftAreaContainer td[align='left']");
		if (tdCount != null)
		{
			tdCount.innerHTML = '<div style="width: 100px; display: inline-block; text-align: center;">'
				+ countWord + '</div> <div style="width: 100px; display: inline-block; text-align: center; margin-left: 13px;">'
				+ countSugg + '</div>';
		}
		
		var sug = document.body.textContent;
	
		var regComment = /VIEW COMMENT/g;
		var regSuggest = /VIEW SUGGESTION/g;
	
		var strComment = "...RECEIVED A MODERATOR COMMENT";
		var strPending = "...ARE PENDING";
		var strApproved = "...WERE APPROVED";
		var strDeclined = "...WERE DECLINED";
		var strApplied = "...HAVE BEEN APPLIED WITHIN THE LAST 14 DAYS";
		var strRemoved = "...HAVE BEEN REMOVED WITHIN THE LAST 14 DAYS";
	
		var startComment = sug.indexOf(strComment);
		var startPending = sug.indexOf(strPending);
		var startApproved = sug.indexOf(strApproved);
		var startDeclined = sug.indexOf(strDeclined);
		var startApplied = sug.indexOf(strApplied);
		var startRemoved = sug.indexOf(strRemoved);
	
		var sugComment = sug.substring(startComment,startPending);
		var sugPending = sug.substring(startPending,startApproved);
		var sugApproved = sug.substring(startApproved,startDeclined);
		var sugDeclined = sug.substring(startDeclined,startApplied);
		var sugApplied = sug.substring(startApplied,startRemoved);
		var sugRemoved = sug.substring(startRemoved);
	
		var countComment = (sugComment.match(regComment) || []).length;
		var countPending = (sugPending.match(regSuggest) || []).length;
		var countApproved = (sugApproved.match(regSuggest) || []).length;
		var countDeclined = (sugDeclined.match(regSuggest) || []).length;
		var countApplied = (sugApplied.match(regSuggest) || []).length;
		var countRemoved = (sugRemoved.match(regSuggest) || []).length;
	
		var divBtn = document.createElement("div");
		document.body.appendChild(divBtn);
		divBtn.innerHTML = ' \
<div style="position: fixed; z-index: 3; right: 12px; top: 84px; line-height: 24px; text-align: right;"> \
	&nbsp; <input value="To Comment (' + countComment + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionComment\'); return false;" /> \
	<br/> &nbsp; <input value="To Pending (' + countPending + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionPending\'); return false;" /> \
	<br/> &nbsp; <input value="To Approved (' + countApproved + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionApproved\'); return false;" /> \
	<br/> &nbsp; <input value="To Declined (' + countDeclined + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionDeclined\'); return false;" /> \
	<br/> &nbsp; <input value="To Applied (' + countApplied + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionApplied\'); return false;" /> \
	<br/> &nbsp; <input value="To Removed (' + countRemoved + ')" class="stsh_btnLong" type="button" onmouseup="scrollToId(\'sectionRemoved\'); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Hide Suggestions" class="stsh_btnLong" type="button" onmouseup="hideSuggestion(); return false;" /> \
	<br/> &nbsp; <input value="Show Suggestions" class="stsh_btnLong" type="button" onmouseup="showSuggestion(); return false;" /> \
</div> \
';

		var divContainer = document.querySelector("#leftAreaContainer");
		if (divContainer != null)
		{
			divContainer.innerHTML = divContainer.innerHTML
				.replace("...RECEIVED A MODERATOR COMMENT","<span id='sectionComment' class='stsh_suggestion_header'>...RECEIVED A MODERATOR COMMENT (" + countComment + ")</span>")
				.replace("...ARE PENDING","<span id='sectionPending' class='stsh_suggestion_header'>...ARE PENDING (" + countPending + ")</span>")
				.replace("...WERE APPROVED","<span id='sectionApproved' class='stsh_suggestion_header'>...WERE APPROVED (" + countApproved + ")</span>")
				.replace("...WERE DECLINED","<span id='sectionDeclined' class='stsh_suggestion_header'>...WERE DECLINED (" + countDeclined + ")</span>")
				.replace("...HAVE BEEN APPLIED WITHIN THE LAST 14 DAYS","<span id='sectionApplied' class='stsh_suggestion_header'>...HAVE BEEN APPLIED WITHIN THE LAST 14 DAYS (" + countApplied + ")</span>")
				.replace("...HAVE BEEN REMOVED WITHIN THE LAST 14 DAYS","<span id='sectionRemoved' class='stsh_suggestion_header'>...HAVE BEEN REMOVED WITHIN THE LAST 14 DAYS (" + countRemoved + ")</span>");
		}
		
		var cans = document.querySelectorAll("canvas");
		for (var i = 0; i < cans.length; i++)
		{
			cans[i].parentElement.removeChild(cans[i]);
		}
		
		var aKeys = document.querySelectorAll("#leftAreaContainer li > a:nth-child(1)");
		for (var i = 0; i < aKeys.length; i++)
		{
			var key = aKeys[i].textContent;
			var keyArr = key.substr(21).trim().split(" >> ");
			keyArr[0] = "<span style='color: #FFF !important;'>" + keyArr[0] + "</span>";
			var keyNew = key.substr(0,21) + keyArr.join(" >> ") + "";
			aKeys[i].innerHTML = keyNew;
		}
	
		var liMode = strComment;
	
		var liSugs = document.querySelectorAll("#leftAreaContainer > li, #leftAreaContainer > form > li");
		for (var i = 0; i < liSugs.length; i++)
		{		
			if (liMode == strComment)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_comment");
			}
			else if (liMode == strPending)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_pending");
			}
			else if (liMode == strApproved)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_approved");
			}
			else if (liMode == strDeclined)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_declined");
			}
			else if (liMode == strApplied)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_applied");
			}
			else if (liMode == strRemoved)
			{
				liSugs[i].setAttribute("class", "stsh_suggestion stsh_suggestion_removed");
			}
		
			var content = liSugs[i].textContent;
			if (content.indexOf(strRemoved) > -1)
			{
				liMode = strRemoved;
			}
			else if (content.indexOf(strApplied) > -1)
			{
				liMode = strApplied;
			}
			else if (content.indexOf(strDeclined) > -1)
			{
				liMode = strDeclined;
			}
			else if (content.indexOf(strApproved) > -1)
			{
				liMode = strApproved;
			}
			else if (content.indexOf(strPending) > -1)
			{
				liMode = strPending;
			}
		}
	
	} // End user_activity.php
	
	if (url.indexOf("rally.php") > -1)
	{
		resizeSuggestionBox();
	
		var outer = document.getElementById("suggestions_box_outer");
		if (outer != null)
		{
			outer.setAttribute("onclick","hideSuggestionsBox();");
		}
		
		var lang = getCookie("Language");
		
		var first = document.querySelector(".gradienttable tr:nth-child(6)");
		var cur = null;
		
		var tdLangs = document.querySelectorAll(".gradienttable tr > td:nth-child(1)");
		for (var i = 0; i < tdLangs.length; i++)
		{
			if (lang == tdLangs[i].textContent.trim().toLowerCase())
			{
				cur = tdLangs[i].parentElement;
				break;
			}
		}
		
		if (cur != null)
		{
			first.parentElement.insertBefore(cur, first);
		}
		
		var inputClose = document.querySelector("td:nth-child(3) > input:nth-child(1)");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
		}
		
	} // End rally.php
	
	if (url.indexOf("rally_results.php") > -1)
	{
		var inputClose = document.querySelector("td:nth-child(3) > input:nth-child(1)");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
		}
		
		var src = document.documentURI;
		var insert = "<input value=\"Frame\" onmouseup=\"window.open('" 
			+ src + "','_blank'); return false;\" type=\"button\">";
		
		var tdFirst = document.querySelector("td:nth-child(1)");
		if (tdFirst != null)
		{
			var ele = document.createElement("td");
			ele.setAttribute("align", "right");
			ele.innerHTML = insert;
			tdFirst.parentElement.insertBefore(ele, tdFirst);
		}
	} // End rally_results.php
}

function getCookie(c_name) {
    var c_value = document.cookie;
    var c_start = c_value.indexOf(" " + c_name + "=");
    if (c_start == -1) {
        c_start = c_value.indexOf(c_name + "=");
    }
    if (c_start == -1) {
        c_value = null;
    }
    else {
        c_start = c_value.indexOf("=", c_start) + 1;
        var c_end = c_value.indexOf(";", c_start);
        if (c_end == -1) {
            c_end = c_value.length;
        }
        c_value = unescape(c_value.substring(c_start, c_end));
    }
    return c_value;
}

var clientScript = ' \
 \
var itvTime = 300; \
var itvIdHideKeyApp = 0; \
var itvIdHideKeyGame = 0; \
var itvIdHideKeyFaq = 0; \
var itvIdHideKeySupport = 0; \
var itvIdHideStrNotMatch = 0; \
var itvIdHideStrLong = 0; \
var itvIdHideSgtNone = 0; \
var itvIdHideSgtSuggested = 0; \
var itvIdHideSgtTranslated = 0; \
var itvIdSortKey = 0; \
 \
function setVisibleKey(startKey, visible) \
{ \
	var display = visible != true ? "none" : ""; \
	var eleKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(1) > div:nth-child(1) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(1)"); \
	for (var i = 0; i < eleKeys.length; i++) \
	{ \
		try \
		{ \
			if (eleKeys[i].textContent.trim().indexOf(startKey) == 0) \
			{ \
				var eleTarget = eleKeys[i].parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; \
				if (eleTarget.style.display != display) \
				{ \
					eleTarget.style.display = display; \
				} \
			} \
		} \
		catch (ex) \
		{ \
		} \
	} \
} \
 \
function hideKeyGame() \
{ \
	setVisibleKey("GAMES", false); \
} \
 \
function hideKeyApp() \
{ \
	setVisibleKey("STEAM/STORE # storefront_english_apps.txt #", false); \
	setVisibleKey("STEAM # community_english.txt # SharedFiles_App_", false); \
} \
 \
function hideKeyFaq() \
{ \
	setVisibleKey("STEAM # support_faq_english.txt #", false); \
} \
 \
function hideKeySupport() \
{ \
	setVisibleKey("STEAM # supportui_english.txt #", false); \
} \
 \
function showKey() \
{ \
	clearInterval(itvIdHideKeyApp); \
	clearInterval(itvIdHideKeyGame); \
	clearInterval(itvIdHideKeyFaq); \
	clearInterval(itvIdHideKeySupport); \
	clearInterval(itvIdSortKey); \
	clearInterval(itvIdHideStrNotMatch); \
	clearInterval(itvIdHideStrLong); \
	clearInterval(itvIdHideSgtNone); \
	clearInterval(itvIdHideSgtSuggested); \
	clearInterval(itvIdHideSgtTranslated); \
	setVisibleKey("", true); \
	 \
	hideSuggestionsBox(); \
} \
 \
function sortKey() \
{ \
	var keyArr = new Array(); \
	var valArr = new Array(); \
	 \
	var eleKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(1) > div:nth-child(1) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(1)"); \
	for (var i = 0; i < eleKeys.length; i++) \
	{ \
		try \
		{ \
			key = eleKeys[i].textContent.trim(); \
			keyArr.push(key); \
			valArr[key] = eleKeys[i].parentElement.parentElement.parentElement \
				.parentElement.parentElement.parentElement.outerHTML.trim(); \
		} \
		catch (ex) \
		{ \
		} \
	} \
	 \
	var keyArrTmp = keyArr.slice(); \
	keyArr.sort(); \
	 \
	var isSame = true; \
	for (var i = 0; i < keyArr.length; i++) \
	{ \
		if (keyArr[i] != keyArrTmp[i]) \
		{ \
			isSame = false; \
		} \
	} \
	 \
	if (!isSame) \
	{ \
		var eleTable = document.querySelector("#keylist > table:nth-child(1) > tbody:nth-child(1)"); \
		if (eleTable != null) \
		{ \
			var newInner = ""; \
			 \
			for (var i = 0; i < keyArr.length; i++) \
			{ \
				newInner += valArr[keyArr[i]]; \
			} \
			 \
			eleTable.innerHTML = newInner; \
		} \
	} \
} \
 \
function scrollToId(id) \
{ \
	var ele = document.getElementById(id); \
	if (ele != null) \
	{ \
		ele.scrollIntoView(true); \
		window.scrollBy(0,-20); \
	} \
} \
 \
function setVisibleSuggestion(visible) \
{ \
	var display = visible != true ? "none" : ""; \
	var els = document.querySelectorAll(".copy"); \
	for (var i = 0; i < els.length; i++) \
	{ \
		if (els[i].id != "showwalletkeys" && els[i].id != "abuse_report" \
			&& els[i].id != "moderator_announcement") \
		{ \
			if (els[i].style.display != display) \
			{ \
				els[i].style.display = display; \
			} \
		} \
	} \
} \
 \
function showSuggestion() \
{ \
	setVisibleSuggestion(true); \
} \
 \
function hideSuggestion() \
{ \
	setVisibleSuggestion(false); \
} \
 \
function hideKeyAppInterval() \
{ \
	clearInterval(itvIdHideKeyApp); \
	itvIdHideKeyApp = setInterval(hideKeyApp, itvTime); \
} \
 \
function hideKeyGameInterval() \
{ \
	clearInterval(itvIdHideKeyGame); \
	itvIdHideKeyGame = setInterval(hideKeyGame, itvTime); \
} \
 \
function hideKeyFaqInterval() \
{ \
	clearInterval(itvIdHideKeyFaq); \
	itvIdHideKeyFaq = setInterval(hideKeyFaq, itvTime); \
} \
 \
function hideKeySupportInterval() \
{ \
	clearInterval(itvIdHideKeySupport); \
	itvIdHideKeyFaq = setInterval(hideKeySupport, itvTime); \
} \
 \
function sortKeyInterval() \
{ \
	clearInterval(itvIdSortKey); \
	itvIdSortKey = setInterval(sortKey, itvTime); \
} \
 \
function pressHideSuggestion() \
{ \
	document.addEventListener("keydown", function(e) { \
		if (e.keyCode == 27) { \
			if (parent != null) \
			{ \
				parent.hideSuggestionsBox(); \
			} \
			else \
			{ \
				hideSuggestionsBox(); \
			} \
		} \
		return false; \
	}); \
} \
pressHideSuggestion(); \
 \
function moveSuggestionBox() \
{ \
	var td = document.querySelector(".progress > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(3)"); \
	if (td != null && td.textContent.trim() == "") \
	{ \
		td.innerHTML = ""; \
		var div = document.querySelector("#suggestionmain > div:nth-child(4)"); \
		if (div != null) \
		{ \
			var br = div.querySelector("br"); \
			if (br != null) \
			{ \
				div.removeChild(br); \
			} \
			td.innerHTML = div.outerHTML; \
			td.style.padding = "0px"; \
			div.innerHTML = ""; \
			 \
			var textarea = document.querySelector("form.lbAction > div:nth-child(1) > textarea:nth-child(1)"); \
			if (textarea != null) \
			{ \
				textarea.focus(); \
				textarea.style.height = textarea.scrollHeight + "px"; \
				textarea.style.width = "98%"; \
				textarea.style.marginLeft = "0px"; \
			} \
		} \
	} \
} \
 \
function hideStrNotMatch() \
{ \
	var display = "none"; \
	 \
	var searchStr = decodeURIComponent(document.documentURI.replace(/^.*search_input=/i,"").replace(/&.*$/i,"")) \
		.replace(/\\+/g," ").trim(); \
	searchStr = searchStr.toLowerCase(); \
	 \
	var eleStrs = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(1) > div:nth-child(1) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(1)"); \
	for (var i = 0; i < eleStrs.length; i++) \
	{ \
		try \
		{ \
			var valStr = eleStrs[i].textContent.trim().toLowerCase(); \
			if (valStr != searchStr) \
			{ \
				var eleTarget = eleStrs[i].parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; \
				if (eleTarget.style.display != display) \
				{ \
					eleTarget.style.display = display; \
				} \
			} \
		} \
		catch (ex) \
		{ \
		} \
	} \
} \
 \
function hideStrNotMatchInterval() \
{ \
	clearInterval(itvIdHideStrNotMatch); \
	itvIdHideStrNotMatch = setInterval(hideStrNotMatch, itvTime); \
} \
 \
function hideStrLong() \
{ \
	var display = "none"; \
	var dot = "..."; \
	var dotLengthMinus = 0 - dot.length; \
	 \
	var eleStrs = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(1) > div:nth-child(1) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(1)"); \
	for (var i = 0; i < eleStrs.length; i++) \
	{ \
		try \
		{ \
			var valStr = eleStrs[i].textContent.trim(); \
			if (valStr.substr(dotLengthMinus) == dot) \
			{ \
				var eleTarget = eleStrs[i].parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; \
				if (eleTarget.style.display != display) \
				{ \
					eleTarget.style.display = display; \
				} \
			} \
		} \
		catch (ex) \
		{ \
		} \
	} \
} \
 \
function hideStrLongInterval() \
{ \
	clearInterval(itvIdHideStrLong); \
	itvIdHideStrLong = setInterval(hideStrLong, itvTime); \
} \
 \
function hideSgt(isTranslated, isSuggested) \
{ \
	var display = "none"; \
	var notTranslated = "NOT TRANSLATED"; \
	 \
	var eleSgts = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(1) > div:nth-child(1) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(3)"); \
	for (var i = 0; i < eleSgts.length; i++) \
	{ \
		try \
		{ \
			var isEdit = false; \
			var valSgt = eleSgts[i].textContent.trim(); \
			if (!isTranslated && valSgt == notTranslated) \
			{ \
				var eleSgtCount = eleSgts[i].parentElement.parentElement.querySelector("tr:nth-child(1) > td:nth-child(3)"); \
				var sgtCountLen = eleSgtCount.textContent.trim().length; \
				if (!isSuggested && sgtCountLen == 0) \
				{ \
					isEdit = true; \
				} \
				else if (isSuggested && sgtCountLen > 0) \
				{ \
					isEdit = true; \
				} \
			} \
			else if (isTranslated && valSgt != notTranslated) \
			{ \
				isEdit = true; \
			} \
			 \
			if (isEdit) \
			{ \
				var eleTarget = eleSgts[i].parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; \
				if (eleTarget.style.display != display) \
				{ \
					eleTarget.style.display = display; \
				} \
			} \
		} \
		catch (ex) \
		{ \
		} \
	} \
} \
 \
function hideSgtNone() \
{ \
	hideSgt(false, false); \
} \
 \
function hideSgtSuggested() \
{ \
	hideSgt(false, true); \
} \
 \
function hideSgtTranslated() \
{ \
	hideSgt(true, false); \
} \
 \
function hideSgtNoneInterval() \
{ \
	clearInterval(itvIdHideSgtNone); \
	itvIdHideSgtNone = setInterval(hideSgtNone, itvTime); \
} \
 \
function hideSgtSuggestedInterval() \
{ \
	clearInterval(itvIdHideSgtSuggested); \
	itvIdHideSgtSuggested = setInterval(hideSgtSuggested, itvTime); \
} \
 \
function hideSgtTranslatedInterval() \
{ \
	clearInterval(itvIdHideSgtTranslated); \
	itvIdHideSgtTranslated = setInterval(hideSgtTranslated, itvTime); \
} \
 \
function clickToSelect(ele) \
{ \
	var range = document.createRange(); \
	range.setStartBefore(ele.firstChild); \
	range.setEndAfter(ele.lastChild); \
	var sel = window.getSelection(); \
	sel.removeAllRanges(); \
	sel.addRange(range); \
} \
 \
function doInstant() \
{ \
	var url = document.documentURI; \
	if (url.indexOf("user_activity.php") > -1) \
	{ \
		showSuggestion(); \
	} \
	 \
	document.addEventListener("DOMContentLoaded", function (e) \
	{ \
		if ($) \
		{ \
			$(".dial").hide(); \
			setTimeout(function() \
			{ \
				/* Restore drawing progress */ \
				$(function() { \
					$(".dial").knob({ \
					  "draw" : function () { \
						$(this.i).val(this.cv + "%"); \
						$(".dial").show(); \
					  } \
					}) \
				}) \
			}, 50); \
		} \
	}); \
	 \
} \
doInstant(); \
 \
';

var eleClientScript = document.createElement("script");
eleClientScript.innerHTML = clientScript;
document.head.appendChild(eleClientScript);


attachOnReady(main);

// End