STS Helper

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

目前為 2015-12-18 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name     		STS Helper
// @namespace		iFantz7E.StsHelper
// @version			1.66
// @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
// @run-at			document-start
// @grant       	GM_addStyle
// @copyright		2014, 7-elephant
// ==/UserScript==

// http://userscripts.org/scripts/show/325610
// https://greasyfork.org/scripts/2250-sts-helper/

GM_addStyle(
	"  #logout { position: fixed; z-index: 1001; right: 12px; top: 10px; line-height: 24px; text-align: right; } "
	+ "input[type='button'], input[type='submit'] { cursor: pointer; } "
	+ "input[type='button']:disabled { cursor: default; color: #777; } "
	+ "#suggestionmain { overflow-x: hidden; } "
	+ "#suggestionmain > div:nth-child(4) > form:nth-child(2) > div:nth-child(1) "
	+ " { text-align: left; } "
	+ ".lbAction > div > input[value^='SUBMIT'] "
	+ " { width: 97%; height: 30px; } "
	+ "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; } "
	+ ".progress td { vertical-align: top; } "
	+ "div#suggestions_nav { z-index: 3; position: absolute; width: 525px; left: 463px; top: 4px; text-align: right; line-height: 24px; } "
	+ "#suggestionmain .smallcopy { width: 855px; min-height: 70px; max-height: 70px; overflow: hidden; } "
	+ "#suggestionmain .progress { margin-top: -12px; } "
	+ "#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; } "
	+ ".progress h1 { display: inline-block; } "
	+ "div#suggestions_box iframe { background-color: #111 !important; } "
	+ ".suggestions_list { border-right: 0px none !important; } "
	+ ".suggestion { resize: both; overflow: hidden; border-right: 1px solid #505050; } "
	+ ".stsh_btn { width: 90px; } "
	+ ".stsh_btn_long { min-width: 136px; } "
	+ ".stsh_btn_short { min-width: 66px; } "
	+ ".stsh_btn_right { position: relative; float: right; } "
	+ ".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; } "
	+ ".stsh_green { color: #a4b23c; } "
	+ ".stsh_red { color: #F00; } "
	+ ".stsh_white { color: #fff; } "
	+ ".stsh_orange { color: #CF8B37; } "
	+ ".stsh_pink { color: pink; } "
	+ "#stsh_showing { color: #CCDAD6; position: fixed; z-index: 1001; right: 12px; bottom: 12px; text-align: right; line-height: 14px;} "
	+ "#stsh_showing_current { color: #CCDAD6; position: fixed; z-index: 1001; right: 12px; bottom: 28px; text-align: right; line-height: 14px;} "
	+ ".stsh_showing_counter { display: inline-block; min-width: 60px; text-align: center; } "
	+ ".stsh_showing_header { color: #CCDAD6; display: inline-block; width: 135px; text-align: center; padding-top: 10px; } "
	+ ".stsh_showing_group { position: fixed; z-index: 3; right: 10px; top: 74px; line-height: 24px; text-align: right; } "
	+ ".stsh_scroll_header { color: #CCDAD6; display: inline-block; width: 130px; text-align: center; padding-top: 10px; } "
	+ "#stsh_specialEvent { position: absolute; z-index: 2; right: 164px; top: 11px; } "
	+ ".stsh_snapshot { position: absolute; top: 320px; left: 790px; width: 140px; text-align: center; color: #FFF; } "
	+ ".stsh_submit_comment_header { vertical-align: top; } "
	+ ".stsh_submit_comment { vertical-align: top; display: inline-block } "
	+ ".stsh_insert_space { margin: 10px; } "
	+ ".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; } "
	+ ".lbAction input[value~='COMMENT'] { vertical-align: top; margin-top: 1px; height: 52px; } "
	+ ".lbAction input[value~='DISCUSS'] { vertical-align: top; margin-top: 1px; height: 36px; } "
);

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

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

function insertBeforeElement(newNode, referenceNode) 
{
    referenceNode.parentNode.insertBefore(newNode, referenceNode);
}

function insertAfterElement(newNode, referenceNode) 
{
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

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) 
		{			
			if (e.ctrlKey)
			{
				var isSameKey = false;
				if (Number.isInteger(keyCode))
				{
					isSameKey = (e.keyCode == keyCode);
				}
				else
				{
					isSameKey = (e.code != undefined && e.code == keyCode)
				}
				
				if (isSameKey)
				{
					input.focus();
					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) 
			{
				var isSameKey = false;
				if (Number.isInteger(keyCode))
				{
					isSameKey = (e.keyCode == keyCode);
				}
				else
				{
					isSameKey = (e.code != undefined && e.code == keyCode)
				}
				
				if (isSameKey)
				{
					input.focus();
					input.click();
					return false;
				}
			}
		}, true);
	}
}

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

function disableAfterClick(ele)
{
	ele.addEventListener("click", function (e) 
	{
		var ele = e.target;
		var tagName = ele.tagName.toLowerCase();
		if (tagName == "input")
		{
			// don't change color after disable
			ele.style.setProperty("color"
				, window.getComputedStyle(ele).color, "important");
			ele.disabled = true;
		}
		else if (tagName == "img")
		{
			ele.removeAttribute("onclick");
		}
	}, true);
}

function resizeSuggestionBox()
{
	var script = document.createElement('script');
	script.innerHTML = " \
var stsh_showSuggestionsBox_start = new Date(); \
var stsh_showSuggestionsBox_itv = setInterval(function() \
{ \
	var stsh_showSuggestionsBox_isEnd = false; \
	var stsh_showSuggestionsBox_cur = new Date(); \
	if (typeof showSuggestionsBox != 'undefined') \
	{ \
		showSuggestionsBox = function(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; \
		}; \
		stsh_showSuggestionsBox_isEnd = true; \
	} \
	if (stsh_showSuggestionsBox_isEnd || stsh_showSuggestionsBox_cur - stsh_showSuggestionsBox_start > 10000) \
	{ \
		clearInterval(stsh_showSuggestionsBox_itv); \
	} \
}, 300); \
";
	
	document.head.appendChild(script);

	window.addEventListener("resize", function()
	{
		var iframe = document.querySelector("#suggestions_iframe");
		iframe.style.height = (window.innerHeight * 0.99) + "px";
	});
}

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

function padZero(num, size)
{
	return (1e15+num+"").slice(-size);
}

function checkSpecialCharMatched(str1, str2)
{
	// return (status, numSp1, numSp2)
	// status: 0:Match, 1:NotMatch, 2:NotEqual
	
	var sp1 = "";
	var sp2 = "";
	var sp3 = "";
	var sp4 = "";
	var sp5 = "";
	var sp6 = "";
	var sp7 = "";
	var sp8 = "";
	
	var strOut1 = "";
	var strOut2 = "";
	
	if (str1 != null && str2 != null)
	{
		for (var i = 0; i < str1.length; i++)
		{	
			if (str1[i] == sp1 || str1[i] == sp2 || str1[i] == sp3 || str1[i] == sp4
				|| str1[i] == sp5 || str1[i] == sp6 || str1[i] == sp7 || str1[i] == sp8)
			{
				strOut1 += str1[i];
			}
		}
		for (var i = 0; i < str2.length; i++)
		{	
			if (str2[i] == sp1 || str2[i] == sp2 || str2[i] == sp3 || str2[i] == sp4
				|| str2[i] == sp5 || str2[i] == sp6 || str2[i] == sp7 || str2[i] == sp8)
			{
				strOut2 += str2[i];
			}
		}
	}
	
	var retVal = 0;
	
	if (strOut1 == strOut2)
		retVal = 0;
	else if (strOut1.length == strOut2.length)
		retVal = 1;
	else 
		retVal = 2;
	
	return new Array(retVal, strOut1.length, strOut2.length);
}

function reload()
{
	window.location = window.location.href;
}

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;
}
	
function main() 
{
	var url = document.documentURI;
	var lang = getCookie("Language");
	
	// Auto refresh when error
	{
		var h1 = document.querySelector("#leftAreaContainer > h1, body > h1");
		if (h1 != null)
		{
			var text = h1.textContent.trim();
			if (text == "Steam Translation Server - Maintenance Warning"
				|| text == "Forbidden")
			{
				console.log("stsh: refresh");
				setTimeout(reload, 60000);
				return;
			}
		}
	}

	// Clean links
	{
		var pattT1 = /\?t=[0-9]{6,}\&/g;
		var pattT2 = /\&t=[0-9]{6,}/g;
		var pattT3 = /\?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,"");
			}
			else if (pattT3.test(href))
			{
				as[i].href = href.replace(pattT3,"");
			}
		}
	}

	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?\');" /> ';
		
		eleLogout.innerHTML = logoutHtml;
	}

	// Special event button
	{
		var eleLogoff = document.querySelector("#logoff");
		if (eleLogoff != null)
		{
			var d = new Date();
			if ((d.getUTCMonth() > 8) || (d.getUTCMonth() == 8 && d.getUTCDate() >= 25) || (d.getUTCMonth() == 0 && d.getUTCDate() <= 1))
			{
				var divSpecial = document.createElement("div");
				divSpecial.id = "stsh_specialEvent";
				divSpecial.innerHTML = '<input value="Year-End Rally" type="button" onmouseup="window.open(\'/rally'
					+ '.php\',\'_blank\'); return false;" />';
				eleLogoff.appendChild(divSpecial);
			}
		}
	}	

	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?keyonly=1&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 inputClose = document.querySelector("#suggestions_nav > input[value^='Close']");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
		}
	
		var td = document.querySelector(".progress tr:last-child > td:nth-child(3)");
		if (td != null && td.textContent.trim() == "")
		{
			td.innerHTML = ' <input value="Move Suggestion Box Here" type="button" onmouseup="moveSuggestionBox(); return false;" style="width: 40%;" /> ';
		}
	
		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 Hashtag" type="button"'
								+ ' onmouseup="window.open(\'/translate.php?keyonly=1&paginationrows=5000&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?keyonly=1&paginationrows=5000&search_input=' 
							+ keyGroup + '\',\'_blank\'); return false;"> ';
					}
					insert += ' <input value="Search by Key" type="button"'
						+ ' onmouseup="window.open(\'/translate.php?keyonly=1&search_input=' 
						+ key + '\',\'_blank\'); return false;"> ';
				}
			}
		
			var tdText = document.querySelector(".progress tr:last-child > 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?keyonly=2&paginationrows=5000&search_input=' 
						+ text + '\',\'_blank\'); return false;"> ';
				}
				else
				{
					if (textarea != null)
					{
						var eleSubmit = document.querySelector(".lbAction input[type='submit'][accesskey='s']");
						if (eleSubmit != null)
						{
							var eleNew = document.createElement("input");
							eleNew.classList.add("stsh_insert_space");
							eleNew.setAttribute("type", "button");
							eleNew.setAttribute("value", "Insert Space (Alt+0160)");
							insertBeforeElement(eleNew, eleSubmit.parentElement.firstChild);
							
							eleNew.addEventListener("click", function(e)
							{								
								var textarea = document.querySelector("form.lbAction > div:nth-child(1) > textarea:nth-child(1)");
								if (textarea != null)
								{
									textarea.value = String.fromCharCode(160);
									textarea.focus();
								}
							});
						}
					}
				}				
			}
		
			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=\"window.location = window.location.href; 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;
			
		}
	
		// Regroup glossary and auto replace matched string
		{
			setTimeout(function()
			{
				var br = "<br>";
				var brSpace = " <br> ";
				var tag = "<a";
				var colon = ">: ";
				var comma = ",";
				var bracket = " (";
				var isEdit = false;
				
				var p = null;
				
				var aGls = document.querySelectorAll("a[href='glossary.php']");
				for (var i = 0; i < aGls.length; i++)
				{
					if (aGls[i].textContent.trim() == "GLOSSARY FEATURE")
					{
						p = aGls[i].parentElement;
						break;
					}
				}
				
				if (p != null)
				{
					var glosOuters = [];
					var glosInnerStart = 0;
					var countGl = 0;
					var glossaries = p.innerHTML.split(br);
					if (glossaries.length > 2)
					{
						glosOuters = [p];
						glosInnerStart = 2;
					}
					else
					{
						glosOuters = p.nextSibling.querySelectorAll("td");
						glosInnerStart = 0;
					}
					
					var rgxKey = />[^><]+</;
					var rgxKeyClean = /[><]+/g;
					var rgxKeyPunct = /[\(\)\[\]\:]/g;
					var rgxContentClean = /<[^<]*>/g;
					var textOrg = "";
					var textEng = "";
					var isTextReplaced = false;
					var isOutdated = false;

					var eleBtnResummit = document.querySelector("input[type='submit'][value^='RESUBMIT']");
					if (eleBtnResummit != null)
					{
						isTextReplaced = true;
					}
					else
					{
						var eleTextOrg = document.querySelector("#suggestion_value_new");
						if (eleTextOrg != null)
						{
							textOrg = eleTextOrg.value.trim().toLowerCase();
						}
						if (textOrg == "")
						{
							isTextReplaced = true;
						}
					}
					
					if (!isTextReplaced)
					{
						var eleTrs = document.querySelectorAll(".progress tr");
						isOutdated = (eleTrs.length >= 3);
						if (isOutdated)
						{
							textEng = eleTrs[eleTrs.length - 1].firstElementChild.textContent.trim().toLowerCase();
						}
					}
					
					for (var i = 0; i < glosOuters.length; i++)
					{
						var glosOuter = glosOuters[i];
						
						var glosInners = glosOuter.innerHTML.split(br);
						
						isEdit = false;
						
						for (var j = glosInnerStart; j < glosInners.length; j++)
						{
							var glossary = glosInners[j].trim();
							if (glossary.length > 0 && glossary.indexOf(tag) == 0)
							{
								var colonIndex = glossary.indexOf(colon);
								var contentHead = glossary.substr(0, colonIndex + 3);
								var contentAll = glossary.substr(colonIndex + 3);
								var contentWords = contentAll.split(comma);
								var contentFirst = contentWords[0].trim();
								
								for (var k = 0; k < contentWords.length; k++)
								{
									var contentNew = contentWords[k].trim();
									var contentSub = null;
									
									var bracketPos = contentNew.indexOf(" (");
									if (bracketPos > -1)
									{
										contentSub = contentNew.substr(bracketPos);
										contentNew = contentNew.substr(0, bracketPos);
									}
									
									contentNew = " <span id='stsh_gls_" + countGl 
										+ "' onclick='clickToSelect(this)'>" 
										+ contentNew + "</span>";
										//+ "<span style='color: white; cursor: pointer;'>^</span>";
										
									if (contentSub != null)
									{
										contentNew +=  "<span "
											+ "onclick='clickToSelect(this.previousElementSibling)'>" 
											+ contentSub + "</span>";
									}
									
									contentWords[k] = contentNew;
									countGl++;
								}
							
								if (!isTextReplaced)
								{
									var keys = contentHead.match(rgxKey);
									if (keys != null && keys.length > 0)
									{
										var key = keys[0].replace(rgxKeyClean, "").trim().toLowerCase();
										var contentClean = contentFirst.replace(rgxContentClean, "");
										var contentLower = contentClean.toLowerCase();
										var textCur = "";
										if (key == textOrg.replace(rgxKeyPunct, ""))
										{
											textCur = textOrg;
										}
										else if (key == textEng.replace(rgxKeyPunct, ""))
										{
											textCur = textEng;
										}
										
										if (textCur != "" && key != contentLower)
										{
											var rgxReplace = new RegExp(key, "i");
											eleTextOrg.value = textCur.replace(rgxReplace, contentClean);
											isTextReplaced = true;
										}
									}
								}
								
								glosInners[j] = contentHead + contentWords.join(comma);
								isEdit = true;
							}
						}
						if (isEdit)
						{
							//glosOuter.innerHTML = glosInners.join(brSpace);
						}
					}
				}
			}, 200);
		}
		
		// Auto link http
		{
			var regUrl = /http[^ "]+/ig;
			var eleComments = document.querySelectorAll(""
				+ ".suggestion_signature > i:nth-child(3), "
				+ ".suggestion_signature div:nth-child(1) > i:nth-child(6), "
				+ ".row0 > td:nth-child(2), .row1 > td:nth-child(2), .row2 > td:nth-child(2), "
				+ ".row-1 > 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] + "' >" + decodeURIComponent(commentUrls[j]) + "</a> ");
					}
				}
				
				comment = comment.trim();
		
				if (comment.indexOf("Comment:") == 0)
				{
					eleComments[i].classList.add("stsh_submit_comment_header");
					comment = comment
						.replace("Comment:", "Comment: <span class='stsh_submit_comment'>")
						.replace(/\-\&gt\;/g, "<span class='stsh_white'>-&gt;</span>")
						.replace(/\,/g, "<span class='stsh_white'>,</span>")
						+ "</span>";
				}
				
				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(/\#/g,"%23"));
					}
				}
			}
		}
	
		var divIntro = document.querySelector("#suggestionmain > div.smallcopy");
		if (divIntro != null)
		{			
			var qBranch = getQueryByName("branch");
			
			var htmlToken = "You are editing";
			var htmlTokenReplace = "";
			
			var htmlToken2 = "token-key";
			var htmlToken2Replace = "Token-key";
			
			var htmlFile = "of file";
			var htmlFileReplace = '<br>File: <font class="stsh_blue" onclick="clickToSelect(this)">' + qBranch + '</font> >> ';
			
			var htmlSugg = 'You have  <font style="';
			var htmlSuggReplace = 'You have <font title="Enter and submit new suggestions below.  Do not alter HTML tags or variables." style="cursor: pointer; ';
			
			var htmlIntro = "Enter and submit new suggestions below. Do not alter HTML tags or variables.";
			var htmlIntroReplace = ' <a href="mailto:[email protected]" '
				+ 'title="Please report truncated tokens to [email protected]">'
				+ '<font style="color:white;">Report Tokens</font></a>';
			
			var htmlContact = '<br>Please report truncated tokens to: <a href="mailto:[email protected]"><font style="color:white;">[email protected]</font></a>';
			var htmlContactReplace = '';
			
			if (key != "")
			{
				htmlIntroReplace += ' <br>Share: <font class="stsh_green" style="font-size: 0.8em;" onclick="clickToSelect(this)">'
					+ 'http://translation.steampowered.com/translate.php?search_input=' + key
					+ "</font> <br>";
			}
			
			var isComplete = (divIntro.innerHTML.indexOf(htmlContact) > -1);
			
			divIntro.innerHTML = divIntro.innerHTML
				.replace(htmlToken, htmlTokenReplace)
				.replace(htmlToken2, htmlToken2Replace)
				.replace(htmlFile, htmlFileReplace)
				.replace(htmlSugg, htmlSuggReplace)
				.replace(htmlIntro, htmlIntroReplace)
				.replace(htmlContact, htmlContactReplace)
				.trim();
			
			if (!isComplete)
			{
				var stsh_introReplace_start = new Date();
				var stsh_introReplace_itv = setInterval(function(divIntro, htmlContact, htmlContactReplace)
				{
					var stsh_introReplace_isEnd = false;
					var stsh_introReplace_cur = new Date();
					
					if (divIntro.innerHTML.indexOf(htmlContact) > -1)
					{
						divIntro.innerHTML = divIntro.innerHTML
							.replace(htmlContact, htmlContactReplace);
							
						stsh_introReplace_isEnd = true;
					}
					
					if (stsh_introReplace_isEnd || stsh_introReplace_cur - stsh_introReplace_start > 10000)
					{
						clearInterval(stsh_introReplace_itv);
					}
				}, 100, divIntro, htmlContact, htmlContactReplace);
			}
		}
	
		var formComments = document.querySelectorAll(".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, "BracketLeft", "");	// [
			//addKeyAlt(document, inputApprove, 0, "");				// [
			//addKeyAlt(document, inputApprove, 53, "");			// [
			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, "BracketRight", "");	// ]
			//addKeyAlt(document, inputApproveNext, 188, "");			// ]
			//addKeyAlt(document, inputApproveNext, 173, "");			// ]
			//addKeyAlt(document, inputApproveNext, 169, "");			// ]
			addKeyAlt(document, inputApproveNext, 80, "");				// P
			addKeyAlt(document, inputApproveNext, 83, "");				// S
			addKeyCtrl(document, inputApproveNext, 45, "");				// INS
			
			disableAfterClick(inputApproveNext);
			
			if (inputApproveNext.disabled && inputApprove != null)
			{
				addKeyAlt(document, inputApprove, 221, "");				// ]
				addKeyAlt(document, inputApprove, "BracketRight", "");	// ]
				//addKeyAlt(document, inputApprove, 188, "");			// ]
				//addKeyAlt(document, inputApprove, 173, "");			// ]
				//addKeyAlt(document, inputApprove, 169, "");			// ]
				addKeyAlt(document, inputApprove, 80, "");				// P
				addKeyAlt(document, inputApprove, 83, "");				// S
				addKeyCtrl(document, inputApprove, 45, "");				// INS
			}
		}
		
		var inputDecline = document.querySelector(".suggestion_signature input[value~='DECLINE']");
		if (inputDecline != null)
		{
			addKeyCtrl(document, inputDecline, 46, "");		// DEL
		}
		
		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, "BracketLeft", "");		// [
			//addKeyCtrl(document, inputPrev, 0, "");				// [
			//addKeyCtrl(document, inputPrev, 53, "");				// [
			
			disableAfterClick(inputPrev);
		}
		
		var inputNext = document.querySelector("#suggestions_nav > input[value~='Next']");
		if (inputNext != null)
		{
			addKeyCtrl(document, inputNext, 221, "]");				// ]
			addKeyCtrl(document, inputNext, "BracketRight", "");	// ]
			//addKeyCtrl(document, inputNext, 188, "");				// ]
			//addKeyCtrl(document, inputNext, 173, "");				// ]
			//addKeyCtrl(document, inputNext, 169, "");				// ]
			
			disableAfterClick(inputNext);
		}
	
		// Check special chars
		{			
			var h1s = document.querySelectorAll(".progress h1");
			if (h1s.length == 2)
			{				
				var h1Org = h1s[0];
				var h1Trn = h1s[1];
				
				var tdOrg = document.querySelector(".progress tr:last-child > td:nth-child(1)");
				var tdTrn = document.querySelector(".progress tr:last-child > td:nth-child(3)");
				
				if (tdOrg != null && tdTrn != null)
				{
					var strOrg = tdOrg.textContent.trim();
					var strTrn = tdTrn.textContent.trim();
					
					var statusTrnArr = checkSpecialCharMatched(strOrg, strTrn);
					var statusTrnMatched = statusTrnArr[0];
					var spOrg = statusTrnArr[1];
					var spTrn = statusTrnArr[2];
					
					if (spOrg > 0)
					{
						var spanSpOrg = document.createElement("span");
						spanSpOrg.id = "stsh_spanSpOrg";
						spanSpOrg.classList.add("stsh_blue");
						spanSpOrg.innerHTML = " &nbsp;&nbsp;&nbsp;SpecialChar: " + spOrg;
						h1Org.parentElement.appendChild(spanSpOrg);
					
						// Check chars in translated
						if (strTrn != "")
						{
							var spanSpTrn = document.createElement("span");
							spanSpTrn.id = "stsh_spanSpTrn";
							
							if (statusTrnMatched == 0)
							{
								spanSpTrn.classList.add("stsh_green");
							}
							else
							{
								spanSpTrn.classList.add("stsh_red");
							}
							
							var outputTrn = " &nbsp;&nbsp;&nbsp;SpecialChar: " + spTrn;
							if (statusTrnMatched == 0)
							{
								outputTrn += " (Matched)";
							}
							else if (statusTrnMatched == 1)
							{
								outputTrn += " (Order not matched)";
							}
							else
							{
								outputTrn += " (Not matched)";
							}
							
							spanSpTrn.innerHTML = outputTrn;
							h1Trn.parentElement.appendChild(spanSpTrn);
						}
						
						// Check chars in suggested
						var divSugs = document.querySelectorAll(".suggestion_text");
						for (var i = 0; i < divSugs.length; i++)
						{
							var divSug = divSugs[i];
							var strSug = divSug.textContent.trim();
						
							var statusSugArr = checkSpecialCharMatched(strOrg, strSug);
							var statusSugMatched = statusSugArr[0];
							var spSug = statusSugArr[2];
							
							
							var spanSpSug = document.createElement("span");
							spanSpSug.classList.add("stsh_spanSpSug");
							
							if (statusSugMatched == 0)
							{
								spanSpSug.classList.add("stsh_green");
							}
							else
							{
								spanSpSug.classList.add("stsh_red");
							}
							
							var outputSug = " SpecialChar: " + spSug;
							if (statusSugMatched == 0)
							{
								outputSug += " (Matched)";
							}
							else if (statusSugMatched == 1)
							{
								outputSug += " (Order not matched)";
							}
							else
							{
								outputSug += " (Not matched)";
							}
							outputSug += " <br/><br/> ";
							
							spanSpSug.innerHTML = outputSug;
							
							divSug.insertBefore(spanSpSug, divSug.firstChild);
						}
					
					}
				}
			}
			
		}
	
		// Trim string in same token
		{
			var p = document.querySelector("#suggestionmain > div:nth-child(5) > p:nth-child(4)");
			if (p != null)
			{
				for (var i = 0; i < p.childNodes.length; i++)
				{
					child = p.childNodes[i];
					if (child.nodeName == "#text")
					{
						child.nodeValue = child.nodeValue.trim();
					}
				}
			}
		}
		
		// Display newlines
		{
			var tdOrg = document.querySelector(".progress tr:last-child > td:nth-child(1)");
			var tdTrn = document.querySelector(".progress tr:last-child > td:nth-child(3)");
			
			if (tdOrg != null && tdTrn != null)
			{
				
				var htmlOrg = tdOrg.innerHTML.trim();
				var htmlTrn = tdTrn.innerHTML.trim();
				
				if ((htmlOrg.indexOf("\n") > -1 || htmlOrg.indexOf("\\n") > -1
					|| htmlTrn.indexOf("\n") > -1 || htmlTrn.indexOf("\\n") > -1)
					/*&& htmlOrg.indexOf("<br") < 0 
					&& htmlOrg.indexOf("<p") < 0 && htmlOrg.indexOf("<div") < 0 && htmlOrg.indexOf("<li") < 0*/)
				{
					var h2SugHeader = document.querySelector("#suggestionmain > div > h2");
					if (h2SugHeader != null)
					{
						var btn = document.createElement("input");
						btn.setAttribute("class", "stsh_btn_right");
						btn.setAttribute("type", "button");
						btn.setAttribute("value", "Display Newlines");
						
						function displayNewlines(ele)
						{
							if (ele != null)
							{
								ele.innerHTML = ele.innerHTML.trim().replace(/\n/g,"\n<br>").replace(/\\n/g," \\n<br>");
							}
						}
				
						btn.addEventListener("click", function(e)
						{
							e.target.disabled = true;
							
							var tdOrg = document.querySelector(".progress tr:last-child > td:nth-child(1)");
							var tdTrn = document.querySelector(".progress tr:last-child > td:nth-child(3)");
							displayNewlines(tdOrg);
							displayNewlines(tdTrn);
								
							var divSugs = document.querySelectorAll(".suggestion_text");
							for (var i = 0; i < divSugs.length; i++)
							{
								var divSug = divSugs[i];
								displayNewlines(divSug);
							}
							
							var textarea = document.querySelector("form.lbAction > div:nth-child(1) > textarea:nth-child(1)");
							if (textarea != null)
							{
								textarea.focus();
							}
						});
						
						h2SugHeader.appendChild(btn);
					}
				}
			}
		}
		
		// Open comment when decline
		{
			var countComment = 0;
			var eleComments = [];
			
			var countSug = document.querySelectorAll(".suggestions_list .suggestion").length;
			
			var eleSugs = document.querySelectorAll(".suggestions_list span[class^='suggestion_status_'");
			
			if (countSug == eleSugs.length)
			{
				for (var i = 0; i < eleSugs.length; i++)
				{
					var eleComment = eleSugs[i].parentElement.nextSibling;
					if (eleComment.nodeName == "DIV" && eleComment.classList.contains("copy"))
					{
						if (eleSugs[i].classList.contains("suggestion_status_declined"))
						{
							countComment++;
							eleComments.push(eleComment);
						}
					}
				}
				
				if (countComment == eleSugs.length)
				{
					var isFocus = false;
					for (var i = 0; i < eleComments.length; i++)
					{
						eleComments[i].style.display = "block";
						if (!isFocus)
						{
							var eleTxt = eleComments[i].querySelector("textarea[name='suggestion_comment']");
							if (eleTxt != null)
							{
								eleTxt.focus();
								
								var eleSugComment = eleComments[i].parentElement
									.parentElement.parentElement.querySelector(".stsh_submit_comment font");
								if (eleSugComment != null && eleSugComment.textContent.trim() == 
									"ATTENTION - English string was updated. This suggestion might be outdated.")
								{
									eleTxt.value = "outdated";
								}
								
								isFocus = true;
							}
						}
					}
				}
			}
		}
		
		// Convert time
		{
			var rgxTime = /\d{2}-\d{2}-\d{4}, \d{2}:\d{2} [AP]M/;
			var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
			
			var eleFriends = document.querySelectorAll(".friend_block_avatar, .friend_block_discussions");
			for (var i = 0; i < eleFriends.length; i++)
			{
				var nodes = [];
				
				if (eleFriends[i].classList.contains("friend_block_avatar"))
				{
					nodes = eleFriends[i].childNodes;
				}
				else if (eleFriends[i].classList.contains("friend_block_discussions"))
				{
					nodes = eleFriends[i].parentElement.nextElementSibling.childNodes[2].childNodes;
				}
				
				for (var j = 0; j < nodes.length; j++)
				{
					var nodeVal = nodes[j].nodeValue;
					if (nodeVal != null)
					{
						var dateTimes = rgxTime.exec(nodeVal);
						if (dateTimes != null)
						{
							var dateTime = dateTimes[0];
							var month = dateTime.substr(0, 2);
							var day = dateTime.substr(3, 2);
							var year = dateTime.substr(6, 4);
							var hour = dateTime.substr(12, 2);
							var minute = dateTime.substr(15, 2);
							var period = dateTime.substr(18, 2);
							if (period == "AM")
							{
								if (hour == "12")
								{
									hour = "00"
								}
							}
							else if (period == "PM")
							{
								hour = parseInt(hour) + 12;
								if (hour == 24)
								{
									hour = 12;
								}
							}
							
							var dateTimeStd = year + "-" + month + "-" + day;
							
							var isDst = false;
							if (month > "02" && month < "11")
							{
								// assume DST changed
								isDst = true;
							}
							
							if (isDst)
							{
								dateTimeStd += "T" + hour + ":" + minute + ":00-0700";
							}
							else
							{
								dateTimeStd += "T" + hour + ":" + minute + ":00-0800";
							}
							
							var dateStd = new Date(dateTimeStd);
							if (dateStd.toLocaleString() != "Invalid Date")
							{
								var gmt = dateStd.getTimezoneOffset() / 60 * -1;
								var gmtStr = " GMT";
								if (gmt > 0)
								{
									gmtStr += "+" + gmt;
								}
								else if (gmt < 0)
								{
									gmtStr += "" + gmt;
								}
								var dateNew = dateStd.getDate()
									+ " " + months[dateStd.getMonth()]
									+ " " + dateStd.getFullYear()
									+ ", " + padZero(dateStd.getHours(), 2)
									+ ":" + padZero(dateStd.getMinutes(), 2)
									+ gmtStr;
								
								//console.log("Time: " + dateTimeStd);
								//console.log("Time: " + dateTime + " -> " + dateNew);
									
								//var dateNew2 = dateStd.toLocaleString() + gmtStr;
								//console.log("Time: " + dateTime + " -> " + dateNew2);
								
								nodes[j].nodeValue = nodeVal.replace(dateTime, dateNew);
							}
							else
							{
								console.log("Invalid Date: " + dateTimeStd);
							}
						}
					}
				}
			}
			
		}
		
	} // End suggestions.php

	if (url.indexOf("translate.php") > -1)
	{
		var searchText = getQueryByName("search_input");
		if (searchText != "")
		{
			document.title = searchText + " - " + document.title;
		}
		else
		{
			var fileID = getQueryByName("file_ID");
			if (fileID != "")
			{
				var eleFile = document.querySelector("#leftAreaContainer > div:nth-child(12)");
				if (eleFile != null)
				{
					var file = eleFile.textContent.trim();
					if (file.indexOf("select file") == 0)
					{
						file = file.substring(33);
						var fileNew = file.split("#").reverse().join(" # ").trim();						
						document.title = fileNew + " - " + 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 class="stsh_showing_group"> \
	<span class="stsh_showing_header">Hide</span>\
	<br/> &nbsp; <input value="App" class="stsh_btn_short" type="button" onmouseup="hideKeyAppInterval(); return false;" /> \
	<input value="Game" class="stsh_btn_short" type="button" onmouseup="hideKeyGameInterval(); return false;" /> \
	<br/> &nbsp; <input value="FAQ" class="stsh_btn_short" type="button" onmouseup="hideKeyFaqInterval(); return false;" /> \
	<input value="Support" class="stsh_btn_short" type="button" onmouseup="hideKeySupportInterval(); return false;" /> \
	<br/> &nbsp; <input value="Promo" class="stsh_btn_short" type="button" onmouseup="hideKeyPromoInterval(); return false;" /> \
	<input value="Email" class="stsh_btn_short" type="button" onmouseup="hideKeyEmailInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Hide not similar" class="stsh_btn_long" type="button" onmouseup="hideStrNotMatchInterval(); return false;" /> \
	<br/> &nbsp; <input value="Hide very long" class="stsh_btn_long" type="button" onmouseup="hideStrLongInterval(); return false;" /> \
	 \
	<br/> &nbsp; <span class="stsh_showing_header">Hide Suggestions</span>\
	<br/> &nbsp; <input id="stsh_showing_notTranslated" value="Not Translated (0)" class="stsh_btn_long" type="button" /> \
	<br/> &nbsp; <input id="stsh_showing_suggested" value="Suggested (0)" class="stsh_btn_long" type="button" /> \
	<br/> &nbsp; <input id="stsh_showing_resuggested" value="Resuggested (0)" class="stsh_btn_long" type="button" /> \
	<br/> &nbsp; <input id="stsh_showing_approved" value="Approved (0)" class="stsh_btn_long" type="button" /> \
	<br/> &nbsp; <input id="stsh_showing_declined" value="Declined (0)" class="stsh_btn_long" type="button" /> \
	<br/> &nbsp; <input id="stsh_showing_translated" value="Translated (0)" class="stsh_btn_long" type="button" /> \
	 \
	<br/> &nbsp; <span class="stsh_showing_header">Sort by</span>\
	<br/> &nbsp; <input value="Key" class="stsh_btn_short" type="button" onmouseup="sortKeyInterval(); return false;" /> \
	<input value="String" class="stsh_btn_short" type="button" onmouseup="sortStringInterval(); return false;" /> \
	<br/> &nbsp; <input value="Word" class="stsh_btn_short" type="button" onmouseup="sortWordInterval(); return false;" /> \
	<input value="Length" class="stsh_btn_short" type="button" onmouseup="sortLengthInterval(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input id="stsh_showing_refresh" value="Refresh" class="stsh_btn" type="button" onmouseup="hideSuggestionsBox(); return false;" /> \
	<br/> &nbsp; <input id="stsh_showing_all" value="Show All" class="stsh_btn" type="button" onmouseup="showKey(); return false;" /> \
</div> \
<div id="stsh_showing_current"></div> \
<div id="stsh_showing"></div> \
';

		// Count showing
		function countShowing()
		{
			var trKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr");
			var countAll = document.querySelectorAll("#keylist .copysmall").length;
			var countShow = 0;
			var countSuggest = 0;
			var countResuggest = 0;
			var countApprove = 0;
			var countDecline = 0;
			var countNotTranslated = 0;
			var countTranslated = 0;
			
			var txtApprove = "ready for Admin";
			var txtDecline = "ready for removal";
			var txtSuggest = "suggestion";
			
			for (var i = 0; i < trKeys.length; i++)
			{
				if (trKeys[i].style.display != "none")
				{
					var eleCounter = trKeys[i].querySelector("tr.copysmall > td:nth-child(3)");
					if (eleCounter != null)
					{
						countShow++;
						var txtCounter = eleCounter.textContent.trim();
						if (txtCounter.indexOf(txtApprove) > -1)
						{
							countApprove++;
						}
						else if (txtCounter.indexOf(txtDecline) > -1)
						{
							countDecline++;
						}
						else if (txtCounter.indexOf(txtSuggest) > -1)
						{
							var eleNotTranslated = trKeys[i].querySelector("span.token_nottranslated");
							if (eleNotTranslated != null)
							{
								countSuggest++;
							}
							else
							{
								countResuggest++;
							}
						}
						else
						{						
							var eleNotTranslated = trKeys[i].querySelector("span.token_nottranslated");
							if (eleNotTranslated != null)
							{
								countNotTranslated++;
							}
							else
							{
								countTranslated++;
							}
						}
					}
					else
					{
						var eleTd = trKeys[i].querySelector("td");
						if (eleTd != null)
						{
							if (eleTd.textContent.trim() == "")
							{
								trKeys[i].parentElement.removeChild(trKeys[i]);
							}
						}
					}
				}
			}
			var eleShowing = document.getElementById("stsh_showing");
			if (eleShowing != null)
			{			
				var newHtml = "Showing: <span class=\"stsh_showing_counter\">" + countShow + " of " + countAll + "</span>"
					+ "<!-- " + countNotTranslated + ", " + countSuggest + ", " + countResuggest
					+ ", " + countApprove + ", " + countDecline + ", " + countTranslated + " -->";
					
				if (eleShowing.innerHTML != newHtml)
				{
					eleShowing.innerHTML = newHtml;

					var eleBtnShowings = document.querySelectorAll("#stsh_showing_notTranslated, #stsh_showing_suggested, #stsh_showing_resuggested"
						+ ", #stsh_showing_approved, #stsh_showing_declined, #stsh_showing_translated");
					if (eleBtnShowings.length == 6)
					{
						var counterArr = [countNotTranslated, countSuggest, countResuggest, countApprove, countDecline, countTranslated ];
						var counterTextArr = ["Not Translated", "Suggested", "Resuggested"
							, "Approved", "Declined", "Translated" ];

						for (var i = 0; i < eleBtnShowings.length; i++)
						{
							eleBtnShowings[i].value = counterTextArr[i] + " ("+ counterArr[i] +")" ;
						};
					}
				}
			}
			var eleShowingCur = document.getElementById("stsh_showing_current");
			if (eleShowingCur != null)
			{
				var eleOuter = document.getElementById("suggestions_box_outer");
				if (eleOuter != null)
				{	
					if (eleOuter.style.display != "none")
					{
						if (eleShowingCur.style.display != "initial")
							eleShowingCur.style.display = "initial";
						
						var eleIframe = document.getElementById("suggestions_iframe");
						var iUrl = eleIframe.contentWindow.location.href;
						var listId = parseInt(getQueryByName("list_id", iUrl));
						
						if (isNaN(listId))
							listId = 1;
						else
							listId += 1;
						
						var newHtml = "Current: <span class=\"stsh_showing_counter\">" + listId + " of " + countShow + "</span>";
						if (eleShowingCur.innerHTML != newHtml)
						{
							eleShowingCur.innerHTML = newHtml;
						}
					}
					else
					{
						if (eleShowingCur.style.display != "none")
						{
							eleShowingCur.style.display = "none";
							eleShowingCur.innerHTML = "";
						}
					}
				}
			}
		}
		countShowing();
		setInterval(countShowing, 1000);
		// End Count showing

		// Hide suggestions
		{
			function hideSuggestions(mode) 
			{
				// mode: 0-5 (0: "Not Translated", 1: "Suggested", 2: "Resuggested", 3: "Approved", 4: "Declined", 5: "Translated")

				if (mode < 0 || mode > 5)
					return;

				var display = "none"; 
				var txtApprove = "ready for Admin";
				var txtDecline = "ready for removal";
				var txtSuggest = "suggestion";
				 
				var trKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr");
				for (var i = 0; i < trKeys.length; i++) 
				{ 
					if (trKeys[i].style.display != display)
					{
						var curMode = -1;

						var eleCounter = trKeys[i].querySelector("tr.copysmall > td:nth-child(3)");
						if (eleCounter != null)
						{

							var txtCounter = eleCounter.textContent.trim();
							if (txtCounter.indexOf(txtApprove) > -1)
							{
								curMode = 3;	// Approved
							}
							else if (txtCounter.indexOf(txtDecline) > -1)
							{
								curMode = 4;	// Declined
							}
							else if (txtCounter.indexOf(txtSuggest) > -1)
							{
								var eleNotTranslated = trKeys[i].querySelector("span.token_nottranslated");
								if (eleNotTranslated != null)
								{
									curMode = 1;	// Suggested
								}
								else
								{
									curMode = 2;	// Resuggested
								}
							}
							else
							{						
								var eleNotTranslated = trKeys[i].querySelector("span.token_nottranslated");
								if (eleNotTranslated != null)
								{
									curMode = 0;	// Not Translated
								}
								else
								{
									curMode = 5;	// Translated
								}
							}
						}

						if (curMode == mode) 
						{ 
							trKeys[i].style.display = display;
						} 
					}
				} 
			}

			var itvTime = 300;
			var itvIdHider = [0, 0, 0, 0, 0, 0];

			var eleBtnShowings = document.querySelectorAll("#stsh_showing_notTranslated, #stsh_showing_suggested, #stsh_showing_resuggested"
				+ ", #stsh_showing_approved, #stsh_showing_declined, #stsh_showing_translated");
			if (eleBtnShowings.length == 6)
			{
				for (var i = 0; i < eleBtnShowings.length; i++)
				{
					eleBtnShowings[i].param = i;
					eleBtnShowings[i].addEventListener("click", function(ev)
					{
						var mode = ev.target.param;

						clearInterval(itvIdHider[mode]);
						itvIdHider[mode] = setInterval(function(ev)
						{
							hideSuggestions(mode);
						}, itvTime);

						hideSuggestions(mode);
						countShowing();
						eleBtnShowings[mode].setAttribute("disabled", "disabled");
					});
				}

				var eleBtnShowAll = document.querySelector("#stsh_showing_all");
				if (eleBtnShowAll != null)
				{
					eleBtnShowAll.addEventListener("click", function()
					{
						for (var i = 0; i < eleBtnShowings.length; i++)
						{
							clearInterval(itvIdHider[i]);
							countShowing();
							eleBtnShowings[i].removeAttribute("disabled");
						}
					});
				}
			}

		} // End Hide suggestions

		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[href^='https://steamcommunity.com']");
		for (var i = 0; i < aAvatars.length; i++)
		{
			aAvatars[i].href = aAvatars[i].href.replace("https://steamcommunity.com","http://steamcommunity.com");
			document.title = aAvatars[i].querySelector("img").getAttribute("title") + " - " + document.title;
		}

		var stsh_activityAddLink_start = new Date();
		var stsh_activityAddLink_itv = setInterval(function()
		{
			var stsh_activityAddLink_isEnd = false;
			var stsh_activityAddLink_cur = new Date(); 
	
			var h3s = document.querySelectorAll("#leftAreaContainer h3");
			if (h3s.length == 2)
			{
				var td = h3s[1].parentElement;
				var matchArr = td.innerHTML.match(/<\/h3>.+<br>/i);
				if (matchArr != null)
				{
					var user = url.replace("http://translation.steampowered.com/user_activity.php?user=","");
					var name = matchArr[0].replace("</h3>-","").replace("-<br>","").replace("<br>","").trim();
					var tagNew = "";
					if (user.indexOf("http") == 0)
					{
						tagNew = "</h3><a id='stsh_id' class='stsh_blue' target='_blank' href='http://steamcommunity.com/my'>" + name + "</a>"
							+ ", <a class='stsh_green' target='_blank' href='http://translation.steampowered.com/WhereIsEsty.php'>Esty</a><br><br>";
					}
					else
					{
						tagNew = "</h3><a id='stsh_id' class='stsh_blue' target='_blank' href='http://steamcommunity.com/profiles/"
							+ user + "'>" + name + "</a>"
							+ ", <a class='stsh_green' target='_blank' href='http://translation.steampowered.com/WhereIsEsty.php?collectionof=" 
							+ user + "'>Esty</a><br><br>";
					}
					td.innerHTML = td.innerHTML.replace(/<\/h3>.+<br>/i, tagNew);
					
					stsh_activityAddLink_isEnd = true;
				}
				
				if (stsh_activityAddLink_isEnd || stsh_activityAddLink_cur - stsh_activityAddLink_start > 10000)
				{
					clearInterval(stsh_activityAddLink_itv);
				}
			}
		}, 300);
		
		var countWord = "";
		var countSugg = "";
		
		var inputDials = document.querySelectorAll("#leftAreaContainer input.dial");
		if (inputDials.length == 2)
		{
			countWord = inputDials[0].getAttribute("title").replace("words", "").trim();
			countSugg = inputDials[1].getAttribute("title").replace("suggestions", "").trim();
		}
		
		var tdCount = document.querySelector("#leftAreaContainer td[align='left']");
		if (tdCount != null)
		{
			tdCount.innerHTML = '<div style="width: 100px; display: inline-block; text-align: center;">Word: '
				+ countWord + '</div> <div style="width: 100px; display: inline-block; text-align: center; margin-left: 13px;">Suggestion: '
				+ 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 Progress" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'stsh_id\', -50); return false;" /> \
	 \
	<br/> &nbsp; <span class="stsh_scroll_header">Scroll To</span>\
	<br/> &nbsp; <input value="Comment (' + countComment + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionComment\'); return false;" /> \
	<br/> &nbsp; <input value="Pending (' + countPending + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionPending\'); return false;" /> \
	<br/> &nbsp; <input value="Approved (' + countApproved + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionApproved\'); return false;" /> \
	<br/> &nbsp; <input value="Declined (' + countDeclined + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionDeclined\'); return false;" /> \
	<br/> &nbsp; <input value="Applied (' + countApplied + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionApplied\'); return false;" /> \
	<br/> &nbsp; <input value="Removed (' + countRemoved + ')" class="stsh_btn_long" type="button" onmouseup="scrollToId(\'sectionRemoved\'); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Hide Suggestions" class="stsh_btn_long" type="button" onmouseup="hideSuggestion(); return false;" /> \
	<br/> &nbsp; <input value="Show Suggestions" class="stsh_btn_long" type="button" onmouseup="showSuggestion(); return false;" /> \
	<br/> \
	<br/> &nbsp; <input value="Refresh" class="stsh_btn_long" type="button" onmouseup="window.location = window.location.href; 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;
			}
		}
		
		// change language & correct url
		{
			var aProgresses = document.querySelectorAll("div > .friend_block_avatar a[onmouseout]");
			for (var i = 0; i < aProgresses.length; i++)
			{				
				var langCur = getQueryByName("lang", aProgresses[i].href);
				if (langCur == "")
				{
					aProgresses[i].href = aProgresses[i].href + lang;
				}
				else
				{
					if (langCur != lang)
					{
						var langQuery = (url.indexOf("?") > -1) ? "&lang=" : "?lang=";
						window.location = url + langQuery + langCur;
					}
				}
				
				var aContent = aProgresses[i].textContent.trim();
				if (aContent.indexOf("SUGGESTIONS") > -1)
				{
					aProgresses[i].href = aProgresses[i].href + "&listsort=5&liststatus=1&paginationrows=5000";
				}
				else if (aContent.indexOf("REVIEWS") > -1)
				{
					aProgresses[i].href = aProgresses[i].href + "&listsort=5&liststatus=3&paginationrows=5000";
				}
			}
		}
	
	} // End user_activity.php
	
	if (/\/rally[0-9]{0,4}/.test(url))
	{
		resizeSuggestionBox();
	
		var outer = document.getElementById("suggestions_box_outer");
		if (outer != null)
		{
			outer.setAttribute("onclick","hideSuggestionsBox();");
		}
		
		// Set cur lang to first
		{
			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);
			}
		}
		
		// Change row per page
		{
			var eleAs = document.querySelectorAll(".gradienttable tr:nth-child(6) a[href^='translate.php?']");
			for (var i = 0; i < eleAs.length; i++)
			{
				eleAs[i].href = eleAs[i].href + "&paginationrows=5000";
			}
		}
		
		var inputClose = document.querySelector("td:nth-child(3) > input:nth-child(1)");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
		}
		
	} // End rally.php
	
	if (/\/rally_results_?[0-9]{0,4}/.test(url))
	{
		var h3 = document.querySelector("table.curved h3");
		if (h3 != null)
		{
			document.title = h3.textContent.trim();
		}
		
		var inputClose = document.querySelector("td:nth-child(3) > input:nth-child(1)");
		if (inputClose != null)
		{
			inputClose.value = "Close (Esc)"; 
			inputClose.focus();
		}
		
		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);
		}
		
		var inputPrev = document.querySelector("input[value^='Prev']");
		if (inputPrev != null)
		{
			addKeyCtrl(document, inputPrev, 219, "[");				// [
			addKeyCtrl(document, inputPrev, "BracketLeft", "");		// [
			//addKeyCtrl(document, inputPrev, 0, "");				// [
			//addKeyCtrl(document, inputPrev, 53, "");				// [
			
			disableAfterClick(inputPrev);
		}
		
		var inputNext = document.querySelector("input[value^='Next']");
		if (inputNext != null)
		{
			addKeyCtrl(document, inputNext, 221, "]");				// ]
			addKeyCtrl(document, inputNext, "BracketRight", "");	// ]
			//addKeyCtrl(document, inputNext, 188, "");				// ]
			//addKeyCtrl(document, inputNext, 173, "");				// ]
			//addKeyCtrl(document, inputNext, 169, "");				// ]
			
			disableAfterClick(inputNext);
		}
		
	} // End rally_results.php
	
	if (url.indexOf("/WhereIsEsty.php") > -1)
	{
		resizeSuggestionBox();
	
		var outer = document.getElementById("suggestions_box_outer");
		if (outer != null)
		{
			outer.setAttribute("onclick","hideSuggestionsBox();");
		}
		
		var divContainer = document.querySelector("#pageContainer");
		if (divContainer != null)
		{
			var ele = document.createElement("div");
			ele.id = "logout";
			ele.innerHTML = '<input value="Home" type="button" onmouseup="window.open(\'/home.php\',\'_blank\'); return false;" />';
			divContainer.appendChild(ele);
		}

		var divContent = document.querySelector("#leftAreaContainer > div");
		if (divContent != null)
		{
			var countSnap = document.querySelectorAll("div.box").length;
			var user = "";
			var name = "";

			var eleImg = document.querySelector("#leftAreaContainer > div > div > a > img ");
			if (eleImg != null)
			{
				name = eleImg.getAttribute("title");
				user = eleImg.parentElement.getAttribute("href").replace("https://steamcommunity.com/profiles/", "");
			}
			var ele = document.createElement("div");
			ele.setAttribute("class", "stsh_snapshot");
			ele.innerHTML = "<a class='stsh_blue' target='_blank' href='http://translation.steampowered.com/user_activity.php?user=" 
				+ user + "'>" + name + "</a>"
				+ "<br>Snapshot: " + countSnap;

			divContent.appendChild(ele);
		}
		
	} // End WhereIsEsty.php
	
	if (url.indexOf("/stickerbox.php") > -1)
	{
		document.querySelector("textarea[name='add_comment']").focus();

		var inputPrev = document.querySelector("img[src*='previous.png'");
		if (inputPrev != null)
		{
			addKeyCtrl(document, inputPrev, 219, "");				// [
			addKeyCtrl(document, inputPrev, "BracketLeft", "");		// [
			//addKeyCtrl(document, inputPrev, 0, "");				// [
			//addKeyCtrl(document, inputPrev, 53, "");				// [
			
			disableAfterClick(inputPrev);
		}
		
		var inputNext = document.querySelector("img[src*='next.png'");
		if (inputNext != null)
		{
			addKeyCtrl(document, inputNext, 221, "");				// ]
			addKeyCtrl(document, inputNext, "BracketRight", "");	// ]
			//addKeyCtrl(document, inputNext, 188, "");				// ]
			//addKeyCtrl(document, inputNext, 173, "");				// ]
			//addKeyCtrl(document, inputNext, 169, "");				// ]
			
			disableAfterClick(inputNext);
		}
	} // End stickerbox.php
	
	if (/\/(home|index)/i.test(url))
	{
		// Set cur lang to first
		{
			var first = null;
			var cur = null;
			var curLang = lang.substring(0, 4);
			
			if (curLang == "schi")
				curLang = "sim.";
			else if (curLang == "tchi")
				curLang = "tra.";
			
			var eleLangs = document.querySelectorAll("#overall .progress");
			first = eleLangs[0];
			for (var i = 0; i < eleLangs.length; i++)
			{
				if (curLang == eleLangs[i].textContent.trim().substring(0, 4).toLowerCase())
				{
					cur = eleLangs[i];
					break;
				}
			}
			
			if (cur != null)
			{
				var curSib1 = cur.nextSibling;
				var curSib2 = curSib1.nextSibling;
				var curSib3 = curSib2.nextSibling;
				var curSib4 = curSib3.nextSibling;
				var curSib5 = curSib4.nextSibling;
				var curSib6 = curSib5.nextSibling;
				
				insertBeforeElement(cur, first);
				insertAfterElement(curSib6, cur);
				insertAfterElement(curSib5, cur);
				insertAfterElement(curSib4, cur);
				insertAfterElement(curSib3, cur);
				insertAfterElement(curSib2, cur);
				insertAfterElement(curSib1, cur);
			}
		}
	} // End home.php
	
} // End Main

function client()
{
	var clientScript = ' \
 \
var itvTime = 300; \
var itvIdHideKeyApp = 0; \
var itvIdHideKeyGame = 0; \
var itvIdHideKeyFaq = 0; \
var itvIdHideKeySupport = 0; \
var itvIdHideKeyPromo = 0; \
var itvIdHideKeyEmail = 0; \
var itvIdHideStrNotMatch = 0; \
var itvIdHideStrLong = 0; \
var itvIdSortKey = 0; \
 \
function isSuggestionBoxVisible() \
{ \
	var eleSugOuter = document.querySelector("#suggestions_box_outer"); \
	if (eleSugOuter != null && eleSugOuter.style.display != "none") \
	{ \
		/*return true;*/ \
	} \
	return false; \
} \
 \
function setVisibleKey(startKey, visible) \
{ \
	if (isSuggestionBoxVisible()) return; \
	 \
	startKey = startKey.toLowerCase(); \
	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().toLowerCase().indexOf(startKey) > -1) \
			{ \
				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); \
	setVisibleKey("TF_", false); \
} \
 \
function hideKeyApp() \
{ \
	setVisibleKey("# storefront_english_apps.txt #", false); \
	setVisibleKey("# storefront_english_main.txt # #app_", false); \
	setVisibleKey("# community_english.txt # SharedFiles_App_", false); \
	setVisibleKey("# appmgmt_english.txt #", false); \
} \
 \
function hideKeyFaq() \
{ \
	setVisibleKey("# support_faq_english.txt #", false); \
} \
 \
function hideKeySupport() \
{ \
	setVisibleKey("# supportui_english.txt #", false); \
	setVisibleKey("# help_english.txt #", false); \
} \
 \
function hideKeyPromo() \
{ \
	setVisibleKey("#promo", false); \
	setVisibleKey("#hardware", false); \
	setVisibleKey("ControllerBinding", false); \
	setVisibleKey("Library_Controller", false); \
} \
 \
function hideKeyEmail() \
{ \
	setVisibleKey("#email", false); \
} \
 \
function showKey() \
{ \
	clearInterval(itvIdHideKeyApp); \
	clearInterval(itvIdHideKeyGame); \
	clearInterval(itvIdHideKeyFaq); \
	clearInterval(itvIdHideKeySupport); \
	clearInterval(itvIdHideKeyPromo); \
	clearInterval(itvIdHideKeyEmail); \
	clearInterval(itvIdSortKey); \
	clearInterval(itvIdHideStrNotMatch); \
	clearInterval(itvIdHideStrLong); \
	setVisibleKey("", true); \
	 \
	hideSuggestionsBox(); \
} \
 \
function sortKey(mode) \
{ \
	/* \
		mode: \
			1: key \
			2: string \
			3: word \
			4: length \
	*/ \
	if (isSuggestionBoxVisible()) return; \
	 \
	var keyArr = new Array(); \
	var valArr = new Array(); \
	var key; \
	var str; \
	 \
	var dot = "..."; \
	var dotLengthMinus = 0 - dot.length; \
	var isDot = false; \
	 \
	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(); \
			str = ""; \
			isDot = false; \
			if (mode != 1) \
			{ \
				str = eleKeys[i].parentElement.nextSibling.nextSibling.firstElementChild.textContent.trim(); \
				isDot = (str.substr(dotLengthMinus) == dot); \
			} \
			if (mode == 2) \
			{ \
				key = str + " ___ " + key; \
			} \
			else if (mode == 3) \
			{ \
				key = (isDot ? "99_" : "00_") \
					+ padZero(str.split(" ").length, 2) + "_" + padZero(str.split(/[^a-z0-9 ]/i).length, 2) \
					+ " ___ "+ str + " ___ " + key; \
			} \
			else if (mode == 4) \
			{ \
				key = (isDot ? "99_" : "00_") \
					+ (str.split(/[^a-z0-9]/i).length > 1 ? "99_" : "00_") \
					+ padZero(str.length, 3) \
					+ " ___ "+ str + " ___ " + key; \
			} \
			key = key.toLowerCase(); \
			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, offset) \
{ \
	if (typeof offset == "undefined") \
	{ \
		offset = -20; \
	} \
	 \
	var ele = document.getElementById(id); \
	if (ele != null) \
	{ \
		ele.scrollIntoView(true); \
		window.scrollBy(0, offset); \
	} \
} \
 \
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.indexOf("showwalletkeys") < 0 && 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); \
	itvIdHideKeySupport = setInterval(hideKeySupport, itvTime); \
} \
 \
function hideKeyPromoInterval() \
{ \
	clearInterval(itvIdHideKeyPromo); \
	itvIdHideKeyPromo = setInterval(hideKeyPromo, itvTime); \
} \
 \
function hideKeyEmailInterval() \
{ \
	clearInterval(itvIdHideKeyEmail); \
	itvIdHideKeyEmail = setInterval(hideKeyEmail, itvTime); \
} \
 \
function sortKeyInterval() \
{ \
	clearInterval(itvIdSortKey); \
	itvIdSortKey = setInterval(sortKey, itvTime, 1); \
} \
 \
function sortStringInterval() \
{ \
	clearInterval(itvIdSortKey); \
	itvIdSortKey = setInterval(sortKey, itvTime, 2); \
} \
 \
function sortWordInterval() \
{ \
	clearInterval(itvIdSortKey); \
	itvIdSortKey = setInterval(sortKey, itvTime, 3); \
} \
 \
function sortLengthInterval() \
{ \
	clearInterval(itvIdSortKey); \
	itvIdSortKey = setInterval(sortKey, itvTime, 4); \
} \
 \
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 tr:last-child > 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() \
{ \
	if (isSuggestionBoxVisible()) return; \
	 \
	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)"); \
	for (var i = 0; i < eleStrs.length; i++) \
	{ \
		try \
		{ \
			var valStr = eleStrs[i].childElements()[0].textContent.trim().toLowerCase(); \
			var valTrn = eleStrs[i].childElements()[2].textContent.trim().toLowerCase(); \
			if (valStr != searchStr && valTrn != searchStr) \
			{ \
				var eleTarget = eleStrs[i].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() \
{ \
	if (isSuggestionBoxVisible()) return; \
	 \
	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 clickToSelect(ele) \
{ \
	var range = document.createRange(); \
	range.setStartBefore(ele.firstChild); \
	range.setEndAfter(ele.lastChild); \
	var sel = window.getSelection(); \
	sel.removeAllRanges(); \
	sel.addRange(range); \
} \
 \
function syncUrlArray() \
{ \
	if (isSuggestionBoxVisible()) return; \
	 \
	var displayNone = "none"; \
	var strStart = "showSuggestionsBox( \'"; \
	var strEnd = "\' ); return false;"; \
	var strCur = "&list_id="; \
	var strAll = "&endnext="; \
	var regPos = /&list_id=\\d+&endnext=\\d+/g; \
	var isEdit = false; \
	var eleDivs = []; \
	var urls = []; \
 	 \
	var trKeys = document.querySelectorAll("#keylist > table:nth-child(1) > tbody:nth-child(1) > tr"); \
	for (var i = 0; i < trKeys.length; i++)  \
	{ \
		if (trKeys[i].style.display != displayNone) \
		{ \
			var eleDiv = trKeys[i].childNodes[0].childNodes[0]; \
			if (typeof eleDiv.getAttribute != "undefined" \
				&& eleDiv.getAttribute("onclick") != null) \
			{ \
				eleDivs.push(eleDiv); \
			} \
		} \
	} \
	 \
	for (var i = 0, l = eleDivs.length; i < l; i++) \
	{ \
		var evOld = eleDivs[i].getAttribute("onclick"); \
		if (evOld != null) \
		{ \
			var url = evOld.replace(strStart,"").replace(strEnd,"").replace(regPos,""); \
			url = url + strCur + i + strAll + l; \
			urls.push(url); \
			 \
			var evNew = strStart + url + strEnd; \
			if (evOld != evNew) \
			{ \
				eleDivs[i].setAttribute("onclick", evNew); \
				isEdit = true; \
			} \
		} \
	} \
	 \
	if (isEdit || typeof URLarray == "undefined" || URLarray.length != urls.length) \
	{ \
		URLarray = urls; \
	} \
} \
 \
function setFrameColor(color) \
{ \
	var frame = document.querySelector("div#suggestions_box iframe"); \
	if (frame != null) \
	{ \
		if (frame.style.backgroundColor != color) \
		{ \
			frame.style.setProperty("background-color", color, "important"); \
		} \
	} \
} \
 \
function padZero(num, size) \
{ \
	return (1e15+num+"").slice(-size); \
} \
 \
function doInstant() \
{ \
	var url = document.documentURI; \
	if (url.indexOf("user_activity.php") > -1) \
	{ \
		showSuggestion(); \
		 \
		document.addEventListener("DOMContentLoaded", function (e) \
		{ \
			if (typeof $ != "undefined") \
			{ \
				$(".dial").css("display", "none"); \
				setTimeout(function() \
				{ \
					/* Restore drawing progress */ \
					$(function() { \
						$(".dial").css("display", ""); \
						$(".dial").knob({ \
						  "draw" : function () { \
							$(this.i).val(this.cv + "%"); \
						  } \
						}); \
					}) \
				}, 50); \
			} \
		}); \
	} \
	else if (url.indexOf("translate.php") > -1) \
	{ \
		setInterval(function() \
		{ \
			syncUrlArray(); \
		}, itvTime); \
	} \
	else if (url.indexOf("suggestions.php") > -1) \
	{ \
		if (parent != window) \
		{ \
			var main = document.querySelector("#suggestionmain"); \
			if (main != null) \
			{ \
				var color = window.getComputedStyle(main).backgroundColor; \
				parent.setFrameColor(color); \
			} \
		} \
	} \
	 \
} \
doInstant(); \
 \
';

	var eleClientScript = document.createElement("script");
	eleClientScript.innerHTML = clientScript;
	document.head.appendChild(eleClientScript);
} // End client

attachOnReady(client);
attachOnReady(main);



// End