Aliexpress Plus

Sorts search results by item price properly with shipping costs included, enhances item pages

Tính đến 21-10-2021. Xem phiên bản mới nhất.

// ==UserScript==
// @name         Aliexpress Plus
// @namespace    http://www.facebook.com/Tophness
// @version      3.1.5
// @description  Sorts search results by item price properly with shipping costs included, enhances item pages
// @author       Tophness
// @match        https://*.aliexpress.com/w/wholesale*
// @match        https://*.aliexpress.com/wholesale*
// @match        https://*.aliexpress.com/category*
// @match        https://*.aliexpress.com/af/*
// @match        https://*.aliexpress.com/item/*
// @require      https://cdnjs.cloudflare.com/ajax/libs/tinysort/2.3.6/tinysort.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/tinysort/2.3.6/tinysort.charorder.min.js
// @require      https://openuserjs.org/src/libs/sizzle/GM_config.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @run-at       document-idle
// @license      MIT
// @copyright    2014, Tophness (https://openuserjs.org/users/Tophness)
// ==/UserScript==

var tnum = 0;
var sortingnow = false;
var itemstype = 2;

var GM_SuperValue = new function () {

    var JSON_MarkerStr = 'json_val: ';
    var FunctionMarker = 'function_code: ';

    function ReportError (msg) {
        if (console && console.error){
            console.log (msg);
        }
        else{
            throw new Error (msg);
        }
    }

    if (typeof GM_setValue != "function"){
        ReportError ('This library requires Greasemonkey! GM_setValue is missing.');
    }
    if (typeof GM_getValue != "function"){
        ReportError ('This library requires Greasemonkey! GM_getValue is missing.');
    }

    this.set = function (varName, varValue) {

        if ( ! varName) {
            ReportError ('Illegal varName sent to GM_SuperValue.set().');
            return;
        }
        if (/[^\w _-]/.test (varName) ) {
            ReportError ('Suspect, probably illegal, varName sent to GM_SuperValue.set().');
        }

        switch (typeof varValue) {
            case 'undefined':
                ReportError ('Illegal varValue sent to GM_SuperValue.set().');
                break;
            case 'boolean':
            case 'string':
                GM_setValue (varName, varValue);
                break;
            case 'number':
                if (varValue === parseInt (varValue) && Math.abs(varValue) < 2147483647)
                {
                    GM_setValue (varName, varValue);
                    break;
                }
                break;
            case 'object':
                var safeStr = JSON_MarkerStr + JSON.stringify(varValue);
                GM_setValue (varName, safeStr);
                break;
            case 'function':
                var safeStr2 = FunctionMarker + varValue.toString();
                GM_setValue (varName, safeStr);
                break;

            default:
                ReportError ('Unknown type in GM_SuperValue.set()!');
                break;
        }
    }

    this.get = function (varName, defaultValue) {

        if ( ! varName) {
            ReportError ('Illegal varName sent to GM_SuperValue.get().');
            return;
        }
        if (/[^\w _-]/.test (varName) ) {
            ReportError ('Suspect, probably illegal, varName sent to GM_SuperValue.get().');
        }

        var varValue = GM_getValue(varName);
        if (!varValue){
            return defaultValue;
        }

        if (typeof varValue == "string") {
            //--- Is it a JSON value?
            let regxp = new RegExp ('^' + JSON_MarkerStr + '(.+)$');
            var m = varValue.match (regxp);
            if(m && m.length > 1) {
                varValue = JSON.parse ( m[1] );
                return varValue;
            }

            let regxp2 = new RegExp ('^' + FunctionMarker + '((?:.|\n|\r)+)$');
            let m2 = varValue.match (regxp2);
            if (m2 && m2.length > 1) {
                varValue = eval('(' + m2[1] + ')');
                return varValue;
            }
        }

        return varValue;
    }
};

GM_config.init(
    {
        'id': 'Config',
        title: 'Configure',
        'fields': {
            'sortmode': {
                label: 'Search: Sort Mode',
                type: 'select',
                options: [ 'Cheapest Unit Price', 'Cheapest Total Price', 'Cheapest Total Price (Max Price)', 'Cheapest Price', 'Max Price' ],
                default: 'Cheapest Total Price'
            },
            'pagesearch': {
                label: 'Search: Open pages and scrape shipping details if missing from search',
                type: 'checkbox',
                default: true
            },
            'windowmode': {
                label: 'Search: Item Scraping Mode',
                type: 'select',
                options: [ 'unSafeWindow', 'DOM' ],
                default: 'unSafeWindow'
            },
            'getextraitems': {
                label: 'Search: Get Extra Items In unSafeWindow Mode',
                type: 'checkbox',
                default: true
            },
            'UseSideImgs': {
                label: 'Wishlist: Search Listing Images (On The Left Side Previews)',
                type: 'checkbox',
                default: true
            },
            'UseInnerHTMLImgs': {
                label: 'Wishlist: Search Listing Property Images (Different Colors etc.)',
                type: 'checkbox',
                default: true
            },
            'UseB64Imgs': {
                label: 'Wishlist: Store Listing Images Locally',
                type: 'checkbox',
                default: true
            },
            'useTextSearch': {
                label: 'Wishlist: Search Listing Text',
                type: 'checkbox',
                default: true
            },
            'mode': {
                label: 'Wishlist: Listing Text Search Mode',
                type: 'select',
                options: [ 'Exact', 'Contains Text', 'Relative' ],
                default: 'Relative'
            },
            'similarity': {
                label: 'Wishlist: Listing Text Search Similarity',
                type: 'float',
                default: 0.8
            },
            'filterNamesFromImgs': {
                label: 'Wishlist: Remove Results Found In Text Search From Image Search',
                type: 'checkbox',
                default: true
            }
        }
    }
);

var orders = GM_SuperValue.get('wishdata', []);
var filterNamesFromImgs = GM_config.get('filterNamesFromImgs');
var UseB64Imgs = GM_config.get('UseB64Imgs');
var UseSideImgs = GM_config.get('UseSideImgs');
var UseInnerHTMLImgs = GM_config.get('UseInnerHTMLImgs');
var useTextSearch = GM_config.get('useTextSearch');
var mode = GM_config.get('mode');
var similarityratio = GM_config.get('similarity');
var sortmethod = GM_config.fields.sortmode.settings.options.indexOf(GM_config.get('sortmode'))+1;
var pagesearch = GM_config.get('pagesearch');
var unsafewindowmode = GM_config.fields.windowmode.settings.options.indexOf(GM_config.get('windowmode'))+1;
var getextraitems = GM_config.get('getextraitems');

GM_addStyle(".tabs{overflow:hidden;clear:both;} .tabs ul{list-style-type:none;bottom: -1px;position:relative;} .tabs li{float:left;} .tablist span{cursor: pointer;display:block;padding:5px 10px;text-decoration: none;margin: 0 4px;border-top:1px solid #CCC;border-left:1px solid #DDD;border-right:1px solid #DDD;font:13px/18px verdana,arial,sans-serif;border-bottom:1px solid #CCC;} .tablist span.exact{background-color: red;color: #fff;} .tablist span.containstext{background-color: blue;color: #fff;} .tablist span.relative{background-color: green;color: #fff;} .tablist span.images{background-color: yellow;color: #000;} .tablist span.active{background-color: #eee;color: #000;border-bottom:1px solid #fff;}");

!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Rembrandt=e():t.Rembrandt=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){(function(e){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),a=n(1),u=(i(a),n(2)),s=i(u),c=n(3),f=i(c),l=n(4),h=i(l),d=n(5),m=i(d),p=n(6),g=i(p),v=n(7),_=i(v);e.Buffer=function(){};var y=function(){function t(e){r(this,t),this._imageA=null,this._imageB=null,this._options=s["default"].defaults(e,{imageA:null,imageB:null,thresholdType:t.THRESHOLD_PERCENT,maxThreshold:.01,maxDelta:20,renderComposition:!1,compositionMaskColor:g["default"].RED,maxOffset:0}),this._validateOptions()}return o(t,[{key:"compare",value:function(){var t=this;return this._loadImages().then(function(){var e=new _["default"](t._imageA,t._imageB,t._options);return e.compare()})}},{key:"_validateOptions",value:function(){var e=this,n=function(t){var n=e._options[t];if(!("string"==typeof n||Buffer.isBuffer(n)||n instanceof m["default"]))throw new Error("Option `"+t+"` must either be a String, Buffer or Rembrandt.Image.")};n("imageA"),n("imageB");var i=this._options,r=i.thresholdType,o=i.threshold,a=i.maxDelta,u=[t.THRESHOLD_PERCENT,t.THRESHOLD_PIXELS];if(u.indexOf(r)===-1)throw new Error("`thresholdType` must be either Rembrandt.THRESHOLD_PERCENT or Rembrandt.THRESHOLD_PIXELS");if(r===t.THRESHOLD_PERCENT&&o<0||o>1)throw new Error("`threshold` must be between 0 and 1");if(a<0||a>255)throw new Error("`maxDelta` must be between 0 and 255")}},{key:"_loadImages",value:function(){var t=this;return this._loadImage(this._options.imageA).then(function(e){return t._imageA=e,t._loadImage(t._options.imageB)}).then(function(e){t._imageB=e})}},{key:"_loadImage",value:function(t){return new f["default"](function(e,n){return t instanceof m["default"]?e(t):t instanceof Buffer?e(m["default"].fromBuffer(t)):void!function(){var n=s["default"].createImage();n.addEventListener("load",function(){e(m["default"].fromImage(n))}),n.crossOrigin="Anonymous",n.src=t}()})}}],[{key:"createImage",value:function(t,e){return new m["default"](t,e)}}]),t}();y.Image=m["default"],y.Color=g["default"],y.version=n(9).version;for(var b in h["default"])y[b]=h["default"][b];t.exports=y}).call(e,function(){return this}())},function(t,e){"use strict"},function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),o=function(){function t(){i(this,t)}return r(t,null,[{key:"defaults",value:function(t){var e={};for(var n in t)e[n]=t[n];for(var i=arguments.length,r=Array(i>1?i-1:0),o=1;o<i;o++)r[o-1]=arguments[o];for(var a=0;a<r.length;a++){var u=r[a];for(var s in u)"undefined"==typeof e[s]&&(e[s]=u[s])}return e}},{key:"createCanvas",value:function(t,e){var n=void 0;return n=document.createElement("canvas"),n.width=t,n.height=e,n}},{key:"createImage",value:function(){var t=void 0;return t=new window.Image}}]),t}();e["default"]=o},function(t,e,n){var i;(function(r){"use strict";var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};
!function(r,o,a){o[r]=o[r]||a(),"undefined"!=typeof t&&t.exports?t.exports=o[r]:(i=function(){return o[r]}.call(e,n,e,t),!(void 0!==i&&(t.exports=i)))}("Promise","undefined"!=typeof r?r:void 0,function(){function t(t,e){d.add(t,e),h||(h=p(d.drain))}function e(t){var e,n="undefined"==typeof t?"undefined":o(t);return null==t||"object"!=n&&"function"!=n||(e=t.then),"function"==typeof e&&e}function n(){for(var t=0;t<this.chain.length;t++)i(this,1===this.state?this.chain[t].success:this.chain[t].failure,this.chain[t]);this.chain.length=0}function i(t,n,i){var r,o;try{n===!1?i.reject(t.msg):(r=n===!0?t.msg:n.call(void 0,t.msg),r===i.promise?i.reject(TypeError("Promise-chain cycle")):(o=e(r))?o.call(r,i.resolve,i.reject):i.resolve(r))}catch(a){i.reject(a)}}function r(i){var o,u=this;if(!u.triggered){u.triggered=!0,u.def&&(u=u.def);try{(o=e(i))?t(function(){var t=new s(u);try{o.call(i,function(){r.apply(t,arguments)},function(){a.apply(t,arguments)})}catch(e){a.call(t,e)}}):(u.msg=i,u.state=1,u.chain.length>0&&t(n,u))}catch(c){a.call(new s(u),c)}}}function a(e){var i=this;i.triggered||(i.triggered=!0,i.def&&(i=i.def),i.msg=e,i.state=2,i.chain.length>0&&t(n,i))}function u(t,e,n,i){for(var r=0;r<e.length;r++)!function(r){t.resolve(e[r]).then(function(t){n(r,t)},i)}(r)}function s(t){this.def=t,this.triggered=!1}function c(t){this.promise=t,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function f(e){if("function"!=typeof e)throw TypeError("Not a function");if(0!==this.__NPO__)throw TypeError("Not a promise");this.__NPO__=1;var i=new c(this);this.then=function(e,r){var o={success:"function"!=typeof e||e,failure:"function"==typeof r&&r};return o.promise=new this.constructor(function(t,e){if("function"!=typeof t||"function"!=typeof e)throw TypeError("Not a function");o.resolve=t,o.reject=e}),i.chain.push(o),0!==i.state&&t(n,i),o.promise},this["catch"]=function(t){return this.then(void 0,t)};try{e.call(void 0,function(t){r.call(i,t)},function(t){a.call(i,t)})}catch(o){a.call(i,o)}}var l,h,d,m=Object.prototype.toString,p="undefined"!=typeof setImmediate?function(t){return setImmediate(t)}:setTimeout;try{Object.defineProperty({},"x",{}),l=function(t,e,n,i){return Object.defineProperty(t,e,{value:n,writable:!0,configurable:i!==!1})}}catch(g){l=function(t,e,n){return t[e]=n,t}}d=function(){function t(t,e){this.fn=t,this.self=e,this.next=void 0}var e,n,i;return{add:function(r,o){i=new t(r,o),n?n.next=i:e=i,n=i,i=void 0},drain:function(){var t=e;for(e=n=h=void 0;t;)t.fn.call(t.self),t=t.next}}}();var v=l({},"constructor",f,!1);return f.prototype=v,l(v,"__NPO__",0,!1),l(f,"resolve",function(t){var e=this;return t&&"object"==("undefined"==typeof t?"undefined":o(t))&&1===t.__NPO__?t:new e(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");e(t)})}),l(f,"reject",function(t){return new this(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");n(t)})}),l(f,"all",function(t){var e=this;return"[object Array]"!=m.call(t)?e.reject(TypeError("Not an array")):0===t.length?e.resolve([]):new e(function(n,i){if("function"!=typeof n||"function"!=typeof i)throw TypeError("Not a function");var r=t.length,o=Array(r),a=0;u(e,t,function(t,e){o[t]=e,++a===r&&n(o)},i)})}),l(f,"race",function(t){var e=this;return"[object Array]"!=m.call(t)?e.reject(TypeError("Not an array")):new e(function(n,i){if("function"!=typeof n||"function"!=typeof i)throw TypeError("Not a function");u(e,t,function(t,e){n(e)},i)})}),f})}).call(e,function(){return this}())},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={THRESHOLD_PERCENT:0,THRESHOLD_PIXELS:1}},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),a=n(2),u=i(a),s=n(6),c=i(s),f=function(){function t(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;r(this,t),this.width=e,this.height=n,this._canvas=u["default"].createCanvas(e,n),this._context=this._canvas.getContext("2d"),this._image=i,i?this._drawImage(this._image):this._imageData=this._context.createImageData(e,n)}return o(t,[{key:"setColorAt",value:function(t,e,n){var i=4*(e*this.width+t);this._imageData.data[i]=255*n.r|0,this._imageData.data[i+1]=255*n.g|0,this._imageData.data[i+2]=255*n.b|0,this._imageData.data[i+3]=255*n.a|0}},{key:"getColorAt",value:function(t,e){var n=4*(this.width*e+t),i=this._imageData.data[n],r=this._imageData.data[n+1],o=this._imageData.data[n+2],a=this._imageData.data[n+3];return new c["default"](i,r,o,a)}},{key:"getImageData",value:function(){return this._imageData}},{key:"setImageData",value:function(t){this._imageData.data.set(t.data)}},{key:"clone",value:function(){var e=new t(this.width,this.height);return e.setImageData(this._imageData),e}},{key:"persist",value:function(){this._context.putImageData(this._imageData,0,0)}},{key:"toBuffer",value:function(){return this.persist(),this._canvas.toBuffer()}},{key:"_drawImage",value:function(t){this._context.drawImage(t,0,0),this._imageData=this._context.getImageData(0,0,this.width,this.height)}},{key:"canvas",get:function(){return this._canvas}},{key:"imageData",get:function(){return this._imageData}}],[{key:"fromBuffer",value:function(e){var n=u["default"].createImage();return n.src=e,new t(n.width,n.height,n)}},{key:"fromImage",value:function(e){return new t(e.width,e.height,e)}}]),t}();e["default"]=f},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(){function t(e,i,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;n(this,t),this.r=e,this.g=i,this.b=r,this.a=o}return i(t,[{key:"clone",value:function(){return new t(this.r,this.g,this.b,this.a)}},{key:"equals",value:function(t){return this.r===t.r&&this.g===t.g&&this.b===t.b&&this.a===t.a}},{key:"toString",value:function(){return"Color("+this.r+", "+this.g+", "+this.b+", "+this.a+")"}}],[{key:"TRANSPARENT",get:function(){return new t(0,0,0,0)}},{key:"WHITE",get:function(){return new t(1,1,1,1)}},{key:"BLACK",get:function(){return new t(0,0,0,1)}},{key:"RED",get:function(){return new t(1,0,0,1)}}]),t}();e["default"]=r},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),a=n(2),u=i(a),s=n(3),c=i(s),f=n(4),l=i(f),h=n(5),d=i(h),m=n(6),p=i(m),g=n(8),v=i(g),_=function(){function t(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};r(this,t),this._imageA=e,this._imageB=n,this._prepareImages(),this._options=u["default"].defaults(i,{maxDelta:20,thresholdType:l["default"].THRESHOLD_PERCENT,maxThreshold:.01,renderComposition:!1,compositionMaskColor:p["default"].RED,maxOffset:0}),this._options.renderComposition&&(this._compositionImage=new v["default"](this._imageA,this._imageB))}return o(t,[{key:"compare",value:function(){var t=this;return new c["default"](function(e,n){var i=Math.min(t._imageA.width,t._imageB.width),r=Math.min(t._imageA.height,t._imageB.height),o=0,a=void 0,u=void 0;for(a=0;a<i;a++)for(u=0;u<r;u++){var s=t._comparePosition(a,u);s||(t._options.renderComposition&&t._compositionImage.setColorAt(a,u,t._options.compositionMaskColor),o++)}var c=o;if(t._options.thresholdType===l["default"].THRESHOLD_PERCENT){var f=i*r;c/=f}var h=c<=t._options.maxThreshold;t._options.renderComposition?t._compositionImage.render().then(function(t){e({differences:o,threshold:c,passed:h,compositionImage:t})}):e({differences:o,threshold:c,passed:h})})}},{key:"_prepareImages",value:function(){var t=Math.max(this._imageA.width,this._imageB.width),e=Math.max(this._imageB.height,this._imageB.height);this._imageA=this._ensureImageDimensions(this._imageA,t,e),this._imageB=this._ensureImageDimensions(this._imageB,t,e)}},{key:"_ensureImageDimensions",value:function(t,e,n){if(t.width===e&&t.height===t.height)return t;t.persist();var i=new d["default"](e,n,t.canvas);return i}},{key:"_calculateColorDelta",value:function(t,e){var n=0;return n+=Math.pow(t.r-e.r,2),n+=Math.pow(t.g-e.g,2),n+=Math.pow(t.b-e.b,2),n+=Math.pow(t.a-e.a,2),Math.sqrt(255*n)}},{key:"_comparePosition",value:function(t,e){var n=this._options,i=n.maxDelta,r=n.maxOffset,o=this._imageA.getColorAt(t,e),a=this._imageB.getColorAt(t,e),u=this._calculateColorDelta(o,a);if(u<i)return!0;if(0===r)return!1;var s=this._imageA,c=s.width,f=s.height,l=Math.max(0,t-r),h=Math.min(c-1,t+r),d=Math.max(0,e-r),m=Math.min(f-1,e+r),p=void 0,g=void 0;for(p=l;p<=h;p++)for(g=d;g<=m;g++)if(p!==t&&g!==e){var v=this._imageA.getColorAt(p,g),_=this._calculateColorDelta(o,v),y=this._imageB.getColorAt(p,g),b=this._calculateColorDelta(o,y);if(Math.abs(b-_)<i&&_>i)return!0}return!1}}]),t}();e["default"]=_},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),s=n(3),c=i(s),f=n(2),l=i(f),h=n(5),d=i(h),m=function(t){function e(t,n){r(this,e),t.persist(),n.persist();var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t.width,t.height,t.canvas));return i._imageA=t,i._imageB=n,i}return a(e,t),u(e,[{key:"render",value:function(){var t=this;return new c["default"](function(e,n){t._canvas.width=3*t._imageA.width,t._context.drawImage(t._imageA.canvas,0,0),t._context.drawImage(t._imageB.canvas,2*t._imageA.width,0),t._context.putImageData(t._imageData,t._imageA.width,0),!function(){var n=l["default"].createImage();n.addEventListener("load",function(){e(n)}),n.src=t._canvas.toDataURL("image/png")}()})}}]),e}(d["default"]);e["default"]=m},function(t,e){"use strict";t.exports={name:"rembrandt",version:"0.0.8",description:"Client- and server-side image comparison library",main:"build/node.js",repository:{url:"git://github.com/imgly/rembrandt.git",type:"git"},scripts:{test:"node_modules/.bin/mocha --require test/support test/*.test.js",build:"node_modules/.bin/webpack"},author:"PhotoEditorSDK.com <[email protected]>",license:"MIT",dependencies:{canvas:"^1.6.0"},devDependencies:{"babel-core":"^6.17.0","babel-loader":"^6.2.5","babel-preset-es2015":"^6.16.0","babel-register":"^6.16.3",chai:"^3.5.0","chai-as-promised":"^6.0.0","json-loader":"^0.5.4",mocha:"^3.1.2","preprocess-loader":"^0.2.0",should:"^11.1.1","standard-loader":"^5.0.0",webpack:"^1.13.2"}}}])});

(function () {
    let default_floor = 0.5;

    function pairs(str) {
        let pairs = [],
            length = str.length - 1,
            pair;
        for (let i = 0; i < length; i++) {
            pair = str.substr(i, 2);
            if (!/\s/.test(pair)) {
                pairs.push(pair);
            }
        }
        return pairs;
    }

    function similarity(pairs1, pairs2) {
        let union = pairs1.length + pairs2.length,
            hits = 0;

        for (let i = 0; i < pairs1.length; i++) {
            for (let j = 0; j < pairs1.length; j++) {
                if (pairs1[i] == pairs2[j]) {
                    pairs2.splice(j--, 1);
                    hits++;
                    break;
                }
            }
        }
        return 2 * hits / union || 0;
    }

    String.prototype.fuzzy = function (strings, floor) {
        let str1 = this,
            pairs1 = pairs(this);

        floor = typeof floor == 'number' ? floor : default_floor;

        if (typeof(strings) == 'string') {
            return str1.length > 1 && strings.length > 1 && similarity(pairs1, pairs(strings)) >= floor || str1 == strings;
        } else if (strings instanceof Array) {
            let scores = {};

            strings.map(function (str2) {
                scores[str2] = str1.length > 1 ? similarity(pairs1, pairs(str2)) : 1 * (str1 == str2);
            });

            return strings.filter(function (str) {
                return scores[str] >= floor;
            }).sort(function (a, b) {
                return scores[b] - scores[a];
            });
        }
    };
})();

if (typeof String.prototype.startsWith != 'function') {
    String.prototype.startsWith = function (str) {
        return this.slice(0, str.length) == str;
    };
}

if (typeof String.prototype.endsWith != 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

function lookup(arr) {
    let newarr = [];
    for (let i = 0; i < arr.length; i++) {
        newarr.push(arr[i].title.toLowerCase());
    }
    return newarr;
}

function searchfunc(q) {
    let qval = q.toLowerCase().fuzzy(lookup(orders), similarityratio);
    if (qval.length > 0) {
        return qval;
    } else {
        return false;
    }
}

async function search(q) {
    let ignorelist2 = [];
    if (mode == 'Exact') {
        for (let i = 0; i < orders.length; i++) {
            if(orders[i].title.toLowerCase() == q){
                if(ignorelist2.indexOf(i) == -1) {
                    addTab(unescape(orders[i].el), orders[i].title, i.toString(), mode);
                    ignorelist2.push(i);
                }
            }
        }
    } else if (mode == 'Contains Text') {
        for (let i = 0; i < orders.length; i++) {
            if (orders[i].title.toLowerCase().indexOf(q) != -1) {
                if(ignorelist2.indexOf(i) == -1) {
                    addTab(unescape(orders[i].el), orders[i].title, i.toString(), mode);
                    ignorelist2.push(i);
                }
            }
        }
    } else if (mode == 'Relative') {
        let sq = searchfunc(q);
        if (sq) {
            for (let i = 0; i < sq.length; i++) {
                for (let i2 = 0; i2 < orders.length; i2++) {
                    if (orders[i2].title.toLowerCase().indexOf(sq[i]) != -1) {
                        if(ignorelist2.indexOf(i2) == -1) {
                            addTab(unescape(orders[i2].el), orders[i2].title, i.toString() + i2.toString(), mode);
                            ignorelist2.push(i2);
                        }
                    }
                }
            }
        }
    }
    return ignorelist2;
}

function sortwishlist(){
    orders.sort(function (a, b) {
        return a.price - b.price;
    });
}

function startTabs() {
    let tabsdiv = document.createElement('div');
    tabsdiv.className = "tabs";
    let ul = document.createElement('ul');
    ul.className = 'tablist';
    tabsdiv.appendChild(ul);
    let tabdiv = document.createElement('div');
    tabdiv.id = 'tabdiv';
    tabdiv.style.display = "block";
    tabsdiv.appendChild(tabdiv);
    document.getElementById('wishlist-tbody').appendChild(tabsdiv);
}

function addTab(el, title, tabnum, searchtype){
    let li = document.createElement('li');
    let taba = document.createElement('span');
    taba.id = "#tab" + tabnum + tnum;
    taba.innerHTML = title;
    taba.classList.add(searchtype.toLowerCase().replace(" ",""));

    let tabdiv = document.createElement('div');
    tabdiv.id = "tab" + tabnum + tnum;
    tabdiv.innerHTML = el;

    if(tnum == 0){
        taba.classList.add('active');
        tabdiv.style.display = "block";
    }
    else{
        tabdiv.style.display = "none";
    }
    taba.addEventListener('click', function(e) {
        let tab_lists_anchors = document.querySelectorAll(".tablist li span");
        let divs = document.getElementById('tabdiv').childNodes;
        for (let i = 0; i < divs.length; i++) {
            divs[i].style.display = "none";
        }
        for (let i = 0; i < tab_lists_anchors.length; i++) {
            tab_lists_anchors[i].classList.remove("active");
        }
        let clicked_tab = e.target || e.srcElement;
        clicked_tab.classList.add('active');

        document.getElementById('tabdiv').querySelector(clicked_tab.getAttribute('id')).style.display = "block";
    });

    li.appendChild(taba);
    document.getElementsByClassName('tablist')[0].appendChild(li);
    document.getElementById('tabdiv').appendChild(tabdiv);
    tnum++;
}

async function imgTest(imgA, imgB) {
    const rembrandt = new Rembrandt({
        imageA: imgA,
        imageB: imgB,
        thresholdType: Rembrandt.THRESHOLD_PERCENT,
        maxThreshold: 0.99,
        maxDelta: 1,
        maxOffset: 1,
    })
    return new Promise((passed) => {
        rembrandt.compare()
            .then(function (result) {
            passed(result.passed);
        })
    });
}

async function imgsearch(imgschild, ordersclone){
    if(ordersclone.length > 0){
        let ignorelist = [];
        for (let i = 0; i < imgschild.length; i++) {
            for (let i2 = 0; i2 < ordersclone.length; i2++) {
                if(ignorelist.indexOf(i2) == -1) {
                    for (let i3 = 0; i3 < ordersclone[i2].imgs.length; i3++) {
                        let didpass = await imgTest(imgschild[i], base64toBlob(ordersclone[i2].imgs[i3].split('base64,')[1]));
                        if(didpass){
                            if(ignorelist.indexOf(i2) == -1) {
                                addTab(unescape(ordersclone[i2].el), ordersclone[i2].title, i2.toString() + i3.toString(), "images");
                                ignorelist.push(i2);
                            }
                        }
                    }
                }
            }
        }
    }
}

function base64toBlob(data) {
    let out = Uint8Array.from(atob(data), c => c.charCodeAt(0));
    return URL.createObjectURL(new Blob([out], { type: 'image/png' }));
}

function convertImgToBase64URL(url){
    return fetch(url)
        .then( response => response.blob() )
        .then( blob => new Promise( callback =>{
        let reader = new FileReader() ;
        reader.onload = function(){ callback([this.result, URL.createObjectURL(blob)]) } ;
        reader.readAsDataURL(blob) ;
    }) ) ;
}

function removeNode(elem){
    elem.parentNode.removeChild(elem);
}

async function finalwishliststart(pricetext){
    if(document.getElementsByClassName('product-main-wrap')){
        let mainel = document.getElementsByClassName('product-main-wrap')[0];
        let wishbtn = mainel.getElementsByClassName('add-wishlist');
        if (wishbtn.length > 0) {
            let imgsblob = [];
            let imgschild = [];
            if(UseSideImgs){
                if(mainel.getElementsByClassName('images-view-list').length > 0){
                    let imgsall = mainel.getElementsByClassName('images-view-list')[0].childNodes;
                    for (let i4 = 0; i4 < imgsall.length; i4++) {
                        if(UseB64Imgs){
                            let base64Img = await convertImgToBase64URL(imgsall[i4].firstChild.firstChild.src);
                            imgschild.push(base64Img[0]);
                            imgsblob.push(base64Img[1]);
                        }
                        else{
                            imgschild.push(imgsall[i4].firstChild.firstChild.src);
                        }
                    }
                }
            }
            if(UseInnerHTMLImgs){
                if(mainel.getElementsByClassName('sku-property-list').length > 0){
                    let imgsall2 = mainel.getElementsByClassName('sku-property-list')[0].childNodes;
                    for (let i5 = 0; i5 < imgsall2.length; i5++) {
                        if(UseB64Imgs){
                            let base64Img = await convertImgToBase64URL(imgsall2[i5].firstChild.firstChild.src);
                            imgschild.push(base64Img[0]);
                            imgsblob.push(base64Img[1]);
                        }
                        else{
                            imgschild.push(imgsall2[i5].firstChild.firstChild.src);
                        }
                    }
                }
            }
            let cloneEl = mainel.getElementsByClassName('product-info')[0].cloneNode(true);
            removeNode(cloneEl.getElementsByClassName('buyer-pretection')[0]);
            removeNode(cloneEl.getElementsByClassName('product-action')[0]);
            removeNode(cloneEl.getElementsByClassName('product-quantity')[0]);
            removeNode(cloneEl.getElementsByClassName('product-title')[0]);

            let neworder = {
                title : mainel.getElementsByClassName('product-title-text')[0].innerText,
                price : pricetext,
                href: document.location.pathname,
                imgs: imgschild,
                el : cloneEl.innerHTML.replace(/[^\x00-\x7F]/g, "")
            };
            let dupnum = orders.find(x => x.href === document.location.pathname);
            if(!dupnum){
                wishbtn[0].addEventListener("click", function () {
                    orders.push(neworder);
                    sortwishlist();
                    GM_SuperValue.set('wishdata', orders);
                });
            }
            else{
                orders.splice(orders.indexOf(dupnum), 1);
            }
            if (orders) {
                let wishb = document.createElement('div');
                let title = document.createElement('h2');
                title.id = 'ui-box-title';
                title.innerHTML = 'Similar Wishlist Items';
                title.style = "cursor: pointer";
                title.addEventListener('click', function(e){
                    let clicked = e.target || e.srcElement;
                    clicked.classList.add('active');
                });
                wishb.id = 'wishlist-tbody';
                wishb.setAttribute('style', 'align:top;position:absolute;width:18%');
                document.getElementById('header').appendChild(title);
                document.getElementById('header').appendChild(wishb);
                waitForEl3();
                GM_registerMenuCommand("Configure", function (){document.querySelector("#ui-box-title").className = "active";});
                startTabs();
                if(useTextSearch){
                    let toignore = await search(neworder.title.toLowerCase());
                    let orderscopy = [];
                    if(filterNamesFromImgs){
                        if(toignore.length > 0){
                            for (let i = 0; i < orders.length; i++) {
                                if(toignore.indexOf(i) == -1){
                                    orderscopy.push(orders[i]);
                                }
                            }
                            if(UseSideImgs || UseInnerHTMLImgs){
                                imgsearch(imgsblob, orderscopy);
                            }
                        }
                        else if(UseSideImgs || UseInnerHTMLImgs){
                            imgsearch(imgsblob, orders);
                        }
                    }
                    else if(UseSideImgs || UseInnerHTMLImgs){
                        imgsearch(imgsblob, orders);
                    }
                }
                else{
                    if(UseSideImgs || UseInnerHTMLImgs){
                        imgsearch(imgsblob, orders);
                    }
                }
            }
        }
    }
}

function formatPageShipping(text){
    text = text.substring(text.indexOf('window.runParams = {'));
    text = text.substring(text.indexOf('data: {')+6);
    text = text.substring(0, text.indexOf('csrfToken'));
    text = text.substring(0, text.lastIndexOf(','));
    try{
        if(text.length > 0){
            return parseFloat(JSON.parse(text).shippingModule.freightCalculateInfo.freight.freightAmount.value);
        }
        else{
            return(0);
        }
    }
    catch(e){
        console.log(e);
        pagesearch = false;
        GM_config.set('pagesearch', false);
        return(0);
    }
}

async function getPageShipping(url){
    return new Promise((response) => {
        GM_xmlhttpRequest ( {
            method:     'GET',
            url:        url,
            onload:     function (responseDetails) {
                response(formatPageShipping(responseDetails.responseText));
            }
        } );
    });
}

function formatPrice(text){
    return [text.substring(0, text.indexOf('$') + 1), parseFloat(text.substring(text.indexOf('$') + 1))];
}

function findPrice(listitem){
    if(itemstype == 1){
        let pricerow = listitem.querySelector('div:nth-child(3) > div > div');
        if(pricerow){
            if(pricerow.innerHTML.substring(3).startsWith('$')){
                return formatPrice(pricerow.innerText).concat(pricerow);
            }
            else{
                let alldivs = listitem.querySelectorAll("div > div");
                for (let i = 0; i < alldivs.length; i++) {
                    if(alldivs[i].innerHTML.substring(3).startsWith('$')){
                        return formatPrice(alldivs[i].innerText).concat(alldivs[i]);
                    }
                }
            }
        }
        else{
            let alldivs = listitem.querySelectorAll("div > div");
            for (let i = 0; i < alldivs.length; i++) {
                if(alldivs[i].innerHTML.substring(3).startsWith('$')){
                    return formatPrice(alldivs[i].innerText).concat(alldivs[i]);
                }
            }
        }
    }
    else if(itemstype == 2){
        let pricerow = listitem.querySelector('div:nth-child(2) > div:nth-child(2)');
        if(pricerow){
            if(pricerow.innerText.substring(3).startsWith('$')){
                return formatPrice(pricerow.innerText).concat(pricerow);
            }
            else{
                let alldivs = listitem.querySelectorAll("div > div");
                for (let i = 0; i < alldivs.length; i++) {
                    if(alldivs[i].innerText.substring(3).startsWith('$')){
                        return formatPrice(alldivs[i].innerText).concat(alldivs[i]);
                    }
                }
            }
        }
        else if(pricerow = listitem.querySelector('div:nth-child(2) > div:nth-child(3)')){
            return formatPrice(pricerow.innerText).concat(pricerow);
        }
        else{
            let alldivs = listitem.querySelectorAll("div > div");
            for (let i = 0; i < alldivs.length; i++) {
                if(alldivs[i].innerText.substring(3).startsWith('$')){
                    return formatPrice(alldivs[i].innerText).concat(alldivs[i]);
                }
            }
        }
    }
}

function formatShipping(text){
    if(text.innerHTML.startsWith('+ Shipping')){
        text = parseFloat(text.innerText.substring(text.innerText.indexOf('$') + 1));
        return text;
    }
    else if(text.innerHTML.startsWith('Free Shipping')){
        return 0;
    }
    else{
        return -1;
    }
}

async function findShipping(listitem){
    let pricerow = listitem.querySelector('div > div:nth-child(2) > div:nth-child(3) > span:nth-child(1)');
    if(pricerow){
        let formattedShipping = formatShipping(pricerow);
        if(formattedShipping != -1){
            return formattedShipping;
        }
        else{
            let alldivs = listitem.querySelectorAll("div > span");
            for (let i = 0; i < alldivs.length; i++) {
                let formattedShipping = formatShipping(alldivs[i]);
                if(formattedShipping != -1){
                    return formattedShipping;
                }
            }
            if(pagesearch){
                let alla = listitem.querySelectorAll("img");
                for (let i = 0; i < alla.length; i++) {
                    return await getPageShipping(alla[i].parentNode.href);
                }
            }
            return 0;
        }
    }
    else{
        let alldivs = listitem.querySelectorAll("div > span");
        for (let i = 0; i < alldivs.length; i++) {
            let formattedShipping = formatShipping(alldivs[i]);
            if(formattedShipping != -1){
                return formattedShipping;
            }
        }
        if(pagesearch){
            let alla = listitem.querySelectorAll("img");
            for (let i = 0; i < alla.length; i++) {
                return await getPageShipping(alla[i].parentNode.href);
            }
        }
        return 0;
    }
}

async function process(listitem){
    if(listitem.getElementsByClassName('item-total-wrap').length <= 0){
        let price = findPrice(listitem);
        if(price){
            let shipping = await findShipping(listitem);
            let totalPrice = price[1];
            if(shipping){
                totalPrice += shipping;
                price[2].innerHTML = price[2].innerHTML + " (+ $" + shipping + " Shipping)";
            }
            totalPrice = totalPrice.toFixed(2);
            var finalcostdiv = document.createElement('div');
            finalcostdiv.style = "display: table-row;";
            finalcostdiv.className = 'item-total-wrap ' + price[2].className;
            var pricepretext = price[0];
            var finalcostpretext = document.createElement('span');
            finalcostpretext.className = 'total-pretext';
            finalcostpretext.innerHTML = "Total: " + pricepretext;
            var finalcostspan = document.createElement('span');
            finalcostspan.className = 'total-current';
            finalcostspan.innerHTML = totalPrice;
            finalcostdiv.appendChild(finalcostpretext);
            finalcostdiv.appendChild(finalcostspan);
            price[2].parentNode.style = "display: table;";
            price[2].style = "display: table-row;";
            price[2].parentNode.appendChild(finalcostdiv);
        }
        SortRows(sortmethod);
    }
}

var observer = new MutationObserver(function(mutations, me) {
    if(!sortingnow){
        mutations.forEach(function(mutation) {
            if(mutation.type == 'childList'){
                for (var j = 0; j < mutation.addedNodes.length; j++) {
                    process(mutation.addedNodes[j]);
                }
            }
        });
    }
    else{
        me.disconnect();
    }
});

function waitForEl(){
    var observera = new MutationObserver(function (mutations, me) {
        if(document.querySelector("div.product-container > div + div")) {
            me.disconnect();
            observer.observe(document.querySelector("div.product-container > div + div"), { childList: true });
            return;
        }
    });

    observera.observe(document, {
        childList: true,
        subtree: true
    });
}

function processall(list){
    for (var i = 0; i < list.length; i++) {
        process(list[i]);
    }
}

function createItem(link, imgsrc, title, storename, storelink, currencycode, price, shipping, itemstype2, extraitems) {
    var container = document.createDocumentFragment();
    if(itemstype2 == 1){
        let e_1 = document.createElement("div");
        e_1.setAttribute("class", "_1OUGS");
        let e_2 = document.createElement("a");
        e_2.setAttribute("class", "_9tla3");
        e_2.setAttribute("href", link);
        e_2.setAttribute("target", "_blank");
        let e_3 = document.createElement("img");
        e_3.setAttribute("src", imgsrc);
        e_3.setAttribute("class", "A3Q1M");
        e_3.setAttribute("alt", title);
        e_2.appendChild(e_3);
        let e_4 = document.createElement("div");
        let e_5 = document.createElement("div");
        e_5.setAttribute("class", "report-btn-wrap");
        let e_6 = document.createElement("span");
        e_6.setAttribute("class", "report-item");
        e_6.setAttribute("title", "Report fraud item");
        e_5.appendChild(e_6);
        e_4.appendChild(e_5);
        e_2.appendChild(e_4);
        e_1.appendChild(e_2);
        let e_7 = document.createElement("div");
        e_7.setAttribute("class", "atwl-btn-wrap");
        let e_8 = document.createElement("a");
        e_8.setAttribute("class", "_9tla3");
        e_8.setAttribute("href", link);
        e_8.setAttribute("target", "_blank");
        e_7.appendChild(e_8);
        let e_9 = document.createElement("a");
        e_9.setAttribute("class", "add-wishlist-btn");
        e_9.setAttribute("data-p4p", "true");
        let e_10 = document.createElement("i");
        e_10.setAttribute("data-p4p", "true");
        e_10.setAttribute("class", "next-icon next-icon-favourite next-medium");
        e_9.appendChild(e_10);
        e_7.appendChild(e_9);
        e_1.appendChild(e_7);
        let e_11 = document.createElement("div");
        e_11.setAttribute("class", "_3L3yc");
        let e_12 = document.createElement("div");
        e_12.setAttribute("class", "_2mXVg _89Qo8");
        let e_13 = document.createElement("a");
        e_13.setAttribute("class", "awV9E");
        e_13.setAttribute("target", "_blank");
        e_13.setAttribute("title", title);
        e_13.setAttribute("href", link);
        let e_14 = document.createElement("span");
        e_14.appendChild(document.createTextNode(title));
        e_13.appendChild(e_14);
        e_12.appendChild(e_13);
        e_11.appendChild(e_12);
        let e_15 = document.createElement("div");
        e_15.setAttribute("class", "_2mXVg");
        e_15.setAttribute("data-spm-anchor-id", "a2g0o.productlist.0.i9.356c179eF6Srjn");
        let pricepretext = document.createElement("span");
        pricepretext.setAttribute("class", "pricepretext");
        pricepretext.appendChild(document.createTextNode(currencycode + " $"));
        e_15.appendChild(pricepretext);
        let e_16 = document.createElement("span");
        e_16.setAttribute("class", "price-current");
        e_16.appendChild(document.createTextNode(price));
        e_15.appendChild(e_16);
        e_11.appendChild(e_15);
        let e_17 = document.createElement("div");
        e_17.setAttribute("class", "_2mXVg VoRWN");
        e_11.appendChild(e_17);
        let e_18 = document.createElement("div");
        e_18.setAttribute("class", "_2mXVg");
        let e_19 = document.createElement("span");
        e_19.setAttribute("class", "ZCLbI");
        e_11.appendChild(e_18);
        if(shipping == 0){
            e_19.appendChild(document.createTextNode("Free Shipping"));
        }
        else{
            e_19.appendChild(document.createTextNode("+ Shipping: " + currencycode + " $" + shipping));
        }
        e_18.appendChild(e_19);
        if(extraitems){
            for (let i = 0; i < extraitems.length; i++) {
                let extraitem = document.createElement("span");
                extraitem.setAttribute("class", "ZCLbI");
                extraitem.appendChild(document.createTextNode(extraitems[i]));
                e_11.appendChild(extraitem);
            }
        }
        let e_21 = document.createElement("div");
        e_21.setAttribute("class", "_1iaNr");
        e_11.appendChild(e_21);
        let totaldiv = document.createElement("div");
        totaldiv.setAttribute("class", "_2mXVg");
        let pretext = document.createElement("span");
        pretext.appendChild(document.createTextNode("Total: " + currencycode + " $"));
        pretext.setAttribute("class", "total-current _12A8D");
        let e_20 = document.createElement("span");
        e_20.setAttribute("class", "total-current _12A8D");
        e_20.appendChild(document.createTextNode((parseFloat(price) + parseFloat(shipping)).toFixed(2).toString()));
        pretext.appendChild(e_20);
        totaldiv.appendChild(pretext);
        e_11.appendChild(totaldiv);
        let e_22 = document.createElement("div");
        e_22.setAttribute("class", "_2mXVg");
        let e_23 = document.createElement("span");
        e_23.setAttribute("class", "_2jR_A");
        let e_24 = document.createElement("a");
        e_24.setAttribute("class", "_2lsU7");
        e_24.setAttribute("href", storelink);
        e_24.setAttribute("target", "_blank");
        e_24.appendChild(document.createTextNode(storename));
        e_23.appendChild(e_24);
        e_22.appendChild(e_23);
        e_11.appendChild(e_22);
        e_1.appendChild(e_11);
        container.appendChild(e_1);
    }
    else{
        let e_0 = document.createElement("div");
        e_0.setAttribute("class", "_2E_KG");
        let e_1 = document.createElement("a");
        e_1.setAttribute("class", "_9tla3");
        e_1.setAttribute("href", link);
        e_1.setAttribute("target", "_blank");
        let e_2 = document.createElement("img");
        e_2.setAttribute("src", imgsrc);
        e_2.setAttribute("class", "A3Q1M");
        e_2.setAttribute("alt", title);
        e_1.appendChild(e_2);
        let e_3 = document.createElement("div");
        let e_4 = document.createElement("div");
        e_4.setAttribute("class", "report-btn-wrap");
        let e_5 = document.createElement("span");
        e_5.setAttribute("class", "report-item");
        e_5.setAttribute("title", "Report fraud item");
        e_4.appendChild(e_5);
        e_3.appendChild(e_4);
        e_1.appendChild(e_3);
        e_0.appendChild(e_1);
        let e_6 = document.createElement("div");
        e_6.setAttribute("class", "atwl-btn-wrap");
        let e_7 = document.createElement("a");
        e_7.setAttribute("class", "_9tla3");
        e_7.setAttribute("href", link);
        e_7.setAttribute("target", "_blank");
        e_6.appendChild(e_7);
        let e_8 = document.createElement("a");
        e_8.setAttribute("class", "add-wishlist-btn");
        e_8.setAttribute("data-p4p", "true");
        let e_9 = document.createElement("i");
        e_9.setAttribute("data-p4p", "true");
        e_9.setAttribute("class", "next-icon next-icon-favourite next-medium");
        e_8.appendChild(e_9);
        e_6.appendChild(e_8);
        e_0.appendChild(e_6);
        let e_10 = document.createElement("div");
        e_10.setAttribute("class", "_2mXVg _3GzBz");
        let e_11 = document.createElement("div");
        e_11.setAttribute("class", "_2mXVg _89Qo8");
        let e_12 = document.createElement("a");
        e_12.setAttribute("class", "awV9E");
        e_12.setAttribute("target", "_blank");
        e_12.setAttribute("title", title);
        e_12.setAttribute("href", link);
        e_12.setAttribute("data-spm-anchor-id", "a2g0o.productlist.0.0");
        let e_13 = document.createElement("span");
        e_13.setAttribute("data-spm-anchor-id", "a2g0o.productlist.0.i8.7f62179etN8cvA");
        e_13.appendChild(document.createTextNode(title));
        e_12.appendChild(e_13);
        e_11.appendChild(e_12);
        e_10.appendChild(e_11);
        let e_14 = document.createElement("div");
        e_14.setAttribute("class", "_2mXVg VoRWN");
        e_10.appendChild(e_14);
        let e_15 = document.createElement("div");
        e_15.setAttribute("class", "_2mXVg");
        let pricepretext = document.createElement("span");
        pricepretext.setAttribute("class", "pricepretext");
        pricepretext.appendChild(document.createTextNode(currencycode + " $"));
        e_15.appendChild(pricepretext);
        let e_16 = document.createElement("span");
        e_16.setAttribute("class", "price-current");
        e_16.appendChild(document.createTextNode(price));
        e_15.appendChild(e_16);
        e_10.appendChild(e_15);
        let e_17 = document.createElement("span");
        e_17.setAttribute("class", "ZCLbI");
        if(shipping == 0){
            e_17.appendChild(document.createTextNode("Free Shipping"));
        }
        else{
            e_17.appendChild(document.createTextNode("+ Shipping: " + currencycode + " $" + shipping));
        }
        e_10.appendChild(e_17);
        if(extraitems){
            for (let i = 0; i < extraitems.length; i++) {
                let extraitem = document.createElement("span");
                extraitem.setAttribute("class", "ZCLbI");
                extraitem.appendChild(document.createTextNode(extraitems[i]));
                e_10.appendChild(extraitem);
            }
        }
        let e_18 = document.createElement("div");
        e_18.setAttribute("class", "_1iaNr");
        e_10.appendChild(e_18);
        let e_19 = document.createElement("span");
        e_19.setAttribute("class", "_2jR_A");
        let e_20 = document.createElement("a");
        e_20.setAttribute("class", "_2lsU7");
        e_20.setAttribute("href", storelink);
        e_20.setAttribute("target", "_blank");
        e_20.appendChild(document.createTextNode(storename));
        e_19.appendChild(e_20);
        e_10.appendChild(e_19);
        e_0.appendChild(e_10);
        let e_21 = document.createElement("div");
        e_21.setAttribute("class", "_2mXVg BAu5c");
        let e_22 = document.createElement("div");
        e_22.setAttribute("class", "_2mXVg");
        let pretext = document.createElement("span");
        pretext.setAttribute("class", "_12A8D");
        pretext.appendChild(document.createTextNode("Total: " + currencycode + " $"));
        let e_23 = document.createElement("span");
        e_23.setAttribute("class", "total-current _12A8D");
        e_23.appendChild(document.createTextNode((parseFloat(price) + parseFloat(shipping)).toFixed(2).toString()));
        e_22.appendChild(pretext);
        e_22.appendChild(e_23);
        e_21.appendChild(e_22);
        let e_24 = document.createElement("div");
        e_24.setAttribute("class", "_1iaNr");
        e_21.appendChild(e_24);
        e_0.appendChild(e_21);
        container.appendChild(e_0);
    }
    return container;
}

async function findShipping2(sellingpoints, link){
    if(sellingpoints){
        for (let i = 0; i < sellingpoints.length; i++) {
            if(sellingpoints[i].tagContent && sellingpoints[i].tagContent.tagText){
                if(sellingpoints[i].tagContent.tagText.indexOf("+ Shipping") != -1){
                    return parseFloat(sellingpoints[i].tagContent.tagText.substring(sellingpoints[i].tagContent.tagText.indexOf('$') + 1));
                }
                else if(sellingpoints[i].tagContent.tagText.indexOf("Free Shipping") != -1){
                    return 0;
                }
            }
        }
    }
    if(pagesearch){
        return await getPageShipping(link);
    }
    else{
        return 0;
    }
}

async function findExtras(sellingpoints){
    let extraitems = []
    if(sellingpoints){
        for (let i = 0; i < sellingpoints.length; i++) {
            if(sellingpoints[i].tagContent && sellingpoints[i].tagContent.tagText){
                if(sellingpoints[i].tagContent.tagText.indexOf("+ Shipping") == -1 && sellingpoints[i].tagContent.tagText.indexOf("Free Shipping") == -1){
                    extraitems.push(sellingpoints[i].tagContent.tagText);
                }
            }
        }
    }
    return extraitems;
}

function removeall(items, parent){
    for (let i = 0; i < items.length; i++) {
        parent.removeChild(items[i]);
    }
}

function appendall(items, parent){
    for (let i = 0; i < items.length; i++) {
        parent.appendChild(items[i]);
    }
}

async function waitforparams(){
    return new Promise((params) => {
        if(unsafeWindow.runParams){
            params(unsafeWindow.runParams);
        }
        else{
            setTimeout(waitforparams, 500);
        }
    });
}

async function getParams(){
    return new Promise((params) => {
        let retparams = waitforparams();
        params(retparams);
    });
}

async function processall3(){
    let runparams = await getParams();
    let allitems = runparams.mods.itemList.content;
    let currencycode = runparams.exposureParams.ship_to;
    let newitems = [];
    let itemstype2 = 1;
    if(document.location.href.indexOf('g=n') != -1){
        itemstype2 = 2;
    }
    for (let i = 0; i < allitems.length; i++) {
        let link = allitems[i].productDetailUrl, imgsrc = allitems[i].image.imgUrl, title = allitems[i].title.displayTitle, storename = allitems[i].store.storeName, storelink = allitems[i].store.storeUrl, price = allitems[i].prices.salePrice.minPrice, shipping = await findShipping2(allitems[i].sellingPoints, link);
        let extraitems = [];
        if(getextraitems){
            extraitems = await findExtras(allitems[i].sellingPoints);
        }
        newitems.push(createItem(link, imgsrc, title, storename, storelink, currencycode, price, shipping, itemstype2, extraitems));
    }
    let metaparent = document.querySelector("div.product-container > div");
    let parent = document.querySelector("div.product-container > div + div");
    let oldclassname = parent.className;
    parent.parentNode.removeChild(parent);
    let newparent = document.createElement("div");
    newparent.id = "listitems";
    newparent.className = oldclassname;
    appendall(newitems, newparent);
    metaparent.appendChild(newparent);
    SortRows(sortmethod);
}

async function sortall(listitems, sortmethod){
    if(unsafewindowmode == 1){
        sortingnow = true;
        observer.disconnect();
    }
    if(sortmethod == 1){
        await tinysort(listitems,{selector:'span.total-current', natural:true});
    }
    else if(sortmethod == 2){
        await tinysort(listitems,{selector:'span.total-current', natural:true});
    }
    else if(sortmethod == 3){
        await tinysort(listitems,{selector:'span.price-current', natural:true});
    }
    if(sortmethod == 4){
        await tinysort(listitems,{selector:'span.total-current', natural:true});
    }
    else if(sortmethod == 5){
        await tinysort(listitems,{selector:'span.price-current', natural:true, order: 'desc'});
    }
    if(unsafewindowmode == 1){
        sortingnow = false;
        observer.observe(document.querySelector("div.product-container > div + div"), { childList: true });
    }
}

function SortRows(sortmethod){
    if(unsafewindowmode == 1){
        sortall(document.querySelector("#listitems").childNodes,sortmethod);
    }
    else{
        if(itemstype == 1){
            sortall(document.querySelectorAll("div.product-container > div + div > div"),sortmethod);
        }
        else{
            sortall(document.querySelectorAll("div.product-container > div + div > a"),sortmethod);
        }
        fakeScrollDown();
    }
}

function insertsearch(){
    var sortdiv = document.createElement('div');
    sortdiv.className = 'sort-item';
    var sortspan = document.createElement('div');
    sortspan.className = 'sort-item';
    var sortspan2 = document.createElement('div');
    sortspan2.className = 'sort-item';
    var sortspan3 = document.createElement('div');
    sortspan3.className = 'sort-item';
    var sortspan4 = document.createElement('div');
    sortspan4.className = 'sort-item';
    var sortspan5 = document.createElement('div');
    sortspan5.className = 'sort-item';
    var sortchange = document.createElement('div');
    sortchange.id = 'sortchange1';
    sortchange.innerHTML = GM_config.fields.sortmode.settings.options[0].toString();
    sortchange.addEventListener("click", function () {
        SortRows(1);
    }, false);
    var sortchange2 = document.createElement('div');
    sortchange2.id = 'sortchange2';
    sortchange2.innerHTML = GM_config.fields.sortmode.settings.options[1].toString();
    sortchange2.addEventListener("click", function () {
        SortRows(2);
    }, false);
    var sortchange3 = document.createElement('div');
    sortchange3.id = 'sortchange3';
    sortchange3.innerHTML = GM_config.fields.sortmode.settings.options[2].toString();
    sortchange3.addEventListener("click", function () {
        SortRows(3);
    }, false);
    var sortchange4 = document.createElement('div');
    sortchange4.id = 'sortchange4';
    sortchange4.innerHTML = GM_config.fields.sortmode.settings.options[3].toString();
    sortchange4.addEventListener("click", function () {
        SortRows(4);
    }, false);
    var sortchange5 = document.createElement('label');
    sortchange5.id = 'sortchange5';
    sortchange5.innerHTML = GM_config.fields.sortmode.settings.options[4].toString() + ': ';
    var sortchange5t = document.createElement('input');
    sortchange5t.id = 'sortchange5t';
    sortchange5t.addEventListener("keydown", function () {
        SortRows(5);
    }, false);
    sortspan.appendChild(sortchange);
    sortspan2.appendChild(sortchange2);
    sortspan3.appendChild(sortchange3);
    sortspan4.appendChild(sortchange4);
    sortspan5.appendChild(sortchange5);
    sortspan5.appendChild(sortchange5t);
    sortdiv.appendChild(sortspan);
    sortdiv.appendChild(sortspan2);
    sortdiv.appendChild(sortspan3);
    sortdiv.appendChild(sortspan4);
    sortdiv.appendChild(sortspan5);
    var searchbox = document.querySelector(".sort-by-wrapper");
    if(searchbox){
        searchbox.appendChild(sortdiv);
        document.getElementById('sortchange' + sortmethod.toString()).setAttribute('style', 'font-weight: bold');
    }
}

function process2(item){
    if(item.className == "item-info"){
        if(item.querySelector("div.item-title.line-limit-length")){
            item.querySelector("div.item-title.line-limit-length").classList.remove('line-limit-length');
            item.parentNode.parentNode.style.height = "auto";
        }
    }
}

function checkall(list){
    for (var i = 0; i < list.length; i++) {
        process2(list[i]);
    }
}

var observer2 = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        if(mutation.type == 'childList'){
            for (var j = 0; j < mutation.addedNodes.length; j++) {
                checkall(mutation.addedNodes[j].childNodes);
            }
        }
    });
});

function waitForEl2(){
    var observerb = new MutationObserver(function (mutations, me) {
        if(document.querySelector(".item-title-block")) {
            me.disconnect();
            observer2.observe(document.querySelector(".bottom-recommendation"), { childList: true, subtree: true });
            return;
        }
    });

    observerb.observe(document, {
        childList: true,
        subtree: true
    });
}

function fakeScrollDown(){
    setTimeout((function(){
        window.scrollByPages(1);;
        if(window.scrollY < window.scrollMaxY){
            fakeScrollDown();
        }
        else{
            window.scrollTo(0,0);
        }
    }),100);
}

function docalctotal(){
    var itempageshipping = document.querySelector('.product-shipping-price');
    if(itempageshipping){
        itempageshipping = itempageshipping.innerText;
        if(itempageshipping.indexOf('Free Shipping') != -1){
            itempageshipping = '0.00';
        }
        itempageshipping = parseFloat(itempageshipping.substring(itempageshipping.indexOf('$')+1).trimEnd());
        var itempageprice = document.querySelector('.product-price-value');
        if(itempageprice){
            itempageprice = itempageprice.innerText;
            var preprice = itempageprice.substring(itempageprice.indexOf(':')+1, itempageprice.indexOf('$')+1);
            itempageprice = parseFloat(itempageprice.substring(itempageprice.indexOf('$')+1).trimEnd());
            var itempagetotal = parseFloat(itempageshipping + itempageprice).toFixed(2).toString();
            var finalcostpretext = document.createElement('span');
            finalcostpretext.className = 'total-pretext';
            finalcostpretext.innerHTML = "Total: " + preprice + itempagetotal;
            finalcostpretext.style.fontSize = "24px";
            finalcostpretext.style.fontWeight = "700";
            var finalcostdiv = document.createElement('div');
            finalcostdiv.className = 'total-current';
            finalcostdiv.appendChild(finalcostpretext);
            var insertitemtotal = document.querySelector('.product-action');
            if(insertitemtotal){
                var pretextitem = document.querySelector('.total-pretext');
                if(pretextitem){
                    pretextitem.innerHTML = "Total: " + preprice + itempagetotal;
                }
                else{
                    insertitemtotal.parentNode.insertBefore(finalcostdiv, insertitemtotal);
                }
                finalwishliststart(itempagetotal);
            }
        }
    }
}

function calctotal(){
    var proplist = document.querySelector('.sku-wrap');
    if(proplist && proplist.childNodes.length > 0){
        var proplistall = proplist.querySelectorAll('.sku-property');
        for (var i = 0; i < proplistall.length; i++) {
            var propitem = proplistall[i].querySelectorAll('.sku-property-item');
            if(propitem && propitem.length > 0){
                if(!propitem[0].classList.contains('selected')){
                    propitem[0].click();
                }
                for (var i2 = 0; i2 < propitem.length; i2++) {
                    propitem[i2].addEventListener('click', function() {
                        setTimeout((function(){
                            docalctotal();
                        }),1000);
                    });
                }
            }
        }
        setTimeout((function(){
            docalctotal();
        }),1000);
    }
    else{
        docalctotal();
    }
}

function getshippingdates(){
    var deliverydiv = document.querySelector('.product-shipping-delivery');
    if(deliverydiv){
        var shippingtime = deliverydiv.childNodes[1].innerText;
        var shippingtime1 = shippingtime.split('-');
        var shippingtime2 = shippingtime1[1];
        shippingtime1 = shippingtime1[0];
        var today = new Date();
        if(shippingtime2){
            let deliveryDateFrom = new Date(today.getTime() + (shippingtime1 * 24 * 60 * 60 * 1000)).toLocaleDateString();
            let deliveryDateTo = new Date(today.getTime() + (shippingtime2 * 24 * 60 * 60 * 1000)).toLocaleDateString();
            var finaldeliverydatepretext = document.createElement('span');
            finaldeliverydatepretext.className = 'date-pretext';
            finaldeliverydatepretext.innerHTML = "(" + deliveryDateFrom + " - " + deliveryDateTo + ")";
            var finaldeliverydate = document.createElement('div');
            finaldeliverydate.className = 'total-date';
            finaldeliverydate.appendChild(finaldeliverydatepretext);
            deliverydiv.parentNode.insertBefore(finaldeliverydate, deliverydiv.nextSibling);
        }
    }
}

function waitForEl3(){
    var observerc = new MutationObserver(function (mutation) {
        if(mutation[0].target.className == 'active') {
            GM_config.open();
            mutation[0].target.className = '';
            return;
        }
    });

    observerc.observe(document.querySelector("#ui-box-title"), {
        attributes: true
    });
}

function injecthiddencftrigger(){
    if(document.getElementsByClassName('sort').length > 0){
        let titlediv = document.createElement('div');
        let titletext = document.createElement('span');
        titletext.id = 'ui-box-title';
        titletext.style = 'font-weight: bold; cursor: pointer; padding-left: 20px';
        titletext.innerHTML = 'Configure Aliexpress Plus';
        titletext.addEventListener('click', function(e){
            let clicked = e.target || e.srcElement;
            clicked.classList.add('active');
        });
        titlediv.appendChild(titletext);
        document.getElementsByClassName('sort')[0].firstChild.appendChild(titlediv);
        waitForEl3();
        GM_registerMenuCommand("Configure", function (){document.querySelector("#ui-box-title").className = "active";});
    }
}

if(document.location.href.indexOf('/wholesale') != -1 || document.location.href.indexOf('/category') != -1 || document.location.href.indexOf('/af') != -1){
    injecthiddencftrigger();
    if(unsafewindowmode == 1){
        processall3();
    }
    else{
        waitForEl();
        let allitems = document.querySelectorAll("div.product-container > div + div > a");
        if(allitems.length > 0){
            processall(allitems);
        }
        else{
            itemstype = 1;
            allitems = document.querySelectorAll("div.product-container > div + div > div");
            processall(allitems);
        }
        fakeScrollDown();
    }
    insertsearch();
}
else if(document.location.href.indexOf('/item') != -1){
    waitForEl2();
    setTimeout((function(){
        checkall(document.querySelectorAll(".item-info"));
        calctotal();
        getshippingdates();
    }),2000);
}