hwm_work_find

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

As of 2015-11-28 18:44:49 UTC. See the latest version.

//
// ==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.00
// @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
// ==/UserScript==

var version = '1.53';
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+'. Найдена ошибка:';

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;
	}
}

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, ' ');
}

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

// 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 == 25)
      alert(111);

    // если прибыли в конечный пункт
    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;
}


//EnumLocations();

//ShowFindWorkHTML('TEST!!!!!!!!!!!!!!!!', false, '');

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

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 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.style.position = 'absolute' ;
      bg.style.left = '0';
      bg.style.width = '100%';
      bg.style.height = '100%';
      bg.style.background = "#000000";
      bg.style.opacity = "0.5";
      bg.addEventListener( "click", close_find_work_info , false );

      bgc = document.createElement('div') ;
      bgc.id = 'bgCenterFindWork' ;
      document.body.appendChild( bgc );
      bgc.style.position = 'absolute' ;
      bgc.style.width = '600px';
      bgc.style.background = "#F6F3EA";
      bgc.style.left = ( ( document.body.offsetWidth - 600 ) / 2 ) + 'px' ;
      bgc.style.zIndex = "1105";
  }  
  
  bgc.innerHTML = 
    '<div style="border:1px solid #abc;padding:5px;margin:2px;">' +
    '  <div style="float:right;border:1px solid #abc;width:15px;height:15px;text-align:center;cursor:pointer;" 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><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>' +
    '        <td>' +
    '          <div><input type="text" style="width:40;" id="id_max_loc_count"> Количество соседних локаций для сканирования</div>' +
    '          <div>Значение "0" - сканировать все локации на карте</div>' +
    '        </td>' +
    '      <tr><td><hr/></td></tr>' +
    '      <tr>' +
    '        <td style="font-weight:bold;font-size:10px;" >' +
    '          <a style="font-weight:bold;font-size:10px;" href="'+str_url+'">Проверить обновление скрипта.</a>' +
    '          <a style="font-weight:bold;font-size:10px;" href="'+str_url_aut+'">Сообщить автору о найденной ошибке.</a>' +
    '        </td>' +
    '      </tr>' +
    '      <tr>' +
    '        <td style="font-weight:bold;font-size:10px;" >' +
    '          Автор: <a style="font-weight:bold;font-size:10px;" 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);
  
  bg.style.top = (-document.body.scrollTop)+'px';
  bgc.style.top = ( document.body.scrollTop + 100 ) + 'px';
  bg.style.display = bgc.style.display = 'block' ;
  
  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 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);
        }
      }
    }         
  }
  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 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",
          function()
          {
            WorkResultFound = false;
            GM_deleteValue('LastFindWorkHTML');
            GM_deleteValue('LastURL');
            ShowFindWorkHTML('Сканирование локации...<br>', false, '');
            FindWorkProcess(0, 0);
          }
        );
      }
    }
  }
}

function PrecessReturn()
{
  var LLastFindWorkHTML = GM_getValue('LastFindWorkHTML', '');
  var LLastURL = GM_getValue('LastURL', '');
  if ((LLastFindWorkHTML != '') && (LLastURL != ''))
  {
//    <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;    
    var LCode = URLAttrValueGet('code', location.href);
    
    if ((res = re.exec(document.body.innerHTML)) != null)
    {
      var LStr = res[1] + '<br>Последний введенный код: ' + LCode;
      ShowFindWorkHTML(LLastFindWorkHTML, true, LStr);
      return;
    }
    
    if (((res = re2.exec(document.body.innerHTML)) != null)
      || ((res = re3.exec(document.body.innerHTML)) != null)
    ){
      GM_setValue('last_code', LCode);
      return;      
    }
    
    GM_deleteValue('LastFindWorkHTML')
    GM_deleteValue('LastURL');
    GM_deleteValue('last_code');
    if ((GM_getValue('return_after_work', 0) == 1)
      && ((res = re4.exec(document.body.innerHTML)) != null)
    )
    {
      location.href = LLastURL;
    }
  }
}

function ProcessMain()
{  
  AddWorkFindHref();
  PrecessReturn();
}

ProcessMain();