// ==UserScript==
// @name WoWsStatInfo
// @author Vov_chiK
// @description Расширенная статистика и функционал на сайте World of Warships.
// @copyright 2015+, Vov_chiK
// @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
// @namespace http://forum.walkure.pro/
// @version 0.6.9.37
// @creator Vov_chiK
// @include https://worldofwarships.ru/ru/community/accounts/*
// @include https://forum.worldofwarships.ru/topic/*
// @include https://forum.worldofwarships.ru/profile/*
// @include https://worldofwarships.eu/*/community/accounts/*
// @include http://forum.worldofwarships.eu/index.php?/topic/*
// @include http://forum.worldofwarships.eu/index.php?/user/*
// @include https://forum.worldofwarships.eu/topic/*
// @include https://forum.worldofwarships.eu/profile/*
// @include https://worldofwarships.com/*/community/accounts/*
// @include https://forum.worldofwarships.com/topic/*
// @include https://forum.worldofwarships.com/profile/*
// @include https://worldofwarships.asia/*/community/accounts/*
// @include https://forum.worldofwarships.asia/topic/*
// @include https://forum.worldofwarships.asia/profile/*
// @match https://worldofwarships.ru/ru/community/accounts/*
// @match https://forum.worldofwarships.ru/topic/*
// @match https://forum.worldofwarships.ru/profile/*
// @match https://worldofwarships.eu/*/community/accounts/*
// @match http://forum.worldofwarships.eu/index.php?/topic/*
// @match http://forum.worldofwarships.eu/index.php?/user/*
// @match https://forum.worldofwarships.eu/topic/*
// @match https://forum.worldofwarships.eu/profile/*
// @match https://worldofwarships.com/*/community/accounts/*
// @match https://forum.worldofwarships.com/topic/*
// @match https://forum.worldofwarships.com/profile/*
// @match https://worldofwarships.asia/*/community/accounts/*
// @match https://forum.worldofwarships.asia/topic/*
// @match https://forum.worldofwarships.asia/profile/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function(window){
/* ===== Main function ===== */
function WoWsStatInfo(){
var VersionWoWsStatInfo = '0.6.9.37';
var WoWsStatInfoLinkLoc = [];
WoWsStatInfoLinkLoc['ru'] = 'https://forum.worldofwarships.ru/topic/19158-WoWsStatInfo';
WoWsStatInfoLinkLoc['asia'] = 'https://forum.worldofwarships.asia/topic/8950-WoWsStatInfo';
WoWsStatInfoLinkLoc['na'] = 'https://forum.worldofwarships.com/topic/47436-WoWsStatInfo';
WoWsStatInfoLinkLoc['eu'] = 'https://forum.worldofwarships.eu/topic/14650-WoWsStatInfo';
var WoWsStatInfoLinkNameLoc = [];
WoWsStatInfoLinkNameLoc['ru'] = '[ALL] [WoWsStatInfo] Расширенная статистика на оф. сайте.';
WoWsStatInfoLinkNameLoc['asia'] = '[ALL] [WoWsStatInfo] Extended stat-info for official WoWS profile.';
WoWsStatInfoLinkNameLoc['na'] = '[ALL] [WoWsStatInfo] Extended stat-info for official WoWS profile.';
WoWsStatInfoLinkNameLoc['eu'] = '[ALL] [WoWsStatInfo] Extended stat-info for official WoWS profile.';
var lang = getCookie('hllang');
var host_split = window.location.host.split('.');
var realm = host_split[host_split.length - 1]; if(realm == 'com'){realm = 'na';}
var realm_host = realm; if(realm == 'na'){realm_host = 'com';}
if(lang == null){
if(realm == 'ru'){
lang = 'ru';
}else{
lang = 'en';
}
}
if(window.location.host.indexOf("cm-ru.wargaming.net") > -1){return;}
var localizationText = getlocalizationText(lang);
var application_id = getApplicationId();
var WoWsStatInfoLink = WoWsStatInfoLinkLoc[realm];
var WoWsStatInfoLinkName = WoWsStatInfoLinkNameLoc[realm];
var WOWSAPI = 'https://api.worldofwarships.'+realm_host+'/wows/';
var WoWsStatInfoHref = 'https://vzhabin.ru/US_WoWsStatInfo/';
var Process = 0;
var MaxProcess = 3;
var MembersArray = [];
var StatPvPMemberArray = [];
var page = 1;
var page_total = 0;
var Encyclopedia = null;
var Glossary = null;
var typeStat = ["pvp", "pve", "pvp_solo", "pvp_div", "pvp_div2", "pvp_div3"];
var typeShip = ["Battleship", "AirCarrier", "Cruiser", "Destroyer"];
var color = new Array();
color['very_bad'] = '#FE0E00'; // очень плохо, хуже чем у 85%
color['bad'] = '#FE7903'; // плохо, хуже чем у 50%
color['normal'] = '#F8F400'; // средне, лучше чем у 50%
color['good'] = '#60FF00'; // хорошо, лучше чем у 75%
color['very_good'] = '#02C9B3'; // очень хорошо, лучше чем у 95%
color['unique'] = '#D042F3'; // уникально, лучше чем у 99%
var colorStat = null;
var ExpShips = null;
/* ===== Style and Script UserScript ===== */
{
var StyleWoWsStatInfo = '' +
'div.div-link-block{font-size:13px; color: #fff; text-align: right; padding-top: 10px; padding-bottom: 10px;}' +
'span.link-block:hover{border-bottom: 1px dotted #fff; cursor: pointer;}' +
'span.link-block div.icon-link-block{background: url("//'+realm+'.wargaming.net/clans/static/0.1.0.1/images/table-sorter/table-sorter_arrow_sprite.png") no-repeat 0 0; width: 10px; height: 10px; margin: -15px 100%;}' +
'span.hide-block div.icon-link-block{background-position: 100% -26px;}' +
'span.show-block div.icon-link-block{background-position: 100% -16px;}' +
'div#userscript-block{border-radius: 2px; background-color: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.1); padding: 10px; margin: 10px 0; line-height: 20px;}' +
'div.hide-block{display: none;}' +
'div.wowsstatinfo-stat{text-align: center; margin-top: 10px; color: white; font-size: 16px;}' +
'span.name-stat{color: #ffcc33;}' +
'table.account-table td{white-space: nowrap;}' +
'li.account-tab div._title{padding: 0 10px;}' +
'div.chart_div{text-align: center; float: left; margin-right: 40px;}' +
'.userscript-placeholder {box-sizing: border-box;width: 550px;height: 330px;padding: 5px 15px 15px 40px;margin: 15px auto 30px auto;border: 1px solid #ddd;background: #fff;background: linear-gradient(#f6f6f6 0, #fff 50px);background: -o-linear-gradient(#f6f6f6 0, #fff 50px);background: -ms-linear-gradient(#f6f6f6 0, #fff 50px);background: -moz-linear-gradient(#f6f6f6 0, #fff 50px);background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px);box-shadow: 0 3px 10px rgba(0,0,0,0.15);-o-box-shadow: 0 3px 10px rgba(0,0,0,0.1);-ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1);-moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1);-webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1);}' +
'.chart-placeholder {width: 500px;height: 300px;font-size: 14px;line-height: 1.2em;}' +
'.legend table {border-spacing: 5px;}' +
'.flot-y-axis {margin-left: -40px; margin-top: -12px;}' +
'.flot-x-axis {margin-left: -15px;}' +
'';
var StyleWoWsStatInfoAdd = document.createElement("style");
StyleWoWsStatInfoAdd.textContent = StyleWoWsStatInfo.toString();
document.head.appendChild(StyleWoWsStatInfoAdd);
}
/* ===== Message UserScript ===== */
if(window.location.host != 'forum.worldofwarships.'+realm_host){
var message = document.createElement("div");
message.setAttribute("id", "message-wowsstatinfo");
message.setAttribute("class", "wsi-ui-dialog wsi-ui-widget wsi-ui-widget-content wsi-ui-corner-all wsi-ui-front");
message.setAttribute("style", "display: none; z-index:9999; left: 50%; margin-left: 0px; top: 0px;");
message.innerHTML = '' +
'<style>' +
'.wsi-ui-dialog{box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12), 0 0 25px 25px rgba(0, 0, 0, 0.3);background-color: rgba(41, 41, 41, 0.8);position: absolute;top: 0;left: 0;outline: 0;padding: 23px 31px 28px;}' +
'.wsi-ui-widget-content{color: #b1b2b3;}' +
'.wsi-ui-widget{font-family: Arial, "Helvetica CY", Helvetica, sans-serif;font-size: 15px;}' +
'.wsi-ui-corner-all{border-bottom-right-radius: 2px;border-bottom-left-radius: 2px;border-top-right-radius: 2px;border-top-left-radius: 2px;}' +
'.wsi-ui-front{z-index: 250;}' +
'.wsi-ui-dialog:before{background: url("http://ru.wargaming.net/clans/static/1.4.4/images/plugins/jquery-ui/dialog_gradient.png") repeat-x;height: 162px;width: 100%;position: absolute;top: 0;left: 0;z-index: 5;}' +
'.wsi-ui-dialog .wsi-ui-dialog-titlebar{border-bottom: 1px solid rgba(0, 0, 0, 0.7);box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05);padding: 0 0 14px;position: relative;z-index: 10;}' +
'.wsi-ui-widget-header{color: #fff;font-family: "WarHeliosCondC", Arial Narrow, Tahoma, arial, sans-serif;font-size: 25px;font-weight: normal;line-height: 30px;}' +
'.wsi-ui-helper-clearfix{min-height: 0;support: IE7;}' +
'.wsi-ui-widget-content{color: #b1b2b3;}' +
'.wsi-ui-widget{font-family: Arial, "Helvetica CY", Helvetica, sans-serif;font-size: 15px;}' +
'.wsi-ui-helper-clearfix:before, .wsi-ui-helper-clearfix:after{content: "";display: table;border-collapse: collapse;}' +
'.wsi-ui-helper-clearfix:after{clear: both;}' +
'.wsi-ui-helper-clearfix:before, .wsi-ui-helper-clearfix:after{content: "";display: table;border-collapse: collapse;}' +
'.wsi-ui-dialog .wsi-ui-dialog-title{float: left;margin: 0;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}' +
'.wsi-ui-dialog .wsi-ui-dialog-titlebar-close{margin: -16px -3px 0;height: 20px;width: 20px;position: absolute;top: 50%;right: 0;}' +
'.wsi-ui-widget .wsi-ui-widget{font-size: 1em;}' +
'wsi-button.wsi-ui-wsi-button-icon-only {width: 16px;}' +
'.wsi-ui-state-default{border: 1px solid transparent;color: #b1b2b3;display: inline-block;font-size: 13px;line-height: 30px;padding: 0 5px;height: 30px;width: 20px;}' +
'.wsi-ui-wsi-button{background: none;border: 0;display: inline-block;position: relative;padding: 0;line-height: normal;cursor: pointer;vertical-align: middle;text-align: center;overflow: visible;}' +
'.wsi-ui-wsi-button-icon-only .wsi-ui-icon{left: 50%;margin-left: -8px;}' +
'.wsi-ui-wsi-button-icon-only .wsi-ui-icon, .wsi-ui-wsi-button-text-icon-primary .wsi-ui-icon, .wsi-ui-wsi-button-text-icon-secondary .wsi-ui-icon, .wsi-ui-wsi-button-text-icons .wsi-ui-icon, .wsi-ui-wsi-button-icons-only .wsi-ui-icon{position: absolute;top: 50%;margin-top: -8px;}' +
'.wsi-ui-icon-closethick{background: url("https://ru.wargaming.net/clans/static/1.4.4/images/plugins/jquery-ui/dialog_close.png");}' +
'.wsi-ui-icon{width: 16px;height: 16px;}' +
'.wsi-ui-icon{display: block;text-indent: -99999px;overflow: hidden;background-repeat: no-repeat;}' +
'.wsi-ui-state-default{border: 1px solid transparent;color: #b1b2b3;display: inline-block;font-size: 13px;line-height: 30px;padding: 0 5px;height: 30px;width: 20px;}' +
'.wsi-ui-wsi-button-icon-only .wsi-ui-wsi-button-text, .wsi-ui-wsi-button-icons-only .wsi-ui-wsi-button-text{padding: .4em;text-indent: -9999999px;}' +
'.wsi-ui-wsi-button .wsi-ui-wsi-button-text{display: block;line-height: normal;}' +
'.wsi-ui-dialog .wsi-ui-dialog-content{position: relative;border: 0;padding: 0;background: none;z-index: 10;}' +
'.wsi-ui-widget-content{color: #b1b2b3;}' +
'.wsi-popup{margin: 10px auto 0;font-size: 15px;transition: height .3s;}' +
'.wsi-popup_footer{margin-top: 20px;position: relative;}' +
'.wsi-button__align-middle{vertical-align: middle;}' +
'.wsi-button{-webkit-appearance: none;-moz-appearance: none;background: #735917;border-radius: 2px;border: none;box-shadow: 0 0 10px rgba(0, 0, 0, 0.3), 1px 0 2px rgba(0, 0, 0, 0.3);display: inline-block;padding: 0 0 2px;overflow: hidden;color: #000;font-family: Arial, "Helvetica CY", Helvetica, sans-serif;font-size: 17px;font-weight: normal;text-decoration: none;cursor: pointer;vertical-align: top;}' +
'.wsi-button_wrapper{background: #dbae30;background: linear-gradient(to bottom, #fff544 0%, #dbae30 100%);border-radius: 2px;display: block;padding: 1px 1px 0;position: relative;}' +
'.wsi-button_body{background: #e5ad2c;background: linear-gradient(to bottom, #e7b530 0%, #e5ad2c 100%);display: block;border-radius: 2px;padding: 10px 23px 11px;position: relative;text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);transition: all .2s;}' +
'.wsi-button_inner{display: block;position: relative;z-index: 10;white-space: nowrap;line-height: 20px;}' +
'.wsi-link__cancel{display: inline-block;font-size: 15px;margin-left: 18px;padding-top: 10px;}' +
'.wsi-link{border-bottom: 1px solid transparent;padding-bottom: 1px;color: #e5b12e;line-height: 18px;text-decoration: none;transition: all .2s;}' +
'</style>' +
'<div class="wsi-ui-dialog-titlebar wsi-ui-widget-header wsi-ui-corner-all wsi-ui-helper-clearfix">' +
'<span class="wsi-ui-dialog-title">{%TITLE%}</span>' +
'<wsi-button id="userscript-message-close" class="wsi-ui-wsi-button wsi-ui-widget wsi-ui-state-default wsi-ui-corner-all wsi-ui-wsi-button-icon-only wsi-ui-dialog-titlebar-close" title="Close">' +
'<span class="wsi-ui-wsi-button-icon-primary wsi-ui-icon wsi-ui-icon-closethick"></span>' +
'<span class="wsi-ui-wsi-button-text">Close</span>' +
'</wsi-button>' +
'</div>' +
'<div class="wsi-ui-dialog-content wsi-ui-widget-content" style="width: auto; min-height: 44px; max-height: none; height: auto;">' +
'<div class="wsi-popup">{%TEXT%}</div>' +
'<div class="wsi-popup_footer">' +
'<wsi-button id="userscript-message-ok" class="wsi-button wsi-button__align-middle">' +
'<span class="wsi-button_wrapper">' +
'<span class="wsi-button_body">' +
'<span class="wsi-button_inner">'+localizationText['Ok']+'</span>' +
'</span>' +
'</span>' +
'</wsi-button>' +
'<a id="userscript-message-cancel" class="wsi-link wsi-link__cancel" style="display: block; cursor: pointer;" >'+localizationText['Cancel']+'</a>' +
'</div>' +
'</div>' +
'';
document.body.appendChild(message);
var messagebg = document.createElement("div");
messagebg.setAttribute("id", "userscript-message-bg");
messagebg.setAttribute("style", "display: none; z-index:9998; background: url('//"+realm+".wargaming.net/clans/static/0.1.0.1/images/plugins/jquery-ui/widget_overlay-pattern.png'); position: fixed; top: 0; left: 0; width: 100%; height: 100%;");
document.body.appendChild(messagebg);
}
getBrowser();
function getBrowser(){
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browserName = navigator.appName;
var fullVersion = ''+parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion, 10);
var nameOffset, verOffset, ix;
// In Opera 15+, the true version is after "OPR/"
if((verOffset = nAgt.indexOf("OPR/")) != -1){
browserName = "Opera";
fullVersion = nAgt.substring(verOffset + 4);
}
// In older Opera, the true version is after "Opera" or after "Version"
else if((verOffset = nAgt.indexOf("Opera")) != -1){
browserName = "Opera";
fullVersion = nAgt.substring(verOffset + 6);
if((verOffset = nAgt.indexOf("Version")) != -1)
fullVersion = nAgt.substring(verOffset + 8);
}
// In MSIE, the true version is after "MSIE" in userAgent
else if((verOffset = nAgt.indexOf("MSIE")) != -1){
browserName = "Microsoft Internet Explorer";
fullVersion = nAgt.substring(verOffset + 5);
}
// In Chrome, the true version is after "Chrome"
else if((verOffset = nAgt.indexOf("Chrome")) != -1) {
browserName = "Chrome";
fullVersion = nAgt.substring(verOffset + 7);
}
// In Safari, the true version is after "Safari" or after "Version"
else if((verOffset = nAgt.indexOf("Safari")) != -1){
browserName = "Safari";
fullVersion = nAgt.substring(verOffset + 7);
if((verOffset = nAgt.indexOf("Version")) != -1)
fullVersion = nAgt.substring(verOffset + 8);
}
// In Firefox, the true version is after "Firefox"
else if((verOffset = nAgt.indexOf("Firefox")) != -1){
browserName = "Firefox";
fullVersion = nAgt.substring(verOffset + 8);
}
// In most other browsers, "name/version" is at the end of userAgent
else if((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))){
browserName = nAgt.substring(nameOffset, verOffset);
fullVersion = nAgt.substring(verOffset + 1);
if(browserName.toLowerCase() == browserName.toUpperCase()){
browserName = navigator.appName;
}
}
// trim the fullVersion string at semicolon/space if present
if((ix = fullVersion.indexOf(";")) != -1)
fullVersion = fullVersion.substring(0, ix);
if((ix = fullVersion.indexOf(" ")) != -1)
fullVersion = fullVersion.substring(0, ix);
majorVersion = parseInt(''+fullVersion, 10);
if(isNaN(majorVersion)){
fullVersion = ''+parseFloat(navigator.appVersion);
majorVersion = parseInt(navigator.appVersion, 10);
}
var url = window.location.href;
console.log(''
+'----------------------- WoWsStatInfo '+VersionWoWsStatInfo+' -----------------------\n'
+'| Lang = '+lang+'\n'
+'| URL = '+url+'\n'
+'| Browser name = '+browserName+'\n'
+'| Full version = '+fullVersion+'\n'
+'| Major version = '+majorVersion+'\n'
+'| navigator.appName = '+navigator.appName+'\n'
+'| navigator.userAgent = '+navigator.userAgent+'\n'
+'---------------------------------------------------------------------\n'
);
var navigatorInfo = [];
navigatorInfo['browserName'] = browserName;
navigatorInfo['fullVersion'] = fullVersion;
navigatorInfo['majorVersion'] = majorVersion;
navigatorInfo['appName'] = navigator.appName;
navigatorInfo['userAgent'] = navigator.userAgent;
return navigatorInfo;
}
/* ===== Check load page ===== */
if(window.location.href.indexOf("accounts") > -1 && window.location.href.split('/').length >= 8 && window.location.href.split('/')[6].match(/[0-9]+/) != null){
checkJson();
lang = window.location.href.split('/')[3].match(/[a-z\s-]+/); if(lang == 'zh-tw'){lang = 'zh-tw';}
localizationText = getlocalizationText(lang);
getJson(WoWsStatInfoHref+'version.php?random='+Math.floor(Math.random()*100000001), doneLastVersion, errorLastVersion);
var account_id = window.location.href.split('/')[6].match(/[0-9]+/);
MemberProfilePage();
}else if(window.location.host == 'forum.worldofwarships.'+realm_host &&
(window.location.href.indexOf("/user/") > -1 || window.location.href.indexOf("/profile/") > -1)){ /* Скоректировать после обновления EU форума */
ForumUserPage();
}else if(window.location.host == 'forum.worldofwarships.'+realm_host && window.location.href.indexOf("/topic/") > -1){
ForumTopicPage();
}
function doneLastVersion(url, response){
var data = response;
if(VersionWoWsStatInfo != data['version']){
onShowMessage(
localizationText['Box'],
localizationText['NewVersion']+' WoWsStatInfo '+data['version']+'<br />'+localizationText['NewUpdate']+'.' +
'<br /><br />' +
localizationText['userscript-topic']+'<br />'+
'<a target="_blank" href="'+WoWsStatInfoLink+'">' +
WoWsStatInfoLinkName +
'</a>',
onCloseMessage,
localizationText['Ok'],
false
);
}
}
function errorLastVersion(url){}
/* ===== Pages function ===== */
function MemberProfilePage(){
if(colorStat == null || ExpShips == null){
console.log('colorStat == null || ExpShips == null');
setTimeout(function(){MemberProfilePage();}, 1000);
return;
}
var account_profile = document.getElementsByClassName('account-profile')[0];
if(account_profile === undefined){return;}
MembersArray[0] = [];
var _nick = document.getElementsByClassName('_nick')[0];
nickname = _nick.textContent;
var account_href = window.location.href.split('/')[6].split('-');
var account_id = account_href[0];
var row = document.getElementsByClassName('row')[2];
var div = document.createElement('div');
div.setAttribute('id', 'userscript-block-list');
div.setAttribute('style', 'padding: 0px 15px 20px 130px;');
div.innerHTML = '' +
'<div id="userscript-forum-link">' +
'<a target="_blank" href="https://forum.worldofwarships.'+realm_host+'/index.php?/user/'+account_id+'-'+nickname+'/">'+localizationText['forum-profile']+'</a>' +
'</div>' +
'<style>' +
'.b-profile-clan{max-width: 400px; padding-right: 100px;margin-bottom: 14px;padding-top: 5px;position: relative;}' +
'.b-profile-clan_photo{float: left;width: 61px;position: relative;min-height: 70px;top: 5px;}' +
'.b-profile-clan_color{width: 15px;height: 15px;position: absolute;left: 38px;top: 2px;}' +
'.b-profile-clan_link{background-image: url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI4NTIxMEI3ODRFODExRTI5ODYxODk4QjE3Q0IyNzkyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI4NTIxMEI4ODRFODExRTI5ODYxODk4QjE3Q0IyNzkyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Qjg1MjEwQjU4NEU4MTFFMjk4NjE4OThCMTdDQjI3OTIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Qjg1MjEwQjY4NEU4MTFFMjk4NjE4OThCMTdDQjI3OTIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7V+fopAAAMmElEQVR42sxazY7jxhEmKc2IzaZmRrObwEGQi53kklcI4JzzPL7kkFtOQeAn2FfJYYG9OCcfYsd2YsObALGzQLwzErub0khkurqruqop7QgOYMNacHtIUeyuv6++qmZZxE95YqS/v/PPixcv2vl8XvlPOB+GodjtdoNzbnj16tX+yy+/HJ49e7Z/+fLl9Kfjm8a5EKASRynG7/zz/PnzxUcff/L1V//+CgQqDod9sd8fwng4HPzf+2KxUMXbb/88/A3X6AAlwDGOY3re3d031XwiFJxf+GOGx/ci3Icffqjv7jfFRx//9Vv9rvQWnvljXrKz7bbbMM6FdeZ/+eCDdz/79LNdZzfz3vXVdretvDuM4zCMh+EwPjwchr7fetUMIxgdtOS1OhwOg79lX2y3u6C2h/3DMKtmXvvbEdzLa3mA633fj4P/jf8vTA4W8c8YL+ZVDQvSTVN88cXn/7ci3/rJT5PZpMUu/vH53x9+9957f3bOFLXSRZ9GWzSNLpztigVdr/25H+G6tTC2fuwKFe4zflz6+/z9eN6o1o+b8D3dD89r9LKw5oOixvOf/fitEZ4L93X+vhavX+K8CuYxm6LWbbH139f+Pu+Mf/j6P69+DyGGcVpWAihm6/V6Bj9u6CEKhambYt2tw8ONjcJaIRQswsBkSSh/3ay9EprC+es6CL32QrQoFAjTBeHhdzA6FNaAcui+MF9UDiitxnkWIKwxSYnL61WQBsJsKhiMM2dttVCkYS8caBQe4oVY6mXUMCwShTIWhTNxMQ4tBtfpvNFXuHi/6G6Dllrj4uN1GEko3UahwSI9Wg6E0hqvN2ApeC4rdbO+S+5IyFoJeK88IlUgxCUu7tK7jzEdTircoI4PBQ12KBRMusD7wdJhDPevWWhYnAXLLsNzolAmsxxZPjxPuC1cb1DYGuej+66uV0mw2WyWCRaE2213ZXA/EzUfNKZj7IBlehEbKsVUXBxM5lwXJo+x1yYN224TRxsXb8MiURjvrmHR7RUKLdwMldMZMZ9iD4nKbYvN/euR0thsxq6YPvOLC78oi7EQf9yjUPCQ4KZ+0dEtYuxQTDlh2RALyUJxDN+DMHaDgBHHoAS47mMYYs+hG5I7djAPhoHC+YLyMFxAmUthsbI8tpiH636AgA+L8pN0m3VyRxAKNAojTJY0plGDaCFVRyE1ui2gISyaFqtUdKvovvF5PVke3S25KT3HiudTTCuNnuSFX9+Nj7kiZPBx5yI09xjIwWKgIdQcQDhNUit2l4haACw4EtDgc6J75RqH8x4tTBYxXSeAp8X5NAMXzSNie3nzeIz5RPow1Ohui4YfTosz+HCYTMZajzGVUFTGoJaL2CRAqDGVALoZikUQtoX7TPpdDfkPf28QRXsbLR7duy3Wd6+HFE7zE4LtHh5GS5qaAETQsJ+kQ8iOEMwQ704I3WhelOuim23x/mjRJbsx5qm42OhuWufKaTDfxbyHMQ2oeM5iDw9gsZhvyJfJxyFJbwk4hDtpigkd81DQMCkDheoNWWKqtE1yW3LLpIyG7yfhHQkvlI4x9rhgwOEcWqKnRaOl+gnNCpOkfOVjD1GxF2ga0JDQVCw25DGL6Cc9JFjKJCEUpoomCcVCp3MLeexWJOjT4DE07TJphpIwLTYt0kZ0c8jdgrDorkR3auGm5J4pLwrUy/KdIeEEUGi2THJvFIosv77/RlisOhbMs+2xtyZpog7JM3erhGqO6RYBDiyKaJDDwO9FMg0pIxNauJkhQtwlUhCUhha0E2Byht34ZvX0jZQqxpgv4i59LFFGh2StCZqR20mfD5pXnFfAUg1aLionElaiR0RwSYgspjClqAkaN0IJWWxR0leBeRQ/8lWBdMV5brHDuO2ZNRO7j+4ThQv0h9wtcbhl0nCH6NdLqG8kzaLfs8YbaSEBPE3ikrmFp0I/fevtceVr5svLy2SxTLC9R0WlpFCcT5oglEnuR8JrokUiBdBijMnzWW+6RMcUMhpNBFqiKNExYcFcKFZSYEgeFV/+81+/8CKs/WGOY2wYMDZ0ZPG+orUZ9HKx6VLpwPeTMIyajGI9jmDhQNMcax5o2VYwGqgSiDgz+m5EqaORfl2FWL+6uT2ququ85zMynQE6hYR4Gug95a1MaImmcfEJ+lOJEoXdOiLQiG6GYjqPKQIyqsd6Q0mdqoSIzjKPnRRsvz8MoCli47WoqwgNKXBtFx9K7tEFS+j0/ZZix+DzKEXYmMcAWCRqslLw3EkmssxSQoPMgywomcdJwYbh4N1iiZxOQLrhSSRq9b2ZAAQwlWUGHLHuQveynMQX2BOpdU7bUl5TOQNRDfVMItGWKWJ9f8Zi0EXaui5BtVKcJF1iFAKllEzeUagpQ6BkK5kCJVeiX5KGSdSrkxDRvaPlYykUz6Oyr29uHxcMGpALhZytWQqopbYAFpHoFjBeIl3Swf0Ma3iaf5AAE0OpKQbFyEAT3X6bqgaDecugG1NMR0Jsu/Xj4HExv+CKWDCIYBmkO84Yhlw/7pzJ67OM9aNF8HwhKu6UAiTdapgMBEAhjqkpb0Z6VqOSAzlweT122mIQYyI5U53lkk9H2kQ9ELIkcUZiFgYtYCXLV2gBLXoWhjlmTfkvVeRE03jeXlpads02ZywGnV1gHuRmi1qnUsQ47gopkaStYQsTnWrUCW4n6jCmVcRsNNZrOlnGJo9hMlBjQ4mKzRpRt72+OQf3+6Ku29QOiBpmN+nRTbY+v1HPQaX6CTWs2JKZcBPa1LQMHEy0DXfHFAvDHhSTOXkIxdx5i/nDUkeXNEeTiZIFGj52QkxTJU35x3FzdUqLCCgCULlu0h7vshjvLT9PFqORc+pgufbqvMXGRliAaVQUauuExhvu1LreMLqlVEAVtU6MQ0I/Jetp74RKIyWBA4tdaggZJNrcvdo8brFZVZXOiocT92u0aNgYbpIq9Pk6Ln6h8gpXU5dJHwvhHKNrLZkHoWsCDtHO1loUqYyiV2dj7HAoZfs4NWgQWo3h3RTq2Sc3IRqkJ31AxXmJkrPFIja5neHGT5OStxZ1HaNpapY2goj764/DvXdFJype6utR/pDdJCva39x+brP+H3/Pi+/xfOtMxjUT0yALCuXWatKUJXTF86vr1Vm4LykpUr9voXI6pESS7bE9HdBP0CPZLFXZ1hAl69gbMeKciG3TYmy13BbgfNllYZKev7k/R6mGqu8tN1YEtyN2TRCc2sxmkwOA2HqaWpCIbYP1WdOIVCH6kIR6jIYcFhxzHLPXqyePW6wsixH6h7L5qVvZbjYCktESGMhHvQnRkw+QriYxdpQCyL2iBxChVopZvVRqUh6UTGctNgxlIp4uarjrjjcEiNak3ZbEGI4bL7w4TvKN6G1spZuqNrUNrDOCSC85P6bic5O6aMtzeQwaplTsMctn5mEkajXUe8AkjoygFl2q1DEOewF6ksSPm6C9BByV138Z+6eK2trYCT7HPODDLTRGpQWhomb3S0kcLRaEVoL7WWlhZuVH9Zeo55SA/FOWlx5BqQeEvLk9E2P7w77iDYM2QXxv8sDPW2VaFJ9MhNU0GYvnccxMFo8AlZUw010dLSrtVLSeYR6l/8eMQFS4otEi8xZpsEltcJ3ciLeUjGiqcsxI5SyyGJQbD/kGRHpOI4iwDTua5bl6rExN0imHE1yvnxBb2niXFpVlfYJq1x2x/loo5ThfntjKEi05uXFxNkFbkWQzTUlLyZdJ5PdaNFqstJBgJtNNQ9HAUcJd7ckY06kSl72X1e2T6jHBRkBFSVjticCVTUxejGwPiDb4NF8JxlBnuym80UGeIffBZP4LKcKJVh2yfWiy4QHV11iJUmyoqmqQjENCez/trafvOWnX8jUilwvNaGmy38sdzNhO4CqiFm2H7FUMle+c4nseBxKKLDaipIfZrHpIW0PE5SaWm7bGgua6XOjeiZ4H1WOpfY37ZWLfS27XqsxSvDGS72Rushjr1mvYYtkL4dLrRvAq3+Vv3v31b//2yae/aper+Wb9uvSaGDfru/H6ZlWs719Dj3zc3IUxvIKwvL4p4fur69vB05rq2n9///q/I+QVf/94s4LxLvT97uD66hYCvbr2IyRV0DS0p1dPnpbw6oWfpwS38veXQJN87JR4fwnKWz15Uq3v/Hw3N6Xx98M6wCPeeeeXw/vv/+mP0BqFtzpAyFK8q3iBRw1C4k7M7Pt80/Rbfga0EFhqhwLtyHJz4Zd78fdOCFX9AIUaxXHA4wHHQe6PDRJExJul5Q/UYuNEwGGCikcvOZ960fmH6opvetE5/P0/AQYARWny6bv+xcUAAAAASUVORK5CYII=");display: block;height: 54px;position: absolute;left: 2px;padding: 11px 0 0 11px;width: 54px;}' +
'.b-profile-clan_text{margin-left: 61px;}' +
'.b-profile-clan_text-wrpr{font-size: 13px;margin: 5px 0 0;overflow: hidden;padding-right: 0;padding: 0 0 7px;text-overflow: ellipsis;white-space: nowrap;}' +
'.b-link-clan{color: #f9d088;font-weight: bold;text-decoration: none;}' +
'.b-link-clan_tag{color: #babcbf;}' +
'.b-statistic{overflow: hidden;margin: 0 0 16px;line-height: 14px;}' +
'.b-statistic_item{color: #606061;font-size: 11px;margin: 0;padding: 0;line-height: 125%;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;word-wrap: normal;}' +
'.b-statistic_value{color: #babcbf;}' +
'</style>' +
getUserScriptDeveloperBlock() +
'' +
'';
row.insertBefore(div, row.firstChild);
var language = lang; if(language == 'zh-tw'){language = 'zh-cn';}else if(language == 'ja' || language == 'es-mx' || language == 'pt-br'){language = 'en';}
getJson(WOWSAPI+'encyclopedia/ships/?application_id='+application_id+'&fields=name,images,tier,nation,is_premium,images,type&page_no='+page, doneEncyclopedia, errorEncyclopedia);
getJson(WOWSAPI+'clans/glossary/?application_id='+application_id+'&language='+language, doneGlossary, errorGlossary);
getJson(WOWSAPI+'clans/accountinfo/?application_id='+application_id+'&language='+language+'&account_id='+account_id+'&type=profile', doneClanPlayer, errorClanPlayer);
getJson(WOWSAPI+'account/info/?application_id='+application_id+'&extra=statistics.pve,statistics.pvp_solo,statistics.pvp_div2,statistics.pvp_div3&account_id='+account_id+'&index=0&type=profile', doneAccountInfo, errorAccountInfo);
jQ('#userscriptwowsstatinfo').click(function(){onViewBlock(this);});
jQ('._item').click(function(){
setTimeout(function(){viewMainPageProfile();}, 1000);
var pvp_solo_div_charts = document.getElementById('pvp_solo_div_charts');
if(pvp_solo_div_charts != null){
jQ(pvp_solo_div_charts).hide();
jQ('._container_type').hide();
jQ('.dynamic-template').show();
jQ('.button-stat').css('background-color', '#303b41');
jQ('._diactive').removeClass('_diactive');
}
});
jQ('.account-tabs').click(function(){
setTimeout(function(){viewMainPageProfile();}, 1000);
});
}
function ForumUserPage(){
/* START - Удалить после обновления EU форума */
var reputation__wrp = document.getElementsByClassName('reputation__wrp')[0];
if(undefined !== reputation__wrp){
var user_id = reputation__wrp.getAttribute('id').split('_')[1];
var ipsList_data = document.getElementsByClassName('ipsList_data')[0];
ipsList_data.innerHTML += '' +
'<li class="clear clearfix">' +
'<span class="row_title">'+localizationText['profile-clan']+':</span>' +
'<span class="row_data member_'+user_id+'"></span>' +
'</li>' +
'';
var language = lang; if(language == 'zh-tw'){language = 'zh-cn';}else if(language == 'ja' || language == 'es-mx' || language == 'pt-br'){language = 'en';}
MembersArray[0] = [];
getJson(WOWSAPI+'clans/accountinfo/?application_id='+application_id+'&language='+language+'&account_id='+user_id+'&type=forum&index=0', doneClanPlayer, errorClanPlayer);
}
/* END - Удалить после обновления EU форума */
var elProfileHeader = document.getElementById('elProfileHeader');
if(undefined !== elProfileHeader){
var linkParse = elProfileHeader.getAttribute('data-url').split('/');
var accountParse = linkParse[4].split('-');
var account_id = accountParse[0];
var elProfileStats = document.getElementById('elProfileStats');
if(undefined !== elProfileStats){
var ipsList_inline = elProfileStats.getElementsByClassName('ipsList_inline')[0];
if(undefined !== ipsList_inline){
ipsList_inline.innerHTML += '' +
'<li>' +
'<h4 class="ipsType_minorHeading">'+localizationText['profile-clan']+'</h4>' +
'<span class="member_'+account_id+'">' +
'<img style="width: 32px; height: 32px;" src="//'+realm+'.wargaming.net/clans/static/0.1.0.1/images/processing/loader.gif" />' +
'</span>' +
'</li>' +
'';
}
}
var language = lang; if(language == 'zh-tw'){language = 'zh-cn';}else if(language == 'ja' || language == 'es-mx' || language == 'pt-br'){language = 'en';}
MembersArray[0] = [];
getJson(WOWSAPI+'clans/accountinfo/?application_id='+application_id+'&language='+language+'&account_id='+account_id+'&type=forum&index=0', doneClanPlayer, errorClanPlayer);
}
}
function ForumTopicPage(){
var ForumTopicMembers = [];
var ipsPagination = document.getElementsByClassName('ipsPagination')[0];
if(!ipsPagination.getAttribute('wowsstatinfo')){
ipsPagination.setAttribute('wowsstatinfo', 'ok');
}else{
setTimeout(function(){ForumTopicPage();}, 1000);
return;
}
var cAuthorPane_info = document.getElementsByClassName('cAuthorPane_info');
for(var i = 0; i < cAuthorPane_info.length; i++){
var ipsUserPhoto = cAuthorPane_info[i].getElementsByClassName('ipsUserPhoto')[0];
if(ipsUserPhoto === undefined){continue;}
var linkParse = ipsUserPhoto.href.split('/');
var accountParse = linkParse[4].split('-');
var account_id = accountParse[0];
if(ForumTopicMembers['member_'+account_id] === undefined){
ForumTopicMembers['member_'+account_id] = account_id;
var language = lang; if(language == 'zh-tw'){language = 'zh-cn';}else if(language == 'ja' || language == 'es-mx' || language == 'pt-br'){language = 'en';}
MembersArray[i] = [];
getJson(WOWSAPI+'clans/accountinfo/?application_id='+application_id+'&language='+language+'&account_id='+account_id+'&type=forum&index='+i, doneClanPlayer, errorClanPlayer);
}
cAuthorPane_info[i].innerHTML += '' +
'<li class="member_'+account_id+' desc lighter" style="min-height: 50px;">' +
'<img style="width: 32px; height: 32px;" src="//'+realm+'.wargaming.net/clans/static/0.1.0.1/images/processing/loader.gif" />' +
localizationText['search-clan-forum'] +
'</li>' +
'';
}
setTimeout(function(){ForumTopicPage();}, 1000);
}
/* ===== ForumTopicPage function ===== */
function doneForumClanInfo(clan_id, index){
if(MembersArray[index]['clan'] != null){
var br_line = '';
if(window.location.href.indexOf("/topic/") > -1){
br_line = '<br />';
}
var html = '' +
br_line +
'<span>' +
'<a align="center" href="//vzhabin.ru/US_WoWsStatInfo/clans.php?realm_search='+realm+'&clan='+MembersArray[index]['clan']['clan_id']+'" title="'+MembersArray[index]['clan']['tag']+'" rel="home" target="_blank">' +
'<img src="//vzhabin.ru/US_WoWsStatInfo/style/emblem_35x35.png" alt="'+MembersArray[index]['clan']['tag']+'" />' +
'</a>' +
'<a align="center" href="//vzhabin.ru/US_WoWsStatInfo/clans.php?realm_search='+realm+'&clan='+MembersArray[index]['clan']['clan_id']+'" title="'+MembersArray[index]['clan']['tag']+'" rel="home" target="_blank">['+MembersArray[index]['clan']['tag']+']</a>' +
'</span>' +
'';
jQ('.member_'+MembersArray[index]['clan']['account_id']).html(html);
}else{
jQ('.member_'+MembersArray[index]['clan']['account_id']).html('');
}
}
/* ===== MemberProfilePage function ===== */
function doneClanPlayer(url, response){
if(response.status && response.status == "error"){
errorClanPlayer(url);
return;
}
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var language = vars['language'];
var type = vars['type'];
if(response['data'][account_id] == null){errorClanPlayer(url); return;}
var index = 0;
if(type == 'forum'){index = vars['index'];}
MembersArray[index]['clan'] = response['data'][account_id];
if(MembersArray[index]['clan'] != null){
getJson(WOWSAPI+'clans/info/?application_id='+application_id+'&language='+language+'&clan_id='+MembersArray[index]['clan']['clan_id']+'&type='+type+'&index='+index, doneClanInfo, errorClanInfo);
}
}
function errorClanPlayer(url){
var index = 0;
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var type = vars['type'];
if(type == 'forum'){index = vars['index'];}
MembersArray[index]['clan'] = null;
if(type == 'forum'){
jQ('.member_'+account_id).html('');
}
}
function doneClanInfo(url, response){
if(response.status && response.status == "error"){
errorClanInfo(url);
return;
}
var index = 0;
var vars = getUrlVars(url);
var clan_id = vars['clan_id'];
var type = vars['type'];
if(type == 'forum'){index = vars['index'];}
if(response['data'][clan_id] == null){errorClanInfo(); return;}
var account_id = MembersArray[index]['clan']['account_id'];
var account_name = MembersArray[index]['clan']['account_name'];
var joined_at = MembersArray[index]['clan']['joined_at'];
var role = MembersArray[index]['clan']['role'];
MembersArray[index]['clan'] = response['data'][clan_id];
MembersArray[index]['clan']['account_id'] = account_id;
MembersArray[index]['clan']['account_name'] = account_name;
MembersArray[index]['clan']['joined_at'] = joined_at;
MembersArray[index]['clan']['role'] = role;
if(type == 'profile'){
//_clan-post
viewMemberClan();
}else if(type == 'forum'){
doneForumClanInfo(clan_id, index);
}
}
function errorClanInfo(url){
var index = 0;
var vars = getUrlVars(url);
var type = vars['type'];
if(type == 'forum'){index = vars['index'];}
if(type == 'forum'){
jQ('.member_'+MembersArray[index]['clan']['account_id']).html('');
}
}
function viewMemberClan(){
if(MembersArray[0]['clan'] != null){
var _clan_name = document.getElementsByClassName('_clan-name')[0];
_clan_name.innerHTML = '<a href="'+WoWsStatInfoHref+'clans.php?realm_search='+realm+'&clan='+MembersArray[0]['clan']['clan_id']+'" target="_blank">'+_clan_name.innerHTML+' <img src="'+WoWsStatInfoHref+'style/external-links.png"/></a>';
var _clan_post = document.getElementsByClassName('_clan-post')[0];
MembersArray[0]['clan']['role_i18n'] = _clan_post.innerHTML;
}
}
function viewMainPageProfile(){
console.log('...function viewMainPageProfile...');
if(Encyclopedia == null && page != page_total){console.log('Encyclopedia == null'); setTimeout(function(){viewMainPageProfile();}, 1000);return;}
if(MembersArray[0]['info']['hidden_profile']){
console.log(MembersArray[0]['info']['account_id']+' hidden profile!!!');
return;
}
if(!calcStat(0)){
console.log('Error calcStat '+MembersArray[0]['info']['account_id']);
return;
}
var container = null;
var account_tabs__game_mode_tabs_menu = document.getElementsByClassName('account-tabs__game-mode-tabs-menu')[0];
if(account_tabs__game_mode_tabs_menu != null){
var dropdown_select__html = account_tabs__game_mode_tabs_menu.getElementsByClassName('dropdown-select__html')[0];
if(dropdown_select__html != null){
var wows_pvp = dropdown_select__html.getElementsByClassName('wows-pvp')[0];
if(wows_pvp != null){
container = document.getElementsByClassName('account-tabs-containers')[0];
}
}
}
if(container != null){
var account_tab_background = container.getElementsByClassName('account-tab-background');
for(var atb = 0; atb < account_tab_background.length; atb++){
account_tab_background[atb].style.zIndex = '-1';
}
var cm_user_menu_link_cutted_text = document.getElementsByClassName('cm-user-menu-link_cutted-text')[0];
var login_name = null; if(cm_user_menu_link_cutted_text != null){login_name = cm_user_menu_link_cutted_text.textContent;}
var userbar = '';
if(login_name == MembersArray[0]['info']['nickname']){
userbar += '<button class="btn btn-lg btn-turqoise" id="generator-userbar" style="margin: 5px; padding: 10px;">'+localizationText['generator-userbar']+'</button>';
}
userbar += '' +
'<br />'+
'<img id="userbar-img" src="'+WoWsStatInfoHref+'bg/userbar.png" />'+
'<br />'+
'<textarea id="userbar-link" style="margin-top: 5px; font-size: 14px; height: 100px; width: 468px; color: black;">'+
'[url='+WoWsStatInfoHref+'][img]'+WoWsStatInfoHref+'bg/userbar.png[/img][/url]'+
'</textarea>'
'';
var main_page_script_block = document.getElementById('main-page-script-block');
var account_tab_overview = container.getElementsByClassName('account-tab-overview')[0];
var account_main_stats_mobile = container.getElementsByClassName('account-main-stats-mobile')[0];
if(main_page_script_block == null && account_main_stats_mobile != null && account_tab_overview != null){
account_main_stats_mobile.outerHTML += '' +
'<hr />' +
'<table id="main-page-script-block" style="width: 100%;">' +
'<tr>' +
'<td style="vertical-align: top;">' +
'<table class="account-table">' +
'<thead>' +
'<tr>' +
'<th colspan="2">' +
'<h3 class="_title">'+localizationText['stat-table-4']+'</h3>' +
'</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['battles_days']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((MembersArray[0]['info']['statistics']['pvp']['battles_days']).toFixed(0))+'</span>'+
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['number-ships-x']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+MembersArray[0]['info']['ships_x_level']+'</span>'+
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_ship_level']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
MembersArray[0]['info']['statistics']['pvp']['max_ship_level']+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_battles_level']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((MembersArray[0]['info']['statistics']['pvp']['avg_battles_level']).toFixed(1))+'</span>'+
'</td>' +
'</tr>' +
'<tr id="info-stat-pvp-wr">' +
'<td class="_name">' +
'<span>'+
'<a target="_blank" href="//vzhabin.ru/US_WoWsStatInfo/?realm_search='+realm+'&nickname='+MembersArray[0]['info']['nickname']+'">'+
localizationText['wr']+
'</a>' +
'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(MembersArray[0]['info']['statistics']['pvp']['wr'], 'wr', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics']['pvp']['wr']).toFixed(2)) +
'</span>'+
'</td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</td>'+
'<td>'+
'</td>'+
'<td style="text-align: right; vertical-align: top;">'+
userbar +
'</td>' +
'</tr>' +
'</table>'
'';
addStatHover(document.getElementById('info-stat-pvp-wr'), 'wr');
var img = new Image();
img.onload = function(){
var userbar_img = document.getElementById('userbar-img');
if(userbar_img != null){
userbar_img.src = WoWsStatInfoHref+'userbar/'+MembersArray[0]['info']['nickname']+'.png'+'?'+Math.floor(Math.random()*100000001);
var userbar_link = document.getElementById('userbar-link');
userbar_link.textContent = '[url='+WoWsStatInfoHref+'?realm_search='+realm+'&nickname='+MembersArray[0]['info']['nickname']+'][img]'+WoWsStatInfoHref+'userbar/'+MembersArray[0]['info']['nickname']+'.png[/img][/url]';
}
}
img.src = WoWsStatInfoHref+'userbar/'+MembersArray[0]['info']['nickname']+'.png'+'?'+Math.floor(Math.random()*100000001);
jQ('#generator-userbar').click(function(){
getJson(WoWsStatInfoHref+'bg/bg.php?'+Math.floor(Math.random()*100000001), doneUserBarBG, errorUserBarBG);
});
var _values = account_tab_overview.getElementsByClassName('_values')[0];
var main_stat = _values.getElementsByTagName('div');
main_stat[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['battles'], 'battles', 'main');
addStatHover(main_stat[0], 'battles');
main_stat[1].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['wins_percents'], 'wins_percents', 'main');
addStatHover(main_stat[1], 'wins_percents');
main_stat[2].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_xp'], 'avg_xp', 'main');
addStatHover(main_stat[2], 'avg_xp');
main_stat[3].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_damage_dealt'], 'avg_damage_dealt', 'main');
addStatHover(main_stat[3], 'avg_damage_dealt');
main_stat[4].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['kill_dead'], 'kill_dead', 'main');
addStatHover(main_stat[4], 'kill_dead');
var account_battle_stats = account_tab_overview.getElementsByClassName('account-battle-stats')[0];
if(account_battle_stats != null){
var account_table = account_battle_stats.getElementsByClassName('account-table');
//Общие результаты
account_table[0].rows[1].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['battles'], 'battles', 'main');
addStatHover(account_table[0].rows[1], 'battles');
//Средние показатели за бой
account_table[1].rows[1].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_xp'], 'avg_xp', 'main');
addStatHover(account_table[1].rows[1], 'avg_xp');
account_table[1].rows[2].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_damage_dealt'], 'avg_damage_dealt', 'main');
addStatHover(account_table[1].rows[2], 'avg_damage_dealt');
account_table[1].rows[3].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_frags'], 'avg_frags', 'main');
addStatHover(account_table[1].rows[3], 'avg_frags');
account_table[1].rows[4].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_planes_killed'], 'avg_planes_killed', 'main');
addStatHover(account_table[1].rows[4], 'avg_planes_killed');
//account_table[1].rows[5].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_capture_points'], 'avg_capture_points', 'main');
//account_table[1].rows[6].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['avg_dropped_capture_points'], 'avg_dropped_capture_points', 'main');
// Рекордные показатели
account_table[2].rows[1].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['max_xp'], 'max_xp', 'main');
addStatHover(account_table[2].rows[1], 'max_xp');
account_table[2].rows[2].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['max_damage_dealt'], 'max_damage_dealt', 'main');
addStatHover(account_table[2].rows[2], 'max_damage_dealt');
account_table[2].rows[3].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['max_frags_battle'], 'max_frags_battle', 'main');
addStatHover(account_table[2].rows[3], 'max_frags_battle');
account_table[2].rows[4].cells[1].getElementsByTagName('span')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['max_planes_killed'], 'max_planes_killed', 'main');
addStatHover(account_table[2].rows[4], 'max_planes_killed');
//Дополнительно
account_table[0].rows[2].cells[1].getElementsByTagName('small')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['wins_percents'], 'wins_percents', 'main');
addStatHover(account_table[0].rows[2], 'wins_percents');
if(account_table[0].rows[3].cells[1].getElementsByClassName('small-survived_battles_percents')[0] == undefined){
account_table[0].rows[3].cells[1].innerHTML += '<small class="small-survived_battles_percents">('+valueFormat((MembersArray[0]['info']['statistics']['pvp']['survived_battles_percents']).toFixed(2))+'%)</small>';
account_table[0].rows[3].cells[1].getElementsByTagName('small')[0].style.color = findColorASC(MembersArray[0]['info']['statistics']['pvp']['survived_battles_percents'], 'survived_battles_percents', 'main');
addStatHover(account_table[0].rows[3], 'survived_battles_percents');
}
if(account_table[2].rows[1].cells[0].getElementsByClassName('small-max_xp_ship')[0] == undefined
&& Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_xp_ship_id']] != null && Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_xp_ship_id']] !== undefined){
account_table[2].rows[1].cells[0].innerHTML += '<small class="small-max_xp_ship">('+Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_xp_ship_id']]['name']+')</small>';
}
if(account_table[2].rows[2].cells[0].getElementsByClassName('small-max_damage_dealt_ship')[0] == undefined
&& Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_damage_dealt_ship_id']] != null && Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_damage_dealt_ship_id']] !== undefined){
account_table[2].rows[2].cells[0].innerHTML += '<small class="small-max_damage_dealt_ship">('+Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_damage_dealt_ship_id']]['name']+')</small>';
}
if(account_table[2].rows[3].cells[0].getElementsByClassName('small-max_frags_ship')[0] == undefined
&& Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_frags_ship_id']] != null && Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_frags_ship_id']] !== undefined){
account_table[2].rows[3].cells[0].innerHTML += '<small class="small-max_frags_ship">('+Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_frags_ship_id']]['name']+')</small>';
}
if(account_table[2].rows[4].cells[0].getElementsByClassName('small-max_planes_killed_ship')[0] == undefined
&& Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_planes_killed_ship_id']] != null && Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_planes_killed_ship_id']] !== undefined){
account_table[2].rows[4].cells[0].innerHTML += '<small class="small-max_planes_killed_ship">('+Encyclopedia[MembersArray[0]['info']['statistics']['pvp']['max_planes_killed_ship_id']]['name']+')</small>';
}
}
}
if(account_tab_overview != null){
var account_main_stats = account_tab_overview.getElementsByClassName('account-main-stats')[0];
var account_battle_stats = account_tab_overview.getElementsByClassName('account-battle-stats')[0];
if(account_battle_stats != null && account_main_stats != null){
var account_delta_stat = account_battle_stats.getElementsByClassName('account-delta-stat')[0];
var Keys = Object.keys(MembersArray[0]['statsbydate']['pvp']);
if(account_delta_stat == null && Keys.length > 1){
account_battle_stats.innerHTML += '<div class="account-delta-stat"></div>';
var IndexLast = Keys.length - 1;
var IndexOld = Keys.length - 2;
var battles = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['battles'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['battles'];
var wins_percents = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['wins_percents'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['wins_percents'];
var avg_xp = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_xp'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_xp'];
var avg_damage_dealt = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_damage_dealt'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_damage_dealt'];
var kill_dead = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['kill_dead'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['kill_dead'];
var avg_frags = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_frags'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_frags'];
var avg_planes_killed = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_planes_killed'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_planes_killed'];
var avg_capture_points = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_capture_points'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_capture_points'];
var avg_dropped_capture_points = MembersArray[0]['statsbydate']['pvp'][Keys[IndexLast]]['avg_dropped_capture_points'] - MembersArray[0]['statsbydate']['pvp'][Keys[IndexOld]]['avg_dropped_capture_points'];
if(login_name == MembersArray[0]['info']['nickname']){
var _values = account_main_stats.getElementsByClassName('_values')[0];
var main_stat = _values.getElementsByTagName('div');
main_stat[0].innerHTML += getHTMLDif(battles, 0);
main_stat[1].innerHTML += getHTMLDif(wins_percents, 2);
main_stat[2].innerHTML += getHTMLDif(avg_xp, 2);
main_stat[3].innerHTML += getHTMLDif(avg_damage_dealt, 0);
main_stat[4].innerHTML += getHTMLDif(kill_dead, 2);
}
if(account_battle_stats != null){
var account_table = account_battle_stats.getElementsByClassName('account-table');
if(login_name == MembersArray[0]['info']['nickname']){
account_table[1].rows[1].cells[1].innerHTML += getHTMLDif(avg_xp, 2);
account_table[1].rows[2].cells[1].innerHTML += getHTMLDif(avg_damage_dealt, 2);
account_table[1].rows[3].cells[1].innerHTML += getHTMLDif(avg_frags, 2);
account_table[1].rows[4].cells[1].innerHTML += getHTMLDif(avg_planes_killed, 2);
//account_table[1].rows[5].cells[1].innerHTML += getHTMLDif(avg_capture_points, 2);
//account_table[1].rows[6].cells[1].innerHTML += getHTMLDif(avg_dropped_capture_points, 2);
}
addStatHover(account_table[0].rows[1], 'battles');
addStatHover(account_table[0].rows[2], 'wins_percents');
addStatHover(account_table[0].rows[3], 'survived_battles_percents');
addStatHover(account_table[1].rows[1], 'avg_xp');
addStatHover(account_table[1].rows[2], 'avg_damage_dealt');
addStatHover(account_table[1].rows[3], 'avg_frags');
addStatHover(account_table[1].rows[4], 'avg_planes_killed');
addStatHover(account_table[2].rows[1], 'max_xp');
addStatHover(account_table[2].rows[2], 'max_damage_dealt');
addStatHover(account_table[2].rows[3], 'max_frags_battle');
addStatHover(account_table[2].rows[4], 'max_planes_killed');
}
}
}
}
var achieves_block = container.getElementsByClassName('achieves-block')[0];
if(achieves_block != null){
var achieve_item = container.getElementsByClassName('achieve-item');
for(var i = 0; i < achieve_item.length; i++){
var item = achieve_item[i];
var js_tooltip_show = item.getAttribute('js-tooltip-show');
var _counter = item.getElementsByClassName('_counter')[0];
if(_counter != null && item.getElementsByClassName('_counter').length == 1){
_counter.setAttribute('style', 'left: 70%; background-color: #F7882E; min-width: 3em;');
var battlesAchievement = 0;
if(MembersArray[0]['achievements']['battle'][js_tooltip_show.toUpperCase()+'_battle'] === undefined){
battlesAchievement = 'Error';
}else{
battlesAchievement = MembersArray[0]['achievements']['battle'][js_tooltip_show.toUpperCase()+'_battle'];
}
item.innerHTML += '<div class="_counter" style="left: 20%; background-color: #AAAAAA; min-width: 3em;">'+battlesAchievement+'</div>';
}
}
var achieves_block = container.getElementsByClassName('achieves-block')[0];
var achieve_counter = container.getElementsByClassName('achieve-counter')[0];
if(achieve_counter == null && achieves_block != null){
achieves_block.outerHTML += '' +
'<div class="achieve-counter" style="margin-left: 10px;">' +
'<div style="width: initial; height: initial; float: initial; font-size: 14px; color: #FFF;" class="achieve-item _big tooltip-target tooltip-enabled tooltip-element-attached-top tooltip-element-attached-left tooltip-target-attached-bottom tooltip-target-attached-left">' +
'<div class="_counter" style="position: relative; background-color: #F7882E; min-width: 3em; left: 0; float: left;">12</div>' +
'<div> - '+localizationText['achieve_counter_1']+'</div>' +
'<div class="_counter" style="position: relative; background-color: #AAAAAA; min-width: 3em; left: 0; float: left;">31</div>' +
'<div> - '+localizationText['achieve_counter_2']+'</div>' +
'</div>' +
'</div>' +
'';
}
}
var account_tabs_wrapper = document.getElementsByClassName('account-tabs-wrapper')[0];
if(account_tabs_wrapper != null){
var pvp_solo_div_charts = document.getElementById('pvp_solo_div_charts');
if(pvp_solo_div_charts == null){
var div = document.createElement('div');
div.setAttribute('id', 'pvp_solo_div_charts');
div.setAttribute('style', 'text-align: right;');
div.innerHTML += '' +
'<div style="text-align: right;">' +
'<button class="btn btn-lg btn-turqoise button-stat" id="pvp_solo" style="margin: 5px; padding: 10px; background-color: #303b41;">' +
localizationText['pvp_solo'] +
'</button>' +
'<button class="btn btn-lg btn-turqoise button-stat" id="pvp_div" style="margin: 5px; padding: 10px; background-color: #303b41;">' +
localizationText['pvp_div'] +
'</button>' +
'<button class="btn btn-lg btn-turqoise button-stat" id="charts" style="margin: 5px; padding: 10px; background-color: #303b41;">' +
localizationText['charts'] +
'</button>' +
'</div>' +
'';
account_tabs_wrapper.insertBefore(div, account_tabs_wrapper.firstChild);
jQ('.button-stat').click(function(){
jQ('._container_type').hide();
jQ('.button-stat').css('background-color', '#303b41');
var tab_content = document.getElementsByClassName('tab-content')[0];
var li = tab_content.getElementsByTagName('li');
for(var i = 0; i < li.length; i++){
if(li[i].getAttribute('class') == 'account-tab _active'){
jQ(li[i]).removeClass('_active');
jQ(li[i]).addClass('_diactive');
jQ('.dynamic-template').hide();
}
}
jQ('._container_'+jQ(this).attr('id')).show();
jQ(this).css('background-color', '#099');
});
jQ('.account-tab').click(function(){
if(jQ(this).attr('class') == 'account-tab _diactive'){
jQ(this).addClass('_active');
}
jQ('.dynamic-template').show();
jQ('._container_type').hide();
jQ('.button-stat').css('background-color', '#303b41');
jQ('._diactive').removeClass('_diactive');
});
}else{
jQ(pvp_solo_div_charts).show();
}
}
var typeStatAdd = ["pvp_div", "pvp_solo"];
var _container = document.getElementsByClassName('_container')[0];
if(_container != null){
var _container_solo_div_charts = document.getElementsByClassName('_container_solo_div_charts')[0];
if(_container_solo_div_charts == null){
var div = document.createElement('div');
div.setAttribute('class', '_container_solo_div_charts');
_container.insertBefore(div, _container.firstChild);
_container_solo_div_charts = document.getElementsByClassName('_container_solo_div_charts')[0];
}
for(var i = 0; i < typeStatAdd.length; i++){
var type = typeStatAdd[i];
var _container_type = _container_solo_div_charts.getElementsByClassName('_container_'+type)[0];
if(_container_type == null){
_container_solo_div_charts.innerHTML += '' +
'<div class="_container_type _container_'+type+' tab-container" style="display: none;">' +
'<div class="account-main-stats">' +
'<div class="_bg-for-average-exp"></div>' +
'<div class="account-main-stats-table">' +
'<div class="_icons">' +
'<div class="_battles">' +
'<div></div>' +
'</div>' +
'<div class="_victories">' +
'<div></div>' +
'</div>' +
'<div class="_average-exp">' +
'<div></div>' +
'</div>' +
'<div class="_kd">' +
'<div></div>' +
'</div>' +
'<div class="_other">' +
'<div></div>' +
'</div>' +
'</div>' +
'<div class="_names">' +
'<div>'+localizationText['title_battles']+'</div>' +
'<div>'+localizationText['title_wins_percents']+'</div>' +
'<div class="_average-exp">'+localizationText['title_avg_xp']+'</div>' +
'<div>'+localizationText['title_avg_damage_dealt']+'</div>' +
'<div>'+localizationText['title_kill_dead']+'</div>' +
'</div>' +
'<div class="_values">' +
'<div style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['battles'], 'battles', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['battles']).toFixed(0))+
'</div>' +
'<div style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['wins_percents'], 'wins_percents', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['wins_percents']).toFixed(2))+
'%</div>' +
'<div style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['avg_xp'], 'avg_xp', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['avg_xp']).toFixed(0))+
'</div>' +
'<div style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['avg_damage_dealt'], 'avg_damage_dealt', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['avg_damage_dealt']).toFixed(0))+
'</div>' +
'<div style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['kill_dead'], 'kill_dead', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['kill_dead']).toFixed(2))+
'</div>' +
'</div>' +
'</div>' +
'</div>' +
'<hr />' +
'<div class="account-battle-stats">' +
getHTMLStat(MembersArray[0]['info']['statistics'][type], 'main')+
'<div class="row">' +
'<div class="col-xs-12 col-sm-4">' +
'<table class="account-table _left">' +
'<thead>' +
'<tr>' +
'<th colspan="2">' +
'<h3 class="account-title">'+localizationText['stat-table-4']+'</h3>' +
'</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['battles_days']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
(MembersArray[0]['info']['statistics'][type]['battles_days']).toFixed(0)+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_ship_level']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
MembersArray[0]['info']['statistics'][type]['max_ship_level']+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_battles_level']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
valueFormat((MembersArray[0]['info']['statistics'][type]['avg_battles_level']).toFixed(1))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>' +
'<a target="_blank" href="//vzhabin.ru/US_WoWsStatInfo/?realm_search='+realm+'&nickname='+MembersArray[0]['info']['nickname']+'">'+
localizationText['wr'] +
'</a>' +
'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(MembersArray[0]['info']['statistics'][type]['wr'], 'wr', 'main')+';">'+
valueFormat((MembersArray[0]['info']['statistics'][type]['wr']).toFixed(2)) +
'</span>'+
'</td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</div>' +
'</div>' +
'</div>' +
'<hr />' +
'<div class="account-tab-ships tab-container _active" js-tab-cont-id="account-tab-ships-'+type+'">' +
'<h3 class="account-title">'+localizationText['ships_stat']+'</h3>' +
'<table class="table-wows">'+
'<thead>'+
'<tr>'+
'<th class="_icon">'+
'<div class="_icon-type-of-ship"></div>'+
'</th>'+
'<th class="_name">'+
localizationText['title_ships']+
'</th>'+
'<th class="_value">'+
'<div class="_icon-battles"></div>'+
'<span>'+localizationText['battles']+'</span>'+
'</th>'+
'<th class="_value">'+
'<div class="_icon-winrate"></div>'+
'<span>'+localizationText['wins']+'</span>'+
'</th>'+
'<th class="_value">'+
'<div class="_icon-exp"></div>'+
'<span>'+localizationText['title_avg_xp']+'</span>'+
'</th>'+
'<th class="_value">'+
'<span>'+localizationText['wr']+'</span>'+
'</th>'+
'</tr>'+
'</thead>'+
getHTMLShipStat(MembersArray[0], type)+
'</table>'+
'</div>' +
'</div>' +
'';
}
}
var _container_charts = _container_solo_div_charts.getElementsByClassName('_container_charts')[0];
if(_container_charts == null){
var date = [];
var value = [];
var html_chart = '';
var chart_value = ['wins_percents', 'avg_xp', 'avg_damage_dealt', 'kill_dead', 'avg_frags', 'avg_planes_killed'];
for(var key in chart_value){
var title = chart_value[key];
html_chart += '' +
'<div class="chart_div">' +
'<h3 class="_title">'+localizationText['title_'+title]+'</h3>' +
'<div class="userscript-placeholder"><div id="chart_'+title+'" class="chart-placeholder"></div></div>' +
'</div>' +
'';
value[title] = [];
}
_container_solo_div_charts.innerHTML += '' +
'<div class="_container_type _container_charts tab-container" js-tab-cont-id="account-tab-charts-pvp" style="display: none;">' +
'<div class="account-main-stats">' +
html_chart +
'</div>' +
'</div>' +
'';
var index = 0;
for(var key_stat in MembersArray[0]['statsbydate']['pvp']){
var d = key_stat.substring(6, 8);
var m = key_stat.substring(4, 6);
var y = key_stat.substring(2, 4);
date.push([index, d+'.'+m]);
for(var key in chart_value){
var title = chart_value[key];
value[title].push([index, parseFloat(MembersArray[0]['statsbydate']['pvp'][key_stat][title].toFixed(2))]);
}
index++;
}
for(var key in chart_value){
var title = chart_value[key];
viewChart(title, date, value[title]);
}
jQ(container).find('nav.account-tabs ul').append(''+
'<li class="account-tab" js-tab="" js-tab-show="account-tab-charts-pvp">'+
'<div class="_title">'+localizationText['charts']+'</div>'+
'<div class="_active-feature">'+
'<div class="_line"></div>'+
'<div class="_shadow"></div>'+
'</div>'+
'</li>'+
'');
jQ(container).find('div.account-tabs-mobile ul').append(''+
'<li class="_item" js-dropdown-item="" js-tab="" js-tab-show="account-tab-charts-pvp">'+localizationText['charts']+'</li>' +
'');
}
var _click_solo_div_ships = document.getElementsByClassName('_click_solo_div_ships')[0];
if(_click_solo_div_ships == null){
var div = document.createElement('div');
div.setAttribute('class', '_click_solo_div_ships');
_container.insertBefore(div, _container.firstChild);
for(var i = 0; i < typeStatAdd.length; i++){
var type = typeStatAdd[i];
jQ('.ships-class-'+type).click(function(){
if(jQ(this).attr('open-active') == 'true'){
jQ(this).removeClass('_active-btn');
jQ('.'+jQ(this).attr('open-block')).removeClass('_active');
jQ(this).attr('open-active', 'false');
}else{
jQ(this).addClass('_active-btn');
jQ('.'+jQ(this).attr('open-block')).addClass('_active');
jQ(this).attr('open-active', 'true');
}
});
jQ('.ship-stat-'+type).click(function(){
if(jQ(this).attr('open-active') == 'true'){
jQ(this).removeClass('_active-btn');
jQ('.'+jQ(this).attr('open-block')).removeClass('_active');
jQ(this).attr('open-active', 'false');
}else{
jQ(this).addClass('_active-btn');
jQ('.'+jQ(this).attr('open-block')).addClass('_active');
jQ(this).attr('open-active', 'true');
}
});
}
}
}
var ships_detail_stats = container.getElementsByClassName('ships-detail-stats')[0];
if(ships_detail_stats != null){
for(var i = 0; i < ships_detail_stats.rows.length; i++){
var row = ships_detail_stats.rows[i];
if(i == 0 && row.cells.length < 6){
var th = document.createElement('th');
th.setAttribute('class', '_value');
th.innerHTML = '<span>'+localizationText['wr']+'</span>';
row.appendChild(th);
continue;
}
if(row.getAttribute('class') == null){
var _icon = row.getElementsByClassName('_icon')[0];
var div_icon = _icon.getElementsByTagName('div')[0];
var ship_class = div_icon.getAttribute('class').split('-')[1];
if(row.cells.length < 6){
for(var t = 0; t < typeShip.length; t++){
var type = typeShip[t].toLowerCase();
if(ship_class == type){
ship_class = typeShip[t];
}
}
var td = document.createElement('td');
td.innerHTML = '<span style="color:'+findColorASC(MembersArray[0]['info']['statistics']['pvp']['wr_'+ship_class], 'wr', 'main')+';">'+valueFormat((MembersArray[0]['info']['statistics']['pvp']['wr_'+ship_class]).toFixed(0))+'</span>';
row.appendChild(td);
}
var battles = htmlParseMemberStatistic(row.cells[2]);
if(battles > 0){
var wins = htmlParseMemberStatistic(row.cells[3]);
var avg_xp = htmlParseMemberStatistic(row.cells[4]);
var wins_percents = (wins/battles)*100; if(isNaN(wins_percents)){wins_percents = 0;}
row.cells[3].setAttribute('style', 'white-space: nowrap;');
row.cells[3].innerHTML = valueFormat(wins)+' <span style="color:'+findColorASC(wins_percents, 'wins_percents', 'main')+';">('+valueFormat((wins_percents).toFixed(0))+'%)</span>';
row.cells[4].setAttribute('style', 'white-space: nowrap;');
row.cells[4].innerHTML = ' <span style="color:'+findColorASC(avg_xp, 'avg_xp', 'main')+';">'+valueFormat(avg_xp)+'</span>';
}
continue;
}
if(row.getAttribute('class').indexOf('_expandable') > -1){
if(row.cells.length < 5){
var src = row.cells[0].getElementsByClassName('_icon-ships')[0].src;
var src_split = src.split('/');
var img_name = src_split[src_split.length - 1];
var ship_id = getImgNameToShipId(img_name);
var name_text = row.cells[0].getElementsByClassName('_text')[0];
var is_premium = Encyclopedia[ship_id]['is_premium'];
if(is_premium){
name_text.setAttribute('style', 'color: #ffab34;');
}
var td = document.createElement('td');
td.setAttribute('id', 'wr-'+ship_id);
td.innerHTML = '<span>0</span>';
row.appendChild(td);
}
var battles = htmlParseMemberStatistic(row.cells[1]);
if(battles > 0){
var wins = htmlParseMemberStatistic(row.cells[2]);
var avg_xp = htmlParseMemberStatistic(row.cells[3]);
var wins_percents = (wins/battles)*100; if(isNaN(wins_percents)){wins_percents = 0;}
row.cells[2].setAttribute('style', 'white-space: nowrap;');
row.cells[2].innerHTML = valueFormat(wins)+' <span style="color:'+findColorASC(wins_percents, 'wins_percents', 'main')+';">('+valueFormat((wins_percents).toFixed(0))+'%)</span>';
row.cells[3].setAttribute('style', 'white-space: nowrap;');
row.cells[3].innerHTML = ' <span style="color:'+findColorASC(avg_xp, 'avg_xp', 'main')+';">'+valueFormat(avg_xp)+'</span>';
}
continue;
}
if(row.getAttribute('class').indexOf('_ship-entry-stat') > -1){
row.cells[0].setAttribute('colspan', '6');
continue;
}
}
for(var shipI = 0; shipI < MembersArray[0]['ships'].length; shipI++){
var ship_id = MembersArray[0]['ships'][shipI]['ship_id'];
var wr_cell = document.getElementById('wr-'+ship_id);
if(wr_cell != null){
wr_cell.setAttribute('style', 'white-space: nowrap;');
wr_cell.innerHTML = '<span style="color:'+findColorASC(MembersArray[0]['ships'][shipI]['pvp']['wr'], 'wr', 'main')+';">'+valueFormat((MembersArray[0]['ships'][shipI]['pvp']['wr']).toFixed(0))+'</span>';
}
}
}
var account_tabs = document.getElementsByClassName('account-tabs')[0];
var account_tabs_ul = account_tabs.getElementsByTagName("ul")[0];
var account_tabs_ul_li = account_tabs.getElementsByTagName("li");
if(account_tabs_ul_li[3].getAttribute('class') == 'account-tab _active' && !ships_detail_stats){
setTimeout(function(){viewMainPageProfile();}, 1000);
}else if(account_tabs_ul_li[2].getAttribute('class') == 'account-tab _active' && !achieves_block){
setTimeout(function(){viewMainPageProfile();}, 1000);
}else if(account_tabs_ul_li[0].getAttribute('class') == 'account-tab _active' && (!account_tab_overview || !main_page_script_block)){
setTimeout(function(){viewMainPageProfile();}, 1000);
}
}
}
function getHTMLStat(StatArray, type_stat){
var html = '';
var battles_percents = '';
var max_xp_ship = '';
var max_damage_dealt_ship = '';
var max_frags_ship = '';
var max_planes_killed_ship = '';
if(type_stat == 'main'){
var max_xp_ship_name = StatArray['max_xp_ship_id']; if(Encyclopedia[''+StatArray['max_xp_ship_id']+'']){max_xp_ship_name = Encyclopedia[''+StatArray['max_xp_ship_id']+'']['name'];}
var max_damage_dealt_ship_name = StatArray['max_damage_dealt_ship_id']; if(Encyclopedia[''+StatArray['max_damage_dealt_ship_id']+'']){max_damage_dealt_ship = Encyclopedia[''+StatArray['max_damage_dealt_ship_id']+'']['name'];}
var max_frags_ship_name = StatArray['max_frags_ship_id']; if(Encyclopedia[''+StatArray['max_frags_ship_id']+'']){max_frags_ship_name = Encyclopedia[''+StatArray['max_frags_ship_id']+'']['name'];}
var max_planes_killed_ship_name = StatArray['max_planes_killed_ship_id']; if(Encyclopedia[''+StatArray['max_planes_killed_ship_id']+'']){max_planes_killed_ship_name = Encyclopedia[''+StatArray['max_planes_killed_ship_id']+'']['name'];}
battles_percents = '<small>('+valueFormat((StatArray['battles_percents']).toFixed(2))+'%)</small>';
max_xp_ship = '<small> ('+max_xp_ship_name+')</small>';
max_damage_dealt_ship = '<small> ('+max_damage_dealt_ship_name+')</small>';
max_frags_ship = '<small> ('+max_frags_ship_name+')</small>';
max_planes_killed_ship = '<small> ('+max_planes_killed_ship_name+')</small>';
}
html = ''+
'<div class="row">' +
'<div class="col-xs-12 col-sm-4">' +
'<table class="account-table _left">' +
'<thead>' +
'<tr>' +
'<th colspan="2">' +
'<h3 class="account-title">'+localizationText['stat-table-1']+'</h3>' +
'</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['battles']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['battles'], 'battles', type_stat)+';">'+
valueFormat((StatArray['battles']).toFixed(0))+
'</span>' +
battles_percents+
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['wins']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
valueFormat((StatArray['wins']).toFixed(0))+
'</span>' +
'<small style="color: '+findColorASC(StatArray['wins_percents'], 'wins_percents', type_stat)+';">('+
valueFormat((StatArray['wins_percents']).toFixed(2))+
'%)</small>'+
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['survived_battles']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+
valueFormat((StatArray['survived_battles']).toFixed(0))+
'</span>' +
'<small style="color: '+findColorASC(StatArray['survived_battles_percents'], 'survived_battles_percents', type_stat)+';">('+
valueFormat((StatArray['survived_battles_percents']).toFixed(2))+
'%)</small>'+
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['damage_dealt']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((StatArray['damage_dealt']).toFixed(0))+'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['frags']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((StatArray['frags']).toFixed(0))+'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['planes_killed']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((StatArray['planes_killed']).toFixed(0))+'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['capture_points']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((StatArray['capture_points']).toFixed(0))+'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['dropped_capture_points']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span>'+valueFormat((StatArray['dropped_capture_points']).toFixed(0))+'</span>' +
'</td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</div>' +
'<div class="col-xs-12 col-sm-4">' +
'<table class="account-table _center">' +
'<thead>' +
'<tr>' +
'<th colspan="2">' +
'<h3 class="account-title">'+localizationText['stat-table-2']+'</h3>' +
'</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_xp']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['avg_xp'], 'avg_xp', type_stat)+';">'+
valueFormat((StatArray['avg_xp']).toFixed(2))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_damage_dealt']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['avg_damage_dealt'], 'avg_damage_dealt', type_stat)+';">'+
valueFormat((StatArray['avg_damage_dealt']).toFixed(2))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_frags']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['avg_frags'], 'avg_frags', type_stat)+';">'+
valueFormat((StatArray['avg_frags']).toFixed(2))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_planes_killed']+'</span>' +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['avg_planes_killed'], 'avg_planes_killed', type_stat)+';">'+
valueFormat((StatArray['avg_planes_killed']).toFixed(2))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_capture_points']+'</span>' +
'</td>' +
'<td class="_value">' +
//'<span style="color: '+findColorASC(StatArray['avg_capture_points'], 'avg_capture_points', type_stat)+';">'
'<span>'
+valueFormat((StatArray['avg_capture_points']).toFixed(2))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['avg_dropped_capture_points']+'</span>' +
'</td>' +
'<td class="_value">' +
//'<span style="color: '+findColorASC(StatArray['avg_dropped_capture_points'], 'avg_dropped_capture_points', type_stat)+';">'+
'<span>'+
valueFormat((StatArray['avg_dropped_capture_points']).toFixed(0))+
'</span>' +
'</td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</div>' +
'<div class="col-xs-12 col-sm-4">' +
'<table class="account-table _right">' +
'<thead>' +
'<tr>' +
'<th colspan="2">' +
'<h3 class="account-title">'+localizationText['stat-table-3']+'</h3>' +
'</th>' +
'</tr>' +
'</thead>' +
'<tbody>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_xp']+'</span>' +
max_xp_ship +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['max_xp'], 'max_xp', type_stat)+';">'+
valueFormat((StatArray['max_xp']).toFixed(0))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_damage_dealt']+'</span>' +
max_damage_dealt_ship +
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['max_damage_dealt'], 'max_damage_dealt', type_stat)+';">'+
valueFormat((StatArray['max_damage_dealt']).toFixed(0))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_frags_battle']+'</span>' +
max_frags_ship+
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['max_frags_battle'], 'max_frags_battle', type_stat)+';">'+
valueFormat((StatArray['max_frags_battle']).toFixed(0))+
'</span>' +
'</td>' +
'</tr>' +
'<tr>' +
'<td class="_name">' +
'<span>'+localizationText['max_planes_killed']+'</span>' +
max_planes_killed_ship+
'</td>' +
'<td class="_value">' +
'<span style="color: '+findColorASC(StatArray['max_planes_killed'], 'max_planes_killed', type_stat)+';">'+
valueFormat((StatArray['max_planes_killed']).toFixed(0))+
'</span>' +
'</td>' +
'</tr>' +
'</tbody>' +
'</table>' +
'</div>' +
'</div>' +
'';
return html;
}
function getHTMLShipStat(StatArray, type){
var htmlArray = [];
var StatClassArray = [];
for(var tS = 0; tS < typeShip.length; tS++){
htmlArray[typeShip[tS]] = '';
StatClassArray[typeShip[tS]] = [];
StatClassArray[typeShip[tS]]['battles'] = 0;
StatClassArray[typeShip[tS]]['wins'] = 0;
StatClassArray[typeShip[tS]]['xp'] = 0;
StatClassArray[typeShip[tS]]['count'] = 0;
}
StatArray['ships'].sort(DESC(type+'.battles'));
for(var sI = 0; sI < StatArray['ships'].length; sI++){
var Ship = StatArray['ships'][sI];
var ship_id = Ship['ship_id'];
if(Encyclopedia[ship_id] === undefined){continue;}
var ship_nation = Encyclopedia[ship_id]['nation'];
var ship_name = Encyclopedia[ship_id]['name'];
var ship_type = Encyclopedia[ship_id]['type'];
var ship_tier = Encyclopedia[ship_id]['tier'];
var ship_lvl = getLevelText(ship_tier);
var ship_img = Encyclopedia[ship_id]['images']['small']; ship_img = ship_img.replace('http://', 'https://');
var is_premium = Encyclopedia[ship_id]['is_premium'];
var color_name = '';
if(is_premium){
color_name = '#ffab34';
}
if(Ship[type]['battles'] > 0){
StatClassArray[ship_type]['battles'] += Ship[type]['battles'];
StatClassArray[ship_type]['wins'] += Ship[type]['wins'];
StatClassArray[ship_type]['xp'] += Ship[type]['xp'];
StatClassArray[ship_type]['count']++;
htmlArray[ship_type] += '' +
'<tr class="_expandable ship-stat-'+type+'" open-block="ship-'+ship_id+'-'+ship_tier+'-'+type+'" open-active="false">' +
'<td colspan="2" class="_name">' +
'<div class="_bg-nation-'+ship_nation+'"></div>' +
'<span class="_lvl">'+ship_lvl+'</span>' +
'<img class="_icon-ships img-responsive" style="width: 68px; height: 40px;" src="'+ship_img+'">' +
'<span class="_text" style="color: '+color_name+';">'+ship_name+'</span>' +
'</td>' +
'<td class="_value">'+valueFormat((Ship[type]['battles']).toFixed(0))+'</td>' +
'<td class="_value" style="white-space: nowrap;">' +
Ship[type]['wins']+' ' +
'<span style="color:'+findColorASC(Ship[type]['wins_percents'], 'wins_percents', 'main')+'">' +
'('+valueFormat((Ship[type]['wins_percents']).toFixed(0))+'%)' +
'</span>' +
'</td>' +
'<td class="_value" style="white-space: nowrap;">' +
'<span style="color:'+findColorASC(Ship[type]['avg_xp'], 'avg_xp', 'main')+';">' +
valueFormat((Ship[type]['avg_xp']).toFixed(0)) +
'</span>' +
'</td>' +
'<td style="white-space: nowrap;">' +
'<span style="color:'+findColorASC(Ship[type]['wr'], 'wr', 'main')+';">' +
valueFormat((Ship[type]['wr']).toFixed(0)) +
'</span>' +
'</td>' +
'</tr>' +
'<tr class="_hide _ship-entry-stat ship-'+ship_id+'-'+ship_tier+'-'+type+'">' +
'<td colspan="6">' +
getHTMLStat(Ship[type], 'ship') +
'</td>' +
'</tr>'+
'';
}
}
var html = '';
for(var tS = 0; tS < typeShip.length; tS++){
var wins_percents = (StatClassArray[typeShip[tS]]['wins']/StatClassArray[typeShip[tS]]['battles'])*100; if(isNaN(wins_percents)){wins_percents = 0;}
var avg_xp = StatClassArray[typeShip[tS]]['xp']/StatClassArray[typeShip[tS]]['battles']; if(isNaN(avg_xp)){avg_xp = 0;}
html += '' +
'<tbody class="_expandable ships-class-'+type+'" open-block="ships-class-'+typeShip[tS].toLowerCase()+'-'+type+'" open-active="false">' +
'<tr>' +
'<td class="_icon"><div class="_icon-'+typeShip[tS].toLowerCase()+'"></div></td>' +
'<td class="_name">' +
localizationText[typeShip[tS].toLowerCase()]+' ('+StatClassArray[typeShip[tS]]['count']+')' +
'</td>' +
'<td class="_value">'+valueFormat((StatClassArray[typeShip[tS]]['battles']).toFixed(0))+'</td>' +
'<td class="_value" style="white-space: nowrap;">' +
valueFormat((StatClassArray[typeShip[tS]]['wins']).toFixed(0))+' ' +
'<span style="color:'+findColorASC(wins_percents, 'wins_percents', 'main')+';">' +
'('+valueFormat((wins_percents).toFixed(0))+'%)' +
'</span>' +
'</td>' +
'<td class="_value" style="white-space: nowrap;"> ' +
'<span style="color:'+findColorASC(avg_xp, 'avg_xp', 'main')+';">' +
valueFormat((avg_xp).toFixed(0)) +
'</span>' +
'</td>' +
'<td>' +
'<span style="color:'+findColorASC(StatArray['info']['statistics'][type]['wr_'+typeShip[tS]], 'wr', 'main')+';">' +
valueFormat((StatArray['info']['statistics'][type]['wr_'+typeShip[tS]]).toFixed(0)) +
'</span>' +
'</td>' +
'</tr>' +
'</tbody>' +
'<tbody class="_hide ships-class-'+typeShip[tS].toLowerCase()+'-'+type+'">' +
htmlArray[typeShip[tS]] +
'</tbody>' +
'';
}
return html;
}
function GeneratorUserBar(userbarbg){
var jsonString = 'json='+JSON.stringify(MembersArray[0])+'&type=userbar&userbarbg='+userbarbg+'&lang='+lang;
var xmlhttp;
try{
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
}catch(e){
try{
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}catch(E){
xmlhttp = false;
}
}
if(!xmlhttp && typeof XMLHttpRequest != 'undefined'){
xmlhttp = new XMLHttpRequest();
}
xmlhttp.open('POST', ''+WoWsStatInfoHref+'userbar.php?random='+Math.floor(Math.random()*100000001), true);
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200){
var userbar_img = document.getElementById('userbar-img');
userbar_img.src = xmlhttp.responseText+'?'+Math.floor(Math.random()*100000001);
var userbar_link = document.getElementById('userbar-link');
userbar_link.textContent = '[url='+WoWsStatInfoHref+'?realm_search='+realm+'&nickname='+MembersArray[0]['info']['nickname']+'][img]'+xmlhttp.responseText+'[/img][/url]';
}
}
};
xmlhttp.send(jsonString);
}
var UserBarBGData = null;
var CountUserBar = [];
function doneUserBarBG(url, response){
UserBarBGData = response;
CountUserBar['all'] = 0;
CountUserBar['clan'] = 0;
CountUserBar['noclassification'] = 0;
CountUserBar['battleship'] = [];
CountUserBar['battleship']['count'] = 0;
CountUserBar['battleship']['japan'] = 0;
CountUserBar['battleship']['ussr'] = 0;
CountUserBar['battleship']['germany'] = 0;
CountUserBar['battleship']['uk'] = 0;
CountUserBar['battleship']['usa'] = 0;
CountUserBar['aircarrier'] = [];
CountUserBar['aircarrier']['count'] = 0;
CountUserBar['aircarrier']['japan'] = 0;
CountUserBar['aircarrier']['ussr'] = 0;
CountUserBar['aircarrier']['germany'] = 0;
CountUserBar['aircarrier']['uk'] = 0;
CountUserBar['aircarrier']['usa'] = 0;
CountUserBar['cruiser'] = [];
CountUserBar['cruiser']['count'] = 0;
CountUserBar['cruiser']['japan'] = 0;
CountUserBar['cruiser']['ussr'] = 0;
CountUserBar['cruiser']['germany'] = 0;
CountUserBar['cruiser']['uk'] = 0;
CountUserBar['cruiser']['usa'] = 0;
CountUserBar['destroyer'] = [];
CountUserBar['destroyer']['count'] = 0;
CountUserBar['destroyer']['japan'] = 0;
CountUserBar['destroyer']['ussr'] = 0;
CountUserBar['destroyer']['germany'] = 0;
CountUserBar['destroyer']['uk'] = 0;
CountUserBar['destroyer']['usa'] = 0;
for(var i = 0; i < UserBarBGData.length; i++){
var img = UserBarBGData[i].split('_');
if(img.length > 1){
for(var i_id = 1; i_id < img.length; i_id++){
if(MembersArray[0]['clan'] == null){break;}
if(img[i_id] == MembersArray[0]['clan']['clan_id']){
CountUserBar['clan']++;
CountUserBar['all']++;
}
}
}else{
CountUserBar['all']++;
var shipsBG = UserBarBGData[i].split('-');
if(shipsBG.length == 2){
CountUserBar['noclassification']++;
}else if(shipsBG.length == 3){
var type = shipsBG[1];
var nation = shipsBG[2];
CountUserBar[type]['count']++;
CountUserBar[type][nation]++;
}
}
}
var html = '' +
'<div style="width: 488px; border-bottom: 1px solid rgba(0, 0, 0, 0.7); box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05); padding: 0 0 14px; margin: 0 0 14px;">' +
localizationText['userbar-filters']+' ' +
'<select id="userbar-bg-filtr-types" name="types" style="color: black;">' +
'<option value="all">'+localizationText['filters-all']+' ('+CountUserBar['all']+')</option>' +
'<option value="clan">'+localizationText['filters-clan']+' ('+CountUserBar['clan']+')</option>' +
'<option value="noclassification">'+localizationText['filters-noclassification']+' ('+CountUserBar['noclassification']+')</option>' +
'<option value="battleship">'+localizationText['filters-battleship']+' ('+CountUserBar['battleship']['count']+')</option>' +
'<option value="aircarrier">'+localizationText['filters-aircarrier']+' ('+CountUserBar['aircarrier']['count']+')</option>' +
'<option value="cruiser">'+localizationText['filters-cruiser']+' ('+CountUserBar['cruiser']['count']+')</option>' +
'<option value="destroyer">'+localizationText['filters-destroyer']+' ('+CountUserBar['destroyer']['count']+')</option>' +
'</select>' +
'<select id="userbar-bg-filtr-nations" name="nations" style="color: black; margin-left: 10px; display: none;">' +
'<option value="japan">'+localizationText['filters-japan']+'</option>' +
'<option value="ussr">'+localizationText['filters-ussr']+'</option>' +
'<option value="germany">'+localizationText['filters-germany']+'</option>' +
'<option value="uk">'+localizationText['filters-uk']+'</option>' +
'<option value="usa">'+localizationText['filters-usa']+'</option>' +
'</select>' +
'</div>' +
'';
var check = true;
html += '<div id="userbar-bg-content" style="width: 488px; height: 429px; overflow-y: scroll;">';
for(var i = 0; i < UserBarBGData.length; i++){
var imgbgview = false;
var img = UserBarBGData[i].split('_');
if(img.length > 1){
for(var i_id = 1; i_id < img.length; i_id++){
if(MembersArray[0]['clan'] == null){break;}
if(img[i_id] == MembersArray[0]['clan']['clan_id']){
imgbgview = true;
}
}
}else{
imgbgview = true;
}
if(imgbgview){
var checked = ''; if(check){checked = 'checked="checked"'; check = false;}
html += '<input type="radio" name="userbar-bg" value="'+UserBarBGData[i]+'" '+checked+'> '+UserBarBGData[i]+'<br />';
html += '<img src="'+WoWsStatInfoHref+'bg/'+UserBarBGData[i]+'.png" title="'+UserBarBGData[i]+'"/><br /><br />';
}
}
html += '</div>';
html += '' +
'<button class="btn btn-lg btn-turqoise" id="userbar-your-background" style="margin-top: 5px; padding: 5px;">' +
localizationText['userbar-your-background'] +
'</button>' +
'';
onShowMessage(
localizationText['userbar-bg'],
html,
function(){
var userbarbg = 'userbar';
var radios = document.getElementsByName('userbar-bg');
for(var i = 0; i < radios.length; i++){
if(radios[i].checked){
userbarbg = radios[i].value;
break;
}
}
GeneratorUserBar(userbarbg);
onCloseMessage();
},
localizationText['Ok'],
true
);
jQ('#userbar-your-background').click(function(){
onCloseMessage();
var html = '' +
'<div id="userbar-bg-content" style="width: 488px; height: 220px;">' +
'<p>'+localizationText['img-max-size']+', '+localizationText['img-max-px']+', '+localizationText['img-format']+'</p>' +
'<form id="upload-myfile" name="upload-myfile">' +
'<input type="file" name="myfile" accept="image/x-png" />' +
'<button type="submit" name="submit" class="btn btn-lg btn-turqoise" id="userbar-your-background" style="margin: 5px 0px; padding: 5px;">' +
localizationText['upload-submit'] +
'</button>' +
'</form>' +
'<img id="userbar-img-upload" src="'+WoWsStatInfoHref+'bg/userbar.png" userbarbg="userbar" />' +
'</div>'+
'';
var check_upload = false;
onShowMessage(
localizationText['upload-verification'],
html,
function(){
onCloseMessage();
if(check_upload){
onShowMessage(
localizationText['Box'],
localizationText['upload-verification'],
onCloseMessage,
localizationText['Ok'],
false
);
}else{
var userbar_img_upload = document.getElementById('userbar-img-upload');
if(userbar_img_upload.getAttribute('userbarbg') != 'userbar'){
GeneratorUserBar(userbar_img_upload.getAttribute('userbarbg'));
}
}
},
localizationText['Ok'],
true
);
var img = new Image();
img.onload = function(){
var userbar_img_upload = document.getElementById('userbar-img-upload');
if(userbar_img_upload != null){
userbar_img_upload.src = WoWsStatInfoHref+'bg/user/'+MembersArray[0]['info']['account_id']+'.png'+'?'+Math.floor(Math.random()*100000001);
userbar_img_upload.setAttribute('userbarbg', 'user/'+MembersArray[0]['info']['account_id']);
}
}
img.src = WoWsStatInfoHref+'bg/user/'+MembersArray[0]['info']['account_id']+'.png'+'?'+Math.floor(Math.random()*100000001);
document.forms["upload-myfile"].onsubmit = function(e){
e.preventDefault();
check_upload = true;
function validateExtension(v){
var allowedExtensions = new Array(".png", ".PNG");
for(var ct = 0;ct < allowedExtensions.length; ct++){
sample = v.lastIndexOf(allowedExtensions[ct]);
if(sample != -1){return true;}
}
return false;
}
var file_local_link = this.elements.myfile.value;
var file = this.elements.myfile.files[0];
if(file){
if(file.size <= 153600){
var _URL = window.URL || window.webkitURL;
var img = new Image();
img.onload = function (){
if(this.width == 468 && this.height == 100){
if(validateExtension(file_local_link)){
var xmlhttp;
try{
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
}catch(e){
try{
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}catch(E){
xmlhttp = false;
}
}
if(!xmlhttp && typeof XMLHttpRequest != 'undefined'){
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onload = xmlhttp.onerror = function(){
if(this.status == 200){
console.log("upload-myfile success");
console.log(xmlhttp.responseText);
var userbar_img_upload = document.getElementById('userbar-img-upload');
if(userbar_img_upload != null){
userbar_img_upload.src = WoWsStatInfoHref+'bg/user/temp/'+MembersArray[0]['info']['account_id']+'.png'+'?'+Math.floor(Math.random()*100000001);
userbar_img_upload.setAttribute('userbarbg', 'userbar');
}
}else{
console.log("upload-myfile error " + this.status);
}
};
xmlhttp.upload.onprogress = function(event){
console.log(event.loaded + ' / ' + event.total);
}
xmlhttp.open("POST", WoWsStatInfoHref+"upload-bg.php?random="+Math.floor(Math.random()*100000001), true);
var formData = new FormData();
formData.append("myfile", file);
formData.append("account_id", MembersArray[0]['info']['account_id']);
xmlhttp.send(formData);
}else{
alert(localizationText['img-format']);
}
}else{
alert(localizationText['img-max-px']);
}
};
img.src = _URL.createObjectURL(file);
}else{
alert(localizationText['img-max-size']);
}
}
return false;
}
});
jQ('#userbar-bg-filtr-types').change(function(){
updateUserBarBG();
});
jQ('#userbar-bg-filtr-nations').change(function(){
updateUserBarBG();
});
}
function errorUserBarBG(url){
var html = '' +
'<div style="width: 488px;">' +
'<input type="radio" name="userbar-bg" value="userbar" checked="checked"> userbar<br />' +
'<img src="'+WoWsStatInfoHref+'bg/userbar.png" title="userbar"/><br /><br />' +
'</div>' +
'';
onShowMessage(
localizationText['userbar-bg'],
html,
function(){
var userbarbg = 'userbar';
var radios = document.getElementsByName('userbar-bg');
for(var i = 0; i < radios.length; i++){
if(radios[i].checked){
userbarbg = radios[i].value;
break;
}
}
GeneratorUserBar(userbarbg);
onCloseMessage();
},
localizationText['Ok'],
true
);
}
function updateUserBarBG(){
console.log('===============');
var html = '';
var userbar_bg_filtr_types = document.getElementById("userbar-bg-filtr-types");
var types = userbar_bg_filtr_types.options[userbar_bg_filtr_types.selectedIndex].value;
var userbar_bg_filtr_nations = document.getElementById("userbar-bg-filtr-nations");
var nations = userbar_bg_filtr_nations.options[userbar_bg_filtr_nations.selectedIndex].value;
if(types != 'all' && types != 'clan' && types != 'noclassification'){
userbar_bg_filtr_nations.style.display = 'inline';
for(i = 0; i < userbar_bg_filtr_nations.options.length; i++){
var nation = userbar_bg_filtr_nations.options[i].value
userbar_bg_filtr_nations.options[i].text = localizationText['filters-'+nation]+' ('+CountUserBar[types][nation]+')';
}
}else{
userbar_bg_filtr_nations.style.display = 'none';
}
var check = true;
for(var i = 0; i < UserBarBGData.length; i++){
var imgbgview = false;
var img = UserBarBGData[i].split('_');
if(img.length > 1 && types == 'clan'){
for(var i_id = 1; i_id < img.length; i_id++){
if(MembersArray[0]['clan'] == null){break;}
if(img[i_id] == MembersArray[0]['clan']['clan_id']){
imgbgview = true;
}
}
}else{
if(types == 'all'){
if(img.length > 1){
if(MembersArray[0]['clan'] !== null){
for(var i_id = 1; i_id < img.length; i_id++){
if(img[i_id] == MembersArray[0]['clan']['clan_id']){
imgbgview = true;
}
}
}
}else{
imgbgview = true;
}
}else if(types == 'noclassification'){
var shipsBG = UserBarBGData[i].split('-');
if(shipsBG.length == 2){
var noclassification = shipsBG[1];
if(types == noclassification){
imgbgview = true;
}
}
}else if(types != 'clan'){
var shipsBG = UserBarBGData[i].split('-');
if(shipsBG.length == 3){
var type = shipsBG[1];
var nation = shipsBG[2];
if(types == type && nations == nation){
imgbgview = true;
}
}
}
}
if(imgbgview){
var checked = ''; if(check){checked = 'checked="checked"'; check = false;}
html += '<input type="radio" name="userbar-bg" value="'+UserBarBGData[i]+'" '+checked+'> '+UserBarBGData[i]+'<br />';
html += '<img src="'+WoWsStatInfoHref+'bg/'+UserBarBGData[i]+'.png" title="'+UserBarBGData[i]+'"/><br /><br />';
}
}
var userbar_bg_content = document.getElementById("userbar-bg-content");
userbar_bg_content.innerHTML = html;
}
function viewChart(title, date, value){
$.plot(
'#chart_'+title,
[value],
{
series: {lines: {show: true}, points: {show: true}},
xaxis: {ticks: date},
grid: {hoverable: true, clickable: true},
colors: ['#00c0c0']
}
);
$('<div id="tooltip-chart-'+title+'"></div>').css({
position: "absolute",
display: "none",
border: "1px solid #fdd",
padding: "2px",
"background-color": "#00c0c0",
opacity: 0.80,
zIndex: 999,
color: "black"
}).appendTo("body");
$('#chart_'+title).bind("plothover", function (event, pos, item) {
if(item){
var y = item.datapoint[1].toFixed(2);
$('#tooltip-chart-'+title).html(y).css({top: item.pageY - 35, left: item.pageX - 15}).fadeIn(200);
}else{
$('#tooltip-chart-'+title).hide();
}
});
}
function getHTMLDif(value, fixed){
var text = valueFormat(value.toFixed(fixed));
var color = '#fff';
if(value > 0){
text = '+'+text;
color = 'green';
}else if(value < 0){
color = 'red';
}
return ' <span style="color: '+color+';"><sup>'+text+'</sup></span>';
}
function addStatHover(elem, type_stat_hover){
$(elem).attr('type-stat', type_stat_hover);
$(elem).hover(hoverStatIn, hoverStatOut);
var tooltip_stat = document.getElementById('tooltip-stat-'+type_stat_hover);
if(tooltip_stat == null){
$('<div id="tooltip-stat-'+type_stat_hover+'" class="tooltip tooltip-element tooltip-enabled tooltip-element-attached-top tooltip-element-attached-left tooltip-target-attached-bottom tooltip-target-attached-left"></div>').css({
width: "200px",
position: "absolute",
display: "none",
textAlign: "center",
"background-color": "#066",
padding: "0px",
top: "0",
left: "0"
}).appendTo("body");
}
}
function hoverStatIn(){
var type_stat_hover = $(this).attr('type-stat');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = this.getBoundingClientRect(),
offsetTop = elemRect.top - bodyRect.top,
offsetLeft = elemRect.left - bodyRect.left;
var offsetWidth = this.offsetWidth;
var offsetHeight = this.offsetHeight;
var paddingLeft = Number($(this).css('padding-left').replace(/[^0-9\.]+/g,""));
var paddingTop = Number($(this).css('padding-top').replace(/[^0-9\.]+/g,""));
var paddingRight = Number($(this).css('padding-bottom').replace(/[^0-9\.]+/g,""));
var paddingBottom = Number($(this).css('padding-bottom').replace(/[^0-9\.]+/g,""));
var statValue = MembersArray[0]['info']['statistics']['pvp'][type_stat_hover];
var plusValue = 0.01;
var tofixedNum = 2;
if(type_stat_hover == 'battles' || type_stat_hover.indexOf("max_") > -1){
tofixedNum = 0;
plusValue = 1;
}
var color1 = color['very_bad'];
var color2 = color['very_bad'];
var color3 = color['very_bad'];
var value1 = parseFloat(0);
var value3 = parseFloat(0);
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][5])){
color1 = color['very_good'];
color2 = color['unique'];
color3 = color['unique'];
value1 = (parseFloat(colorStat[type_stat_hover][4])).toFixed(tofixedNum);
value3 = '∞';
}
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][4])){
color1 = color['good'];
color2 = color['very_good'];
color3 = color['unique'];
value1 = (parseFloat(colorStat[type_stat_hover][3])).toFixed(tofixedNum);
value3 = (parseFloat(colorStat[type_stat_hover][4]) + plusValue).toFixed(tofixedNum);
}
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][3])){
color1 = color['normal'];
color2 = color['good'];
color3 = color['very_good'];
value1 = (parseFloat(colorStat[type_stat_hover][2])).toFixed(tofixedNum);
value3 = (parseFloat(colorStat[type_stat_hover][3]) + plusValue).toFixed(tofixedNum);
}
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][2])){
color1 = color['bad'];
color2 = color['normal'];
color3 = color['good'];
value1 = (parseFloat(colorStat[type_stat_hover][1])).toFixed(tofixedNum);
value3 = (parseFloat(colorStat[type_stat_hover][2]) + plusValue).toFixed(tofixedNum);
}
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][1])){
color1 = color['very_bad'];
color2 = color['bad'];
color3 = color['normal'];
value1 = (parseFloat(colorStat[type_stat_hover][0])).toFixed(tofixedNum);
value3 = (parseFloat(colorStat[type_stat_hover][1]) + plusValue).toFixed(tofixedNum);
}
if(parseFloat(statValue) <= parseFloat(colorStat[type_stat_hover][0])){
color1 = color['very_bad'];
color2 = color['very_bad'];
color3 = color['bad'];
value1 = (parseFloat(0)).toFixed(tofixedNum);
value3 = (parseFloat(colorStat[type_stat_hover][0]) + plusValue).toFixed(tofixedNum);
}
var next_percent_wins_html = '';
if(type_stat_hover == 'wins_percents'){
var next_percent_losses = Math.floor(100 - MembersArray[0]['info']['statistics']['pvp']['wins_percents']);
var next_percent_wins = 100 - next_percent_losses;
var next_losses_rate = next_percent_losses / 100;
var next_battles = Math.ceil(
(
(
MembersArray[0]['info']['statistics']['pvp']['battles'] - MembersArray[0]['info']['statistics']['pvp']['wins']
) / next_losses_rate
) - MembersArray[0]['info']['statistics']['pvp']['battles']
);
next_percent_wins_html = '<p class="tooltip__text" style="font-size: 14px; color: #FFF;">'+next_battles+' '+localizationText['to']+' '+next_percent_wins+'%</p>';
}
$('#tooltip-stat-'+type_stat_hover).html('' +
'<p class="tooltip__title" style="color: #FFF;">'+localizationText['info.statistics.pvp.'+type_stat_hover]+'</p>' +
'<p class="tooltip__text" style="font-size: 14px; color: #FFF;">' +
'<font color="'+color1+'">'+value1+'</font>' +
' ⇐ <font color="'+color2+'">'+(statValue).toFixed(tofixedNum)+'</font> ⇒ ' +
'<font color="'+color3+'">'+value3+'</font>' +
'</p>' +
next_percent_wins_html +
'').css({
width: offsetWidth+"px", //(offsetWidth - paddingRight - paddingLeft)
display: "block",
top: offsetTop + offsetHeight - paddingTop - paddingBottom,
left: offsetLeft //+ paddingLeft
}).fadeIn(200);
}
function hoverStatOut(){
var type_stat_hover = $(this).attr('type-stat');
$('#tooltip-stat-'+type_stat_hover).hide();
}
/* ===== UserScript function ===== */
function getImgNameToShipId(img_name){
var ShipId = null;
for(ship_id in Encyclopedia){
if(!Encyclopedia[ship_id]['name']){continue;}
if(Encyclopedia[ship_id]['images']['small'].indexOf(img_name) > -1){
ShipId = ''+ship_id+'';
break;
}
}
return ShipId;
}
function checkJson(){
var date = new Date();
var d = date.getDate();
if(d < 10){d = '0'+d;}
var m = date.getMonth(); m++;
if(m < 10){m = '0'+m;}
var y = date.getFullYear();
var numJson = y+''+m+''+d;
if(getLocalStorage('numJson', false) < numJson){
setLocalStorage('numJson', numJson, false);
getJson(WoWsStatInfoHref+'get/color.php?'+Math.floor(Math.random()*100000001), doneColorStat, errorColorStat);
getJson(WoWsStatInfoHref+'get/expships.php?'+Math.floor(Math.random()*100000001), doneExpShips, errorExpShips);
}else{
getIndexedDB('ColorStat', updateColorStat, updateColorStat);
getIndexedDB('ExpShips', updateExpShips, updateExpShips);
}
}
function doneColorStat(url, response){
setIndexedDB('ColorStat', response, updateColorStat, updateColorStat);
}
function errorColorStat(url){}
function doneExpShips(url, response){
setIndexedDB('ExpShips', response, updateExpShips, updateExpShips);
}
function updateColorStat(response){
if(response == null){
colorStat = jQ.parseJSON('{"wws":["500.00","700.00","850.00","1150.00","1450.00","99999.00"],"max_frags_battle":[4,5,6,7,8,99],"avg_planes_killed":["0.21","0.91","1.75","3.73","6.15","99.00"],"max_damage_dealt":[77615,109179,133760,178157,220578,9999999],"wr":["527.48","836.83","1081.29","1524.19","1910.92","99999.00"],"kill_dead":["0.54","0.87","1.17","1.82","2.52","99.00"],"avg_capture_points":["0.00","0.09","0.33","0.95","1.61","99.00"],"survived_battles_percents":["15.97","25.60","33.03","44.90","53.70","100.00"],"max_xp":[1640,2301,2957,4163,5075,99999],"avg_damage_dealt":["14207.06","21050.05","26617.10","37703.95","48563.25","999999.00"],"avg_dropped_capture_points":["0.00","0.50","2.14","5.63","8.39","99.00"],"max_planes_killed":[7,23,35,53,69,999],"avg_xp":["470.63","628.41","774.77","1102.47","1413.55","99999.00"],"avg_frags":["0.44","0.65","0.80","1.07","1.28","99.00"],"wins_percents":["44.81","48.64","51.33","55.83","59.87","100.00"],"battles":[256,517,1040,2699,4571,99999]}');
}else{
colorStat = response;
}
}
function updateExpShips(response){
if(response == null){
ExpShips = jQ.parseJSON('{"4292818736":{"expDamage":45846.89,"expFrags":0.72,"expPlanesKilled":2.67},"4179539408":{"expDamage":54350.69,"expFrags":0.69,"expPlanesKilled":3.04},"4293834544":{"expDamage":7527.87,"expFrags":0.59,"expPlanesKilled":0.01},"4287542992":{"expDamage":25029.87,"expFrags":0.65,"expPlanesKilled":1.53},"3552491216":{"expDamage":34824.18,"expFrags":0.62,"expPlanesKilled":1.19},"4188976592":{"expDamage":8244.48,"expFrags":0.62,"expPlanesKilled":0.01},"4077795024":{"expDamage":36220.46,"expFrags":1.04,"expPlanesKilled":0.2},"4288558800":{"expDamage":20667.01,"expFrags":0.61,"expPlanesKilled":0.43},"4289607376":{"expDamage":18888.57,"expFrags":0.59,"expPlanesKilled":0.41},"4277057520":{"expDamage":33727.89,"expFrags":0.59,"expPlanesKilled":4.19},"4276041424":{"expDamage":77239.55,"expFrags":0.85,"expPlanesKilled":3.96},"4180588336":{"expDamage":44262.19,"expFrags":0.71,"expPlanesKilled":2.9},"4180555216":{"expDamage":21272.38,"expFrags":0.65,"expPlanesKilled":0.27},"3551442640":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4264441840":{"expDamage":17327.11,"expFrags":0.55,"expPlanesKilled":0.48},"3762173136":{"expDamage":23876.83,"expFrags":0.68,"expPlanesKilled":0.63},"4187928528":{"expDamage":15053.59,"expFrags":0.64,"expPlanesKilled":0.01},"4266538992":{"expDamage":12574.8,"expFrags":0.59,"expPlanesKilled":0.02},"3767449296":{"expDamage":26816.23,"expFrags":1.0,"expPlanesKilled":0.59},"4186912560":{"expDamage":27722.81,"expFrags":0.96,"expPlanesKilled":0.04},"4293867504":{"expDamage":17028.23,"expFrags":0.61,"expPlanesKilled":0.03},"3764336464":{"expDamage":44387.8,"expFrags":0.87,"expPlanesKilled":1.83},"4184815408":{"expDamage":40207.76,"expFrags":0.92,"expPlanesKilled":1.42},"4075697872":{"expDamage":30548.77,"expFrags":0.71,"expPlanesKilled":0.15},"4182685648":{"expDamage":47774.04,"expFrags":1.17,"expPlanesKilled":1.62},"3764303216":{"expDamage":29204.01,"expFrags":0.77,"expPlanesKilled":0.77},"4183734064":{"expDamage":23366.85,"expFrags":0.65,"expPlanesKilled":0.69},"4290655952":{"expDamage":24435.88,"expFrags":0.88,"expPlanesKilled":0.1},"4291737040":{"expDamage":28218.22,"expFrags":0.84,"expPlanesKilled":1.15},"4078843600":{"expDamage":19374.34,"expFrags":0.63,"expPlanesKilled":0.3},"3767416784":{"expDamage":19125.34,"expFrags":0.82,"expPlanesKilled":0.03},"3763255280":{"expDamage":29263.89,"expFrags":0.67,"expPlanesKilled":2.53},"4182685136":{"expDamage":32155.81,"expFrags":0.75,"expPlanesKilled":1.05},"4277122768":{"expDamage":86816.17,"expFrags":1.22,"expPlanesKilled":20.7},"3764303312":{"expDamage":32009.83,"expFrags":0.77,"expPlanesKilled":1.23},"4183701200":{"expDamage":17935.99,"expFrags":0.54,"expPlanesKilled":0.26},"4179539920":{"expDamage":74968.06,"expFrags":1.29,"expPlanesKilled":7.08},"4286527184":{"expDamage":26585.86,"expFrags":0.78,"expPlanesKilled":0.17},"3768465392":{"expDamage":12452.8,"expFrags":0.82,"expPlanesKilled":0.01},"4259231440":{"expDamage":69836.84,"expFrags":0.95,"expPlanesKilled":3.51},"4184782800":{"expDamage":20177.75,"expFrags":0.61,"expPlanesKilled":0.38},"3768497968":{"expDamage":15713.83,"expFrags":0.88,"expPlanesKilled":0.01},"4180588496":{"expDamage":60564.64,"expFrags":1.11,"expPlanesKilled":5.53},"4293866960":{"expDamage":35981.47,"expFrags":1.06,"expPlanesKilled":0.04},"4076746448":{"expDamage":26178.75,"expFrags":0.65,"expPlanesKilled":0.13},"4293834736":{"expDamage":8823.65,"expFrags":0.59,"expPlanesKilled":0.01},"4289640144":{"expDamage":19028.87,"expFrags":0.55,"expPlanesKilled":0.35},"4267620048":{"expDamage":27314.07,"expFrags":1.02,"expPlanesKilled":0.88},"4288657392":{"expDamage":28691.76,"expFrags":0.54,"expPlanesKilled":12.76},"4280170480":{"expDamage":17939.83,"expFrags":0.68,"expPlanesKilled":0.37},"4286461936":{"expDamage":27638.99,"expFrags":0.8,"expPlanesKilled":0.53},"4259264496":{"expDamage":35709.72,"expFrags":0.8,"expPlanesKilled":0.96},"4256085712":{"expDamage":10241.44,"expFrags":0.75,"expPlanesKilled":0.01},"4268635856":{"expDamage":35617.79,"expFrags":1.17,"expPlanesKilled":0.01},"4185863984":{"expDamage":35538.75,"expFrags":0.93,"expPlanesKilled":1.13},"4181604048":{"expDamage":35339.28,"expFrags":0.85,"expPlanesKilled":1.52},"4182652368":{"expDamage":32411.16,"expFrags":0.74,"expPlanesKilled":0.59},"4248745968":{"expDamage":39128.92,"expFrags":1.3,"expPlanesKilled":0.26},"4258182864":{"expDamage":12513.69,"expFrags":0.58,"expPlanesKilled":0.01},"4280170192":{"expDamage":16617.05,"expFrags":1.06,"expPlanesKilled":0.01},"4185831216":{"expDamage":14712.11,"expFrags":0.5,"expPlanesKilled":0.05},"3554621136":{"expDamage":37498.99,"expFrags":0.87,"expPlanesKilled":1.5},"3763255248":{"expDamage":40936.08,"expFrags":0.96,"expPlanesKilled":2.25},"3763287856":{"expDamage":51698.75,"expFrags":1.02,"expPlanesKilled":3.14},"4291737584":{"expDamage":12849.35,"expFrags":0.72,"expPlanesKilled":0.01},"4180621104":{"expDamage":63810.81,"expFrags":0.87,"expPlanesKilled":3.55},"4286527472":{"expDamage":41574.93,"expFrags":0.76,"expPlanesKilled":1.42},"4292818896":{"expDamage":36515.83,"expFrags":0.8,"expPlanesKilled":1.59},"4282267344":{"expDamage":41318.57,"expFrags":0.78,"expPlanesKilled":0.31},"3764336624":{"expDamage":46427.42,"expFrags":0.96,"expPlanesKilled":1.17},"4181636912":{"expDamage":31128.71,"expFrags":0.59,"expPlanesKilled":2.28},"4185830864":{"expDamage":17669.92,"expFrags":0.58,"expPlanesKilled":0.09},"4280203248":{"expDamage":29199.11,"expFrags":0.57,"expPlanesKilled":2.64},"4293801680":{"expDamage":16617.05,"expFrags":1.06,"expPlanesKilled":0.01},"4247697392":{"expDamage":39128.92,"expFrags":1.3,"expPlanesKilled":0.26},"4285445840":{"expDamage":34824.18,"expFrags":0.62,"expPlanesKilled":1.19},"4279154384":{"expDamage":16073.65,"expFrags":0.64,"expPlanesKilled":0.03},"4293867216":{"expDamage":17957.87,"expFrags":0.7,"expPlanesKilled":0.06},"4283381456":{"expDamage":12589.81,"expFrags":0.7,"expPlanesKilled":0.01},"4290754544":{"expDamage":21055.63,"expFrags":0.45,"expPlanesKilled":9.32},"4286494416":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4282365648":{"expDamage":51604.26,"expFrags":0.86,"expPlanesKilled":15.22},"4288624624":{"expDamage":26419.93,"expFrags":0.64,"expPlanesKilled":0.64},"4291704528":{"expDamage":20757.98,"expFrags":0.81,"expPlanesKilled":0.08},"4182718256":{"expDamage":51037.04,"expFrags":0.95,"expPlanesKilled":3.83},"4282300400":{"expDamage":25295.92,"expFrags":0.58,"expPlanesKilled":2.03},"4183700944":{"expDamage":15877.67,"expFrags":0.56,"expPlanesKilled":0.18},"4272830448":{"expDamage":32608.92,"expFrags":0.82,"expPlanesKilled":0.98},"4269684432":{"expDamage":14806.5,"expFrags":0.67,"expPlanesKilled":0.03},"4184749776":{"expDamage":18733.89,"expFrags":0.59,"expPlanesKilled":0.4},"4290689008":{"expDamage":18571.31,"expFrags":0.71,"expPlanesKilled":0.01},"4293834192":{"expDamage":19572.89,"expFrags":0.78,"expPlanesKilled":0.04},"3553539792":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4292786160":{"expDamage":10102.59,"expFrags":0.47,"expPlanesKilled":0.01},"4284430032":{"expDamage":42830.3,"expFrags":0.75,"expPlanesKilled":1.22},"4288559088":{"expDamage":20310.32,"expFrags":0.67,"expPlanesKilled":0.25},"4185831376":{"expDamage":19670.7,"expFrags":0.71,"expPlanesKilled":0.3},"4279220208":{"expDamage":85950.95,"expFrags":1.16,"expPlanesKilled":24.96},"4288624336":{"expDamage":39506.91,"expFrags":0.85,"expPlanesKilled":0.9},"3762206512":{"expDamage":32205.65,"expFrags":0.59,"expPlanesKilled":2.77},"4282365936":{"expDamage":54414.95,"expFrags":0.89,"expPlanesKilled":15.09},"4289607664":{"expDamage":18225.46,"expFrags":0.66,"expPlanesKilled":0.37},"4281284304":{"expDamage":52935.08,"expFrags":0.84,"expPlanesKilled":2.51},"4285511376":{"expDamage":37687.86,"expFrags":0.76,"expPlanesKilled":9.88},"4182652624":{"expDamage":22842.2,"expFrags":0.64,"expPlanesKilled":0.1},"3553572560":{"expDamage":37498.99,"expFrags":0.87,"expPlanesKilled":1.5},"4293801424":{"expDamage":22704.99,"expFrags":0.81,"expPlanesKilled":0.34},"4274927600":{"expDamage":17609.08,"expFrags":0.73,"expPlanesKilled":0.03},"4288657104":{"expDamage":39217.06,"expFrags":0.87,"expPlanesKilled":7.76},"4292753392":{"expDamage":9437.7,"expFrags":0.56,"expPlanesKilled":0.01},"4180587984":{"expDamage":44589.33,"expFrags":0.72,"expPlanesKilled":3.02},"3522082512":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4273911792":{"expDamage":54868.69,"expFrags":0.87,"expPlanesKilled":5.51},"4183734224":{"expDamage":34042.99,"expFrags":0.92,"expPlanesKilled":1.12},"4276041712":{"expDamage":56386.22,"expFrags":0.77,"expPlanesKilled":4.71},"4179506640":{"expDamage":45401.88,"expFrags":0.83,"expPlanesKilled":1.06},"4181636560":{"expDamage":33455.4,"expFrags":0.66,"expPlanesKilled":2.03},"4284397008":{"expDamage":20031.99,"expFrags":0.98,"expPlanesKilled":0.01},"4282333168":{"expDamage":50300.25,"expFrags":0.79,"expPlanesKilled":4.36},"4186879440":{"expDamage":18999.18,"expFrags":0.73,"expPlanesKilled":0.01},"4186846672":{"expDamage":10610.52,"expFrags":0.54,"expPlanesKilled":0.01},"4292753104":{"expDamage":11523.09,"expFrags":0.67,"expPlanesKilled":0.01},"4277024464":{"expDamage":35617.79,"expFrags":1.17,"expPlanesKilled":0.01},"4269717488":{"expDamage":17143.86,"expFrags":0.53,"expPlanesKilled":0.14},"4292851408":{"expDamage":33893.35,"expFrags":0.8,"expPlanesKilled":6.53},"3532568272":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4186879792":{"expDamage":13964.59,"expFrags":0.59,"expPlanesKilled":0.01},"4184782640":{"expDamage":23985.69,"expFrags":0.72,"expPlanesKilled":0.33},"4292785616":{"expDamage":20031.99,"expFrags":0.98,"expPlanesKilled":0.01},"4283414224":{"expDamage":46724.74,"expFrags":0.88,"expPlanesKilled":15.05},"4281284592":{"expDamage":27729.72,"expFrags":0.8,"expPlanesKilled":0.01},"4188977104":{"expDamage":4997.58,"expFrags":0.72,"expPlanesKilled":0.01},"3555669712":{"expDamage":37498.99,"expFrags":0.87,"expPlanesKilled":1.5},"4267587280":{"expDamage":35617.79,"expFrags":1.17,"expPlanesKilled":0.01},"4284463088":{"expDamage":42711.13,"expFrags":0.76,"expPlanesKilled":15.32},"4277090288":{"expDamage":69354.56,"expFrags":0.85,"expPlanesKilled":5.0},"4288591856":{"expDamage":23240.96,"expFrags":0.69,"expPlanesKilled":3.4},"4183733712":{"expDamage":27844.52,"expFrags":0.73,"expPlanesKilled":1.01},"3763221968":{"expDamage":27362.67,"expFrags":0.76,"expPlanesKilled":0.21},"3767482160":{"expDamage":37073.93,"expFrags":1.17,"expPlanesKilled":0.1},"4287543280":{"expDamage":27100.64,"expFrags":0.77,"expPlanesKilled":2.96},"3769513264":{"expDamage":25577.8,"expFrags":0.77,"expPlanesKilled":0.17},"4181669680":{"expDamage":61285.44,"expFrags":0.96,"expPlanesKilled":3.34},"4290721776":{"expDamage":25879.61,"expFrags":0.73,"expPlanesKilled":0.56},"3543054032":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"4255037136":{"expDamage":30932.16,"expFrags":0.61,"expPlanesKilled":1.65},"3555636944":{"expDamage":32336.84,"expFrags":0.75,"expPlanesKilled":2.3},"3554555600":{"expDamage":55238.54,"expFrags":1.84,"expPlanesKilled":0.01},"4181637072":{"expDamage":48603.67,"expFrags":1.0,"expPlanesKilled":2.57},"4179539760":{"expDamage":58730.5,"expFrags":0.82,"expPlanesKilled":4.25},"3764270288":{"expDamage":23093.46,"expFrags":0.77,"expPlanesKilled":0.35},"4287510224":{"expDamage":25175.0,"expFrags":0.64,"expPlanesKilled":0.3},"4185798096":{"expDamage":12544.22,"expFrags":0.51,"expPlanesKilled":0.07},"4186879952":{"expDamage":17815.87,"expFrags":0.71,"expPlanesKilled":0.07},"4291770064":{"expDamage":20655.92,"expFrags":0.54,"expPlanesKilled":0.52},"3552523984":{"expDamage":37498.99,"expFrags":0.87,"expPlanesKilled":1.5},"3553540080":{"expDamage":54045.13,"expFrags":1.41,"expPlanesKilled":5.72},"4281219056":{"expDamage":43219.95,"expFrags":0.89,"expPlanesKilled":1.09},"4281317360":{"expDamage":71827.4,"expFrags":1.1,"expPlanesKilled":19.47},"4184782288":{"expDamage":20998.36,"expFrags":0.56,"expPlanesKilled":0.81},"3763320816":{"expDamage":45726.47,"expFrags":0.85,"expPlanesKilled":22.61},"4187895248":{"expDamage":8216.25,"expFrags":0.55,"expPlanesKilled":0.01},"3762206160":{"expDamage":33441.22,"expFrags":0.69,"expPlanesKilled":3.89},"4183766832":{"expDamage":43191.14,"expFrags":0.86,"expPlanesKilled":1.73},"4179572528":{"expDamage":85899.78,"expFrags":1.06,"expPlanesKilled":4.36},"4292851696":{"expDamage":22309.14,"expFrags":0.44,"expPlanesKilled":12.84},"4184749520":{"expDamage":15193.24,"expFrags":0.58,"expPlanesKilled":0.18},"4282300112":{"expDamage":41537.15,"expFrags":0.69,"expPlanesKilled":2.88},"4187928016":{"expDamage":12020.5,"expFrags":0.63,"expPlanesKilled":0.01},"4182685488":{"expDamage":25665.96,"expFrags":0.61,"expPlanesKilled":1.29},"4289640432":{"expDamage":24294.3,"expFrags":0.74,"expPlanesKilled":0.93},"4272895696":{"expDamage":54552.6,"expFrags":0.73,"expPlanesKilled":2.7},"4279219920":{"expDamage":73411.52,"expFrags":1.15,"expPlanesKilled":18.33},"4290688720":{"expDamage":19824.16,"expFrags":0.69,"expPlanesKilled":1.76},"4181603792":{"expDamage":21518.15,"expFrags":0.58,"expPlanesKilled":0.35},"3555670000":{"expDamage":35975.51,"expFrags":0.79,"expPlanesKilled":3.44},"4292785968":{"expDamage":13425.28,"expFrags":0.78,"expPlanesKilled":0.01},"4284364496":{"expDamage":30523.45,"expFrags":0.67,"expPlanesKilled":0.15},"4287575760":{"expDamage":37498.99,"expFrags":0.87,"expPlanesKilled":1.5},"3765351888":{"expDamage":25669.52,"expFrags":0.75,"expPlanesKilled":1.09},"4281251536":{"expDamage":21943.27,"expFrags":0.72,"expPlanesKilled":0.26}}');
}else{
ExpShips = response;
}
}
function errorExpShips(url){}
function doneAccountInfo(url, response){
if(response.status && response.status == 'error'){
errorAccountInfo(url);
return;
}
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
MembersArray[index]['info'] = response['data'][account_id];
getJson(WOWSAPI+'ships/stats/?application_id='+application_id+'&extra=pve,pvp_solo,pvp_div2,pvp_div3&account_id='+account_id+'&index='+index+'&type='+type, doneShipsStats, errorShipsStats);
}
function errorAccountInfo(url){
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
console.log('Error AccountInfo '+account_id);
if(type == 'profile'){
onShowMessage(
localizationText['Box'],
localizationText['ErrorAPI'],
onCloseMessage,
localizationText['Ok'],
false
);
}else if(type == 'clan'){
getJson(WOWSAPI+'ships/stats/?application_id='+application_id+'&extra=pve,pvp_solo,pvp_div2,pvp_div3&account_id='+account_id+'&index='+index+'&type='+type, doneShipsStats, errorShipsStats);
}
}
function doneShipsStats(url, response){
if(response.status && response.status == 'error'){
errorShipsStats(url);
return;
}
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
MembersArray[index]['ships'] = response['data'][account_id];
getJson(WOWSAPI+'account/achievements/?application_id='+application_id+'&account_id='+account_id+'&index='+index+'&type='+type, doneAchievements, errorAchievements);
}
function errorShipsStats(url){
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
console.log('Error ShipsStats '+account_id);
if(type == 'profile'){
onShowMessage(
localizationText['Box'],
localizationText['ErrorAPI'],
onCloseMessage,
localizationText['Ok'],
false
);
}
}
function doneAchievements(url, response){
if(response.status && response.status == 'error'){
errorAchievements(url);
return;
}
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
MembersArray[index]['achievements'] = response['data'][account_id];
getJson(WOWSAPI+'account/statsbydate/?application_id='+application_id+'&account_id='+account_id+'&index='+index+'&type='+type+'&dates='+getDatesList(), doneStatsbydate, errorStatsbydate);
}
function errorAchievements(url){
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
console.log('Error Achievements '+account_id);
if(type == 'profile'){
onShowMessage(
localizationText['Box'],
localizationText['ErrorAPI'],
onCloseMessage,
localizationText['Ok'],
false
);
}
}
function doneStatsbydate(url, response){
if(response.status && response.status == 'error'){
errorStatsbydate(url);
return;
}
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
MembersArray[index]['statsbydate'] = response['data'][account_id];
if(type == 'profile'){
viewMainPageProfile();
}
}
function errorStatsbydate(url){
var vars = getUrlVars(url);
var account_id = vars['account_id'];
var index = vars['index'];
var type = vars['type'];
console.log('Error Statsbydate '+account_id);
if(type == 'profile'){
onShowMessage(
localizationText['Box'],
localizationText['ErrorAPI'],
onCloseMessage,
localizationText['Ok'],
false
);
}
}
function getDatesList(){
var DatesList = '';
var today = new Date();
for(var i = 1; i <= 10; i++){
today.setDate(today.getDate() - 1);
var day = today.getDate();
var d = ''; if(day < 10){d = '0'+day+'';}else{d = ''+day+'';}
var month = today.getMonth() + 1;
var m = ''; if(month < 10){m = '0'+month+'';}else{m = ''+month+'';}
var year = today.getFullYear();
var y = ''+year+'';
DatesList += y+''+m+''+d+',';
}
return DatesList;
}
function calcStat(index){
if(MembersArray[index]['info'] == null || MembersArray[index]['ships'] == null){
MembersArray[index]['info'] = [];
MembersArray[index]['info']['last_battle_time'] = 0;
MembersArray[index]['info']['logout_at'] = 0;
MembersArray[index]['info']['ships_x_level'] = 0;
MembersArray[index]['info']['statistics'] = [];
MembersArray[index]['info']['statistics']['pvp'] = [];
MembersArray[index]['info']['statistics']['pvp']['battles'] = 0;
MembersArray[index]['info']['statistics']['pvp']['wins'] = 0;
MembersArray[index]['info']['statistics']['pvp']['losses'] = 0;
MembersArray[index]['info']['statistics']['pvp']['draws'] = 0;
MembersArray[index]['info']['statistics']['pvp']['survived_battles'] = 0;
MembersArray[index]['info']['statistics']['pvp']['survived_wins'] = 0;
MembersArray[index]['info']['statistics']['pvp']['kill_dead'] = 0;
MembersArray[index]['info']['statistics']['pvp']['xp'] = 0;
MembersArray[index]['info']['statistics']['pvp']['damage_dealt'] = 0;
MembersArray[index]['info']['statistics']['pvp']['frags'] = 0;
MembersArray[index]['info']['statistics']['pvp']['planes_killed'] = 0;
MembersArray[index]['info']['statistics']['pvp']['capture_points'] = 0;
MembersArray[index]['info']['statistics']['pvp']['dropped_capture_points'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_xp'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_damage_dealt'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_frags'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_planes_killed'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_capture_points'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_dropped_capture_points'] = 0;
MembersArray[index]['info']['statistics']['pvp']['max_xp'] = 0;
MembersArray[index]['info']['statistics']['pvp']['max_damage_dealt'] = 0;
MembersArray[index]['info']['statistics']['pvp']['max_frags_battle'] = 0;
MembersArray[index]['info']['statistics']['pvp']['max_planes_killed'] = 0;
MembersArray[index]['info']['statistics']['pvp']['wins_percents'] = 0;
MembersArray[index]['info']['statistics']['pvp']['survived_battles_percents'] = 0;
MembersArray[index]['info']['statistics']['pvp']['wr'] = 0;
MembersArray[index]['info']['statistics']['pvp']['avg_battles_level'] = 0;
MembersArray[index]['info']['statistics']['pvp']['max_ship_level'] = 0;
return false;
}
for(var t = 0; t < typeStat.length; t++){
var type = typeStat[t];
if(type == 'pvp_div' && MembersArray[index]['info']['statistics']['pvp_div'] == undefined){
MembersArray[index]['info']['statistics']['pvp_div'] = [];
if(MembersArray[index]['info']['statistics']['pvp_div2']['max_xp'] > MembersArray[index]['info']['statistics']['pvp_div3']['max_xp']){
MembersArray[index]['info']['statistics']['pvp_div']['max_xp'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_xp'];
MembersArray[index]['info']['statistics']['pvp_div']['max_xp_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_xp_ship_id'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['max_xp'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_xp'];
MembersArray[index]['info']['statistics']['pvp_div']['max_xp_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_xp_ship_id'];
}
if(MembersArray[index]['info']['statistics']['pvp_div2']['max_frags_battle'] > MembersArray[index]['info']['statistics']['pvp_div3']['max_frags_battle']){
MembersArray[index]['info']['statistics']['pvp_div']['max_frags_battle'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_frags_battle'];
MembersArray[index]['info']['statistics']['pvp_div']['max_frags_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_frags_ship_id'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['max_frags_battle'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_frags_battle'];
MembersArray[index]['info']['statistics']['pvp_div']['max_frags_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_frags_ship_id'];
}
if(MembersArray[index]['info']['statistics']['pvp_div2']['max_planes_killed'] > MembersArray[index]['info']['statistics']['pvp_div3']['max_planes_killed']){
MembersArray[index]['info']['statistics']['pvp_div']['max_planes_killed'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_planes_killed'];
MembersArray[index]['info']['statistics']['pvp_div']['max_planes_killed_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_planes_killed_ship_id'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['max_planes_killed'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_planes_killed'];
MembersArray[index]['info']['statistics']['pvp_div']['max_planes_killed_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_planes_killed_ship_id'];
}
if(MembersArray[index]['info']['statistics']['pvp_div2']['max_damage_dealt'] > MembersArray[index]['info']['statistics']['pvp_div3']['max_damage_dealt']){
MembersArray[index]['info']['statistics']['pvp_div']['max_damage_dealt'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_damage_dealt'];
MembersArray[index]['info']['statistics']['pvp_div']['max_damage_dealt_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_damage_dealt_ship_id'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['max_damage_dealt'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_damage_dealt'];
MembersArray[index]['info']['statistics']['pvp_div']['max_damage_dealt_ship_id'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_damage_dealt_ship_id'];
}
MembersArray[index]['info']['statistics']['pvp_div']['xp'] = MembersArray[index]['info']['statistics']['pvp_div2']['xp'] + MembersArray[index]['info']['statistics']['pvp_div3']['xp'];
MembersArray[index]['info']['statistics']['pvp_div']['survived_battles'] = MembersArray[index]['info']['statistics']['pvp_div2']['survived_battles'] + MembersArray[index]['info']['statistics']['pvp_div3']['survived_battles'];
MembersArray[index]['info']['statistics']['pvp_div']['dropped_capture_points'] = MembersArray[index]['info']['statistics']['pvp_div2']['dropped_capture_points'] + MembersArray[index]['info']['statistics']['pvp_div3']['dropped_capture_points'];
MembersArray[index]['info']['statistics']['pvp_div']['draws'] = MembersArray[index]['info']['statistics']['pvp_div2']['draws'] + MembersArray[index]['info']['statistics']['pvp_div3']['draws'];
MembersArray[index]['info']['statistics']['pvp_div']['wins'] = MembersArray[index]['info']['statistics']['pvp_div2']['wins'] + MembersArray[index]['info']['statistics']['pvp_div3']['wins'];
MembersArray[index]['info']['statistics']['pvp_div']['damage_dealt'] = MembersArray[index]['info']['statistics']['pvp_div2']['damage_dealt'] + MembersArray[index]['info']['statistics']['pvp_div3']['damage_dealt'];
MembersArray[index]['info']['statistics']['pvp_div']['losses'] = MembersArray[index]['info']['statistics']['pvp_div2']['losses'] + MembersArray[index]['info']['statistics']['pvp_div3']['losses'];
MembersArray[index]['info']['statistics']['pvp_div']['frags'] = MembersArray[index]['info']['statistics']['pvp_div2']['frags'] + MembersArray[index]['info']['statistics']['pvp_div3']['frags'];
MembersArray[index]['info']['statistics']['pvp_div']['capture_points'] = MembersArray[index]['info']['statistics']['pvp_div2']['capture_points'] + MembersArray[index]['info']['statistics']['pvp_div3']['capture_points'];
MembersArray[index]['info']['statistics']['pvp_div']['survived_wins'] = MembersArray[index]['info']['statistics']['pvp_div2']['survived_wins'] + MembersArray[index]['info']['statistics']['pvp_div3']['survived_wins'];
MembersArray[index]['info']['statistics']['pvp_div']['battles'] = MembersArray[index]['info']['statistics']['pvp_div2']['battles'] + MembersArray[index]['info']['statistics']['pvp_div3']['battles'];
MembersArray[index]['info']['statistics']['pvp_div']['planes_killed'] = MembersArray[index]['info']['statistics']['pvp_div2']['planes_killed'] + MembersArray[index]['info']['statistics']['pvp_div3']['planes_killed'];
}
var Statistics = MembersArray[index]['info']['statistics'][type];
var timestamp = Math.round(+new Date()/1000);
var created_at = MembersArray[index]['info']['created_at'];
var days = (timestamp - created_at)/60/60/24;
var battles_days = Statistics['battles'] / days;
MembersArray[index]['info']['statistics'][type]['battles_days'] = battles_days;
MembersArray[index]['info']['statistics'][type]['avg_xp'] = Statistics['xp'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_xp'])){MembersArray[index]['info']['statistics'][type]['avg_xp'] = 0;}
MembersArray[index]['info']['statistics'][type]['avg_damage_dealt'] = Statistics['damage_dealt'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_damage_dealt'])){MembersArray[index]['info']['statistics'][type]['avg_damage_dealt'] = 0;}
MembersArray[index]['info']['statistics'][type]['avg_frags'] = Statistics['frags'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_frags'])){MembersArray[index]['info']['statistics'][type]['avg_frags'] = 0;}
MembersArray[index]['info']['statistics'][type]['avg_planes_killed'] = Statistics['planes_killed'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_planes_killed'])){MembersArray[index]['info']['statistics'][type]['avg_planes_killed'] = 0;}
MembersArray[index]['info']['statistics'][type]['avg_capture_points'] = Statistics['capture_points'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_capture_points'])){MembersArray[index]['info']['statistics'][type]['avg_capture_points'] = 0;}
MembersArray[index]['info']['statistics'][type]['avg_dropped_capture_points'] = Statistics['dropped_capture_points'] / Statistics['battles'];
if(isNaN(MembersArray[index]['info']['statistics'][type]['avg_dropped_capture_points'])){MembersArray[index]['info']['statistics'][type]['avg_dropped_capture_points'] = 0;}
MembersArray[index]['info']['statistics'][type]['wins_percents'] = (Statistics['wins']/Statistics['battles'])*100;
if(isNaN(MembersArray[index]['info']['statistics'][type]['wins_percents'])){MembersArray[index]['info']['statistics'][type]['wins_percents'] = 0;}
MembersArray[index]['info']['statistics'][type]['survived_battles_percents'] = (Statistics['survived_battles']/Statistics['battles'])*100;
if(isNaN(MembersArray[index]['info']['statistics'][type]['survived_battles_percents'])){MembersArray[index]['info']['statistics'][type]['survived_battles_percents'] = 0;}
if(Statistics['battles'] == Statistics['survived_battles']){
MembersArray[index]['info']['statistics'][type]['kill_dead'] = Statistics['frags']/Statistics['battles'];
}else{
MembersArray[index]['info']['statistics'][type]['kill_dead'] = Statistics['frags']/(Statistics['battles']-Statistics['survived_battles']);
}
if(isNaN(MembersArray[index]['info']['statistics'][type]['kill_dead'])){MembersArray[index]['info']['statistics'][type]['kill_dead'] = 0;}
if(type != 'pvp' && type != 'pve'){
var type_start = type.split('_')[0];
MembersArray[index]['info']['statistics'][type]['battles_percents'] = (Statistics['battles']/MembersArray[index]['info']['statistics'][type_start]['battles'])*100;
if(isNaN(MembersArray[index]['info']['statistics'][type]['battles_percents'])){MembersArray[index]['info']['statistics'][type]['battles_percents'] = 0;}
}
}
MembersArray[index]['info']['ships_x_level'] = 0;
MembersArray[index]['info']['statistics']['pvp_div']['avg_battles_level'] = 0;
MembersArray[index]['info']['statistics']['pvp_div']['max_ship_level'] = 0;
for(var t = 0; t < typeStat.length; t++){
var type = typeStat[t];
MembersArray[index]['info']['statistics'][type]['avg_battles_level'] = 0;
MembersArray[index]['info']['statistics'][type]['max_ship_level'] = 0;
MembersArray[index]['info']['statistics'][type]['wr'] = 0;
var StatShips = [];
StatShips['damage_dealt'] = 0;
StatShips['frags'] = 0;
StatShips['planes_killed'] = 0;
StatShips['expDamage'] = 0;
StatShips['expFrags'] = 0;
StatShips['expPlanesKilled'] = 0;
StatShips['actual.wins'] = 0;
StatShips['actual.damage_dealt'] = 0;
StatShips['actual.frags'] = 0;
StatShips['actual.planes_killed'] = 0;
StatShips['actual.capture_points'] = 0;
StatShips['actual.dropped_capture_points'] = 0;
StatShips['expected.wins'] = 0;
StatShips['expected.damage_dealt'] = 0;
StatShips['expected.frags'] = 0;
StatShips['expected.planes_killed'] = 0;
StatShips['expected.capture_points'] = 0;
StatShips['expected.dropped_capture_points'] = 0;
var StatShipsClass = [];
for(var tS = 0; tS < typeShip.length; tS++){
var typeS = typeShip[tS];
StatShipsClass[typeS] = [];
StatShipsClass[typeS]['damage_dealt'] = 0;
StatShipsClass[typeS]['frags'] = 0;
StatShipsClass[typeS]['planes_killed'] = 0;
StatShipsClass[typeS]['expDamage'] = 0;
StatShipsClass[typeS]['expFrags'] = 0;
StatShipsClass[typeS]['expPlanesKilled'] = 0;
StatShipsClass[typeS]['actual.wins'] = 0;
StatShipsClass[typeS]['actual.damage_dealt'] = 0;
StatShipsClass[typeS]['actual.frags'] = 0;
StatShipsClass[typeS]['actual.planes_killed'] = 0;
StatShipsClass[typeS]['actual.capture_points'] = 0;
StatShipsClass[typeS]['actual.dropped_capture_points'] = 0;
StatShipsClass[typeS]['expected.wins'] = 0;
StatShipsClass[typeS]['expected.damage_dealt'] = 0;
StatShipsClass[typeS]['expected.frags'] = 0;
StatShipsClass[typeS]['expected.planes_killed'] = 0;
StatShipsClass[typeS]['expected.capture_points'] = 0;
StatShipsClass[typeS]['expected.dropped_capture_points'] = 0;
}
for(var shipI = 0; shipI < MembersArray[index]['ships'].length; shipI++){
if(type == 'pvp_div' && MembersArray[index]['ships'][shipI]['pvp_div'] == undefined){
MembersArray[index]['ships'][shipI]['pvp_div'] = [];
if(MembersArray[index]['ships'][shipI]['pvp_div2']['max_xp'] > MembersArray[index]['ships'][shipI]['pvp_div3']['max_xp']){
MembersArray[index]['ships'][shipI]['pvp_div']['max_xp'] = MembersArray[index]['ships'][shipI]['pvp_div2']['max_xp'];
}else{
MembersArray[index]['ships'][shipI]['pvp_div']['max_xp'] = MembersArray[index]['ships'][shipI]['pvp_div3']['max_xp'];
}
if(MembersArray[index]['ships'][shipI]['pvp_div2']['max_frags_battle'] > MembersArray[index]['ships'][shipI]['pvp_div3']['max_frags_battle']){
MembersArray[index]['ships'][shipI]['pvp_div']['max_frags_battle'] = MembersArray[index]['ships'][shipI]['pvp_div2']['max_frags_battle'];
}else{
MembersArray[index]['ships'][shipI]['pvp_div']['max_frags_battle'] = MembersArray[index]['ships'][shipI]['pvp_div3']['max_frags_battle'];
}
if(MembersArray[index]['ships'][shipI]['pvp_div2']['max_planes_killed'] > MembersArray[index]['ships'][shipI]['pvp_div3']['max_planes_killed']){
MembersArray[index]['ships'][shipI]['pvp_div']['max_planes_killed'] = MembersArray[index]['ships'][shipI]['pvp_div2']['max_planes_killed'];
}else{
MembersArray[index]['ships'][shipI]['pvp_div']['max_planes_killed'] = MembersArray[index]['ships'][shipI]['pvp_div3']['max_planes_killed'];
}
if(MembersArray[index]['ships'][shipI]['pvp_div2']['max_damage_dealt'] > MembersArray[index]['ships'][shipI]['pvp_div3']['max_damage_dealt']){
MembersArray[index]['ships'][shipI]['pvp_div']['max_damage_dealt'] = MembersArray[index]['ships'][shipI]['pvp_div2']['max_damage_dealt'];
}else{
MembersArray[index]['ships'][shipI]['pvp_div']['max_damage_dealt'] = MembersArray[index]['ships'][shipI]['pvp_div3']['max_damage_dealt'];
}
MembersArray[index]['ships'][shipI]['pvp_div']['xp'] = MembersArray[index]['ships'][shipI]['pvp_div2']['xp'] + MembersArray[index]['ships'][shipI]['pvp_div3']['xp'];
MembersArray[index]['ships'][shipI]['pvp_div']['survived_battles'] = MembersArray[index]['ships'][shipI]['pvp_div2']['survived_battles'] + MembersArray[index]['ships'][shipI]['pvp_div3']['survived_battles'];
MembersArray[index]['ships'][shipI]['pvp_div']['dropped_capture_points'] = MembersArray[index]['ships'][shipI]['pvp_div2']['dropped_capture_points'] + MembersArray[index]['ships'][shipI]['pvp_div3']['dropped_capture_points'];
MembersArray[index]['ships'][shipI]['pvp_div']['draws'] = MembersArray[index]['ships'][shipI]['pvp_div2']['draws'] + MembersArray[index]['ships'][shipI]['pvp_div3']['draws'];
MembersArray[index]['ships'][shipI]['pvp_div']['wins'] = MembersArray[index]['ships'][shipI]['pvp_div2']['wins'] + MembersArray[index]['ships'][shipI]['pvp_div3']['wins'];
MembersArray[index]['ships'][shipI]['pvp_div']['damage_dealt'] = MembersArray[index]['ships'][shipI]['pvp_div2']['damage_dealt'] + MembersArray[index]['ships'][shipI]['pvp_div3']['damage_dealt'];
MembersArray[index]['ships'][shipI]['pvp_div']['losses'] = MembersArray[index]['ships'][shipI]['pvp_div2']['losses'] + MembersArray[index]['ships'][shipI]['pvp_div3']['losses'];
MembersArray[index]['ships'][shipI]['pvp_div']['frags'] = MembersArray[index]['ships'][shipI]['pvp_div2']['frags'] + MembersArray[index]['ships'][shipI]['pvp_div3']['frags'];
MembersArray[index]['ships'][shipI]['pvp_div']['capture_points'] = MembersArray[index]['ships'][shipI]['pvp_div2']['capture_points'] + MembersArray[index]['ships'][shipI]['pvp_div3']['capture_points'];
MembersArray[index]['ships'][shipI]['pvp_div']['survived_wins'] = MembersArray[index]['ships'][shipI]['pvp_div2']['survived_wins'] + MembersArray[index]['ships'][shipI]['pvp_div3']['survived_wins'];
MembersArray[index]['ships'][shipI]['pvp_div']['battles'] = MembersArray[index]['ships'][shipI]['pvp_div2']['battles'] + MembersArray[index]['ships'][shipI]['pvp_div3']['battles'];
MembersArray[index]['ships'][shipI]['pvp_div']['planes_killed'] = MembersArray[index]['ships'][shipI]['pvp_div2']['planes_killed'] + MembersArray[index]['ships'][shipI]['pvp_div3']['planes_killed'];
}
var Ship = MembersArray[index]['ships'][shipI];
var ship_id = Ship['ship_id'];
var Statistics = Ship[type];
MembersArray[index]['ships'][shipI][type]['avg_xp'] = Statistics['xp'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_xp'])){MembersArray[index]['ships'][shipI][type]['avg_xp'] = 0;}
MembersArray[index]['ships'][shipI][type]['avg_damage_dealt'] = Statistics['damage_dealt'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_damage_dealt'])){MembersArray[index]['ships'][shipI][type]['avg_damage_dealt'] = 0;}
MembersArray[index]['ships'][shipI][type]['avg_frags'] = Statistics['frags'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_frags'])){MembersArray[index]['ships'][shipI][type]['avg_frags'] = 0;}
MembersArray[index]['ships'][shipI][type]['avg_planes_killed'] = Statistics['planes_killed'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_planes_killed'])){MembersArray[index]['ships'][shipI][type]['avg_planes_killed'] = 0;}
MembersArray[index]['ships'][shipI][type]['avg_capture_points'] = Statistics['capture_points'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_capture_points'])){MembersArray[index]['ships'][shipI][type]['avg_capture_points'] = 0;}
MembersArray[index]['ships'][shipI][type]['avg_dropped_capture_points'] = Statistics['dropped_capture_points'] / Statistics['battles'];
if(isNaN(MembersArray[index]['ships'][shipI][type]['avg_dropped_capture_points'])){MembersArray[index]['ships'][shipI][type]['avg_dropped_capture_points'] = 0;}
MembersArray[index]['ships'][shipI][type]['wins_percents'] = (Statistics['wins']/Statistics['battles'])*100;
if(isNaN(MembersArray[index]['ships'][shipI][type]['wins_percents'])){MembersArray[index]['ships'][shipI][type]['wins_percents'] = 0;}
MembersArray[index]['ships'][shipI][type]['survived_battles_percents'] = (Statistics['survived_battles']/Statistics['battles'])*100;
if(isNaN(MembersArray[index]['ships'][shipI][type]['survived_battles_percents'])){MembersArray[index]['ships'][shipI][type]['survived_battles_percents'] = 0;}
if(Statistics['battles'] == Statistics['survived_battles']){
MembersArray[index]['ships'][shipI][type]['kill_dead'] = Statistics['frags']/Statistics['battles'];
}else{
MembersArray[index]['ships'][shipI][type]['kill_dead'] = Statistics['frags']/(Statistics['battles']-Statistics['survived_battles']);
}
if(isNaN(MembersArray[index]['ships'][shipI][type]['kill_dead'])){MembersArray[index]['ships'][shipI][type]['kill_dead'] = 0;}
if(Encyclopedia != null && Encyclopedia[ship_id] !== undefined){
var ship_type = Encyclopedia[ship_id]['type'];
var ship_tier = Encyclopedia[ship_id]['tier'];
if(ExpShips[ship_id] !== undefined){
var battles = Statistics['battles'];
var damage_dealt = Statistics['damage_dealt'];
var frags = Statistics['frags'];
var planes_killed = Statistics['planes_killed'];
var StatShip = [];
StatShip['damage_dealt'] = damage_dealt;
StatShip['frags'] = frags;
StatShip['planes_killed'] = planes_killed;
StatShip['expDamage'] = battles * ExpShips[ship_id]['expDamage'];
StatShip['expFrags'] = battles * ExpShips[ship_id]['expFrags'];
StatShip['expPlanesKilled'] = battles * ExpShips[ship_id]['expPlanesKilled'];
MembersArray[index]['ships'][shipI][type]['wr'] = calcWR(StatShip);
StatShipsClass[ship_type]['damage_dealt'] += damage_dealt;
StatShipsClass[ship_type]['frags'] += frags;
StatShipsClass[ship_type]['planes_killed'] += planes_killed;
StatShipsClass[ship_type]['expDamage'] += StatShip['expDamage'];
StatShipsClass[ship_type]['expFrags'] += StatShip['expFrags'];
StatShipsClass[ship_type]['expPlanesKilled'] += StatShip['expPlanesKilled'];
StatShips['damage_dealt'] += damage_dealt;
StatShips['frags'] += frags;
StatShips['planes_killed'] += planes_killed;
StatShips['expDamage'] += StatShip['expDamage'];
StatShips['expFrags'] += StatShip['expFrags'];
StatShips['expPlanesKilled'] += StatShip['expPlanesKilled'];
}else{
MembersArray[index]['ships'][shipI][type]['wr'] = 0;
}
if(Statistics['battles'] > 0){
MembersArray[index]['info']['statistics'][type]['avg_battles_level'] += ship_tier * Statistics['battles'] / MembersArray[index]['info']['statistics'][type]['battles'];
}
if(Encyclopedia[ship_id]['tier'] == 10 && type == 'pvp'){
MembersArray[index]['info']['ships_x_level']++;
}
if(MembersArray[index]['info']['statistics'][type]['max_ship_level'] < Encyclopedia[ship_id]['tier']){
MembersArray[index]['info']['statistics'][type]['max_ship_level'] = Encyclopedia[ship_id]['tier'];
}
}
}
for(var tS = 0; tS < typeShip.length; tS++){
var typeS = typeShip[tS];
MembersArray[index]['info']['statistics'][type]['wr_'+typeS] = calcWR(StatShipsClass[typeS]);
}
MembersArray[index]['info']['statistics'][type]['wr'] = calcWR(StatShips);
}
if(MembersArray[index]['info']['statistics']['pvp_div2']['avg_battles_level'] > MembersArray[index]['info']['statistics']['pvp_div3']['avg_battles_level']){
MembersArray[index]['info']['statistics']['pvp_div']['avg_battles_level'] = MembersArray[index]['info']['statistics']['pvp_div2']['avg_battles_level'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['avg_battles_level'] = MembersArray[index]['info']['statistics']['pvp_div3']['avg_battles_level'];
}
if(MembersArray[index]['info']['statistics']['pvp_div2']['max_ship_level'] > MembersArray[index]['info']['statistics']['pvp_div3']['max_ship_level']){
MembersArray[index]['info']['statistics']['pvp_div']['max_ship_level'] = MembersArray[index]['info']['statistics']['pvp_div2']['max_ship_level'];
}else{
MembersArray[index]['info']['statistics']['pvp_div']['max_ship_level'] = MembersArray[index]['info']['statistics']['pvp_div3']['max_ship_level'];
}
for(var key in MembersArray[index]['achievements']['battle']){
var battle = MembersArray[index]['info']['statistics']['pvp']['battles'];
var achievements = MembersArray[index]['achievements']['battle'];
MembersArray[index]['achievements']['battle'][key+'_battle'] = (battle / achievements[key]).toFixed(0);
}
if(MembersArray[index]['statsbydate'] !== undefined && MembersArray[index]['statsbydate'] != null){
for(var date in MembersArray[index]['statsbydate']['pvp']){
MembersArray[index]['statsbydate']['pvp'][date]['avg_xp'] = MembersArray[index]['statsbydate']['pvp'][date]['xp'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_xp'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_xp'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['avg_damage_dealt'] = MembersArray[index]['statsbydate']['pvp'][date]['damage_dealt'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_damage_dealt'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_damage_dealt'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['avg_frags'] = MembersArray[index]['statsbydate']['pvp'][date]['frags'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_frags'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_frags'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['avg_planes_killed'] = MembersArray[index]['statsbydate']['pvp'][date]['planes_killed'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_planes_killed'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_planes_killed'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['avg_capture_points'] = MembersArray[index]['statsbydate']['pvp'][date]['capture_points'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_capture_points'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_capture_points'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['avg_dropped_capture_points'] = MembersArray[index]['statsbydate']['pvp'][date]['dropped_capture_points'] / MembersArray[index]['statsbydate']['pvp'][date]['battles'];
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['avg_dropped_capture_points'])){MembersArray[index]['statsbydate']['pvp'][date]['avg_dropped_capture_points'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['wins_percents'] = (MembersArray[index]['statsbydate']['pvp'][date]['wins']/MembersArray[index]['statsbydate']['pvp'][date]['battles'])*100;
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['wins_percents'])){MembersArray[index]['statsbydate']['pvp'][date]['wins_percents'] = 0;}
MembersArray[index]['statsbydate']['pvp'][date]['survived_battles_percents'] = (MembersArray[index]['statsbydate']['pvp'][date]['survived_battles']/MembersArray[index]['statsbydate']['pvp'][date]['battles'])*100;
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['survived_battles_percents'])){MembersArray[index]['statsbydate']['pvp'][date]['survived_battles_percents'] = 0;}
if(MembersArray[index]['statsbydate']['pvp'][date]['battles'] == MembersArray[index]['statsbydate']['pvp'][date]['survived_battles']){
MembersArray[index]['statsbydate']['pvp'][date]['kill_dead'] = MembersArray[index]['statsbydate']['pvp'][date]['frags']/MembersArray[index]['statsbydate']['pvp'][date]['battles'];
}else{
MembersArray[index]['statsbydate']['pvp'][date]['kill_dead'] = MembersArray[index]['statsbydate']['pvp'][date]['frags']/(MembersArray[index]['statsbydate']['pvp'][date]['battles']-MembersArray[index]['statsbydate']['pvp'][date]['survived_battles']);
}
if(isNaN(MembersArray[index]['statsbydate']['pvp'][date]['kill_dead'])){MembersArray[index]['statsbydate']['pvp'][date]['kill_dead'] = 0;}
}
var today = new Date();
var day = today.getDate();
var d = ''; if(day < 10){d = '0'+day+'';}else{d = ''+day+'';}
var month = today.getMonth() + 1;
var m = ''; if(month < 10){m = '0'+month+'';}else{m = ''+month+'';}
var year = today.getFullYear();
var y = ''+year+'';
var lastDate = parseInt(y+''+m+''+d);
if(MembersArray[index]['statsbydate']['pvp'] == null){MembersArray[index]['statsbydate']['pvp'] = {};}
MembersArray[index]['statsbydate']['pvp'][lastDate]= {};
MembersArray[index]['statsbydate']['pvp'][lastDate]['date'] = ''+lastDate+'';
MembersArray[index]['statsbydate']['pvp'][lastDate]['battles'] = MembersArray[index]['info']['statistics']['pvp']['battles'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_xp'] = MembersArray[index]['info']['statistics']['pvp']['avg_xp'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_damage_dealt'] = MembersArray[index]['info']['statistics']['pvp']['avg_damage_dealt'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_frags'] = MembersArray[index]['info']['statistics']['pvp']['avg_frags'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_planes_killed'] = MembersArray[index]['info']['statistics']['pvp']['avg_planes_killed'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_capture_points'] = MembersArray[index]['info']['statistics']['pvp']['avg_capture_points'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['avg_dropped_capture_points'] = MembersArray[index]['info']['statistics']['pvp']['avg_dropped_capture_points'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['wins_percents'] = MembersArray[index]['info']['statistics']['pvp']['wins_percents'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['survived_battles_percents'] = MembersArray[index]['info']['statistics']['pvp']['survived_battles_percents'];
MembersArray[index]['statsbydate']['pvp'][lastDate]['kill_dead'] = MembersArray[index]['info']['statistics']['pvp']['kill_dead'];
}
return true;
}
function calcWR(Stat){
var rDamage = Stat['damage_dealt'] / Stat['expDamage']; if(isNaN(rDamage)){rDamage = 0;}
var rFrags = Stat['frags'] / Stat['expFrags']; if(isNaN(rFrags)){rFrags = 0;}
var rPlanesKilled = Stat['planes_killed'] / Stat['expPlanesKilled']; if(isNaN(rPlanesKilled)){rPlanesKilled = 0;}
var rDamagec = Math.max(0, (rDamage - 0.25) / (1 - 0.25));
var rFragsc = Math.max(0, Math.min(rDamagec + 0.2, (rFrags - 0.12) / (1 - 0.12)));
var rPlanesKilledc = Math.max(0, Math.min(rDamagec + 0.1, (rPlanesKilled - 0.15) / (1 - 0.15)));
var wr = 650 * rDamagec + 150 * rFragsc * rDamagec + 80 * rPlanesKilledc;
if(isNaN(wr)){wr = 0;}
return wr;
}
function doneGlossary(url, response){
if(response.status && response.status == "error"){
errorGlossary();
return;
}
Glossary = response['data'];
}
function errorGlossary(url){
Glossary = null;
console.log('Get Glossary Error');
}
function doneEncyclopedia(url, response){
if(response.status && response.status == "error"){
errorEncyclopedia();
return;
}
var vars = getUrlVars(url);
var page_no = vars['page_no'];
if(Encyclopedia == null){
Encyclopedia = response['data'];
}else{
Encyclopedia = Object.assign(Encyclopedia, response['data']);
}
Encyclopedia['null'] = [];
Encyclopedia['null']['name'] = '';
page = response['meta']['page'];
page_total = response['meta']['page_total'];
if(page < page_total){
var page_json = page + 1;
getJson(WOWSAPI+'encyclopedia/ships/?application_id='+application_id+'&fields=name,images,tier,nation,is_premium,images,type&page_no='+page_json, doneEncyclopedia, errorEncyclopedia);
}
}
function errorEncyclopedia(url){
Encyclopedia = null;
console.log('Get Encyclopedia Error');
}
function findColorASC(value, stat_type, type){
if(colorStat[stat_type] === undefined){
return '';
}
if(type == 'main'){
if(isNaN(value) || parseFloat(value) <= parseFloat(colorStat[stat_type][0])){
return color['very_bad'];
}else if(parseFloat(value) <= parseFloat(colorStat[stat_type][1])){
return color['bad'];
}else if(parseFloat(value) <= parseFloat(colorStat[stat_type][2])){
return color['normal'];
}else if(parseFloat(value) <= parseFloat(colorStat[stat_type][3])){
return color['good'];
}else if(parseFloat(value) <= parseFloat(colorStat[stat_type][4])){
return color['very_good'];
}else if(parseFloat(value) <= parseFloat(colorStat[stat_type][5])){
return color['unique'];
}else{
return color['very_bad'];
}
}else{
return '';
}
}
function findColorDESC(value, stat_type, type){
if(type == 'main'){
var return_color = color['very_bad'];
if(isNaN(value)){
return_color = color['very_bad'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][0])){
return_color = color['very_bad'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][1])){
return_color = color['bad'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][2])){
return_color = color['normal'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][3])){
return_color = color['good'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][4])){
return_color = color['very_good'];
}
if(parseFloat(value) <= parseFloat(colorStat[stat_type][5])){
return_color = color['unique'];
}
return return_color;
}else{
return '';
}
}
function ASC(a){
return function (b, c){
if(a == 'account_name'){
return b[a].toLowerCase() < c[a].toLowerCase() ? -1 : b[a].toLowerCase() > c[a].toLowerCase() ? 1 : 0;
}else if(a == 'role_i18n'){
a = 'role_sort_num';
return parseFloat(b[a]) < parseFloat(c[a]) ? -1 : parseFloat(b[a]) > parseFloat(c[a]) ? 1 : 0;
}else{
var attr = a.split('.');
for(var i = 0; i < attr.length; i++){
b = b[attr[i]];
c = c[attr[i]];
}
return parseFloat(b) < parseFloat(c) ? -1 : parseFloat(b) > parseFloat(c) ? 1 : 0;
}
}
};
function DESC(a){
return function (b, c){
if(a == 'account_name'){
return b[a].toLowerCase() > c[a].toLowerCase() ? -1 : b[a].toLowerCase() < c[a].toLowerCase() ? 1 : 0;
}else if(a == 'role_i18n'){
a = 'role_sort_num';
return parseFloat(b[a]) > parseFloat(c[a]) ? -1 : parseFloat(b[a]) < parseFloat(c[a]) ? 1 : 0;
}else{
var attr = a.split('.');
for(var i = 0; i < attr.length; i++){
b = b[attr[i]];
c = c[attr[i]];
}
return parseFloat(b) > parseFloat(c) ? -1 : parseFloat(b) < parseFloat(c) ? 1 : 0;
}
}
};
function valueFormat(value){
if(isInt(value)){value = value.toString();}
var newValue = '';
var valueSplit = value.split('.');
var numChar = 0;
for(var i = valueSplit[0].length; i > 0; i--){
if(numChar < 3){
newValue = valueSplit[0].substr(i - 1, 1)+''+newValue;
numChar++;
}else{
newValue = valueSplit[0].substr(i - 1, 1)+''+localizationText['num-separator']+''+newValue;
numChar = 1;
}
}
if(valueSplit.length > 1){newValue += localizationText['num-fractional']+''+valueSplit[1];}
return newValue;
}
function isInt(value){
return !isNaN(value) && (function(x){return (x | 0) === x;})(parseFloat(value));
}
function htmlParseMemberStatistic(element){
var value = element.textContent.trim().replace(new RegExp(' ', 'g'), '');
value = value.replace(/[^0-9,.()% ]/g, "");
value = value.replace('%', '');
value = value.split(localizationText['num-separator']).join('');
value = value.replace(localizationText['num-fractional'], '.');
if(value.indexOf('(') > -1 && value.indexOf(')') > -1){
value = (value.split('('))[0];
}
return value;
}
function getJson(url, onDone, onError){
if(MaxProcess > Process){
Process++;
jQ.getJSON(url).done(function(result){
Process--;
onDone(url, result);
}).fail(function(jqxhr, textStatus, error){
Process--;
onError(url);
});
}else{
setTimeout(function(){getJson(url, onDone, onError);}, 1000);
}
}
function getApplicationId(){
return '7149a13b5f5fb7109c5b2400d31b7d42'.split("").reverse().join("");
}
function getUrlVars(url){
var vars = {};
var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value){
vars[key] = value;
});
return vars;
}
function TimeToDate(time){
var date = new Date(time * 1000);
var seconds = date.getSeconds();
var minutes = date.getMinutes();
var hour = date.getHours();
var day = date.getDate();
var month = (date.getMonth() + 1);
var year = date.getFullYear();
if(seconds < 10){
seconds = '0'+seconds;
}
if(minutes < 10){
minutes = '0'+minutes;
}
if(hour < 10){
hour = '0'+hour;
}
if(day < 10){
day = '0'+day;
}
if(month < 10){
month = '0'+month;
}
return day+'.'+month+'.'+year+' '+hour+':'+minutes;
}
function dateDiffInDays(a, b){
var date1 = new Date(a);
var date2 = new Date(b);
if(b == null){
date2 = new Date();
}
var timeDiff = date2.getTime() - date1.getTime();
var diffDays = timeDiff / (1000 * 3600 * 24);
if(diffDays < 0){diffDays = 0;}
return (diffDays).toFixed(0);
}
function getUserScriptDeveloperBlock(){
var html = '' +
'<div class="div-link-block">' +
'<span id="userscriptwowsstatinfo" class="link-block hide-block">' +
'UserScript WoWsStatInfo ' + VersionWoWsStatInfo +
'<div class="icon-link-block"></div>'+
'</span>' +
'</div>' +
'<div id="userscript-block" class="userscriptwowsstatinfo hide-block" style="text-align: center;">' +
'<span class="userscript-developer" align="center">' +
localizationText['userscript-developer'] +
' <a target="_blank" style="color: #658C4C; font-weight: bold; border-bottom: 1px dotted #658C4C;" href="https://worldofwarships.ru/community/accounts/635939-/">Vov_chiK</a> ' +
localizationText['userscript-alliance'] +
' <a target="_blank" style="color: #2CA8C7; font-weight: bold; border-bottom: 1px dotted #2CA8C7;" href="http://ru.wargaming.net/clans/wot/search/#wgsearch&search=Walkure&type=clans&offset=0&limit=10">Walkure</a>,' +
' '+localizationText['userscript-support'] +
' <a target="_blank" href="'+WoWsStatInfoHref+'">vzhabin.ru</a>' +
'<br /><br />' +
localizationText['userscript-topic']+' '+
'<a target="_blank" href="'+WoWsStatInfoLink+'">' +
WoWsStatInfoLinkName +
'</a>' +
'<br /><br />' +
'<font style="font-size: 16px; color: #658C4C;">'+localizationText['userscript-developer-support']+'</font><br />'+
'<font style="color: #2CA8C7;">Web-Money WMR</font> R295712009837 <br />'+
'<font style="color: #2CA8C7;">Web-Money WMZ</font> Z226959724402 <br />'+
'<font style="color: #2CA8C7;">Yandex Money</font> 41001290117791 <br />'+
'<font style="color: #2CA8C7;">RBK Money</font> RU353257918 <br />'+
'</span>' +
'</div>' +
'';
return html;
}
function onViewBlock(element){
if(null != element.getAttribute('id')){
var viewId = element.getAttribute('id');
var viewClassLink = element.getAttribute('class');
var viewBlock = document.getElementsByClassName(viewId)[0];
if(viewClassLink == 'link-block hide-block'){
element.setAttribute('class', 'link-block show-block');
viewBlock.setAttribute('class', viewBlock.getAttribute('class').replace('hide-block', 'show-block'));
setLocalStorage(viewId, 'show', false);
}else{
element.setAttribute('class', 'link-block hide-block');
viewBlock.setAttribute('class', viewBlock.getAttribute('class').replace('show-block', 'hide-block'));
setLocalStorage(viewId, 'hide', false);
}
}
}
function checkLocalStorage(){
try{
return 'localStorage' in window && window['localStorage'] !== null;
}catch (e){
return false;
}
}
function setLocalStorage(key, value, allPageHost){
if(checkLocalStorage()){
if(allPageHost){key = key+ClanId;}
window.localStorage.setItem(key, value);
}else{
setCookie(key, value, allPageHost);
}
}
function getLocalStorage(key, allPageHost){
var value = null;
if(checkLocalStorage()){
if(allPageHost){key = key+ClanId;}
value = window.localStorage.getItem(key);
}else{
value = getCookie(key);
}
return value;
}
function setCookie(c_name, value, allPageHost){
var exdate = new Date();
exdate.setDate(exdate.getDate() + 365);
if(allPageHost){
var c_value = escape(value) + ((365 == null) ? "" : "; expires="+exdate.toUTCString()+"; domain=" +window.location.hostname+"; path=/");
document.cookie = c_name + "=" + c_value;
}else{
var c_value = escape(value) + ((365 == null) ? "" : "; expires="+exdate.toUTCString());
document.cookie = c_name + "=" + c_value;
}
}
function getCookie(c_name){
var c_value = document.cookie;
var c_start = c_value.indexOf(" " + c_name + "=");
if(c_start == -1){
c_start = c_value.indexOf(c_name + "=");
}
if(c_start == -1){
c_value = null;
}else{
c_start = c_value.indexOf("=", c_start) + 1;
var c_end = c_value.indexOf(";", c_start);
if(c_end == -1){
c_end = c_value.length;
}
c_value = unescape(c_value.substring(c_start,c_end));
}
return c_value;
}
var WoWsStatInfoBase;
function openIndexedDB(){
//indexedDB.deleteDatabase('WoWsStatInfoBase');
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB || window.OIndexedDB;
var openRequest = indexedDB.open("WoWsStatInfoBase", 1);
openRequest.onupgradeneeded = function(e){
console.log('IndexedDB onupgradeneeded');
var thisDB = e.target.result;
if(!thisDB.objectStoreNames.contains("WoWsStatInfoStore")){
thisDB.createObjectStore("WoWsStatInfoStore");
}
};
openRequest.onsuccess = function(e){
console.log('IndexedDB onsuccess');
WoWsStatInfoBase = e.target.result;
};
openRequest.onerror = function(e){
console.log('IndexedDB onerror');
console.log(e);
WoWsStatInfoBase = null;
};
}
function setIndexedDB(Key, Value, Done, Error){
if(WoWsStatInfoBase === undefined){
openIndexedDB();
setTimeout(function(){setIndexedDB(Key, Value, Done, Error);}, 2000);
}else if(WoWsStatInfoBase == null){
/* IndexedDB onerror */
}else{
var transaction = WoWsStatInfoBase.transaction(["WoWsStatInfoStore"], "readwrite");
var store = transaction.objectStore("WoWsStatInfoStore");
var request = store.put(Value, Key);
request.onerror = function(e){
console.log('onerror setIndexedDB...Key '+Key);
Error(Value);
};
request.onsuccess = function(e){
console.log('onsuccess setIndexedDB...Key '+Key);
Done(Value);
};
}
}
function getIndexedDB(Key, Done, Error){
if(WoWsStatInfoBase === undefined){
openIndexedDB();
setTimeout(function(){getIndexedDB(Key, Done, Error);}, 2000);
}else if(WoWsStatInfoBase == null){
/* IndexedDB onerror */
}else{
var transaction = WoWsStatInfoBase.transaction(["WoWsStatInfoStore"], "readonly");
var store = transaction.objectStore("WoWsStatInfoStore");
var request = store.get(Key);
request.onerror = function(e){
console.log('onerror getIndexedDB...Key '+Key);
Error(null);
};
request.onsuccess = function(e){
console.log('onsuccess getIndexedDB...Key '+Key);
Done(request.result ? request.result : null);
};
}
}
function delIndexedDB(Key){
if(WoWsStatInfoBase === undefined){
openIndexedDB();
setTimeout(function(){delIndexedDB(Key);}, 2000);
}else if(WoWsStatInfoBase == null){
/* IndexedDB onerror */
}else{
var transaction = WoWsStatInfoBase.transaction(["WoWsStatInfoStore"], "readwrite");
var store = transaction.objectStore("WoWsStatInfoStore");
store.delete(Key);
console.log('delIndexedDB...Key '+Key);
}
}
function onShowMessage(title, content, funcOk, OkText, viewCancel){
var ui_dialog_title = message.getElementsByClassName("wsi-ui-dialog-title")[0];
ui_dialog_title.innerHTML = title;
var popup = message.getElementsByClassName("wsi-popup")[0];
popup.innerHTML = content;
var button_inner = message.getElementsByClassName("wsi-button_inner")[0];
button_inner.innerHTML = OkText;
var link__cancel = message.getElementsByClassName("wsi-link__cancel")[0];
if(viewCancel){
link__cancel.style.display = 'inline';
}else{
link__cancel.style.display = 'none';
}
message.style.display = 'block';
messagebg.style.display = 'block';
message.style.marginLeft = '-'+(message.offsetWidth / 2)+'px';
//message.style.top = (window.scrollY + ((document.body.offsetHeight / 2) - (message.offsetHeight / 2)))+'px';
message.style.top = (window.scrollY + 50)+'px';
jQ('#userscript-message-ok').unbind('click');
jQ('#userscript-message-ok').click(funcOk);
jQ('#userscript-message-close').unbind('click');
jQ('#userscript-message-close').click(function(){onCloseMessage();});
jQ('#userscript-message-cancel').unbind('click');
jQ('#userscript-message-cancel').click(function(){onCloseMessage();});
}
function onCloseMessage(){
message.style.display = 'none';
messagebg.style.display = 'none';
}
function getLevelText(level){
if(1 == level){
return 'I';
}else if(2 == level){
return 'II';
}else if(3 == level){
return 'III';
}else if(4 == level){
return 'IV';
}else if(5 == level){
return 'V';
}else if(6 == level){
return 'VI';
}else if(7 == level){
return 'VII';
}else if(8 == level){
return 'VIII';
}else if(9 == level){
return 'IX';
}else if(10 == level){
return 'X';
}
return '-';
}
// Modify JSON.stringify to allow recursive and single-level arrays
(function(){
// Convert array to object
var convArrToObj = function(array){
var thisEleObj = new Object();
if(typeof array == "object"){
for(var i in array){
var thisEle = convArrToObj(array[i]);
thisEleObj[i] = thisEle;
}
}else {
thisEleObj = array;
}
return thisEleObj;
};
var oldJSONStringify = JSON.stringify;
JSON.stringify = function(input){
return oldJSONStringify(convArrToObj(input));
};
})();
function getRoleText(role){
var roleText = role;
if(localizationText[role] !== undefined){roleText = localizationText[role];}
return roleText;
}
function getRoleSortNum(role){
if (role == 'commander') return 0;
else if (role == 'executive_officer') return 1;
else if (role == 'personnel_officer') return 2;
else if (role == 'combat_officer') return 3;
else if (role == 'intelligence_officer') return 4;
else if (role == 'quartermaster') return 5;
else if (role == 'recruitment_officer') return 6;
else if (role == 'junior_officer') return 7;
else if (role == 'private') return 8;
else if (role == 'recruit') return 9;
else if (role == 'reservist') return 10;
else return 11;
}
function getlocalizationText(lang){
var localizationText = [];
{/* Русский */
localizationText['ru'] = [];
localizationText['ru']['num-separator'] = ' ';
localizationText['ru']['num-fractional'] = ',';
localizationText['ru']['Box'] = 'Оповещение';
localizationText['ru']['Ok'] = 'Ok';
localizationText['ru']['Cancel'] = 'Отмена';
localizationText['ru']['NewVersion'] = 'Вышла новая версия скрипта';
localizationText['ru']['NewUpdate'] = 'Пожалуйста, обновите скрипт';
localizationText['ru']['ErrorScript'] = 'Во время работы UserScript WoWsStatInfo '+VersionWoWsStatInfo+', возникла ошибка:';
localizationText['ru']['ErrorSendDeveloper'] = 'Сообщите об ошибке разработчику скрипта.';
localizationText['ru']['ErrorAPI'] = 'Не удалось получить данные.<br />Cуществует проблема в работе WG API.<br />Попробуйте обновить страницу или зайти позднее.';
localizationText['ru']['userscript-developer'] = 'Разработчик UserScript WoWsStatInfo:';
localizationText['ru']['userscript-alliance'] = 'член альянса';
localizationText['ru']['userscript-support'] = 'при поддержки проекта';
localizationText['ru']['userscript-topic'] = 'Тема на форуме:';
localizationText['ru']['userscript-developer-support'] = 'Поддержать автора скрипта:';
localizationText['ru']['search-clan-forum'] = 'Поиск клана...';
localizationText['ru']['profile-wows'] = 'Профиль в World of Warships';
localizationText['ru']['profile-clan'] = 'Клан';
localizationText['ru']['forum-profile'] = 'Профиль на форуме';
localizationText['ru']['role'] = 'Должность';
localizationText['ru']['clan-day'] = 'Количество дней в клане';
localizationText['ru']['charts'] = 'Диаграммы';
localizationText['ru']['generator-userbar'] = 'Создать подпись';
localizationText['ru']['userbar-bg'] = 'Выберите фон:';
localizationText['ru']['userbar-filters'] = 'Фильтр:';
localizationText['ru']['filters-all'] = 'Все';
localizationText['ru']['filters-clan'] = 'Клан';
localizationText['ru']['filters-noclassification'] = 'Нет классификации';
localizationText['ru']['filters-battleship'] = 'Линкоры';
localizationText['ru']['filters-aircarrier'] = 'Авианосцы';
localizationText['ru']['filters-cruiser'] = 'Крейсеры';
localizationText['ru']['filters-destroyer'] = 'Эсминцы';
localizationText['ru']['filters-japan'] = 'Япония';
localizationText['ru']['filters-ussr'] = 'CCCP';
localizationText['ru']['filters-germany'] = 'Германия';
localizationText['ru']['filters-uk'] = 'Великобритания';
localizationText['ru']['filters-usa'] = 'США';
localizationText['ru']['userbar-your-background'] = 'Загрузить свой фон';
localizationText['ru']['upload-submit'] = 'Загрузить';
localizationText['ru']['img-max-size'] = 'Максимальный размер: 150КБ';
localizationText['ru']['img-max-px'] = 'Разрешение изображения: 468х100';
localizationText['ru']['img-format'] = 'Формат: PNG';
localizationText['ru']['upload-verification'] = 'Фон будет обновлен после проверки.';
localizationText['ru']['pvp_solo'] = 'Соло';
localizationText['ru']['pvp_div'] = 'Отряд';
localizationText['ru']['title_battles'] = 'Количество боёв';
localizationText['ru']['title_wins_percents'] = 'Процент побед';
localizationText['ru']['title_avg_xp'] = 'Средний опыт за бой';
localizationText['ru']['title_avg_damage_dealt'] = 'Средний нанесённый урон за бой';
localizationText['ru']['title_kill_dead'] = 'Отношение уничтожил / убит';
localizationText['ru']['title_wr'] = 'WR';
localizationText['ru']['title_avg_battles_level'] = 'Средний уровень кораблей игрока в боях';
localizationText['ru']['title_avg_frags'] = 'Средние Уничтожено кораблей за бой';
localizationText['ru']['title_avg_planes_killed'] = 'Средние Уничтожено самолётов за бой';
localizationText['ru']['stat-table-1'] = 'Общие результаты';
localizationText['ru']['battles'] = 'Бои';
localizationText['ru']['wins'] = 'Победы';
localizationText['ru']['survived_battles'] = 'Выжил в боях';
localizationText['ru']['damage_dealt'] = 'Нанесённый урон';
localizationText['ru']['frags'] = 'Уничтожено кораблей';
localizationText['ru']['planes_killed'] = 'Уничтожено самолётов';
localizationText['ru']['capture_points'] = 'Захват базы';
localizationText['ru']['dropped_capture_points'] = 'Защита базы';
localizationText['ru']['stat-table-2'] = 'Средние показатели за бой';
localizationText['ru']['avg_xp'] = 'Опыт';
localizationText['ru']['avg_damage_dealt'] = 'Нанесённый урон';
localizationText['ru']['avg_frags'] = 'Уничтожено кораблей';
localizationText['ru']['avg_planes_killed'] = 'Уничтожено самолётов';
localizationText['ru']['avg_capture_points'] = 'Захват базы';
localizationText['ru']['avg_dropped_capture_points'] = 'Защита базы';
localizationText['ru']['stat-table-3'] = 'Рекордные показатели';
localizationText['ru']['max_xp'] = 'Опыт';
localizationText['ru']['max_damage_dealt'] = 'Нанесённый урон';
localizationText['ru']['max_frags_battle'] = 'Уничтожено кораблей';
localizationText['ru']['max_planes_killed'] = 'Уничтожено самолётов';
localizationText['ru']['stat-table-4'] = 'Дополнительные результаты';
localizationText['ru']['battles_days'] = 'Количество боев в день';
localizationText['ru']['max_ship_level'] = 'Максимальный уровень корабля';
localizationText['ru']['avg_battles_level'] = 'Средний уровень кораблей игрока в боях';
localizationText['ru']['number-ships-x'] = 'Количество кораблей 10 уровня';
localizationText['ru']['wr'] = 'WR';
localizationText['ru']['ships_stat'] = 'Расширенная статистика по технике';
localizationText['ru']['title_ships'] = 'Корабли';
localizationText['ru']['battleship'] = 'Линкоры';
localizationText['ru']['aircarrier'] = 'Авианосцы';
localizationText['ru']['cruiser'] = 'Крейсеры';
localizationText['ru']['destroyer'] = 'Эсминцы';
localizationText['ru']['block-link-clan-member-history'] = 'Блок "Изменений в составе клана"';
localizationText['ru']['link-clan-member-history'] = 'Изменения в составе клана';
localizationText['ru']['member-history-clear'] = 'Очистить историю';
localizationText['ru']['member-history-join'] = 'Вступил в клан %NAME%';
localizationText['ru']['member-history-leave'] = 'Покинул клан %NAME%';
localizationText['ru']['member-history-rename'] = '%OLDNAME% сменил ник на %NEWNAME%';
localizationText['ru']['member-history-rerole'] = '%NAME% сменил должность %OLDROLE% ⇒ %NEWROLE%';
localizationText['ru']['member-history-notchange'] = 'С момента установки скрипта WoWsStatInfo и последнего захода на страницу, изменений в составе клана не производились.';
localizationText['ru']['banned'] = 'Забанен';
localizationText['ru']['commander'] = 'Командующий';
localizationText['ru']['executive_officer'] = 'Заместитель командующего';
localizationText['ru']['personnel_officer'] = 'Офицер штаба';
localizationText['ru']['intelligence_officer'] = 'Офицер разведки';
localizationText['ru']['quartermaster'] = 'Офицер снабжения';
localizationText['ru']['recruitment_officer'] = 'Офицер по кадрам';
localizationText['ru']['junior_officer'] = 'Младший офицер';
localizationText['ru']['combat_officer'] = 'Командир подразделения';
localizationText['ru']['private'] = 'Боец';
localizationText['ru']['recruit'] = 'Новобранец';
localizationText['ru']['reservist'] = 'Резервист';
localizationText['ru']['get-settings-button'] = 'Настройка';
localizationText['ru']['set-settings-default'] = 'Настройки по умолчанию';
localizationText['ru']['table-setting-caption'] = 'Отображать в таблице "Статистика клана"';
localizationText['ru']['table-setting-structure'] = 'Порядок столбцов в таблице';
localizationText['ru']['statistic-clan-button-0'] = 'Статистика клана';
localizationText['ru']['statistic-clan-button-1'] = 'Состав клана';
localizationText['ru']['statistic-clan-load-text'] = 'Пожалуйста, подождите ...<br />Получение статистики состава';
localizationText['ru']['statistic-load-text-lost'] = '<br />Осталось ≈';
localizationText['ru']['statistic-load-text-min'] = 'мин.';
localizationText['ru']['statistic-load-text-sec'] = 'сек.';
localizationText['ru']['account_name'] = 'Имя игрока';
localizationText['ru']['role_i18n'] = 'Должность';
localizationText['ru']['clan_days'] = 'Дней в клане';
localizationText['ru']['info.last_battle_time'] = 'Время последнего боя';
localizationText['ru']['info.logout_at'] = 'Время окончания сессии';
localizationText['ru']['info.statistics.pvp.battles'] = 'Проведено боёв';
localizationText['ru']['info.statistics.pvp.wins'] = 'Победы';
localizationText['ru']['info.statistics.pvp.losses'] = 'Поражения';
localizationText['ru']['info.statistics.pvp.draws'] = 'Ничьи';
localizationText['ru']['info.statistics.pvp.survived_battles'] = 'Выжил в боях';
localizationText['ru']['info.statistics.pvp.survived_wins'] = 'Выжил в боях и победил';
localizationText['ru']['info.statistics.pvp.kill_dead'] = 'Уничтожил / Убит';
localizationText['ru']['info.statistics.pvp.xp'] = 'Суммарный опыт';
localizationText['ru']['info.statistics.pvp.damage_dealt'] = 'Нанесено дамага';
localizationText['ru']['info.statistics.pvp.frags'] = 'Потоплено кораблей';
localizationText['ru']['info.statistics.pvp.planes_killed'] = 'Уничтожено самолётов';
localizationText['ru']['info.statistics.pvp.capture_points'] = 'Очки захвата базы';
localizationText['ru']['info.statistics.pvp.dropped_capture_points'] = 'Очки защиты базы';
localizationText['ru']['info.statistics.pvp.avg_xp'] = 'Ср. опыт';
localizationText['ru']['info.statistics.pvp.avg_damage_dealt'] = 'Ср. урон';
localizationText['ru']['info.statistics.pvp.avg_frags'] = 'Ср. потоплено кораблей';
localizationText['ru']['info.statistics.pvp.avg_planes_killed'] = 'Ср. уничтожено самолётов';
localizationText['ru']['info.statistics.pvp.avg_capture_points'] = 'Ср. захвата базы';
localizationText['ru']['info.statistics.pvp.avg_dropped_capture_points'] = 'Ср. защиты базы';
localizationText['ru']['info.statistics.pvp.max_xp'] = 'Максимальный опыт';
localizationText['ru']['info.statistics.pvp.max_damage_dealt'] = 'Максимальный урон';
localizationText['ru']['info.statistics.pvp.max_frags_battle'] = 'Максимально потоплено кораблей';
localizationText['ru']['info.statistics.pvp.max_planes_killed'] = 'Максимально уничтожено самолётов';
localizationText['ru']['info.statistics.pvp.wins_percents'] = 'Процент побед';
localizationText['ru']['info.statistics.pvp.survived_battles_percents'] = 'Процент выживания';
localizationText['ru']['info.statistics.pvp.wr'] = 'WR';
localizationText['ru']['info.ships_x_level'] = '10 lvl';
localizationText['ru']['achieve_counter_1'] = 'количество полученных наград';
localizationText['ru']['achieve_counter_2'] = 'частота получения наград, количество боев необходимых для получения награды';
localizationText['ru']['to'] = 'до';
}
{/* English */
localizationText['en'] = [];
localizationText['en'] = jQ.extend([], localizationText['ru']);
localizationText['en']['num-separator'] = ',';
localizationText['en']['num-fractional'] = '.';
localizationText['en']['Box'] = 'Notification';
localizationText['en']['Ok'] = 'Ok';
localizationText['en']['Cancel'] = 'Cancel';
localizationText['en']['NewVersion'] = 'New version was released';
localizationText['en']['NewUpdate'] = 'Please, update the extension';
localizationText['en']['ErrorScript'] = 'An error occurred while running UserScript WoWsStatInfo '+VersionWoWsStatInfo+', script:';
localizationText['en']['ErrorSendDeveloper'] = 'Please, inform script developer about this error.';
localizationText['en']['ErrorAPI'] = 'Failed to get the data.<br />There exists a problem in the work of WG API.<br />Try refreshing the page, or go later.';
localizationText['en']['userscript-developer'] = 'Developer - UserScript WoWsStatInfo:';
localizationText['en']['userscript-alliance'] = 'аlliance member';
localizationText['en']['userscript-support'] = 'with the support of';
localizationText['en']['userscript-topic'] = 'Forum topic:';
localizationText['en']['userscript-developer-support'] = 'Ways to support the developer:';
localizationText['en']['search-clan-forum'] = 'Clan Search...';
localizationText['en']['profile-wows'] = 'World of Warships profile';
localizationText['en']['profile-clan'] = 'Clan';
localizationText['en']['forum-profile'] = 'Forum profile';
localizationText['en']['role'] = 'Alliance rank';
localizationText['en']['clan-day'] = 'Days in clan';
localizationText['en']['charts'] = 'Charts';
localizationText['en']['generator-userbar'] = 'Create signature';
localizationText['en']['userbar-bg'] = 'Choose a background:';
localizationText['en']['userbar-filters'] = 'Filters:';
localizationText['en']['filters-all'] = 'All';
localizationText['en']['filters-clan'] = 'Clan';
localizationText['en']['filters-noclassification'] = 'No Classification';
localizationText['en']['filters-battleship'] = 'Battleships';
localizationText['en']['filters-aircarrier'] = 'Aircraft carriers';
localizationText['en']['filters-cruiser'] = 'Cruisers';
localizationText['en']['filters-destroyer'] = 'Destroyers';
localizationText['en']['filters-japan'] = 'Japan';
localizationText['en']['filters-ussr'] = 'U.S.S.R.';
localizationText['en']['filters-germany'] = 'Germany';
localizationText['en']['filters-uk'] = 'U.K.';
localizationText['en']['filters-usa'] = 'U.S.A.';
localizationText['en']['userbar-your-background'] = 'Upload your background';
localizationText['en']['upload-submit'] = 'Upload';
localizationText['en']['img-max-size'] = 'Maximum size: 150 KB';
localizationText['en']['img-max-px'] = 'Image Resolution: 468x100';
localizationText['en']['img-format'] = 'Format: PNG';
localizationText['en']['upload-verification'] = 'Background will be updated after verification.';
localizationText['en']['pvp_solo'] = 'Solo';
localizationText['en']['pvp_div'] = 'Division';
localizationText['en']['title_battles'] = 'Battles Fought';
localizationText['en']['title_wins_percents'] = 'Victories / Battles';
localizationText['en']['title_avg_xp'] = 'AVERAGE EXPERIENCE PER BATTLE';
localizationText['en']['title_avg_damage_dealt'] = 'Average Damage Caused per Battle';
localizationText['en']['title_kill_dead'] = 'Kill / Death Ratio';
localizationText['en']['title_wr'] = 'WR';
localizationText['en']['title_avg_battles_level'] = 'Average tier of warships used by player';
localizationText['en']['title_avg_frags'] = 'Average Destroyed ships for battle';
localizationText['en']['title_avg_planes_killed'] = 'Average Destroyed aircraft for battle';
localizationText['en']['stat-table-1'] = 'Overall Results';
localizationText['en']['battles'] = 'Battles';
localizationText['en']['wins'] = 'Victories';
localizationText['en']['survived_battles'] = 'Battles survived';
localizationText['en']['damage_dealt'] = 'Damage caused';
localizationText['en']['frags'] = 'Warships destroyed';
localizationText['en']['planes_killed'] = 'Aircraft destroyed';
localizationText['en']['capture_points'] = 'Base capture';
localizationText['en']['dropped_capture_points'] = 'Base defense';
localizationText['en']['stat-table-2'] = 'Average Score per Battle';
localizationText['en']['avg_xp'] = 'Experience';
localizationText['en']['avg_damage_dealt'] = 'Damage caused';
localizationText['en']['avg_frags'] = 'Warships destroyed';
localizationText['en']['avg_planes_killed'] = 'Aircraft destroyed';
localizationText['en']['avg_capture_points'] = 'Base capture';
localizationText['en']['avg_dropped_capture_points'] = 'Base defense';
localizationText['en']['stat-table-3'] = 'Highest Score';
localizationText['en']['max_xp'] = 'Experience';
localizationText['en']['max_damage_dealt'] = 'Damage caused';
localizationText['en']['max_frags_battle'] = 'Warships destroyed';
localizationText['en']['max_planes_killed'] = 'Aircraft destroyed';
localizationText['en']['stat-table-4'] = 'Additional Results';
localizationText['en']['battles_days'] = 'Battles per day';
localizationText['en']['max_ship_level'] = 'The maximum tier of ship';
localizationText['en']['avg_battles_level'] = 'Average tier of warships used by player';
localizationText['en']['number-ships-x'] = 'Number of X Tier ships';
localizationText['en']['wr'] = 'WR';
localizationText['en']['ships_stat'] = 'Detailed Warship Statistics';
localizationText['en']['title_ships'] = 'Warships';
localizationText['en']['battleship'] = 'Battleships';
localizationText['en']['aircarrier'] = 'Aircraft carriers';
localizationText['en']['cruiser'] = 'Cruisers';
localizationText['en']['destroyer'] = 'Destroyers';
localizationText['en']['block-link-clan-member-history'] = '"Changes in clan members" section';
localizationText['en']['link-clan-member-history'] = 'Changes in clan members';
localizationText['en']['member-history-clear'] = 'Clear history';
localizationText['en']['member-history-join'] = 'Entered %NAME% clan';
localizationText['en']['member-history-leave'] = 'Left %NAME% clan';
localizationText['en']['member-history-rename'] = '%OLDNAME% has changed his nickname to %NEWNAME%';
localizationText['en']['member-history-rerole'] = '%NAME% has changed his position in clan rank: %OLDROLE% ⇒ %NEWROLE%';
localizationText['en']['member-history-notchange'] = 'Since installing WoWsStatInfo script and last entering on this page no changes in clan members were made.';
localizationText['en']['banned'] = 'Banned';
localizationText['en']['commander'] = 'Commander';
localizationText['en']['executive_officer'] = 'Executive Officer';
localizationText['en']['personnel_officer'] = 'Personnel Officer';
localizationText['en']['intelligence_officer'] = 'Intelligence Officer';
localizationText['en']['quartermaster'] = 'Quartermaster';
localizationText['en']['recruitment_officer'] = 'Recruitment Officer';
localizationText['en']['junior_officer'] = 'Junior Officer';
localizationText['en']['combat_officer'] = 'Combat Officer';
localizationText['en']['private'] = 'Private';
localizationText['en']['recruit'] = 'Recruit';
localizationText['en']['reservist'] = 'Reservist';
localizationText['en']['get-settings-button'] = 'Settings';
localizationText['en']['set-settings-default'] = 'The default settings';
localizationText['en']['table-setting-caption'] = 'View column table "Clan Statistics"';
localizationText['en']['table-setting-structure'] = 'Sort column table';
localizationText['en']['statistic-clan-button-0'] = 'Clan Statistics';
localizationText['en']['statistic-clan-button-1'] = 'Clan Composition';
localizationText['en']['statistic-clan-load-text'] = 'Please wait ...<br />Getting statistics';
localizationText['en']['statistic-load-text-lost'] = '<br />time remaining ≈';
localizationText['en']['statistic-load-text-min'] = 'min.';
localizationText['en']['statistic-load-text-sec'] = 'sec.';
localizationText['en']['account_name'] = 'Player name';
localizationText['en']['role_i18n'] = 'Role';
localizationText['en']['clan_days'] = 'Days in clan';
localizationText['en']['info.last_battle_time'] = 'Last battle time';
localizationText['en']['info.logout_at'] = 'End time of last game session';
localizationText['en']['info.statistics.pvp.battles'] = 'Battles';
localizationText['en']['info.statistics.pvp.wins'] = 'Victories';
localizationText['en']['info.statistics.pvp.losses'] = 'Defeats';
localizationText['en']['info.statistics.pvp.draws'] = 'Draws';
localizationText['en']['info.statistics.pvp.survived_battles'] = 'Battles survived';
localizationText['en']['info.statistics.pvp.survived_wins'] = 'Victories in battles survived';
localizationText['en']['info.statistics.pvp.kill_dead'] = 'Kill / Death';
localizationText['en']['info.statistics.pvp.xp'] = 'Total Experience';
localizationText['en']['info.statistics.pvp.damage_dealt'] = 'Damage caused';
localizationText['en']['info.statistics.pvp.frags'] = 'Warships destroyed';
localizationText['en']['info.statistics.pvp.planes_killed'] = 'Aircraft destroyed';
localizationText['en']['info.statistics.pvp.capture_points'] = 'Base capture points';
localizationText['en']['info.statistics.pvp.dropped_capture_points'] = 'Base defense points';
localizationText['en']['info.statistics.pvp.avg_xp'] = 'Avg experience';
localizationText['en']['info.statistics.pvp.avg_damage_dealt'] = 'Avg Damage caused';
localizationText['en']['info.statistics.pvp.avg_frags'] = 'Avg warships destroyed';
localizationText['en']['info.statistics.pvp.avg_planes_killed'] = 'Avg aircraft destroyed';
localizationText['en']['info.statistics.pvp.avg_capture_points'] = 'Avg Base capture';
localizationText['en']['info.statistics.pvp.avg_dropped_capture_points'] = 'Avg Base defense';
localizationText['en']['info.statistics.pvp.max_xp'] = 'Maximum experience';
localizationText['en']['info.statistics.pvp.max_damage_dealt'] = 'Maximum Damage caused';
localizationText['en']['info.statistics.pvp.max_frags_battle'] = 'Maximum warships destroyed';
localizationText['en']['info.statistics.pvp.max_planes_killed'] = 'Maximum aircraft destroyed';
localizationText['en']['info.statistics.pvp.wins_percents'] = 'Percent of victories';
localizationText['en']['info.statistics.pvp.survived_battles_percents'] = 'Percent of survived';
localizationText['en']['info.statistics.pvp.wr'] = 'WR';
localizationText['en']['info.ships_x_level'] = '10 lvl';
localizationText['en']['achieve_counter_1'] = 'the number of awards received';
localizationText['en']['achieve_counter_2'] = 'the frequency of receiving awards, the number of battles needed for award';
localizationText['en']['to'] = 'to';
}
{/* Français */
localizationText['fr'] = [];
localizationText['fr'] = jQ.extend([], localizationText['en']);
localizationText['fr']['num-separator'] = ' ';
localizationText['fr']['num-fractional'] = ',';
localizationText['fr']['pvp_solo'] = 'Solo';
localizationText['fr']['pvp_div'] = 'Division';
localizationText['fr']['title_battles'] = 'Batailles menées';
localizationText['fr']['title_wins_percents'] = 'Taux de victoires/batailles';
localizationText['fr']['title_avg_xp'] = 'EXPÉRIENCE MOYENNE PAR BATAILLE';
localizationText['fr']['title_avg_damage_dealt'] = 'Dégâts moyens causés par bataille';
localizationText['fr']['title_kill_dead'] = 'Taux des tués/morts';
localizationText['fr']['title_wr'] = 'WR';
localizationText['fr']['title_avg_battles_level'] = 'Niveau moyen de navires de guerre utilisée par le joueur';
localizationText['fr']['title_avg_frags'] = 'Navires détruits moyennes pour la bataille';
localizationText['fr']['title_avg_planes_killed'] = 'Avions détruits moyenne pour la lutte';
localizationText['fr']['stat-table-1'] = 'Résultats généraux';
localizationText['fr']['battles'] = 'Batailles';
localizationText['fr']['wins'] = 'Victoires';
localizationText['fr']['survived_battles'] = 'Batailles survécues';
localizationText['fr']['damage_dealt'] = 'Dégâts occasionnés';
localizationText['fr']['frags'] = 'Navires de guerre détruits';
localizationText['fr']['planes_killed'] = 'Avions détruits';
localizationText['fr']['capture_points'] = 'Points de capture';
localizationText['fr']['dropped_capture_points'] = 'Points de défense';
localizationText['fr']['stat-table-2'] = 'Score moyen par bataille';
localizationText['fr']['avg_xp'] = 'Expérience';
localizationText['fr']['avg_damage_dealt'] = 'Dégâts occasionnés';
localizationText['fr']['avg_frags'] = 'Navires de guerre détruits';
localizationText['fr']['avg_planes_killed'] = 'Avions détruits';
localizationText['fr']['avg_capture_points'] = 'Points de capture';
localizationText['fr']['avg_dropped_capture_points'] = 'Points de défense';
localizationText['fr']['stat-table-3'] = 'Score record';
localizationText['fr']['max_xp'] = 'Expérience';
localizationText['fr']['max_damage_dealt'] = 'Dégâts occasionnés';
localizationText['fr']['max_frags_battle'] = 'Navires de guerre détruits';
localizationText['fr']['max_planes_killed'] = 'Avions détruits';
localizationText['fr']['stat-table-4'] = 'Résultats supplémentaires';
localizationText['fr']['battles_days'] = 'Batailles par jour';
localizationText['fr']['max_ship_level'] = 'Le niveau maximum de navire';
localizationText['fr']['avg_battles_level'] = 'Niveau moyen de navires de guerre utilisée par le joueur';
localizationText['fr']['number-ships-x'] = 'Nombre de navires X Tier';
localizationText['fr']['wr'] = 'WR';
localizationText['fr']['ships_stat'] = 'Statistiques détaillées du navire';
localizationText['fr']['title_ships'] = 'Navires de guerre';
localizationText['fr']['battleship'] = 'Cuirassés';
localizationText['fr']['aircarrier'] = 'Porte-avions';
localizationText['fr']['cruiser'] = 'Croiseurs';
localizationText['fr']['destroyer'] = 'Destroyers';
}
{/* Deutsch */
localizationText['de'] = [];
localizationText['de'] = jQ.extend([], localizationText['en']);
localizationText['de']['num-separator'] = '.';
localizationText['de']['num-fractional'] = ',';
localizationText['de']['pvp_solo'] = 'Solo';
localizationText['de']['pvp_div'] = 'Division';
localizationText['de']['title_battles'] = 'Gekämpfte Gefechte';
localizationText['de']['title_wins_percents'] = 'Verhältnis Siege/Gefechte';
localizationText['de']['title_avg_xp'] = 'MITTLERE ERFAHRUNG JE GEFECHT';
localizationText['de']['title_avg_damage_dealt'] = 'Mittlerer verursachter Schaden je Gefecht';
localizationText['de']['title_kill_dead'] = 'Verhältnis Abschüsse/Verluste';
localizationText['de']['title_wr'] = 'WR';
localizationText['de']['title_avg_battles_level'] = 'Durchschnittliche Tier von Kriegsschiffen durch Spieler verwendet';
localizationText['de']['title_avg_frags'] = 'Durchschnittlich zerstörte Schiffe zum Kampf';
localizationText['de']['title_avg_planes_killed'] = 'Durchschnittlich zerstörte Flugzeug für den Kampf';
localizationText['de']['stat-table-1'] = 'Gesamtergebnisse';
localizationText['de']['battles'] = 'Gefechte';
localizationText['de']['wins'] = 'Siege';
localizationText['de']['survived_battles'] = 'Überlebte Gefechte';
localizationText['de']['damage_dealt'] = 'Schaden verursacht';
localizationText['de']['frags'] = 'Zerstörte Kriegsschiffe';
localizationText['de']['planes_killed'] = 'Flugzeuge abgeschossen';
localizationText['de']['capture_points'] = 'Basiseroberung';
localizationText['de']['dropped_capture_points'] = 'Basisverteidigung';
localizationText['de']['stat-table-2'] = 'Mittlere Punktzahl je Gefecht';
localizationText['de']['avg_xp'] = 'Erfahrung';
localizationText['de']['avg_damage_dealt'] = 'Schaden verursacht';
localizationText['de']['avg_frags'] = 'Zerstörte Kriegsschiffe';
localizationText['de']['avg_planes_killed'] = 'Flugzeuge abgeschossen';
localizationText['de']['avg_capture_points'] = 'Basiseroberung';
localizationText['de']['avg_dropped_capture_points'] = 'Basisverteidigung';
localizationText['de']['stat-table-3'] = 'Rekordpunktzahl';
localizationText['de']['max_xp'] = 'Erfahrung';
localizationText['de']['max_damage_dealt'] = 'Schaden verursacht';
localizationText['de']['max_frags_battle'] = 'Zerstörte Kriegsschiffe';
localizationText['de']['max_planes_killed'] = 'Flugzeuge abgeschossen';
localizationText['de']['stat-table-4'] = 'Weitere Ergebnisse';
localizationText['de']['battles_days'] = 'Battles pro Tag';
localizationText['de']['max_ship_level'] = 'Die maximale Stufe der Schiffs';
localizationText['de']['avg_battles_level'] = 'Durchschnittliche Tier von Kriegsschiffen durch Spieler verwendet';
localizationText['de']['number-ships-x'] = 'Anzahl der X Tier Schiffe';
localizationText['de']['wr'] = 'WR';
localizationText['de']['ships_stat'] = 'Detaillierte Schiffstatistik';
localizationText['de']['title_ships'] = 'Kriegsschiffe';
localizationText['de']['battleship'] = 'Schlachtschiffe';
localizationText['de']['aircarrier'] = 'Flugzeugträger';
localizationText['de']['cruiser'] = 'Kreuzer';
localizationText['de']['destroyer'] = 'Zerstörer';
}
{/* Türkçe */
localizationText['tr'] = [];
localizationText['tr'] = jQ.extend([], localizationText['en']);
localizationText['tr']['num-separator'] = '.';
localizationText['tr']['num-fractional'] = ',';
localizationText['tr']['pvp_solo'] = 'Solo';
localizationText['tr']['pvp_div'] = 'Bölünme';
localizationText['tr']['title_battles'] = 'Katılınan Savaşlar';
localizationText['tr']['title_wins_percents'] = 'Zaferler/Savaşlar';
localizationText['tr']['title_avg_xp'] = 'SAVAŞ BAŞINA ORTALAMA DENEYİM';
localizationText['tr']['title_avg_damage_dealt'] = 'Savaş Başına Ortalama Verilen Hasar';
localizationText['tr']['title_kill_dead'] = 'Yok Etme/Ölüm Oranı';
localizationText['tr']['title_wr'] = 'WR';
localizationText['tr']['title_avg_battles_level'] = 'Oyuncu tarafından kullanılan savaş gemilerinin ortalama katmanlı';
localizationText['tr']['title_avg_frags'] = 'Savaş için ortalama yıkılan gemiler';
localizationText['tr']['title_avg_planes_killed'] = 'Mücadele için ortalama tahrip uçaklar';
localizationText['tr']['stat-table-1'] = 'Genel Sonuçlar';
localizationText['tr']['battles'] = 'Savaşlar';
localizationText['tr']['wins'] = 'Zaferler';
localizationText['tr']['survived_battles'] = 'Canlı kalınan savaşlar';
localizationText['tr']['damage_dealt'] = 'Verilen hasar';
localizationText['tr']['frags'] = 'Yok edilen savaş gemileri';
localizationText['tr']['planes_killed'] = 'Yok edilen uçak';
localizationText['tr']['capture_points'] = 'Üs işgali';
localizationText['tr']['dropped_capture_points'] = 'Üs savunması';
localizationText['tr']['stat-table-2'] = 'Savaş Başına Ortalama Skor';
localizationText['tr']['avg_xp'] = 'Deneyim';
localizationText['tr']['avg_damage_dealt'] = 'Verilen hasar';
localizationText['tr']['avg_frags'] = 'Yok edilen savaş gemileri';
localizationText['tr']['avg_planes_killed'] = 'Yok edilen uçak';
localizationText['tr']['avg_capture_points'] = 'Üs işgali';
localizationText['tr']['avg_dropped_capture_points'] = 'Üs savunması';
localizationText['tr']['stat-table-3'] = 'En Yüksek Skor';
localizationText['tr']['max_xp'] = 'Deneyim';
localizationText['tr']['max_damage_dealt'] = 'Verilen hasar';
localizationText['tr']['max_frags_battle'] = 'Yok edilen savaş gemileri';
localizationText['tr']['max_planes_killed'] = 'Yok edilen uçak';
localizationText['tr']['stat-table-4'] = 'Ek Sonuçlar';
localizationText['tr']['battles_days'] = 'Günde Savaşları';
localizationText['tr']['max_ship_level'] = 'Geminin maksimum katmanlı';
localizationText['tr']['avg_battles_level'] = 'Oyuncu tarafından kullanılan savaş gemilerinin ortalama katmanlı';
localizationText['tr']['number-ships-x'] = 'X Tier gemilerin sayısı';
localizationText['tr']['wr'] = 'WR';
localizationText['tr']['ships_stat'] = 'Detaylı Gemi İstatistikleri';
localizationText['tr']['title_ships'] = 'Savaş Gemileri';
localizationText['tr']['battleship'] = 'Zırhlılar';
localizationText['tr']['aircarrier'] = 'Uçak gemileri';
localizationText['tr']['cruiser'] = 'Kruvazörler';
localizationText['tr']['destroyer'] = 'Muhripler';
}
{/* Español EU */
localizationText['es'] = [];
localizationText['es'] = jQ.extend([], localizationText['en']);
localizationText['es']['num-separator'] = '.';
localizationText['es']['num-fractional'] = ',';
localizationText['es']['pvp_solo'] = 'Solo';
localizationText['es']['pvp_div'] = 'División';
localizationText['es']['title_battles'] = 'Batallas jugadas';
localizationText['es']['title_wins_percents'] = 'Victorias/batallas';
localizationText['es']['title_avg_xp'] = 'EXPERIENCIA MEDIA POR BATALLA';
localizationText['es']['title_avg_damage_dealt'] = 'Daño medio causado por batalla';
localizationText['es']['title_kill_dead'] = 'Tasa muertos/muertes';
localizationText['es']['title_wr'] = 'WR';
localizationText['es']['title_avg_battles_level'] = 'Niveles promedio de los buques de guerra utilizado por jugador';
localizationText['es']['title_avg_frags'] = 'Promedio de barcos destruidos para la batalla';
localizationText['es']['title_avg_planes_killed'] = 'Aviones promedio destruido por la lucha';
localizationText['es']['stat-table-1'] = 'Resultados generales';
localizationText['es']['battles'] = 'Batallas';
localizationText['es']['wins'] = 'Victorias';
localizationText['es']['survived_battles'] = 'Batallas como superviviente';
localizationText['es']['damage_dealt'] = 'Daño causado';
localizationText['es']['frags'] = 'Barcos de guerra destruidos';
localizationText['es']['planes_killed'] = 'Aviones destruidos';
localizationText['es']['capture_points'] = 'Captura de base';
localizationText['es']['dropped_capture_points'] = 'Defensa de base';
localizationText['es']['stat-table-2'] = 'Puntuación media por batalla';
localizationText['es']['avg_xp'] = 'Experiencia';
localizationText['es']['avg_damage_dealt'] = 'Daño causado';
localizationText['es']['avg_frags'] = 'Barcos de guerra destruidos';
localizationText['es']['avg_planes_killed'] = 'Aviones destruidos';
localizationText['es']['avg_capture_points'] = 'Captura de base';
localizationText['es']['avg_dropped_capture_points'] = 'Defensa de base';
localizationText['es']['stat-table-3'] = 'En Yüksek Skor';
localizationText['es']['max_xp'] = 'Experiencia';
localizationText['es']['max_damage_dealt'] = 'Daño causado';
localizationText['es']['max_frags_battle'] = 'Barcos de guerra destruidos';
localizationText['es']['max_planes_killed'] = 'Aviones destruidos';
localizationText['es']['stat-table-4'] = 'Resultados adicionales';
localizationText['es']['battles_days'] = 'Batallas por día';
localizationText['es']['max_ship_level'] = 'El nivel máximo de la nave';
localizationText['es']['avg_battles_level'] = 'Niveles promedio de los buques de guerra utilizado por jugador';
localizationText['es']['number-ships-x'] = 'Número de buques de Nivel X';
localizationText['es']['wr'] = 'WR';
localizationText['es']['ships_stat'] = 'Estadísticas detalladas del barco';
localizationText['es']['title_ships'] = 'Barcos';
localizationText['es']['battleship'] = 'Acorazados';
localizationText['es']['aircarrier'] = 'Portaaviones';
localizationText['es']['cruiser'] = 'Cruceros';
localizationText['es']['destroyer'] = 'Destructores';
}
{/* Español NA */
localizationText['es-mx'] = [];
localizationText['es-mx'] = jQ.extend([], localizationText['en']);
localizationText['es-mx']['num-separator'] = ' ';
localizationText['es-mx']['num-fractional'] = '.';
localizationText['es-mx']['pvp_solo'] = 'Solo';
localizationText['es-mx']['pvp_div'] = 'División';
localizationText['es-mx']['title_battles'] = 'Batallas Luchadas';
localizationText['es-mx']['title_wins_percents'] = 'Victorias';
localizationText['es-mx']['title_avg_xp'] = 'EXPERIENCIA PROMEDIO POR BATALLA';
localizationText['es-mx']['title_avg_damage_dealt'] = 'Daño en Promedio Causado por Batalla';
localizationText['es-mx']['title_kill_dead'] = 'Radio de Destrucción / Muerte';
localizationText['es-mx']['title_wr'] = 'WR';
localizationText['es-mx']['title_avg_battles_level'] = 'Niveles promedio de los buques de guerra utilizado por jugador';
localizationText['es-mx']['title_avg_frags'] = 'Promedio de barcos destruidos para la batalla';
localizationText['es-mx']['title_avg_planes_killed'] = 'Aviones promedio destruido por la lucha';
localizationText['es-mx']['stat-table-1'] = 'Resultados en General';
localizationText['es-mx']['battles'] = 'Batallas';
localizationText['es-mx']['wins'] = 'Victorias';
localizationText['es-mx']['survived_battles'] = 'Batallas sobrevividas';
localizationText['es-mx']['damage_dealt'] = 'Daño causado';
localizationText['es-mx']['frags'] = 'Barcos de guerra destruidos';
localizationText['es-mx']['planes_killed'] = 'Aviones destruidos';
localizationText['es-mx']['capture_points'] = 'Captura de base';
localizationText['es-mx']['dropped_capture_points'] = 'Defensa de base';
localizationText['es-mx']['stat-table-2'] = 'Resultados promedio por batalla';
localizationText['es-mx']['avg_xp'] = 'XP';
localizationText['es-mx']['avg_damage_dealt'] = 'Daño causado';
localizationText['es-mx']['avg_frags'] = 'Barcos de guerra destruidos';
localizationText['es-mx']['avg_planes_killed'] = 'Aviones destruidos';
localizationText['es-mx']['avg_capture_points'] = 'Captura de base';
localizationText['es-mx']['avg_dropped_capture_points'] = 'Defensa de base';
localizationText['es-mx']['stat-table-3'] = 'Puntaje más Alto';
localizationText['es-mx']['max_xp'] = 'XP';
localizationText['es-mx']['max_damage_dealt'] = 'Daño causado';
localizationText['es-mx']['max_frags_battle'] = 'Barcos de guerra destruidos';
localizationText['es-mx']['max_planes_killed'] = 'Aviones destruidos';
localizationText['es-mx']['stat-table-4'] = 'Resultados adicionales';
localizationText['es-mx']['battles_days'] = 'Batallas por día';
localizationText['es-mx']['max_ship_level'] = 'El nivel máximo de la nave';
localizationText['es-mx']['avg_battles_level'] = 'Niveles promedio de los buques de guerra utilizado por jugador';
localizationText['es-mx']['number-ships-x'] = 'Número de buques de Nivel X';
localizationText['es-mx']['wr'] = 'WR';
localizationText['es-mx']['ships_stat'] = 'Estadísticas detalladas de los Barcos de Guerra';
localizationText['es-mx']['title_ships'] = 'Barcos de Guerra';
localizationText['es-mx']['battleship'] = 'Acorazados';
localizationText['es-mx']['aircarrier'] = 'Portaaviones';
localizationText['es-mx']['cruiser'] = 'Cruceros';
localizationText['es-mx']['destroyer'] = 'Destructores';
}
{/* Português */
localizationText['pt-br'] = [];
localizationText['pt-br'] = jQ.extend([], localizationText['en']);
localizationText['pt-br']['num-separator'] = '.';
localizationText['pt-br']['num-fractional'] = ',';
localizationText['pt-br']['pvp_solo'] = 'Solo';
localizationText['pt-br']['pvp_div'] = 'Divisão';
localizationText['pt-br']['title_battles'] = 'Batalhas Disputadas';
localizationText['pt-br']['title_wins_percents'] = 'Taxa de Vitórias/Batalhas';
localizationText['pt-br']['title_avg_xp'] = 'EXPERIÊNCIA MÉDIA POR BATALHA';
localizationText['pt-br']['title_avg_damage_dealt'] = 'Dano Médio Causado por Batalha';
localizationText['pt-br']['title_kill_dead'] = 'Taxa de Morte/Destruição';
localizationText['pt-br']['title_wr'] = 'WR';
localizationText['pt-br']['title_avg_battles_level'] = 'Nível médio de navios de guerra usados por jogador';
localizationText['pt-br']['title_avg_frags'] = 'Navios médios destruído por batalha';
localizationText['pt-br']['title_avg_planes_killed'] = 'Aeronaves média destruído para a luta';
localizationText['pt-br']['stat-table-1'] = 'Resultados Gerais';
localizationText['pt-br']['battles'] = 'Batalhas';
localizationText['pt-br']['wins'] = 'Vitórias';
localizationText['pt-br']['survived_battles'] = 'Batalhas Sobrevividas';
localizationText['pt-br']['damage_dealt'] = 'Dano Causado';
localizationText['pt-br']['frags'] = 'Navios Destruídos';
localizationText['pt-br']['planes_killed'] = 'Aeronaves Destruídas';
localizationText['pt-br']['capture_points'] = 'Captura de Base';
localizationText['pt-br']['dropped_capture_points'] = 'Defesa de Base';
localizationText['pt-br']['stat-table-2'] = 'Pontuação Média por Batalha';
localizationText['pt-br']['avg_xp'] = 'Experiência';
localizationText['pt-br']['avg_damage_dealt'] = 'Dano Causado';
localizationText['pt-br']['avg_frags'] = 'Navios Destruídos';
localizationText['pt-br']['avg_planes_killed'] = 'Aeronaves Destruídas';
localizationText['pt-br']['avg_capture_points'] = 'Captura de Base';
localizationText['pt-br']['avg_dropped_capture_points'] = 'Defesa de Base';
localizationText['pt-br']['stat-table-3'] = 'Pontuação Recorde';
localizationText['pt-br']['max_xp'] = 'Experiência';
localizationText['pt-br']['max_damage_dealt'] = 'Dano Causado';
localizationText['pt-br']['max_frags_battle'] = 'Navios Destruídos';
localizationText['pt-br']['max_planes_killed'] = 'Aeronaves Destruídas';
localizationText['pt-br']['stat-table-4'] = 'Resultados adicionais';
localizationText['pt-br']['battles_days'] = 'Batalhas por dia';
localizationText['pt-br']['max_ship_level'] = 'O nível máximo de navio';
localizationText['pt-br']['avg_battles_level'] = 'Nível médio de navios de guerra usados por jogador';
localizationText['pt-br']['number-ships-x'] = 'Número de X navios de Nível';
localizationText['pt-br']['wr'] = 'WR';
localizationText['pt-br']['ships_stat'] = 'Estatísticas Detalhadas de Navios';
localizationText['pt-br']['title_ships'] = 'Navios';
localizationText['pt-br']['battleship'] = 'Encouraçados';
localizationText['pt-br']['aircarrier'] = 'Porta-aviões';
localizationText['pt-br']['cruiser'] = 'Cruzadores';
localizationText['pt-br']['destroyer'] = 'Contratorpedeiros';
}
{/* Čeština */
localizationText['cs'] = [];
localizationText['cs'] = jQ.extend([], localizationText['en']);
localizationText['cs']['num-separator'] = ' ';
localizationText['cs']['num-fractional'] = ',';
localizationText['cs']['pvp_solo'] = 'Solo';
localizationText['cs']['pvp_div'] = 'Divize';
localizationText['cs']['title_battles'] = 'Odehráno bitev';
localizationText['cs']['title_wins_percents'] = 'Poměr Vítězství/Bitev';
localizationText['cs']['title_avg_xp'] = 'PRŮMĚRNÉ ZKUŠENOSTI ZA BITVU';
localizationText['cs']['title_avg_damage_dealt'] = 'Průměrné poškození způsobené za bitvu';
localizationText['cs']['title_kill_dead'] = 'Poměr Zabití/Smrtí';
localizationText['cs']['title_wr'] = 'WR';
localizationText['cs']['title_avg_battles_level'] = 'Průměrná vrstva válečných lodí používaný přehrávačem';
localizationText['cs']['title_avg_frags'] = 'Průměrné Zničené lodě pro boj';
localizationText['cs']['title_avg_planes_killed'] = 'Průměrná Zničená letadla pro boj';
localizationText['cs']['stat-table-1'] = 'Celkové výsledky';
localizationText['cs']['battles'] = 'Bitvy';
localizationText['cs']['wins'] = 'Vítězství';
localizationText['cs']['survived_battles'] = 'Přežito bitev';
localizationText['cs']['damage_dealt'] = 'Způsobené poškození';
localizationText['cs']['frags'] = 'Lodí zničeno';
localizationText['cs']['planes_killed'] = 'Letadel zničeno';
localizationText['cs']['capture_points'] = 'Body za obsazování základny';
localizationText['cs']['dropped_capture_points'] = 'Body za obranu základny';
localizationText['cs']['stat-table-2'] = 'Průměrné skóre za bitvu';
localizationText['cs']['avg_xp'] = 'Zkušenosti';
localizationText['cs']['avg_damage_dealt'] = 'Způsobené poškození';
localizationText['cs']['avg_frags'] = 'Lodí zničeno';
localizationText['cs']['avg_planes_killed'] = 'Letadel zničeno';
localizationText['cs']['avg_capture_points'] = 'Body za obsazování základny';
localizationText['cs']['avg_dropped_capture_points'] = 'Body za obranu základny';
localizationText['cs']['stat-table-3'] = 'Rekordní skóre';
localizationText['cs']['max_xp'] = 'Zkušenosti';
localizationText['cs']['max_damage_dealt'] = 'Způsobené poškození';
localizationText['cs']['max_frags_battle'] = 'Lodí zničeno';
localizationText['cs']['max_planes_killed'] = 'Letadel zničeno';
localizationText['cs']['stat-table-4'] = 'Další výsledky';
localizationText['cs']['battles_days'] = 'Bitvy za den';
localizationText['cs']['max_ship_level'] = 'Maximální vrstva lodi';
localizationText['cs']['avg_battles_level'] = 'Průměrná vrstva válečných lodí používaný přehrávačem';
localizationText['cs']['number-ships-x'] = 'Počet X Tier lodí';
localizationText['cs']['wr'] = 'WR';
localizationText['cs']['ships_stat'] = 'Podrobné statistiky lodě';
localizationText['cs']['title_ships'] = 'Lodě';
localizationText['cs']['battleship'] = 'Bitevní lodě';
localizationText['cs']['aircarrier'] = 'Letadlové lodě';
localizationText['cs']['cruiser'] = 'Křižníky';
localizationText['cs']['destroyer'] = 'Torpédoborce';
}
{/* Polski */
localizationText['pl'] = [];
localizationText['pl'] = jQ.extend([], localizationText['en']);
localizationText['pl']['num-separator'] = ' ';
localizationText['pl']['num-fractional'] = ',';
localizationText['pl']['pvp_solo'] = 'Solo';
localizationText['pl']['pvp_div'] = 'Podział';
localizationText['pl']['title_battles'] = 'Stoczone bitwy';
localizationText['pl']['title_wins_percents'] = 'Stosunek zwycięstw do wszystkich bitew';
localizationText['pl']['title_avg_xp'] = 'ŚREDNIE DOŚWIADCZENIE NA BITWĘ';
localizationText['pl']['title_avg_damage_dealt'] = 'Średnie uszkodzenia zadane na bitwę';
localizationText['pl']['title_kill_dead'] = 'Stosunek zniszczonych przeciwników/własnych zniszczeń';
localizationText['pl']['title_wr'] = 'WR';
localizationText['pl']['title_avg_battles_level'] = 'Průměrná vrstva válečných lodí používaný přehrávačem';
localizationText['pl']['title_avg_frags'] = 'Średnie Zniszczone statki do boju';
localizationText['pl']['title_avg_planes_killed'] = 'Średnia Zniszczony samolot do walki';
localizationText['pl']['stat-table-1'] = 'Ogólne wyniki';
localizationText['pl']['battles'] = 'Bitwy';
localizationText['pl']['wins'] = 'Zwycięstwa';
localizationText['pl']['survived_battles'] = 'Przetrwane bitwy';
localizationText['pl']['damage_dealt'] = 'Zadane uszkodzenia';
localizationText['pl']['frags'] = 'Zniszczone okręty';
localizationText['pl']['planes_killed'] = 'Zniszczone samoloty';
localizationText['pl']['capture_points'] = 'Zajęcie bazy';
localizationText['pl']['dropped_capture_points'] = 'Obrona bazy';
localizationText['pl']['stat-table-2'] = 'Średnie doświadczenie w bitwie';
localizationText['pl']['avg_xp'] = 'Doświadczenie';
localizationText['pl']['avg_damage_dealt'] = 'Zadane uszkodzenia';
localizationText['pl']['avg_frags'] = 'Zniszczone okręty';
localizationText['pl']['avg_planes_killed'] = 'Zniszczone samoloty';
localizationText['pl']['avg_capture_points'] = 'Zajęcie bazy';
localizationText['pl']['avg_dropped_capture_points'] = 'Obrona bazy';
localizationText['pl']['stat-table-3'] = 'Rekordowy wynik';
localizationText['pl']['max_xp'] = 'Doświadczenie';
localizationText['pl']['max_damage_dealt'] = 'Zadane uszkodzenia';
localizationText['pl']['max_frags_battle'] = 'Zniszczone okręty';
localizationText['pl']['max_planes_killed'] = 'Zniszczone samoloty';
localizationText['pl']['stat-table-4'] = 'Další výsledky';
localizationText['pl']['battles_days'] = 'Bitvy za den';
localizationText['pl']['max_ship_level'] = 'Maximální vrstva lodi';
localizationText['pl']['avg_battles_level'] = 'Průměrná vrstva válečných lodí používaný přehrávačem';
localizationText['pl']['number-ships-x'] = 'Ilość X statków Tier';
localizationText['pl']['wr'] = 'WR';
localizationText['pl']['ships_stat'] = 'Szczegółowe statystyki okrętu';
localizationText['pl']['title_ships'] = 'Okręty';
localizationText['pl']['battleship'] = 'Pancerniki';
localizationText['pl']['aircarrier'] = 'Lotniskowce';
localizationText['pl']['cruiser'] = 'Krążowniki';
localizationText['pl']['destroyer'] = 'Niszczyciele';
}
{/* 日本語 */
localizationText['ja'] = [];
localizationText['ja'] = jQ.extend([], localizationText['en']);
localizationText['ja']['num-separator'] = '';
localizationText['ja']['num-fractional'] = '.';
localizationText['ja']['pvp_solo'] = 'ソロ';
localizationText['ja']['pvp_div'] = '課';
localizationText['ja']['title_battles'] = '参加戦闘数';
localizationText['ja']['title_wins_percents'] = '勝利数/戦闘数';
localizationText['ja']['title_avg_xp'] = '1 戦あたりの平均経験値';
localizationText['ja']['title_avg_damage_dealt'] = '1 戦あたりの平均与ダメージ';
localizationText['ja']['title_kill_dead'] = 'キル/デス比';
localizationText['ja']['title_wr'] = 'WR';
localizationText['ja']['title_avg_battles_level'] = 'プレイヤーが使用する軍艦の平均ティア';
localizationText['ja']['title_avg_frags'] = '戦いの平均破壊された船';
localizationText['ja']['title_avg_planes_killed'] = '戦いの平均破壊された航空機';
localizationText['ja']['stat-table-1'] = '総合結果';
localizationText['ja']['battles'] = '戦闘数';
localizationText['ja']['wins'] = '勝利';
localizationText['ja']['survived_battles'] = '生還した戦闘数';
localizationText['ja']['damage_dealt'] = '与ダメージ';
localizationText['ja']['frags'] = '艦船撃沈';
localizationText['ja']['planes_killed'] = '航空機撃墜';
localizationText['ja']['capture_points'] = '陣地占領';
localizationText['ja']['dropped_capture_points'] = '陣地防衛';
localizationText['ja']['stat-table-2'] = '1 戦あたりの平均スコア';
localizationText['ja']['avg_xp'] = '経験値';
localizationText['ja']['avg_damage_dealt'] = '与ダメージ';
localizationText['ja']['avg_frags'] = '艦船撃沈';
localizationText['ja']['avg_planes_killed'] = '航空機撃墜';
localizationText['ja']['avg_capture_points'] = '陣地占領';
localizationText['ja']['avg_dropped_capture_points'] = '陣地防衛';
localizationText['ja']['stat-table-3'] = '最高スコア';
localizationText['ja']['max_xp'] = '経験値';
localizationText['ja']['max_damage_dealt'] = '与ダメージ';
localizationText['ja']['max_frags_battle'] = '艦船撃沈';
localizationText['ja']['max_planes_killed'] = '航空機撃墜';
localizationText['ja']['stat-table-4'] = '追加の結果';
localizationText['ja']['battles_days'] = '一日あたりの戦い';
localizationText['ja']['max_ship_level'] = '船の最大ティア';
localizationText['ja']['avg_battles_level'] = 'プレイヤーが使用する軍艦の平均ティア';
localizationText['ja']['number-ships-x'] = 'Xティア船の数';
localizationText['ja']['wr'] = 'WR';
localizationText['ja']['ships_stat'] = '艦の詳細戦績';
localizationText['ja']['title_ships'] = '艦';
localizationText['ja']['battleship'] = '戦艦';
localizationText['ja']['aircarrier'] = '航空母艦';
localizationText['ja']['cruiser'] = '巡洋艦';
localizationText['ja']['destroyer'] = '駆逐艦';
}
{/* ไทย */
localizationText['th'] = [];
localizationText['th'] = jQ.extend([], localizationText['en']);
localizationText['th']['num-separator'] = '';
localizationText['th']['num-fractional'] = '.';
localizationText['th']['pvp_solo'] = 'โซโล';
localizationText['th']['pvp_div'] = 'แผนก';
localizationText['th']['title_battles'] = 'การรบที่เข้าร่วม';
localizationText['th']['title_wins_percents'] = 'อัตราชัยชนะ/การรบ';
localizationText['th']['title_avg_xp'] = 'ค่าประสบการณ์โดยเฉลี่ยต่อการรบ';
localizationText['th']['title_avg_damage_dealt'] = 'ความเสียหายที่ทำโดยเฉลี่ยต่อการรบ';
localizationText['th']['title_kill_dead'] = 'อัตราสังหาร/เสียชีวิต';
localizationText['th']['title_wr'] = 'WR';
localizationText['th']['title_avg_battles_level'] = 'ชั้นเฉลี่ยของเรือรบที่ใช้โดยผู้เล่น';
localizationText['th']['title_avg_frags'] = 'เรือถูกทำลายเฉลี่ยสำหรับการต่อสู้';
localizationText['th']['title_avg_planes_killed'] = 'เครื่องบินถูกทำลายเฉลี่ยสำหรับการต่อสู้';
localizationText['th']['stat-table-1'] = 'ผลรวม';
localizationText['th']['battles'] = 'การรบ';
localizationText['th']['wins'] = 'ชัยชนะ';
localizationText['th']['survived_battles'] = 'จำนวนการรอดจากการรบ';
localizationText['th']['damage_dealt'] = 'ความเสียหายที่ทำ';
localizationText['th']['frags'] = 'เรือรบที่ถูกทำลาย';
localizationText['th']['planes_killed'] = 'เครื่องบินที่ถูกทำลาย';
localizationText['th']['capture_points'] = 'การยึดฐาน';
localizationText['th']['dropped_capture_points'] = 'การป้องกันฐาน';
localizationText['th']['stat-table-2'] = 'คะแนนเฉลี่ยต่อการรบ';
localizationText['th']['avg_xp'] = 'ค่าประสบการณ์';
localizationText['th']['avg_damage_dealt'] = 'ความเสียหายที่ทำ';
localizationText['th']['avg_frags'] = 'เรือรบที่ถูกทำลาย';
localizationText['th']['avg_planes_killed'] = 'เครื่องบินที่ถูกทำลาย';
localizationText['th']['avg_capture_points'] = 'การยึดฐาน';
localizationText['th']['avg_dropped_capture_points'] = 'การป้องกันฐาน';
localizationText['th']['stat-table-3'] = 'สถิติคะแนน';
localizationText['th']['max_xp'] = 'ค่าประสบการณ์';
localizationText['th']['max_damage_dealt'] = 'ความเสียหายที่ทำ';
localizationText['th']['max_frags_battle'] = 'เรือรบที่ถูกทำลาย';
localizationText['th']['max_planes_killed'] = 'เครื่องบินที่ถูกทำลาย';
localizationText['th']['stat-table-4'] = 'ผลเพิ่มเติม';
localizationText['th']['battles_days'] = 'สงครามต่อวัน';
localizationText['th']['max_ship_level'] = 'ชั้นสูงสุดของเรือ';
localizationText['th']['avg_battles_level'] = 'ชั้นเฉลี่ยของเรือรบที่ใช้โดยผู้เล่น';
localizationText['th']['number-ships-x'] = 'จำนวน X เรือชั้นที่';
localizationText['th']['wr'] = 'WR';
localizationText['th']['ships_stat'] = 'สถิติเรือรบโดยละเอียด';
localizationText['th']['title_ships'] = 'เรือรบ';
localizationText['th']['battleship'] = 'เรือประจัญบาน';
localizationText['th']['aircarrier'] = 'เรือบรรทุกเครื่องบิน';
localizationText['th']['cruiser'] = 'เรือลาดตระเวณ';
localizationText['th']['destroyer'] = 'เรือพิฆาต';
}
{/* Tiếng Việt */
localizationText['vi'] = [];
localizationText['vi'] = jQ.extend([], localizationText['en']);
localizationText['vi']['num-separator'] = '';
localizationText['vi']['num-fractional'] = ',';
localizationText['vi']['num-separator'] = '';
localizationText['vi']['num-fractional'] = '.';
localizationText['vi']['pvp_solo'] = 'Solo';
localizationText['vi']['pvp_div'] = 'Phòng';
localizationText['vi']['title_battles'] = 'Số trận Tham chiến';
localizationText['vi']['title_wins_percents'] = 'Chiến thắng / Số trận';
localizationText['vi']['title_avg_xp'] = 'KINH NGHIỆM TRUNG BÌNH MỖI TRẬN';
localizationText['vi']['title_avg_damage_dealt'] = 'Thiệt hại Gây ra Trung bình mỗi Trận';
localizationText['vi']['title_kill_dead'] = 'Tỷ lệ Tiêu diệt/Bị Tiêu diệt';
localizationText['vi']['title_wr'] = 'WR';
localizationText['vi']['title_avg_battles_level'] = 'Tier trung bình của các tàu chiến được sử dụng bởi người chơi';
localizationText['vi']['title_avg_frags'] = 'Tàu Trung bình bị phá hủy trong trận chiến';
localizationText['vi']['title_avg_planes_killed'] = 'Máy bay bị phá hủy trung bình cho cuộc chiến';
localizationText['vi']['stat-table-1'] = 'Kết quả Tổng quan';
localizationText['vi']['battles'] = 'Số trận';
localizationText['vi']['wins'] = 'Chiến thắng';
localizationText['vi']['survived_battles'] = 'Số trận sống sót';
localizationText['vi']['damage_dealt'] = 'Thiệt hại đã gây ra';
localizationText['vi']['frags'] = 'Tàu chiến đã tiêu diệt';
localizationText['vi']['planes_killed'] = 'Phi cơ đã tiêu diệt';
localizationText['vi']['capture_points'] = 'Chiếm căn cứ';
localizationText['vi']['dropped_capture_points'] = 'Phòng thủ căn cứ';
localizationText['vi']['stat-table-2'] = 'Điểm Trung bình mỗi Trận';
localizationText['vi']['avg_xp'] = 'Kinh nghiệm';
localizationText['vi']['avg_damage_dealt'] = 'Thiệt hại đã gây ra';
localizationText['vi']['avg_frags'] = 'Tàu chiến đã tiêu diệt';
localizationText['vi']['avg_planes_killed'] = 'Phi cơ đã tiêu diệt';
localizationText['vi']['avg_capture_points'] = 'Chiếm căn cứ';
localizationText['vi']['avg_dropped_capture_points'] = 'Phòng thủ căn cứ';
localizationText['vi']['stat-table-3'] = 'Điểm Kỷ lục';
localizationText['vi']['max_xp'] = 'Kinh nghiệm';
localizationText['vi']['max_damage_dealt'] = 'Thiệt hại đã gây ra';
localizationText['vi']['max_frags_battle'] = 'Tàu chiến đã tiêu diệt';
localizationText['vi']['max_planes_killed'] = 'Phi cơ đã tiêu diệt';
localizationText['vi']['stat-table-4'] = 'Kết quả bổ sung';
localizationText['vi']['battles_days'] = 'Trận chiến mỗi ngày';
localizationText['vi']['max_ship_level'] = 'Cấp tối đa của tàu';
localizationText['vi']['avg_battles_level'] = 'Tier trung bình của các tàu chiến được sử dụng bởi người chơi';
localizationText['vi']['number-ships-x'] = 'Số tàu Tier X';
localizationText['vi']['wr'] = 'WR';
localizationText['vi']['ships_stat'] = 'Thống kê Tàu chiến Chi tiết';
localizationText['vi']['title_ships'] = 'Tàu chiến';
localizationText['vi']['battleship'] = 'Thiết giáp hạm';
localizationText['vi']['aircarrier'] = 'Tàu sân bay';
localizationText['vi']['cruiser'] = 'Tuần dương hạm';
localizationText['vi']['destroyer'] = 'Khu trục hạm';
}
{/* 繁體中文 By chunhung 24/12/2015 */
localizationText['zh-tw'] = [];
localizationText['zh-tw'] = jQ.extend([], localizationText['en']);
localizationText['zh-tw']['num-separator'] = '';
localizationText['zh-tw']['num-fractional'] = '.';
localizationText['zh-tw']['Box'] = '通知';
localizationText['zh-tw']['Ok'] = '確定';
localizationText['zh-tw']['Cancel'] = '取消';
localizationText['zh-tw']['NewVersion'] = '新版本已經發佈';
localizationText['zh-tw']['NewUpdate'] = '請更新擴充功能';
localizationText['zh-tw']['ErrorScript'] = '運行時發生錯誤 UserScript WoWsStatInfo '+VersionWoWsStatInfo+', script:';
localizationText['zh-tw']['ErrorSendDeveloper'] = '請將此錯誤通知腳本開發者。';
localizationText['zh-tw']['ErrorAPI'] = '無法取得數據。<br />WG API 存在問題。<br />請嘗試重新載入頁面,或稍後再試。';
localizationText['zh-tw']['userscript-developer'] = 'Developer - UserScript WoWsStatInfo:';
localizationText['zh-tw']['userscript-alliance'] = 'аlliance member';
localizationText['zh-tw']['userscript-topic'] = 'Forum topic:';
localizationText['zh-tw']['userscript-developer-support'] = 'Ways to support the developer:';
localizationText['zh-tw']['search-clan-forum'] = 'Clan Search...';
localizationText['zh-tw']['profile-wows'] = 'World of Warships profile';
localizationText['zh-tw']['profile-clan'] = 'Clan';
localizationText['zh-tw']['forum-profile'] = 'Forum profile';
localizationText['zh-tw']['role'] = '位階';
localizationText['zh-tw']['clan-day'] = '待在公會的天數';
localizationText['zh-tw']['generator-userbar'] = '創建簽名檔';
localizationText['zh-tw']['userbar-bg'] = '選擇背景圖片:';
localizationText['zh-tw']['userbar-filters'] = '過濾器:';
localizationText['zh-tw']['filters-all'] = '全部';
localizationText['zh-tw']['filters-clan'] = '公會';
localizationText['zh-tw']['filters-noclassification'] = '未分類';
localizationText['zh-tw']['filters-battleship'] = '主力艦';
localizationText['zh-tw']['filters-aircarrier'] = '航空母艦';
localizationText['zh-tw']['filters-cruiser'] = '巡洋艦';
localizationText['zh-tw']['filters-destroyer'] = '驅逐艦';
localizationText['zh-tw']['filters-japan'] = '日本';
localizationText['zh-tw']['filters-ussr'] = '蘇聯';
localizationText['zh-tw']['filters-germany'] = '德國';
localizationText['zh-tw']['filters-uk'] = '英國';
localizationText['zh-tw']['filters-usa'] = '美國';
localizationText['zh-tw']['userbar-your-background'] = '上傳背景圖片';
localizationText['zh-tw']['upload-submit'] = '上傳';
localizationText['zh-tw']['img-max-size'] = '最大容量: 150 KB';
localizationText['zh-tw']['img-max-px'] = '圖片解析度: 468x100';
localizationText['zh-tw']['img-format'] = '圖片格式: PNG';
localizationText['zh-tw']['upload-verification'] = '背景圖片會在驗證後更新。';
localizationText['zh-tw']['pvp_solo'] = '單獨';
localizationText['zh-tw']['pvp_div'] = '分艦隊';
localizationText['zh-tw']['title_battles'] = '參與過戰鬥數';
localizationText['zh-tw']['title_wins_percents'] = '勝利數/戰鬥數比';
localizationText['zh-tw']['title_avg_xp'] = '平均每場經驗';
localizationText['zh-tw']['title_avg_damage_dealt'] = '平均每場造成的傷害';
localizationText['zh-tw']['title_kill_dead'] = '擊毀/死亡比';
localizationText['zh-tw']['title_wr'] = 'WR';
localizationText['zh-tw']['title_avg_battles_level'] = '玩家所用艦艇的平均階級';
localizationText['zh-tw']['title_avg_frags'] = '平均打掉船舶战斗';
localizationText['zh-tw']['title_avg_planes_killed'] = '为争平均架被毁飞机';
localizationText['zh-tw']['stat-table-1'] = '整體成績';
localizationText['zh-tw']['battles'] = '戰鬥數';
localizationText['zh-tw']['wins'] = '勝利數';
localizationText['zh-tw']['survived_battles'] = '存活數';
localizationText['zh-tw']['damage_dealt'] = '造成的傷害';
localizationText['zh-tw']['frags'] = '擊毀的艦艇數';
localizationText['zh-tw']['planes_killed'] = '擊毀飛機數';
localizationText['zh-tw']['capture_points'] = '佔領點數';
localizationText['zh-tw']['dropped_capture_points'] = '防禦點數';
localizationText['zh-tw']['stat-table-2'] = '平均每場戰鬥分數';
localizationText['zh-tw']['avg_xp'] = '經驗';
localizationText['zh-tw']['avg_damage_dealt'] = '造成的傷害';
localizationText['zh-tw']['avg_frags'] = '擊毀的艦艇數';
localizationText['zh-tw']['avg_planes_killed'] = '擊毀飛機數';
localizationText['zh-tw']['avg_capture_points'] = '佔領點數';
localizationText['zh-tw']['avg_dropped_capture_points'] = '防禦點數';
localizationText['zh-tw']['stat-table-3'] = '紀錄分數';
localizationText['zh-tw']['max_xp'] = '經驗';
localizationText['zh-tw']['max_damage_dealt'] = '造成的傷害';
localizationText['zh-tw']['max_frags_battle'] = '擊毀的艦艇數';
localizationText['zh-tw']['max_planes_killed'] = '擊毀飛機數';
localizationText['zh-tw']['stat-table-4'] = '其他結果';
localizationText['zh-tw']['battles_days'] = '每日戰鬥數';
localizationText['zh-tw']['max_ship_level'] = '最大艦艇階級';
localizationText['zh-tw']['avg_battles_level'] = '玩家所用艦艇的平均階級';
localizationText['zh-tw']['number-ships-x'] = '第X階艦艇數量';
localizationText['zh-tw']['wr'] = 'WR';
localizationText['zh-tw']['ships_stat'] = '詳細艦艇統計';
localizationText['zh-tw']['title_ships'] = '艦艇';
localizationText['zh-tw']['battleship'] = '主力艦';
localizationText['zh-tw']['aircarrier'] = '航空母艦';
localizationText['zh-tw']['cruiser'] = '巡洋艦';
localizationText['zh-tw']['destroyer'] = '驅逐艦';
localizationText['zh-tw']['block-link-clan-member-history'] = '「公會成員變化」分段';
localizationText['zh-tw']['link-clan-member-history'] = '公會成員變化';
localizationText['zh-tw']['member-history-clear'] = '清除歷史記錄';
localizationText['zh-tw']['member-history-join'] = '%NAME% 已加入公會';
localizationText['zh-tw']['member-history-leave'] = '%NAME% 已離開公會';
localizationText['zh-tw']['member-history-rename'] = '%OLDNAME% 已更改暱稱為 %NEWNAME%';
localizationText['zh-tw']['member-history-rerole'] = '%NAME% 位階已更變: %OLDROLE% ⇒ %NEWROLE%';
localizationText['zh-tw']['member-history-notchange'] = '自從安裝WoWsStatInfo腳本和上次進入本頁後,公會成員並無任何改變。';
localizationText['zh-tw']['banned'] = '被封禁';
localizationText['zh-tw']['commander'] = '指揮官';
localizationText['zh-tw']['executive_officer'] = '執行官';
localizationText['zh-tw']['personnel_officer'] = '人事官';
localizationText['zh-tw']['intelligence_officer'] = '情報官';
localizationText['zh-tw']['quartermaster'] = '軍需官';
localizationText['zh-tw']['recruitment_officer'] = '徵募官';
localizationText['zh-tw']['junior_officer'] = '下級軍官';
localizationText['zh-tw']['combat_officer'] = '作戰官';
localizationText['zh-tw']['private'] = '士兵';
localizationText['zh-tw']['recruit'] = '新兵';
localizationText['zh-tw']['reservist'] = '後備軍人';
localizationText['zh-tw']['get-settings-button'] = '設定';
localizationText['zh-tw']['set-settings-default'] = '預設';
localizationText['zh-tw']['table-setting-caption'] = '查看列表排序「公會統計」';
localizationText['zh-tw']['table-setting-structure'] = '列表排序';
localizationText['zh-tw']['statistic-clan-button-0'] = '公會統計';
localizationText['zh-tw']['statistic-clan-button-1'] = '公會架構';
localizationText['zh-tw']['statistic-clan-load-text'] = '請稍候 •••<br />正在獲取統計數據';
localizationText['zh-tw']['statistic-load-text-lost'] = '<br />剩餘時間 ≈';
localizationText['zh-tw']['statistic-load-text-min'] = '分';
localizationText['zh-tw']['statistic-load-text-sec'] = '秒';
localizationText['zh-tw']['account_name'] = '玩家名稱';
localizationText['zh-tw']['role_i18n'] = '位階';
localizationText['zh-tw']['clan_days'] = '待在公會的天數';
localizationText['zh-tw']['info.last_battle_time'] = '上次戰鬥時間';
localizationText['zh-tw']['info.logout_at'] = '上次遊戲完結時間';
localizationText['zh-tw']['info.statistics.pvp.battles'] = '戰鬥數';
localizationText['zh-tw']['info.statistics.pvp.wins'] = '勝利數';
localizationText['zh-tw']['info.statistics.pvp.losses'] = '失敗數';
localizationText['zh-tw']['info.statistics.pvp.draws'] = '平手數';
localizationText['zh-tw']['info.statistics.pvp.survived_battles'] = '存活數';
localizationText['zh-tw']['info.statistics.pvp.survived_wins'] = '勝利並存活數';
localizationText['zh-tw']['info.statistics.pvp.kill_dead'] = '擊毀/死亡比';
localizationText['zh-tw']['info.statistics.pvp.xp'] = '總經驗';
localizationText['zh-tw']['info.statistics.pvp.damage_dealt'] = '造成的傷害';
localizationText['zh-tw']['info.statistics.pvp.frags'] = '擊毀的艦艇數';
localizationText['zh-tw']['info.statistics.pvp.planes_killed'] = '擊毀飛機數';
localizationText['zh-tw']['info.statistics.pvp.capture_points'] = '佔領點數';
localizationText['zh-tw']['info.statistics.pvp.dropped_capture_points'] = '防禦點數';
localizationText['zh-tw']['info.statistics.pvp.avg_xp'] = '平均經驗';
localizationText['zh-tw']['info.statistics.pvp.avg_damage_dealt'] = '平均造成傷害';
localizationText['zh-tw']['info.statistics.pvp.avg_frags'] = '平均擊毀艦艇數';
localizationText['zh-tw']['info.statistics.pvp.avg_planes_killed'] = '平均擊毀飛機數';
localizationText['zh-tw']['info.statistics.pvp.avg_capture_points'] = '平均佔領點數';
localizationText['zh-tw']['info.statistics.pvp.avg_dropped_capture_points'] = '平均防禦點數';
localizationText['zh-tw']['info.statistics.pvp.max_xp'] = '最大經驗';
localizationText['zh-tw']['info.statistics.pvp.max_damage_dealt'] = '最大造成傷害';
localizationText['zh-tw']['info.statistics.pvp.max_frags_battle'] = '最大擊毀的艦艇數';
localizationText['zh-tw']['info.statistics.pvp.max_planes_killed'] = '最大擊毀飛機數';
localizationText['zh-tw']['info.statistics.pvp.wins_percents'] = '勝利率';
localizationText['zh-tw']['info.statistics.pvp.survived_battles_percents'] = '存活率';
localizationText['zh-tw']['info.statistics.pvp.wr'] = 'WR';
localizationText['zh-tw']['info.ships_x_level'] = '10 lvl';
}
return localizationText[lang];
}
if(window.location.href.indexOf("accounts") > -1 && window.location.href.split('/').length >= 8 && window.location.href.split('/')[6].match(/[0-9]+/) != null){
/* Javascript plotting library for jQuery, version 0.8.0-beta.
Copyright (c) 2007-2013 IOLA and Ole Laursen.
Licensed under the MIT license.
*/
// first an inline dependency, jquery.colorhelpers.js, we inline it here
// for convenience
/* Plugin for jQuery for working with colors.
*
* Version 1.1.
*
* Inspiration from jQuery color animation plugin by John Resig.
*
* Released under the MIT license by Ole Laursen, October 2009.
*
* Examples:
*
* $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
* var c = $.color.extract($("#mydiv"), 'background-color');
* console.log(c.r, c.g, c.b, c.a);
* $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
*
* Note that .scale() and .add() return the same modified object
* instead of making a new one.
*
* V. 1.1: Fix error handling so e.g. parsing an empty string does
* produce a color rather than just crashing.
*/
(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
(function(a){function c(b,c){var d=c.children("."+b)[0];if(null==d&&(d=document.createElement("canvas"),d.className=b,a(d).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(c),!d.getContext)){if(!window.G_vmlCanvasManager)throw Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");d=window.G_vmlCanvasManager.initElement(d)}this.element=d;var e=this.context=d.getContext("2d"),f=window.devicePixelRatio||1,g=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;this.pixelRatio=f/g,this.resize(c.width(),c.height()),this.text={},this._textCache={}}function d(b,d,f,g){function v(a,b){b=[u].concat(b);for(var c=0;a.length>c;++c)a[c].apply(this,b)}function w(){for(var b={Canvas:c},d=0;g.length>d;++d){var e=g[d];e.init(u,b),e.options&&a.extend(!0,i,e.options)}}function x(c){a.extend(!0,i,c),null==i.xaxis.color&&(i.xaxis.color=""+a.color.parse(i.grid.color).scale("a",.22)),null==i.yaxis.color&&(i.yaxis.color=""+a.color.parse(i.grid.color).scale("a",.22)),null==i.xaxis.tickColor&&(i.xaxis.tickColor=i.grid.tickColor||i.xaxis.color),null==i.yaxis.tickColor&&(i.yaxis.tickColor=i.grid.tickColor||i.yaxis.color),null==i.grid.borderColor&&(i.grid.borderColor=i.grid.color),null==i.grid.tickColor&&(i.grid.tickColor=""+a.color.parse(i.grid.color).scale("a",.22));var d,e,f,g={style:b.css("font-style"),size:Math.round(.8*(+b.css("font-size").replace("px","")||13)),variant:b.css("font-variant"),weight:b.css("font-weight"),family:b.css("font-family")};for(f=i.xaxes.length||1,d=0;f>d;++d)e=a.extend(!0,{},i.xaxis,i.xaxes[d]),i.xaxes[d]=e,e.font&&(e.font=a.extend({},g,e.font),e.font.color||(e.font.color=e.color));for(f=i.yaxes.length||1,d=0;f>d;++d)e=a.extend(!0,{},i.yaxis,i.yaxes[d]),i.yaxes[d]=e,e.font&&(e.font=a.extend({},g,e.font),e.font.color||(e.font.color=e.color));for(i.xaxis.noTicks&&null==i.xaxis.ticks&&(i.xaxis.ticks=i.xaxis.noTicks),i.yaxis.noTicks&&null==i.yaxis.ticks&&(i.yaxis.ticks=i.yaxis.noTicks),i.x2axis&&(i.xaxes[1]=a.extend(!0,{},i.xaxis,i.x2axis),i.xaxes[1].position="top"),i.y2axis&&(i.yaxes[1]=a.extend(!0,{},i.yaxis,i.y2axis),i.yaxes[1].position="right"),i.grid.coloredAreas&&(i.grid.markings=i.grid.coloredAreas),i.grid.coloredAreasColor&&(i.grid.markingsColor=i.grid.coloredAreasColor),i.lines&&a.extend(!0,i.series.lines,i.lines),i.points&&a.extend(!0,i.series.points,i.points),i.bars&&a.extend(!0,i.series.bars,i.bars),null!=i.shadowSize&&(i.series.shadowSize=i.shadowSize),null!=i.highlightColor&&(i.series.highlightColor=i.highlightColor),d=0;i.xaxes.length>d;++d)E(o,d+1).options=i.xaxes[d];for(d=0;i.yaxes.length>d;++d)E(p,d+1).options=i.yaxes[d];for(var h in t)i.hooks[h]&&i.hooks[h].length&&(t[h]=t[h].concat(i.hooks[h]));v(t.processOptions,[i])}function y(a){h=z(a),F(),G()}function z(b){for(var c=[],d=0;b.length>d;++d){var e=a.extend(!0,{},i.series);null!=b[d].data?(e.data=b[d].data,delete b[d].data,a.extend(!0,e,b[d]),b[d].data=e.data):e.data=b[d],c.push(e)}return c}function A(a,b){var c=a[b+"axis"];return"object"==typeof c&&(c=c.n),"number"!=typeof c&&(c=1),c}function B(){return a.grep(o.concat(p),function(a){return a})}function C(a){var c,d,b={};for(c=0;o.length>c;++c)d=o[c],d&&d.used&&(b["x"+d.n]=d.c2p(a.left));for(c=0;p.length>c;++c)d=p[c],d&&d.used&&(b["y"+d.n]=d.c2p(a.top));return void 0!==b.x1&&(b.x=b.x1),void 0!==b.y1&&(b.y=b.y1),b}function D(a){var c,d,e,b={};for(c=0;o.length>c;++c)if(d=o[c],d&&d.used&&(e="x"+d.n,null==a[e]&&1==d.n&&(e="x"),null!=a[e])){b.left=d.p2c(a[e]);break}for(c=0;p.length>c;++c)if(d=p[c],d&&d.used&&(e="y"+d.n,null==a[e]&&1==d.n&&(e="y"),null!=a[e])){b.top=d.p2c(a[e]);break}return b}function E(b,c){return b[c-1]||(b[c-1]={n:c,direction:b==o?"x":"y",options:a.extend(!0,{},b==o?i.xaxis:i.yaxis)}),b[c-1]}function F(){var d,b=h.length,c=-1;for(d=0;h.length>d;++d){var e=h[d].color;null!=e&&(b--,"number"==typeof e&&e>c&&(c=e))}c>=b&&(b=c+1);var f,g=[],j=i.colors,k=j.length,l=0;for(d=0;b>d;d++)f=a.color.parse(j[d%k]||"#666"),0==d%k&&d&&(l=l>=0?.5>l?-l-.2:0:-l),g[d]=f.scale("rgb",1+l);var n,m=0;for(d=0;h.length>d;++d){if(n=h[d],null==n.color?(n.color=""+g[m],++m):"number"==typeof n.color&&(n.color=""+g[n.color]),null==n.lines.show){var q,r=!0;for(q in n)if(n[q]&&n[q].show){r=!1;break}r&&(n.lines.show=!0)}null==n.lines.zero&&(n.lines.zero=!!n.lines.fill),n.xaxis=E(o,A(n,"x")),n.yaxis=E(p,A(n,"y"))}}function G(){function x(a,b,c){a.datamin>b&&b!=-d&&(a.datamin=b),c>a.datamax&&c!=d&&(a.datamax=c)}var e,f,g,i,k,l,m,q,r,s,u,w,b=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=Number.MAX_VALUE;for(a.each(B(),function(a,d){d.datamin=b,d.datamax=c,d.used=!1}),e=0;h.length>e;++e)k=h[e],k.datapoints={points:[]},v(t.processRawData,[k,k.data,k.datapoints]);for(e=0;h.length>e;++e){if(k=h[e],u=k.data,w=k.datapoints.format,!w){if(w=[],w.push({x:!0,number:!0,required:!0}),w.push({y:!0,number:!0,required:!0}),k.bars.show||k.lines.show&&k.lines.fill){var y=!!(k.bars.show&&k.bars.zero||k.lines.show&&k.lines.zero);w.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:y}),k.bars.horizontal&&(delete w[w.length-1].y,w[w.length-1].x=!0)}k.datapoints.format=w}if(null==k.datapoints.pointsize){k.datapoints.pointsize=w.length,m=k.datapoints.pointsize,l=k.datapoints.points;var z=k.lines.show&&k.lines.steps;for(k.xaxis.used=k.yaxis.used=!0,f=g=0;u.length>f;++f,g+=m){s=u[f];var A=null==s;if(!A)for(i=0;m>i;++i)q=s[i],r=w[i],r&&(r.number&&null!=q&&(q=+q,isNaN(q)?q=null:1/0==q?q=d:q==-1/0&&(q=-d)),null==q&&(r.required&&(A=!0),null!=r.defaultValue&&(q=r.defaultValue))),l[g+i]=q;if(A)for(i=0;m>i;++i)q=l[g+i],null!=q&&(r=w[i],r.x&&x(k.xaxis,q,q),r.y&&x(k.yaxis,q,q)),l[g+i]=null;else if(z&&g>0&&null!=l[g-m]&&l[g-m]!=l[g]&&l[g-m+1]!=l[g+1]){for(i=0;m>i;++i)l[g+m+i]=l[g+i];l[g+1]=l[g-m+1],g+=m}}}}for(e=0;h.length>e;++e)k=h[e],v(t.processDatapoints,[k,k.datapoints]);for(e=0;h.length>e;++e){k=h[e],l=k.datapoints.points,m=k.datapoints.pointsize,w=k.datapoints.format;var C=b,D=b,E=c,F=c;for(f=0;l.length>f;f+=m)if(null!=l[f])for(i=0;m>i;++i)q=l[f+i],r=w[i],r&&r.autoscale!==!1&&q!=d&&q!=-d&&(r.x&&(C>q&&(C=q),q>E&&(E=q)),r.y&&(D>q&&(D=q),q>F&&(F=q)));if(k.bars.show){var G;switch(k.bars.align){case"left":G=0;break;case"right":G=-k.bars.barWidth;break;case"center":G=-k.bars.barWidth/2;break;default:throw Error("Invalid bar alignment: "+k.bars.align)}k.bars.horizontal?(D+=G,F+=G+k.bars.barWidth):(C+=G,E+=G+k.bars.barWidth)}x(k.xaxis,C,E),x(k.yaxis,D,F)}a.each(B(),function(a,d){d.datamin==b&&(d.datamin=null),d.datamax==c&&(d.datamax=null)})}function H(){b.css("padding",0).children(":not(.flot-base,.flot-overlay)").remove(),"static"==b.css("position")&&b.css("position","relative"),j=new c("flot-base",b),k=new c("flot-overlay",b),m=j.context,n=k.context,l=a(k.element).unbind();var d=b.data("plot");d&&(d.shutdown(),k.clear()),b.data("plot",u)}function I(){i.grid.hoverable&&(l.mousemove(hb),l.bind("mouseleave",ib)),i.grid.clickable&&l.click(jb),v(t.bindEvents,[l])}function J(){fb&&clearTimeout(fb),l.unbind("mousemove",hb),l.unbind("mouseleave",ib),l.unbind("click",jb),v(t.shutdown,[l])}function K(a){function b(a){return a}var c,d,e=a.options.transform||b,f=a.options.inverseTransform;"x"==a.direction?(c=a.scale=r/Math.abs(e(a.max)-e(a.min)),d=Math.min(e(a.max),e(a.min))):(c=a.scale=s/Math.abs(e(a.max)-e(a.min)),c=-c,d=Math.max(e(a.max),e(a.min))),a.p2c=e==b?function(a){return(a-d)*c}:function(a){return(e(a)-d)*c},a.c2p=f?function(a){return f(d+a/c)}:function(a){return d+a/c}}function L(a){for(var b=a.options,c=a.ticks||[],d=b.labelWidth||0,e=b.labelHeight||0,f=a.direction+"Axis "+a.direction+a.n+"Axis",g="flot-"+a.direction+"-axis flot-"+a.direction+a.n+"-axis "+f,h=b.font||"flot-tick-label tickLabel",i=0;c.length>i;++i){var k=c[i];if(k.label){var l=j.getTextInfo(g,k.label,h);null==b.labelWidth&&(d=Math.max(d,l.width)),null==b.labelHeight&&(e=Math.max(e,l.height))}}a.labelWidth=Math.ceil(d),a.labelHeight=Math.ceil(e)}function M(b){var m,c=b.labelWidth,d=b.labelHeight,e=b.options.position,f=b.options.tickLength,g=i.grid.axisMargin,h=i.grid.labelMargin,k="x"==b.direction?o:p,n=a.grep(k,function(a){return a&&a.options.position==e&&a.reserveSpace});if(a.inArray(b,n)==n.length-1&&(g=0),null==f){var r=a.grep(k,function(a){return a&&a.reserveSpace});m=0==a.inArray(b,r),f=m?"full":5}isNaN(+f)||(h+=+f),"x"==b.direction?(d+=h,"bottom"==e?(q.bottom+=d+g,b.box={top:j.height-q.bottom,height:d}):(b.box={top:q.top+g,height:d},q.top+=d+g)):(c+=h,"left"==e?(b.box={left:q.left+g,width:c},q.left+=c+g):(q.right+=c+g,b.box={left:j.width-q.right,width:c})),b.position=e,b.tickLength=f,b.box.padding=h,b.innermost=m}function N(a){"x"==a.direction?(a.box.left=q.left-a.labelWidth/2,a.box.width=j.width-q.left-q.right+a.labelWidth):(a.box.top=q.top-a.labelHeight/2,a.box.height=j.height-q.bottom-q.top+a.labelHeight)}function O(){var d,b=i.grid.minBorderMargin,c={x:0,y:0};if(null==b)for(b=0,d=0;h.length>d;++d)b=Math.max(b,2*(h[d].points.radius+h[d].points.lineWidth/2));c.x=c.y=Math.ceil(b),a.each(B(),function(a,b){var d=b.direction;b.reserveSpace&&(c[d]=Math.ceil(Math.max(c[d],("x"==d?b.labelWidth:b.labelHeight)/2)))}),q.left=Math.max(c.x,q.left),q.right=Math.max(c.x,q.right),q.top=Math.max(c.y,q.top),q.bottom=Math.max(c.y,q.bottom)}function P(){var b,c=B(),d=i.grid.show;for(var e in q){var f=i.grid.margin||0;q[e]="number"==typeof f?f:f[e]||0}v(t.processOffset,[q]);for(var e in q)q[e]+="object"==typeof i.grid.borderWidth?d?i.grid.borderWidth[e]:0:d?i.grid.borderWidth:0;if(a.each(c,function(a,b){b.show=b.options.show,null==b.show&&(b.show=b.used),b.reserveSpace=b.show||b.options.reserveSpace,Q(b)}),d){var g=a.grep(c,function(a){return a.reserveSpace});for(a.each(g,function(a,b){R(b),S(b),T(b,b.ticks),L(b)}),b=g.length-1;b>=0;--b)M(g[b]);O(),a.each(g,function(a,b){N(b)})}r=j.width-q.left-q.right,s=j.height-q.bottom-q.top,a.each(c,function(a,b){K(b)}),d&&Y(),db()}function Q(a){var b=a.options,c=+(null!=b.min?b.min:a.datamin),d=+(null!=b.max?b.max:a.datamax),e=d-c;if(0==e){var f=0==d?1:.01;null==b.min&&(c-=f),(null==b.max||null!=b.min)&&(d+=f)}else{var g=b.autoscaleMargin;null!=g&&(null==b.min&&(c-=e*g,0>c&&null!=a.datamin&&a.datamin>=0&&(c=0)),null==b.max&&(d+=e*g,d>0&&null!=a.datamax&&0>=a.datamax&&(d=0)))}a.min=c,a.max=d}function R(b){var d,c=b.options;if(d="number"==typeof c.ticks&&c.ticks>0?c.ticks:.3*Math.sqrt("x"==b.direction?j.width:j.height),b.delta=(b.max-b.min)/d,"time"==c.mode&&!b.tickGenerator)throw Error("Time mode requires the flot.time plugin.");if(b.tickGenerator||(b.tickGenerator=function(a){var b=c.tickDecimals,d=-Math.floor(Math.log(a.delta)/Math.LN10);null!=b&&d>b&&(d=b);var h,j,m,f=Math.pow(10,-d),g=a.delta/f,i=[],k=0,l=Number.NaN;1.5>g?h=1:3>g?(h=2,g>2.25&&(null==b||b>=d+1)&&(h=2.5,++d)):h=7.5>g?5:10,h*=f,null!=c.minTickSize&&c.minTickSize>h&&(h=c.minTickSize),a.tickDecimals=Math.max(0,null!=b?b:d),a.tickSize=c.tickSize||h,j=e(a.min,a.tickSize);do m=l,l=j+k*a.tickSize,i.push(l),++k;while(a.max>l&&l!=m);return i},b.tickFormatter=function(a,b){var c=b.tickDecimals?Math.pow(10,b.tickDecimals):1,d=""+Math.round(a*c)/c;if(null!=b.tickDecimals){var e=d.indexOf("."),f=-1==e?0:d.length-e-1;if(b.tickDecimals>f)return(f?d:d+".")+(""+c).substr(1,b.tickDecimals-f)}return d}),a.isFunction(c.tickFormatter)&&(b.tickFormatter=function(a,b){return""+c.tickFormatter(a,b)}),null!=c.alignTicksWithAxis){var f=("x"==b.direction?o:p)[c.alignTicksWithAxis-1];if(f&&f.used&&f!=b){var g=b.tickGenerator(b);if(g.length>0&&(null==c.min&&(b.min=Math.min(b.min,g[0])),null==c.max&&g.length>1&&(b.max=Math.max(b.max,g[g.length-1]))),b.tickGenerator=function(a){var c,d,b=[];for(d=0;f.ticks.length>d;++d)c=(f.ticks[d].v-f.min)/(f.max-f.min),c=a.min+c*(a.max-a.min),b.push(c);return b},!b.mode&&null==c.tickDecimals){var h=Math.max(0,-Math.floor(Math.log(b.delta)/Math.LN10)+1),i=b.tickGenerator(b);i.length>1&&/\..*0$/.test((i[1]-i[0]).toFixed(h))||(b.tickDecimals=h)}}}}function S(b){var c=b.options.ticks,d=[];null==c||"number"==typeof c&&c>0?d=b.tickGenerator(b):c&&(d=a.isFunction(c)?c(b):c);var e,f;for(b.ticks=[],e=0;d.length>e;++e){var g=null,h=d[e];"object"==typeof h?(f=+h[0],h.length>1&&(g=h[1])):f=+h,null==g&&(g=b.tickFormatter(f,b)),isNaN(f)||b.ticks.push({v:f,label:g})}}function T(a,b){a.options.autoscaleMargin&&b.length>0&&(null==a.options.min&&(a.min=Math.min(a.min,b[0].v)),null==a.options.max&&b.length>1&&(a.max=Math.max(a.max,b[b.length-1].v)))}function U(){j.clear(),v(t.drawBackground,[m]);var a=i.grid;a.show&&a.backgroundColor&&W(),a.show&&!a.aboveData&&X();for(var b=0;h.length>b;++b)v(t.drawSeries,[m,h[b]]),Z(h[b]);v(t.draw,[m]),a.show&&a.aboveData&&X(),j.render()}function V(a,b){for(var c,d,e,f,g=B(),h=0;g.length>h;++h)if(c=g[h],c.direction==b&&(f=b+c.n+"axis",a[f]||1!=c.n||(f=b+"axis"),a[f])){d=a[f].from,e=a[f].to;break}if(a[f]||(c="x"==b?o[0]:p[0],d=a[b+"1"],e=a[b+"2"]),null!=d&&null!=e&&d>e){var i=d;d=e,e=i}return{from:d,to:e,axis:c}}function W(){m.save(),m.translate(q.left,q.top),m.fillStyle=sb(i.grid.backgroundColor,s,0,"rgba(255, 255, 255, 0)"),m.fillRect(0,0,r,s),m.restore()}function X(){var b,c,d,e;m.save(),m.translate(q.left,q.top);var f=i.grid.markings;if(f)for(a.isFunction(f)&&(c=u.getAxes(),c.xmin=c.xaxis.min,c.xmax=c.xaxis.max,c.ymin=c.yaxis.min,c.ymax=c.yaxis.max,f=f(c)),b=0;f.length>b;++b){var g=f[b],h=V(g,"x"),j=V(g,"y");null==h.from&&(h.from=h.axis.min),null==h.to&&(h.to=h.axis.max),null==j.from&&(j.from=j.axis.min),null==j.to&&(j.to=j.axis.max),h.to<h.axis.min||h.from>h.axis.max||j.to<j.axis.min||j.from>j.axis.max||(h.from=Math.max(h.from,h.axis.min),h.to=Math.min(h.to,h.axis.max),j.from=Math.max(j.from,j.axis.min),j.to=Math.min(j.to,j.axis.max),(h.from!=h.to||j.from!=j.to)&&(h.from=h.axis.p2c(h.from),h.to=h.axis.p2c(h.to),j.from=j.axis.p2c(j.from),j.to=j.axis.p2c(j.to),h.from==h.to||j.from==j.to?(m.beginPath(),m.strokeStyle=g.color||i.grid.markingsColor,m.lineWidth=g.lineWidth||i.grid.markingsLineWidth,m.moveTo(h.from,j.from),m.lineTo(h.to,j.to),m.stroke()):(m.fillStyle=g.color||i.grid.markingsColor,m.fillRect(h.from,j.to,h.to-h.from,j.from-j.to))))}c=B(),d=i.grid.borderWidth;for(var k=0;c.length>k;++k){var p,t,v,w,l=c[k],n=l.box,o=l.tickLength;if(l.show&&0!=l.ticks.length){for(m.lineWidth=1,"x"==l.direction?(p=0,t="full"==o?"top"==l.position?0:s:n.top-q.top+("top"==l.position?n.height:0)):(t=0,p="full"==o?"left"==l.position?0:r:n.left-q.left+("left"==l.position?n.width:0)),l.innermost||(m.strokeStyle=l.options.color,m.beginPath(),v=w=0,"x"==l.direction?v=r+1:w=s+1,1==m.lineWidth&&("x"==l.direction?t=Math.floor(t)+.5:p=Math.floor(p)+.5),m.moveTo(p,t),m.lineTo(p+v,t+w),m.stroke()),m.strokeStyle=l.options.tickColor,m.beginPath(),b=0;l.ticks.length>b;++b){var x=l.ticks[b].v;v=w=0,isNaN(x)||l.min>x||x>l.max||"full"==o&&("object"==typeof d&&d[l.position]>0||d>0)&&(x==l.min||x==l.max)||("x"==l.direction?(p=l.p2c(x),w="full"==o?-s:o,"top"==l.position&&(w=-w)):(t=l.p2c(x),v="full"==o?-r:o,"left"==l.position&&(v=-v)),1==m.lineWidth&&("x"==l.direction?p=Math.floor(p)+.5:t=Math.floor(t)+.5),m.moveTo(p,t),m.lineTo(p+v,t+w))}m.stroke()}}d&&(e=i.grid.borderColor,"object"==typeof d||"object"==typeof e?("object"!=typeof d&&(d={top:d,right:d,bottom:d,left:d}),"object"!=typeof e&&(e={top:e,right:e,bottom:e,left:e}),d.top>0&&(m.strokeStyle=e.top,m.lineWidth=d.top,m.beginPath(),m.moveTo(0-d.left,0-d.top/2),m.lineTo(r,0-d.top/2),m.stroke()),d.right>0&&(m.strokeStyle=e.right,m.lineWidth=d.right,m.beginPath(),m.moveTo(r+d.right/2,0-d.top),m.lineTo(r+d.right/2,s),m.stroke()),d.bottom>0&&(m.strokeStyle=e.bottom,m.lineWidth=d.bottom,m.beginPath(),m.moveTo(r+d.right,s+d.bottom/2),m.lineTo(0,s+d.bottom/2),m.stroke()),d.left>0&&(m.strokeStyle=e.left,m.lineWidth=d.left,m.beginPath(),m.moveTo(0-d.left/2,s+d.bottom),m.lineTo(0-d.left/2,0),m.stroke())):(m.lineWidth=d,m.strokeStyle=i.grid.borderColor,m.strokeRect(-d/2,-d/2,r+d,s+d))),m.restore()}function Y(){a.each(B(),function(a,b){if(b.show&&0!=b.ticks.length){var g,h,i,k,l,c=b.box,d=b.direction+"Axis "+b.direction+b.n+"Axis",e="flot-"+b.direction+"-axis flot-"+b.direction+b.n+"-axis "+d,f=b.options.font||"flot-tick-label tickLabel";j.removeText(e);for(var m=0;b.ticks.length>m;++m)g=b.ticks[m],!g.label||g.v<b.min||g.v>b.max||("x"==b.direction?(k="center",h=q.left+b.p2c(g.v),"bottom"==b.position?i=c.top+c.padding:(i=c.top+c.height-c.padding,l="bottom")):(l="middle",i=q.top+b.p2c(g.v),"left"==b.position?(h=c.left+c.width-c.padding,k="right"):h=c.left+c.padding),j.addText(e,h,i,g.label,f,null,k,l))}})}function Z(a){a.lines.show&&$(a),a.bars.show&&bb(a),a.points.show&&_(a)}function $(a){function b(a,b,c,d,e){var f=a.points,g=a.pointsize,h=null,i=null;m.beginPath();for(var j=g;f.length>j;j+=g){var k=f[j-g],l=f[j-g+1],n=f[j],o=f[j+1];if(null!=k&&null!=n){if(o>=l&&e.min>l){if(e.min>o)continue;k=(e.min-l)/(o-l)*(n-k)+k,l=e.min}else if(l>=o&&e.min>o){if(e.min>l)continue;n=(e.min-l)/(o-l)*(n-k)+k,o=e.min}if(l>=o&&l>e.max){if(o>e.max)continue;k=(e.max-l)/(o-l)*(n-k)+k,l=e.max}else if(o>=l&&o>e.max){if(l>e.max)continue;n=(e.max-l)/(o-l)*(n-k)+k,o=e.max}if(n>=k&&d.min>k){if(d.min>n)continue;l=(d.min-k)/(n-k)*(o-l)+l,k=d.min}else if(k>=n&&d.min>n){if(d.min>k)continue;o=(d.min-k)/(n-k)*(o-l)+l,n=d.min}if(k>=n&&k>d.max){if(n>d.max)continue;l=(d.max-k)/(n-k)*(o-l)+l,k=d.max}else if(n>=k&&n>d.max){if(k>d.max)continue;o=(d.max-k)/(n-k)*(o-l)+l,n=d.max}(k!=h||l!=i)&&m.moveTo(d.p2c(k)+b,e.p2c(l)+c),h=n,i=o,m.lineTo(d.p2c(n)+b,e.p2c(o)+c)}}m.stroke()}function c(a,b,c){for(var d=a.points,e=a.pointsize,f=Math.min(Math.max(0,c.min),c.max),g=0,i=!1,j=1,k=0,l=0;;){if(e>0&&g>d.length+e)break;g+=e;var n=d[g-e],o=d[g-e+j],p=d[g],q=d[g+j];if(i){if(e>0&&null!=n&&null==p){l=g,e=-e,j=2;continue}if(0>e&&g==k+e){m.fill(),i=!1,e=-e,j=1,g=k=l+e;continue}}if(null!=n&&null!=p){if(p>=n&&b.min>n){if(b.min>p)continue;o=(b.min-n)/(p-n)*(q-o)+o,n=b.min}else if(n>=p&&b.min>p){if(b.min>n)continue;q=(b.min-n)/(p-n)*(q-o)+o,p=b.min}if(n>=p&&n>b.max){if(p>b.max)continue;o=(b.max-n)/(p-n)*(q-o)+o,n=b.max}else if(p>=n&&p>b.max){if(n>b.max)continue;q=(b.max-n)/(p-n)*(q-o)+o,p=b.max}if(i||(m.beginPath(),m.moveTo(b.p2c(n),c.p2c(f)),i=!0),o>=c.max&&q>=c.max)m.lineTo(b.p2c(n),c.p2c(c.max)),m.lineTo(b.p2c(p),c.p2c(c.max));else if(c.min>=o&&c.min>=q)m.lineTo(b.p2c(n),c.p2c(c.min)),m.lineTo(b.p2c(p),c.p2c(c.min));else{var r=n,s=p;q>=o&&c.min>o&&q>=c.min?(n=(c.min-o)/(q-o)*(p-n)+n,o=c.min):o>=q&&c.min>q&&o>=c.min&&(p=(c.min-o)/(q-o)*(p-n)+n,q=c.min),o>=q&&o>c.max&&c.max>=q?(n=(c.max-o)/(q-o)*(p-n)+n,o=c.max):q>=o&&q>c.max&&c.max>=o&&(p=(c.max-o)/(q-o)*(p-n)+n,q=c.max),n!=r&&m.lineTo(b.p2c(r),c.p2c(o)),m.lineTo(b.p2c(n),c.p2c(o)),m.lineTo(b.p2c(p),c.p2c(q)),p!=s&&(m.lineTo(b.p2c(p),c.p2c(q)),m.lineTo(b.p2c(s),c.p2c(q)))}}}}m.save(),m.translate(q.left,q.top),m.lineJoin="round";var d=a.lines.lineWidth,e=a.shadowSize;if(d>0&&e>0){m.lineWidth=e,m.strokeStyle="rgba(0,0,0,0.1)";var f=Math.PI/18;b(a.datapoints,Math.sin(f)*(d/2+e/2),Math.cos(f)*(d/2+e/2),a.xaxis,a.yaxis),m.lineWidth=e/2,b(a.datapoints,Math.sin(f)*(d/2+e/4),Math.cos(f)*(d/2+e/4),a.xaxis,a.yaxis)}m.lineWidth=d,m.strokeStyle=a.color;var g=cb(a.lines,a.color,0,s);g&&(m.fillStyle=g,c(a.datapoints,a.xaxis,a.yaxis)),d>0&&b(a.datapoints,0,0,a.xaxis,a.yaxis),m.restore()}function _(a){function b(a,b,c,d,e,f,g,h){for(var i=a.points,j=a.pointsize,k=0;i.length>k;k+=j){var l=i[k],n=i[k+1];null==l||f.min>l||l>f.max||g.min>n||n>g.max||(m.beginPath(),l=f.p2c(l),n=g.p2c(n)+d,"circle"==h?m.arc(l,n,b,0,e?Math.PI:2*Math.PI,!1):h(m,l,n,b,e),m.closePath(),c&&(m.fillStyle=c,m.fill()),m.stroke())}}m.save(),m.translate(q.left,q.top);var c=a.points.lineWidth,d=a.shadowSize,e=a.points.radius,f=a.points.symbol;if(0==c&&(c=1e-4),c>0&&d>0){var g=d/2;m.lineWidth=g,m.strokeStyle="rgba(0,0,0,0.1)",b(a.datapoints,e,null,g+g/2,!0,a.xaxis,a.yaxis,f),m.strokeStyle="rgba(0,0,0,0.2)",b(a.datapoints,e,null,g/2,!0,a.xaxis,a.yaxis,f)}m.lineWidth=c,m.strokeStyle=a.color,b(a.datapoints,e,cb(a.points,a.color),0,!1,a.xaxis,a.yaxis,f),m.restore()}function ab(a,b,c,d,e,f,g,h,i,j,k,l){var m,n,o,p,q,r,s,t,u;k?(t=r=s=!0,q=!1,m=c,n=a,p=b+d,o=b+e,m>n&&(u=n,n=m,m=u,q=!0,r=!1)):(q=r=s=!0,t=!1,m=a+d,n=a+e,o=c,p=b,o>p&&(u=p,p=o,o=u,t=!0,s=!1)),h.min>n||m>h.max||i.min>p||o>i.max||(h.min>m&&(m=h.min,q=!1),n>h.max&&(n=h.max,r=!1),i.min>o&&(o=i.min,t=!1),p>i.max&&(p=i.max,s=!1),m=h.p2c(m),o=i.p2c(o),n=h.p2c(n),p=i.p2c(p),g&&(j.beginPath(),j.moveTo(m,o),j.lineTo(m,p),j.lineTo(n,p),j.lineTo(n,o),j.fillStyle=g(o,p),j.fill()),l>0&&(q||r||s||t)&&(j.beginPath(),j.moveTo(m,o+f),q?j.lineTo(m,p+f):j.moveTo(m,p+f),s?j.lineTo(n,p+f):j.moveTo(n,p+f),r?j.lineTo(n,o+f):j.moveTo(n,o+f),t?j.lineTo(m,o+f):j.moveTo(m,o+f),j.stroke()))}function bb(a){function b(b,c,d,e,f,g,h){for(var i=b.points,j=b.pointsize,k=0;i.length>k;k+=j)null!=i[k]&&ab(i[k],i[k+1],i[k+2],c,d,e,f,g,h,m,a.bars.horizontal,a.bars.lineWidth)}m.save(),m.translate(q.left,q.top),m.lineWidth=a.bars.lineWidth,m.strokeStyle=a.color;var c;switch(a.bars.align){case"left":c=0;break;case"right":c=-a.bars.barWidth;break;case"center":c=-a.bars.barWidth/2;break;default:throw Error("Invalid bar alignment: "+a.bars.align)}var d=a.bars.fill?function(b,c){return cb(a.bars,a.color,b,c)}:null;b(a.datapoints,c,c+a.bars.barWidth,0,d,a.xaxis,a.yaxis),m.restore()}function cb(b,c,d,e){var f=b.fill;if(!f)return null;if(b.fillColor)return sb(b.fillColor,d,e,c);var g=a.color.parse(c);return g.a="number"==typeof f?f:.4,g.normalize(),""+g}function db(){if(b.find(".legend").remove(),i.legend.show){for(var g,j,c=[],d=[],e=!1,f=i.legend.labelFormatter,k=0;h.length>k;++k)g=h[k],g.label&&(j=f?f(g.label,g):g.label,j&&d.push({label:j,color:g.color}));if(i.legend.sorted)if(a.isFunction(i.legend.sorted))d.sort(i.legend.sorted);else if("reverse"==i.legend.sorted)d.reverse();else{var l="descending"!=i.legend.sorted;d.sort(function(a,b){return a.label==b.label?0:a.label<b.label!=l?1:-1})}for(var k=0;d.length>k;++k){var m=d[k];0==k%i.legend.noColumns&&(e&&c.push("</tr>"),c.push("<tr>"),e=!0),c.push('<td class="legendColorBox"><div style="border:1px solid '+i.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+m.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+m.label+"</td>")}if(e&&c.push("</tr>"),0!=c.length){var n='<table style="font-size:smaller;color:'+i.grid.color+'">'+c.join("")+"</table>";if(null!=i.legend.container)a(i.legend.container).html(n);else{var o="",p=i.legend.position,r=i.legend.margin;null==r[0]&&(r=[r,r]),"n"==p.charAt(0)?o+="top:"+(r[1]+q.top)+"px;":"s"==p.charAt(0)&&(o+="bottom:"+(r[1]+q.bottom)+"px;"),"e"==p.charAt(1)?o+="right:"+(r[0]+q.right)+"px;":"w"==p.charAt(1)&&(o+="left:"+(r[0]+q.left)+"px;");var s=a('<div class="legend">'+n.replace('style="','style="position:absolute;'+o+";")+"</div>").appendTo(b);if(0!=i.legend.backgroundOpacity){var t=i.legend.backgroundColor;null==t&&(t=i.grid.backgroundColor,t=t&&"string"==typeof t?a.color.parse(t):a.color.extract(s,"background-color"),t.a=1,t=""+t);var u=s.children();a('<div style="position:absolute;width:'+u.width()+"px;height:"+u.height()+"px;"+o+"background-color:"+t+';"> </div>').prependTo(s).css("opacity",i.legend.backgroundOpacity)}}}}}function gb(a,b,c){var j,k,l,d=i.grid.mouseActiveRadius,e=d*d+1,f=null;for(j=h.length-1;j>=0;--j)if(c(h[j])){var m=h[j],n=m.xaxis,o=m.yaxis,p=m.datapoints.points,q=n.c2p(a),r=o.c2p(b),s=d/n.scale,t=d/o.scale;if(l=m.datapoints.pointsize,n.options.inverseTransform&&(s=Number.MAX_VALUE),o.options.inverseTransform&&(t=Number.MAX_VALUE),m.lines.show||m.points.show)for(k=0;p.length>k;k+=l){var u=p[k],v=p[k+1];if(null!=u&&!(u-q>s||-s>u-q||v-r>t||-t>v-r)){var w=Math.abs(n.p2c(u)-a),x=Math.abs(o.p2c(v)-b),y=w*w+x*x;e>y&&(e=y,f=[j,k/l])}}if(m.bars.show&&!f){var z="left"==m.bars.align?0:-m.bars.barWidth/2,A=z+m.bars.barWidth;for(k=0;p.length>k;k+=l){var u=p[k],v=p[k+1],B=p[k+2];null!=u&&(h[j].bars.horizontal?Math.max(B,u)>=q&&q>=Math.min(B,u)&&r>=v+z&&v+A>=r:q>=u+z&&u+A>=q&&r>=Math.min(B,v)&&Math.max(B,v)>=r)&&(f=[j,k/l])}}}return f?(j=f[0],k=f[1],l=h[j].datapoints.pointsize,{datapoint:h[j].datapoints.points.slice(k*l,(k+1)*l),dataIndex:k,series:h[j],seriesIndex:j}):null}function hb(a){i.grid.hoverable&&kb("plothover",a,function(a){return 0!=a.hoverable})}function ib(a){i.grid.hoverable&&kb("plothover",a,function(){return!1})}function jb(a){kb("plotclick",a,function(a){return 0!=a.clickable})}function kb(a,c,d){var e=l.offset(),f=c.pageX-e.left-q.left,g=c.pageY-e.top-q.top,h=C({left:f,top:g});h.pageX=c.pageX,h.pageY=c.pageY;var j=gb(f,g,d);if(j&&(j.pageX=parseInt(j.series.xaxis.p2c(j.datapoint[0])+e.left+q.left,10),j.pageY=parseInt(j.series.yaxis.p2c(j.datapoint[1])+e.top+q.top,10)),i.grid.autoHighlight){for(var k=0;eb.length>k;++k){var m=eb[k];m.auto!=a||j&&m.series==j.series&&m.point[0]==j.datapoint[0]&&m.point[1]==j.datapoint[1]||ob(m.series,m.point)}j&&nb(j.series,j.datapoint,a)}b.trigger(a,[h,j])}function lb(){var a=i.interaction.redrawOverlayInterval;return-1==a?(mb(),void 0):(fb||(fb=setTimeout(mb,a)),void 0)}function mb(){fb=null,n.save(),k.clear(),n.translate(q.left,q.top);var a,b;for(a=0;eb.length>a;++a)b=eb[a],b.series.bars.show?rb(b.series,b.point):qb(b.series,b.point);n.restore(),v(t.drawOverlay,[n])}function nb(a,b,c){if("number"==typeof a&&(a=h[a]),"number"==typeof b){var d=a.datapoints.pointsize;b=a.datapoints.points.slice(d*b,d*(b+1))}var e=pb(a,b);-1==e?(eb.push({series:a,point:b,auto:c}),lb()):c||(eb[e].auto=!1)}function ob(a,b){if(null==a&&null==b)return eb=[],lb(),void 0;if("number"==typeof a&&(a=h[a]),"number"==typeof b){var c=a.datapoints.pointsize;b=a.datapoints.points.slice(c*b,c*(b+1))}var d=pb(a,b);-1!=d&&(eb.splice(d,1),lb())}function pb(a,b){for(var c=0;eb.length>c;++c){var d=eb[c];if(d.series==a&&d.point[0]==b[0]&&d.point[1]==b[1])return c}return-1}function qb(b,c){var d=c[0],e=c[1],f=b.xaxis,g=b.yaxis,h="string"==typeof b.highlightColor?b.highlightColor:""+a.color.parse(b.color).scale("a",.5);if(!(f.min>d||d>f.max||g.min>e||e>g.max)){var i=b.points.radius+b.points.lineWidth/2;n.lineWidth=i,n.strokeStyle=h;var j=1.5*i;d=f.p2c(d),e=g.p2c(e),n.beginPath(),"circle"==b.points.symbol?n.arc(d,e,j,0,2*Math.PI,!1):b.points.symbol(n,d,e,j,!1),n.closePath(),n.stroke()}}function rb(b,c){var d="string"==typeof b.highlightColor?b.highlightColor:""+a.color.parse(b.color).scale("a",.5),e=d,f="left"==b.bars.align?0:-b.bars.barWidth/2;n.lineWidth=b.bars.lineWidth,n.strokeStyle=d,ab(c[0],c[1],c[2]||0,f,f+b.bars.barWidth,0,function(){return e},b.xaxis,b.yaxis,n,b.bars.horizontal,b.bars.lineWidth)}function sb(b,c,d,e){if("string"==typeof b)return b;for(var f=m.createLinearGradient(0,d,0,c),g=0,h=b.colors.length;h>g;++g){var i=b.colors[g];if("string"!=typeof i){var j=a.color.parse(e);null!=i.brightness&&(j=j.scale("rgb",i.brightness)),null!=i.opacity&&(j.a*=i.opacity),i=""+j}f.addColorStop(g/(h-1),i)}return f}var h=[],i={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,timezone:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:!1},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},j=null,k=null,l=null,m=null,n=null,o=[],p=[],q={left:0,right:0,top:0,bottom:0},r=0,s=0,t={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},u=this;u.setData=y,u.setupGrid=P,u.draw=U,u.getPlaceholder=function(){return b},u.getCanvas=function(){return j.element},u.getPlotOffset=function(){return q},u.width=function(){return r},u.height=function(){return s},u.offset=function(){var a=l.offset();return a.left+=q.left,a.top+=q.top,a},u.getData=function(){return h},u.getAxes=function(){var b={};return a.each(o.concat(p),function(a,c){c&&(b[c.direction+(1!=c.n?c.n:"")+"axis"]=c)}),b},u.getXAxes=function(){return o},u.getYAxes=function(){return p},u.c2p=C,u.p2c=D,u.getOptions=function(){return i},u.highlight=nb,u.unhighlight=ob,u.triggerRedrawOverlay=lb,u.pointOffset=function(a){return{left:parseInt(o[A(a,"x")-1].p2c(+a.x)+q.left,10),top:parseInt(p[A(a,"y")-1].p2c(+a.y)+q.top,10)}},u.shutdown=J,u.resize=function(){var a=b.width(),c=b.height();j.resize(a,c),k.resize(a,c)},u.hooks=t,w(u),x(f),H(),y(d),P(),U(),I();var eb=[],fb=null}function e(a,b){return b*Math.floor(a/b)}var b=Object.prototype.hasOwnProperty;a(function(){a("head").prepend(["<style id='flot-default-styles'>",".flot-tick-label {font-size:smaller;color:#545454;}","</style>"].join(""))}),c.prototype.resize=function(a,b){if(0>=a||0>=b)throw Error("Invalid dimensions for plot, width = "+a+", height = "+b);var c=this.element,d=this.context,e=this.pixelRatio;this.width!=a&&(c.width=a*e,c.style.width=a+"px",this.width=a),this.height!=b&&(c.height=b*e,c.style.height=b+"px",this.height=b),d.restore(),d.save(),d.scale(e,e)},c.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},c.prototype.render=function(){var a=this._textCache;for(var c in a)if(b.call(a,c)){var d=this.getTextLayer(c),e=a[c];d.hide();for(var f in e)if(b.call(e,f)){var g=e[f];for(var h in g)if(b.call(g,h)){var i=g[h];i.active?i.rendered||(d.append(i.element),i.rendered=!0):(delete g[h],i.rendered&&i.element.detach())}}d.show()}},c.prototype.getTextLayer=function(b){var c=this.text[b];return null==c&&(c=this.text[b]=a("<div></div>").addClass("flot-text "+b).css({position:"absolute",top:0,left:0,bottom:0,right:0}).insertAfter(this.element)),c},c.prototype.getTextInfo=function(b,c,d){var f,g,h,i;if(c=""+c,f="object"==typeof d?d.style+" "+d.variant+" "+d.weight+" "+d.size+"px "+d.family:d,g=this._textCache[b],null==g&&(g=this._textCache[b]={}),h=g[f],null==h&&(h=g[f]={}),i=h[c],null==i){var j=a("<div></div>").html(c).css({position:"absolute",top:-9999}).appendTo(this.getTextLayer(b));"object"==typeof d?j.css({font:f,color:d.color}):"string"==typeof d&&j.addClass(d),i=h[c]={active:!1,rendered:!1,element:j,width:j.outerWidth(!0),height:j.outerHeight(!0)},j.detach()}return i},c.prototype.addText=function(a,b,c,d,e,f,g,h){var i=this.getTextInfo(a,d,e,f);i.active=!0,"center"==g?b-=i.width/2:"right"==g&&(b-=i.width),"middle"==h?c-=i.height/2:"bottom"==h&&(c-=i.height),i.element.css({top:parseInt(c,10),left:parseInt(b,10)})},c.prototype.removeText=function(a,c,d,e){if(null==c){var f=this._textCache[a];if(null!=f)for(var g in f)if(b.call(f,g)){var h=f[g];for(var i in h)b.call(h,i)&&(h[i].active=!1)}}else this.getTextInfo(a,c,d,e).active=!1},a.plot=function(b,c,e){var f=new d(a(b),c,e,a.plot.plugins);return f},a.plot.version="0.8.0-beta",a.plot.plugins=[],a.fn.plot=function(b,c){return this.each(function(){a.plot(this,b,c)})}})(jQuery);
// Javascript plotting library for jQuery, version 0.8.3.
// the actual Flot code
(function($) {
// Cache the prototype hasOwnProperty for faster access
var hasOwnProperty = Object.prototype.hasOwnProperty;
// A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM
// operation produces the same effect as detach, i.e. removing the element
// without touching its jQuery data.
// Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
if (!$.fn.detach) {
$.fn.detach = function() {
return this.each(function() {
if (this.parentNode) {
this.parentNode.removeChild( this );
}
});
};
}
///////////////////////////////////////////////////////////////////////////
// The Canvas object is a wrapper around an HTML5 <canvas> tag.
//
// @constructor
// @param {string} cls List of classes to apply to the canvas.
// @param {element} container Element onto which to append the canvas.
//
// Requiring a container is a little iffy, but unfortunately canvas
// operations don't work unless the canvas is attached to the DOM.
function Canvas(cls, container) {
var element = container.children("." + cls)[0];
if (element == null) {
element = document.createElement("canvas");
element.className = cls;
$(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
.appendTo(container);
// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
if (!element.getContext) {
if (window.G_vmlCanvasManager) {
element = window.G_vmlCanvasManager.initElement(element);
} else {
throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
}
}
}
this.element = element;
var context = this.context = element.getContext("2d");
// Determine the screen's ratio of physical to device-independent
// pixels. This is the ratio between the canvas width that the browser
// advertises and the number of pixels actually present in that space.
// The iPhone 4, for example, has a device-independent width of 320px,
// but its screen is actually 640px wide. It therefore has a pixel
// ratio of 2, while most normal devices have a ratio of 1.
var devicePixelRatio = window.devicePixelRatio || 1,
backingStoreRatio =
context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio || 1;
this.pixelRatio = devicePixelRatio / backingStoreRatio;
// Size the canvas to match the internal dimensions of its container
this.resize(container.width(), container.height());
// Collection of HTML div layers for text overlaid onto the canvas
this.textContainer = null;
this.text = {};
// Cache of text fragments and metrics, so we can avoid expensively
// re-calculating them when the plot is re-rendered in a loop.
this._textCache = {};
}
// Resizes the canvas to the given dimensions.
//
// @param {number} width New width of the canvas, in pixels.
// @param {number} width New height of the canvas, in pixels.
Canvas.prototype.resize = function(width, height) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
}
var element = this.element,
context = this.context,
pixelRatio = this.pixelRatio;
// Resize the canvas, increasing its density based on the display's
// pixel ratio; basically giving it more pixels without increasing the
// size of its element, to take advantage of the fact that retina
// displays have that many more pixels in the same advertised space.
// Resizing should reset the state (excanvas seems to be buggy though)
if (this.width != width) {
element.width = width * pixelRatio;
element.style.width = width + "px";
this.width = width;
}
if (this.height != height) {
element.height = height * pixelRatio;
element.style.height = height + "px";
this.height = height;
}
// Save the context, so we can reset in case we get replotted. The
// restore ensure that we're really back at the initial state, and
// should be safe even if we haven't saved the initial state yet.
context.restore();
context.save();
// Scale the coordinate space to match the display density; so even though we
// may have twice as many pixels, we still want lines and other drawing to
// appear at the same size; the extra pixels will just make them crisper.
context.scale(pixelRatio, pixelRatio);
};
// Clears the entire canvas area, not including any overlaid HTML text
Canvas.prototype.clear = function() {
this.context.clearRect(0, 0, this.width, this.height);
};
// Finishes rendering the canvas, including managing the text overlay.
Canvas.prototype.render = function() {
var cache = this._textCache;
// For each text layer, add elements marked as active that haven't
// already been rendered, and remove those that are no longer active.
for (var layerKey in cache) {
if (hasOwnProperty.call(cache, layerKey)) {
var layer = this.getTextLayer(layerKey),
layerCache = cache[layerKey];
layer.hide();
for (var styleKey in layerCache) {
if (hasOwnProperty.call(layerCache, styleKey)) {
var styleCache = layerCache[styleKey];
for (var key in styleCache) {
if (hasOwnProperty.call(styleCache, key)) {
var positions = styleCache[key].positions;
for (var i = 0, position; position = positions[i]; i++) {
if (position.active) {
if (!position.rendered) {
layer.append(position.element);
position.rendered = true;
}
} else {
positions.splice(i--, 1);
if (position.rendered) {
position.element.detach();
}
}
}
if (positions.length == 0) {
delete styleCache[key];
}
}
}
}
}
layer.show();
}
}
};
// Creates (if necessary) and returns the text overlay container.
//
// @param {string} classes String of space-separated CSS classes used to
// uniquely identify the text layer.
// @return {object} The jQuery-wrapped text-layer div.
Canvas.prototype.getTextLayer = function(classes) {
var layer = this.text[classes];
// Create the text layer if it doesn't exist
if (layer == null) {
// Create the text layer container, if it doesn't exist
if (this.textContainer == null) {
this.textContainer = $("<div class='flot-text'></div>")
.css({
position: "absolute",
top: 0,
left: 0,
bottom: 0,
right: 0,
'font-size': "smaller",
color: "#545454"
})
.insertAfter(this.element);
}
layer = this.text[classes] = $("<div></div>")
.addClass(classes)
.css({
position: "absolute",
top: 0,
left: 0,
bottom: 0,
right: 0
})
.appendTo(this.textContainer);
}
return layer;
};
// Creates (if necessary) and returns a text info object.
//
// The object looks like this:
//
// {
// width: Width of the text's wrapper div.
// height: Height of the text's wrapper div.
// element: The jQuery-wrapped HTML div containing the text.
// positions: Array of positions at which this text is drawn.
// }
//
// The positions array contains objects that look like this:
//
// {
// active: Flag indicating whether the text should be visible.
// rendered: Flag indicating whether the text is currently visible.
// element: The jQuery-wrapped HTML div containing the text.
// x: X coordinate at which to draw the text.
// y: Y coordinate at which to draw the text.
// }
//
// Each position after the first receives a clone of the original element.
//
// The idea is that that the width, height, and general 'identity' of the
// text is constant no matter where it is placed; the placements are a
// secondary property.
//
// Canvas maintains a cache of recently-used text info objects; getTextInfo
// either returns the cached element or creates a new entry.
//
// @param {string} layer A string of space-separated CSS classes uniquely
// identifying the layer containing this text.
// @param {string} text Text string to retrieve info for.
// @param {(string|object)=} font Either a string of space-separated CSS
// classes or a font-spec object, defining the text's font and style.
// @param {number=} angle Angle at which to rotate the text, in degrees.
// Angle is currently unused, it will be implemented in the future.
// @param {number=} width Maximum width of the text before it wraps.
// @return {object} a text info object.
Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
var textStyle, layerCache, styleCache, info;
// Cast the value to a string, in case we were given a number or such
text = "" + text;
// If the font is a font-spec object, generate a CSS font definition
if (typeof font === "object") {
textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
} else {
textStyle = font;
}
// Retrieve (or create) the cache for the text's layer and styles
layerCache = this._textCache[layer];
if (layerCache == null) {
layerCache = this._textCache[layer] = {};
}
styleCache = layerCache[textStyle];
if (styleCache == null) {
styleCache = layerCache[textStyle] = {};
}
info = styleCache[text];
// If we can't find a matching element in our cache, create a new one
if (info == null) {
var element = $("<div></div>").html(text)
.css({
position: "absolute",
'max-width': width,
top: -9999
})
.appendTo(this.getTextLayer(layer));
if (typeof font === "object") {
element.css({
font: textStyle,
color: font.color
});
} else if (typeof font === "string") {
element.addClass(font);
}
info = styleCache[text] = {
width: element.outerWidth(true),
height: element.outerHeight(true),
element: element,
positions: []
};
element.detach();
}
return info;
};
// Adds a text string to the canvas text overlay.
//
// The text isn't drawn immediately; it is marked as rendering, which will
// result in its addition to the canvas on the next render pass.
//
// @param {string} layer A string of space-separated CSS classes uniquely
// identifying the layer containing this text.
// @param {number} x X coordinate at which to draw the text.
// @param {number} y Y coordinate at which to draw the text.
// @param {string} text Text string to draw.
// @param {(string|object)=} font Either a string of space-separated CSS
// classes or a font-spec object, defining the text's font and style.
// @param {number=} angle Angle at which to rotate the text, in degrees.
// Angle is currently unused, it will be implemented in the future.
// @param {number=} width Maximum width of the text before it wraps.
// @param {string=} halign Horizontal alignment of the text; either "left",
// "center" or "right".
// @param {string=} valign Vertical alignment of the text; either "top",
// "middle" or "bottom".
Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
var info = this.getTextInfo(layer, text, font, angle, width),
positions = info.positions;
// Tweak the div's position to match the text's alignment
if (halign == "center") {
x -= info.width / 2;
} else if (halign == "right") {
x -= info.width;
}
if (valign == "middle") {
y -= info.height / 2;
} else if (valign == "bottom") {
y -= info.height;
}
// Determine whether this text already exists at this position.
// If so, mark it for inclusion in the next render pass.
for (var i = 0, position; position = positions[i]; i++) {
if (position.x == x && position.y == y) {
position.active = true;
return;
}
}
// If the text doesn't exist at this position, create a new entry
// For the very first position we'll re-use the original element,
// while for subsequent ones we'll clone it.
position = {
active: true,
rendered: false,
element: positions.length ? info.element.clone() : info.element,
x: x,
y: y
};
positions.push(position);
// Move the element to its final position within the container
position.element.css({
top: Math.round(y),
left: Math.round(x),
'text-align': halign // In case the text wraps
});
};
// Removes one or more text strings from the canvas text overlay.
//
// If no parameters are given, all text within the layer is removed.
//
// Note that the text is not immediately removed; it is simply marked as
// inactive, which will result in its removal on the next render pass.
// This avoids the performance penalty for 'clear and redraw' behavior,
// where we potentially get rid of all text on a layer, but will likely
// add back most or all of it later, as when redrawing axes, for example.
//
// @param {string} layer A string of space-separated CSS classes uniquely
// identifying the layer containing this text.
// @param {number=} x X coordinate of the text.
// @param {number=} y Y coordinate of the text.
// @param {string=} text Text string to remove.
// @param {(string|object)=} font Either a string of space-separated CSS
// classes or a font-spec object, defining the text's font and style.
// @param {number=} angle Angle at which the text is rotated, in degrees.
// Angle is currently unused, it will be implemented in the future.
Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
if (text == null) {
var layerCache = this._textCache[layer];
if (layerCache != null) {
for (var styleKey in layerCache) {
if (hasOwnProperty.call(layerCache, styleKey)) {
var styleCache = layerCache[styleKey];
for (var key in styleCache) {
if (hasOwnProperty.call(styleCache, key)) {
var positions = styleCache[key].positions;
for (var i = 0, position; position = positions[i]; i++) {
position.active = false;
}
}
}
}
}
}
} else {
var positions = this.getTextInfo(layer, text, font, angle).positions;
for (var i = 0, position; position = positions[i]; i++) {
if (position.x == x && position.y == y) {
position.active = false;
}
}
}
};
///////////////////////////////////////////////////////////////////////////
// The top-level container for the entire plot.
function Plot(placeholder, data_, options_, plugins) {
// data is on the form:
// [ series1, series2 ... ]
// where series is either just the data as [ [x1, y1], [x2, y2], ... ]
// or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
var series = [],
options = {
// the color theme used for graphs
colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
legend: {
show: true,
noColumns: 1, // number of colums in legend table
labelFormatter: null, // fn: string -> string
labelBoxBorderColor: "#ccc", // border color for the little label boxes
container: null, // container (as jQuery object) to put legend in, null means default on top of graph
position: "ne", // position of default legend container within plot
margin: 5, // distance from grid edge to default legend container within plot
backgroundColor: null, // null means auto-detect
backgroundOpacity: 0.85, // set to 0 to avoid background
sorted: null // default to no legend sorting
},
xaxis: {
show: null, // null = auto-detect, true = always, false = never
position: "bottom", // or "top"
mode: null, // null or "time"
font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
color: null, // base color, labels, ticks
tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
transform: null, // null or f: number -> number to transform axis
inverseTransform: null, // if transform is set, this should be the inverse function
min: null, // min. value to show, null means set automatically
max: null, // max. value to show, null means set automatically
autoscaleMargin: null, // margin in % to add if auto-setting min/max
ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
tickFormatter: null, // fn: number -> string
labelWidth: null, // size of tick labels in pixels
labelHeight: null,
reserveSpace: null, // whether to reserve space even if axis isn't shown
tickLength: null, // size in pixels of ticks, or "full" for whole line
alignTicksWithAxis: null, // axis number or null for no sync
tickDecimals: null, // no. of decimals, null means auto
tickSize: null, // number or [number, "unit"]
minTickSize: null // number or [number, "unit"]
},
yaxis: {
autoscaleMargin: 0.02,
position: "left" // or "right"
},
xaxes: [],
yaxes: [],
series: {
points: {
show: false,
radius: 3,
lineWidth: 2, // in pixels
fill: true,
fillColor: "#ffffff",
symbol: "circle" // or callback
},
lines: {
// we don't put in show: false so we can see
// whether lines were actively disabled
lineWidth: 2, // in pixels
fill: false,
fillColor: null,
steps: false
// Omit 'zero', so we can later default its value to
// match that of the 'fill' option.
},
bars: {
show: false,
lineWidth: 2, // in pixels
barWidth: 1, // in units of the x axis
fill: true,
fillColor: null,
align: "left", // "left", "right", or "center"
horizontal: false,
zero: true
},
shadowSize: 3,
highlightColor: null
},
grid: {
show: true,
aboveData: false,
color: "#545454", // primary color used for outline and labels
backgroundColor: null, // null for transparent, else color
borderColor: null, // set if different from the grid color
tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
margin: 0, // distance from the canvas edge to the grid
labelMargin: 5, // in pixels
axisMargin: 8, // in pixels
borderWidth: 2, // in pixels
minBorderMargin: null, // in pixels, null means taken from points radius
markings: null, // array of ranges or fn: axes -> array of ranges
markingsColor: "#f4f4f4",
markingsLineWidth: 2,
// interactive stuff
clickable: false,
hoverable: false,
autoHighlight: true, // highlight in case mouse is near
mouseActiveRadius: 10 // how far the mouse can be away to activate an item
},
interaction: {
redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
},
hooks: {}
},
surface = null, // the canvas for the plot itself
overlay = null, // canvas for interactive stuff on top of plot
eventHolder = null, // jQuery object that events should be bound to
ctx = null, octx = null,
xaxes = [], yaxes = [],
plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
plotWidth = 0, plotHeight = 0,
hooks = {
processOptions: [],
processRawData: [],
processDatapoints: [],
processOffset: [],
drawBackground: [],
drawSeries: [],
draw: [],
bindEvents: [],
drawOverlay: [],
shutdown: []
},
plot = this;
// public functions
plot.setData = setData;
plot.setupGrid = setupGrid;
plot.draw = draw;
plot.getPlaceholder = function() { return placeholder; };
plot.getCanvas = function() { return surface.element; };
plot.getPlotOffset = function() { return plotOffset; };
plot.width = function () { return plotWidth; };
plot.height = function () { return plotHeight; };
plot.offset = function () {
var o = eventHolder.offset();
o.left += plotOffset.left;
o.top += plotOffset.top;
return o;
};
plot.getData = function () { return series; };
plot.getAxes = function () {
var res = {}, i;
$.each(xaxes.concat(yaxes), function (_, axis) {
if (axis)
res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
});
return res;
};
plot.getXAxes = function () { return xaxes; };
plot.getYAxes = function () { return yaxes; };
plot.c2p = canvasToAxisCoords;
plot.p2c = axisToCanvasCoords;
plot.getOptions = function () { return options; };
plot.highlight = highlight;
plot.unhighlight = unhighlight;
plot.triggerRedrawOverlay = triggerRedrawOverlay;
plot.pointOffset = function(point) {
return {
left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
};
};
plot.shutdown = shutdown;
plot.destroy = function () {
shutdown();
placeholder.removeData("plot").empty();
series = [];
options = null;
surface = null;
overlay = null;
eventHolder = null;
ctx = null;
octx = null;
xaxes = [];
yaxes = [];
hooks = null;
highlights = [];
plot = null;
};
plot.resize = function () {
var width = placeholder.width(),
height = placeholder.height();
surface.resize(width, height);
overlay.resize(width, height);
};
// public attributes
plot.hooks = hooks;
// initialize
initPlugins(plot);
parseOptions(options_);
setupCanvases();
setData(data_);
setupGrid();
draw();
bindEvents();
function executeHooks(hook, args) {
args = [plot].concat(args);
for (var i = 0; i < hook.length; ++i)
hook[i].apply(this, args);
}
function initPlugins() {
// References to key classes, allowing plugins to modify them
var classes = {
Canvas: Canvas
};
for (var i = 0; i < plugins.length; ++i) {
var p = plugins[i];
p.init(plot, classes);
if (p.options)
$.extend(true, options, p.options);
}
}
function parseOptions(opts) {
$.extend(true, options, opts);
// $.extend merges arrays, rather than replacing them. When less
// colors are provided than the size of the default palette, we
// end up with those colors plus the remaining defaults, which is
// not expected behavior; avoid it by replacing them here.
if (opts && opts.colors) {
options.colors = opts.colors;
}
if (options.xaxis.color == null)
options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
if (options.yaxis.color == null)
options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
if (options.grid.borderColor == null)
options.grid.borderColor = options.grid.color;
if (options.grid.tickColor == null)
options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
// Fill in defaults for axis options, including any unspecified
// font-spec fields, if a font-spec was provided.
// If no x/y axis options were provided, create one of each anyway,
// since the rest of the code assumes that they exist.
var i, axisOptions, axisCount,
fontSize = placeholder.css("font-size"),
fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
fontDefaults = {
style: placeholder.css("font-style"),
size: Math.round(0.8 * fontSizeDefault),
variant: placeholder.css("font-variant"),
weight: placeholder.css("font-weight"),
family: placeholder.css("font-family")
};
axisCount = options.xaxes.length || 1;
for (i = 0; i < axisCount; ++i) {
axisOptions = options.xaxes[i];
if (axisOptions && !axisOptions.tickColor) {
axisOptions.tickColor = axisOptions.color;
}
axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
options.xaxes[i] = axisOptions;
if (axisOptions.font) {
axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
if (!axisOptions.font.color) {
axisOptions.font.color = axisOptions.color;
}
if (!axisOptions.font.lineHeight) {
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
}
}
}
axisCount = options.yaxes.length || 1;
for (i = 0; i < axisCount; ++i) {
axisOptions = options.yaxes[i];
if (axisOptions && !axisOptions.tickColor) {
axisOptions.tickColor = axisOptions.color;
}
axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
options.yaxes[i] = axisOptions;
if (axisOptions.font) {
axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
if (!axisOptions.font.color) {
axisOptions.font.color = axisOptions.color;
}
if (!axisOptions.font.lineHeight) {
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
}
}
}
// backwards compatibility, to be removed in future
if (options.xaxis.noTicks && options.xaxis.ticks == null)
options.xaxis.ticks = options.xaxis.noTicks;
if (options.yaxis.noTicks && options.yaxis.ticks == null)
options.yaxis.ticks = options.yaxis.noTicks;
if (options.x2axis) {
options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
options.xaxes[1].position = "top";
// Override the inherit to allow the axis to auto-scale
if (options.x2axis.min == null) {
options.xaxes[1].min = null;
}
if (options.x2axis.max == null) {
options.xaxes[1].max = null;
}
}
if (options.y2axis) {
options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
options.yaxes[1].position = "right";
// Override the inherit to allow the axis to auto-scale
if (options.y2axis.min == null) {
options.yaxes[1].min = null;
}
if (options.y2axis.max == null) {
options.yaxes[1].max = null;
}
}
if (options.grid.coloredAreas)
options.grid.markings = options.grid.coloredAreas;
if (options.grid.coloredAreasColor)
options.grid.markingsColor = options.grid.coloredAreasColor;
if (options.lines)
$.extend(true, options.series.lines, options.lines);
if (options.points)
$.extend(true, options.series.points, options.points);
if (options.bars)
$.extend(true, options.series.bars, options.bars);
if (options.shadowSize != null)
options.series.shadowSize = options.shadowSize;
if (options.highlightColor != null)
options.series.highlightColor = options.highlightColor;
// save options on axes for future reference
for (i = 0; i < options.xaxes.length; ++i)
getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
for (i = 0; i < options.yaxes.length; ++i)
getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
// add hooks from options
for (var n in hooks)
if (options.hooks[n] && options.hooks[n].length)
hooks[n] = hooks[n].concat(options.hooks[n]);
executeHooks(hooks.processOptions, [options]);
}
function setData(d) {
series = parseData(d);
fillInSeriesOptions();
processData();
}
function parseData(d) {
var res = [];
for (var i = 0; i < d.length; ++i) {
var s = $.extend(true, {}, options.series);
if (d[i].data != null) {
s.data = d[i].data; // move the data instead of deep-copy
delete d[i].data;
$.extend(true, s, d[i]);
d[i].data = s.data;
}
else
s.data = d[i];
res.push(s);
}
return res;
}
function axisNumber(obj, coord) {
var a = obj[coord + "axis"];
if (typeof a == "object") // if we got a real axis, extract number
a = a.n;
if (typeof a != "number")
a = 1; // default to first axis
return a;
}
function allAxes() {
// return flat array without annoying null entries
return $.grep(xaxes.concat(yaxes), function (a) { return a; });
}
function canvasToAxisCoords(pos) {
// return an object with x/y corresponding to all used axes
var res = {}, i, axis;
for (i = 0; i < xaxes.length; ++i) {
axis = xaxes[i];
if (axis && axis.used)
res["x" + axis.n] = axis.c2p(pos.left);
}
for (i = 0; i < yaxes.length; ++i) {
axis = yaxes[i];
if (axis && axis.used)
res["y" + axis.n] = axis.c2p(pos.top);
}
if (res.x1 !== undefined)
res.x = res.x1;
if (res.y1 !== undefined)
res.y = res.y1;
return res;
}
function axisToCanvasCoords(pos) {
// get canvas coords from the first pair of x/y found in pos
var res = {}, i, axis, key;
for (i = 0; i < xaxes.length; ++i) {
axis = xaxes[i];
if (axis && axis.used) {
key = "x" + axis.n;
if (pos[key] == null && axis.n == 1)
key = "x";
if (pos[key] != null) {
res.left = axis.p2c(pos[key]);
break;
}
}
}
for (i = 0; i < yaxes.length; ++i) {
axis = yaxes[i];
if (axis && axis.used) {
key = "y" + axis.n;
if (pos[key] == null && axis.n == 1)
key = "y";
if (pos[key] != null) {
res.top = axis.p2c(pos[key]);
break;
}
}
}
return res;
}
function getOrCreateAxis(axes, number) {
if (!axes[number - 1])
axes[number - 1] = {
n: number, // save the number for future reference
direction: axes == xaxes ? "x" : "y",
options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
};
return axes[number - 1];
}
function fillInSeriesOptions() {
var neededColors = series.length, maxIndex = -1, i;
// Subtract the number of series that already have fixed colors or
// color indexes from the number that we still need to generate.
for (i = 0; i < series.length; ++i) {
var sc = series[i].color;
if (sc != null) {
neededColors--;
if (typeof sc == "number" && sc > maxIndex) {
maxIndex = sc;
}
}
}
// If any of the series have fixed color indexes, then we need to
// generate at least as many colors as the highest index.
if (neededColors <= maxIndex) {
neededColors = maxIndex + 1;
}
// Generate all the colors, using first the option colors and then
// variations on those colors once they're exhausted.
var c, colors = [], colorPool = options.colors,
colorPoolSize = colorPool.length, variation = 0;
for (i = 0; i < neededColors; i++) {
c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
// Each time we exhaust the colors in the pool we adjust
// a scaling factor used to produce more variations on
// those colors. The factor alternates negative/positive
// to produce lighter/darker colors.
// Reset the variation after every few cycles, or else
// it will end up producing only white or black colors.
if (i % colorPoolSize == 0 && i) {
if (variation >= 0) {
if (variation < 0.5) {
variation = -variation - 0.2;
} else variation = 0;
} else variation = -variation;
}
colors[i] = c.scale('rgb', 1 + variation);
}
// Finalize the series options, filling in their colors
var colori = 0, s;
for (i = 0; i < series.length; ++i) {
s = series[i];
// assign colors
if (s.color == null) {
s.color = colors[colori].toString();
++colori;
}
else if (typeof s.color == "number")
s.color = colors[s.color].toString();
// turn on lines automatically in case nothing is set
if (s.lines.show == null) {
var v, show = true;
for (v in s)
if (s[v] && s[v].show) {
show = false;
break;
}
if (show)
s.lines.show = true;
}
// If nothing was provided for lines.zero, default it to match
// lines.fill, since areas by default should extend to zero.
if (s.lines.zero == null) {
s.lines.zero = !!s.lines.fill;
}
// setup axes
s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
}
}
function processData() {
var topSentry = Number.POSITIVE_INFINITY,
bottomSentry = Number.NEGATIVE_INFINITY,
fakeInfinity = Number.MAX_VALUE,
i, j, k, m, length,
s, points, ps, x, y, axis, val, f, p,
data, format;
function updateAxis(axis, min, max) {
if (min < axis.datamin && min != -fakeInfinity)
axis.datamin = min;
if (max > axis.datamax && max != fakeInfinity)
axis.datamax = max;
}
$.each(allAxes(), function (_, axis) {
// init axis
axis.datamin = topSentry;
axis.datamax = bottomSentry;
axis.used = false;
});
for (i = 0; i < series.length; ++i) {
s = series[i];
s.datapoints = { points: [] };
executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
}
// first pass: clean and copy data
for (i = 0; i < series.length; ++i) {
s = series[i];
data = s.data;
format = s.datapoints.format;
if (!format) {
format = [];
// find out how to copy
format.push({ x: true, number: true, required: true });
format.push({ y: true, number: true, required: true });
if (s.bars.show || (s.lines.show && s.lines.fill)) {
var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
if (s.bars.horizontal) {
delete format[format.length - 1].y;
format[format.length - 1].x = true;
}
}
s.datapoints.format = format;
}
if (s.datapoints.pointsize != null)
continue; // already filled in
s.datapoints.pointsize = format.length;
ps = s.datapoints.pointsize;
points = s.datapoints.points;
var insertSteps = s.lines.show && s.lines.steps;
s.xaxis.used = s.yaxis.used = true;
for (j = k = 0; j < data.length; ++j, k += ps) {
p = data[j];
var nullify = p == null;
if (!nullify) {
for (m = 0; m < ps; ++m) {
val = p[m];
f = format[m];
if (f) {
if (f.number && val != null) {
val = +val; // convert to number
if (isNaN(val))
val = null;
else if (val == Infinity)
val = fakeInfinity;
else if (val == -Infinity)
val = -fakeInfinity;
}
if (val == null) {
if (f.required)
nullify = true;
if (f.defaultValue != null)
val = f.defaultValue;
}
}
points[k + m] = val;
}
}
if (nullify) {
for (m = 0; m < ps; ++m) {
val = points[k + m];
if (val != null) {
f = format[m];
// extract min/max info
if (f.autoscale !== false) {
if (f.x) {
updateAxis(s.xaxis, val, val);
}
if (f.y) {
updateAxis(s.yaxis, val, val);
}
}
}
points[k + m] = null;
}
}
else {
// a little bit of line specific stuff that
// perhaps shouldn't be here, but lacking
// better means...
if (insertSteps && k > 0
&& points[k - ps] != null
&& points[k - ps] != points[k]
&& points[k - ps + 1] != points[k + 1]) {
// copy the point to make room for a middle point
for (m = 0; m < ps; ++m)
points[k + ps + m] = points[k + m];
// middle point has same y
points[k + 1] = points[k - ps + 1];
// we've added a point, better reflect that
k += ps;
}
}
}
}
// give the hooks a chance to run
for (i = 0; i < series.length; ++i) {
s = series[i];
executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
}
// second pass: find datamax/datamin for auto-scaling
for (i = 0; i < series.length; ++i) {
s = series[i];
points = s.datapoints.points;
ps = s.datapoints.pointsize;
format = s.datapoints.format;
var xmin = topSentry, ymin = topSentry,
xmax = bottomSentry, ymax = bottomSentry;
for (j = 0; j < points.length; j += ps) {
if (points[j] == null)
continue;
for (m = 0; m < ps; ++m) {
val = points[j + m];
f = format[m];
if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
continue;
if (f.x) {
if (val < xmin)
xmin = val;
if (val > xmax)
xmax = val;
}
if (f.y) {
if (val < ymin)
ymin = val;
if (val > ymax)
ymax = val;
}
}
}
if (s.bars.show) {
// make sure we got room for the bar on the dancing floor
var delta;
switch (s.bars.align) {
case "left":
delta = 0;
break;
case "right":
delta = -s.bars.barWidth;
break;
default:
delta = -s.bars.barWidth / 2;
}
if (s.bars.horizontal) {
ymin += delta;
ymax += delta + s.bars.barWidth;
}
else {
xmin += delta;
xmax += delta + s.bars.barWidth;
}
}
updateAxis(s.xaxis, xmin, xmax);
updateAxis(s.yaxis, ymin, ymax);
}
$.each(allAxes(), function (_, axis) {
if (axis.datamin == topSentry)
axis.datamin = null;
if (axis.datamax == bottomSentry)
axis.datamax = null;
});
}
function setupCanvases() {
// Make sure the placeholder is clear of everything except canvases
// from a previous plot in this container that we'll try to re-use.
placeholder.css("padding", 0) // padding messes up the positioning
.children().filter(function(){
return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
}).remove();
if (placeholder.css("position") == 'static')
placeholder.css("position", "relative"); // for positioning labels and overlay
surface = new Canvas("flot-base", placeholder);
overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
ctx = surface.context;
octx = overlay.context;
// define which element we're listening for events on
eventHolder = $(overlay.element).unbind();
// If we're re-using a plot object, shut down the old one
var existing = placeholder.data("plot");
if (existing) {
existing.shutdown();
overlay.clear();
}
// save in case we get replotted
placeholder.data("plot", plot);
}
function bindEvents() {
// bind events
if (options.grid.hoverable) {
eventHolder.mousemove(onMouseMove);
// Use bind, rather than .mouseleave, because we officially
// still support jQuery 1.2.6, which doesn't define a shortcut
// for mouseenter or mouseleave. This was a bug/oversight that
// was fixed somewhere around 1.3.x. We can return to using
// .mouseleave when we drop support for 1.2.6.
eventHolder.bind("mouseleave", onMouseLeave);
}
if (options.grid.clickable)
eventHolder.click(onClick);
executeHooks(hooks.bindEvents, [eventHolder]);
}
function shutdown() {
if (redrawTimeout)
clearTimeout(redrawTimeout);
eventHolder.unbind("mousemove", onMouseMove);
eventHolder.unbind("mouseleave", onMouseLeave);
eventHolder.unbind("click", onClick);
executeHooks(hooks.shutdown, [eventHolder]);
}
function setTransformationHelpers(axis) {
// set helper functions on the axis, assumes plot area
// has been computed already
function identity(x) { return x; }
var s, m, t = axis.options.transform || identity,
it = axis.options.inverseTransform;
// precompute how much the axis is scaling a point
// in canvas space
if (axis.direction == "x") {
s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
m = Math.min(t(axis.max), t(axis.min));
}
else {
s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
s = -s;
m = Math.max(t(axis.max), t(axis.min));
}
// data point to canvas coordinate
if (t == identity) // slight optimization
axis.p2c = function (p) { return (p - m) * s; };
else
axis.p2c = function (p) { return (t(p) - m) * s; };
// canvas coordinate to data point
if (!it)
axis.c2p = function (c) { return m + c / s; };
else
axis.c2p = function (c) { return it(m + c / s); };
}
function measureTickLabels(axis) {
var opts = axis.options,
ticks = axis.ticks || [],
labelWidth = opts.labelWidth || 0,
labelHeight = opts.labelHeight || 0,
maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
font = opts.font || "flot-tick-label tickLabel";
for (var i = 0; i < ticks.length; ++i) {
var t = ticks[i];
if (!t.label)
continue;
var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
labelWidth = Math.max(labelWidth, info.width);
labelHeight = Math.max(labelHeight, info.height);
}
axis.labelWidth = opts.labelWidth || labelWidth;
axis.labelHeight = opts.labelHeight || labelHeight;
}
function allocateAxisBoxFirstPhase(axis) {
// find the bounding box of the axis by looking at label
// widths/heights and ticks, make room by diminishing the
// plotOffset; this first phase only looks at one
// dimension per axis, the other dimension depends on the
// other axes so will have to wait
var lw = axis.labelWidth,
lh = axis.labelHeight,
pos = axis.options.position,
isXAxis = axis.direction === "x",
tickLength = axis.options.tickLength,
axisMargin = options.grid.axisMargin,
padding = options.grid.labelMargin,
innermost = true,
outermost = true,
first = true,
found = false;
// Determine the axis's position in its direction and on its side
$.each(isXAxis ? xaxes : yaxes, function(i, a) {
if (a && (a.show || a.reserveSpace)) {
if (a === axis) {
found = true;
} else if (a.options.position === pos) {
if (found) {
outermost = false;
} else {
innermost = false;
}
}
if (!found) {
first = false;
}
}
});
// The outermost axis on each side has no margin
if (outermost) {
axisMargin = 0;
}
// The ticks for the first axis in each direction stretch across
if (tickLength == null) {
tickLength = first ? "full" : 5;
}
if (!isNaN(+tickLength))
padding += +tickLength;
if (isXAxis) {
lh += padding;
if (pos == "bottom") {
plotOffset.bottom += lh + axisMargin;
axis.box = { top: surface.height - plotOffset.bottom, height: lh };
}
else {
axis.box = { top: plotOffset.top + axisMargin, height: lh };
plotOffset.top += lh + axisMargin;
}
}
else {
lw += padding;
if (pos == "left") {
axis.box = { left: plotOffset.left + axisMargin, width: lw };
plotOffset.left += lw + axisMargin;
}
else {
plotOffset.right += lw + axisMargin;
axis.box = { left: surface.width - plotOffset.right, width: lw };
}
}
// save for future reference
axis.position = pos;
axis.tickLength = tickLength;
axis.box.padding = padding;
axis.innermost = innermost;
}
function allocateAxisBoxSecondPhase(axis) {
// now that all axis boxes have been placed in one
// dimension, we can set the remaining dimension coordinates
if (axis.direction == "x") {
axis.box.left = plotOffset.left - axis.labelWidth / 2;
axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
}
else {
axis.box.top = plotOffset.top - axis.labelHeight / 2;
axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
}
}
function adjustLayoutForThingsStickingOut() {
// possibly adjust plot offset to ensure everything stays
// inside the canvas and isn't clipped off
var minMargin = options.grid.minBorderMargin,
axis, i;
// check stuff from the plot (FIXME: this should just read
// a value from the series, otherwise it's impossible to
// customize)
if (minMargin == null) {
minMargin = 0;
for (i = 0; i < series.length; ++i)
minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
}
var margins = {
left: minMargin,
right: minMargin,
top: minMargin,
bottom: minMargin
};
// check axis labels, note we don't check the actual
// labels but instead use the overall width/height to not
// jump as much around with replots
$.each(allAxes(), function (_, axis) {
if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
if (axis.direction === "x") {
margins.left = Math.max(margins.left, axis.labelWidth / 2);
margins.right = Math.max(margins.right, axis.labelWidth / 2);
} else {
margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
margins.top = Math.max(margins.top, axis.labelHeight / 2);
}
}
});
plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
}
function setupGrid() {
var i, axes = allAxes(), showGrid = options.grid.show;
// Initialize the plot's offset from the edge of the canvas
for (var a in plotOffset) {
var margin = options.grid.margin || 0;
plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
}
executeHooks(hooks.processOffset, [plotOffset]);
// If the grid is visible, add its border width to the offset
for (var a in plotOffset) {
if(typeof(options.grid.borderWidth) == "object") {
plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
}
else {
plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
}
}
$.each(axes, function (_, axis) {
var axisOpts = axis.options;
axis.show = axisOpts.show == null ? axis.used : axisOpts.show;
axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;
setRange(axis);
});
if (showGrid) {
var allocatedAxes = $.grep(axes, function (axis) {
return axis.show || axis.reserveSpace;
});
$.each(allocatedAxes, function (_, axis) {
// make the ticks
setupTickGeneration(axis);
setTicks(axis);
snapRangeToTicks(axis, axis.ticks);
// find labelWidth/Height for axis
measureTickLabels(axis);
});
// with all dimensions calculated, we can compute the
// axis bounding boxes, start from the outside
// (reverse order)
for (i = allocatedAxes.length - 1; i >= 0; --i)
allocateAxisBoxFirstPhase(allocatedAxes[i]);
// make sure we've got enough space for things that
// might stick out
adjustLayoutForThingsStickingOut();
$.each(allocatedAxes, function (_, axis) {
allocateAxisBoxSecondPhase(axis);
});
}
plotWidth = surface.width - plotOffset.left - plotOffset.right;
plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
// now we got the proper plot dimensions, we can compute the scaling
$.each(axes, function (_, axis) {
setTransformationHelpers(axis);
});
if (showGrid) {
drawAxisLabels();
}
insertLegend();
}
function setRange(axis) {
var opts = axis.options,
min = +(opts.min != null ? opts.min : axis.datamin),
max = +(opts.max != null ? opts.max : axis.datamax),
delta = max - min;
if (delta == 0.0) {
// degenerate case
var widen = max == 0 ? 1 : 0.01;
if (opts.min == null)
min -= widen;
// always widen max if we couldn't widen min to ensure we
// don't fall into min == max which doesn't work
if (opts.max == null || opts.min != null)
max += widen;
}
else {
// consider autoscaling
var margin = opts.autoscaleMargin;
if (margin != null) {
if (opts.min == null) {
min -= delta * margin;
// make sure we don't go below zero if all values
// are positive
if (min < 0 && axis.datamin != null && axis.datamin >= 0)
min = 0;
}
if (opts.max == null) {
max += delta * margin;
if (max > 0 && axis.datamax != null && axis.datamax <= 0)
max = 0;
}
}
}
axis.min = min;
axis.max = max;
}
function setupTickGeneration(axis) {
var opts = axis.options;
// estimate number of ticks
var noTicks;
if (typeof opts.ticks == "number" && opts.ticks > 0)
noTicks = opts.ticks;
else
// heuristic based on the model a*sqrt(x) fitted to
// some data points that seemed reasonable
noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
var delta = (axis.max - axis.min) / noTicks,
dec = -Math.floor(Math.log(delta) / Math.LN10),
maxDec = opts.tickDecimals;
if (maxDec != null && dec > maxDec) {
dec = maxDec;
}
var magn = Math.pow(10, -dec),
norm = delta / magn, // norm is between 1.0 and 10.0
size;
if (norm < 1.5) {
size = 1;
} else if (norm < 3) {
size = 2;
// special case for 2.5, requires an extra decimal
if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
size = 2.5;
++dec;
}
} else if (norm < 7.5) {
size = 5;
} else {
size = 10;
}
size *= magn;
if (opts.minTickSize != null && size < opts.minTickSize) {
size = opts.minTickSize;
}
axis.delta = delta;
axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
axis.tickSize = opts.tickSize || size;
// Time mode was moved to a plug-in in 0.8, and since so many people use it
// we'll add an especially friendly reminder to make sure they included it.
if (opts.mode == "time" && !axis.tickGenerator) {
throw new Error("Time mode requires the flot.time plugin.");
}
// Flot supports base-10 axes; any other mode else is handled by a plug-in,
// like flot.time.js.
if (!axis.tickGenerator) {
axis.tickGenerator = function (axis) {
var ticks = [],
start = floorInBase(axis.min, axis.tickSize),
i = 0,
v = Number.NaN,
prev;
do {
prev = v;
v = start + i * axis.tickSize;
ticks.push(v);
++i;
} while (v < axis.max && v != prev);
return ticks;
};
axis.tickFormatter = function (value, axis) {
var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
var formatted = "" + Math.round(value * factor) / factor;
// If tickDecimals was specified, ensure that we have exactly that
// much precision; otherwise default to the value's own precision.
if (axis.tickDecimals != null) {
var decimal = formatted.indexOf(".");
var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
if (precision < axis.tickDecimals) {
return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
}
}
return formatted;
};
}
if ($.isFunction(opts.tickFormatter))
axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
if (opts.alignTicksWithAxis != null) {
var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
if (otherAxis && otherAxis.used && otherAxis != axis) {
// consider snapping min/max to outermost nice ticks
var niceTicks = axis.tickGenerator(axis);
if (niceTicks.length > 0) {
if (opts.min == null)
axis.min = Math.min(axis.min, niceTicks[0]);
if (opts.max == null && niceTicks.length > 1)
axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
}
axis.tickGenerator = function (axis) {
// copy ticks, scaled to this axis
var ticks = [], v, i;
for (i = 0; i < otherAxis.ticks.length; ++i) {
v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
v = axis.min + v * (axis.max - axis.min);
ticks.push(v);
}
return ticks;
};
// we might need an extra decimal since forced
// ticks don't necessarily fit naturally
if (!axis.mode && opts.tickDecimals == null) {
var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
ts = axis.tickGenerator(axis);
// only proceed if the tick interval rounded
// with an extra decimal doesn't give us a
// zero at end
if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
axis.tickDecimals = extraDec;
}
}
}
}
function setTicks(axis) {
var oticks = axis.options.ticks, ticks = [];
if (oticks == null || (typeof oticks == "number" && oticks > 0))
ticks = axis.tickGenerator(axis);
else if (oticks) {
if ($.isFunction(oticks))
// generate the ticks
ticks = oticks(axis);
else
ticks = oticks;
}
// clean up/labelify the supplied ticks, copy them over
var i, v;
axis.ticks = [];
for (i = 0; i < ticks.length; ++i) {
var label = null;
var t = ticks[i];
if (typeof t == "object") {
v = +t[0];
if (t.length > 1)
label = t[1];
}
else
v = +t;
if (label == null)
label = axis.tickFormatter(v, axis);
if (!isNaN(v))
axis.ticks.push({ v: v, label: label });
}
}
function snapRangeToTicks(axis, ticks) {
if (axis.options.autoscaleMargin && ticks.length > 0) {
// snap to ticks
if (axis.options.min == null)
axis.min = Math.min(axis.min, ticks[0].v);
if (axis.options.max == null && ticks.length > 1)
axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
}
}
function draw() {
surface.clear();
executeHooks(hooks.drawBackground, [ctx]);
var grid = options.grid;
// draw background, if any
if (grid.show && grid.backgroundColor)
drawBackground();
if (grid.show && !grid.aboveData) {
drawGrid();
}
for (var i = 0; i < series.length; ++i) {
executeHooks(hooks.drawSeries, [ctx, series[i]]);
drawSeries(series[i]);
}
executeHooks(hooks.draw, [ctx]);
if (grid.show && grid.aboveData) {
drawGrid();
}
surface.render();
// A draw implies that either the axes or data have changed, so we
// should probably update the overlay highlights as well.
triggerRedrawOverlay();
}
function extractRange(ranges, coord) {
var axis, from, to, key, axes = allAxes();
for (var i = 0; i < axes.length; ++i) {
axis = axes[i];
if (axis.direction == coord) {
key = coord + axis.n + "axis";
if (!ranges[key] && axis.n == 1)
key = coord + "axis"; // support x1axis as xaxis
if (ranges[key]) {
from = ranges[key].from;
to = ranges[key].to;
break;
}
}
}
// backwards-compat stuff - to be removed in future
if (!ranges[key]) {
axis = coord == "x" ? xaxes[0] : yaxes[0];
from = ranges[coord + "1"];
to = ranges[coord + "2"];
}
// auto-reverse as an added bonus
if (from != null && to != null && from > to) {
var tmp = from;
from = to;
to = tmp;
}
return { from: from, to: to, axis: axis };
}
function drawBackground() {
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
ctx.fillRect(0, 0, plotWidth, plotHeight);
ctx.restore();
}
function drawGrid() {
var i, axes, bw, bc;
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
// draw markings
var markings = options.grid.markings;
if (markings) {
if ($.isFunction(markings)) {
axes = plot.getAxes();
// xmin etc. is backwards compatibility, to be
// removed in the future
axes.xmin = axes.xaxis.min;
axes.xmax = axes.xaxis.max;
axes.ymin = axes.yaxis.min;
axes.ymax = axes.yaxis.max;
markings = markings(axes);
}
for (i = 0; i < markings.length; ++i) {
var m = markings[i],
xrange = extractRange(m, "x"),
yrange = extractRange(m, "y");
// fill in missing
if (xrange.from == null)
xrange.from = xrange.axis.min;
if (xrange.to == null)
xrange.to = xrange.axis.max;
if (yrange.from == null)
yrange.from = yrange.axis.min;
if (yrange.to == null)
yrange.to = yrange.axis.max;
// clip
if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
continue;
xrange.from = Math.max(xrange.from, xrange.axis.min);
xrange.to = Math.min(xrange.to, xrange.axis.max);
yrange.from = Math.max(yrange.from, yrange.axis.min);
yrange.to = Math.min(yrange.to, yrange.axis.max);
var xequal = xrange.from === xrange.to,
yequal = yrange.from === yrange.to;
if (xequal && yequal) {
continue;
}
// then draw
xrange.from = Math.floor(xrange.axis.p2c(xrange.from));
xrange.to = Math.floor(xrange.axis.p2c(xrange.to));
yrange.from = Math.floor(yrange.axis.p2c(yrange.from));
yrange.to = Math.floor(yrange.axis.p2c(yrange.to));
if (xequal || yequal) {
var lineWidth = m.lineWidth || options.grid.markingsLineWidth,
subPixel = lineWidth % 2 ? 0.5 : 0;
ctx.beginPath();
ctx.strokeStyle = m.color || options.grid.markingsColor;
ctx.lineWidth = lineWidth;
if (xequal) {
ctx.moveTo(xrange.to + subPixel, yrange.from);
ctx.lineTo(xrange.to + subPixel, yrange.to);
} else {
ctx.moveTo(xrange.from, yrange.to + subPixel);
ctx.lineTo(xrange.to, yrange.to + subPixel);
}
ctx.stroke();
} else {
ctx.fillStyle = m.color || options.grid.markingsColor;
ctx.fillRect(xrange.from, yrange.to,
xrange.to - xrange.from,
yrange.from - yrange.to);
}
}
}
// draw the ticks
axes = allAxes();
bw = options.grid.borderWidth;
for (var j = 0; j < axes.length; ++j) {
var axis = axes[j], box = axis.box,
t = axis.tickLength, x, y, xoff, yoff;
if (!axis.show || axis.ticks.length == 0)
continue;
ctx.lineWidth = 1;
// find the edges
if (axis.direction == "x") {
x = 0;
if (t == "full")
y = (axis.position == "top" ? 0 : plotHeight);
else
y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
}
else {
y = 0;
if (t == "full")
x = (axis.position == "left" ? 0 : plotWidth);
else
x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
}
// draw tick bar
if (!axis.innermost) {
ctx.strokeStyle = axis.options.color;
ctx.beginPath();
xoff = yoff = 0;
if (axis.direction == "x")
xoff = plotWidth + 1;
else
yoff = plotHeight + 1;
if (ctx.lineWidth == 1) {
if (axis.direction == "x") {
y = Math.floor(y) + 0.5;
} else {
x = Math.floor(x) + 0.5;
}
}
ctx.moveTo(x, y);
ctx.lineTo(x + xoff, y + yoff);
ctx.stroke();
}
// draw ticks
ctx.strokeStyle = axis.options.tickColor;
ctx.beginPath();
for (i = 0; i < axis.ticks.length; ++i) {
var v = axis.ticks[i].v;
xoff = yoff = 0;
if (isNaN(v) || v < axis.min || v > axis.max
// skip those lying on the axes if we got a border
|| (t == "full"
&& ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
&& (v == axis.min || v == axis.max)))
continue;
if (axis.direction == "x") {
x = axis.p2c(v);
yoff = t == "full" ? -plotHeight : t;
if (axis.position == "top")
yoff = -yoff;
}
else {
y = axis.p2c(v);
xoff = t == "full" ? -plotWidth : t;
if (axis.position == "left")
xoff = -xoff;
}
if (ctx.lineWidth == 1) {
if (axis.direction == "x")
x = Math.floor(x) + 0.5;
else
y = Math.floor(y) + 0.5;
}
ctx.moveTo(x, y);
ctx.lineTo(x + xoff, y + yoff);
}
ctx.stroke();
}
// draw border
if (bw) {
// If either borderWidth or borderColor is an object, then draw the border
// line by line instead of as one rectangle
bc = options.grid.borderColor;
if(typeof bw == "object" || typeof bc == "object") {
if (typeof bw !== "object") {
bw = {top: bw, right: bw, bottom: bw, left: bw};
}
if (typeof bc !== "object") {
bc = {top: bc, right: bc, bottom: bc, left: bc};
}
if (bw.top > 0) {
ctx.strokeStyle = bc.top;
ctx.lineWidth = bw.top;
ctx.beginPath();
ctx.moveTo(0 - bw.left, 0 - bw.top/2);
ctx.lineTo(plotWidth, 0 - bw.top/2);
ctx.stroke();
}
if (bw.right > 0) {
ctx.strokeStyle = bc.right;
ctx.lineWidth = bw.right;
ctx.beginPath();
ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
ctx.stroke();
}
if (bw.bottom > 0) {
ctx.strokeStyle = bc.bottom;
ctx.lineWidth = bw.bottom;
ctx.beginPath();
ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
ctx.lineTo(0, plotHeight + bw.bottom / 2);
ctx.stroke();
}
if (bw.left > 0) {
ctx.strokeStyle = bc.left;
ctx.lineWidth = bw.left;
ctx.beginPath();
ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
ctx.lineTo(0- bw.left/2, 0);
ctx.stroke();
}
}
else {
ctx.lineWidth = bw;
ctx.strokeStyle = options.grid.borderColor;
ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
}
}
ctx.restore();
}
function drawAxisLabels() {
$.each(allAxes(), function (_, axis) {
var box = axis.box,
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
font = axis.options.font || "flot-tick-label tickLabel",
tick, x, y, halign, valign;
// Remove text before checking for axis.show and ticks.length;
// otherwise plugins, like flot-tickrotor, that draw their own
// tick labels will end up with both theirs and the defaults.
surface.removeText(layer);
if (!axis.show || axis.ticks.length == 0)
return;
for (var i = 0; i < axis.ticks.length; ++i) {
tick = axis.ticks[i];
if (!tick.label || tick.v < axis.min || tick.v > axis.max)
continue;
if (axis.direction == "x") {
halign = "center";
x = plotOffset.left + axis.p2c(tick.v);
if (axis.position == "bottom") {
y = box.top + box.padding;
} else {
y = box.top + box.height - box.padding;
valign = "bottom";
}
} else {
valign = "middle";
y = plotOffset.top + axis.p2c(tick.v);
if (axis.position == "left") {
x = box.left + box.width - box.padding;
halign = "right";
} else {
x = box.left + box.padding;
}
}
surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
}
});
}
function drawSeries(series) {
if (series.lines.show)
drawSeriesLines(series);
if (series.bars.show)
drawSeriesBars(series);
if (series.points.show)
drawSeriesPoints(series);
}
function drawSeriesLines(series) {
function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
var points = datapoints.points,
ps = datapoints.pointsize,
prevx = null, prevy = null;
ctx.beginPath();
for (var i = ps; i < points.length; i += ps) {
var x1 = points[i - ps], y1 = points[i - ps + 1],
x2 = points[i], y2 = points[i + 1];
if (x1 == null || x2 == null)
continue;
// clip with ymin
if (y1 <= y2 && y1 < axisy.min) {
if (y2 < axisy.min)
continue; // line segment is outside
// compute new intersection point
x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.min;
}
else if (y2 <= y1 && y2 < axisy.min) {
if (y1 < axisy.min)
continue;
x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.min;
}
// clip with ymax
if (y1 >= y2 && y1 > axisy.max) {
if (y2 > axisy.max)
continue;
x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.max;
}
else if (y2 >= y1 && y2 > axisy.max) {
if (y1 > axisy.max)
continue;
x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.max;
}
// clip with xmin
if (x1 <= x2 && x1 < axisx.min) {
if (x2 < axisx.min)
continue;
y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.min;
}
else if (x2 <= x1 && x2 < axisx.min) {
if (x1 < axisx.min)
continue;
y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.min;
}
// clip with xmax
if (x1 >= x2 && x1 > axisx.max) {
if (x2 > axisx.max)
continue;
y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.max;
}
else if (x2 >= x1 && x2 > axisx.max) {
if (x1 > axisx.max)
continue;
y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.max;
}
if (x1 != prevx || y1 != prevy)
ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
prevx = x2;
prevy = y2;
ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
}
ctx.stroke();
}
function plotLineArea(datapoints, axisx, axisy) {
var points = datapoints.points,
ps = datapoints.pointsize,
bottom = Math.min(Math.max(0, axisy.min), axisy.max),
i = 0, top, areaOpen = false,
ypos = 1, segmentStart = 0, segmentEnd = 0;
// we process each segment in two turns, first forward
// direction to sketch out top, then once we hit the
// end we go backwards to sketch the bottom
while (true) {
if (ps > 0 && i > points.length + ps)
break;
i += ps; // ps is negative if going backwards
var x1 = points[i - ps],
y1 = points[i - ps + ypos],
x2 = points[i], y2 = points[i + ypos];
if (areaOpen) {
if (ps > 0 && x1 != null && x2 == null) {
// at turning point
segmentEnd = i;
ps = -ps;
ypos = 2;
continue;
}
if (ps < 0 && i == segmentStart + ps) {
// done with the reverse sweep
ctx.fill();
areaOpen = false;
ps = -ps;
ypos = 1;
i = segmentStart = segmentEnd + ps;
continue;
}
}
if (x1 == null || x2 == null)
continue;
// clip x values
// clip with xmin
if (x1 <= x2 && x1 < axisx.min) {
if (x2 < axisx.min)
continue;
y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.min;
}
else if (x2 <= x1 && x2 < axisx.min) {
if (x1 < axisx.min)
continue;
y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.min;
}
// clip with xmax
if (x1 >= x2 && x1 > axisx.max) {
if (x2 > axisx.max)
continue;
y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.max;
}
else if (x2 >= x1 && x2 > axisx.max) {
if (x1 > axisx.max)
continue;
y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.max;
}
if (!areaOpen) {
// open area
ctx.beginPath();
ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
areaOpen = true;
}
// now first check the case where both is outside
if (y1 >= axisy.max && y2 >= axisy.max) {
ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
continue;
}
else if (y1 <= axisy.min && y2 <= axisy.min) {
ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
continue;
}
// else it's a bit more complicated, there might
// be a flat maxed out rectangle first, then a
// triangular cutout or reverse; to find these
// keep track of the current x values
var x1old = x1, x2old = x2;
// clip the y values, without shortcutting, we
// go through all cases in turn
// clip with ymin
if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.min;
}
else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.min;
}
// clip with ymax
if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.max;
}
else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.max;
}
// if the x value was changed we got a rectangle
// to fill
if (x1 != x1old) {
ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
// it goes to (x1, y1), but we fill that below
}
// fill triangular section, this sometimes result
// in redundant points if (x1, y1) hasn't changed
// from previous line to, but we just ignore that
ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
// fill the other rectangle if it's there
if (x2 != x2old) {
ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
}
}
}
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
ctx.lineJoin = "round";
var lw = series.lines.lineWidth,
sw = series.shadowSize;
// FIXME: consider another form of shadow when filling is turned on
if (lw > 0 && sw > 0) {
// draw shadow as a thick and thin line with transparency
ctx.lineWidth = sw;
ctx.strokeStyle = "rgba(0,0,0,0.1)";
// position shadow at angle from the mid of line
var angle = Math.PI/18;
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
ctx.lineWidth = sw/2;
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
}
ctx.lineWidth = lw;
ctx.strokeStyle = series.color;
var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
if (fillStyle) {
ctx.fillStyle = fillStyle;
plotLineArea(series.datapoints, series.xaxis, series.yaxis);
}
if (lw > 0)
plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
ctx.restore();
}
function drawSeriesPoints(series) {
function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
var points = datapoints.points, ps = datapoints.pointsize;
for (var i = 0; i < points.length; i += ps) {
var x = points[i], y = points[i + 1];
if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
continue;
ctx.beginPath();
x = axisx.p2c(x);
y = axisy.p2c(y) + offset;
if (symbol == "circle")
ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
else
symbol(ctx, x, y, radius, shadow);
ctx.closePath();
if (fillStyle) {
ctx.fillStyle = fillStyle;
ctx.fill();
}
ctx.stroke();
}
}
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
var lw = series.points.lineWidth,
sw = series.shadowSize,
radius = series.points.radius,
symbol = series.points.symbol;
// If the user sets the line width to 0, we change it to a very
// small value. A line width of 0 seems to force the default of 1.
// Doing the conditional here allows the shadow setting to still be
// optional even with a lineWidth of 0.
if( lw == 0 )
lw = 0.0001;
if (lw > 0 && sw > 0) {
// draw shadow in two steps
var w = sw / 2;
ctx.lineWidth = w;
ctx.strokeStyle = "rgba(0,0,0,0.1)";
plotPoints(series.datapoints, radius, null, w + w/2, true,
series.xaxis, series.yaxis, symbol);
ctx.strokeStyle = "rgba(0,0,0,0.2)";
plotPoints(series.datapoints, radius, null, w/2, true,
series.xaxis, series.yaxis, symbol);
}
ctx.lineWidth = lw;
ctx.strokeStyle = series.color;
plotPoints(series.datapoints, radius,
getFillStyle(series.points, series.color), 0, false,
series.xaxis, series.yaxis, symbol);
ctx.restore();
}
function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
var left, right, bottom, top,
drawLeft, drawRight, drawTop, drawBottom,
tmp;
// in horizontal mode, we start the bar from the left
// instead of from the bottom so it appears to be
// horizontal rather than vertical
if (horizontal) {
drawBottom = drawRight = drawTop = true;
drawLeft = false;
left = b;
right = x;
top = y + barLeft;
bottom = y + barRight;
// account for negative bars
if (right < left) {
tmp = right;
right = left;
left = tmp;
drawLeft = true;
drawRight = false;
}
}
else {
drawLeft = drawRight = drawTop = true;
drawBottom = false;
left = x + barLeft;
right = x + barRight;
bottom = b;
top = y;
// account for negative bars
if (top < bottom) {
tmp = top;
top = bottom;
bottom = tmp;
drawBottom = true;
drawTop = false;
}
}
// clip
if (right < axisx.min || left > axisx.max ||
top < axisy.min || bottom > axisy.max)
return;
if (left < axisx.min) {
left = axisx.min;
drawLeft = false;
}
if (right > axisx.max) {
right = axisx.max;
drawRight = false;
}
if (bottom < axisy.min) {
bottom = axisy.min;
drawBottom = false;
}
if (top > axisy.max) {
top = axisy.max;
drawTop = false;
}
left = axisx.p2c(left);
bottom = axisy.p2c(bottom);
right = axisx.p2c(right);
top = axisy.p2c(top);
// fill the bar
if (fillStyleCallback) {
c.fillStyle = fillStyleCallback(bottom, top);
c.fillRect(left, top, right - left, bottom - top)
}
// draw outline
if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
c.beginPath();
// FIXME: inline moveTo is buggy with excanvas
c.moveTo(left, bottom);
if (drawLeft)
c.lineTo(left, top);
else
c.moveTo(left, top);
if (drawTop)
c.lineTo(right, top);
else
c.moveTo(right, top);
if (drawRight)
c.lineTo(right, bottom);
else
c.moveTo(right, bottom);
if (drawBottom)
c.lineTo(left, bottom);
else
c.moveTo(left, bottom);
c.stroke();
}
}
function drawSeriesBars(series) {
function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
var points = datapoints.points, ps = datapoints.pointsize;
for (var i = 0; i < points.length; i += ps) {
if (points[i] == null)
continue;
drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
}
}
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
// FIXME: figure out a way to add shadows (for instance along the right edge)
ctx.lineWidth = series.bars.lineWidth;
ctx.strokeStyle = series.color;
var barLeft;
switch (series.bars.align) {
case "left":
barLeft = 0;
break;
case "right":
barLeft = -series.bars.barWidth;
break;
default:
barLeft = -series.bars.barWidth / 2;
}
var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
ctx.restore();
}
function getFillStyle(filloptions, seriesColor, bottom, top) {
var fill = filloptions.fill;
if (!fill)
return null;
if (filloptions.fillColor)
return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
var c = $.color.parse(seriesColor);
c.a = typeof fill == "number" ? fill : 0.4;
c.normalize();
return c.toString();
}
function insertLegend() {
if (options.legend.container != null) {
$(options.legend.container).html("");
} else {
placeholder.find(".legend").remove();
}
if (!options.legend.show) {
return;
}
var fragments = [], entries = [], rowStarted = false,
lf = options.legend.labelFormatter, s, label;
// Build a list of legend entries, with each having a label and a color
for (var i = 0; i < series.length; ++i) {
s = series[i];
if (s.label) {
label = lf ? lf(s.label, s) : s.label;
if (label) {
entries.push({
label: label,
color: s.color
});
}
}
}
// Sort the legend using either the default or a custom comparator
if (options.legend.sorted) {
if ($.isFunction(options.legend.sorted)) {
entries.sort(options.legend.sorted);
} else if (options.legend.sorted == "reverse") {
entries.reverse();
} else {
var ascending = options.legend.sorted != "descending";
entries.sort(function(a, b) {
return a.label == b.label ? 0 : (
(a.label < b.label) != ascending ? 1 : -1 // Logical XOR
);
});
}
}
// Generate markup for the list of entries, in their final order
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (i % options.legend.noColumns == 0) {
if (rowStarted)
fragments.push('</tr>');
fragments.push('<tr>');
rowStarted = true;
}
fragments.push(
'<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
'<td class="legendLabel">' + entry.label + '</td>'
);
}
if (rowStarted)
fragments.push('</tr>');
if (fragments.length == 0)
return;
var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
if (options.legend.container != null)
$(options.legend.container).html(table);
else {
var pos = "",
p = options.legend.position,
m = options.legend.margin;
if (m[0] == null)
m = [m, m];
if (p.charAt(0) == "n")
pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
else if (p.charAt(0) == "s")
pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
if (p.charAt(1) == "e")
pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
else if (p.charAt(1) == "w")
pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
if (options.legend.backgroundOpacity != 0.0) {
// put in the transparent background
// separately to avoid blended labels and
// label boxes
var c = options.legend.backgroundColor;
if (c == null) {
c = options.grid.backgroundColor;
if (c && typeof c == "string")
c = $.color.parse(c);
else
c = $.color.extract(legend, 'background-color');
c.a = 1;
c = c.toString();
}
var div = legend.children();
$('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
}
}
}
// interactive features
var highlights = [],
redrawTimeout = null;
// returns the data item the mouse is over, or null if none is found
function findNearbyItem(mouseX, mouseY, seriesFilter) {
var maxDistance = options.grid.mouseActiveRadius,
smallestDistance = maxDistance * maxDistance + 1,
item = null, foundPoint = false, i, j, ps;
for (i = series.length - 1; i >= 0; --i) {
if (!seriesFilter(series[i]))
continue;
var s = series[i],
axisx = s.xaxis,
axisy = s.yaxis,
points = s.datapoints.points,
mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
my = axisy.c2p(mouseY),
maxx = maxDistance / axisx.scale,
maxy = maxDistance / axisy.scale;
ps = s.datapoints.pointsize;
// with inverse transforms, we can't use the maxx/maxy
// optimization, sadly
if (axisx.options.inverseTransform)
maxx = Number.MAX_VALUE;
if (axisy.options.inverseTransform)
maxy = Number.MAX_VALUE;
if (s.lines.show || s.points.show) {
for (j = 0; j < points.length; j += ps) {
var x = points[j], y = points[j + 1];
if (x == null)
continue;
// For points and lines, the cursor must be within a
// certain distance to the data point
if (x - mx > maxx || x - mx < -maxx ||
y - my > maxy || y - my < -maxy)
continue;
// We have to calculate distances in pixels, not in
// data units, because the scales of the axes may be different
var dx = Math.abs(axisx.p2c(x) - mouseX),
dy = Math.abs(axisy.p2c(y) - mouseY),
dist = dx * dx + dy * dy; // we save the sqrt
// use <= to ensure last point takes precedence
// (last generally means on top of)
if (dist < smallestDistance) {
smallestDistance = dist;
item = [i, j / ps];
}
}
}
if (s.bars.show && !item) { // no other point can be nearby
var barLeft, barRight;
switch (s.bars.align) {
case "left":
barLeft = 0;
break;
case "right":
barLeft = -s.bars.barWidth;
break;
default:
barLeft = -s.bars.barWidth / 2;
}
barRight = barLeft + s.bars.barWidth;
for (j = 0; j < points.length; j += ps) {
var x = points[j], y = points[j + 1], b = points[j + 2];
if (x == null)
continue;
// for a bar graph, the cursor must be inside the bar
if (series[i].bars.horizontal ?
(mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
my >= y + barLeft && my <= y + barRight) :
(mx >= x + barLeft && mx <= x + barRight &&
my >= Math.min(b, y) && my <= Math.max(b, y)))
item = [i, j / ps];
}
}
}
if (item) {
i = item[0];
j = item[1];
ps = series[i].datapoints.pointsize;
return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
dataIndex: j,
series: series[i],
seriesIndex: i };
}
return null;
}
function onMouseMove(e) {
if (options.grid.hoverable)
triggerClickHoverEvent("plothover", e,
function (s) { return s["hoverable"] != false; });
}
function onMouseLeave(e) {
if (options.grid.hoverable)
triggerClickHoverEvent("plothover", e,
function (s) { return false; });
}
function onClick(e) {
triggerClickHoverEvent("plotclick", e,
function (s) { return s["clickable"] != false; });
}
// trigger click or hover event (they send the same parameters
// so we share their code)
function triggerClickHoverEvent(eventname, event, seriesFilter) {
var offset = eventHolder.offset(),
canvasX = event.pageX - offset.left - plotOffset.left,
canvasY = event.pageY - offset.top - plotOffset.top,
pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
pos.pageX = event.pageX;
pos.pageY = event.pageY;
var item = findNearbyItem(canvasX, canvasY, seriesFilter);
if (item) {
// fill in mouse pos for any listeners out there
item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
}
if (options.grid.autoHighlight) {
// clear auto-highlights
for (var i = 0; i < highlights.length; ++i) {
var h = highlights[i];
if (h.auto == eventname &&
!(item && h.series == item.series &&
h.point[0] == item.datapoint[0] &&
h.point[1] == item.datapoint[1]))
unhighlight(h.series, h.point);
}
if (item)
highlight(item.series, item.datapoint, eventname);
}
placeholder.trigger(eventname, [ pos, item ]);
}
function triggerRedrawOverlay() {
var t = options.interaction.redrawOverlayInterval;
if (t == -1) { // skip event queue
drawOverlay();
return;
}
if (!redrawTimeout)
redrawTimeout = setTimeout(drawOverlay, t);
}
function drawOverlay() {
redrawTimeout = null;
// draw highlights
octx.save();
overlay.clear();
octx.translate(plotOffset.left, plotOffset.top);
var i, hi;
for (i = 0; i < highlights.length; ++i) {
hi = highlights[i];
if (hi.series.bars.show)
drawBarHighlight(hi.series, hi.point);
else
drawPointHighlight(hi.series, hi.point);
}
octx.restore();
executeHooks(hooks.drawOverlay, [octx]);
}
function highlight(s, point, auto) {
if (typeof s == "number")
s = series[s];
if (typeof point == "number") {
var ps = s.datapoints.pointsize;
point = s.datapoints.points.slice(ps * point, ps * (point + 1));
}
var i = indexOfHighlight(s, point);
if (i == -1) {
highlights.push({ series: s, point: point, auto: auto });
triggerRedrawOverlay();
}
else if (!auto)
highlights[i].auto = false;
}
function unhighlight(s, point) {
if (s == null && point == null) {
highlights = [];
triggerRedrawOverlay();
return;
}
if (typeof s == "number")
s = series[s];
if (typeof point == "number") {
var ps = s.datapoints.pointsize;
point = s.datapoints.points.slice(ps * point, ps * (point + 1));
}
var i = indexOfHighlight(s, point);
if (i != -1) {
highlights.splice(i, 1);
triggerRedrawOverlay();
}
}
function indexOfHighlight(s, p) {
for (var i = 0; i < highlights.length; ++i) {
var h = highlights[i];
if (h.series == s && h.point[0] == p[0]
&& h.point[1] == p[1])
return i;
}
return -1;
}
function drawPointHighlight(series, point) {
var x = point[0], y = point[1],
axisx = series.xaxis, axisy = series.yaxis,
highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
return;
var pointRadius = series.points.radius + series.points.lineWidth / 2;
octx.lineWidth = pointRadius;
octx.strokeStyle = highlightColor;
var radius = 1.5 * pointRadius;
x = axisx.p2c(x);
y = axisy.p2c(y);
octx.beginPath();
if (series.points.symbol == "circle")
octx.arc(x, y, radius, 0, 2 * Math.PI, false);
else
series.points.symbol(octx, x, y, radius, false);
octx.closePath();
octx.stroke();
}
function drawBarHighlight(series, point) {
var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
fillStyle = highlightColor,
barLeft;
switch (series.bars.align) {
case "left":
barLeft = 0;
break;
case "right":
barLeft = -series.bars.barWidth;
break;
default:
barLeft = -series.bars.barWidth / 2;
}
octx.lineWidth = series.bars.lineWidth;
octx.strokeStyle = highlightColor;
drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
}
function getColorOrGradient(spec, bottom, top, defaultColor) {
if (typeof spec == "string")
return spec;
else {
// assume this is a gradient spec; IE currently only
// supports a simple vertical gradient properly, so that's
// what we support too
var gradient = ctx.createLinearGradient(0, top, 0, bottom);
for (var i = 0, l = spec.colors.length; i < l; ++i) {
var c = spec.colors[i];
if (typeof c != "string") {
var co = $.color.parse(defaultColor);
if (c.brightness != null)
co = co.scale('rgb', c.brightness);
if (c.opacity != null)
co.a *= c.opacity;
c = co.toString();
}
gradient.addColorStop(i / (l - 1), c);
}
return gradient;
}
}
}
// Add the plot function to the top level of the jQuery object
$.plot = function(placeholder, data, options) {
//var t0 = new Date();
var plot = new Plot($(placeholder), data, options, $.plot.plugins);
//(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
return plot;
};
$.plot.version = "0.8.3";
$.plot.plugins = [];
// Also add the plot function as a chainable property
$.fn.plot = function(data, options) {
return this.each(function() {
$.plot(this, data, options);
});
};
// round to nearby lower multiple of base
function floorInBase(n, base) {
return base * Math.floor(n / base);
}
})(jQuery);
}
}
/* ===== Load UserScript ===== */
function addJQuery(callback){
var script = document.createElement("script");
script.async = true;
script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js");
script.addEventListener(
'load',
function(){
var script = document.createElement("script");
script.async = true;
script.textContent = "window.jQ = jQuery.noConflict(true);"+
"("+callback.toString()+")();";
document.head.appendChild(script);
},
false
);
document.head.appendChild(script);
}
if(window.location.host.indexOf("worldofwarships") > -1){
addJQuery(WoWsStatInfo);
}
})(window);