amazon_cross_meter

By azu_re Last update May 1, 2009 — Installed 489 times. Daily Installs: 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 2, 0, 1, 0, 0, 2, 2, 0, 1, 1, 0, 0, 1, 5, 3, 3, 1, 0, 0, 0, 3

There are 6 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("navSubnav")//td[@class="navSubnavCell"]/a[starts-with(text(),"機種") or starts-with(text(),"ジャンル")]')){
          var nodeTag = XPath.first(document, 'id("navSubnav")//td[@class="navSubnavCell"]/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") ? document.getElementById("ASIN").value : null;
        if (!asin) {
            return;
        }
        var genreID = getGenreID();
        //console.log(genreID);
        genreID = parseInt(genreID);
        //アマゾン(Amazon.co.jp)のブラウズノード(Browse Node)一覧 [ http://aws.pheelo.info/browse-node/ ]
        if(genreID == 465610 || genreID == 52231011){//本&洋書
          var XHRURL = BOOKMETER;
          var XHRURL_method = XHRURL + "/b/";
        }else if(genreID == 637872 || genreID == 637642){
          var XHRURL = GAMEMETER;
          var XHRURL_method = XHRURL + "/g/";
        }else{
         if(defalutURL){//読書メーター
          var XHRURL = BOOKMETER;
          var XHRURL_method = XHRURL + "/b/";           
         }else{
          var XHRURL = GAMEMETER;
          var XHRURL_method = XHRURL + "/g/";
         }           
        }
        
        var opt = {
            method : "get",
            url : XHRURL_method + asin,
            onload : function (detail) {
                
                var res = createHTMLDocument(detail.responseText);
                var reviewArea = res.getElementsByClassName("res_link_off");
                var reviewAreaNum = reviewArea.length;
                //邪魔な要素を隠す
                if(reviewAreaNum > 0){
                    for (var i = 0; i < reviewAreaNum ; i++) {
                        var aTags = reviewArea[i].parentNode.getElementsByTagName("a");
                        for (var j = 0, l = aTags.length; j < l; j++) {
                            var 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++) {
                            var 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 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);
            }
        };
        GM_xmlhttpRequest(opt);
    };
    GM_addStyle(<><![CDATA[
    #meter_content {
      overflow:auto;
      width:auto;
      max-height:200px;
      background-color:#f9f7ed;
      letter-spacing: 1px;
      margin:5px ;
      padding:1px;
      line-height:1.6;
    }
    #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 */
    }    
    ]]></>.toString().replace(/\${([^}]+)}/g, function(_, name) {
    if(name == 'base')
        return 'body > div.' + base_classname;
    else
        return classname_prefix + name;
})); 
requestCrossreview();

})();