hwm_work_find

Поиск и установка на работу с любой страницы игры

当前为 2015-11-29 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

//
// ==UserScript==
// @name           hwm_work_find
// @author         Pahan https://greasyfork.org/uk/users/18377-pahan
// @namespace      hwm_pahan
// @description    Поиск и установка на работу с любой страницы игры
// @homepage       https://greasyfork.org/uk/scripts/13911-hwm-work-find
// @icon           http://dcdn.heroeswm.ru/avatars/30/nc-5/30547.gif
// @version        2.04
// @encoding 	   utf-8
// @include        http://www.heroeswm.ru/*
// @include        http://qrator.heroeswm.ru/*
// @include        http://178.248.235.15/*
// @include        http://www.lordswm.com/*
// @exclude        */rightcol.php*
// @exclude        */ch_box.php*
// @exclude        */chat*
// @exclude        */ticker.html*
// @exclude        */frames*
// @exclude        */brd.php*
// @grant          GM_deleteValue
// @grant          GM_getValue
// @grant          GM_listValues
// @grant          GM_setValue
// @grant          GM_addStyle
// @grant          GM_log
// @grant          GM_openInTab
// @grant          GM_xmlhttpRequest
// ==/UserScript==

var version = '2.04';
var str_url = 'https://greasyfork.org/uk/scripts/13911-hwm-work-find';
var str_script_name = 'Поиск и установка ГР';
var str_url_aut = '/sms-create.php?mailto=Pahan&subject=Скрипт: '+str_script_name+' v'+version+'. Найдена ошибка:';
var str_url_sps = '/transfer.php?pahan_sps=' + encodeURIComponent('Подарок. Спасибо за скрипт: '+str_script_name+' v'+version+'.');

if (typeof GM_deleteValue != 'function') {
	this.GM_getValue=function (key,def) {return localStorage[key] || def;};
	this.GM_setValue=function (key,value) {return localStorage[key]=value;};
	this.GM_deleteValue=function (key) {return delete localStorage[key];};

	this.GM_addStyle=function (key) {
		var style = document.createElement('style');
		style.textContent = key;
		document.querySelector("head").appendChild(style);
	}
}
if (typeof GM_listValues != 'function') {
	this.GM_listValues=function () {
		var values = [];
		for (var i=0; i<localStorage.length; i++) {
			values.push(localStorage.key(i));
		}
		return values;
	}
}

GM_addStyle('.dialog {background-color: #F6F3EA; border-radius: 5px; box-sizing: border-box; box-shadow: 0 0 0px 12px rgba(200, 200, 200, 0.5); left: calc(50% - 300px); max-height: calc(100% - 100px); overflow: auto; padding: 15px; position: fixed; top: 50px; z-index: 1105;}');
GM_addStyle('.dialogOverlay {background-color: rgba(0, 0, 0, 0.7); height: 100%; left: 0; position: fixed; top: 0; width: 100%;}');
GM_addStyle('.btn_close {position:absolute;left:calc(100% - 45px);float:right;border:1px solid #abc;width:15px;height:15px;text-align:center;cursor:pointer;}');
GM_addStyle('.btn_settings {text-decoration:underline;cursor:pointer;font-weight:bold;font-size:10px;width:500px;}');
GM_addStyle('.small_text {font-weight:bold;font-size:10px;}');

function addEvent(elem, evType, fn) {
//    elem["on" + evType] = fn;
	if (elem.addEventListener) {
		elem.addEventListener(evType, fn, false);
	}
	else if (elem.attachEvent) {
		elem.attachEvent("on" + evType, fn);
	}
	else {
		elem["on" + evType] = fn;
	}
}

function $(id) { return document.querySelector(id); } 

function URLAttrValueGet(attr_name, aurl)
{
 attr_name = attr_name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
 var regexS = "[\\?&]" + attr_name + "=([^&#]*)";
 var regex = new RegExp( regexS );
 var results = regex.exec( aurl );
 if( results == null )
  return "";
 else
  return results[1];
}

function Ajax(AMethod, AURL, AParams, ACallBackFunc)
{
  var LRequest = new XMLHttpRequest();
  LRequest.open(AMethod, AURL, true);
  LRequest.overrideMimeType('text/html; charset=windows-1251');
  LRequest.send(AParams);
  LRequest.onreadystatechange = function()
  {
    if (LRequest.readyState == 4)
    {
      ACallBackFunc(LRequest.responseText);
    }  
  };
} 

function Trim(AText)
{
  return AText.replace(/^\s+|\s+$|^(&nbsp;)+|(&nbsp;)+$/g, '');
}

function DeleteCRLF(AText)
{
  return AText.replace(/[\n\r]/g, ' ').replace(/\s{2,}/g, ' ');
}

function Assert(ACondition, AMessage)
{
  if (ACondition)
    return;
  localStorage['trade.status'] = 'Stoped';
  alert('ERROR: ' + AMessage);
  throw new Error(AMessage);
}

function FloatFormat(AFloat)
{
  return Math.round(AFloat).toString();
}

function SpsProcess()
{
  if (location.href.indexOf('/transfer.php') > -1)
  {
    var LSps = decodeURIComponent(URLAttrValueGet('pahan_sps', location.href));
    if (LSps != '')
    {
      document.forms.f.nick.value = 'Pahan';
      document.forms.f.gold.value = '500';
      document.forms.f.desc.value = LSps;
    }
  }
}
SpsProcess();

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

// cX_Y  координаты по карте
var Pahan_locX =
{
    c50_50:	1,	//Empire Capital
    c51_50:	2,	//East River
    c50_49:	3,	//Tiger's Lake
    c51_49:	4,	//Rogue's Wood
    c50_51:	5,	//Wolf's Dale
    c50_48:	6,	//Peaceful Camp
    c49_51:	7,	//Lizard's Lowland
    c49_50:	8,	//Green Wood
    c49_48:	9,	//Eagle's Nest 	//Inferno portal 2
    c50_52:	10,	//Portal Ruins 	//Inferno portal 1
    c51_51:	11,	//Dragon's Caves
    c49_49:	12,	//Shining Spring
    c48_49:	13,	//Sunny City
    c52_50:	14,	//Magma Mines
    c52_49:	15,	//Bear' Mountain
    c52_48:	16,	//Fairy Trees
    c53_50:	17,	//Harbour City
    c53_49:	18,	//Mythril Coast 	//Inferno portal 3
    c51_52:	19,	//Great Wall
    c51_53:	20,	//Titans' Valley
    c52_53:	21,	//Fishing Village
    c52_54:	22,	//Kingdom Castle
    c48_48:	23,	//Ungovernable Steppe
    c51_48:	24,	//Crystal Garden
    c49_52:	25,	//Empty 		//East Island (Old Location)
    c49_52:	26,	//The Wilderness
    c48_50:	27	//Sublime Arbor

}

// Массив локаций
var Pahan_locArr = new Array(
//  0i	1x	2y	3r	4ne			5nr
    [] ,
    [ 1 , 	50 ,	50 ,	1 ,	'Empire Capital' ,		'Столица Империи' ] ,
    [ 2 ,	51 ,	50 ,	1 ,	'East River' ,		'Восточная Река' ] ,
    [ 3 ,	50 ,	49 ,	1 ,	'Tiger\'s Lake' ,		'Тигриное Озеро' ] ,
    [ 4 ,	51 ,	49 ,	1 ,	'Rogue\'s Wood' ,		'Лес Разбойников' ] ,
    [ 5 ,	50 ,	51 ,	1 ,	'Wolf\'s Dale' ,		'Долина Волков' ] ,
    [ 6 ,	50 ,	48 ,	1 ,	'Peaceful Camp' ,		'Мирный Лагерь' ] ,
    [ 7 ,	49 ,	51 ,	1 ,	'Lizard\'s Lowland' ,		'Равнина Ящеров' ] ,
    [ 8 ,	49 ,	50 ,	1 ,	'Green Wood' ,		'Зелёный Лес' ] ,
    [ 9 ,	49 ,	48 ,	1 ,	'Eagle\'s Nest' ,		'Орлиное Гнездо' ] ,
    [ 10 ,	50 ,	52 ,	1 ,	'Portal\'s ruins' ,		'Руины Портала' ] ,
    [ 11 ,	51 ,	51 ,	1 ,	'Dragon\'s Caves' ,		'Пещеры Драконов' ] ,
    [ 12 ,	49 ,	49 ,	1 ,	'Shining Spring' ,		'Сияющий Родник' ] ,
    [ 13 ,	48 ,	49 ,	1 ,	'Sunny City' ,		'Солнечный Город' ] ,
    [ 14 ,	52 ,	50 ,	1 ,	'Magma Mines' ,		'Магма Шахты' ] ,
    [ 15 ,	52 ,	49 ,	1 ,	'Bear\' Mountain' ,		'Медвежья Гора' ] ,
    [ 16 ,	52 ,	48 ,	1 ,	'Fairy Trees' ,		'Магический Лес' ] ,
    [ 17 ,	53 ,	50 ,	1 ,	'Harbour City ' ,		'Портовый Город' ] ,
    [ 18 ,	53 ,	49 ,	1 ,	'Mythril Coast' ,		'Мифриловый Берег' ] ,
    [ 19 ,	51 ,	52 ,	1 ,	'Great Wall' ,		'Великая Стена' ] ,
    [ 20 ,	51 ,	53 ,	1 ,	'Titans\' Valley' ,		'Равнина Титанов' ] ,
    [ 21 ,	52 ,	53 ,	1 ,	'Fishing Village' ,		'Рыбачье Село' ] ,
    [ 22 ,	52 ,	54 ,	1 ,	'Kingdom Castle' ,		'Замок Королевства' ] ,
    [ 23 ,	48 ,	48 ,	1 ,	'Ungovernable Steppe' ,	'Непокорная Степь' ] ,
    [ 24 ,	51 ,	48 ,	1 ,	'Crystal Garden' ,		'Кристальный Сад' ] ,
    [] ,
    [ 26 ,	49 ,	52 ,	1 ,	'The Wilderness' ,		'Дикие Земли' ] ,
    [ 27 ,	48 ,	50 ,	1 ,	'Sublime Arbor' ,		'Великое Древо' ]
)

// location error
// сначала путь берёт диагональ, а потом катет
var Pahan_locP =
{
    l1_14: 11 ,
    l1_17: 11 ,
    l1_26: 5 ,
    l1_27: 8 ,

    l2_14: 15 ,
    l2_17: 15 ,
    l2_18: 15 ,
    l2_21: 11 ,
    l2_22: 11 ,
    l2_27: 1 ,

    l3_14: 4 ,
    l3_16: 4 ,
    l3_17: 4 ,
    l3_26: 1 ,
    l3_27: 12 ,

    l4_14: 15 ,
    l4_16: 15 ,
    l4_17: 15 ,
    l4_21: 2 ,
    l4_22: 2 ,
    l4_26: 2 ,
    l4_27: 3 ,

    l5_14: 11 ,
    l5_17: 11 ,
    l5_19: 10 ,
    l5_20: 10 ,
    l5_21: 10 ,
    l5_22: 10 ,
    l5_27: 8 ,

    l6_2: 4 ,
    l6_16: 4 ,
    l6_26: 3 ,
    l6_27: 12 ,

    l7_13: 8 ,
    l7_14: 5 ,
    l7_17: 5 ,
    l7_23: 8 ,
    l7_26: 5 ,

    l8_14: 5 ,
    l8_17: 5 ,
    l8_26: 5 ,

    l9_16: 3 ,
    l9_26: 3 ,

    l10_27: 5 ,

    l11_3: 2 ,
    l11_6: 2 ,
    l11_9: 2 ,
    l11_21: 19 ,
    l11_22: 19 ,
    l11_26: 10 ,
    l11_27: 5 ,

    l12_14: 3 ,
    l12_16: 3 ,
    l12_17: 3 ,
    l12_26: 1 ,

    l13_14: 12 ,
    l13_16: 12 ,
    l13_17: 12 ,

    l14_1: 11 ,
    l14_2: 15 ,
    l14_3: 15 ,
    l14_4: 15 ,
    l14_6: 15 ,
    l14_8: 11 ,
    l14_9: 15 ,
    l14_12: 15 ,
    l14_13: 15 ,
    l14_18: 15 ,
    l14_21: 11 ,
    l14_22: 11 ,
    l14_23: 15 ,
    l14_24: 15 ,
    l14_27: 11 ,

//    l15_6: 4 ,
//    l15_9: 4 ,
    l15_23: 24 ,
    l15_26: 2 ,
    l15_27: 4 ,

    l16_1: 15 ,
    l16_2: 15 ,
    l16_3: 15 ,
    l16_4: 15 ,
    l16_5: 15 ,
    l16_6: 15 ,
    l16_7: 15 ,
    l16_8: 15 ,
    l16_9: 15 ,
    l16_10: 15 ,
    l16_11: 15 ,
    l16_12: 15 ,
    l16_13: 15 ,
    l16_19: 15 ,
    l16_20: 15 ,
    l16_23: 15 ,
    l16_24: 15 ,
    l16_26: 15 ,
    l16_27: 15 ,

    l17_2: 15 ,
    l17_5: 14 ,
    l17_7: 14 ,
    l17_10: 14 ,
    l17_11: 14 ,
    l17_19: 14 ,
    l17_20: 14 ,
    l17_21: 14 ,
    l17_22: 14 ,
    l17_26: 14 ,
    l17_27: 14 ,

    l18_1: 15 ,
    l18_2: 15 ,
    l18_5: 15 ,
    l18_6: 15 ,
    l18_7: 15 ,
    l18_8: 15 ,
    l18_9: 15 ,
    l18_10: 17 ,
    l18_11: 17 ,
    l18_14: 17 ,
    l18_19: 17 ,
    l18_20: 17 ,
    l18_21: 17 ,
    l18_22: 17 ,
    l18_23: 15 ,
    l18_24: 15 ,
    l18_26: 17 ,
    l18_27: 15 ,

    l19_1: 11 ,
    l19_3: 11 ,
    l19_5: 10 ,
    l19_6: 11 ,
    l19_7: 10 ,
    l19_8: 10 ,
    l19_9: 11 ,
    l19_12: 10 ,
    l19_13: 10 ,
    l19_14: 11 ,
    l19_15: 11 ,
    l19_16: 11 ,
    l19_17: 11 ,
    l19_18: 11 ,
    l19_23: 10 ,
    l19_27: 10 ,

    l20_14: 19 ,
    l20_15: 19 ,
    l20_16: 19 ,
    l20_17: 19 ,
    l20_18: 19 ,
    l20_27: 10 ,

    l21_14: 19 ,
    l21_15: 19 ,
    l21_16: 19 ,
    l21_17: 19 ,
    l21_18: 19 ,
    l21_27: 19 ,

    l22_17: 21 ,
    l22_18: 21 ,
    l22_27: 20 ,

    l23_16: 15 ,
    l23_26: 1 ,
    l23_27: 13 ,

    l24_16: 15 ,
    l24_21: 2 ,
    l24_22: 2 ,
    l24_26: 2 ,
    l24_27: 3 ,

    l26_7: 5 ,
    l26_8: 5 ,
    l26_9: 5 ,
    l26_11: 10 ,
    l26_12: 5 ,
    l26_13: 5 ,
    l26_14: 10 ,
    l26_17: 10 ,
    l26_20: 10 ,
    l26_21: 10 ,
    l26_22: 10 ,
    l26_23: 5 ,
    l26_24: 5 , 
    l26_27: 5 , 

    l27_1: 8 ,
    l27_2: 8 ,
    l27_3: 12 ,
    l27_4: 12 ,
    l27_5: 7 ,
    l27_6: 12 ,
    l27_9: 12 ,
    l27_10: 7 ,
    l27_11: 7 ,
    l27_14: 11 ,
    l27_15: 4 ,
    l27_16: 15 ,
    l27_17: 15 ,
    l27_18: 12 ,
    l27_19: 10 ,
    l27_20: 10 ,
    l27_21: 20 ,
    l27_22: 20 ,
    l27_23: 13 ,
    l27_24: 12 ,
    l27_26: 8

}

var Pahan_trtime = new Array( 120 , 84 , 60 , 36 , 24 , 12 ) ; 	// время перемещения по прямой
var Pahan_trtimed = new Array( 169 , 118 , 84 , 50 , 33 , 16 ) ; 	// время перемещения по диагонали

function getMoveTimeL( cz , mz , t ) {
/*  cz	текущий сектор обсчёта
    mz	конечный сектор обсчёта
    t	сумма времени
*/

    // если прибыли в конечный пункт
    if( mz == cz ) {
//        var myT = new Date(t*1000)
//        myTs = myT.getSeconds()
//        return myT.getMinutes() + ':' + ( myTs < 10 ? '0' : '' ) + myTs ;
        return t;
    }

    var nz = 0; 		// следующий сектор, к которому надо действительно двигаться

    var kC = Pahan_locArr[cz]; 	//координаты текущие
    if(kC == undefined) return 0;
    var kM = Pahan_locArr[mz]; 	//координаты назначения

    id1 = eval( 'Pahan_locP.l' + cz + '_' + mz ) //id исключение

    // если есть исключения, следующий сектор будет равен ид исключения
    if( id1 && id1 > 0 ) {
        nz = id1 ;
    }

    // если исключения, то переназначаем координаты назначения
    if( nz != 0 ) var kM = Pahan_locArr[nz] ;

    var tx = kM[1] > kC[1] ? 1 : ( kM[1] == kC[1] ? 0 : -1 ) ;
    var ty = kM[2] > kC[2] ? 1 : ( kM[2] == kC[2] ? 0 : -1 ) ;
    var nx = parseInt( kC[1] ) + tx ;
    var ny = parseInt( kC[2] ) + ty ;

//    t = ( ty == 0 || tx == 0 ) ? t + 120 : t + 169 ;
    t = ( ty == 0 || tx == 0 ) ? t + Pahan_trtime[0] : t + Pahan_trtimed[0] ;
    var id = eval( 'Pahan_locX.c' + nx + '_' + ny ) ;
//    t = t + ' ' + id + '(' + nz + ')' ;

    return getMoveTimeL( id , mz , t );
}

function GetCurrLocation(AHTML)
{
//!!  var re = /<[^>]*href='([^']*)'[^>]*>&raquo;&raquo;&raquo;<\/a>/gim;
  var re = /<param[^>]*\/map.swf[^>]*>\s*<param[^>]*value="([^"]*)"[^>]*>/gim;
  var res;
  if ((res = re.exec(AHTML)) != null)
  {
    return res[1].split('=')[1].split(':')[1];
  }
  else
    return 1;
}

function GetSortedLocations(LCurrLocation)
{
  var LLocs = new Array();
  for (var i = 0; i < Pahan_locArr.length; i++)
  {
    var LLoc = Pahan_locArr[i];          
    if (LLoc && (LLoc.length == 6))
    {
      LLoc[6] = getMoveTimeL(LCurrLocation, LLoc[0], 0);
//            alert('i: ' + i + ', LCurrLocation: ' + LCurrLocation + ', LLoc: ' + LLoc);
      LLocs.push(LLoc);
    }
  }
  LLocs.sort(function(a, b) {
    return a[6] - b[6];
  });
  return LLocs;
}

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

WorkResultFound = false;
SortedLocations = null;
GoldSumm = 0;
WorkCountSumm = 0;

function close_find_work_info()
{
  bg = $('#bgOverlayFindWork') ;
  bgc = $('#bgCenterFindWork') ;
  if( bg ) {
      bg.style.display = bgc.style.display = 'none' ;
  }
  WorkResultFound = true;
}

function setCheck(ch) {
    if( GM_getValue( ch ) && GM_getValue( ch ) == 1 )
        GM_setValue( ch , 0 );
    else
        GM_setValue( ch , 1 );
}

function save_min_zp()
{
  var LValue = parseInt($('#id_min_zp').value);
  GM_setValue('min_zp', LValue);
}

function save_max_loc_count()
{
  var LValue = parseInt($('#id_max_loc_count').value);
  GM_setValue('max_loc_count', LValue);
}

function show_settings()
{
  WorkResultFound = false;
  var LStr =
    '    <table>' +
    '      <tr><td><b>Настройки:</b></td></tr>' + 
    '      <tr>' +
    '        <td>' +
    '          <label style="cursor:pointer;"><input type="checkbox" id="id_return_after_work" title=""> Возвращатся на страницу после установки на работу</lable>' +
    '        </td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td>' +
    '          <div><input type="text" style="width:40;" id="id_min_zp"> Минимальная зарплата, не предлагать меньшую </div>' +
    '          <div>Значение "0" - подходит любая зарплата</div>' +
    '        </td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td>' +
    '          <label style="cursor:pointer;"><input type="checkbox" id="id_scan_other_locations" title=""> Искать на других локациях (только с транспортом)</lable>' +
    '        </td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td>' +
    '          <div><input type="text" style="width:40;" id="id_max_loc_count"> Количество соседних локаций для сканирования</div>' +
    '          <div>Значение "0" - сканировать все локации на карте</div>' +
    '        </td>' +
    '      </tr>' +
    '    </table>';
    
  ShowFindWorkHTML(LStr, true, '');  
  
  var check_return = $('#id_return_after_work');
  check_return.checked = GM_getValue('return_after_work', 0) == 1 ? 'checked' : '' ;
  addEvent(check_return, 'click', function(){setCheck('return_after_work')});
  
  var Lmin_zp = $("#id_min_zp");
  Lmin_zp.value = parseInt(GM_getValue('min_zp', '0'));
  Lmin_zp.addEventListener( "change", save_min_zp , false );
  Lmin_zp.addEventListener( "keyup", save_min_zp , false );
  Lmin_zp.addEventListener( "paste", save_min_zp , false );
  
  var check_other_locations = $('#id_scan_other_locations');
  check_other_locations.checked = GM_getValue('scan_other_locations', 0) == 1 ? 'checked' : '' ;
  addEvent(check_other_locations, 'click', function(){setCheck('scan_other_locations')});
  
  var Lmax_loc_count = $("#id_max_loc_count");
  Lmax_loc_count.value = parseInt(GM_getValue('max_loc_count', '0'));
  Lmax_loc_count.addEventListener( "change", save_max_loc_count , false );
  Lmax_loc_count.addEventListener( "keyup", save_max_loc_count , false );
  Lmax_loc_count.addEventListener( "paste", save_max_loc_count , false );
}

function ShowFindWorkHTML(AFindWorkHTML, AIsResult, AAdditionInfo)
{
  if (WorkResultFound)
    return;
  WorkResultFound = AIsResult;
  if (WorkResultFound)
  {
    GM_setValue('LastFindWorkHTML', AFindWorkHTML);
  }
  if (AAdditionInfo != '')
  {
    AAdditionInfo = '<tr><td><font color="red"><b>' + AAdditionInfo + '</b></font></td></tr>';
  }
  
  bg = $('#bgOverlayFindWork') ;
  bgc = $('#bgCenterFindWork') ;
  if( !bg ) {
      bg = document.createElement('div') ;
      bg.id = 'bgOverlayFindWork' ;
      document.body.appendChild( bg );
      bg.className = 'dialogOverlay';
      bg.addEventListener( "click", close_find_work_info , false );

      bgc = document.createElement('div') ;
      bgc.id = 'bgCenterFindWork' ;
      document.body.appendChild( bgc );
      bgc.className = 'dialog';
  }
  bg.style.display = bgc.style.display = 'block' ;  
  
  bgc.innerHTML = 
    '<div style="border:1px solid #abc;padding:5px;margin:2px;">' +
    '  <div class="btn_close" id="bt_closeFindWork" title="Закрыть">x</div>' +
    '  <center>' +
    '    <table>' +
    '      <tr>' +
    '        <td><b>'+str_script_name+' <font style="color:#0070FF;">'+version+'</font></b><hr/></td>' +
    '      </tr>' +
    '      ' + AAdditionInfo +
    '      <tr>' +
    '        <td>' + AFindWorkHTML + '</td>' +
    '      </tr>' +
    '      <tr><td><hr/></td></tr>' +
    '      <tr><td><div class="btn_settings" id="fw_settings"><b>Открыть настройки</b></div></td></tr>' + 
    '      <tr><td><hr/></td></tr>' +
    '      <tr>' +
    '        <td class="small_text" >' +
    '          <a class="small_text" href="'+str_url+'">Обновить</a> ' +
    '          <a class="small_text" href="'+str_url_aut+'">Нашли ошибку?</a> ' +
    '          <a class="small_text" href="'+str_url_sps+'">Сказать спасибо</a> ' +
    '        </td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td class="small_text" >' +
    '          Автор: <a class="small_text" href="http://www.heroeswm.ru/pl_info.php?id=30547">Pahan.</a>' +
    '        </td>' +
    '      </tr>' +
    '    </table>' +
    '  </center>' +
    '</div>';

  addEvent($("#bt_closeFindWork"), 'click', close_find_work_info);  
  addEvent($("#fw_settings"), 'click', show_settings);
}

function GetObjectInfo(AObjHTML)
{
  AObjHTML = DeleteCRLF(AObjHTML);
    
  var re = /(<table[^>]*><tr[^>]*><td[^>]*>Тип: .*)Список рабочих/gim;
  LInfo = (res = re.exec(AObjHTML)) ? res[1] : '';
  
  re = /Свободных мест: <b>\d+<\/b>/gim;
  LInfo += (res = re.exec(AObjHTML)) ? res[0] : '';

  return LInfo;
}

function ObjectProcess(ALocation, AObjHTML)
{
  AObjHTML = DeleteCRLF(AObjHTML);
  if (ALocation == 0)
  {          
    var re = /Вы уже устроены\./gim;
    var re2 = /Прошло меньше часа с последнего устройства на работу\. Ждите\./gim;
    var res;
    if (((res = re.exec(AObjHTML)) != null) || (res = re2.exec(AObjHTML)) != null)
      ShowFindWorkHTML(res[0], true, '');
    else
    {
      re = /Свободных мест\: <b>0<\/b>/gim;
      if ((res = re.exec(AObjHTML)) != null)
      {
      }
      else
      {
  //      re = /<form[^>]*name="working"[^>]*>.*<\/form>/gim;
        re = /<form[^>]*name=working[^>]*>.*<\/form>/gim;
        if ((res = re.exec(AObjHTML)) != null)
        {
          GM_setValue('LastURL', location.href);
          LLastCode = GM_getValue('last_code', '');
          if (LLastCode != '')
            LLastCode = 'Последний введенный код: ' + LLastCode;
          ShowFindWorkHTML(GetObjectInfo(AObjHTML) + res[0], true, LLastCode);
          AddRealZPInfo();
        }
      }
    }         
  }
  else
  {             
    re = /Свободных мест\: <b>(\d+)<\/b>/gim;
    if ((res = re.exec(AObjHTML)) != null)
    {
      var LWorkCount = parseInt(res[1]);
      if (LWorkCount > 0)
      {
        re = /<tr><td>Баланс: <\/td><td><b><table[^>]*><tr><td><img[^>]*gold\.gif[^>]*><\/td><td><b>([\d,]+)<\/b><\/td><\/tr><\/table><\/b><\/td><\/tr>/gim;
        if ((res = re.exec(AObjHTML)) != null)
        {
          var LGold = parseInt(res[1].replace(/,/g, ''));
          if (LGold > 1000)
          {
            GoldSumm += LGold;
            WorkCountSumm += LWorkCount;
          }
        }
      }
    }  
  }
} 

function FindWorkObject(ALocation, APlaceIndex, AObjIndex, APlaceHTML)
{
  var re = /<b>(\d+)<\/b>&nbsp;<\/td><td[^>]*>&nbsp;<a[^>]*href='([^']*)'[^>]*>&raquo;&raquo;&raquo;<\/a>/gim;
  var res;
  var LLink;  
  var LZP, LMinZP;
  var LFindCount = 0;
  while ((res = re.exec(APlaceHTML)) != null)
  {
    LZP = parseInt(res[1]);
    LLink = res[2];
    LMinZP = parseInt(GM_getValue('min_zp', '0'));
//    alert('LZP: ' + LZP + ', LLink: ' + LLink);
    if ((LMinZP == 0) || (LZP >= LMinZP))
    {   
      if (LFindCount == AObjIndex)
      {
        Ajax('GET', LLink, null,
          function(AObjHTML)
          {
            ObjectProcess(ALocation, AObjHTML);
            if (!WorkResultFound)
              FindWorkObject(ALocation, APlaceIndex, AObjIndex + 1, APlaceHTML);
          }
        );
      }
      LFindCount++;
    }
  }

//  $("#find_work").innerHTML = $("#find_work").innerHTML + '<br>' +     
//    'AObjIndex: ' + AObjIndex + ', LFindCount: ' + LFindCount;
          
  if (!WorkResultFound && (AObjIndex >= LFindCount)) 
    FindWorkProcess(ALocation, APlaceIndex + 1);
}
                          
function FindWorkProcess(ALocation, APlaceIndex)
{
  var PlaceCodes = ['sh', 'fc', 'mn'];
  var PlaceNames = ['Производства', 'Обработка', 'Добыча'];

  if (APlaceIndex < PlaceCodes.length)
  {
    if ((ALocation != 0) && (APlaceIndex == 0))
    {
      GoldSumm = 0;
      WorkCountSumm = 0;
    }
    
    var LLocXY = '';
    if (ALocation != 0)
      LLocXY = 'cx=' + SortedLocations[ALocation][1] + '&cy=' + SortedLocations[ALocation][2] + '&';
    var LURL = '/map.php?' + LLocXY + 'st=' + PlaceCodes[APlaceIndex];
    Ajax('GET', LURL, null,
      function(AHTML)
      {
        if (!SortedLocations)
          SortedLocations = GetSortedLocations(GetCurrLocation(DeleteCRLF(AHTML)));
        ShowFindWorkHTML('Сканирование локации ' + SortedLocations[ALocation][5] +
          ' ' + PlaceNames[APlaceIndex] + '...<br>', false, '');
        FindWorkObject(ALocation, APlaceIndex, 0, AHTML);
      }
    );
  }
  else
  {
    if ((ALocation > 0) && (GoldSumm > 2000) && (WorkCountSumm > 5))
    {
      var LURL = 'http://www.heroeswm.ru/move_sector.php?id=' + SortedLocations[ALocation][0];
      ShowFindWorkHTML('На локации ' + SortedLocations[ALocation][5] + ' найдено:<br>' +
        'Рабочих мест: <b>' + WorkCountSumm + '</b><br>' +
        'Доступное для зарплаты золото: <b>' + GoldSumm + '</b><br>' +
        'Перейти: <a href="' + LURL + '">' + SortedLocations[ALocation][5] + '</a>', true, ''
      );
    }
    else
    {
      var LMaxLocCount = -1;
      if (GM_getValue('scan_other_locations', 0) == 1)
        LMaxLocCount = parseInt(GM_getValue('max_loc_count', '0'));
      ALocation++;
      if ((LMaxLocCount == 0) || (ALocation <= LMaxLocCount))
        FindWorkProcess(ALocation, 0);
      else
        ShowFindWorkHTML('Поиск работы завершен.<br>' +
          'Все места заняты или недостаточно золота на объектах.<br>' +
          'Смените локацию, или попробуйте позже.', true, ''
        );
    }
  }
}

function StartScan()
{
  WorkResultFound = false;
  GM_deleteValue('LastFindWorkHTML');
  GM_deleteValue('LastURL');
  ShowFindWorkHTML('Сканирование локации...<br>', false, '');
  FindWorkProcess(0, 0);
}
          
function AddWorkFindHref()
{
  var LLinks = document.querySelectorAll('a[href^="map.php"]');
  var LLink;
  if (LLinks)
  {                
    for(i = 0; i < LLinks.length; i++)
    {                   
      LLink = LLinks[i];
      if (LLink.innerHTML == '<b>Карта</b>')
      {
        LNewHref = document.createElement('a');
        LNewHref.href = '#';
        LNewHref.style = "text-decoration: none;color: #f5c137;" 
        LNewHref.innerHTML = '<b>ГР</b>';
        LNewHref.title = 'Найти место работы';
        LNewHref.id = 'find_work';
        LLink.parentNode.appendChild(LNewHref);
        
        addEvent($("#find_work"), "click", StartScan);
      }
    }
  }
}

function PrecessReturn()
{
  var LCode = URLAttrValueGet('code', location.href);
  if ((LCode == '') && (URLAttrValueGet('fw', location.href) != '1'))
    return;

  var LLastFindWorkHTML = GM_getValue('LastFindWorkHTML', '');
  var LLastURL = GM_getValue('LastURL', '');
  var LCmd = parseInt(GM_getValue('cmd', 0));
  if ((LLastFindWorkHTML != '') && (LCmd == 0))
  {
//    <font color="red"><b>Введен неправильный код.</b></font>
    var re = /<font[^>]*><b>(Введен неправильный код\.)<\/b><\/font>/gim;
    var re2 = /<font[^>]*><b>(На объекте недостаточно золота\.)<\/b><\/font>/gim;
    var re3 = /<font[^>]*><b>(Нет рабочих мест\.)<\/b><\/font>/gim;
    var re4 = /<center>(Вы устроены на работу\.)<\/center>/gim;
    var res;
    
    if ((res = re.exec(document.body.innerHTML)) != null)
      LCmd = 1; 
    else
    if (((res = re2.exec(document.body.innerHTML)) != null)
      || ((res = re3.exec(document.body.innerHTML)) != null)
    )
      LCmd = 2;
    else
    if ((res = re4.exec(document.body.innerHTML)) != null)
      LCmd = 3;
    
    if (LCmd == 0)
    {
      GM_deleteValue('last_code');
      GM_deleteValue('last_work_info');
      GM_deleteValue('cmd');
      GM_deleteValue('LastFindWorkHTML');
    }
    else
    {
      GM_setValue('last_code', LCode);
      GM_setValue('last_work_info', res[1]);
      GM_setValue('cmd', LCmd);
    }      

    if (LLastURL != '')
    {
      GM_deleteValue('LastURL');
      if (GM_getValue('return_after_work', 0) == 1)
      {
        if (URLAttrValueGet('fw', LLastURL) != '1')
          LLastURL = LLastURL + '&fw=1';
        location.href = LLastURL;
        return;
      }
    }
  }

  if ((LLastFindWorkHTML != '') && (LCmd != 0))
  {
    LCode = GM_getValue('last_code', 0);
    var LWorkInfo = GM_getValue('last_work_info', '');

    GM_deleteValue('last_work_info');
    GM_deleteValue('cmd');
    
    if (LCmd == 1)
    {
      var LStr = LWorkInfo;
      if (LCode && (LCode != ''))
        var LStr = LStr + '<br>Последний введенный код: ' + LCode;
      GM_setValue('LastURL', location.href);
      GM_deleteValue('last_code');
      ShowFindWorkHTML(LLastFindWorkHTML, true, LStr);
      AddRealZPInfo();
    }
    else
    if (LCmd == 2)
    {
      GM_deleteValue('LastFindWorkHTML');
      var LStr = LWorkInfo + '<br><div style="btn_settings" id="fw_restart_scan">Сканировать заново</div>';
      ShowFindWorkHTML(LStr, true, '');
      addEvent($("#fw_restart_scan"), 'click', StartScan);
    }
    else
    if (LCmd == 3)
    {
      GM_deleteValue('LastFindWorkHTML');
      GM_deleteValue('last_code');
      ShowFindWorkHTML(LWorkInfo, true, '');
    }
    else
    {
      GM_deleteValue('last_code');
      GM_deleteValue('last_work_info');
      GM_deleteValue('cmd');
      GM_deleteValue('LastFindWorkHTML');
    }
  }
  else
  {
    GM_deleteValue('last_code');
    GM_deleteValue('last_work_info');
    GM_deleteValue('cmd');
    GM_deleteValue('LastFindWorkHTML');
  }      
}

function AddRealZPInfo()
{
  var LCoefsGR = new Array(1.0, 1.1, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0);
  
  var LTD = null;
  var LTDels = document.getElementsByTagName('td');
  for( var i = 0; i < LTDels.length; i++ )
    if (LTDels[i].innerHTML == 'Зарплата: ')
    {
      LTD = LTDels[i];
      
      var LBels = LTD.parentNode.getElementsByTagName('b');
      var LB = null;
      var re = /^([\d,]+)$/gim;
      var res;
      for( var j = 0; j < LBels.length; j++ )
        if ((res = re.exec(LBels[j].innerHTML)) != null)
        {
          LB = LBels[j];
          
          LZP = parseInt(res[1].replace(/,/g, ''));
          var LLevel = parseInt(GM_getValue('LevelGR', 0));
          var LCoef = LCoefsGR[LLevel];
          var LRealZP = FloatFormat(LZP * LCoef);
          var LTitle = 'Реальная зарплата: '+LRealZP+'\nУровень ГР: '+LLevel+'\nКофицциэнт ГР: ' + LCoef;
          LB.innerHTML = LB.innerHTML +
            ' (<font style="font-size:12px" color="red" title="' + LTitle + '">' + LRealZP + '</font>)';
        }
    }
}

function SaveLevelGR()
{
  //var re = /^([\d]+)$/gim;
  var re = /Гильдия Рабочих: ([\d]+) /gim;
  var res;
  if ((res = re.exec(document.body.innerHTML)) != null)
    GM_setValue('LevelGR', res[1]);
}    

function ProcessMain()
{  
  AddWorkFindHref();
  PrecessReturn();
  if (location.href.indexOf('/object-info.php') > -1)
    AddRealZPInfo();
  if (location.href.indexOf('/home.php') > -1)
    SaveLevelGR();
}

ProcessMain();