amazon_cross_meter

By azu_re Last update Jun 14, 2011 — Installed 2,155 times.

There are 8 previous versions of this script.

// ==UserScript==
// @name           amazon_cross_meter
// @namespace      http://web.zgo.jp/
// @include        http://www.amazon.co.jp/*
// @description    Amazonの書籍ページに読書メーターの感想を表示
// ==/UserScript==
(function () {
    /* config */

    var defalutView = true;// レビューエリアの表示/非表示
    var defalutURL = true;// ジャンルがよく分からないときの場合、trueなら読書メーター、falseならゲームメーター
    var insertPoint = document.getElementById("handleBuy");//上の方に表示
    //var insertPoint = document.getElementById("customerReviews");//カスタマーレビューの位置に表示    

    /* end config */

    var GAMEMETER = "http://gamemeter.net";
    var BOOKMETER = "http://book.akahoshitakuya.com";
    var appear = "display:block;"
    var hidden = "display:none;"
    var contentView = defalutView;

    var XPath = {
        cache: null,
        reset: function () {
            this.cache = {__proto__: null};
        },
        get: function (context, expr, type) {
            var x = new XPathEvaluator();
            var cache = this.cache, evaluator;
            if (expr in cache) {
                evaluator = cache[expr];
            } else {
                evaluator = cache[expr] = x.createExpression(expr, null);
            }
            return evaluator.evaluate(context, type, null);
        },
        has: function (context, expr) {
            return this.get(context, expr, XPathResult.BOOLEAN_TYPE).booleanValue;
        },
        first: function (context, expr) {
            return this.get(context, expr, XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue;
        },
        last: function (context, expr) {
            var all = this.get(context, expr, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
            return all.snapshotItem(all.snapshotLength - 1) || null;
        },
        all: function (context, expr) {
            var all = this.get(context, expr, XPathResult.ORDERED_NODE_ITERAATE_TYPE);
            var ret = [];
            for (var i; (i = all.iterateNext()) !== null;) {
                ret.push(i);
            }
            return ret;
        }
    };
    XPath.reset();

    function createHTMLDocument(aText) {
        var xsl = (new DOMParser()).parseFromString(["<?xml version='1.0'?>",
            "<stylesheet version='1.0' xmlns='http://www.w3.org/1999/XSL/Transform'>", "<output method='html' />",
            "</stylesheet>"].join("\n"), "text/xml");
        var xsltp = new XSLTProcessor();
        xsltp.importStylesheet(xsl);
        var doc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));
        var range = doc.createRange();
        doc.appendChild(doc.createElement("html"));
        range.selectNodeContents(doc.documentElement);
        doc.documentElement.appendChild(range.createContextualFragment(aText));
        return doc;
    }

    function toggleButtonEventLiner() {
        var toggleArea = document.getElementById("meter_review_main");
        if (contentView) {//ボタンが内容が表示されてる時
            contentView = false;
            toggleArea.setAttribute("style", hidden);
        } else {
            contentView = true;
            toggleArea.setAttribute("style", appear);
        }
    }

    /* ジャンルID取得 */
    function getGenreID() {
        if (XPath.has(document, 'id("navSubnavRowTR")//td[@class="navSubItem"]/a[starts-with(text(),"機種") or starts-with(text(),"ジャンル")]')) {
            var nodeTag = XPath.first(document, 'id("navSubnavRowTR")//td[@class="navSubItem"]/a[starts-with(text(),"機種") or starts-with(text(),"ジャンル")]')
            if (nodeTag.getAttributeNode('href').value.match(/node=([^&\"]+)/)) {
                return RegExp.$1;
            }
        } else {
            return null
        }
    }

    requestCrossreview = function () {
        var asin = document.getElementById("ASIN");
        if (!asin) {
            return;
        }
        asin = asin.value;
        var genreID = getGenreID();
        ////console.log(genreID);
        genreID = parseInt(genreID, 10);
        //アマゾン(Amazon.co.jp)のブラウズノード(Browse Node)一覧 [ http://aws.pheelo.info/browse-node/ ]
        var XHRURL;
        var XHRURL_method;
        if (genreID == 465610 || genreID == 52231011) {//本&洋書
            XHRURL = BOOKMETER;
            XHRURL_method = XHRURL + "/b/";
        } else if (genreID == 637872 || genreID == 637642) {
            XHRURL = GAMEMETER;
            XHRURL_method = XHRURL + "/g/";
        } else {
            if (defalutURL) {//読書メーター
                XHRURL = BOOKMETER;
                XHRURL_method = XHRURL + "/b/";
            } else {
                XHRURL = GAMEMETER;
                XHRURL_method = XHRURL + "/g/";
            }
        }

        var opt = {
            method : "get",
            headers: {
                'User-Agent'  : 'Mozilla/4.0 (compatible) Greasemonkey',
                'Content-type': 'application/x-www-form-urlencoded'
            },
            url : XHRURL_method + asin,
            onload : function (detail) {
                var res = createHTMLDocument(detail.responseText);
                var reviewArea = res.getElementsByClassName("log_list_detail");
                var reviewAreaNum = reviewArea.length;
                //邪魔な要素を隠す
                if (reviewAreaNum > 0) {
                    for (var i = 0; i < reviewAreaNum; i++) {
                        var aTags = reviewArea[i].parentNode.getElementsByTagName("a");
                        var tmp;
                        for (var j = 0, l = aTags.length; j < l; j++) {
                            tmp = aTags[j].href;
                            tmp = XHRURL + tmp;
                            aTags[j].href = tmp;
                        }
                        var imgTags = reviewArea[i].parentNode.getElementsByTagName("img");
                        for (var j = 0, l = imgTags.length; j < l; j++) {
                            tmp = imgTags[j].src;
                            tmp = XHRURL + tmp;
                            imgTags[j].src = tmp;
                            imgTags[j].setAttribute("style", "border: 0px!important;");
                        }
                        var spanTags = reviewArea[i].parentNode.getElementsByTagName("span");
                        for (var j = 0, l = spanTags.length; j < l; j++) {
                            spanTags[j].setAttribute("style", "display:none;");
                        }
                        var divTags = reviewArea[i].parentNode.getElementsByTagName("div");
                        for (var j = 0, l = divTags.length; j < l; j++) {
                            divTags[j].removeAttribute("style");
                        }
                    }
                }
                //console.log(res);
                var divTag = document.createElement("div");
                divTag.id = "meter_review";
                var divTagMain = document.createElement("div");
                divTagMain.id = "meter_review_main";
                var toggleButton = <>
                    <div class="meter_review_button" id ="toggleButton">
                        <span id="meter_review__value">感想はありません</span>
                    </div>
                </>;
                divTag.innerHTML = toggleButton + '<a href ="' + XHRURL_method + asin + '"><img src="' + XHRURL + '/image/favicon.ico" style="border: 0px;padding: 5px 0 5px 0;" /></a><br style="clear:both;" />';

                var divReviewContent = document.createElement("div");
                divReviewContent.id = "meter_content";
                if (reviewAreaNum > 0) {
                    if (defalutView) {
                        contentView = true;
                        divTagMain.setAttribute("style", appear);
                    } else {
                        contentView = false;
                        divTagMain.setAttribute("style", hidden);
                    }
                    var i = 0
                    for (var i = 0; i < reviewAreaNum; i++) {
                        var tmpObj = reviewArea[i].parentNode.cloneNode(true);
                        divReviewContent.appendChild(tmpObj);
                    }
                } else {
                    contentView = false;
                    divTagMain.setAttribute("style", hidden);
                }


                divTagMain.appendChild(divReviewContent);
                divTag.appendChild(divTagMain);
                insertPoint.insertBefore(divTag, insertPoint.firstChild);

                var button = document.getElementById("toggleButton");
                if (reviewAreaNum > 0) {
                    button.getElementsByTagName("span")[0].innerHTML = reviewAreaNum + "件の感想"
                }
                button.addEventListener("click", toggleButtonEventLiner, false);
            },
            onerror : function(detail) {
                //console.log(detail);
            },

        };
        //console.log("test");
        GM_xmlhttpRequest(opt);
    };
    GM_addStyle(String(<>
        <![CDATA[
    #meter_content {
      overflow:auto;
      width:auto;
      max-height:200px;
      background-color:#f9f7ed;
      letter-spacing: 1px;
      margin:5px ;
      padding:1px;
      line-height:1.1;
    }
    #meter_review_main{
        border:solid 1px #919191;
        padding:1px;
        background-color:#f9f7ed;
        -moz-border-radius:10px;
    }
    .clear { /* generic container (i.e. div) for floating buttons */
        overflow: hidden;
        width: 100%;
    }
    #meter_review{
       margin:5px 33px;
    }
    div.meter_review_button {
        background: transparent url('data:image/gif;base64,R0lGODlhEgAwANUAAPj4+PX19dnZ2fLy8tHR0fv7++7u7re3t9jY2NbW1tPT09fX1/39/dDQ0Obm5uzs7Onp6c/Pz8zMzM7Oztzc3MXFxa+vr6ysrK2trc3NzcnJycLCwtLS0sjIyODg4L+/v/Dw8MrKytXV1cTExPz8/Lq6ut7e3tra2vr6+u/v79TU1Nvb2+Li4uvr66qqqurq6uHh4efn5+Tk5N/f393d3f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAASADAAAAb/QJdwiDlUFo+acslckgYyjkXSalqZKNqBcu3WQJeF9xq4cMdN0KGKZtIkNYZ8Tq8DLI+Cfs/vFxoLAIKDhIUAMxUBiouMjQEvBwOSk5SVAykYBpqbnJ0GLRgvoqOkpS8eBzGqq6ytMSoVMrKztLUyRzC5uru8JngzwMHCwyFwNMfIyckqazXKz8cLZkrQyiphS9XHJx1bbsorIhkbU2xLQ0RGSFfoQkVHSVYZ8/QSHRsl5U0T/P3+Eh+8LYlAsKBBghqwKWnAsKHDhhKm1SBAsaJFiyGaKdjIsaPHDXBUiBxJsiQBPAlSqlzJMsGHBQhiypxJE4GGCgJy6tzJUwCHXgMrggodSnSFAAzaoK3AMKzpsAUHeEnl1aACi6tYs2plMWKBra+yPOBxQLas2bMT4LhaG4NCMwhw48qNy0KiKVMzFNZowbev3xgEBCp5QLgwBBYLNOhj0s7Fu3VWggAAOw==') no-repeat scroll top right;
        color: #444;
        display: block;
        float: left;
        font: normal 12px arial, sans-serif;
        height: 24px;
        margin-right: 6px;
        padding-right: 18px; /* sliding doors padding */
        text-decoration: none;
    }

    div.meter_review_button span {
        background: transparent url('data:image/gif;base64,R0lGODlhLAEwANUAANbW1tjY2NHR0e7u7vv7+9DQ0NPT0+bm5v39/ezs7Onp6c/Pz87Ozs3Nzbe3t9fX18zMzNzc3MXFxaysrK2tra+vr8nJycLCwsrKytLS0r+/v/Dw8ODg4MjIyNra2tXV1d7e3rq6usTExO/v7/z8/Pr6+vj4+PX19fLy8tnZ2dTU1Nvb2+Li4uvr6+rq6uHh4efn5+Tk5N/f36qqqt3d3f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAsATAAAAb/wJpwWEs8JA7KbMlsOp/QqHRKrVqv2Kx2y+16v+AqsdaCVDIxFGnMbrvf8Lh8Tq/b7/i8fs/v+4URDjQlf4WGh4iJiouMjQ8TG42Sk5SVlpeUERMnmJ2en6Chki0OkaKnqKmqqhA0q6+wsbKGCRUmCLi5uru8vb6/wMHCw8TFxsfIycrLzM3LDwUE0tPU1dbX2Nna29zd3t/g4eLj5OXm5+YSMibs7e7v8PHy8/T19vf4+fr7/P3+/wADAnTg4oTBgwgTKlzIsKHDhxAjSpxIsaLFixgzatyokcIIFCBDihxJsqTJkyhTqlzJsqXLlzBjypxJsyZNCi0G6NzJs6fP/59AgwodSrSo0aNIkypdyrSp06dOHXBwQbWq1atYs2rdyrWr169gw4odS7as2bNo06KVoAKG27dw48qdS7eu3bt48+rdy7ev37+AAwseLPhIjMOIEytezLix48eQI0ueTLmy5cuYM2vezHlzLRAvQoseTbq06dOoU6tezbq169ewY8ueTbu2bdo1IGCQwbu379/AgwsfTry48ePIkytfzry58+fQoz8n40AFjevYs2vfzr279+/gw4sfT768+fPo06tfzz49oAkP2sufT7++/fv48+v/PuSR9f0ABijggAQWuB8RgXTggYEMNujggxDiN0YZFVzQwAcrRKjhhhx22P9gG0YgoUQYJJZo4okopqjiiiwuAeIRSbQo44w01mjjjShOaEYIF3QAQQNABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFapJIIOaAABA1x26eWXYIYp5phklmnmmWimqeaabLbp5ptwxqlmfxNYsMCdeOap55589unnn4AGKuighBZq6KGIJqrooowe+h4EBUQq6aSUVmrppZhmqummnHbq6aeghirqqKSWaqqo1GEgwKqsturqq7DGKuustNZq66245qrrrrz26uuvwPaa2wUGFGvsscgmq+yyzDbr7LPQRivttNRWa+212GarLba1CKDCt+CGK+645JZr7rnopqv/7rrstuvuu/DGK++89Mr7gAYA5Kvvvvz26++/AAcs8MAEF2zwwQgnrPDCDDfscMMSWBDAxBRXbPHFGGes8cYcd+zxxyCHLPLIJJds8skon+xABim07PLLMMcs88w012zzzTjnrPPOPPfs889ABy100BSksMLRSCet9NJMN+3001BHLfXUVFdt9dVYZ6311lxvTUGGHoYt9thk0+fAA9KlrfbabLft9ttwx32cBAXcZvfdeOet99589+03aw+IwMLghBdu+OGIJ6744ow37vjjkEcu+eSUV2755ZhfXgsHnXXu+eeghy766KSXHlluDByg+uqst+7667DHLvvstNduqPvtuOeu++689+77771TFwFhxBdv/PHIJ6/88szf9R4LCkQv/fTUV2/99dhnr/323Hfv/ffghy/++OSXb774dMqg1vrst+/++/DHL//8W2EpAAwt5K///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgDqqgAUeAL0EWPCCGMygBjfIwQ568IMgDKEIR0jCEprwhChMoQpXCMIXiQhHMIyhDGdIQxMFAQA7') no-repeat;
        display: block;
        line-height: 14px;
        padding: 5px 0 5px 18px;

    }     
    div.meter_review_button:active {
        background-position: bottom right;
        color: #000;
        outline: none; /* hide dotted outline in Firefox */
    }
    div.meter_review_button:hover {
          cursor:pointer;
    }
    div.meter_review_button:active span {
        background-position: bottom left;
        padding: 6px 0 4px 18px; /* push text down 1px */
    }
    #meter_content .log_list_user_image{
        float:left;
        margin: 0 5px 0 0;
    }
    ]]></>));
    requestCrossreview();

})();