// ==UserScript==
// @name Virtonomica:Kvala_info
// @namespace virtonomica
// @version 1.97
// @author UnclWish
// @description Расширенная информация об опыте в Квалификации
// @include http://*virtonomic*.*/*/main/user/privat/persondata/knowledge
// @include http://igra.aup.ru/*/main/user/privat/persondata/knowledge
// ==/UserScript==
var run = function() {
var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
$ = win.$;
/**
* записать данные в локально хранилище, с проверкой ошибок
*/
function ToStorage(name, val)
{
try {
window.localStorage.setItem( name, JSON.stringify( val ) );
} catch(e) {
out = "Ошибка добавления в локальное хранилище";
//console.log(out);
}
}
function getFromStorage(obj, id_shop)
{
if (obj[id_shop] == null) return '';
return JSON.stringify(obj[id_shop]);
}
// получить строку с показателем успешности роста
// Kn - уровень квалификации
// kv_up - прирост квалы
// kv0 - квала без штрафа
function getOptimal( kn, kv_up, kv0){
if ( isNaN(kv_up) ) {
kv_up = 0;
return " ";
}
// максимально возможный прирост
var max = 0.9999409*Math.pow(kn, -0.569406) ;
// коррекция на штрафа
var delta = kn-kv0-1;
if (delta > 0) {
kv_up *= Math.pow(1.05, delta );
}
var ups = Math.floor( (kv_up * 10) / (max *10) );
return "<font color=darkblue>" + ups + "%</font>";
}
// сколько пересчетов до роста
// exp - текущее значение опыта по квалификации
// up - текущий прирост квалы
function getLastDays( exp, up)
{
if ( isNaN(up) ) {
return " ";
}
var last = 100 - exp;
var days = last / up;
return Math.ceil( days);
}
//
// Число дней на изучение без штрафа
//
function getLastDays2(exp, up, kv, kv0)
{
if ( isNaN(up) ) {
return "";
}
if (kv0 == undefined) return "";
if (kv0 == 0 ) return "";
var delta = kv-kv0-1;
if (delta <= 0) return "";
var last = 100 - exp;
var x = Math.pow(1.05, delta );
var days = last / up / x;
return Math.ceil( days);
}
function getPenalty( kv, kv0) {
if (kv0 == undefined) return "";
if (kv0 == 0 ) return "";
var delta = kv-kv0-1;
//console.log("delta=" + kv + " - " + kv0 + " = " + delta);
if (delta <= 0) return "<b>" + kv0 + "</b><br>";
var x = 1/Math.pow(1.05, delta );
ret = Math.round(x*10000) /100;
return "<b>" + kv0 + "</b><br><font color=darkblue>" +ret + "%</font>";
}
//alert('RUN');
var i = 0;
// Массив с данными по квалификациям
//var know = new Array;
//i = 0;
//$("input", $("tr.odd") ).each(function() {
// know[i] = $(this).attr('value');
// i++;
//});
// меняем цвет прироста
$("tr.odd td:last-child").css("color","DeepPink");
// имя пользователя
var UserName= $("#fio").text();
// Реалм
var realm = /^http:\/\/virtonomic[as]\.(\w+)\/(\w+)\/\w+\//.exec(location.href)[2];
// Идентификационная строка блока записей
var idx_string = realm + "_" + UserName;
// ищем текущее значение опыта
var form = $("form[name='useForm']");
//console.log("TABLE = " + form.length);
// названия квалификаций
var kval_name = $("span[id^='info_']").parent();
// массив соответсий порядку квалификаций их ИД
var kv_link = new Array;
// Цикл по всем квалификациям
i = 0;
for (var key in gaKnowledgeLevel) {
kv_link[i] = key;
i++;
}
// число квалификаций
var nkval = kval_name.length;
var i = 0;
var k = 0;
var exp = new Object();
var ncol = $( "tr.odd td", form ).length / nkval ;
// Ищем текущий опыт по квалификациям
$( "tr.odd td", form ).each(function() {
var indx = i; // номер столбца
indx = indx%ncol; // номер колонки
if ( indx == 6) {
key = kv_link[k];
exp[ key ] = parseFloat( $(this).text() );
k++;
}
i++;
});
kvala_save = JSON.parse( window.localStorage.getItem('kvala_save') );
if ( kvala_save == null ) kvala_save = new Object();
if ( kvala_save[idx_string] == null ) kvala_save[idx_string] = new Object();
// временный код - чистим хранилище от старых данных
for (var key in kvala_save) {
if (key<10) delete kvala_save[key];
}
i = 0;
// массив с данными по приросту
var up = new Object();
$("tr.odd td:last-child", form ).each(function() {
key = kv_link[i];
up[ key ] = parseFloat(this.innerHTML);
str = getOptimal( gaKnowledgeLevel[ key ], up[ key ], kvala_save[ idx_string ][ key ] );
$(this).parent().append( "<td id=up_"+ key +">" + str + "");
// сколько пересчетов до роста
str = "<td id=day_" + key + " help='";
d = getLastDays2( exp[ key ] , up[ key ], gaKnowledgeLevel[ key ], kvala_save[ idx_string ][ key ] );
if (d != "") {
str+= "Число дней до изучения при отсутсвии штрафа: " + d ;
}
str+= "'>" + getLastDays( exp[ key ] , up[ key ] ) ;
$(this).parent().append( str );
i++;
});
$("tr.odd td:first-child", form ).append("<br>");
// меняем фон строк в таблице с параметрами
$("tr.odd").css("background-color", "Gainsboro");
// меняем цвета кнопок в квалификации
$("input", $("tr.odd", form ) ).css("background-color", "DimGray").css("color","gold");
//----------------------------------------
// Работа с сохранением данных о последних апах квалы
//----------------------------------------
//var test_str = "[";
//for(i=0; i<nkval; i++) {
// if ( kvala_save[idx_string][i] == null ) kvala_save[idx_string][i] = 1;
// test_str += kvala_save[idx_string][i] + " ";
//}
//test_str += "]";
// отладочное сообщение
//alert(test_str);
// Добавляем иконку в начале каждой строки
el = $("td[id^='title_']");
var i= 1;
for(k=0; k< el.length; k++) {
var txt = "<br><h3>Сохраняем данные о квалификации</h3><br>";
key = kv_link[ k ];
val = gaKnowledgeLevel[ key ];
//console.log( "----[" + key + "]=" + val);
if ( kvala_save[ idx_string ][ key ] == undefined) kvala_save[ idx_string ][ key ] = 0;
if ( kvala_save[ idx_string ][ key ] > 1) val = kvala_save[ idx_string ][ key ];
//console.log("[" + kvala_save[ idx_string ][ key ] + "]");
txt += "Введите значение квалификации, <br>которая была после последнего улучшения за очки:<br><center><input id=kv_value_" + key + " value=" + val +" style='background:white'></input>";
txt += "<br><br><img src=http://www.iconsearch.ru/uploads/icons/ultimategnome/48x48/stock_export.png id=kv_btn_"+key+" help=" +key+" title='Запомнить в локальном хранилище' style='cursor:pointer'><br><br></center>";
var div_form = "<div id=kv_set_" +key+" style='padding:8px; background: none repeat scroll 0% 0% rgb(223, 223, 223); z-index: 1002; position: absolute; border: 1px solid rgb(0, 0, 0); display: none;'>" + txt + "</div>";
el.eq(k).before("<img help=" + key + " src=http://www.iconsearch.ru/uploads/icons/musthave/48x48/settings.png style='cursor:pointer'>" );
el.eq(k).before(div_form);
el.eq(k).before("<td align=center><span id=kv_info_" + key + " >" + getPenalty( gaKnowledgeLevel[ key ], kvala_save[ idx_string ][ key ] ) + "</span>");
}
// функция клика по иконке
var img = $("img[help]");
img.click( function() {
n_kv = $(this).attr('help');
str = "#kv_set_" + n_kv;
$(str).toggle();
});
// сохранить значение квалы в хранилище и спрятать окошко
$("img[id^='kv_btn_']").click( function() {
n_kv = $(this).attr('help');
kvala_save[idx_string][n_kv] = $("#kv_value_" +n_kv).attr('value');
$("#kv_info_" + n_kv).html( kvala_save[idx_string][n_kv] );
ToStorage('kvala_save', kvala_save);
$("#kv_set_" + n_kv).hide();
str = getPenalty( gaKnowledgeLevel[n_kv], kvala_save[idx_string][n_kv] );
$("#kv_info_" + n_kv). html( str );
str = getOptimal( gaKnowledgeLevel[ n_kv ], up[ n_kv ], kvala_save[idx_string][ n_kv ] );
$("#up_"+ n_kv).html( str );
d = getLastDays2( exp[ n_kv ] , up[ n_kv ], gaKnowledgeLevel[ n_kv ], kvala_save[ idx_string ][ n_kv ] );
str = '';
if (d != '') str = "Число дней до изучения при отсутсвии штрафа: " + d ;
$("#day_" + n_kv).attr('help', str );
});
// рисуем шапку
var table = $("#avaliablePointCountToLearn").parent().next();
var helpbar = "<br><div style='background:#DFDFDF; z-index:2; position:absolute;"
+ "border:solid 1px #000000; display: none; padding:8px; "
+ "border-radius: 4px 4px 4px 4px; box-shadow: 0 1px 3px 0 #999999;' "
+ "id='helpbar'><span id=helpbar_text> </span></div>";
var my_header = "<th help='Задать последнею квалификацию,<br>не имеющую штрафа'>Квал.";
my_header+= "<th help='Запомненная квалификация и размер штрафа на рост.<br>(100% означает, что штраф отсутсвует)'>Штраф";
my_header+= "<th> <th help='Текущий опыт и его рост'>Опыт";
my_header+= "<th> <th> <th> <th>Описание";
my_header+= "<th help='текущее значение опыта'>Опыт";
my_header+= "<th help='текущий прирост опыта'>Рост";
my_header+= "<th help='Идеальность роста<br>(с учетом действующего штрафа)'>Идеал";
my_header+= "<th help='Число дней до увеличения уровня квалификации'>Дни";
$("tr:eq(0)",table).before( my_header );
//$("#avaliablePointCountToLearn").append(" <span id=xy>")
table.before( helpbar );
var wr = $("#wrapper");
mx = 0;
//alert( $("td[help]").length );
$("th,td[help]").mouseover( function() {
str = $(this).attr('help');
if (str != undefined) {
if (str == '') return;
$("#helpbar").show();
// размеры экрана
w = (window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth));
//h = (window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight));
newx = mx +20 - wr.position().left ;
newy = my + 12;
//$("#helpbar_text").html( str + "<br>MX=" + mx + "<br>newx=" + newx + "<br>W=" +w + "<br>WRAPER=" + wr.position().left );
$("#helpbar_text").html( str );
wdiv = $("#helpbar").width();
if (wdiv < 160) {
document.getElementById("helpbar").style.width = '160px';
wdiv = 160;
}
if ( (newx + wdiv ) > (w - wr.position().left) ) newx = w - $("#helpbar").width() - wr.position().left-20;
document.getElementById("helpbar").style.left = newx + 'px';
document.getElementById("helpbar").style.top = newy + 'px';
//alert( wdiv );
}
});
$("th,td[help]").mouseout( function() {
$("#helpbar").hide();
});
$(document).mousemove( function(e) {
mx = e.pageX;
my = e.pageY;
});
}
if(window.top == window) {
var script = document.createElement("script");
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);
}