WoWsStatInfo

Расширенная статистика и функционал.

当前为 2015-05-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WoWsStatInfo
  3. // @author Vov_chiK
  4. // @description Расширенная статистика и функционал.
  5. // @copyright 2015+, Vov_chiK
  6. // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
  7. // @namespace http://forum.walkure.pro/
  8. // @version 0.3.0.3
  9. // @creator Vov_chiK
  10. // @include http://worldofwarships.ru/cbt/accounts/*
  11. // @match http://worldofwarships.ru/cbt/accounts/*
  12. // @grant GM_xmlhttpRequest
  13. // ==/UserScript==
  14. // @Vov_chiK
  15.  
  16. (function(window){
  17. /* ===== Main function ===== */
  18. function WoWsStatInfo(){
  19. var VersionWoWsStatInfo = '0.3.0.3';
  20. var WoWsStatInfoLink = '#';
  21. var WoWsStatInfoLinkName = '[0.3.0] [WoWsStatInfo] Расширенная статистика на оф. сайте.';
  22. var lang = 'ru';
  23. if(window.location.host.indexOf(".wargaming.net") > -1){
  24. lang = getCookie('wgccfe_language');
  25. }else if(window.location.host.indexOf("worldofwarships") > -1){
  26. lang = getCookie('hllang');
  27. }
  28.  
  29. var localization = getLocalization(lang);
  30. var realm = localization['realm'];
  31. var application_id = getApplicationId(realm);
  32. var WGAPI = 'http://api.worldoftanks.'+realm+'/';
  33. var WoWsStatInfoHref = 'http://vovchik.myjino.ru/US_WoWsStatInfo/';
  34. var Process = 0;
  35. var MaxProcess = 3;
  36. /* ===== Message UserScript ===== */
  37. {
  38. }
  39. var navigatorInfo = getBrowser();
  40. window.onerror = function(message, source, lineno, column, errorObj){
  41. if(source == ''){source = window.location.href;}
  42. else if(source.indexOf(".js") != -1){return false;}
  43. if(message == 'Script error.' && errorObj == null){console.log('message == \'Script error.\' && errorObj == null'); return false;}
  44. lineno += 17;
  45. var agent = '';
  46. var agentArr = navigator.userAgent.split(')');
  47. for(var i = 0; i < agentArr.length; i++){
  48. if(agent != ''){agent += ')\n';}
  49. agent += agentArr[i];
  50. }
  51. var error = localization['ErrorScript']+"\n\n" +
  52. "Browser name: "+navigatorInfo['browserName']+"\n"+
  53. "Full version: "+navigatorInfo['fullVersion']+"\n"+
  54. "Major version: "+navigatorInfo['majorVersion']+"\n"+
  55. "AppName: "+navigatorInfo['appName']+"\n"+
  56. "UserAgent: "+agent+"\n\n"+
  57. "Error: "+message+"\n"+
  58. "URL: " +source+"\n"+
  59. "Line: "+lineno+"\n"+
  60. "Column: "+column+"\n"+
  61. "StackTrace: "+errorObj+"\n\n"+
  62. localization['ErrorSendDeveloper'];
  63. console.log(error);
  64. alert(error);
  65. error = error.split('\n').join('<br />');
  66. // onShowMessage(
  67. // localization['Box'],
  68. // 'different_error',
  69. // error,
  70. // onCloseMessage,
  71. // localization['Ok'],
  72. // false
  73. // );
  74. return true;
  75. }
  76. function getBrowser(){
  77. var nVer = navigator.appVersion;
  78. var nAgt = navigator.userAgent;
  79. var browserName = navigator.appName;
  80. var fullVersion = ''+parseFloat(navigator.appVersion);
  81. var majorVersion = parseInt(navigator.appVersion, 10);
  82. var nameOffset, verOffset, ix;
  83.  
  84. // In Opera 15+, the true version is after "OPR/"
  85. if((verOffset = nAgt.indexOf("OPR/")) != -1){
  86. browserName = "Opera";
  87. fullVersion = nAgt.substring(verOffset + 4);
  88. }
  89. // In older Opera, the true version is after "Opera" or after "Version"
  90. else if((verOffset = nAgt.indexOf("Opera")) != -1){
  91. browserName = "Opera";
  92. fullVersion = nAgt.substring(verOffset + 6);
  93. if((verOffset = nAgt.indexOf("Version")) != -1)
  94. fullVersion = nAgt.substring(verOffset + 8);
  95. }
  96. // In MSIE, the true version is after "MSIE" in userAgent
  97. else if((verOffset = nAgt.indexOf("MSIE")) != -1){
  98. browserName = "Microsoft Internet Explorer";
  99. fullVersion = nAgt.substring(verOffset + 5);
  100. }
  101. // In Chrome, the true version is after "Chrome"
  102. else if((verOffset = nAgt.indexOf("Chrome")) != -1) {
  103. browserName = "Chrome";
  104. fullVersion = nAgt.substring(verOffset + 7);
  105. }
  106. // In Safari, the true version is after "Safari" or after "Version"
  107. else if((verOffset = nAgt.indexOf("Safari")) != -1){
  108. browserName = "Safari";
  109. fullVersion = nAgt.substring(verOffset + 7);
  110. if((verOffset = nAgt.indexOf("Version")) != -1)
  111. fullVersion = nAgt.substring(verOffset + 8);
  112. }
  113. // In Firefox, the true version is after "Firefox"
  114. else if((verOffset = nAgt.indexOf("Firefox")) != -1){
  115. browserName = "Firefox";
  116. fullVersion = nAgt.substring(verOffset + 8);
  117. }
  118. // In most other browsers, "name/version" is at the end of userAgent
  119. else if((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))){
  120. browserName = nAgt.substring(nameOffset, verOffset);
  121. fullVersion = nAgt.substring(verOffset + 1);
  122. if(browserName.toLowerCase() == browserName.toUpperCase()){
  123. browserName = navigator.appName;
  124. }
  125. }
  126. // trim the fullVersion string at semicolon/space if present
  127. if((ix = fullVersion.indexOf(";")) != -1)
  128. fullVersion = fullVersion.substring(0, ix);
  129. if((ix = fullVersion.indexOf(" ")) != -1)
  130. fullVersion = fullVersion.substring(0, ix);
  131.  
  132. majorVersion = parseInt(''+fullVersion, 10);
  133. if(isNaN(majorVersion)){
  134. fullVersion = ''+parseFloat(navigator.appVersion);
  135. majorVersion = parseInt(navigator.appVersion, 10);
  136. }
  137. console.log(''
  138. +'Browser name = '+browserName+'\n'
  139. +'Full version = '+fullVersion+'\n'
  140. +'Major version = '+majorVersion+'\n'
  141. +'navigator.appName = '+navigator.appName+'\n'
  142. +'navigator.userAgent = '+navigator.userAgent+'\n'
  143. );
  144. var navigatorInfo = [];
  145. navigatorInfo['browserName'] = browserName;
  146. navigatorInfo['fullVersion'] = fullVersion;
  147. navigatorInfo['majorVersion'] = majorVersion;
  148. navigatorInfo['appName'] = navigator.appName;
  149. navigatorInfo['userAgent'] = navigator.userAgent;
  150. return navigatorInfo;
  151. }
  152. /* ===== Style UserScript ===== */
  153. {
  154. var StyleWoWsStatInfo = '' +
  155. 'div.div-link-block{font-size:13px; color: #fff; text-align: right; padding-top: 10px; padding-bottom: 10px;}' +
  156. 'span.link-block:hover{border-bottom: 1px dotted #fff; cursor: pointer;}' +
  157. 'span.link-block div.icon-link-block{background: url("http://'+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%;}' +
  158. 'span.hide-block div.icon-link-block{background-position: 100% -26px;}' +
  159. 'span.show-block div.icon-link-block{background-position: 100% -16px;}' +
  160. '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;}' +
  161. 'div.hide-block{display: none;}' +
  162. 'div.wowsstatinfo-stat{text-align: center; margin-top: 10px; color: white; font-size: 16px;}' +
  163. 'span.name-stat{color: #ffcc33;}' +
  164. '';
  165. var StyleWoWsStatInfoAdd = document.createElement("style");
  166. StyleWoWsStatInfoAdd.textContent = StyleWoWsStatInfo.toString();
  167. document.head.appendChild(StyleWoWsStatInfoAdd);
  168. }
  169. var MembersArray = [];
  170. var typeStat = ["pvp", "pve"];
  171. var color = new Array();
  172. color['very_bad'] = '#FE0E00'; // очень плохо
  173. color['bad'] = '#FE7903'; // плохо
  174. color['normal'] = '#F8F400'; // средне
  175. color['good'] = '#60FF00'; // хорошо
  176. color['very_good'] = '#02C9B3'; // очень хорошо
  177. color['unique'] = '#D042F3'; // уникально
  178. /* ===== Check load page ===== */
  179. if(window.location.href.indexOf("accounts") > -1 && window.location.href.split('/').length == 7 && window.location.href.split('/')[5].match(/[0-9]+/) != null){
  180. var account_id = window.location.href.split('/')[5].match(/[0-9]+/);
  181. MemberProfilePage();
  182. }
  183. jQ('.link-block').click(function(){onViewBlock(this);});
  184. /* ===== Pages function ===== */
  185. function MemberProfilePage(){
  186. getMemberStatistic();
  187. getJson(WGAPI+'wgn/clans/membersinfo/?application_id='+application_id+'&language='+lang+'&account_id='+MembersArray[0]['account_id'], doneClanInfo, errorClanInfo);
  188. var content = document.getElementsByClassName('content')[0];
  189. var row = content.getElementsByClassName('row')[0];
  190. row.outerHTML += '' +
  191. '<div id="userscript-block-list">' +
  192. getUserScriptDeveloperBlock() +
  193. '' +
  194. '</div>' +
  195. '';
  196. }
  197. /* ===== MemberProfilePage function ===== */
  198. function viewMemberProfilePage(){
  199. for(var t = 0; t < typeStat.length; t++){
  200. var type = typeStat[t];
  201. var account_statistics__general = document.getElementsByClassName('account_statistics__general')[t];
  202. if(account_statistics__general !== undefined){
  203. var stat_main_middle = account_statistics__general.getElementsByClassName('stat-main-middle')[0];
  204. stat_main_middle.getElementsByClassName('value')[0].style.color = colorBattlesAvgXP(MembersArray[0][type]['avg_xp']);
  205. var stat = account_statistics__general.getElementsByClassName('stat');
  206. stat[0].getElementsByClassName('value')[0].style.color = colorBattles(MembersArray[0][type]['battles']);
  207. stat[1].getElementsByClassName('value')[0].style.color = colorWinsPercents(MembersArray[0][type]['wins_percents']);
  208. stat[2].getElementsByClassName('value')[0].style.color = colorAvgDamage(MembersArray[0][type]['avg_damage'], MembersArray[0][type]['avg_level_battles']);
  209. stat[3].getElementsByClassName('value')[0].style.color = colorKillDead(MembersArray[0][type]['kill_dead']);
  210.  
  211. var userbar = '';
  212. var my_profile_nickname = document.getElementsByClassName('js-my_profile_nickname')[0].textContent;
  213. if(type == 'pvp'){
  214. if(my_profile_nickname == MembersArray[0]['account_name']){
  215. userbar += '<button class="btn btn-default" id="generator-userbar" style="margin: 5px;">'+localization['generator-userbar']+'</button>';
  216. }
  217. userbar += '' +
  218. '<br />'+
  219. '<img id="userbar-img" src="'+WoWsStatInfoHref+'bg/userbar.png" />'+
  220. '<div id="userbar-link" style="margin: 5px;">'+WoWsStatInfoHref+'bg/userbar.png</div>'
  221. '';
  222. }
  223. account_statistics__general.outerHTML += '' +
  224. '<hr />' +
  225. '<table style="width: 100%;">' +
  226. '<tr>' +
  227. '<td style="vertical-align: top;">' +
  228. '<div id="wowsstatinfo-'+type+'" class="wowsstatinfo-stat">' +
  229. '<span class="name-stat">'+localization['wr']+':</span> ' +
  230. '<font color="'+colorWalkureRating(MembersArray[0][type]['wr'])+'">'+(MembersArray[0][type]['wr']).toFixed(2)+'</font>' +
  231. '</div>' +
  232. '</td>'+
  233. '<td style="width: 460px; text-align: center; vertical-align: top;">'+
  234. userbar +
  235. '</td>' +
  236. '</tr>' +
  237. '</table>'
  238. '';
  239. }
  240. }
  241. var img = new Image();
  242. img.onload = function(){
  243. var userbar_img = document.getElementById('userbar-img');
  244. userbar_img.src = WoWsStatInfoHref+'userbar/'+MembersArray[0]['account_name']+'.png'+'?'+Math.floor(Math.random()*100000001);
  245. var userbar_link = document.getElementById('userbar-link');
  246. userbar_link.textContent = WoWsStatInfoHref+'userbar/'+MembersArray[0]['account_name']+'.png';
  247. }
  248. img.src = WoWsStatInfoHref+'userbar/'+MembersArray[0]['account_name']+'.png'+'?'+Math.floor(Math.random()*100000001);
  249. jQ('#generator-userbar').click(function(){
  250. GeneratorUserBar();
  251. });
  252.  
  253. if(MembersArray[0]['clans'] != null){
  254. var day = dateDiffInDays(MembersArray[0]['clans']['joined_at'] * 1000, new Date().getTime());
  255. var content = document.getElementsByClassName('content')[0];
  256. var row = content.getElementsByClassName('row')[0];
  257. var col_md_8 = row.getElementsByClassName('col-md-8')[0];
  258. col_md_8.outerHTML += '' +
  259. '<style>' +
  260. '.b-profile-clan{float: right;max-width: 400px;margin-top: -90px;padding-right: 100px;margin-bottom: 14px;padding-top: 5px;position: relative;}' +
  261. '.b-profile-clan_photo{float: left;width: 61px;position: relative;min-height: 70px;top: 5px;}' +
  262. '.b-profile-clan_color{width: 15px;height: 15px;position: absolute;left: 38px;top: 2px;}' +
  263. '.b-profile-clan_link{background-image: url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI4NTIxMEI3ODRFODExRTI5ODYxODk4QjE3Q0IyNzkyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI4NTIxMEI4ODRFODExRTI5ODYxODk4QjE3Q0IyNzkyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Qjg1MjEwQjU4NEU4MTFFMjk4NjE4OThCMTdDQjI3OTIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Qjg1MjEwQjY4NEU4MTFFMjk4NjE4OThCMTdDQjI3OTIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7V+fopAAAMmElEQVR42sxazY7jxhEm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");display: block;height: 54px;position: absolute;left: 2px;padding: 11px 0 0 11px;width: 54px;}' +
  264. '.b-profile-clan_text{margin-left: 61px;}' +
  265. '.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;}' +
  266. '.b-link-clan{color: #f9d088;font-weight: bold;text-decoration: none;}' +
  267. '.b-link-clan_tag{color: #babcbf;}' +
  268. '.b-statistic{overflow: hidden;margin: 0 0 16px;line-height: 14px;}' +
  269. '.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;}' +
  270. '.b-statistic_value{color: #babcbf;}' +
  271. '</style>' +
  272. '<div class="b-profile-clan b-profile-clan__points js-tooltip" id="js-profile-clan">' +
  273. '<div class="b-profile-clan_photo">' +
  274. '<div style="background: '+MembersArray[0]['clans']['clan']['color']+';" class="b-profile-clan_color"><!-- --></div>' +
  275. '<a class="b-profile-clan_link" href="http://'+realm+'.wargaming.net/clans/'+MembersArray[0]['clans']['clan']['clan_id']+'/" target="_blank">' +
  276. '<img alt="Walkure: WEST" src="'+MembersArray[0]['clans']['clan']['emblems']['x32']['portal']+'" width="32" height="32">' +
  277. '</a>' +
  278. '</div>' +
  279. '<div class="b-profile-clan_text">' +
  280. '<div class="b-profile-clan_text-wrpr">' +
  281. '<a class="b-link-clan" href="http://'+realm+'.wargaming.net/clans/'+MembersArray[0]['clans']['clan']['clan_id']+'/" target="_blank">' +
  282. '<span class="b-link-clan_tag">['+MembersArray[0]['clans']['clan']['tag']+']</span>&nbsp;'+MembersArray[0]['clans']['clan']['name']+'' +
  283. '</a>' +
  284. '</div>' +
  285. '<div class="b-statistic">' +
  286. '<p class="b-statistic_item">Должность: <span class="b-statistic_value">'+MembersArray[0]['clans']['role_i18n']+'</span></p>' +
  287. '<p class="b-statistic_item">Количество дней в клане: <span class="b-statistic_value">'+day+'</span></p>' +
  288. '</div>' +
  289. '</div>' +
  290. '</div>' +
  291. '';
  292. }
  293. }
  294. function getMemberStatistic(){
  295. MembersArray[0] = [];
  296. var account_href = window.location.href.split('/')[5].split('-');
  297. var account_id = account_href[0];
  298. var account_name = account_href[1];
  299. var account = document.getElementsByClassName('account')[0];
  300. account_name = account.getElementsByTagName('h1')[0].textContent;
  301. MembersArray[0]['account_id'] = account_id;
  302. MembersArray[0]['account_name'] = account_name;
  303. for(var t = 0; t < typeStat.length; t++){
  304. var type = typeStat[t];
  305. MembersArray[0][type] = [];
  306. var account_statistic = document.getElementById('account_statistic-'+type);
  307. if(account_statistic == null){return;}
  308. var account_statistics = account_statistic.getElementsByClassName('account_statistics__rates-small-border');
  309. if(account_statistics.length == 3){
  310. MembersArray[0][type]['battles'] = htmlParseMemberStatistic(account_statistics[0].rows[1].cells[1]);
  311. MembersArray[0][type]['wins'] = htmlParseMemberStatistic(account_statistics[0].rows[2].cells[1]);
  312. MembersArray[0][type]['losses'] = htmlParseMemberStatistic(account_statistics[0].rows[3].cells[1]);
  313. MembersArray[0][type]['draws'] = htmlParseMemberStatistic(account_statistics[0].rows[4].cells[1]);
  314. MembersArray[0][type]['survived_battles'] = htmlParseMemberStatistic(account_statistics[0].rows[5].cells[1]);
  315. MembersArray[0][type]['hits_percents'] = htmlParseMemberStatistic(account_statistics[0].rows[6].cells[1]);
  316. MembersArray[0][type]['damage'] = htmlParseMemberStatistic(account_statistics[0].rows[7].cells[1]);
  317. MembersArray[0][type]['frags_ships'] = htmlParseMemberStatistic(account_statistics[0].rows[8].cells[1]);
  318. MembersArray[0][type]['frags_planes'] = htmlParseMemberStatistic(account_statistics[0].rows[9].cells[1]);
  319. MembersArray[0][type]['capture_base'] = htmlParseMemberStatistic(account_statistics[0].rows[10].cells[1]);
  320. MembersArray[0][type]['defend_base'] = htmlParseMemberStatistic(account_statistics[0].rows[11].cells[1]);
  321. MembersArray[0][type]['avg_xp'] = htmlParseMemberStatistic(account_statistics[1].rows[1].cells[1]);
  322. MembersArray[0][type]['avg_damage'] = htmlParseMemberStatistic(account_statistics[1].rows[2].cells[1]);
  323. MembersArray[0][type]['avg_frags_ships'] = htmlParseMemberStatistic(account_statistics[1].rows[3].cells[1]);
  324. MembersArray[0][type]['avg_frags_planes'] = htmlParseMemberStatistic(account_statistics[1].rows[4].cells[1]);
  325. MembersArray[0][type]['avg_capture_base'] = htmlParseMemberStatistic(account_statistics[1].rows[5].cells[1]);
  326. MembersArray[0][type]['avg_defend_base'] = htmlParseMemberStatistic(account_statistics[1].rows[6].cells[1]);
  327. MembersArray[0][type]['max_xp'] = htmlParseMemberStatistic(account_statistics[2].rows[1].cells[1]);
  328. MembersArray[0][type]['max_damage'] = htmlParseMemberStatistic(account_statistics[2].rows[2].cells[1]);
  329. MembersArray[0][type]['max_frags_ships'] = htmlParseMemberStatistic(account_statistics[2].rows[3].cells[1]);
  330. MembersArray[0][type]['max_frags_planes'] = htmlParseMemberStatistic(account_statistics[2].rows[4].cells[1]);
  331. var ships__avg_params = account_statistic.getElementsByClassName('ships__avg-params')[0]
  332. MembersArray[0][type]['avg_level_battles'] = htmlParseMemberStatistic(ships__avg_params.getElementsByClassName('_value')[0]);
  333. }else{
  334. MembersArray[0][type]['battles'] = 0;
  335. MembersArray[0][type]['wins'] = 0;
  336. MembersArray[0][type]['losses'] = 0;
  337. MembersArray[0][type]['draws'] = 0;
  338. MembersArray[0][type]['survived_battles'] = 0;
  339. MembersArray[0][type]['hits_percents'] = 0;
  340. MembersArray[0][type]['damage'] = 0;
  341. MembersArray[0][type]['frags_ships'] = 0;
  342. MembersArray[0][type]['frags_planes'] = 0;
  343. MembersArray[0][type]['capture_base'] = 0;
  344. MembersArray[0][type]['defend_base'] = 0;
  345. MembersArray[0][type]['avg_xp'] = 0;
  346. MembersArray[0][type]['avg_damage'] = 0;
  347. MembersArray[0][type]['avg_frags_ships'] = 0;
  348. MembersArray[0][type]['avg_frags_planes'] = 0;
  349. MembersArray[0][type]['avg_capture_base'] = 0;
  350. MembersArray[0][type]['avg_defend_base'] = 0;
  351. MembersArray[0][type]['max_xp'] = 0;
  352. MembersArray[0][type]['max_damage'] = 0;
  353. MembersArray[0][type]['max_frags_ships'] = 0;
  354. MembersArray[0][type]['max_frags_planes'] = 0;
  355. MembersArray[0][type]['avg_level_battles'] = 0;
  356. }
  357. /* ===== Calc Statistic ===== */
  358. {
  359. MembersArray[0][type]['wins_percents'] = (MembersArray[0][type]['wins']/MembersArray[0][type]['battles'])*100;
  360. MembersArray[0][type]['kill_dead'] = MembersArray[0][type]['frags_ships']/(MembersArray[0][type]['battles']-MembersArray[0][type]['survived_battles']);
  361. var avg_damage = MembersArray[0][type]['avg_damage'];
  362. var avg_frags_ships = MembersArray[0][type]['avg_frags_ships'];
  363. var avg_frags_planes = MembersArray[0][type]['avg_frags_planes'];
  364. var avg_capture_base = MembersArray[0][type]['avg_capture_base'];
  365. var avg_defend_base = MembersArray[0][type]['avg_defend_base'];
  366. var avg_level_battles = MembersArray[0][type]['avg_level_battles'];
  367. var wr = avg_damage/(avg_level_battles*10) + avg_frags_ships*200 + (avg_frags_planes/6)*120 + avg_capture_base*35 + avg_defend_base*35;
  368. if(isNaN(wr)){wr = 0;}
  369. MembersArray[0][type]['wr'] = wr;
  370. }
  371. }
  372. //console.log(MembersArray[0]);
  373. }
  374. function doneClanInfo(url, response){
  375. if(response.status && response.status == "error"){
  376. errorClanInfo();
  377. return;
  378. }
  379. var vars = getUrlVars(url);
  380. var account_id = vars['account_id'];
  381. MembersArray[0]['clans'] = response['data'][account_id];
  382. viewMemberProfilePage();
  383. }
  384. function errorClanInfo(url){
  385. MembersArray[0]['clans'] = null;
  386. viewMemberProfilePage();
  387. }
  388. function GeneratorUserBar(){
  389. var jsonString = 'json='+JSON.stringify(MembersArray[0])+'&type=userbar';
  390. var xmlhttp;
  391. try{
  392. xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
  393. }catch(e){
  394. try{
  395. xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
  396. }catch(E){
  397. xmlhttp = false;
  398. }
  399. }
  400. if(!xmlhttp && typeof XMLHttpRequest != 'undefined'){
  401. xmlhttp = new XMLHttpRequest();
  402. }
  403. xmlhttp.open('POST', ''+WoWsStatInfoHref+'userbar.php?random='+Math.floor(Math.random()*100000001), true);
  404. xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  405. xmlhttp.onreadystatechange = function(){
  406. if(xmlhttp.readyState == 4){
  407. if(xmlhttp.status == 200){
  408. var userbar_img = document.getElementById('userbar-img');
  409. userbar_img.src = xmlhttp.responseText+'?'+Math.floor(Math.random()*100000001);
  410. var userbar_link = document.getElementById('userbar-link');
  411. userbar_link.textContent = xmlhttp.responseText;
  412. }
  413. }
  414. };
  415. xmlhttp.send(jsonString);
  416. }
  417. function htmlParseMemberStatistic(element){
  418. var value = element.textContent.trim().replace(new RegExp(' ', 'g'), '');
  419. value = value.replace('%', '');
  420. value = value.replace(',', '.');
  421. if(value.indexOf('(') > -1 && value.indexOf(')') > -1){
  422. value = (value.split(' '))[0];
  423. }
  424. return value;
  425. }
  426. /* ===== Color function ===== */
  427. function findColor(value, colorsBorders) {
  428. if (isNaN(value) || value <= colorsBorders[0]) {
  429. return color['very_bad'];
  430. } else if (value <= colorsBorders[1]) {
  431. return color['bad'];
  432. } else if (value <= colorsBorders[2]) {
  433. return color['normal'];
  434. } else if (value <= colorsBorders[3]) {
  435. return color['good'];
  436. } else if (value <= colorsBorders[4]) {
  437. return color['very_good'];
  438. } else if (value <= colorsBorders[5]) {
  439. return color['unique'];
  440. } else {
  441. return color['very_bad'];
  442. }
  443. }
  444. function colorBattles(b){
  445. return findColor(b / 1000, [0.5, 1.5, 4, 7.5, 10, 999]);
  446. }
  447. function colorWinsPercents(wp){
  448. return findColor(wp, [46, 48, 51, 56, 64, 100]);
  449. }
  450. function colorBattlesAvgXP(baxp) {
  451. return findColor(baxp, [1000, 1150, 1375, 1600, 1825, 9999]);
  452. }
  453. function colorWalkureRating(wr) {
  454. return findColor(wr, [609, 849, 1144, 1474, 1774, 9999]);
  455. }
  456. function colorAvgDamage(ad, alb) {
  457. return findColor(ad/(alb*10), [300, 500, 700, 850, 1000, 9999]);
  458. }
  459. function colorKillDead(kd) {
  460. return findColor(kd, [1.3, 1.7, 2.1, 2.5, 2.7, 99]);
  461. }
  462. /* ===== UserScript function ===== */
  463. function getJson(url, onDone, onError){
  464. if(MaxProcess > Process){
  465. Process++;
  466. jQ.getJSON(url).done(function(result){
  467. Process--;
  468. onDone(url, result);
  469. }).fail(function(jqxhr, textStatus, error){
  470. Process--;
  471. onError(url);
  472. });
  473. }else{
  474. setTimeout(function(){getJson(url, onDone, onError);}, 1000);
  475. }
  476. }
  477. function getApplicationId(realm){
  478. var applicationId = [];
  479. applicationId['ru'] = '465b433458404851342a8ad750e67820'; // .ru
  480. applicationId['eu'] = '953df86f6bca01a7af80c3bdedd9c1d9'; // .eu
  481. return applicationId[realm].split("").reverse().join("");
  482. }
  483. function getUrlVars(url){
  484. var vars = {};
  485. var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value){
  486. vars[key] = value;
  487. });
  488. return vars;
  489. }
  490. function dateDiffInDays(a, b){
  491. var date1 = new Date(a);
  492. var date2 = new Date(b);
  493. if(b == null){
  494. date2 = new Date();
  495. }
  496. var timeDiff = date2.getTime() - date1.getTime();
  497. var diffDays = timeDiff / (1000 * 3600 * 24);
  498. if(diffDays < 0){diffDays = 0;}
  499. return (diffDays).toFixed(0);
  500. }
  501. function getUserScriptDeveloperBlock(){
  502. var html = '' +
  503. '<div class="div-link-block">' +
  504. '<span id="userscriptwowsstatinfo" class="link-block hide-block">' +
  505. 'UserScript WoWsStatInfo ' + VersionWoWsStatInfo +
  506. '<div class="icon-link-block"></div>'+
  507. '</span>' +
  508. '</div>' +
  509. '<div id="userscript-block" class="userscriptwowsstatinfo hide-block" style="text-align: center;">' +
  510. '<span class="userscript-developer" align="center">' +
  511. localization['userscript-developer'] +
  512. ' <a target="_blank" style="color: #658C4C; font-weight: bold; border-bottom: 1px dotted #658C4C;" href="http://worldofwarships.ru/cbt/accounts/635939-Vov_chiK/">Vov_chiK</a> ' +
  513. localization['userscript-alliance'] +
  514. ' <a target="_blank" style="color: #2CA8C7; font-weight: bold; border-bottom: 1px dotted #2CA8C7;" href="http://'+realm+'.wargaming.net/clans/search/#wgsearch&offset=0&limit=10&search=Walkure">Walkure</a>.' +
  515. '<br /><br />' +
  516. localization['userscript-topic']+' '+
  517. '<a target="_blank" href="'+WoWsStatInfoLink+'">' +
  518. WoWsStatInfoLinkName +
  519. '</a>' +
  520. '<br /><br />' +
  521. '<font style="font-size: 16px; color: #658C4C;">'+localization['userscript-developer-support']+'</font><br />'+
  522. '<font style="color: #2CA8C7;">Web-Money WMR</font> R295712009837 <br />'+
  523. '<font style="color: #2CA8C7;">Web-Money WMZ</font> Z226959724402 <br />'+
  524. '<font style="color: #2CA8C7;">Yandex Money</font> 41001290117791 <br />'+
  525. '<font style="color: #2CA8C7;">RBK Money</font> RU353257918 <br />'+
  526. '</span>' +
  527. '</div>' +
  528. '';
  529. return html;
  530. }
  531. function onViewBlock(element){
  532. if(null != element.getAttribute('id')){
  533. var viewId = element.getAttribute('id');
  534. var viewClassLink = element.getAttribute('class');
  535. var viewBlock = document.getElementsByClassName(viewId)[0];
  536. if(viewClassLink == 'link-block hide-block'){
  537. element.setAttribute('class', 'link-block show-block');
  538. viewBlock.setAttribute('class', viewBlock.getAttribute('class').replace('hide-block', 'show-block'));
  539. setLocalStorage(viewId, 'show', false);
  540. }else{
  541. element.setAttribute('class', 'link-block hide-block');
  542. viewBlock.setAttribute('class', viewBlock.getAttribute('class').replace('show-block', 'hide-block'));
  543. setLocalStorage(viewId, 'hide', false);
  544. }
  545. }
  546. }
  547. function checkLocalStorage(){
  548. try{
  549. return 'localStorage' in window && window['localStorage'] !== null;
  550. }catch (e){
  551. return false;
  552. }
  553. }
  554. function setLocalStorage(key, value, allPageHost){
  555. if(checkLocalStorage()){
  556. if(allPageHost){key = key+ClanId;}
  557. window.localStorage.setItem(key, value);
  558. }else{
  559. setCookie(key, value, allPageHost);
  560. }
  561. }
  562. function getLocalStorage(key, allPageHost){
  563. var value = null;
  564. if(checkLocalStorage()){
  565. if(allPageHost){key = key+ClanId;}
  566. value = window.localStorage.getItem(key);
  567. }else{
  568. value = getCookie(key);
  569. }
  570. return value;
  571. }
  572. function setCookie(c_name, value, allPageHost){
  573. var exdate = new Date();
  574. exdate.setDate(exdate.getDate() + 365);
  575. if(allPageHost){
  576. var c_value = escape(value) + ((365 == null) ? "" : "; expires="+exdate.toUTCString()+"; domain=" +window.location.hostname+"; path=/");
  577. document.cookie = c_name + "=" + c_value;
  578. }else{
  579. var c_value = escape(value) + ((365 == null) ? "" : "; expires="+exdate.toUTCString());
  580. document.cookie = c_name + "=" + c_value;
  581. }
  582. }
  583. function getCookie(c_name){
  584. var c_value = document.cookie;
  585. var c_start = c_value.indexOf(" " + c_name + "=");
  586. if(c_start == -1){
  587. c_start = c_value.indexOf(c_name + "=");
  588. }
  589. if(c_start == -1){
  590. c_value = null;
  591. }else{
  592. c_start = c_value.indexOf("=", c_start) + 1;
  593. var c_end = c_value.indexOf(";", c_start);
  594. if(c_end == -1){
  595. c_end = c_value.length;
  596. }
  597. c_value = unescape(c_value.substring(c_start,c_end));
  598. }
  599. return c_value;
  600. }
  601. function onShowMessage(title, icon, content, funcOk, OkText, viewCancel){
  602. }
  603. function onCloseMessage(){
  604. }
  605. // Modify JSON.stringify to allow recursive and single-level arrays
  606. (function(){
  607. // Convert array to object
  608. var convArrToObj = function(array){
  609. var thisEleObj = new Object();
  610. if(typeof array == "object"){
  611. for(var i in array){
  612. var thisEle = convArrToObj(array[i]);
  613. thisEleObj[i] = thisEle;
  614. }
  615. }else {
  616. thisEleObj = array;
  617. }
  618. return thisEleObj;
  619. };
  620. var oldJSONStringify = JSON.stringify;
  621. JSON.stringify = function(input){
  622. return oldJSONStringify(convArrToObj(input));
  623. };
  624. })();
  625. function getLocalization(lang){
  626. var localization = [];
  627. {/* Русский */
  628. localization['ru'] = [];
  629. localization['ru']['realm'] = 'ru';
  630. localization['ru']['Box'] = 'Оповещение';
  631. localization['ru']['Ok'] = 'Ok';
  632. localization['ru']['Cancel'] = 'Отмена';
  633. localization['ru']['ErrorScript'] = 'Во время работы UserScript WoWsStatInfo '+VersionWoWsStatInfo+', возникла ошибка:';
  634. localization['ru']['ErrorSendDeveloper'] = 'Сообщите об ошибке разработчику скрипта.';
  635. localization['ru']['userscript-developer'] = 'Разработчик UserScript WoWsStatInfo:';
  636. localization['ru']['userscript-alliance'] = 'член альянса';
  637. localization['ru']['userscript-topic'] = 'Тема на форуме:';
  638. localization['ru']['userscript-developer-support'] = 'Поддержать автора скрипта:';
  639. localization['ru']['generator-userbar'] = 'Создать UserBar';
  640. localization['ru']['wr'] = 'WR';
  641. }
  642. return localization[lang];
  643. }
  644. }
  645. /* ===== Load UserScript ===== */
  646. function addJQuery(callback){
  647. var script = document.createElement("script");
  648. script.async = true;
  649. script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js");
  650. script.addEventListener(
  651. 'load',
  652. function(){
  653. var script = document.createElement("script");
  654. script.async = true;
  655. script.textContent = "window.jQ = jQuery.noConflict(true);"+
  656. "("+callback.toString()+")();";
  657. document.head.appendChild(script);
  658. },
  659. false
  660. );
  661. document.head.appendChild(script);
  662. }
  663.  
  664. if(window.location.host.indexOf("worldofwarships") > -1){
  665. addJQuery(WoWsStatInfo);
  666. }
  667. })(window);