GN_ElementsCost

Подсчет стоимости элементов и вторичных ресурсов

当前为 2016-09-18 提交的版本,查看 最新版本

// ==UserScript==
// @name        GN_ElementsCost
// @namespace   Gradient
// @description Подсчет стоимости элементов и вторичных ресурсов
// @include     /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/pl_info.php\?id=\d+/
// @version     1.1.6
// ==/UserScript==

"use strict";

//----------------------------------------------------------------------------//

(function(){ // wrapper start
  
//----------------------------------------------------------------------------//
// UnifiedLibrary 1.7.0 start
//----------------------------------------------------------------------------//

var script_name = 'GN_ElementsCost'; // Enter your script name here

//----------------------------------------------------------------------------//
// SysUtils
//----------------------------------------------------------------------------//

var GN_SysUtils = new SysUtils(script_name);
var SU = GN_SysUtils;

//----------------------------------------------------------------------------//

function SysUtils(name){  // wrapper start

//----------------------------------------------------------------------------//
  
this.show_error = function(error_string, use_alert){
  if(use_alert)
    alert(error_string);
  
  throw new Error(error_string);
};
  
if(arguments.length != 1)
  this.show_error('Wrong SysUtils arguments');
  
if(!arguments[0])
  this.show_error('Empty SysUtils argument');
  
//----------------------------------------------------------------------------//  

this.load_value = function(value, def){
  var div = document.getElementById('GN_GM_Handler');
  div.setAttribute('desc',      value);
  div.setAttribute('operation', 'load');
  
  div.click();
  
  if(div.getAttribute('state') != 'complete')
    this.show_error('Ошибка при загрузке значения');

  return (div.getAttribute('is_null') == 'true' ? def : div.getAttribute('value'));
};

//----------------------------------------------------------------------------//

var current_id = null;

//----------------------------------------------------------------------------//

function check_mandatory_scripts(alerter){
  var persistent_storage_sign = document.getElementById('GN_GM_Handler');
  var common_values_sign      = document.getElementById('GN_CommonValuesSign');
  var alert_sign              = document.getElementById('GN_AlertSign');
  
  if(!alert_sign){
    alert_sign = document.createElement('div');
    alert_sign.id = 'GN_AlertSign';
    alert_sign.setAttribute('alerted', 'false');
    document.body.appendChild(alert_sign);
  }
  
  var alerted = alert_sign.getAttribute('alerted') != 'false';
      
  if(!persistent_storage_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт управления данными (GN_PersistentStorage), который должен стоять первым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }
  
  if(!common_values_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт, хранящий данные (GN_CommonValuesFiller), который должен стоять вторым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }
}

this.check_login = function(){
  var re = /.*?pl_id=(\d+)[^\d]*?/gmi;
  var matches = re.exec(document.cookie.toString());
  
  if(!matches)
    this.show_error('Пользователь не авторизован');
    
  current_id = +matches[1];
  
  check_mandatory_scripts(this.show_error);
};

//----------------------------------------------------------------------------//

this.check_login();

//----------------------------------------------------------------------------//  
  
} // wrapper end

//----------------------------------------------------------------------------//
// CommonValues
//----------------------------------------------------------------------------//

var GN_CommonValues = new CommonValues();

//----------------------------------------------------------------------------//

function CommonValues(){  // wrapper start
  
//----------------------------------------------------------------------------//
// Elements
//----------------------------------------------------------------------------//

this.elements = JSON.parse(SU.load_value('GN_CommonValues_Elements', '[]'));

//----------------------------------------------------------------------------//
// Advanced resources
//----------------------------------------------------------------------------//

this.advanced_resources = JSON.parse(SU.load_value('GN_CommonValues_AdvancedResources', '[]'));
  
//----------------------------------------------------------------------------//
  
this.get_advanced_resource = function(name){
  for(var i = 0; i < this.advanced_resources.length; ++i)
    if(this.advanced_resources[i].name == name)
      return this.advanced_resources[i];

  return null;
};
    
//----------------------------------------------------------------------------//
  
} // wrapper end

//----------------------------------------------------------------------------//
// UnifiedLibrary end
//----------------------------------------------------------------------------//
 
var CV = GN_CommonValues;

start_work();
  
//----------------------------------------------------------------------------//
  
function start_work(){
  var parent_td = null;
  var re = /<b>([^<]+)<\/b>: ([0-9,]+)<br>/gmi;
  var tds = document.querySelectorAll('td.wb[valign="top"]');
  
  for(var i = 0, e = tds.length; i < e; ++i){
    if(re.test(tds[i].innerHTML)){
      parent_td = tds[i];
      break;
    }
  }

  if(!parent_td)
    return;

  var matches   = [],
      resources = [],
      elements  = [];
  
  re.lastIndex = 0;
  
  while(matches = re.exec(parent_td.innerHTML)){
    var advanced_resource = CV.get_advanced_resource(matches[1]);
    
    if(advanced_resource){
      resources.push( { name: matches[1], count: +matches[2].replace(/,/g, ''), price: advanced_resource.min_price } );
      continue;
    }
    
    var element = element_by_name(matches[1]);
    
    if(element)
      elements.push( { name: matches[1], count: +matches[2].replace(/,/g, ''), price: element.average_price } );
  }
  
  if(!resources.length && !elements.length)
    return;
  
  while(parent_td.firstChild)
    parent_td.removeChild(parent_td.firstChild);
  
  var table = document.createElement('table');
  table.style.width = '100%';
  parent_td.appendChild(table);
  
  if(resources.length){
    draw_info_row(table, 'Вторичные ресурсы:');

    draw_header(table);
    
    var amount = 0;
    resources.forEach(function(current){
      amount += current.count*current.price;
      draw_row(table, current);
    });

    draw_info_row(table, 'Общая стоимость: ' + amount);
  }
  
  if(elements.length){
    draw_info_row(table, 'Элементы:');

    draw_header(table);
    
    var amount = 0;
    elements.forEach(function(current){
      amount += current.count*current.price;
      draw_row(table, current);
    });

    draw_info_row(table, 'Общая стоимость: ' + amount);
  }
}
  
//----------------------------------------------------------------------------//
  
function element_by_name(name){
  var elements = CV.elements;
  
  for(var i = 0; i < elements.length; ++i)
    if(elements[i].name == name)
      return elements[i];

  return null;
}
  
//----------------------------------------------------------------------------//
  
function draw_info_row(parent, str){
  var tr = document.createElement('tr');
  parent.appendChild(tr);
  
  var td = create_bold_td(tr, str);
  td.setAttribute('colspan', '3');
  td.setAttribute('align', 'center');
}
  
//----------------------------------------------------------------------------//
  
function draw_header(parent){
  var tr = document.createElement('tr');
  tr.setAttribute('bgColor', '#DCDCDC');
  parent.appendChild(tr);

  ['Наименование', 'Кол-во', 'Стоимость' ].forEach(function(current){
    var td = document.createElement('td');
    td.textContent = current;
    tr.appendChild(td);
  });
}
  
//----------------------------------------------------------------------------//
  
function draw_row(parent, object_){
  var tr = document.createElement('tr');
  parent.appendChild(tr);
  
  var td = document.createElement('td');
  td.textContent = object_.name + ':';
  tr.appendChild(td);
  
  create_bold_td(tr, object_.count);
  create_bold_td(tr, object_.count*object_.price);
}
  
//----------------------------------------------------------------------------//
  
function create_bold_td(parent, str){
  var td = document.createElement('td');
  parent.appendChild(td);
  
  var b = document.createElement('b');
  b.textContent = str;
  td.appendChild(b);
  
  return td;
}

//----------------------------------------------------------------------------//
  
}());  // wrapper end

//----------------------------------------------------------------------------//