Prisjakt BB-Kod

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
    }
}