Prisjakt BB-Kod

Lägger till knappar med BB-Kod på produktsidor och listor

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name		Prisjakt BB-Kod
// @namespace	OTzyVGxCfaZOhDmNIFa1
// @author		LemonIllusion
// @version		1.5.4
// @match		https://www.prisjakt.nu/*
// @description	Lägger till knappar med BB-Kod på produktsidor och listor
// ==/UserScript==

// Definiera variabler
var currURL = window.location.href; // Nuvarande sidas URL

// Produktklass
class Product {
    constructor(name, id, category = false, price = false, retailLink = false, retailer = false) {
        this.name = name;
        this.id = id;
        this.category = category;
        this.price = price;
        this.retailLink = retailLink;
        this.retailer = retailer;
    }

    getLink() {
        return '[url="https://www.prisjakt.nu/produkt.php?p=' + this.id + '"][b]' + this.name + "[/b][/url]";
    }

    getImage() {
        return '[url="https://www.prisjakt.nu/produkt.php?p=' + this.id + '"][img]https://cdn.pji.nu/product/standard/280/' + this.id + ".jpg[/img][/url]";
    }

    getBoth() {
        return '[url="https://www.prisjakt.nu/produkt.php?p=' + this.id + '"][b]' + this.name + "[/b]\n[img]https://cdn.pji.nu/product/standard/280/" + this.id + ".jpg[/img][/url]";
    }

    getTableRow(showCat = true) {
        var result = "[tr]";
        if (showCat && this.category) {
            result += '[td valign="middle"][b]' + this.category + "[/b][/td]";
        }
        result += '[td valign="middle"][center][url="https://www.prisjakt.nu/produkt.php?p=' + this.id + '"][img static]https://cdn.pji.nu/product/standard/50/' + this.id + ".jpg[/img][/url][/center][/td]";
        result += '[td valign="middle"][url="https://www.prisjakt.nu/produkt.php?p=' + this.id + '"]' + this.name + "[/url][/td]";
        if (this.retailLink && this.price && !this.retailer) {
            result += '[td valign="middle"][url="' + this.retailLink +'"]' + intFormat(this.price) + "[/url][/td]";
        } else {
            if (this.price) {
                result += '[td valign="middle"]' + intFormat(this.price) + "[/td]";
            }
            if (this.retailLink && this.retailer) {
                result += '[td valign="middle"][url="' + this.retailLink + '"]' + this.retailer + "[/url][/td]";
            } else if (this.retailLink) {
                result += '[td valign="middle"][url="' + this.retailLink + '"]Butik[/url][/td]';
            } else if (this.retailer) {
                result += '[td valign="middle"]' + this.retailer + "[/td]";
            }
        }
        result += "[/tr]";
        return result;
    }
}

// Definiera funktioner
function copyPopup(text) {
    var textarea = document.createElement("textarea");
    textarea.id = "copyPopup";
    textarea.spellcheck = false;
    textarea.innerHTML = text;
    textarea.style.cssText = "width: 50%; height: 50%; position: fixed; top: 25%; left: 25%; box-shadow: 0px 0px 0px 2000px rgba(0,0,0,0.6);";
    document.body.appendChild(textarea);
    textarea.select();
    setTimeout(function(){
        window.addEventListener("click", closePopup);
    }, 0);
}

function closePopup(e) {
    var textarea = document.querySelector("body>#copyPopup");
    if (e.target != textarea) {
        window.removeEventListener("click", closePopup);
        document.body.removeChild(textarea);
    }
}

function createButton(buttonText, clickAction, css = "", insertBefore = document.querySelector("#page_header .fr")) { // Funktion för att skapa en knapp
    var input = document.createElement("button");
    input.className = "btn product";
    input.innerHTML = buttonText;
    input.onclick = clickAction;
    input.style.cssText = "border-radius: 4px 4px 0 0; padding-bottom: 2px;"+css;
    insertBefore.parentNode.insertBefore(input, insertBefore);
}

function intFormat(integer) {
    return integer.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") + " :-"; // spaces are nbsp
}

function tablify(products, showCat = true, showSum = true) {
    var len = products.length;
    showSum = showSum && !!products[0].price;
    var sum = 0;

    table = "[table]";
    for (var i = 0; i < len; i++) {
        table += products[i].getTableRow(showCat);
        if (showSum) {
            sum += products[i].price;
        }
    }
    if (showSum) {
        table += "[tr][td][/td][td][/td][td][right][b]Summa:[/b][/right][/td][td]" + intFormat(sum) + "[/td][/tr]";
    }
    table += "[/table]";
    //console.log(table); //---------------------------------------------------DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG--DEBUG-----------------------------
    return table;
}

// Gör saker

if (currURL.split("?")[0] == "https://www.prisjakt.nu/produkt.php" && currURL.split("?")[1][0] != "j") { // Om nuvarande sida är en produktsida
    var product = new Product(
        document.getElementsByClassName("intro_header")[0].innerHTML, // namn
        document.getElementById("share_btn_top").getAttribute("data-page-item-id") // id
    );

    createButton("BB-Kod Länk", function(){ copyPopup(product.getLink()); }, "margin-left:31px");
    createButton("BB-Kod Bild", function(){ copyPopup(product.getImage()); }, "margin-left:6px");
    createButton("BB-Kod Länk och Bild", function(){ copyPopup(product.getBoth()); }, "margin-left:6px");
}

else if (currURL.split("?")[0] == "https://www.prisjakt.nu/list.php" || currURL.substring(0, 38) == "https://www.prisjakt.nu/produkt.php?j=" && currURL.split("https://www.prisjakt.nu/produkt.php?j=")[1] !== "") { // Om nuvarande sida är en lista eller jämförelse innehållandes produkter
    var products = [];
    var catPossible = true;

    if (currURL.substring(0, 38) == "https://www.prisjakt.nu/produkt.php?j=") { // Om sidan är en jämförelse
        var loopList = document.getElementById("div_produktegenskaper_jmf").getElementsByTagName("tr")[0].getElementsByTagName("th");
        for (i = 1; i < loopList.length; i++) { // Börja på ett för att första rutan inte innehåller någon produkt
            products.push(new Product(
                loopList[i].getElementsByTagName("h3")[0].getElementsByTagName("a")[0].innerHTML, // namn
                loopList[i].getElementsByTagName("h3")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                loopList[i].getElementsByClassName("category-name")[0].getElementsByTagName("a")[0].innerHTML // kategori
            ));
        }
    }
    else { // Om sidan är en lista
        if (document.getElementById("listviewpage-currentcontentheader").getElementsByClassName("sidebar-btn-delete")[0] !== undefined) {
            var owner = true;
        } else {
            var owner = false;
        }
        if (currURL.split("view=")[1] === undefined || currURL.split("view=")[1][0] == "l") { // Om view=l, lista, eller view inte är specificerad
            var loopList = document.getElementById("listviewpage-currentlistview").getElementsByClassName("list-row");
            if (owner) {
                for (i = 0; i < loopList.length; i++) {
                    products.push(new Product(
                        loopList[i].getElementsByClassName("span9-5")[0].getElementsByTagName("a")[0].innerHTML, // namn
                        loopList[i].getElementsByClassName("span9-5")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                        loopList[i].getElementsByClassName("muted")[0].getElementsByTagName("a")[0].innerHTML // kategori
                    ));
                }
            } else {
                for (i = 0; i < loopList.length; i++) {
                    products.push(new Product(
                        loopList[i].getElementsByClassName("prod")[0].innerHTML, // namn
                        loopList[i].getElementsByClassName("prod")[0].href.split('/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                        loopList[i].getElementsByClassName("span4")[0].innerHTML.slice(1, -1) // \n som första och sista tecken... // kategori
                    ));
                }
            }
        }
        else if (currURL.split("view=")[1][0] == "m" && owner) { // Om view=m, lista med bilder och listan är egenägd
            var loopList = document.getElementById("listviewpage-currentlistview").getElementsByClassName("list-row");
            for (i = 0; i < loopList.length; i++) {
                products.push(new Product(
                    loopList[i].getElementsByTagName("h4")[0].getElementsByTagName("a")[0].innerHTML, // namn
                    loopList[i].getElementsByTagName("h4")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                    loopList[i].getElementsByClassName("muted")[0].getElementsByTagName("a")[0].innerHTML // kategori
                ));
            }
        }
        else if (currURL.split("view=")[1][0] == "m" && !owner) { // Om view=m, lista med bilder och listan _inte_ är egenägd
            var loopList = document.getElementById("listviewpage-currentlistview").getElementsByClassName("list-row");
            for (i = 0; i < loopList.length; i++) {
                products.push(new Product(
                    loopList[i].getElementsByTagName("h4")[0].getElementsByTagName("a")[0].innerHTML, // namn
                    loopList[i].getElementsByTagName("h4")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                    loopList[i].getElementsByClassName("one-line")[0].innerHTML.split("\n")[0] // kategori
                ));
            }
        }
        else if (currURL.split("view=")[1][0] == "b" && owner) { // Om view=b, bilder och listan är egenägd
            catPossible = false;
            var loopList = document.getElementById("listviewpage-currentlistview").getElementsByClassName("list-row");
            for (i = 0; i < loopList.length; i++) {
                products.push(new Product(
                    loopList[i].getElementsByTagName("a")[0].innerHTML, // namn
                    loopList[i].getElementsByTagName("a")[0].href.split("/produkt.php?p=")[1] // id
                ));
            }
        }
        else if (currURL.split("view=")[1][0] == "b" && !owner) { // Om view=b, bilder och listan _inte_ är egenägd
            var loopList = document.getElementById("listviewpage-currentlistview").getElementsByClassName("list-row");
            for (i = 0; i < loopList.length; i++) {
                products.push(new Product(
                    loopList[i].getElementsByClassName("text_top")[0].getElementsByTagName("a")[0].innerHTML, // namn
                    loopList[i].getElementsByClassName("text_top")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                    loopList[i].getElementsByClassName("text_bottom")[0].getElementsByTagName("a")[0].innerHTML // kategori
                ));
            }
        }
        else if (currURL.split("view=")[1][0] == "c") { // Om view=c, jämför
            var loopList = document.getElementById("div_produktegenskaper_jmf").getElementsByTagName("tr")[0].getElementsByTagName("th");
            for (i = 1; i < loopList.length; i++) { // Börja på ett för att första rutan inte innehåller någon produkt
                products.push(new Product(
                    loopList[i].getElementsByTagName("h3")[0].getElementsByTagName("a")[0].innerHTML, // namn
                    loopList[i].getElementsByTagName("h3")[0].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                    loopList[i].getElementsByClassName("category-name")[0].getElementsByTagName("a")[0].innerHTML // kategori
                ));
            }
        }
        else if (currURL.split("view=")[1][0] == "o") { // Om view=o, prisoptimering
            var loopList = document.getElementById("list_items").getElementsByTagName("tr");
            for (i = 0; i < loopList.length; i++) {
                products.push(new Product(
                    loopList[i].getElementsByTagName("a")[1].innerHTML.split("</span>\n")[1].split("\n<span")[0], // namn
                    loopList[i].innerHTML.split('<a href="/produkt.php?p=')[1].split('"')[0].split("&")[0], // id
                    loopList[i].getElementsByClassName("muted")[0].innerHTML.split("(")[1].split(")")[0] // kategori
                ));
            }
            var optiProds = [];
            var lists = document.querySelectorAll("[id^=det_]");
            for (var i = 0; i < lists.length; i++) {
                optiProds.push([]);
                var loopList = lists[i].getElementsByClassName("no-borders");
                for (var j = 0; j < products.length; j++) {
                    var id = loopList[j].querySelector("a").href.split("/produkt.php?p=")[1];
                    var index = 0;
                    while (products[index].id != id) {
                        index++;
                    }
                    var tillButiken = loopList[j].querySelector(".btn.success"),
                        retailLink = false,
                        retailer = false;
                    if (tillButiken) {
                        retailLink = tillButiken.href;
                        retailer = tillButiken.title.slice(30);
                    } else {
                        retailer = loopList[j].parentNode.parentNode.parentNode.parentNode.querySelector("a").getAttribute("data-label"); // århundradets finaste rad som säkert inte fungerar i ff heller
                    }
                    optiProds[i].push(new Product(
                        products[index].name, // name
                        products[index].id, // id
                        products[index].category, // category
                        parseInt(loopList[j].querySelector(".price").innerHTML.replace(/\D/g,'')), // price
                        retailLink,
                        retailer
                    ));
                }
                lists[i].querySelector("tr").appendChild(document.createElement("th"));
                createButton("Hämta prisoptimering som BB-Kod", function() { copyPopup(tablify(optiProds[this])); }.bind(i), "", lists[i].querySelector(".text-right.strong"));
            }
        }
    }

    var grey = ";background: rgba(128,128,128,0.5); border-color: rgba(0, 0, 0, 0);";
    if (products.length) {
        createButton("BB-Kod med kategori", function() {
            if (catPossible) {
                copyPopup(tablify(products));
            } else {
                alert("Kategori är inte tillgängligt i det nuvarande visningsläget.");
            }
        }, "margin-left: 31px" + (catPossible ? "" : grey));
        createButton("BB-Kod utan kategori", function(){ copyPopup(tablify(products, false)); }, "margin-left: 6px");
    } else {
        createButton("BB-Kod med kategori", function(){ alert("Det finns inga produkter i den här listan."); }, "margin-left:31px" + grey);
        createButton("BB-Kod utan kategori", function(){ alert("Det finns inga produkter i den här listan."); }, "margin-left:6px" + grey);
    }
}