Perevod

Перевод статусов списка заказов Megagroup.ru

// ==UserScript==
// @name         Perevod
// @namespace    http://tampermonkey.net/
// @version      1.0.1.1
// @description  Перевод статусов списка заказов Megagroup.ru
// @author       DIMASSS
// @match        https://cp21.megagroup.ru/my/s3/data/menu/edit.php*
// @grant        none
// @require            https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant              GM_getValue
// @grant              GM_setValue
// ==/UserScript==

(function() {
    'use strict';





var crawl = localStorage.getItem('perevod_is_working');

console.log("-----SCRIPT START-------");

//------------------waitForKeyElements------------------
    /*--- waitForKeyElements():  A utility function, for Greasemonkey scripts,
      that detects and handles AJAXed content.

      Usage example:

          waitForKeyElements (
              "div.comments"
              , commentCallbackFunction
          );

          //--- Page-specific function to do what we want when the node is found.
          function commentCallbackFunction (jNode) {
              jNode.text ("This comment changed by waitForKeyElements().");
          }

      IMPORTANT: This function requires your script to have loaded jQuery.
  */
  function waitForKeyElements(
    selectorTxt /* Required: The jQuery selector string that
                          specifies the desired element(s).
                      */,
    actionFunction /* Required: The code to run when elements are
                          found. It is passed a jNode to the matched
                          element.
                      */,
    bWaitOnce /* Optional: If false, will continue to scan for
                          new elements even after the first match is
                          found.
                      */,
    iframeSelector /* Optional: If set, identifies the iframe to
                          search.
                      */
  ) {
    var targetNodes, btargetsFound;

    if (typeof iframeSelector == "undefined") targetNodes = $(selectorTxt);
    else
      targetNodes = $(iframeSelector)
        .contents()
        .find(selectorTxt);

    if (targetNodes && targetNodes.length > 0) {
      btargetsFound = true;
      /*--- Found target node(s).  Go through each and act if they
              are new.
          */
      targetNodes.each(function() {
        var jThis = $(this);
        var alreadyFound = jThis.data("alreadyFound") || false;

        if (!alreadyFound) {
          //--- Call the payload function.
          var cancelFound = actionFunction(jThis);
          if (cancelFound) btargetsFound = false;
          else jThis.data("alreadyFound", true);
        }
      });
    } else {
      btargetsFound = false;
    }

    //--- Get the timer-control variable for this selector.
    var controlObj = waitForKeyElements.controlObj || {};
    var controlKey = selectorTxt.replace(/[^\w]/g, "_");
    var timeControl = controlObj[controlKey];

    //--- Now set or clear the timer as appropriate.
    if (btargetsFound && bWaitOnce && timeControl) {
      //--- The only condition where we need to clear the timer.
      clearInterval(timeControl);
      delete controlObj[controlKey];
    } else {
      //--- Set a timer, if needed.
      if (!timeControl) {
        timeControl = setInterval(function() {
          waitForKeyElements(
            selectorTxt,
            actionFunction,
            bWaitOnce,
            iframeSelector
          );
        }, 300);
        controlObj[controlKey] = timeControl;
      }
    }
    waitForKeyElements.controlObj = controlObj;
  }
//------------------/waitForKeyElements------------------

//------------------Navigate------------------
function Navigate (text)
{
       // text="888888888888888";
        console.log('-search go: ' + text);
//alert(window.location.href);
        var url=window.location.href;
if (url.indexOf("search_text") === -1)
{
url = [url.slice(0, url.indexOf("order_date_from")-1), "&search_text="+ text, url.slice(url.indexOf("order_date_from")-1)].join('');
}
        else
        {
url=url.replace(/(search_text)(.+?)(?=order_date_from)/, "$1="+text+"&");

        }
        //url=url.replace(/search_text=.*&order_date_from/, 'search_text=' + text + '&order_date_from')
       // alert(url);
console.log('searching: ' + url);
        window.location.href = url;
   // window.location.assign(url);
        document.location.reload(true);


//exit();

    }
//------------------/Navigate------------------

//------------------eventFire------------------
function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('Events');
    evObj.initEvent(etype, true, false);
    el.dispatchEvent(evObj);
  }
}
//------------------/eventFire------------------


//------------------set_status------------------
function set_status(status_to,numb)
{
//--------------

console.log("params: "+status_to+", "+numb)

var items;
//document.querySelector("#shop2_orders_container")

items = document.getElementsByClassName("view order-number");


var index;
for (var j = 0; j < items.length; j++) {
console.log("ITEMS textContent ");
var temp = items[j].textContent.trim();
temp = temp.split("(")[0];
temp = temp.trim();

console.log(temp );
console.log("comparing -"+temp+"- with -"+numb+'-');
if (temp == numb)
{
index=j;
}



}
    console.log("index is " + index);

if (index == undefined)
{
    return 'NOT_found';
//alert("Критическая ошибка! index == undefined заказ " + numb + "НЕ переведён!!!!!!");
   /*  crawl = '0';
     localStorage.setItem('perevod_is_working','2');
     document.location.reload(true);*/
}


//-----------------
//console.log("searching" + status_to);


var textToFind = status_to;
var result ;
var dd = document.querySelectorAll("#order_status_style");
//var dd = document.getElementById('order_status_style');

//alert("danger zone 1");
    if (dd[index-1] != null)
    {
for (var i = 0; i < dd[index-1].options.length; i++) {
    if (dd[index-1].options[i].text === textToFind) {
        dd[index-1].selectedIndex = i;
        break;
    }
}
//alert("danger zone 2");
        var element = document.querySelectorAll("#order_status_style");
//alert(element.length);
		//var element = document.querySelectorAll("#order_status_style");
        if ("createEvent" in document) {
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("change", false, true);
	//RETURN ME!!!!
    element[index-1].dispatchEvent(evt);
	//element[index].dispatchEvent(evt);

}
else {
//RETURN ME!!!!
  element[index-1].fireEvent("onchange");
  //element[index].fireEvent("onchange");
   }
//alert("success");
    result="good";
    }
    else result="NOT_found";
console.log("result" + result);

return result;
    }
//------------------/set_status------------------
//------------------msToTime------------------
function msToTime(duration,short=0) {
  var milliseconds = parseInt((duration % 1000) / 100),
    seconds = Math.floor((duration / 1000) % 60),
    minutes = Math.floor((duration / (1000 * 60)) % 60),
    hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? "0" + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

if(short==0) return hours + " ч. " + minutes + " мин. " + seconds + " сек. ";
else return seconds + " сек. " + milliseconds + " мил.";
}
//------------------/msToTime------------------
//JUST FINISHED
if (crawl == '2')
{
//DO SMTH WITH RESULTS
crawl = 0;
var src_nums_array = localStorage.getItem('perevod_nomera_src').split('\n');
var tmp = localStorage.getItem('res_array');
//console.log(tmp);
if (tmp.charAt(0) == ',')
{


tmp = tmp.slice(0, 0) + tmp.slice(1);

}

var final_results_array =tmp.split(',');
var i;
var concatenated_result = "";
var good = 0;
var not_f = 0;
var undef = 0;


for (i=0;i<src_nums_array.length; i++)
{
if (final_results_array[i] == 'good') good++;
if (final_results_array[i] == 'NOT_found') not_f++;
if (final_results_array[i] == 'undefined') undef++;

concatenated_result+=src_nums_array[i] + ": " + final_results_array[i]+"\r\n";

}
//alert(concatenated_result);
//console.log(concatenated_result);
var fstart_date = localStorage.getItem('start_date');

var finish_gmc = new GM_configStruct(
{
  'id': 'RESULTS', // The id used for this instance of finish_gmc
    'title': 'РЕЗУЛЬТАТЫ за ' + msToTime( new Date().getTime() - fstart_date) + ": good(" + good + "), notf(" + not_f +"), undef(" + undef +")", // Panel Title
  'fields': // Fields object
  {
    'from': // This is the id of the field
    {'labelPos': 'above',
      'label': 'Переводили ИЗ статуса', // Appears next to field
      'type': 'text', // Makes this setting a text field

      'default': 'ТРЕК ПРИСВОЕН' // Default value if user doesn't change it
    },
      'to': // This is the id of the field
    {'labelPos': 'above',
      'label': 'Переводили В статус', // Appears next to field

      'type': 'text', // Makes this setting a text field
      'default': 'ПОЛУЧЕН' // Default value if user doesn't change it
    },
      'nomera':
    {
      'label': 'Результаты перевода',
      'type': 'textarea',
      'default': '12312'
    //  ,'title': 'Введите номера заказов каждый с новой строки'

    }
  }


    ,'events': {
    'init': function() {
this.set('from', localStorage.getItem('perevod_from'));
this.set('to', localStorage.getItem('perevod_to'));
this.set('nomera', concatenated_result);


        },
    'close': function(){
localStorage.setItem('perevod_is_working','0');
crawl = 0;
    }
    }
});
finish_gmc.open();


//uncomment if fails
//final_results_array = [];
//localStorage.setItem('res_array', "");



//alert("res_array:" + final_results_array);
//alert("localStorage res_array:" + localStorage.getItem('res_array'));
}


//MAKE CRAWL
if (crawl == '1')
{console.log("We are Working");

//INIT VALS BEFORE FOUND ELEMENT
var res_array = localStorage.getItem('res_array', res_array).split(",");
var nums_array = localStorage.getItem('perevod_nomera').split("\n");
var status_to = localStorage.getItem('perevod_to');
var current = nums_array.shift();

var time_label_text = "";

if(res_array.length == '1') //this is first one
{


//var today = ;
//var time =  + ":" +  + ":" + ;
localStorage.setItem('start_date', new Date().getTime());
//alert(new Date().getTime() + " set");
/*localStorage.setItem('start_minutes',today.getMinutes());
localStorage.setItem('start_seconds',today.getSeconds());
localStorage.setItem('start_mseconds',today.getMilliseconds()); */
}

//TIME CALCULATION
 if (res_array.length >= '2') //means 2 or more, divide current time and started.
{


var start_date = localStorage.getItem('start_date');
var for_one = Math.abs( ( new Date().getTime() - start_date ) / (res_array.length-1) );

time_label_text = "Осталось: " + msToTime(for_one*nums_array.length) + ", сред. " + msToTime(for_one,1) + ", прошло " + msToTime( new Date().getTime() - start_date);
$('body').before(time_label_text).show();
}
//






 //STOP BUTTON
if (!$('#perevod-settings-test').length > 0) {
  //

    var btn_CANCEL = document.createElement("button");
    btn_CANCEL.innerHTML = "CANCEL";
	btn_CANCEL.title = "Нажмите чтобы CANCEL.";
    btn_CANCEL.className = "s3-btn without-margin";
    btn_CANCEL.id="perevod-CANCEL";
    btn_CANCEL.style.margin = "0px 20px 0px 0px";
    $("body").before(btn_CANCEL);
    btn_CANCEL.addEventListener("click", function () {


// LOOP STOP

crawl = 2;
localStorage.setItem('perevod_is_working','2');
document.location.reload(true);

});
}

/* $.when(Preloader.hide()).done({
    // the code here will be executed when all four ajax requests resolve.
    // a1, a2, a3 and a4 are lists of length 3 containing the response text,
    // status, and jqXHR object for each of the four ajax calls respectively.
	let_work

});

setTimeout(function () {


if (newState == -1) {
alert('VIDEO HAS STOPPED');
}


}, 5000);



*/
/* setTimeout(function () {


}, 1000); *///#filter_psp
waitForKeyElements(".s3-preloader-hide", let_work);
/*$( document ).ajaxComplete(function(event,xhr,settings) {
alert(Object.values(settings));

});
 */


// window.addEventListener('load', (event) => {

// });


function let_work()
{
//alert("its hidden");
console.log("-all loaded, continuing");


//if (res_array == null) { res_array = "[]";}



res_array.push(set_status(status_to,current));

localStorage.setItem('res_array', res_array.join(','));


console.log("--set_status worked for first elem");

localStorage.setItem('perevod_nomera',nums_array.join('\n'));


 if (nums_array.length > 0)
{
Navigate (nums_array[0]);
}
else {

//alert("nums_array.length > 0\r\n"+nums_array);
     crawl = '0';
     localStorage.setItem('perevod_is_working','2');
     document.location.reload(true);

     }

 }


}



//MAKE INIT
if (crawl == '0' || crawl == 'NULL' || crawl == null)
{console.log("We are Not working");


var settings_gmc = new GM_configStruct(
{
  'id': 'MyConfig', // The id used for this instance of GM_config
    'title': 'Настройки перевода статусов', // Panel Title
  'fields': // Fields object
  {
    'from': // This is the id of the field
    {'labelPos': 'above',
      'label': 'ИЗ статуса', // Appears next to field
      'type': 'text', // Makes this setting a text field

      'default': 'ТРЕК ПРИСВОЕН' // Default value if user doesn't change it
    },
      'to': // This is the id of the field
    {'labelPos': 'above',
      'label': 'В статус', // Appears next to field

      'type': 'text', // Makes this setting a text field
      'default': 'ПОЛУЧЕН' // Default value if user doesn't change it
    },
      'nomera':
    {
      'label': 'Номера заказов',
      'type': 'textarea',
      'default': 'some text'
    //  ,'title': 'Введите номера заказов каждый с новой строки'

    }
  }


    ,'events': {
        'init': function() {
            localStorage.setItem('res_array', '[]');
            var f_from = localStorage.getItem('perevod_from');
            if(f_from == null) f_from= "";

            var f_to = localStorage.getItem('perevod_to');
            if(f_to == null) f_to= "";
this.set('from', f_from);
this.set('to', f_to);

var nums_string_1 = localStorage.getItem('perevod_nomera');
var nums_string;
            if(nums_string_1 == null)
            {nums_string= "[]";
            }
            else
            {nums_string = localStorage.getItem('perevod_nomera').replace(',' , '\n');
            }






this.set('nomera', localStorage.getItem('perevod_nomera_src'));
//this.set('nomera', "32006");
        },
    'save': function(){





localStorage.setItem('perevod_from', this.get('from'));
localStorage.setItem('perevod_to', this.get('to'));
localStorage.setItem('res_array', "");

//var str = '\r\n' + GM_config.get('nomera') + '\r\n';
        //var str = GM_config.get('nomera');
//var array = str.split("\n");
localStorage.setItem('perevod_nomera', this.get('nomera'));
localStorage.setItem('perevod_nomera_src', this.get('nomera'));

//alert("perevod_nomera set like" + this.get('nomera'));

    }
    } /* */
});
//SETTINGS BUTTON
    if (!$('#perevod-settings').length > 0) {
  //

    var btn_open_settings = document.createElement("button");
    btn_open_settings.innerHTML = "Установки перевода";
	btn_open_settings.title = "Нажмите чтобы устанвить параметры.";
    btn_open_settings.className = "s3-btn without-margin";
    btn_open_settings.id="perevod-settings";
    btn_open_settings.style.margin = "0px 20px 0px 0px";
    $("body").before(btn_open_settings);
    btn_open_settings.addEventListener("click", function () {
    settings_gmc.open();


});
}

//START BUTTON
    if (!$('#perevod-start').length > 0) {


    var btn_start = document.createElement("button");
    btn_start.innerHTML = "start";
	btn_start.title = "Нажмите чтобы поехать.";
    btn_start.className = "s3-btn without-margin";
    btn_start.id="perevod-start";
    btn_start.style.margin = "0px 20px 0px 0px";
    $("body").before(btn_start);
    btn_start.addEventListener("click", function () {


var res_array = ['1','2'];
res_array.length = 0;
localStorage.setItem('res_array', res_array.join(','));


localStorage.setItem('perevod_nomera', settings_gmc.get('nomera'));

// LOOP
 localStorage.setItem('perevod_is_working','1');

var str = settings_gmc.get('nomera');
var array = str.split("\n");
console.log("starting! search ("+ array[0]+") ");
Navigate(array[0]);


});
}
//TEST BUTTON
    var btn_test = document.createElement("button");
    btn_test.innerHTML = "test";
	btn_test.title = "Нажмите чтобы поехать.";
    btn_test.className = "s3-btn without-margin";
    btn_test.id="perevod-test";
    btn_test.style.margin = "0px 20px 0px 0px";
   // $("body").before(btn_test);
    btn_test.addEventListener("click", function () {

//TESTCODE





// END TESTCODE



});

}



})();