hwm_work_find

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

As of 2016-01-08. 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.12
// @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
// @grant          GM_setClipboard
// ==/UserScript==

var hwm_work_find = new Object();

with (hwm_work_find) {

  hwm_work_find.version = '2.12';
  hwm_work_find.idn = 'work_find';
  hwm_work_find.str_url = 'https://greasyfork.org/uk/scripts/13911-hwm-work-find';
  hwm_work_find.str_script_name = 'Поиск места работы';
  hwm_work_find.str_url_aut = '/sms-create.php?mailto=Pahan&subject=Скрипт: '+str_script_name+' v'+version+'. Найдена ошибка:';
  hwm_work_find.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;}');
  
  hwm_work_find.addEvent = function (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;
  	}
  }
  
  hwm_work_find.$ = function (id) { return document.querySelector(id); } 
  
  hwm_work_find.URLAttrValueGet = function (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];
  }
  
  hwm_work_find.Ajax = function (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, AURL);
      }  
    };
  } 
  
  hwm_work_find.Trim = function (AText)
  {
    return AText.replace(/^\s+|\s+$|^(&nbsp;)+|(&nbsp;)+$/g, '');
  }
  
  hwm_work_find.DeleteCRLF = function (AText)
  {
    return AText.replace(/[\n\r]/g, ' ').replace(/\s{2,}/g, ' ');
  }
  
  hwm_work_find.Assert = function (ACondition, AMessage)
  {
    if (ACondition)
      return;
    localStorage['trade.status'] = 'Stoped';
    alert('ERROR: ' + AMessage);
    throw new Error(AMessage);
  }
  
  hwm_work_find.FloatFormat = function (AFloat)
  {
    return Math.round(AFloat).toString();
  }
  
  hwm_work_find.IntFormatWithThouthandSeparator = function (num){
      var n = num.toString(), p = n.indexOf('.');
      return n.replace(/\d(?=(?:\d{3})+(?:\.|$))/g, function($0, i){
          return p<0 || i<p ? ($0+',') : $0;
      });
  }
  
  // ------------------ dialog
  
  hwm_work_find.close_setting_form  = function (){
      bg = $('#bgOverlay' + idn) ;
      bgc = $('#bgCenter' + idn) ;
      if( bg ) {
          bg.style.display = bgc.style.display = 'none' ;
      }    
  }
  
  hwm_work_find.clear_all_params = function ()
  {
    if (confirm("Вы действительно хотите скинуть все сохраненные настройки?"))
    {
      var keys = GM_listValues();
      for (var i=0, key=null; key=keys[i]; i++) {
        GM_deleteValue(key);
      }
      close_find_work_info();
    }
  }
  
  hwm_work_find.setCheck = function (ch)
  {
      if( GM_getValue( ch ) && GM_getValue( ch ) == 1 )
          GM_setValue( ch , 0 );
      else
          GM_setValue( ch , 1 );
  }
  
  hwm_work_find.setEdit = function (id, key)
  {
    var LValue = parseInt($('#' + id).value);
    GM_setValue(key, LValue);
  }
  
  hwm_work_find.show_dialog_base = function (ASettingsHTML)
  {
    bg = $('#bgOverlay' + idn) ;
    bgc = $('#bgCenter' + idn) ;
    if( !bg ) {
      bg = document.createElement('div') ;
      bg.id = 'bgOverlay' + idn;
      document.body.appendChild( bg );
      bg.className = 'dialogOverlay';
      addEvent(bg, 'click', close_setting_form);
  
      bgc = document.createElement('div') ;
      bgc.id = 'bgCenter' + idn ;
      document.body.appendChild( bgc );
      bgc.className = 'dialog'; 
  
      bgc.innerHTML = 
        '<div style="border:1px solid #abc;padding:5px;margin:2px;">' +
        '  <div class="btn_close" id="bt_close'+idn+'" title="Закрыть">x</div>' +
        '  <center>' +
        '    <table>' +
        '      <tr>' +
        '        <td><b>'+str_script_name+' <font style="color:#0070FF;">'+version+'</font></b></td>' +
        '      </tr>' +
        '      <tr><td><hr/></td></tr>' +
        '      <tr>' +
        '        <td><div id="dialog_content'+idn+'">(Empty)</div></td>' +
        '      </tr>' +
        '      <tr><td><hr/></td></tr>' +
        '      <tr>' +
        '        <td class="small_text" >' +
        '          <a class="small_text" href="'+str_url+'">Обновить</a>&nbsp;&nbsp;' +
        '          <a class="small_text" href="'+str_url_aut+'">Нашли ошибку?</a>&nbsp;&nbsp;' +
        '          <a class="small_text" href="'+str_url_sps+'">Сказать спасибо</a>&nbsp;&nbsp;' +
        '          <a class="small_text" style="left:calc(50% - 100px);" href="javascript:void(0);" id="settings_reset'+idn+'">Скинуть все настройки</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_close' + idn), 'click', close_setting_form);  
      addEvent($('#settings_reset' + idn), 'click', clear_all_params);
    }
    bg.style.display = bgc.style.display = 'block' ; 
      
    $('#dialog_content'+idn).innerHTML = ASettingsHTML;
  }
  
  hwm_work_find.show_settings_base = function (ASettingsHTML)
  {
    show_dialog_base('<div><b>Настройки:</b></div>' + ASettingsHTML);
  }
  
  // ------------------ dialog
  
  hwm_work_find.SpsProcess = function ()
  {
    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  координаты по карте
  hwm_work_find.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
  
  }
  
  // Массив локаций
  hwm_work_find.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
  // сначала путь берёт диагональ, а потом катет
  hwm_work_find.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
  
  }
  
  hwm_work_find.Pahan_trtime = new Array( 120 , 84 , 60 , 36 , 24 , 12 ) ; 	// время перемещения по прямой
  hwm_work_find.Pahan_trtimed = new Array( 169 , 118 , 84 , 50 , 33 , 16 ) ; 	// время перемещения по диагонали
  
  hwm_work_find.getMoveTimeL = function (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 );
  }
  
  hwm_work_find.GetCurrLocation = function (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;
  }
  
  hwm_work_find.GetSortedLocations = function (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);
        LLocs.push(LLoc);
      }
    }
    LLocs.sort(function(a, b) {
      return a[6] - b[6];
    });
    return LLocs;
  }
  
  // ---------------------------------
  
  WorkResultFound = false;
  SortedLocations = null;
  GoldSumm = 0;
  WorkCountSumm = 0;
  ObjectsSumm = new Array();
  
  hwm_work_find.show_settings = function ()
  {
    WorkResultFound = true;
    
    var LStr =
      '    <table>' +
      '      <tr>' +
      '        <td>' +
      '          <label style="cursor:pointer;"><input type="checkbox" id="id_return_after_work" title=""> Возвращатся на страницу после установки на работу</lable>' +
      '        </td>' +
      '      </tr>' +
      '      <tr>' +
      '        <td>' +
      '          <label style="cursor:pointer;"><input type="checkbox" id="id_last_code_buffer_copy" 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>' +
      '      <tr>' +
      '        <td>' +
      '          <label style="cursor:pointer;"><input type="checkbox" id="id_show_settled_window" title=""> ' +
      '            Показывать после установки окно с надписью "Вы устроены на работу."</label">' +
      '        </td>' +
      '      </tr>' +
      '      <tr>' +
      '        <td>' +
      '          <div><input type="text" style="width:80;" id="id_min_obj_work_count"> Пропускать объект если свободных рабочих мест меньшe</div>' +
      '          <div><input type="text" style="width:80;" id="id_min_obj_gold_count"> Пропускать объект если золота меньше</div>' +
      '          <div><input type="text" style="width:80;" id="id_min_loc_work_count"> Пропускать локацию если свободных рабочих мест меньшe</div>' +
      '          <div><input type="text" style="width:80;" id="id_min_loc_gold_count"> Пропускать локацию если золота меньше</div>' +
      '        </td>' +
      '      </tr>' +
      '    </table>';
  
    show_settings_base(LStr);  
    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", function(){setEdit('id_min_zp', 'min_zp')}, false );
    Lmin_zp.addEventListener( "keyup", function(){setEdit('id_min_zp', 'min_zp')}, false );
    Lmin_zp.addEventListener( "paste", function(){setEdit('id_min_zp', '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", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );
    Lmax_loc_count.addEventListener( "keyup", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );
    Lmax_loc_count.addEventListener( "paste", function(){setEdit('id_max_loc_count', 'max_loc_count')} , false );  
  
    var check_settled_window = $('#id_show_settled_window');
    check_settled_window.checked = GM_getValue('show_settled_window', 0) == 1 ? 'checked' : '' ;
    addEvent(check_settled_window, 'click', function(){setCheck('show_settled_window')});
    
    var Lmin_obj_work_count = $("#id_min_obj_work_count");
    Lmin_obj_work_count.value = parseInt(GM_getValue('min_obj_work_count', '0'));
    Lmin_obj_work_count.addEventListener( "change", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );
    Lmin_obj_work_count.addEventListener( "keyup", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );
    Lmin_obj_work_count.addEventListener( "paste", function(){setEdit('id_min_obj_work_count', 'min_obj_work_count')} , false );  
  
    var Lmin_obj_gold_count = $("#id_min_obj_gold_count");
    Lmin_obj_gold_count.value = parseInt(GM_getValue('min_obj_gold_count', '0'));
    Lmin_obj_gold_count.addEventListener( "change", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );
    Lmin_obj_gold_count.addEventListener( "keyup", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );
    Lmin_obj_gold_count.addEventListener( "paste", function(){setEdit('id_min_obj_gold_count', 'min_obj_gold_count')} , false );  
  
    var Lmin_loc_work_count = $("#id_min_loc_work_count");
    Lmin_loc_work_count.value = parseInt(GM_getValue('min_loc_work_count', '0'));
    Lmin_loc_work_count.addEventListener( "change", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );
    Lmin_loc_work_count.addEventListener( "keyup", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );
    Lmin_loc_work_count.addEventListener( "paste", function(){setEdit('id_min_loc_work_count', 'min_loc_work_count')} , false );  
  
    var Lmin_loc_gold_count = $("#id_min_loc_gold_count");
    Lmin_loc_gold_count.value = parseInt(GM_getValue('min_loc_gold_count', '0'));
    Lmin_loc_gold_count.addEventListener( "change", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
    Lmin_loc_gold_count.addEventListener( "keyup", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
    Lmin_loc_gold_count.addEventListener( "paste", function(){setEdit('id_min_loc_gold_count', 'min_loc_gold_count')} , false );
    
    var Llast_code_buffer_copy = $('#id_last_code_buffer_copy');
    Llast_code_buffer_copy.checked = GM_getValue('last_code_buffer_copy', 0) == 1 ? 'checked' : '' ;
    addEvent(Llast_code_buffer_copy, 'click', function(){setCheck('last_code_buffer_copy')});
  }
  
  hwm_work_find.cancel_scan_work = function ()
  {
    WorkResultFound = true;
  }
  
  hwm_work_find.ShowFindWorkHTML = function (AFindWorkHTML, AIsResult)
  {
    if (WorkResultFound)
      return;
    WorkResultFound = AIsResult;
    if (WorkResultFound)
      GM_setValue('LastFindWorkHTML', AFindWorkHTML);
    
    show_dialog_base(
      '<div>' + AFindWorkHTML + '</div>' +
      '<div><hr/></div>' +
      '<div class="btn_settings" id="fw_settings"><b>Открыть настройки</b></div>' 
    )
    
    addEvent($('#bt_close' + idn), 'click', cancel_scan_work);
    addEvent($('#bgOverlay' + idn), 'click', cancel_scan_work);
      
    addEvent($("#fw_settings"), 'click', show_settings);
  }
  
  hwm_work_find.GetObjectInfo = function (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;
  }
  
  hwm_work_find.CheckResExists = function (AHTML)
  {
    // <td class="wb"><font color="red">0.01</font> / 50</td>      
    var re = /<td[^>]*><font[^>]*color=red[^>]*>([0-9]*\.?[0-9]*)<\/font>\s*\/\s*([0-9]*\.?[0-9]*)<\/td>/gim;
    var res;
    if ((res = re.exec(AHTML)) != null)
    {
      return false;
    }
    return true;
  }
  
  hwm_work_find.ObjectProcess = function (ALocation, AObjLink, AObjHTML)
  {
    AObjHTML = DeleteCRLF(AObjHTML);
    
    var re = /Вы уже устроены\./gim;
    var re2 = /Прошло меньше часа с последнего устройства на работу\. Ждите\./gim;
    var res;
    if (((res = re.exec(AObjHTML)) != null) || (res = re2.exec(AObjHTML)) != null)
    {
      ShowFindWorkHTML(res[0], true);
      return;
    }
    
    re = /Свободных мест\: <b>(\d+)<\/b>/gim;
    if ((res = re.exec(AObjHTML)) == null)
      return;
    
    var LWorkCount = parseInt(res[1]);
    var LWorkCountMin = Math.max(parseInt(GM_getValue('min_obj_work_count', 0)), 1);
    if (LWorkCount < LWorkCountMin)
      return;
    
    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)
      return;
    
    var LGold = parseInt(res[1].replace(/,/g, ''));
    var LGoldMin = Math.max(parseInt(GM_getValue('min_obj_gold_count', 0)), 20);
    if (LGold < LGoldMin)
      return;
    
    if (!CheckResExists(AObjHTML))
      return;
      
    if (ALocation == 0)
    {
  //   e = /<form[^>]*name="working"[^>]*>.*<\/form>/gim;
      re = /<form[^>]*name=working[^>]*>.*<\/form>/gim;
      if ((res = re.exec(AObjHTML)) != null)
      {
        GM_setValue('LastURL', location.href);
        var LLastCode = GM_getValue('last_code', '');
        var LLastCodeInfo = '';
        if (LLastCode != '')
        {
          LLastCodeInfo = '<div><font color="red"><b>Последний введенный код: ' + LLastCode + '</b></font></div>';
          if (GM_getValue('last_code_buffer_copy', 0) == 1)
            GM_setClipboard(LLastCode);
        }
        ShowFindWorkHTML(GetObjectInfo(AObjHTML) + LLastCodeInfo + res[0], true);
        AddRealZPInfo();
      }
    }
    else
    {
      GoldSumm += LGold;
      WorkCountSumm += LWorkCount;
      ObjectsSumm.push(AObjLink);
    }
  } 
  
  hwm_work_find.FindWorkObject = function (ALocation, APlaceIndex, AObjIndex, APlaceHTML)
  {
    if (APlaceHTML.indexOf('i/index2012/enter0.jpg') > -1)
    {
      ShowFindWorkHTML('Вы не залогированы.<br>' +
        'Перезайдите в игру.', true
      );
      return;
    }
  
    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'));
      if ((LMinZP == 0) || (LZP >= LMinZP))
      {   
        if (LFindCount == AObjIndex)
        {
          Ajax('GET', LLink, null,
            function(AObjHTML, AURL)
            {
              ObjectProcess(ALocation, AURL, 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);
  }
  
  hwm_work_find.GetObjectsSummStr = function ()
  {
    var LRes = '';
    ObjectsSumm.forEach(function(item, i, arr) {
      if (LRes != '')
        LRes += ', ';
      LRes += '<a href="' + item + '">' + URLAttrValueGet('id', item) + '</a>';
    });
    return LRes;
  }
                            
  hwm_work_find.FindWorkProcess = function (ALocation, APlaceIndex)
  {
    var PlaceCodes = ['sh', 'fc', 'mn'];
    var PlaceNames = ['Производства', 'Обработка', 'Добыча'];
  
    if (APlaceIndex < PlaceCodes.length)
    {
      if (APlaceIndex == 0)
      {
        GoldSumm = 0;
        WorkCountSumm = 0;
        ObjectsSumm = new Array();
      }
      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
    {
      var LWorkCountSummMin = Math.max(parseInt(GM_getValue('min_loc_work_count', 0)), 5);
      var LGoldSummMin = Math.max(parseInt(GM_getValue('min_loc_gold_count', 0)), 2000);
      if ((ALocation > 0) && (WorkCountSumm >= LWorkCountSummMin) && (GoldSumm >= LGoldSummMin))
      {
        var LURL = 'http://www.heroeswm.ru/move_sector.php?id=' + SortedLocations[ALocation][0];
        ShowFindWorkHTML('На локации ' + SortedLocations[ALocation][5] + ' найдено:<br>' +
          'Объектов (' + ObjectsSumm.length + '): ' + GetObjectsSummStr() + '<br>' +
          'Рабочих мест: <b>' + WorkCountSumm + '</b><br>' +
          'Доступное для зарплаты золото: <b>' + IntFormatWithThouthandSeparator(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
          );
      }
    }
  }
  
  hwm_work_find.StartScan = function ()
  {
    WorkResultFound = false;
    GM_deleteValue('LastFindWorkHTML');
    GM_deleteValue('LastURL');
    ShowFindWorkHTML('Сканирование локации...<br>', false);
    FindWorkProcess(0, 0);
  }
            
  hwm_work_find.AddWorkFindHref = function ()
  {
    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>')
        {
          var LColor = '#f5c137';
          if (GM_getValue('IsWorking', true) == false)
            LColor = 'red';
            
          LNewHref = document.createElement('a');
          LNewHref.href = 'javascript:void(0)';
          LNewHref.style = 'text-decoration: none;color: ' + LColor + ';' 
          LNewHref.innerHTML = '<b>ГР</b>';
          LNewHref.title = 'Найти место работы';
          LNewHref.id = 'find_work';
          LLink.parentNode.appendChild(LNewHref);
          
          addEvent($("#find_work"), "click", StartScan);
        }
      }
    }
  }
  
  hwm_work_find.ProcessReturn = function ()
  {
    var LCode = URLAttrValueGet('code', location.href);
    if ((LCode == '') && (GM_getValue('IsProcessReturn', false) === false))
      return;
  
    GM_deleteValue('IsProcessReturn');
    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)
        {
          GM_setValue('IsProcessReturn', true);
          location.href = LLastURL;
          return;
        }
      }
    }
  
    if ((LLastFindWorkHTML != '') && (LCmd != 0))
    {
      var LWorkInfo = GM_getValue('last_work_info', '');
  
      GM_deleteValue('last_work_info');
      GM_deleteValue('cmd');
      
      if (LCmd == 1)
      {
        GM_deleteValue('LastFindWorkHTML');
        var LStr = '<font color="red">' + LWorkInfo + '</font><br>' +
          '<div class="btn_settings" id="fw_restart_scan">Сканировать заново</div>';
        ShowFindWorkHTML(LStr, true);
        addEvent($("#fw_restart_scan"), 'click', StartScan);
      }
      else
      if (LCmd == 2)
      {
        GM_deleteValue('LastFindWorkHTML');
        var LStr = '<font color="red">' + LWorkInfo + '</font><br>' +
          '<div class="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');
        if (GM_getValue('show_settled_window', 0) == 1) 
          ShowFindWorkHTML('<font color="#0070FF">' + LWorkInfo + '</font>', 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');
    }      
  }
  
  hwm_work_find.AddRealZPInfo = function ()
  {
    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 LCoefGR = LCoefsGR[LLevel];
            var LCoefFine = 1;
            var re2 = /<b>&nbsp;\*&nbsp;(\d+\.\d+) штраф трудоголика\.<\/b>/gim;
            var res2;
            if ((res2 = re2.exec(LTD.parentNode.innerHTML)) != null)
              LCoefFine = parseFloat(res2[1]);
            var LRealZP = FloatFormat(LZP * LCoefGR * LCoefFine);
  
            var LTitle = 
              'Зарплата: ' + LZP + '\n' +
              'Реальная зарплата: ' + LRealZP + '\n' + 
              'Уровень ГР: ' + LLevel + '\n' +
              'Кофицциэнт ГР: ' + LCoefGR + '\n' +
              'Штраф трудоголика: ' + ((LCoefFine == 1) ? 'Отсутствует' : LCoefFine);
              
            LB.innerHTML = LB.innerHTML +
              ' (<font style="font-size:12px" color="red" title="' + LTitle + '">' + LRealZP + '</font>)';
          }
      }
  }
  
  hwm_work_find.SaveLevelGR = function ()
  {
    //var re = /^([\d]+)$/gim;
    var re = /Гильдия Рабочих: ([\d]+) /gim;
    var res;
    if ((res = re.exec(document.body.innerHTML)) != null)
      GM_setValue('LevelGR', res[1]);
  }
  
  hwm_work_find.InitIsWorking = function ()
  {
    var b = document.querySelector("body");
      
    if (location.pathname=='/home.php' && document.querySelector("img[src$='i/s_defence.gif']"))
    {               
      var work_unemployed = '\u0412\u044B \u043D\u0438\u0433\u0434\u0435 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442\u0435';
      // vychislenie vremeni servera (s podderzkoj scripta time_seconds)
      var time_home = /\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 (\d+)/;
      var time_home2 = / \u0441 (\d+):(\d+)<\/td>/;
  
      var LIsWorking = true;
  	// podhvatyvanie vremeni okonchaniya raboty s home.php i ego proverka
  	if ( time_home.exec( b.innerHTML ) )
        LIsWorking = true;
  	else if ( time_home2.exec( b.innerHTML ) )
        LIsWorking = true;
      else
  	if ( b.innerHTML.match( work_unemployed ) )
        LIsWorking = false;
        
      GM_setValue('IsWorking', LIsWorking);
    }
    
                  
    if ( location.pathname=='/object_do.php' )
    {
      var work_obj_do = '\u0412\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443';
    	if ( b.innerHTML.match( work_obj_do ) )
        GM_setValue('IsWorking', true);
    }  
  }    
  
  hwm_work_find.ProcessMain = function ()
  {
    InitIsWorking();
    AddWorkFindHref();
    ProcessReturn();
    if (location.href.indexOf('/object-info.php') > -1)
      AddRealZPInfo();
    if (location.href.indexOf('/home.php') > -1)
      SaveLevelGR();
  }
  
  ProcessMain();
}