WoTStatScript - Clanpage

More info for World of Tanks clan page.

目前為 2016-03-20 提交的版本,檢視 最新版本

// ==UserScript==
// @name        WoTStatScript - Clanpage
// @version     0.9.14.0.2
// @description More info for World of Tanks clan page.
// @author      Orrie
// @namespace   http://forum.worldoftanks.eu/index.php?/topic/263423-
// @icon        http://dl.dropboxusercontent.com/u/12497046/wot/projects/statscript/img/icon.png
// @include     http://*.wargaming.net/clans/*/*
// @grant       GM_xmlhttpRequest
// @connect     www.wnefficiency.net
// @connect     api.worldoftanks.eu
// @connect     api.worldoftanks.ru
// @connect     api.worldoftanks.com
// @connect     api.worldoftanks.asia
// @connect     api.worldoftanks.kr
// @license     MIT License
// ==/UserScript==
(function() {
	// global vars
	var d = document, c = d.cookie;

	// get server info and webpage
	var wg = {host:d.location.host, href:d.location.href, clan:{}};
	wg.srv = wg.host.match(/(eu|ru|na|asia|kr)/)[0];
	wg.m = (/players/i.test(wg.href) || /players\/wot/i.test(wg.href)) && !/wowp/i.test(wg.href);

	// getting claninfo
	var emblemName = d.getElementsByClassName('page-header_emblem')[0],
	clanName = d.getElementsByClassName('clan_name')[0],
	sidebarName = d.getElementsByClassName('sidebar-clan_emblem')[0];
	wg.clan.id = wg.href.match(/\/(\d+)/)[1];
	wg.clan.name = (emblemName || clanName) ? ((clanName) ? clanName.firstElementChild.innerHTML.replace(/[\[\]]/g,"") : emblemName.alt) : sidebarName.alt;
	wg.p = new RegExp("\\["+wg.clan.name+"\\] \\|").test(d.title) && !/wowp/i.test(wg.href);

	// script variables
	var sc = {
		vers: "0.9.14.0.2",
		host: "http://greasyfork.org/en/scripts/12137-wotstatscript-clans",
		user: {
			wl: "http://forum.wotlabs.net/index.php?/user/1618-orrie/",
			wot: "http://worldoftanks.eu/community/accounts/505838943-Orrie/"
		},
		top: {
			eu: "http://forum.worldoftanks.eu/index.php?showtopic=263423",
			na: "http://forum.worldoftanks.com/index.php?showtopic=404652"
		},
		cred: { // translators
			cs: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/500744969/'>Crabtr33</a> , <a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/508323506/'>Ragnarocek</a> , <a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/508904714/'>jViks</a>" ,
			de: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/504873051/'>ArtiOpa</a> , <a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/501118529/'>Crakker</a> , <a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/501072645/'>multimill</a>",
			fr: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/506641783/'>SuperPommeDeTerre</a>",
			pl: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/501801562/'>KeluMocy</a> , <a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/504412736/'>pokapokami</a>",
			es: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/512759883/'>Frodo45127</a>",
			tr: "<a class='b-orange-arrow' href='http://worldoftanks.eu/community/accounts/500400806/'>Ufuko</a>",
			ru: "dimon222"
		},
		api: {
			ru: "98ca7c4fb108175b67d6505b9c3f3ebd",
			eu: "a7595640a90bf2d19065f3f2683b171c",
			na: "bf5dba0efd444d75147b6222dd903fd2",
			asia: "95f8713eccd322e52dbf521dbd28b19c",
			kr: "ffea0f1c3c5f770db09357d94fe6abfb"
		},
		srv: {
			wl: false,   // wotlabs
			nm: false,   // noobmeter
			vb: false,   // vbaddict
			ws: false,   // wotstats
			cs: false,   // wotcs
			wlf: false,  // wot-life
			as: false,   // away stats
			ct: false,   // clan tools
			aos: false,  // age of strife
			kttc: false, // kttc
			wots: false, // wots
			ch: false,   // clan history
			wr: false    // wotreplays
		},
		wn: "http://www.wnefficiency.net/exp/expected_tank_values_latest.json",
		loc: c.match(/wgccfe_language=(\w+)/)[1],
		locSup: ["en", "ru", "cs", "de", "fr", "pl", "es", "tr"],
		date: Date.now(),
		dateFormat: {ru: "ru-RU", eu: "en-GB", na: "en-US", asia: "en-AU", kr: "ko-KR"},
		web: {
			gecko: typeof InstallTrigger !== 'undefined',
			opera: !!window.opera || /opera|opr/i.test(navigator.userAgent),
			chrome: !!window.chrome && !!window.chrome.webstore,
			safari: /constructor/i.test(window.HTMLElement)
		}
	};

	// script functions
	var sf = {
		tableFetch: function () {
			// show animated loading gear
			loadGif.classList.remove("js-hidden");
			// find required info from table player rows
			for (var _rt=0, _rt_len = memObj.cls.rows.length; _rt<_rt_len; _rt++) {
				var row = memObj.cls.rows[_rt];
				if (!row.classList.contains("tbl-rating_tr__card")) {
					var id = row.getAttribute('data-account_id'),
					name = row.getElementsByClassName('player_name')[0].innerHTML.match(/[\w\_]+/)[0];
					if (!isNaN(id)) {
						memObj.ids.push(id);
						s.user[id] = {u:{name:name,id:id}, v:{frag:0,dmg:0,spot:0,def:0,win:0}, wn8:""};
					}
				}
			}
			s.clan = {wn8:0, win:0, mem: _rt_len};
			// request and retrieve statistics from API
			if (s.clan.mem > 0) {
				sf.request(sc.api.i+memObj.ids.join(','), sf.apiInfoHnd);
			}
		},
		apiInfoHnd: function (resp) { // processing information from player API
			var data = JSON.parse(resp).data;
			for (var a in data) {
				if (data.hasOwnProperty(a)) {
					var pData = data[a];
					if (pData !== null) {
						// store stats
						var pDataStats = pData.statistics.all;
						s.user[pData.account_id].u = {
							name: pData.nickname,
							id: pData.account_id,
							cid: pData.clan_id,
							bat: pDataStats.battles,
							win: (pDataStats.wins/pDataStats.battles)*100,
							dmg: pDataStats.damage_dealt/pDataStats.battles,
							frag: pDataStats.frags/pDataStats.battles,
							spot: pDataStats.spotted/pDataStats.battles,
							def: pDataStats.dropped_capture_points/pDataStats.battles,
							wgr: pData.global_rating,
							lng: pData.client_language
						};
						s.clan.win += (!isNaN(s.user[pData.account_id].u.win)) ? s.user[pData.account_id].u.win : 0;
					}
				}
			}
			d.getElementById('js-wn8-status').textContent = "50%";
			sf.request(sc.api.v+memObj.ids.join(','), sf.apiVehHnd);
		},
		apiVehHnd: function (resp) { // processing information from vehicle API and calculate WN8
			var data = JSON.parse(resp).data;
			for (var p in data) {
				if (data.hasOwnProperty(p)) {
					var vData = data[p];
					if (vData !== null) {
						var rWin, rDmg, rFrag, rSpot, rDef, wn8 = 0;
						if (s.user[p].u.bat > 0) {
							for (var v in vData) {
								if (vData.hasOwnProperty(v)) {
									// go through each vehicle to get expected stats
									for (var _so=0, _so_len = statArr.length; _so<_so_len; _so++) {
										if (statArr[_so].IDNum == vData[v].tank_id) {
											var vehStat = statArr[_so],
											dataBattles = vData[v].statistics.battles;
											s.user[p].v.frag += vehStat.expFrag    * dataBattles;
											s.user[p].v.dmg  += vehStat.expDamage  * dataBattles;
											s.user[p].v.spot += vehStat.expSpot    * dataBattles;
											s.user[p].v.def  += vehStat.expDef     * dataBattles;
											s.user[p].v.win  += vehStat.expWinRate * dataBattles;
											break;
										}
									}
								}
							}
							// start calculating wn8
							rWin  = Math.max(((s.user[p].u.win /(s.user[p].v.win /s.user[p].u.bat)-0.71)/(1-0.71)),0);
							rDmg  = Math.max(((s.user[p].u.dmg /(s.user[p].v.dmg /s.user[p].u.bat)-0.22)/(1-0.22)),0);
							rFrag = Math.max(Math.min(rDmg+0.2,((s.user[p].u.frag/(s.user[p].v.frag/s.user[p].u.bat)-0.12)/(1-0.12))),0);
							rSpot = Math.max(Math.min(rDmg+0.1,((s.user[p].u.spot/(s.user[p].v.spot/s.user[p].u.bat)-0.38)/(1-0.38))),0);
							rDef  = Math.max(Math.min(rDmg+0.1,((s.user[p].u.def /(s.user[p].v.def /s.user[p].u.bat)-0.10)/(1-0.10))),0);
							wn8 = 980*rDmg + 210*rDmg*rFrag + 155*rFrag*rSpot + 75*rDef*rFrag + 145*Math.min(1.8,rWin);
						}
						// store wn8 and add to clan total
						s.user[p].wn8 = wn8;
						s.clan.wn8 += wn8;
					}
				}
			}
			// calculate average wn8 / winrate and store everything in localStorage, then reload page
			s.clan.wn8 = s.clan.wn8/s.clan.mem;
			s.clan.win = s.clan.win/s.clan.mem;
			sf.storage("statScriptValues_"+wg.clan.id, s, "set", "string");
			sf.storage("statScriptDate_"+wg.clan.id, sc.date, "set");
			d.getElementById('js-wn8-status').textContent = "100%";
			location.reload();
		},
		apiBanHnd: function (resp) { // processing information from banned API
			var data;
			if (!memObj.bans.api) {
				data = JSON.parse(resp).data;
				memObj.bans.api = data;
				memObj.bans.f = true;
			}
			else {
				data = memObj.bans.api;
			}
			for (var a in data) {
				if (data.hasOwnProperty(a)) {
					var bData = data[a];
					var memClass = "js-tooltip-id_js-playerslist-account-name-tooltip-"+a,
					memCell = d.getElementsByClassName(memClass)[0].parentNode;
					if (bData.ban_time !== null) {
						var banTime = (bData.ban_time > 0) ? new Date(bData.ban_time*1000).toLocaleString(sc.dateFormat[wg.srv]) : loc[17];
						memCell.appendChild(sf.elem("p", "player_time", banTime));
					}
					else {
						memCell.appendChild(sf.elem("p", "player_time", loc[18]));
					}
				}
			}
		},
		format: function (input, type) { // input and output formatting
			var inputStr = input.toString();
			switch(type) {
				case (1): // input string into number
					return parseFloat(inputStr.replace(/[^\d]/g,""));
				case (2): // output number with locale symbol
					return inputStr.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1"+loc[0]);
				case (3): // input string into number - exclude dots
					return parseFloat(inputStr.replace(/[^\d\.]/g,""));
				default:
					console.error("Error filtering: ", input);
					return input;
			}
		},
		color: function (input, type, dec, sym) { // color formatting
			var color = colArr.dft[0],
			output = input.toFixed(dec);
			if (input >= 1000) {
				output = sf.format(input.toFixed(dec),2);
			}
			for (var c in colArr) {
				if (colArr.hasOwnProperty(c)) {
					if (input >= colArr[c][colArr.id[type]]) {
						color = colArr[c][0]; break;
					}
				}
			}
			if (loc[0] !== "," && dec !== 0) {
				output = output.replace(/\.(\d+)*$/g,",$1");
			}
			if (sym) {
				output += sym;
			}
			return "<font color='"+color+"'>"+output+"</font>";
		},
		elem: function (tag, name, html, type) { // element creation
			var element = d.createElement(tag);
			if (name) {
				element.className = name;
			}
			if (html) {
				if (/</.test(html)) {
					element.innerHTML = html;
				}
				else {
					element.textContent = html;
				}
			}
			if (type) {
				element.type = type;
			}
			return element;
		},
		settings: function (name, text, state, dftState, wlist) { // script menu handler
			var listItem = sf.elem("li", "settingItem", ""),
			listItems = d.createDocumentFragment();
			if (name == "wnRefresh") {
				var refreshBtn = sf.elem("div", "b-settingParent b-"+name, "<a>"+text+"</a>");
				refreshBtn.addEventListener('click', function() {localStorage.removeItem("wnExpValues"); location.reload();}, false);
				listItems.appendChild(refreshBtn);
			}
			else if (name == "cleanStorage") {
				var cleanBtn = sf.elem("div", "b-settingParent b-"+name, "<a>"+text+"</a>");
				cleanBtn.addEventListener('click', function() {localStorage.clear(); location.reload();}, false);
				listItems.appendChild(cleanBtn);
			}
			else {
				var optCheckDiv = sf.elem("div", "b-checkbox", "<span class='b-checkbox_checker'></span>"),
				optLabel = sf.elem("label", "b-combobox-label", text),
				optCheck = sf.elem("input", "l-box", "", "checkbox");
				optLabel.htmlFor = name;
				optCheck.name = name;
				optCheck.id = name;
				if (state) {
					optCheckDiv.classList.add("b-checkbox__checked");
					optLabel.classList.add("b-combobox-label__checked");
				}
				optCheck.checked = (state !== undefined) ? state : dftState;
				optCheck.addEventListener('click', function() {
					sf.storage('statScript_' + this.name, this.checked, "set");
					d[this.name] = this.checked;
					this.parentNode.classList.toggle('b-checkbox__checked');
					this.parentNode.parentNode.classList.toggle('b-combobox-label__checked');
					return this.checked;
				}, false);
				d[optCheck.name] = optCheck.checked;
				optCheckDiv.insertBefore(optCheck, optCheckDiv.firstChild);
				optLabel.appendChild(optCheckDiv);
				listItems.appendChild(optLabel);
				if (name == "whitelist") {
					var optText = sf.elem("textarea", "l-textarea", "");
					optText.placeholder = "Add clanID seperated by comma without spaces: 500004502,500010805";
					if (wlist) {
						optText.value = wlist;
					}
					optText.addEventListener('input', function() {
						sf.storage('statScript_whitelist_list', optText.value.split(","), "set");
					}, false);
					listItems.appendChild(optText);
				}
			}
			listItem.appendChild(listItems);
			return listItem;
		},
		links: function (parent, links) { // links handler
			var uRows = d.createDocumentFragment();
			for (var _l=0, _l_len = links.length; _l<_l_len; ++_l) {
				if (links[_l] instanceof HTMLElement) {
					uRows.appendChild(links[_l]);
				}
				else {
					uRows.appendChild((links[_l][0] && links[_l][1]) ? sf.elem("li", "", links[_l][1]) : sf.elem("li", "statname", links[_l][0]));
				}
			}
			parent.appendChild(uRows);
		},
		storage: function (name, data, type, mode) { // localStorage handler
			var storage;
			switch(type) {
				case ("set"):
					if (mode == "string") {
						data = JSON.stringify(data);
					}
					storage = localStorage.setItem(name, data);
					break;
				case ("get"):
					storage = localStorage.getItem(name);
					if (mode == "parse") {
						storage = JSON.parse(storage);
					}
					break;
				default: break;
			}
			return storage;
		},
		wn: { // wnefficiency handler
			hnd: function (resp) {
				sf.storage("wnExpValues", resp, "set");
				sf.storage("wnExpDate", sc.date, "set");
				sf.storage("wnExpVers", [sc.vers, JSON.parse(resp).header.version], "set", "string");
				location.reload();
			},
			error: function (error) {
				console.error("Error accessing WNEfficiency.net", error);
			}
		},
		request: function (url, handler, error) { // retrieval function
			GM_xmlhttpRequest({
				method: "GET",
				url: url,
				headers: {
					"Accept": "text/xml"
				},
				onload: function(resp) {
					if (resp.readyState == 4 && resp.status == 200 && resp.statusText == "OK") {
						handler(resp.responseText);
					}
					else {
						error(resp.responseText);
					}
				},
				onerror: function(resp) {
					error(resp.responseText);
				}
			});
		}
	};

	// api links without account id
	sc.api.i = "http://api.worldoftanks."+((wg.srv == "na") ? "com" : wg.srv)+"/wot/account/info/?application_id="+sc.api[wg.srv]+"&account_id=";
	sc.api.v = "http://api.worldoftanks."+((wg.srv == "na") ? "com" : wg.srv)+"/wot/account/tanks/?application_id="+sc.api[wg.srv]+"&account_id=";

	// fetch wnefficiency values - check if array exists in localStorage, otherwise fetch and reload page
	var wn = {
		values: sf.storage("wnExpValues", "", "get", "parse"),
		date: sf.storage("wnExpDate", "", "get", "parse")+12096e5 >= sc.date, // true if timestamp is less than 2 weeks old, refresh list if false.
		vers: sf.storage("wnExpVers", "", "get", "parse") || ""
	}, statArr = [];
	if (wn.vers[0]==sc.vers && wn.values && wn.date) {
		statArr = wn.values.data;
	}
	else {
		sf.request(sc.wn, sf.wn.hnd, sf.wn.error);
	}

	// fetch stored clanlist stats - check if array exists in localStorage, otherwise tag fetching to true
	var ss = {
		val: sf.storage("statScriptValues_"+wg.clan.id, "", "get", "parse"),
		date: sf.storage("statScriptDate_"+wg.clan.id, "", "get", "parse")+6048e5 >= sc.date // true if timestamp is less than 1 weeks old, refresh list if false.
	}, s = {clan:{},user:{}}, statFetch = false;
	if (ss.val && ss.date) {
		s = ss.val;
	}
	else {
		statFetch = true;
	}

	// inserting style into head
	var style = sf.elem("style", "wotstatscript", "", "text/css");
	d.head.appendChild(style);

	// colour scale array
	var colArr = {
		//      col        wr  bat    sr  hr  dmg  wgr   wn8   wn7   eff   nm
		sUni: [ "#5A3175", 65, 30000, 50, 80, 300, 9900, 2900, 2050, 2050, 2000 ], // 99.99% super unicum
		uni:  [ "#83579D", 60, 25000, 46, 75, 270, 9000, 2450, 1850, 1800, 1950 ], // 99.90% unicum
		gr8:  [ "#3972C6", 56, 21000, 42, 70, 240, 8500, 2000, 1550, 1500, 1750 ], // 99.00% great
		vGud: [ "#4099BF", 54, 17000, 38, 65, 210, 6500, 1600, 1350             ], // 95.00% very good
		good: [ "#4D7326", 52, 13000, 34, 60, 180, 5000, 1200, 1100, 1200, 1450 ], // 82.00% good
		aAvg: [ "#849B24", 50, 10000, 30, 55, 150, 4000,  900                   ], // 63.00% above average
		avg:  [ "#CCB800", 48,  7000, 25, 50, 120, 3000,  650,  900,  900, 1250 ], // 40.00% average
		bAvg: [ "#CC7A00", 47,  3000, 20, 45,  90, 2000,  450,  700,  600, 1150 ], // 20.00% below average
		bas:  [ "#CD3333", 46,  1000, 15, 40,  60, 1500,  300,  500             ], //  6.00% basic
		beg:  [ "#930D0D",  0,     0,  0,  0,   0,    0,    0,    0,    0,    0 ], //  0.00% beginner
		dft:  [ "#6B6B6B" ], // default
		id: { "col": 0, "wr": 1, "bat": 2, "sr": 3, "hr": 4, "dmg": 5, "wgr": 6, "wn8": 7, "wn7": 8, "eff": 9, "nm": 10 }  // type identifier
	};

	// localization
	// cz-czech   - Crabtr33 and Ragnarocek
	// de-german  - ArtiOpa, Crakker and multimill
	// fr-french  - SuperPommeDeTerre
	// pl-polish  - KeluMocy and pokapokami
	// es-spanish - Frodo45127
	// tr-turkish - Ufuko
	// ru-russian - dimon222
	var loc = [
		// thousands separator
		{ en: ",", ru: " ", cs: " ", de: ".", fr: " ", pl: " ", es:" ", tr: "."},
		// clan page
		{ en: "Clan Stats", ru: "Статистика клана", cs: "Stat. klanu", de: "Clanstatistiken", fr: "Statistiques du clan", pl: "Statystyki klanu", es: "Estadísticas del clan", tr: "Klan İstatistikleri"},
		{ en: "Replays:", ru: "Реплеи:", cs: "Záznamy:", de: "Replays", fr: "Replays:", pl: "Powtórki:", es: "Repeticiones:", tr: "Replayler"},
		// memberlist
		{ en: "Script Menu", ru: "Script Menu", cs: "Nastavení scriptu", de: "Script Menu", fr: "Script Menu", pl: "Script Menu", es:"Script Menu", tr: "Script Menu"},
		{ en: "Load Stats Automatically", ru: "Load Stats Automatically", cs: "Nahrát stat. automaticky", de: "Load Stats Automatically", fr: "Load Stats Automatically", pl: "Load Stats Automatically", es:"Load Stats Automatically", tr: "Load Stats Automatically"},
		{ en: "Use Whitelist", ru: "Use Whitelist", cs: "Použi whitelist", de: "Use Whitelist", fr: "Use Whitelist", pl: "Use Whitelist", es:"Use Whitelist", tr: "Use Whitelist"},
		{ en: "Refresh WN8 Table", ru: "Refresh WN8 Table", cs: "Obnov WN8 Tabulku", de: "Refresh WN8 Table", fr: "Refresh WN8 Table", pl: "Refresh WN8 Table", es: "Refresh WN8 Table", tr: "Refresh WN8 Table"},
		{ en: "Clean Script Database", ru: "Clean Script Database", cs: "Vyčisti db scriptu", de: "Clean Script Database", fr: "Clean Script Database", pl: "Clean Script Database", es: "Clean Script Database", tr: "Clean Script Database"},
		{ en: "Average Winrate", ru: "Average Winrate", cs: "Průměrný winrate", de: "Average Winrate", fr: "Average Winrate", pl: "Average Winrate", es:"Average Winrate", tr: "Average Winrate"},
		{ en: "Average WN8", ru: "Average WN8", cs: "Průměrné WN8", de: "Average WN8", fr: "Average WN8", pl: "Average WN8", es:"Average WN8", tr: "Average WN8"},
		{ en: "Overall", ru: "Overall", cs: "Celkem", de: "Overall", fr: "Overall", pl: "Overall", es:"Overall", tr: "Overall"},
		{ en: "Fetch WN8 for Clan", ru: "Fetch WN8 for Clan", cs: "Obnov WN8 pre klan", de: "Fetch WN8 for Clan", fr: "Fetch WN8 for Clan", pl: "Fetch WN8 for Clan", es:"Fetch WN8 for Clan", tr: "Fetch WN8 for Clan"},
		{ en: "Fetching WN8 for Clan!", ru: "Fetching WN8 for Clan!", cs: "Obnovuju WN8 pro klan!", de: "Fetching WN8 for Clan!", fr: "Fetching WN8 for Clan!", pl: "Fetching WN8 for Clan!", es:"Fetching WN8 for Clan!", tr: "Fetching WN8 for Clan!"},
		{ en: "WN8 Fetched for Clan!", ru: "WN8 Fetched for Clan!", cs: "WN8 obnoveno pro klan!", de: "WN8 Fetched for Clan!", fr: "WN8 Fetched for Clan!", pl: "WN8 Fetched for Clan!", es:"WN8 Fetched for Clan!", tr: "WN8 Fetched for Clan!"},
		{ en: "Not Found", ru: "Not Found", cs: "Nenalezeno", de: "Not Found", fr: "Not Found", pl: "Not Found", es:"Not Found", tr: "Not Found"},
		{ en: "New Members:", ru: "New Members:", cs: "Noví členové:", de: "New Members:", fr: "New Members:", pl: "New Members:", es:"New Members:", tr: "New Members:"},
		{ en: "Banned Members:", ru: "Banned Members:", cs: "Noví členové:", de: "Banned Members:", fr: "Banned Members:", pl: "Banned Members:", es:"Banned Members:", tr: "Banned Members:"},
		{ en: "Currently Unavailable", ru: "Currently Unavailable", cs: "Currently Unavailable", de: "Currently Unavailable", fr: "Currently Unavailable", pl: "Currently Unavailable", es:"Currently Unavailable", tr: "Currently Unavailable"},
		{ en: "Ban ended, but no login", ru: "Ban ended, but no login", cs: "Ban ended, but no login", de: "Ban ended, but no login", fr: "Ban ended, but no login", pl: "Ban ended, but no login", es:"Ban ended, but no login", tr: "Ban ended, but no login"},
		{ en: "Script Author:", ru: "Script Author:", cs: "Script Author:", de: "Script Author:", fr: "Script Author:", pl: "Script Author:", es:"Script Author:", tr: "Script Author:"},
		{ en: "Contributors (EN):", ru: "Contributors (RU):", cs: "Contributors (CZ):", de: "Contributors (DE):", fr: "Contributors (FR):", pl: "Contributors (PL):", es:"Contributors (ES):", tr: "Contributors (TR):"}
		// {en: "", ru: "", cs: "", de: "", fr: "", pl: "", es:"", tr: ""}
	];

	// region settings for external sites
	switch(wg.srv) {
		case ("eu"): // eu server
			sc.srv.wl = sc.srv.nm = sc.srv.vb = sc.srv.ws = sc.srv.cs = sc.srv.wlf = sc.srv.as = sc.srv.ct = sc.srv.kttc = sc.srv.aos = sc.srv.ch = sc.srv.wr = wg.srv;
			break;
		case ("ru"): // ru server
			sc.srv.wl = sc.srv.nm = sc.srv.vb = sc.srv.ws = sc.srv.cs = sc.srv.ct = sc.srv.kttc = sc.srv.wots = sc.srv.aos = sc.srv.ch = sc.srv.wr = wg.srv;
			break;
		case ("na"): // na server - american english
			sc.srv.wl = sc.srv.nm = sc.srv.vb = sc.srv.ws = sc.srv.cs = sc.srv.wlf = sc.srv.ct = sc.srv.kttc = sc.srv.aos = sc.srv.ch = wg.srv; sc.srv.wr = "com";
			break;
		case ("asia"): // asia server
			sc.srv.wl = sc.srv.nm = sc.srv.vb = sc.srv.ws = sc.srv.cs = "sea"; sc.srv.ct = sc.srv.kttc = sc.srv.aos = sc.srv.ch = wg.srv; sc.srv.wr = "com";
			break;
		case ("kr"): // korean server
			sc.srv.wl = sc.srv.nm = sc.srv.vb = sc.srv.ws = sc.srv.cs = sc.srv.ct = sc.srv.aos = sc.srv.ch = wg.srv; sc.srv.wr = "com";
			break;
		default: break;
	}

	// set script language to english if an unsupported language is detected
	if (sc.locSup.indexOf(sc.loc) == -1) {
		sc.loc = "en";
	}
	// process localization
	for (var _l=0, l_len = loc.length; _l<l_len; _l++) {
		loc[_l] = loc[_l][sc.loc];
	}

	// add language to body classname for language based styling
	d.body.classList.add("lang-"+sc.loc);

	// variables for dropbox, css and data uri
	var css = {
		u: {
			cIcons: "data:image/png;base64,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",
			arrow: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAMAAAB1GNVPAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAPUExURf///////////0xpcf///17pIXYAAAAEdFJOU393iAAiK7rGAAAAH0lEQVQI1w3GwQEAMBBEQBf6rzn7YeipxA0bXoU4LB8EgABGoTqNxwAAAABJRU5ErkJggg=="
		},
		i: {
			loader: "/clans/static/2.2.8/images/processing/loader.gif",
			arrow: "http://static-ptl-eu.gcdn.co/static/wot/common/css/scss/content/links/img/orange_arrow.png"
		}
	};

	// style contents
	var styleClan = [
		// script header rules
		"#common_menu .cm-menu__user > *:not(.cm-notifications):not(.js-cm-user-menu-dropdown) {display: inline-block}",
		".profile__main {margin: 0; padding: 0;}",
		// fix width for header with low resolution
		".search-form__place-header {width: 25%;}",
		".search-form__place-header.search-form__state-on {width: 410px;}",
		// loading text
		".processing_loader span {display: table; margin: 0 auto;}",
		// links menu rules
		".menu-clan_links {padding: 0;}",
		".menu-clan_links.cm-parent-link__opened {border: 1px solid #313335;}",
		".menu-clan_links .menu-top_link {cursor: pointer; padding: 0 8px 0 9px;}",
		".menu-clan_links .menu-top_link.cm-parent-link__opened {background: #0E0E0E; border-left: 1px solid #313335; border-right: 1px solid #313335; margin-left: -1px;}",
		".menu-clan_links .cm-arrow {background-image: url('"+css.u.arrow+"'); display: inline-block; margin-left: 5px; opacity: 0.5; vertical-align: middle; transition: opacity 0.2s ease 0s; height: 4px; width: 7px;}",
		".menu-clan_links .cm-parent-link__opened .cm-arrow {opacity: 1; transform: rotate(180deg);}",
		".menu-clan_links .clan-links {background: rgba(14, 14, 14, 0.99); border: 1px solid #313335; display: none; box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.4); margin-left: -1px; padding: 14px 16px;}",
		".menu-clan_links .cm-sublist__opened {display: block;}",
		".menu-clan_links .clan-links td {padding: 0 10px;}",
		".sl-icon {background: url('"+css.u.cIcons+"') no-repeat; display: inline-block; margin: -2px 8px 0px 0px; vertical-align: middle; height: 16px; width: 16px;}",
		".sl-wl {background-position: 0px 0px;}",
		".sl-nm {background-position: 0px -16px;}",
		".sl-ct {background-position: 0px -32px;}",
		".sl-cs {background-position: 0px -48px;}",
		".sl-kttc {background-position: 0px -64px;}",
		".sl-wlife {background-position: 0px -80px;}",
		".sl-as {background-position: 0px -96px;}",
		".sl-wr {background-position: 0px -112px;}",
		".sl-vb {background-position: 0px -128px;}",
		// rating profile rules
		".rating-profile {width: 70%; margin: 0px auto;}",
		// settings menu rules
		"#common_menu .menu-settings {text-align: left;}",
		"#common_menu .menu-settings .cm-user-menu-link {margin: 0;}",
		"#common_menu .menu-settings .cm-user-menu-link_cutted-text {max-width: unset;}",
		"#common_menu .menu-settings .cm-user-menu {padding: 15px; right: unset;}",
		"#common_menu .menu-settings .cm-parent-link:hover {cursor: pointer;}",
		"#common_menu .menu-settings .settingItem {margin: 6px 0px;}",
		"#common_menu .menu-settings label {display: table; line-height: normal; cursor: pointer;}",
		"#common_menu .menu-settings .l-box {display: none;}",
		"#common_menu .menu-settings .b-checkbox {height: 16px; width: 16px; float: left; margin-right: 5px;}",
		"#common_menu .menu-settings .b-checkbox span {height: 16px; width: 16px;}",
		"#common_menu .menu-settings .b-combobox-label__checked {color: #DCDCDC;}",
		"#common_menu .menu-settings .settingItem .b-combobox-label:hover {color: #DCDCDC;}",
		"#common_menu .menu-settings .settingItem .b-combobox-label:hover .b-checkbox {background-position: 0px -34px; box-shadow: 0px 0px 10px 1px rgba(191, 166, 35, 0.15), 0px 0px 3px 1px rgba(191, 166, 35, 0.25);}",
		"#common_menu .menu-settings .settingItem .b-combobox-label:hover .b-checkbox.b-checkbox__checked {background-position: 0px -68px;}",
		"#common_menu .menu-settings textarea.l-textarea {background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 2px; color: #FFFFFF; line-height: normal; padding: 5px; min-height: 50px; margin: 5px 0 5px 0; min-width: 175px;}",
		"#common_menu .menu-settings textarea::-webkit-input-placeholder {color: #FFFFFF;}",
		"#common_menu .menu-settings textarea::-moz-placeholder {color: #FFFFFF;}",
		"#common_menu .menu-settings .b-settingParent {line-height: 26px;}",
		"#common_menu .menu-settings .b-settingParent a {cursor: pointer; color: #B1B2B3; text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);}",
		"#common_menu .menu-settings .b-settingParent a:hover {color: #FFFFFF; text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75);}",
		"#common_menu .menu-settings .b-settingParent.b-wnRefresh, #common_menu .menu-settings .b-settingParent.b-cleanStorage {text-align: center;}",
		"#common_menu .menu-settings .settingCredits {margin: 2px 0px; text-align: center;}",
		"#common_menu .menu-settings .settingCredits.settingSepertor {border-top: 1px dashed #212123; margin-top: 6px; padding-top: 12px;}",
		"#common_menu .menu-settings .settingCredits p {font-size: 12px;}",
		"#common_menu .menu-settings .settingCredits .b-orange-arrow {background: url('"+css.i.arrow+"') 100% 0 no-repeat; color: #F25322; line-height: 14px; padding-right: 9px;}",
		"#common_menu .menu-settings .settingCredits .b-orange-arrow:hover {color: #FF7432;}",
		// memberpage rules
		".page-header {padding: 30px 0 30px 75px}",
		".page-header_meminfo {display: table; margin: 0px auto; position: absolute; top: 3px; right: 0px; left: 0px; text-align: center;}",
		".page-header_meminfo span {margin: 0 5px;}",
		".page-header_ban {color: #E5B12E;}",
		".page-header_mem {color: #E5B12E;}",
		".js-page-header-view .page-header_mem {margin-left: 25px;}",
		// button fetch rules
		".b-button-stats {border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 2px; position: absolute; right: 0; top: 9px;}",
		".b-button-stats a {background: rgba(255, 255, 255, 0.1); color: #FFFFFF; cursor: pointer; font-size: 17px; line-height: 45px; display: block; padding: 0px 15px; transition: all 0.2s ease 0s;}",
		".b-button-stats a:hover {background: rgba(229, 177, 46, 0.25);}",
		// rating players rules
		".rating-players {height: 200px;}",
		".rating-players tbody {width: 95%; display: table; margin: 0px auto;}",
		".rating-players_item__data {padding-top: 25px; width: 14%;}",
		".rating-players_item__average {padding-top: 10px; width: 16%;}",
		".rating-players_stats {font-size: 40px;}",
		// membertable rules
		".js-expander-link-view {display: table; position: absolute; top: 333px;}",
		"#js-playerslist-table {margin-top: 7px;}",
		".tbl-rating_th__wn a {cursor: pointer;}",
		".player_time {position: absolute; right: 0; top: 18px;}"
	];
	style.textContent = styleClan.join("");
	// end style

	// add animated loading icon for progress indication
	var layoutHolder = d.getElementsByClassName('layout_holder')[0],
	loadGif = sf.elem("div", "processing js-hidden", "<div class='processing_loader'><img src='"+css.i.loader+"' alt='Processing...'><span id='js-wn8-status'></span></div>");
	layoutHolder.appendChild(loadGif);

	// script link and settings
	var clanSet_div = sf.elem("div", "menu-settings menu-top_item", "<a class='cm-user-menu-link' href='#' onClick='return false;'><span class='cm-user-menu-link_cutted-text'>"+loc[3]+"</span><span class='cm-arrow'></span></span>"),
	clanSet_list = sf.elem("ul", "cm-user-menu", ""),
	enableOnPageload = sf.storage("statScript_onPageload", "", "get", "parse"),
	enableWhitelist = sf.storage("statScript_whitelist", "", "get", "parse"),
	enableWhiteList_list = sf.storage("statScript_whitelist_list", "", "get"),
	whiteListArray = (enableWhiteList_list) ? enableWhiteList_list.split(",") : "",
	clanSet_list_items = [
		sf.settings("onPageload", loc[4], enableOnPageload, false),
		sf.settings("whitelist", loc[5], enableWhitelist, false, enableWhiteList_list),
		sf.settings("wnRefresh", loc[6]+" [v"+wn.vers[1]+"]"),
		sf.settings("cleanStorage", loc[7]),
		sf.elem("li", "b-settingItem settingCredits settingSepertor", "<p>"+loc[19]+" <a class='b-orange-arrow' href='"+sc.user.wot+"'>Orrie</a></p><p>"+((sc.cred[sc.loc]) ? loc[20]+" "+sc.cred[sc.loc] : "")+"</p>"),
		sf.elem("li", "b-settingItem settingCredits", "<p>Version "+sc.vers+"</p>"),
		sf.elem("li", "b-settingItem settingCredits", "<p><a class='b-orange-arrow' href='"+sc.host+"'>Greasy Fork</a></p>"),
		sf.elem("li", "b-settingItem settingCredits", "<p><a class='b-orange-arrow' href='"+((wg.srv == "na") ? sc.top.na : sc.top.eu)+"'>Support Thread</a></p>")
	];
	sf.links(clanSet_list, clanSet_list_items);
	clanSet_div.firstElementChild.addEventListener('click', function() {this.classList.toggle('cm-user-menu-link__opened'); this.nextSibling.classList.toggle('cm-user-menu__opened');}, false);
	clanSet_div.appendChild(clanSet_list);
	// add script info and settings if user menu exists, else wait
	var navMenu = d.getElementById('common_menu'),
	navUser = navMenu.getElementsByClassName('cm-menu__user')[0];
	if (navUser) {
		navUser.insertBefore(clanSet_div, navUser.firstChild);
	}
	else {
		var setLook = new MutationObserver(function() {
			navUser = navMenu.getElementsByClassName('cm-menu__user')[0];
			navUser.insertBefore(clanSet_div, navUser.firstChild);
			setLook.disconnect();
		});
		setLook.observe(navMenu, {childList: true});
	}

	// clan statistic links
	var menu_class = d.getElementsByClassName('menu-top')[0],
	clanMenu_div = sf.elem("div", "menu-clan_links menu-top_item", "<span class='menu-top_link'>"+loc[1]+"<span class='cm-arrow'></span></span>"),
	clanMenu_list = sf.elem("ul", "clan-links cm-sublist", ""),
	clanMenu_list_items = [
		[sc.srv.wl, "<a target='_blank' href='http://wotlabs.net/"+sc.srv.wl+"/clan/"+wg.clan.name+"'><span class='sl-icon sl-wl'></span>WoTLabs</a>"],
		[sc.srv.nm, "<a target='_blank' href='http://noobmeter.com/clan/"+sc.srv.nm+"/"+wg.clan.name+"/"+wg.clan.id+"'><span class='sl-icon sl-nm'></span>Noobmeter</a>"],
		[sc.srv.vb, "<a target='_blank' href='http://vbaddict.net/clan/worldoftanks."+sc.srv.vb+"/"+wg.clan.id+"/clan-"+wg.clan.name.toLowerCase()+"'><span class='sl-icon sl-vb'></span>vBAddict</a>"],
		[sc.srv.ct, "<a target='_blank' href='http://clantools.us/servers/"+sc.srv.ct+"/clans?id="+wg.clan.id+"'><span class='sl-icon sl-ct'></span>Clan Tools</a>"],
		[sc.srv.cs, "<a target='_blank' href='http://wotcs.com/clan.php?wid="+wg.clan.id+"'><span class='sl-icon sl-cs'></span>WoT-CS</a>"],
		[sc.srv.kttc, "<a target='_blank' href='http://"+((wg.srv=="ru") ? "" : sc.srv.kttc+".")+"kttc.ru/clan/"+wg.clan.id+"/'><span class='sl-icon sl-kttc'></span>KTTC</a>"],
		[sc.srv.wlf, "<a target='_blank' href='http://en.wot-life.com/"+sc.srv.wlf+"/clan/"+wg.clan.name+"-"+wg.clan.id+"/'><span class='sl-icon sl-wlife'></span>WoT-Life</a>"],
		[sc.srv.as, "<a target='_blank' href='http://stats.teamaway.net/clan/"+wg.clan.id+"/'><span class='sl-icon sl-as'></span>AWAY Stats</a>"],
		[sc.srv.wr, "<a target='_blank' href='http://wotreplays."+sc.srv.wr+"/clan/"+wg.clan.name+"'><span class='sl-icon sl-wr'></span>WoTReplays</a>"]
	];
	sf.links(clanMenu_list, clanMenu_list_items);
	clanMenu_div.firstElementChild.addEventListener('click', function() {this.classList.toggle('cm-parent-link__opened'); this.nextSibling.classList.toggle('cm-sublist__opened');}, false);
	clanMenu_div.appendChild(clanMenu_list);
	menu_class.appendChild(clanMenu_div);

	// add clan total stats if they exist
	if (wg.p && s.clan) {
		var clanProfileValue = d.getElementsByClassName('rating-profile_item');
		if (s.clan.win) {
			clanProfileValue[1].innerHTML = "<i class='rating-profile_icon i i__rating-common i__wot-victories'></i><span class='rating-profile_value rating-players_stats js-format-number'>"+sf.color(s.clan.win,"wr",2,"%")+"</span><span class='rating-profile_key'>"+loc[8]+"</span>";
		}
		if (s.clan.wn8) {
			clanProfileValue[3].innerHTML = "<i class='rating-profile_icon i i__rating-common i__wot-experience'></i><span class='rating-profile_value rating-players_stats js-format-number'>"+sf.color(s.clan.wn8,"wn8",0)+"</span><span class='rating-profile_key'>"+loc[9]+"</span>";
		}
	}

	// check if on memberlist page
	if (wg.m) {
		// formula calculations and variables
		var memObj = {
			cls: d.getElementsByClassName('tbl-rating_body')[0],
			ids: [],
			bans: {ids:[],f:false}
		};

		// add manual stat fetching button
		var filter_class = d.getElementsByClassName('filter')[0],
		refreshBtn_div = sf.elem("div", "b-button-stats", "<a>"+loc[11]+"</a>");
		refreshBtn_div.addEventListener('click', function() {sf.tableFetch();}, false);
		filter_class.appendChild(refreshBtn_div);

		// prepare stat fetcher, store stats in localStorage and reload page
		var ratLook = new MutationObserver(function() {
			sf.tableFetch();
			ratLook.disconnect();
		});

		// fetch stats automatically if enabled or check whitelist for whitelisted clan
		if (statFetch && (enableOnPageload || (enableWhitelist && whiteListArray.indexOf(wg.clan.id) > -1))) {
			ratLook.observe(memObj.cls, {childList: true});
		}
		else {
			// no stats fetching, check if stats already exist and add if they do
			var clanPlayersValue = d.getElementsByClassName('rating-players')[0].rows[0],
			pageHeader = d.getElementsByClassName('page-header')[0],
			ratHeadStatus = false;
			// add clan total stats if they exist
			clanPlayersValue.cells[1].getElementsByClassName('rating-players_key')[0].textContent = loc[8];
			if (s.clan) {
				if (s.clan.win) {
					var clanWinCell = clanPlayersValue.insertCell(2);
					clanWinCell.className = "rating-players_item rating-players_item__data";
					clanWinCell.innerHTML = "<i class='rating-players_icon i i__rating-common i__wot-victories'></i><span class='rating-players_value rating-players_stats'>"+sf.color(s.clan.win,"wr",2,"%")+"</span><span class='rating-players_key'>"+loc[10]+" "+loc[8]+"</span>";
				}
				if (s.clan.wn8) {
					var clanWn8Cell = clanPlayersValue.insertCell(4);
					clanWn8Cell.className = "rating-players_item rating-players_item__data";
					clanWn8Cell.innerHTML = "<i class='rating-players_icon i i__rating-common i__wot-experience'></i><span class='rating-players_value rating-players_stats'>"+sf.color(s.clan.wn8,"wn8",0)+"</span><span class='rating-players_key'>"+loc[10]+" "+loc[9]+"</span>";
				}
			}
			// add container for member counters
			var memInfo_div = sf.elem("div", "page-header_meminfo", "");
			pageHeader.appendChild(memInfo_div);
			// wait for table to be filled before adding wn8
			var ratInsert = new MutationObserver(function(muto) {
				if (muto[0].previousSibling === null) {
					var newMem = 0, banMem = d.getElementsByClassName('tbl-rating_tr__state-banned').length;
					// add a counter for amount of banned people in clan
					if (banMem > 0) {
						var banMem_span = d.getElementsByClassName('page-header_ban')[0];
						if (!banMem_span) {
							banMem_span = sf.elem("span", "page-header_ban", loc[16]+" "+banMem);
							memInfo_div.appendChild(banMem_span);
						}
						else {
							banMem_span.textContent = loc[16]+" "+banMem;
						}
					}
					// table header for wn8
					if (ratHeadStatus === false && Object.keys(s.clan).length !== 0) {
						var headName = d.getElementsByClassName('tbl-rating_th__name')[0],
						wnHead = sf.elem("td", "tbl-rating_th tbl-rating_th__wn", "<a class='sorter sorter__game-wot js-table-sorter js-sort-wn'><i class='sorter_icon sorter_icon__media i i__table-params i__wot-aeb'></i><span class='sorter_key'>WN8</span><span class='sorter_arrow'></span></a>"),
						colGroup = d.getElementsByTagName('colgroup')[0],
						newCol = sf.elem("col");
						newCol.width = "1px";
						headName.parentNode.insertBefore(wnHead, headName.nextSibling);
						colGroup.insertBefore(newCol, colGroup.children[5]);
						ratHeadStatus = true;
					}
					// add wn8 for each member and colorize stats
					var userCheck = Object.keys(s.user).length !== 0;
					for (var _rt=0, _rt_len = memObj.cls.rows.length; _rt<_rt_len; _rt++) {
						var row = memObj.cls.rows[_rt];
						if (!row.classList.contains("tbl-rating_tr__card")) {
							var id = row.getAttribute('data-account_id'),
							memName = row.getElementsByClassName('tbl-rating_td__name')[0],
							memWGR = row.getElementsByClassName('tbl-rating_td__value')[0],
							memWins = row.getElementsByClassName('tbl-rating_td__value')[2];
							if (userCheck) {
								var wnRow = sf.elem("td", "tbl-rating_td tbl-rating_td__value js-format-number", "");
								memName.parentNode.insertBefore(wnRow, memName.nextSibling);
								if (s.user[id]) {
									wnRow.innerHTML = sf.color(s.user[id].wn8,"wn8",0);
								}
								else {
									wnRow.innerHTML = loc[14];
									newMem ++;
								}
							}
							if (memWGR.innerHTML !== "0" && memWGR.innerHTML !== "—") {
								memWGR.innerHTML = sf.color(sf.format(memWGR.innerHTML,1),"wgr",0);
							}
							if (memWins.innerHTML !== "0.00%" && memWins.innerHTML !== "—") {
								memWins.innerHTML = sf.color(sf.format(memWins.innerHTML.replace(/[,]/g,"."),3),"wr",2,"%");
							}
						}
					}
					// add a counter for new people in the clan, compared to store stats
					if (newMem > 0) {
						var newMem_span = d.getElementsByClassName('page-header_mem')[0];
						if (!newMem_span) {
							newMem_span = sf.elem("span", "page-header_mem", loc[15]+" "+newMem);
							memInfo_div.appendChild(newMem_span);
						}
						else {
							newMem_span.textContent = loc[15]+" "+newMem;
						}
					}
					// check for length on bans
					if (memObj.bans.f) {
						sf.apiBanHnd();
					}
					else {
						memObj.bans.cls = d.getElementsByClassName('js-banned');
						for (var _bm=0, _bm_len = memObj.bans.cls.length; _bm<_bm_len; _bm++) {
							var bannedId = memObj.bans.cls[_bm].dataset.account_id;
							memObj.bans.ids.push(bannedId);
						}
						if (memObj.bans.ids.length > 0) {
							sc.api.b = sc.api.i+memObj.bans.ids.join(',')+"&fields=ban_time";
							sf.request(sc.api.b , sf.apiBanHnd);
						}
					}
				}
			});
			ratInsert.observe(memObj.cls, {childList: true});
		}
	}
}(window));