- // ==UserScript==
- // @name LWMActivityTracker
- // @author Theatre Of Pain (http://www.lordswm.com/pl_info.php?id=4821925)
- // @version 2.0.161216
- // @description This script tracks your daily activities by monitoring experience, guilds, and faction points
- // @include http://www.lordswm.com/home.php
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_log
- // @namespace https://greasyfork.org/users/86247
- // ==/UserScript==
-
- var debug = false; //turn to true to display debug messages in the error console
-
- const COMPARTMENT_SIZE = 7; // grouping per date
- const MAX_COMPARTMENTS = 8; // maximum number of groups
- const GRAPH_RECORDS = COMPARTMENT_SIZE * MAX_COMPARTMENTS; // number of tracker records
- const GRAPH_COLOR = 'blue';
- const INVERT_GRAPH_COLOR = 'orange';
- const LIGHT_BG = '#FFFFFF';
- const DARK_BG = '#DDD9CD';
- const DATESTAMP_SIZE = 8;
-
- const EXPERIENCE_RECORD = 26;
- const DATESTAMP = 0;
- const EXP = 1;
- const FSP = 2;
- const KNIGHT = 3;
- const NECRO = 4;
- const WIZARD = 5;
- const ELF = 6;
- const BARBARIAN = 7;
- const DARK_ELF = 8;
- const DEMON = 9;
- const DWARF = 10;
- const TRIBAL = 11;
- const XX = 12; // reserved for future expansion
- const YY = 13; // reserved for future expansion
- const ZZ = 14; // reserved for future expansion
- const HG = 15;
- const LG = 16;
- const GG = 17;
- const TG = 18;
- const MG = 19;
- const CG = 20;
- const SG = 21;
- const EG = 22;
- const RG = 23;
- const WG = 24;
- const AG = 25;
-
- // list labels
- const EXP_L = 'Experience';
- const FSP_L = 'Faction Skill Points';
- const KNIGHT_L = 'Knight FSP';
- const NECRO_L = 'Necromancer FSP';
- const WIZARD_L = 'Wizard FSP';
- const ELF_L = 'Elf FSP';
- const BARBARIAN_L = 'Barbarian FSP';
- const DARK_ELF_L = 'Dark Elf FSP';
- const DEMON_L = 'Demon FSP';
- const DWARF_L = 'Dwarf FSP';
- const TRIBAL_L = 'Tribal FSP';
- const XX_L = '- Reserved for future expansion -';
- const YY_L = '- Reserved for future expansion -';
- const ZZ_L = '- Reserved for future expansion -';
- const HG_L = 'Hunters\' guild';
- const LG_L = 'Laborers\' guild';
- const GG_L = 'Gamblers\' guild';
- const TG_L = 'Thieves\' guild';
- const RG_L = 'Rangers\' guild';
- const MG_L = 'Mercenaries\' guild';
- const CG_L = 'Commanders\' guild';
- const SG_L = 'Smiths\' guild';
- const EG_L = 'Enchanters\' guild';
- const WG_L = 'Watchers\' guild';
- const AG_L = 'Adventurers\' guild';
-
- // graph labels
- var labels = new Array();
- labels[DATESTAMP] = 'Date';
- labels[EXP] = 'Experience';
- labels[FSP] = 'Total FSP';
- labels[KNIGHT] = 'Knight';
- labels[NECRO] = 'Necromancer';
- labels[WIZARD] = 'Wizard';
- labels[ELF] = 'Elf';
- labels[BARBARIAN] = 'Barbarian';
- labels[DARK_ELF] = 'Dark Elf';
- labels[DEMON] = 'Demon';
- labels[DWARF] = 'Dwarf';
- labels[TRIBAL] = 'Tribal';
- labels[XX] = 'RESERVED';
- labels[YY] = 'RESERVED';
- labels[ZZ] = 'RESERVED';
- labels[HG] = 'HG';
- labels[LG] = 'LG';
- labels[GG] = 'GG';
- labels[TG] = 'TG';
- labels[RG] = 'RG';
- labels[MG] = 'MG';
- labels[CG] = 'CG';
- labels[SG] = 'SG';
- labels[EG] = 'EG';
- labels[WG] = 'WG';
- labels[AG] = 'AG';
-
- var experience = new Array();
- var tracker = new Array();
- var experience_record = new Array(EXPERIENCE_RECORD);
- var graph_width = 100;
- var empty_cell_size = 3;
- var date_cell_width = 60;
- var graph_div, backup_div, options_div;
- var graph;
- var select;
- var player_name;
- var server_name;
-
- main();
-
- function main() {
- getPlayerAndServer();
- getExperienceData();
- experience_record = getExperienceRecord();
- createExperienceRecord(experience_record);
- setExperienceData();
- buildTracker();
- tooltipStyle();
- displayTracker();
- }
-
- function getPlayerAndServer() {
- var all_params = document.getElementsByTagName('param');
- for (var i = 0; i < all_params.length; i++) {
- if (all_params[i].name == 'FlashVars') {
- player_name = all_params[i].value.split('|')[3];
- break;
- }
- }
-
- if (location.href.indexOf('.com') != -1) {
- server_name = '.com';
- } else {
- server_name = '.ru';
- }
-
- if (debug) {GM_log(
- 'Server name = ' + server_name +
- '\nPlayer name = ' + player_name
- )}
-
- }
-
- function getExperienceData() {
- var temp_data;
-
- // migrate earlier version that didn't store experience by player name
- temp_data = GM_getValue('Experience', -1);
- if (temp_data != -1) {
- GM_setValue(player_name + server_name + ' Experience', temp_data);
- GM_deleteValue('Experience');
- document.cookie = 'ActivityTrackerBackup=0;expires=' + new Date('1999');
- }
-
- temp_data = GM_getValue(player_name + server_name + ' Experience', -1);
- if (temp_data != -1) {
- experience = temp_data.split(',');
- // migrate earlier version that didn't store watchers and adventurers data
- if (experience[0].split('#').length != EXPERIENCE_RECORD) {
- var experience_record = new Array(EXPERIENCE_RECORD);
- for (var x = 0; x < experience.length; x++) {
- experience[x] = experience[x] + '#0#0';
- }
- document.cookie = player_name + server_name + 'ActivityTrackerBackup=0'
- + ';expires=' + new Date('1999');
- } else {
- var backup_data = getCookie(player_name + server_name + 'ActivityTrackerBackup');
- if (backup_data != 0) {
- var backup_array = backup_data.split(',');
- for (var z = 0; z < backup_array.length; z++) {
- var updated = false;
- for (var y = 0; y < experience.length; y++) {
- if (experience[y].substring(0,DATESTAMP_SIZE) == backup_array[z].substring(0,DATESTAMP_SIZE)) {
- experience[y] = backup_array[z];
- updated = true;
- }
- }
- if (!updated) {
- experience.push(backup_array[z]);
- }
- }
- experience.sort();
- experience.reverse();
- }
- }
- } else {
- experience = new Array();
- }
- }
-
- // this function returns the value of a stored cookie
- function getCookie(cookie_key) {
- var i,x,y,ARRcookies=document.cookie.split(';');
- for (i=0;i<ARRcookies.length;i++) {
- x=ARRcookies[i].substr(0,ARRcookies[i].indexOf('='));
- y=ARRcookies[i].substr(ARRcookies[i].indexOf('=')+1);
- x=x.replace(/^\s+|\s+$/g,'');
- if (x==cookie_key) {
- return unescape(y);
- }
- }
- return 0;
- }
-
- function setExperienceData() {
- experience.sort();
- experience.reverse();
- GM_setValue(player_name + server_name + ' Experience', experience.toString());
-
- // keep last n days of data as cookie to recover from broswer crashes
- // n is determined by COMPARTMENT_SIZE
- var backup_data = new Array();
- var days_to_keep;
- (experience.length > COMPARTMENT_SIZE) ? (days_to_keep = COMPARTMENT_SIZE) : (days_to_keep = experience.length);
- var z = 0;
- while (z < days_to_keep) {
- backup_data.push(experience[z]);
- z++;
- }
- document.cookie = player_name + server_name + 'ActivityTrackerBackup=' + backup_data.toString()
- + ';expires=' + new Date('2050');
- }
-
- function createExperienceRecord(passed_experience_record) {
- new_record = passed_experience_record.toString().replace(/,/g,'#');
- for (var z = 0; z < experience.length; z++) {
- if (experience[z].substring(0,DATESTAMP_SIZE) == new_record.substring(0,DATESTAMP_SIZE)) {
- if (experience[z] != new_record) {
- experience[z] = new_record;
- }
- return;
- }
- }
- if (experience.length == 0) {
- var first_record = (parseInt(new_record.substring(0,DATESTAMP_SIZE)) - 1) + new_record.substring(DATESTAMP_SIZE);
- experience.push(first_record);
- }
- experience.push(new_record);
- }
-
- // parse experience, faction, and guild points and return as an array
- function getExperienceRecord() {
- var all_tables = document.getElementsByTagName('table');
- var main_table;
- var matched;
- var combat_level;
- var experience_td, faction_td;
- var faction_array = new Array();
- var temp_experience_record = new Array(EXPERIENCE_RECORD);
- for (var i = 0; i < all_tables.length; i++) {
- if ((all_tables[i].innerHTML.indexOf('Combat level') != -1)
- && (all_tables[i].innerHTML.indexOf('Necromancer') != -1)
- && (all_tables[i].innerHTML.indexOf('Laborers') != -1)) {
- main_table = all_tables[i];
- }
- }
-
- var all_tds = main_table.getElementsByTagName('td');
- for (var i = 0; i < all_tds.length; i++) {
- if ((all_tds[i].innerHTML.indexOf('Necromancer') != -1)
- && (all_tds[i].innerHTML.indexOf('Laborers') != -1)) {
- faction_td = all_tds[i];
- }
- if (all_tds[i].innerHTML.indexOf('Combat level') != -1) {
- experience_td = all_tds[i];
- }
- }
-
- matched = experience_td.innerHTML.replace(/,/g, '').match(/\((\d*)\)/);
- temp_experience_record[EXP] = RegExp.$1;
-
- faction_array = faction_td.innerHTML.split(' ');
-
- for (var i = 0; i < faction_array.length; i++) {
- // faction points
- matched = faction_array[i].match(/Knight: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[KNIGHT] = RegExp.$1;
- }
- matched = faction_array[i].match(/Necromancer: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[NECRO] = RegExp.$1;
- }
- matched = faction_array[i].match(/Wizard: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[WIZARD] = RegExp.$1;
- }
- matched = faction_array[i].match(/Elf: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[ELF] = RegExp.$1;
- }
- matched = faction_array[i].match(/Barbarian: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[BARBARIAN] = RegExp.$1;
- }
- matched = faction_array[i].match(/Dark elf: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[DARK_ELF] = RegExp.$1;
- }
- matched = faction_array[i].match(/Demon: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[DEMON] = RegExp.$1;
- }
- matched = faction_array[i].match(/Dwarf: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[DWARF] = RegExp.$1;
- }
- matched = faction_array[i].match(/Tribal: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[TRIBAL] = RegExp.$1;
- }
-
- //guilds
- matched = faction_array[i].match(/Hunters' guild:/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[HG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Laborers' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[LG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Gamblers' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[GG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Thieves' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[TG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Rangers' Guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[RG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Mercenaries' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[MG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Commanders' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[CG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Smiths' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[SG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Watchers' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[WG] = RegExp.$1;
- }
- matched = faction_array[i].match(/Adventurers' guild: (\d*)/);
- if (matched != null) {
- matched = faction_array[i].match(/\((\d*.\d*)\)/);
- temp_experience_record[AG] = RegExp.$1;
- }
- }
-
- matched = document.getElementById('home_2').innerHTML.match(/\((\d*.\d*)\)/);
- temp_experience_record[EG] = RegExp.$1;
-
- var localDate = new Date();
- var utcDate = localDate.getTime() + (localDate.getTimezoneOffset() * 60000); //in ms
- var serverDate = new Date(utcDate + (3600000*4)); //GMT+4
-
- var year = serverDate.getFullYear();
- var month = serverDate.getMonth() + 1;
- if (month.toString().length == 1) {
- month = '0' + month;
- }
- var day = serverDate.getDate();
- if (day.toString().length == 1) {
- day = '0' + day;
- }
- temp_experience_record[DATESTAMP] = '' + year + month + day;
- temp_experience_record[FSP] = roundNumber((parseFloat(temp_experience_record[KNIGHT])
- + parseFloat(temp_experience_record[NECRO])
- + parseFloat(temp_experience_record[WIZARD])
- + parseFloat(temp_experience_record[ELF])
- + parseFloat(temp_experience_record[BARBARIAN])
- + parseFloat(temp_experience_record[DARK_ELF])
- + parseFloat(temp_experience_record[DEMON])
- + parseFloat(temp_experience_record[DWARF])
- + parseFloat(temp_experience_record[TRIBAL])), 2);
-
- temp_experience_record[XX] = 0;
- temp_experience_record[YY] = 0;
- temp_experience_record[ZZ] = 0;
-
- if (debug) {GM_log(
- '\nServer timestamp = ' + serverDate +
- '\n\nKnight FSP = ' + temp_experience_record[KNIGHT] +
- '\nNecromancer FSP = ' + temp_experience_record[NECRO] +
- '\nWizard FSP = ' + temp_experience_record[WIZARD] +
- '\nElf FSP = ' + temp_experience_record[ELF] +
- '\nBarbarian FSP = ' + temp_experience_record[BARBARIAN] +
- '\nDark elf FSP = ' + temp_experience_record[DARK_ELF] +
- '\nDemon FSP = ' + temp_experience_record[DEMON] +
- '\nDwarf FSP = ' + temp_experience_record[DWARF] +
- '\nTribal FSP = ' + temp_experience_record[TRIBAL] +
- '\n\n\nHunters\' guild = ' + temp_experience_record[HG] +
- '\nLaborers\' guild = ' + temp_experience_record[LG] +
- '\nGamblers\' guild = ' + temp_experience_record[GG] +
- '\nThieves\' guild = ' + temp_experience_record[TG] +
- '\nRangers\' guild = ' + temp_experience_record[RG] +
- '\nMercenaries\' guild = ' + temp_experience_record[MG] +
- '\nCommanders\' guild = ' + temp_experience_record[CG] +
- '\nSmiths\' guild = ' + temp_experience_record[SG] +
- '\nWatchers\' guild = ' + temp_experience_record[WG] +
- '\nAdventurers\' guild = ' + temp_experience_record[AG]
- )}
-
- return temp_experience_record;
- }
-
- function buildTracker() {
- var record1, record2;
- for (var z = 0; z < experience.length - 1; z++) {
- var difference_record = new Array();
- record1 = experience[z].split('#');
- record2 = experience[z + 1].split('#');
- difference_record[DATESTAMP] = record1[DATESTAMP];
- for (var y = 1; y < record1.length; y++) {
- if (record1[y] != record2[y]) {
- difference_record[y] = record1[y] - record2[y];
- } else {
- difference_record[y] = '';
- }
- }
- tracker.push(difference_record);
-
- // no need to track historical data that will not be displayed on the graph
- if (tracker.length == GRAPH_RECORDS) {
- break;
- }
- }
- }
-
- function displayTracker() {
- var all_tables = document.getElementsByTagName('tbody');
- var main_table;
- var experience_td, faction_td;
- for (var i = 0; i < all_tables.length; i++) {
- if ((all_tables[i].innerHTML.indexOf('Combat level') != -1)
- && (all_tables[i].innerHTML.indexOf('Necromancer') != -1)
- && (all_tables[i].innerHTML.indexOf('Laborers') != -1)) {
- main_table = all_tables[i];
- }
- }
- faction_td = main_table.getElementsByTagName('td')[1];
- faction_td.rowSpan = 2;
- var tr = document.createElement('tr');
- var td = document.createElement('td');
- graph_div = document.createElement('div');
- graph_div.id = 'graph_div';
- td.appendChild(graph_div);
-
- select = document.createElement('select');
- select.id = 'select';
- addOption(select, EXP, EXP_L);
- addOption(select, FSP, FSP_L);
- addOption(select, KNIGHT, KNIGHT_L);
- addOption(select, NECRO, NECRO_L);
- addOption(select, WIZARD, WIZARD_L);
- addOption(select, ELF, ELF_L);
- addOption(select, BARBARIAN, BARBARIAN_L);
- addOption(select, DARK_ELF, DARK_ELF_L);
- addOption(select, DEMON, DEMON_L);
- addOption(select, DWARF, DWARF_L);
- addOption(select, TRIBAL, TRIBAL_L);
- addOption(select, HG, HG_L);
- addOption(select, LG, LG_L);
- addOption(select, GG, GG_L);
- addOption(select, TG, TG_L);
- addOption(select, MG, MG_L);
- addOption(select, CG, CG_L);
- addOption(select, SG, SG_L);
- addOption(select, EG, EG_L);
- addOption(select, RG, RG_L);
- addOption(select, WG, WG_L);
- addOption(select, AG, AG_L);
- select.onchange = function() {
- if (document.getElementById('graph') != null) {
- document.getElementById('graph_div').removeChild(document.getElementById('graph'));
- }
- GM_setValue('default activity', parseInt(select.options[select.selectedIndex].value));
- if(debug) {GM_log('Display tracking for: ' + select.options[select.selectedIndex].text)}
- document.getElementById('graph_div').appendChild(getActivityGraph(parseInt(select.options[select.selectedIndex].value)));
- }
-
- td.insertBefore(document.createElement('br'), td.firstChild);
- td.insertBefore(document.createElement('br'), td.firstChild);
- td.insertBefore(select, td.firstChild);
- var temp_activity = GM_getValue('default activity', -1);
- if (temp_activity != -1) {
- graph_div.appendChild(getActivityGraph(temp_activity));
- for(var i=0; i < select.options.length; i++){
- if(select.options[i].value == temp_activity)
- select.selectedIndex = i;
- }
- } else {
- GM_setValue('default activity', EXP);
- graph_div.appendChild(getActivityGraph(EXP));
- }
- td.appendChild(createOptionsDiv());
- tr.appendChild(td);
- main_table.appendChild(tr);
-
- function addOption(optionList, value, text) {
- var option;
- option = document.createElement('option');
- option.value = value;
- option.text = text;
- optionList.appendChild(option);
- }
- }
-
- function createOptionsDiv(){
- options_div = document.createElement('div');
- var button_div = document.createElement('div');
- options_div.appendChild(button_div);
- var el = document.createElement('input');
- el.type = 'button';
- el.addEventListener('click', backupActivityData, false);
- el.setAttribute('value', 'Backup');
- button_div.appendChild(el);
- el = document.createElement('input');
- el.type = 'button';
- el.addEventListener('click', updateActivityData, false);
- el.setAttribute('value', 'Update');
- button_div.appendChild(el);
- el = document.createElement('input');
- el.type = 'button';
- el.addEventListener('click', restoreActivityData, false);
- el.setAttribute('value', 'Restore');
- button_div.appendChild(el);
- button_div.appendChild(document.createElement('br'));
- backup_div = document.createElement('div');
- backup_div.id = 'activityTrackerDataDiv';
- backup_div.style.display = 'none';
- options_div.appendChild(backup_div);
- backup_div.appendChild(document.createTextNode('Paste modified data below and click Update to update graph or Restore to restore last backup of data'));
- el = document.createElement('textarea');
- el.id = 'activityTrackerData';
- el.style.width = graph_width * empty_cell_size + date_cell_width;
- el.style.height = graph_width;
- el.style.resize = 'none';
- backup_div.appendChild(el);
- return options_div;
- }
-
- function getActivityGraph(activity_type) {
- var max_value = 0;
- var second_max_value = 0;
- var activity_value;
- var header_sections = 5;
-
- // find maximum value
- for (var z = 0; z < tracker.length; z++) {
- if (tracker[z][activity_type] > max_value) {
- second_max_value = max_value;
- max_value = tracker[z][activity_type];
- } else if (tracker[z][activity_type] > second_max_value) {
- second_max_value = tracker[z][activity_type];
- }
- }
- max_value = roundUp(max_value);
- second_max_value = roundUp(second_max_value);
-
- if (second_max_value != 0) {
- // prevent value spikes from distorting the look of the graph
- if (max_value/2 > second_max_value) {
- max_value = second_max_value;
- }
- }
-
- // graph values
- var tr, td;
- var bgcolor = DARK_BG;
- graph = document.createElement('table');
- graph.id = 'graph';
- graph.className='wblight';
- graph.align = 'center';
- graph.border = 0;
- graph.cellSpacing = 0;
-
- tr = document.createElement('tr');
- tr.className = 'wb';
- tr.bgColor = DARK_BG;
- td = document.createElement('td');
- td.width = date_cell_width;
- td.className = 'wb';
- td.style.fontSize = 8;
- td.innerHTML = labels[activity_type].bold();
- td.align = 'center';
- tr.appendChild(td);
-
- if (max_value != 0) {
- if (max_value <= 5) {
- max_value = 5;
- } else if (max_value <=10) {
- max_value = 10;
- }
- for (var z = 0; z < header_sections; z++) {
- td = document.createElement('td');
- td.className = 'wb';
- td.colSpan = graph_width / header_sections;
- td.align = 'right';
- td.style.fontSize = 8;
- td.innerHTML = roundNumber((max_value * (z + 1)) / header_sections , 2);
- tr.appendChild(td);
- }
- } else {
- td = document.createElement('td');
- td.className = 'wb';
- td.colSpan = graph_width;
- tr.appendChild(td);
- }
-
- graph.appendChild(tr);
- var line_counter = COMPARTMENT_SIZE;
- var class_name = 'wblight';
- for (var z = 0; z < lineCount(tracker.length); z++) {
- if (z == GRAPH_RECORDS) {
- break;
- }
- tr = document.createElement('tr');
- tr.bgColor = GRAPH_COLOR;
- tr.onmouseover = invertColor;
- tr.onmouseout = restoreColor;
- if (line_counter == COMPARTMENT_SIZE) {
- line_counter = 0;
- td = document.createElement('td');
- td.width = date_cell_width;
- td.align = 'center';
- td.style.fontSize = 8;
- if (z < tracker.length) {
- td.innerHTML = tracker[z][DATESTAMP].substr(0,4) + '-' + tracker[z][DATESTAMP].substr(4,2) + '-' + tracker[z][DATESTAMP].substr(6,2);
- }
- (bgcolor == LIGHT_BG) ? bgcolor = DARK_BG : bgcolor = LIGHT_BG;
- td.className = 'wb';
- td.bgColor = bgcolor;
- td.rowSpan = COMPARTMENT_SIZE;
- tr.appendChild(td);
- tr.style.borderTop = '1px solid black';
- }
- line_counter++;
- if (z < tracker.length) {
- activity_value = roundNumber(tracker[z][activity_type]*graph_width/max_value, 0);
- if (tracker[z][activity_type] > 0) {
- tr.id = tracker[z][DATESTAMP].substr(0,4) + '-' + tracker[z][DATESTAMP].substr(4,2) + '-' + tracker[z][DATESTAMP].substr(6,2) + ':\u00a0\u00a0\u00a0' + roundNumber(tracker[z][activity_type], 2);
- }
- } else {
- activity_value = 0;
- }
- for (var y = 0; y < graph_width; y++) {
- td = document.createElement('td');
- td.style.height = empty_cell_size;
- td.style.width = empty_cell_size;
- activity_value--;
- if (activity_value >= 0) {
- td.className = 'NormalColor';
- } else {
- td.bgColor = bgcolor;
- }
- tr.appendChild(td);
- }
- graph.appendChild(tr);
- }
-
- if (tracker.length > COMPARTMENT_SIZE) {
- var average_points = getAveragePoints(activity_type);
- if (average_points != -1) {
- var estimate = provideEstimate(average_points, activity_type);
- if (estimate != -1) {
- tr = document.createElement('tr');
- tr.className = 'wb';
- (bgcolor == LIGHT_BG) ? tr.bgColor = DARK_BG : tr.bgColor = LIGHT_BG;
- td = document.createElement('td');
- td.colSpan = graph_width + 1;
- td.className = 'wb';
- td.style.fontSize = 8;
- td.innerHTML = estimate;
- td.align = 'center';
- tr.appendChild(td);
- graph.appendChild(tr);
- }
- }
- }
- return graph;
- }
-
- function getAveragePoints(activity_type) {
- var points_total = 0;
- for (var z = 1; z < COMPARTMENT_SIZE + 1; z++) {
- if (tracker[z][activity_type] != '') {
- points_total += roundNumber(parseFloat(tracker[z][activity_type]), 2);
- }
- }
- if (points_total == 0) {
- return -1;
- } else {
- return roundNumber(points_total / COMPARTMENT_SIZE, 2); //daily average
- }
- }
-
- function provideEstimate(average_points, activity_type) {
- //define experience, faction, and guild levels
- var combat_lvl = [0,1500,4500,15000,32000,90000,190000,400000,860000,1650000,3000000,
- 5000000,8500000,14500000,25000000,43000000,70000000,108000000,
- 160000000,230000000,325000000];
- var faction_lvl = [20,50,90,160,280,500,900,1600,2900,5300,9600,17300];
- var hg_lvl = [16,60,180,400,700,1200,2000,3000,4300,6000,8000,10500];
- var lg_lvl = [90,180,360,720,1500,3000,5000,8000,12000,17000,23000,30000,38000,47000,57000];
- var gg_lvl = [10,30,60,100,150,210,280,360,450,550,660,800,1000,1300,2000];
- var tg_lvl = [50,120,240,400,600,840,1200,2000,3000,4300,6000,8000,10800,14000,17600,21600,26000];
- var rg_lvl = [100,240,480,800,1200,1680,2400,4000,6000,8600,12000];
- var mg_lvl = [50,120,300,600,1000,1500,2200,3000,4000,5500,7800,11000,14500,18200,22200];
- var cg_lvl = [150, 350, 750, 1400,2200,3200,4300,5600,7000,8500];
- var sg_lvl = [30,80,165,310,555,970,1680,2885,5770];
- var eg_lvl = [104,588,2200,7000,10000];
- var wg_lvl = [60,200,450,850,1500];
- var working_array = new Array();
-
- switch(activity_type) {
- case EXP:
- working_array = combat_lvl;
- break;
- case FSP:
- return -1;
- case KNIGHT:
- case NECRO:
- case WIZARD:
- case ELF:
- case BARBARIAN:
- case DARK_ELF:
- case DEMON:
- case DWARF:
- case TRIBAL:
- working_array = faction_lvl;
- break;
- case HG:
- working_array = hg_lvl;
- break;
- case LG:
- working_array = lg_lvl;
- break;
- case GG:
- working_array = gg_lvl;
- break;
- case TG:
- working_array = tg_lvl;
- break;
- case RG:
- working_array = rg_lvl;
- break;
- case MG:
- working_array = mg_lvl;
- break;
- case CG:
- working_array = cg_lvl;
- break;
- case SG:
- working_array = sg_lvl;
- break;
- case EG:
- working_array = eg_lvl;
- break;
- case WG:
- working_array = wg_lvl;
- break;
- default:
- return -1;
- }
- var current_points = experience[0].split('#')[activity_type];
- if (current_points >= working_array[working_array.length - 1]) { // player has reached the maximum already
- return -1;
- }
- var points_required;
- var next_level;
- if (current_points < working_array[0]) {
- points_required = working_array[0] - current_points;
- } else {
- for (var x = 0; x < working_array.length; x++) {
- if ((current_points >= working_array[x]) && (current_points < working_array[x + 1])) {
- points_required = working_array[x + 1] - current_points;
- next_level = x + 2;
- break;
- }
- }
- }
-
- var message = 'In the past ' + COMPARTMENT_SIZE + ' days you averaged ' + average_points + ' per day. ';
- message += 'If you maintain your daily average, you will reach ';
- message += 'level ' + next_level;
- if (roundNumber(points_required / average_points, 0) == 0){
- message += ' today.'
- } else if (roundNumber(points_required / average_points, 0) == 1){
- message += ' tomorrow.'
- } else {
- message += ' in ' + roundNumber(points_required / average_points, 0) + ' days.';
- }
- return message;
- }
-
- function backupActivityData() {
- var backup_value = GM_getValue(player_name + server_name + ' Experience Backup', -1);
- if (backup_value != -1) {
- var backup_value_date = GM_getValue(player_name + server_name + ' Experience Backup Date', -1);
- var response = confirm('The script has detected a backup dated:\n' + backup_value_date + '\nIf you proceed, the script will overwrite it.\nAre you sure you want to continue?');
- if (!response) {return;}
- }
- GM_setValue(player_name + server_name + ' Experience Backup', experience.toString());
- GM_setValue(player_name + server_name + ' Experience Backup Date', new Date().toString());
- backup_div.style.display = 'block';
- var header = '';
- for (var z = 0; z < labels.length; z++) {
- header += labels[z];
- if (z < labels.length - 1) {
- header += '\t';
- }
- }
- header += '\n';
- document.getElementById('activityTrackerData').value = header + experience.toString().replace(/#/g, '\t').replace(/,/g, '\n');
- document.getElementById('activityTrackerData').select();
- }
-
- function updateActivityData() {
- if (backup_div.style.display == 'none') {return;}
- var temp_data = document.getElementById('activityTrackerData').value.replace(/\t/g, '#').replace(/\n/g, ',');
- if (temp_data.substring(temp_data.length - 1) == ',') {temp_data = temp_data.substring(0, temp_data.length - 1);}
- var temp_array = new Array();
- temp_array = temp_data.split(',');
- for (var z = 1; z < temp_array.length; z++) {
- var temp_record = temp_array[z].split('#');
- for (var y = 0; y < temp_record.length; y++) {
- if (!isNumber(temp_record[y])) {
- alert('Encountered an invalid value: ' + temp_record[y] + '\nFound in Row: ' + z + ' Col: ' + (y + 1) + '\nPlease correct the value and try again.');
- return;
- }
- }
- }
- temp_array.splice(0, 1); // remove column names
- experience = temp_array;
- setExperienceData();
- window.location.reload();
- }
-
- function restoreActivityData() {
- var backup_value = GM_getValue(player_name + server_name + ' Experience Backup', -1);
- if (backup_value != -1) {
- var backup_value_date = GM_getValue(player_name + server_name + ' Experience Backup Date', -1);
- var response = confirm('The script has detected a backup dated:\n' + backup_value_date + '\nIf you proceed, the script will replace current data with this backup.\nAre you sure you want to continue?');
- if (!response) {return;}
- experience = backup_value.split(',');
- setExperienceData();
- window.location.reload();
- } else {
- alert('The script didn\'t find any backup to restore.');
- }
- }
-
- function invertColor() {
- if (this.id) {
- this.bgColor = INVERT_GRAPH_COLOR;
- tooltip.show(this.id);
- }
- }
-
- function restoreColor() {
- if (this.id) {
- this.bgColor = GRAPH_COLOR;
- tooltip.hide();
- }
- }
-
- function roundNumber(unrounded_number, decimals) {
- var rounded_number = Math.round(unrounded_number*Math.pow(10,decimals))/Math.pow(10,decimals);
- return rounded_number;
- }
-
- function roundUp(unrounded_number){
- var float_number, int_number, rounded_number, without_round_up;
- if (parseInt(unrounded_number) != unrounded_number) { //float
- if (roundNumber(unrounded_number, 0) != roundNumber(unrounded_number + 0.5, 0)) { //need to prevent rounding down
- unrounded_number += 0.5;
- }
- }
- unrounded_number = roundNumber(unrounded_number, 0);
- rounded_number = (parseInt(unrounded_number.toString().substring(0,1)) + 1);
- without_round_up = parseInt(unrounded_number.toString().substring(0,1));
- for (var z = 1; z < unrounded_number.toString().length; z++) {
- rounded_number *= 10;
- without_round_up *= 10;
- }
- return (without_round_up == unrounded_number) ? without_round_up : rounded_number;
- }
-
- function isNumber(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
-
- function lineCount(data_lines) {
- return (data_lines < COMPARTMENT_SIZE) ? COMPARTMENT_SIZE : Math.ceil(parseInt(data_lines)/COMPARTMENT_SIZE)*COMPARTMENT_SIZE;
- }
-
- function tooltipStyle() {
- var style = document.createElement('style');
- style.type = 'text/css';
- style.innerHTML = '#tt { position:absolute; display:block;}';
- style.innerHTML += '#ttcont { display:block; padding:2px 12px 3px 7px; margin-left:5px; background:#666; color:#fff; }';
- document.body.appendChild(style);
- }
-
- var tooltip = function(){
- var id = 'tt';
- var top = 3;
- var left = 3;
- var speed = 10;
- var timer = 20;
- var endalpha = 95;
- var alpha = 0;
- var tt,t,c,b,h;
- return{
- show:function(v,w){
- if(tt == null){
- tt = document.createElement('div');
- tt.setAttribute('id',id);
- c = document.createElement('div');
- c.setAttribute('id',id + 'cont');
- tt.appendChild(c);
- document.body.appendChild(tt);
- tt.style.opacity = 0;
- tt.style.filter = 'alpha(opacity=0)';
- document.onmousemove = this.pos;
- }
- tt.style.display = 'block';
- c.innerHTML = v;
- tt.style.width = v.length * 8;
- h = parseInt(tt.offsetHeight) + top;
- clearInterval(tt.timer);
- tt.timer = setInterval(function(){tooltip.fade(1)},timer);
- },
- pos:function(e){
- var u = e.pageY;
- var l = e.pageX;
- tt.style.top = (u + 5) + 'px';
- tt.style.left = (l + left) + 'px';
- },
- fade:function(d){
- var a = alpha;
- if((a != endalpha && d == 1) || (a != 0 && d == -1)){
- var i = speed;
- if(endalpha - a < speed && d == 1){
- i = endalpha - a;
- }else if(alpha < speed && d == -1){
- i = a;
- }
- alpha = a + (i * d);
- tt.style.opacity = alpha * .01;
- tt.style.filter = 'alpha(opacity=' + alpha + ')';
- }else{
- clearInterval(tt.timer);
- if(d == -1){tt.style.display = 'none'}
- }
- },
- hide:function(){
- clearInterval(tt.timer);
- tt.timer = setInterval(function(){tooltip.fade(-1)},timer);
- }
- };
- }();
-
- function supportsHTML5Storage() {
- try {
- return 'localStorage' in window && window['localStorage'] !== null;
- } catch (e) {
- if (debug) GM_log('HTML5 Storage is not supported');
- return false;
- }
- }