// ==UserScript==
// @name bro3_syokanBox
// @version 2.04
// @namespace http://twitter.com/utoutouuto
// @include http://*.3gokushi.jp/message/*
// @include http://*.3gokushi.jp/user/*
// @description ブラ三:書簡保存&検索ツール
// ==/UserScript==
//----更新履歴----
// ver1.00 2010-08-08:初回作成
// ver1.01 2010-08-09:書簡の自動保存機能付加
// ver1.02 2010-08-10:運営書簡の検索対象外機能付加
// ver1.03 2010-08-14:書簡表示方式変更、簡易再検索機能付加
// ver2.00 2010-09-28:mixiレイアウト変更対応、保存書簡出力機能付加
// ver2.01 2010-11-29:最初にGM変数等のチェック付加、返信マーク対応、指定ワールド情報のリセット対応
// ver2.02 2011-04-28:GM_addStyleにCDATAセクションを使用しないように修正
// ver2.03 2011-05-01:全員に返信機能、送信先リスト機能付加
// ver2.03 2011-12-05:トレード書簡は一覧に落札額を表示
// ver2.04 2012-01-12:ユーザ画面のレイアウト変更対応
( function(){
////////////////////////////////////////////////////////
// 変数定義
////////////////////////////////////////////////////////
var d = document;
var $ = unsafeWindow.jQuery;
var $xp = function (xp, dc) { return d.evaluate(xp, dc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); };
var $xp1 = function (xp, dc) { return d.evaluate(xp, dc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; };
var location_inboxURL = "/message/inbox.php";
var location_outboxURL = "/message/outbox.php";
var location_newURL = "/message/new.php";
var location_userURL = "/user/";
var uneiLimitTxt = "ブラウザ三国志運営チーム";
var pageUnit = 12;
var worldKey = location.hostname;
var hrefArray = []; // [[書簡ID, URL]]
// 以下、GM変数
var syokanIdArray = []; // キャッシュ済みの書簡IDの配列
var soushinsyaArray = {}; // {ID: soushinsya}
var atesakiArray = {}; // {ID: atesaki}
var kenmeiArray = {}; // {ID: kenmei}
var nichijiArray = {}; // {ID: nichiji}
var opValues = {}; // {autoCash: true/false, uneiLimit: true/false, userName: xxxx}
var newPageMode = {}; // {mode: resAll, syokanId: xxxxx}
////////////////////////////////////////////////////////
// ページ読み込み完了を待たない処理
////////////////////////////////////////////////////////
// 対象ページでない場合処理中断
if (!(location.pathname == location_inboxURL
|| location.pathname == location_outboxURL
|| location.pathname == location_newURL
|| location.pathname == location_userURL )) { return; }
// 各種チェック
if (!pre_check()) {
// 確認用
//alert("初期チェックでエラー。要ログ確認")
return;
}
function pre_check() {
if (!worldKey) { console.log("ワールドキー取得エラー"); return false; }
var time_checker = new Date().toString();
GM_setValue(worldKey + "time_checker", time_checker.toSource());
var res_time_checker = eval(GM_getValue(worldKey + "time_checker", ""));
if (time_checker != res_time_checker) {
console.log("GM変数の利用エラー");
console.log(" :" + time_checker);
console.log(" :" + res_time_checker);
return false;
}
if (!$) { console.log("jquery取得エラー"); return false; }
return true;
}
// GM変数ロード
loadOpValues();
loadCmValue();
// ページ読み込み完了後に本処理開始
window.addEventListener("load", function() { pre_main(); }, false);
////////////////////////////////////////////////////////
// ページ読み込み完了後に起動する処理
// 受信・送信履歴画面
// 1.ボタン付加
// 2.autoCashオプションが有効な場合、書簡キャッシュ処理を稼働。
// 新規書簡画面
//
// 君主情報画面
//
////////////////////////////////////////////////////////
function pre_main() {
if (location.pathname == location_inboxURL || location.pathname == location_outboxURL) {
addBtnMain();
if (opValues["autoCash"]) {
syokanCashMain();
}
} else if (location.pathname == location_newURL) {
loadNewPageMode();
newMessagePageMain();
} else if (location.pathname == location_userURL) {
userPageMain();
}
newPageMode = {};
saveNewPageMode();
}
////////////////////////////////////////////////////////
// 君主情報画面処理
////////////////////////////////////////////////////////
function userPageMain() {
if(location.search == "") {
var userName = $xp1('//table[@class="commonTables"]/tbody/tr[2]/td[2]', d).innerHTML;
setUserName(userName);
} else {
var targetNode = $xp1('//table[@class="commonTables"]/tbody/tr[1]/th[1]', d);
var addLordBtn = d.createElement("input");
addLordBtn.type = "button";
addLordBtn.id = "addLordBtn";
addLordBtn.value = "【よく使う書簡先に登録】";
addLordBtn.addEventListener("click", function() {
addLord();
}, false);
targetNode.appendChild(addLordBtn);
}
}
function addLord() {
loadLordValues();
var userName = $xp1('//table[@class="commonTables"]/tbody/tr[2]/td[2]', d).innerHTML;
var alliance = rmTag($xp1('//table[@class="commonTables"]/tbody/tr[4]/td[5]', d).innerHTML);
var position = $xp1('//table[@class="commonTables"]/tbody/tr[5]/td[4]', d).innerHTML.replace(/[\n\r\t]/g, "");
var note = "-";
if (!!lordInfoMap[userName]) {
note = lordInfoMap[userName][3];
}
note = prompt("説明文を付加する場合はご記入下さい。", note);
if (!note) { return; }
lordInfoMap[userName] = [ userName, alliance, position, note ];
saveLordValues();
alert(userName + "を登録しました。");
}
// よく使う書簡先用
var lordInfoMap = {}; // { userName: [君主名, 同盟名, 役職, 備考] }
function loadLordValues() {
lordInfoMap = eval(GM_getValue(worldKey + "lordInfoMap", {}));
}
function saveLordValues() {
GM_setValue(worldKey + "lordInfoMap", lordInfoMap.toSource());
}
function setUserName(userName) {
opValues["userName"] = userName;
saveOpValues();
}
function getUserName() {
return opValues["userName"];
}
////////////////////////////////////////////////////////
// 新規書簡画面処理
////////////////////////////////////////////////////////
function newMessagePageMain() {
if (!!newPageMode["mode"] && !!newPageMode["syokanId"]) {
if (newPageMode["mode"] == "resAll") {
setResAll();
}
}
loadLordValues();
addToLordBtn();
}
function addToLordBtn() {
if ($xp1('//input[@name="to"]', d).type == "hidden") { return; }
var targetNode = $xp1('//input[@name="to"]', d).parentNode;
var addToBtn = d.createElement("input");
addToBtn.type = "button";
addToBtn.id = "addToBtn";
addToBtn.value = "▲ 送信先リスト";
addToBtn.addEventListener("click", function() {
addToLordHTML();
}, false);
targetNode.appendChild(addToBtn);
}
function addToLordHTML() {
var targetNode = $xp1('//ul[@id="statMenu"]', d);
var baseEL = $xp1('//div[@id="bro_toLord_base"]', d);
if (!!baseEL) { targetNode.removeChild(baseEL); return; }
baseEL = d.createElement("div");
baseEL.id = "bro_toLord_base";
targetNode.insertBefore(baseEL, targetNode.nextNode);
var css = " table.showTable { border: 2px solid black; border-collapse: collapse; margin: 5px; }" +
" .showTable th { border: 2px solid black; border-collapse: collapse; color: white; background-color: gray; padding : 2px; }" +
" .showTable td { border: 2px solid black; border-collapse: collapse; color: black; background-color: white; padding : 2px; }";
GM_addStyle(css);
var tableEL = d.createElement("table");
tableEL.className = "showTable";
var trEL = d.createElement("tr");
var thEL = d.createElement("th");
var tdEL = d.createElement("td");
tdEL.style.padding = "5px";
thEL.innerHTML = "No";
thEL.style.width = "20px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "君主名";
thEL.style.width = "120px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "同盟名";
thEL.style.width = "120px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "役職";
thEL.style.width = "80px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "備考";
thEL.style.width = "250px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "登録解除";
thEL.style.width = "60px";
trEL.appendChild(thEL.cloneNode(true));
tableEL.appendChild(trEL.cloneNode(true));
var len=0;
for(var key in lordInfoMap){ len++; }
if (len == 0) {
var data_trEL = d.createElement("tr");
var data_thEL = d.createElement("th");
var data_tdEL = d.createElement("td");
data_tdEL.colSpan = 5;
data_tdEL.innerHTML = "※登録者は存在しません。";
data_tdEL.align = "center";
data_trEL.appendChild(data_thEL);
data_trEL.appendChild(data_tdEL);
tableEL.appendChild(data_trEL);
} else {
var i = 1;
for (var key in lordInfoMap) {
var userName = lordInfoMap[key][0];
var alliance = lordInfoMap[key][1];
var position = lordInfoMap[key][2];
var note = lordInfoMap[key][3];
var trEL = d.createElement("tr");
var thEL = d.createElement("th");
var tdEL = d.createElement("td");
var data_tdBtnEL = d.createElement("td");
data_tdBtnEL.style.backgroundColor = "#dfffff";
thEL.innerHTML = i++;
trEL.appendChild(thEL.cloneNode(true));
data_tdBtnEL.innerHTML = userName;
data_tdBtnEL.addEventListener("click", returnAddAtesaki(userName), false);
trEL.appendChild(data_tdBtnEL);
tdEL.innerHTML = alliance;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = position;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = note;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = "";
var delBtn = d.createElement("input");
delBtn.type = "button";
delBtn.id = "delBtn";
delBtn.value = "【削除】";
delBtn.addEventListener("click", returnDelMap(key), false);
tdEL.appendChild(delBtn);
trEL.appendChild(tdEL);
tableEL.appendChild(trEL);
}
}
baseEL.appendChild(tableEL);
function returnAddAtesaki(addName) {
return function () {
var atesaki = $xp1('//input[@name="to"]', d).value;
if (atesaki == "") {
atesaki = addName;
} else {
var atesakiArray = atesaki.split(",");
for (var i = 0, len = atesakiArray.length; i < len; i++) {
if (addName == atesakiArray[i]) { return; }
}
atesaki = atesaki + "," + addName;
}
$xp1('//input[@name="to"]', d).value = atesaki;
};
}
function returnDelMap(key) {
return function () {
if (!confirm("【確認】" + key + "の登録を解除しますか?")) { return; }
addToLordHTML();
delete lordInfoMap[key];
saveLordValues();
addToLordHTML();
};
}
}
function setResAll() {
var syokanId = newPageMode["syokanId"];
var soushinsya = soushinsyaArray[syokanId];
var atesaki = atesakiArray[syokanId];
var newAtesaki = "";
if (atesaki == "/ALLY") {
if (confirm("【確認】盟員全員に返信?")) {
newAtesaki = atesaki;
} else {
return;
}
} else {
newAtesaki = makeResAll(soushinsya, atesaki);
}
$xp1('//input[@name="to"]', d).value = newAtesaki;
}
function makeResAll(soushinsya, atesaki){
var userName = getUserName();
var resAtesaki = "";
var atesakiArray = (new Array(soushinsya)).concat(atesaki.split(","));
for (var i = 0, len = atesakiArray.length; i < len; i++) {
var tmp = rmTag(atesakiArray[i]);
if (tmp == userName) { continue; }
if (resAtesaki == "") {
resAtesaki = tmp;
} else {
resAtesaki = resAtesaki + "," + tmp;
}
}
return resAtesaki;
}
function rmTag(txt) {
var fillterEL = d.createElement('div');
fillterEL.innerHTML = txt;
return $xp1("descendant::a", fillterEL).innerHTML;
}
////////////////////////////////////////////////////////
// ボタン付加
////////////////////////////////////////////////////////
function addBtnMain() {
var targetNode = $xp1('//ul[@id="statMenu"]', d);
var cashBtn = d.createElement("input");
cashBtn.type = "button";
cashBtn.id = "cashBtn";
cashBtn.value = "【書簡保存】";
cashBtn.addEventListener("click", function() {
cashBtn.disabled = true;
if (confirm("現ページに表示されている書簡情報を保存します。")) {
syokanCashMain();
} else {
cashBtn.disabled = false;
}
}, false);
// 自動キャッシュ有効時はボタン非活性
if (opValues["autoCash"]) { cashBtn.disabled = true; }
targetNode.appendChild(cashBtn);
var introBtn = d.createElement("input");
introBtn.type = "button";
introBtn.id = "introBtn";
introBtn.value = "【書簡検索】";
introBtn.addEventListener("click", function() {
cashBtn.disabled = true;
introBtn.disabled = true;
addOpBtn.disabled = true;
searchModeMain();
}, false);
targetNode.appendChild(introBtn);
var addOpBtn = d.createElement("input");
addOpBtn.type = "button";
addOpBtn.id = "addOpBtn";
addOpBtn.value = "【設定】";
addOpBtn.addEventListener("click", function() {
cashBtn.disabled = true;
introBtn.disabled = true;
addOpBtn.disabled = true;
addOpMain();
}, false);
targetNode.appendChild(addOpBtn);
}
////////////////////////////////////////////////////////
// 未キャッシュの書簡情報をキャッシュ
// 自動キャッシュの場合は確認メッセージ非活性
////////////////////////////////////////////////////////
function syokanCashMain() {
var linkNodes = $xp('//table[@class="commonTables"]/tbody/tr/td[2]/a', d);
// 未キャッシュIDのURLを格納
for (var i = 0, len = linkNodes.snapshotLength; i < len; i++ ) {
var href = linkNodes.snapshotItem(i).href;
if (href == null) { continue; }
var syokanId = href.match("id=[0-9]+")[0].split("=")[1];
if (syokanId == null) { continue; }
// 返信済みマークがある場合、保存件名をチェック
var henshinImg = $xp1('descendant::img[@alt="返信済"]',linkNodes.snapshotItem(i).parentNode);
if (!!henshinImg) {
if (!checkKenmeiCash(syokanId)) {
hrefArray.push([syokanId, href]);
continue;
}
}
if (checkIdCash(syokanId)) { continue; }
hrefArray.push([syokanId, href]);
}
if (hrefArray.length <= 0) {
if (!opValues["autoCash"]) { alert("新しい保存対象はありません。"); }
return;
}
// 実行中表示レイヤー
var layer = d.createElement("div");
layer.id = "cash_layer";
layer.style.backgroundColor = "#202020";
layer.style.position = "fixed";
layer.style.zIndex = 1;
layer.style.width = "100%";
layer.style.height = "100%";
layer.style.opacity = 0.9;
var explain = d.createElement("div");
explain.id = "cash_explain";
explain.style.backgroundColor = "white";
explain.style.marginTop = "100px";
explain.style.padding = "20px";
explain.style.width = "100%";
explain.innerHTML = "書簡保存処理実行中 " + 1 + "/" + hrefArray.length;
layer.appendChild(explain);
var targetNode = $xp1('//body', d);
targetNode.insertBefore(layer, targetNode.firstChild);
loadPage(0);
}
// 該当IDがキャッシュ済みならtrueを返す
function checkIdCash(syokanId) {
for (var i in syokanIdArray) {
if (syokanIdArray.hasOwnProperty(i) && syokanIdArray[i] == syokanId){ return true; }
}
return false;
}
// 該当IDの保存件名にimgタグが含まれていればtrueを返す
function checkKenmeiCash(syokanId) {
var fillterEL = d.createElement('div');
fillterEL.innerHTML = kenmeiArray[syokanId];
var henshinImg = $xp1('descendant::img[@alt="返信済"]', fillterEL);
if (!!henshinImg) { return true; }
return false;
}
// loadNoにより同期処理させる
function loadPage(loadNo, res) {
var opt = {
method: 'get',
url: hrefArray[loadNo][1],
onload: function(res) {
addSyokanCash(loadNo, res);
}
};
GM_xmlhttpRequest(opt);
}
function addSyokanCash(loadNo, res) {
var syokanId = hrefArray[loadNo][0];
var fillterEL = d.createElement('div');
fillterEL.innerHTML = res.responseText;
var syokanTable = $xp1('descendant::table[@class="commonTables"]', fillterEL);
var soushinsya = $xp1('descendant::td[1]/div', syokanTable).innerHTML;
var atesaki = $xp1('descendant::td[2]', syokanTable).innerHTML;
var nichiji = $xp1('descendant::td[3]', syokanTable).innerHTML;
var kenmei = $xp1('descendant::td[4]', syokanTable).innerHTML;
var honbun = $xp1('descendant::td[5]', syokanTable).innerHTML;
// 未登録の書簡IDの場合は追加
if (!checkIdCash(syokanId)) { syokanIdArray.push(syokanId); }
soushinsyaArray[syokanId] = soushinsya;
atesakiArray[syokanId] = atesaki;
kenmeiArray[syokanId] = kenmei;
nichijiArray[syokanId] = nichiji;
saveHonbunValue(syokanId, honbun);
if (loadNo + 1 >= hrefArray.length) {
saveCmValue();
if (!opValues["autoCash"]) { alert("書簡保存が終了しました。"); }
var layer = $xp1('//div[@id="cash_layer"]', d);
layer.parentNode.removeChild(layer);
return;
}
var layerExplain = $xp1('//div[@id="cash_explain"]', d);
layerExplain.innerHTML = "書簡保存処理実行中 " + (loadNo + 2) + "/" + hrefArray.length;
loadPage(loadNo + 1);
}
////////////////////////////////////////////////////////
// 書簡検索&表示機能
// 共通で使用するCSS定義は最初にセット
////////////////////////////////////////////////////////
function searchModeMain() {
var css = " table.showTable { border: 2px solid black; border-collapse: collapse; margin: 5px; }" +
" .showTable th { border: 2px solid black; border-collapse: collapse; color: white; background-color: gray; padding : 2px; }" +
" .showTable td { border: 2px solid black; border-collapse: collapse; color: black; background-color: white; padding : 2px; }";
GM_addStyle(css);
var targetNode = $xp1('//div[@id="gray02Wrapper"]', d);
targetNode.innerHTML = null;
var baseEL = d.createElement("div");
baseEL.id = "bro_view_base";
targetNode.appendChild(baseEL);
addSearchHTML();
if (opValues["uneiLimit"]) {
addShowTable(uneiSyokanLimit(syokanIdArray));
} else {
addShowTable(syokanIdArray);
}
}
// 検索句付加
function addSearchHTML() {
var baseEL = $xp1('//div[@id="bro_view_base"]', d);
baseEL.appendChild(d.createTextNode("【保存書簡の検索】"));
baseEL.appendChild(d.createElement("br"));
var searchBaseEL = d.createElement("div");
searchBaseEL.id = "search_base";
searchBaseEL.appendChild(d.createTextNode("検索条件: "));
var inputTxtEL = d.createElement("input");
inputTxtEL.size = 10;
inputTxtEL.id = "searchTxt";
searchBaseEL.appendChild(inputTxtEL);
searchBaseEL.appendChild(d.createTextNode(" を "));
var selectEL = d.createElement("select");
selectEL.id = "searchSelect";
var optionEL = d.createElement("option");
optionEL.value = "soushinsya_atesaki";
optionEL.text = "送信者または宛先に含む";
selectEL.appendChild(optionEL.cloneNode(true));
optionEL.value = "soushinsya";
optionEL.text = "送信者に含む";
selectEL.appendChild(optionEL.cloneNode(true));
optionEL.value = "atesaki";
optionEL.text = "宛先に含む";
selectEL.appendChild(optionEL.cloneNode(true));
searchBaseEL.appendChild(selectEL);
searchBaseEL.appendChild(d.createTextNode(" 書簡を "));
var btnEL = d.createElement("input");
btnEL.type = "button";
btnEL.value = "検索する";
btnEL.addEventListener("click", searchExe, false);
searchBaseEL.appendChild(btnEL);
searchBaseEL.appendChild(d.createTextNode(" / "));
var allBtnEL = d.createElement("input");
allBtnEL.type = "button";
allBtnEL.value = "全件表示";
allBtnEL.addEventListener("click", function() {
inputTxtEL.value = null;
selectEL.selectedIndex = 0;
searchExe();
}, false);
searchBaseEL.appendChild(allBtnEL);
baseEL.appendChild(searchBaseEL);
baseEL.appendChild(d.createElement("br"));
}
// 検索句の情報を元に検索実行
function searchExe() {
var searchSelectNode = $xp1('//select[@id="searchSelect"]', d);
var searchMode = searchSelectNode.options[searchSelectNode.selectedIndex].value;
var searchTxt = $xp1('//input[@id="searchTxt"]', d).value;
var show_syokanIdArray = [];
if (searchMode == "soushinsya_atesaki") {
show_syokanIdArray = searchSoushinsya(syokanIdArray, searchTxt);
var addIdArray = searchAtesaki(syokanIdArray, searchTxt);
for (var i = 0, len = addIdArray.length; i < len; i++) {
if (show_syokanIdArray.indexOf(addIdArray[i]) == -1) {
show_syokanIdArray.push(addIdArray[i]);
}
}
} else if (searchMode == "soushinsya") {
show_syokanIdArray = searchSoushinsya(syokanIdArray, searchTxt);
} else if (searchMode == "atesaki") {
show_syokanIdArray = searchAtesaki(syokanIdArray, searchTxt);
} else {
return;
}
if (opValues["uneiLimit"]) {
addShowTable(uneiSyokanLimit(show_syokanIdArray));
} else {
addShowTable(show_syokanIdArray);
}
}
// 送信者名で検索し、条件に合致するIDを返す
function searchSoushinsya(search_syokanIdArray, searchTxt) {
var resSyokanIdArray = [];
for (var i = 0, len = search_syokanIdArray.length; i < len; i++) {
var syokanId = search_syokanIdArray[i];
if (soushinsyaArray[syokanId].indexOf(searchTxt) != -1) {
resSyokanIdArray.push(syokanId);
}
}
return resSyokanIdArray;
}
// 宛先名で検索し、条件に合致するIDを返す
function searchAtesaki(search_syokanIdArray, searchTxt) {
var resSyokanIdArray = [];
for (var i = 0, len = search_syokanIdArray.length; i < len; i++) {
var syokanId = search_syokanIdArray[i];
if (atesakiArray[syokanId].indexOf(searchTxt) != -1) {
resSyokanIdArray.push(syokanId);
}
}
return resSyokanIdArray;
}
// 運営名で検索し、条件に合致しないIDを返す
function uneiSyokanLimit(search_syokanIdArray){
var resSyokanIdArray = [];
for (var i = 0, len = search_syokanIdArray.length; i < len; i++) {
var syokanId = search_syokanIdArray[i];
if (soushinsyaArray[syokanId].indexOf(uneiLimitTxt) == -1) {
resSyokanIdArray.push(syokanId);
}
}
return resSyokanIdArray;
}
// 引数の書簡ID配列、ページ番号を元に検索結果表示
function addShowTable (show_syokanIdArray, page_index) {
if (page_index == null) { page_index = 0; };
var pre_tableEL = $xp1('//table[@id="showTable"]', d);
if (pre_tableEL != null) {
pre_tableEL.parentNode.removeChild(pre_tableEL);
}
var pre_pagerEL = $xp1('//div[@id="search_pager"]', d);
if (pre_pagerEL != null) {
pre_pagerEL.parentNode.removeChild(pre_pagerEL);
}
var tableEL = d.createElement("table");
tableEL.className = "showTable";
tableEL.id = "showTable";
var trEL = d.createElement("tr");
var thEL = d.createElement("th");
var tdEL = d.createElement("td");
var pargerEL = d.createElement("div");
pargerEL.id = "search_pager";
thEL.innerHTML = "No";
thEL.style.width = "20px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "送信者";
thEL.style.width = "80px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "宛先";
thEL.style.width = "120px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "件名";
thEL.style.width = "200px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "日時";
thEL.style.width = "80px";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "本文表示";
thEL.style.width = "200px";
trEL.appendChild(thEL.cloneNode(true));
tableEL.appendChild(trEL.cloneNode(true));
var len = show_syokanIdArray.length;
if (len <= 0 ) {
var data_trEL = d.createElement("tr");
var data_thEL = d.createElement("th");
var data_tdEL = d.createElement("td");
data_tdEL.colSpan = 5;
data_tdEL.innerHTML = "※該当書簡は存在しません。";
data_tdEL.align = "center";
data_trEL.appendChild(data_thEL);
data_trEL.appendChild(data_tdEL);
tableEL.appendChild(data_trEL);
} else {
show_syokanIdArray.sort ( function sort(a, b) { return (b - a); } );
var i_start = page_index * pageUnit;
var i_end = i_start + pageUnit;
if (i_end >= len) { i_end = len; }
function returnShowSyokan(syokanId) {
return function() { showSyokan(syokanId); };
}
function returnSeachExe(searchTxt) {
return function() {
var searchSelectNode = $xp1('//select[@id="searchSelect"]', d);
searchSelectNode.selectedIndex = 0;
var searchTxtNode = $xp1('//input[@id="searchTxt"]', d);
searchTxtNode.value = searchTxt;
searchExe();
};
}
for (var i = i_start; i < i_end; i++ ) {
var syokanId = show_syokanIdArray[i];
var soushinsya = soushinsyaArray[syokanId];
var kenmei = kenmeiArray[syokanId];
var atesaki = atesakiArray[syokanId];
var nichiji = nichijiArray[syokanId];
var honbun = loadSyokanValue(syokanId);
honbun = honbun.replace(/
/g, "");
var data_trEL = d.createElement("tr");
var data_thEL = d.createElement("th");
var data_tdEL = d.createElement("td");
var data_tdBtnEL1 = d.createElement("td");
data_tdBtnEL1.style.backgroundColor = "#ffffdf";
var data_tdBtnEL2 = d.createElement("td");
data_tdBtnEL2.style.backgroundColor = "#ffdfff";
var data_tdBtnEL3 = d.createElement("td");
data_tdBtnEL3.style.backgroundColor = "#dfffff";
data_thEL.innerHTML = i + 1;
data_trEL.appendChild(data_thEL.cloneNode(true));
data_tdBtnEL1.innerHTML = soushinsya;
data_tdBtnEL1.addEventListener("click", returnSeachExe(soushinsya), false);
data_trEL.appendChild(data_tdBtnEL1);
data_tdBtnEL2.innerHTML = atesaki;
data_tdBtnEL2.addEventListener("click", returnSeachExe(atesaki), false);
data_trEL.appendChild(data_tdBtnEL2);
data_tdEL.innerHTML = kenmei;
data_trEL.appendChild(data_tdEL.cloneNode(true));
data_tdEL.innerHTML = nichiji;
data_trEL.appendChild(data_tdEL.cloneNode(true));
data_tdBtnEL3.appendChild(d.createTextNode(c_subString(honbun, 30)));
data_tdBtnEL3.addEventListener("click", returnShowSyokan(syokanId), false);
data_trEL.appendChild(data_tdBtnEL3);
tableEL.appendChild(data_trEL);
}
if (len > pageUnit) {
var preBtnEL = d.createElement("input");
preBtnEL.type = "button";
preBtnEL.id = "prePager";
preBtnEL.value = "前のページへ";
preBtnEL.addEventListener("click", function() {
addShowTable(show_syokanIdArray, page_index - 1);
}, false);
var nextBtnEL = d.createElement("input");
nextBtnEL.type = "button";
nextBtnEL.id = "nextPager";
nextBtnEL.value = "次のページへ";
nextBtnEL.addEventListener("click", function() {
addShowTable(show_syokanIdArray, page_index + 1);
}, false);
if (i_start <= 0 ) { preBtnEL.disabled = true; }
if (i_end >= len ) { nextBtnEL.disabled = true; }
pargerEL.appendChild(preBtnEL);
pargerEL.appendChild(nextBtnEL);
}
pargerEL.appendChild(d.createTextNode(" 該当件数" + len + "件"));
}
var baseEL = $xp1('//div[@id="bro_view_base"]', d);
baseEL.appendChild(pargerEL);
baseEL.appendChild(tableEL);
$("#showTable").hide();
$("#showTable").slideDown();
}
function c_subString(txt, num) {
// トレード関連
var tmp = txt.match(/武将名:...|落札額:[0-9]+TP/g);
var res = "";
if (!!tmp) {
for (var i = 0, len = tmp.length; i < len; i++) {
res = res + tmp[i] + " ";
}
return res;
}
if (txt.length > num) { txt = txt.substring(0, num - 3) + "..."; }
return txt;
}
// 書簡文表示
function showSyokan(syokanId) {
var baseLayer = d.createElement("div");
baseLayer.id = "baseLayer";
baseLayer.style.position = "absolute";
baseLayer.style.zIndex = 1;
baseLayer.style.width = "100%";
baseLayer.style.height = "100%";
var mask = d.createElement("div");
mask.style.backgroundColor = "#202020";
mask.style.position = "fixed";
mask.style.width = "100%";
mask.style.height = "100%";
mask.style.opacity = 0.90;
mask.addEventListener("click", function() {
baseLayer.parentNode.removeChild(baseLayer);
}, false);
baseLayer.appendChild(mask);
var explain = d.createElement("div");
explain.id = "gray02Wrapper";
explain.style.position = "absolute";
explain.style.marginTop = "200px";
explain.style.marginLeft = "50px";
explain.style.padding = "25px";
explain.style.width = "600px";
baseLayer.appendChild(explain);
var targetNode = $xp1('//body', d);
targetNode.insertBefore(baseLayer, targetNode.firstChild);
var tableEL = d.createElement("table");
tableEL.style.width = "100%";
tableEL.className = "showTable";
var trEL = d.createElement("tr");
var thEL = d.createElement("th");
var tdEL = d.createElement("td");
tdEL.style.padding = "5px";
thEL.innerHTML = "送信者";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "宛先";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "件名";
trEL.appendChild(thEL.cloneNode(true));
thEL.innerHTML = "日時";
trEL.appendChild(thEL.cloneNode(true));
tableEL.appendChild(trEL.cloneNode(true));
var soushinsya = soushinsyaArray[syokanId];
var kenmei = kenmeiArray[syokanId];
var atesaki = atesakiArray[syokanId];
var nichiji = nichijiArray[syokanId];
var honbun = loadSyokanValue(syokanId);
trEL.innerHTML = null;
tdEL.innerHTML = soushinsya;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = atesaki;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = kenmei;
trEL.appendChild(tdEL.cloneNode(true));
tdEL.innerHTML = nichiji;
trEL.appendChild(tdEL.cloneNode(true));
tableEL.appendChild(trEL.cloneNode(true));
trEL.innerHTML = null;
tdEL.colSpan = 4;
tdEL.innerHTML = honbun;
tdEL.appendChild(d.createElement("br"));
tdEL.appendChild(d.createElement("br"));
var aEL = d.createElement("a");
aEL.innerHTML = "返信する";
aEL.href = "new.php?id=" + syokanId;
tdEL.appendChild(aEL);
// ユーザ名登録済みであれば全員に返信有効化
if (getUserName() != "") {
tdEL.appendChild(d.createTextNode(" / "));
var aEL = d.createElement("a");
aEL.innerHTML = "全員に返信";
aEL.href = "#";
aEL.addEventListener("click", function() {
newPageMode["mode"] = "resAll";
newPageMode["syokanId"] = syokanId;
saveNewPageMode();
location.href = "new.php?id=" + syokanId;
}, false);
tdEL.appendChild(aEL);
}
trEL.appendChild(tdEL);
tableEL.appendChild(trEL);
explain.appendChild(tableEL);
$("#gray02Wrapper").hide();
$("#gray02Wrapper").slideDown();
}
////////////////////////////////////////////////////////
//オプション画面
////////////////////////////////////////////////////////
function addOpMain() {
var targetNode = $xp1('//div[@id="gray02Wrapper"]', d);
targetNode.innerHTML = null;
var baseEL = d.createElement("div");
baseEL.id = "bro_op_base";
baseEL.appendChild(d.createTextNode("【書簡保存・検索 設定】"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createTextNode(" 1.書簡画面表示時、未保存書簡の自動保存を"));
var autoCashBtn = d.createElement("input");
autoCashBtn.type = "button";
autoCashBtn.id = "autoCashBtn";
if (opValues["autoCash"]) {
autoCashBtn.value = "【無効化する】";
autoCashBtn.addEventListener("click", function() {
opValues["autoCash"] = false;
saveOpValues();
addOpMain();
}, false);
} else {
autoCashBtn.value = "【有効化する】";
autoCashBtn.addEventListener("click", function() {
opValues["autoCash"] = true;
saveOpValues();
addOpMain();
}, false);
}
baseEL.appendChild(autoCashBtn);
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createTextNode(" 2.運営からの書簡を検索結果に"));
var UneiLimitBtn = d.createElement("input");
UneiLimitBtn.type = "button";
UneiLimitBtn.id = "UneiLimitBtn";
if (opValues["uneiLimit"]) {
UneiLimitBtn.value = "【表示する】";
UneiLimitBtn.addEventListener("click", function() {
opValues["uneiLimit"] = false;
saveOpValues();
addOpMain();
}, false);
} else {
UneiLimitBtn.value = "【表示しない】";
UneiLimitBtn.addEventListener("click", function() {
opValues["uneiLimit"] = true;
saveOpValues();
addOpMain();
}, false);
}
baseEL.appendChild(UneiLimitBtn);
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createTextNode(" 3.指定ワールドの保存書簡をだらあああと"));
var outputBtn = d.createElement("input");
outputBtn.type = "button";
outputBtn.id = "outputBtn";
outputBtn.value = "【出力する】";
outputBtn.addEventListener("click", function() {
outputBtn.disabled = true;
var key = prompt("現ワールド以外の書簡情報を出力したい場合は、\nホスト名を指定してください。\n※現ワールドのホスト名が初期値で表示されています。", worldKey);
if (!key) { outputBtn.disabled = false; return; }
key_loadCmValue(key);
var len = syokanIdArray.length;
if(len <= 0) { alert("指定ワールドの保存書簡は存在しません。"); outputBtn.disabled = false; return; }
syokanOutput(key);
}, false);
baseEL.appendChild(outputBtn);
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createTextNode(" 4.指定ワールドの保存情報を"));
var resetBtn = d.createElement("input");
resetBtn.type = "button";
resetBtn.id = "resetBtn";
resetBtn.value = "【リセットする】";
resetBtn.addEventListener("click", function() {
resetBtn.disabled = true;
var key = prompt("現ワールド以外の書簡情報をリセットしたい場合は、\nホスト名を指定してください。\n※現ワールドのホスト名が初期値で表示されています。", worldKey);
if (!key) { resetBtn.disabled = false; return; }
key_loadCmValue(key);
var len = syokanIdArray.length;
if(len <= 0) { alert("指定ワールドの保存書簡は存在しません。"); resetBtn.disabled = false; return; }
if (confirm("【再確認】ホスト名:" + key + "ワールドの書簡情報のすべてをクリアします。\n※また、処理には相当な時間を要します。気長に待てる時の実行を推奨します。")) {
autoCashBtn.disabled = true;
UneiLimitBtn.disabled = true;
outputBtn.disabled = true;
resetCashMain(key);
} else {
resetBtn.disabled = false;
}
}, false);
baseEL.appendChild(resetBtn);
targetNode.appendChild(baseEL);
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createElement("br"));
baseEL.appendChild(d.createTextNode(" 5.本スクリプトの最新版などは→をご確認ください ・w・ "));
var aEL = d.createElement("a");
aEL.innerHTML = "Project.殺伐";
aEL.href = "http://aoyamayuuto.blog92.fc2.com/";
aEL.target = "_blank";
baseEL.appendChild(aEL);
$("#bro_op_base").hide();
$("#bro_op_base").slideDown();
}
////////////////////////////////////////////////////////
//書簡出力
////////////////////////////////////////////////////////
function syokanOutput(key, page_index) {
if (page_index == null) { page_index = 0; };
var pre_baseEL = $xp1('//div[@id="bro_output_base"]', d);
if (pre_baseEL != null) {
pre_baseEL.parentNode.removeChild(pre_baseEL);
}
var targetNode = $xp1('//div[@id="gray02Wrapper"]', d);
targetNode.innerHTML = null;
var baseEL = d.createElement("div");
baseEL.id = "bro_output_base";
targetNode.appendChild(baseEL);
var textAreaEL = d.createElement("textarea");
textAreaEL.cols = 95;
textAreaEL.rows = 25;
var len = syokanIdArray.length;
pageUnit = 100;
var i_start = page_index * pageUnit;
var i_end = i_start + pageUnit;
if (i_end >= len) { i_end = len; }
for (var i = i_start; i < i_end; i++ ) {
var syokanId = syokanIdArray[i];
var nichiji = nichijiArray[syokanId];
var soushinsya = soushinsyaArray[syokanId];
var atesaki = atesakiArray[syokanId];
var kenmei = kenmeiArray[syokanId];
var honbun = key_loadSyokanValue(key, syokanId);
honbun = honbun.replace(/\r\n/g, "");
honbun = honbun.replace(/(\n|\r)/g, "");
textAreaEL.defaultValue = textAreaEL.defaultValue +
syokanId + "\t" +
nichiji + "\t" +
soushinsya + "\t" +
atesaki + "\t" +
kenmei + "\t" +
honbun + "\n";
}
if (len > pageUnit) {
var preBtnEL = d.createElement("input");
preBtnEL.type = "button";
preBtnEL.id = "prePager";
preBtnEL.value = "前のページへ";
preBtnEL.addEventListener("click", function() {
syokanOutput(key, page_index - 1);
}, false);
var nextBtnEL = d.createElement("input");
nextBtnEL.type = "button";
nextBtnEL.id = "nextPager";
nextBtnEL.value = "次のページへ";
nextBtnEL.addEventListener("click", function() {
syokanOutput(key, page_index + 1);
}, false);
if (i_start <= 0 ) { preBtnEL.disabled = true; }
if (i_end >= len ) { nextBtnEL.disabled = true; }
baseEL.appendChild(preBtnEL);
baseEL.appendChild(nextBtnEL);
}
baseEL.appendChild(d.createTextNode(" 総件数" + len + "件 " + (i_start + 1) + "~" + i_end));
baseEL.appendChild(textAreaEL);
}
////////////////////////////////////////////////////////
// GM関連の共通関数
// 保持するGM変数は下記3分類
// 1.オプション設定情報
// 2.書簡項目ごとに分類したキャッシュ情報
// 3.書簡本文のキャッシュ情報
////////////////////////////////////////////////////////
function loadOpValues () {
opValues = eval(GM_getValue(worldKey + "opValues", {}));
if (opValues["autoCash"] == null) { opValues["autoCash"] = false; }
if (opValues["uneiLimit"] == null) { opValues["uneiLimit"] = false; }
if (opValues["userName"] == null) { opValues["userName"] = ""; }
}
function saveOpValues () {
GM_setValue(worldKey + "opValues", opValues.toSource());
}
function loadCmValue () {
syokanIdArray = eval(GM_getValue(worldKey + "syokanIdArray", []));
soushinsyaArray = eval(GM_getValue(worldKey + "soushinsyaArray", {}));
atesakiArray = eval(GM_getValue(worldKey + "atesakiArray", {}));
kenmeiArray = eval(GM_getValue(worldKey + "kenmeiArray", {}));
nichijiArray = eval(GM_getValue(worldKey + "nichijiArray", {}));
}
function saveCmValue () {
GM_setValue(worldKey + "syokanIdArray", syokanIdArray.toSource());
GM_setValue(worldKey + "soushinsyaArray", soushinsyaArray.toSource());
GM_setValue(worldKey + "atesakiArray", atesakiArray.toSource());
GM_setValue(worldKey + "kenmeiArray", kenmeiArray.toSource());
GM_setValue(worldKey + "nichijiArray", nichijiArray.toSource());
}
function loadSyokanValue (syokanId) {
var honbun = GM_getValue(worldKey + "syokan:" + syokanId, "");
if (honbun == null) { return ""; }
return honbun;
}
function saveHonbunValue (syokanId, honbun) {
GM_setValue(worldKey + "syokan:" + syokanId, honbun);
}
// サーバ指定用
function resetCashMain(key) {
syokanIdArray = eval(GM_getValue(key + "syokanIdArray", []));
for (var i = 0, len = syokanIdArray.length; i < len; i++) {
GM_deleteValue(key + "syokan:" + syokanIdArray[i]);
}
GM_deleteValue(key + "syokanIdArray");
GM_deleteValue(key + "soushinsyaArray");
GM_deleteValue(key + "atesakiArray");
GM_deleteValue(key + "kenmeiArray");
GM_deleteValue(key + "nichijiArray");
GM_deleteValue(key + "opValues");
GM_deleteValue(key + "time_checker");
GM_deleteValue(key + "lordInfoMap");
alert("リセット完了しました。");
location.reload();
}
function key_loadCmValue (key) {
syokanIdArray = eval(GM_getValue(key + "syokanIdArray", []));
soushinsyaArray = eval(GM_getValue(key + "soushinsyaArray", {}));
atesakiArray = eval(GM_getValue(key + "atesakiArray", {}));
kenmeiArray = eval(GM_getValue(key + "kenmeiArray", {}));
nichijiArray = eval(GM_getValue(key + "nichijiArray", {}));
}
function key_loadSyokanValue (key, syokanId) {
var honbun = GM_getValue(key + "syokan:" + syokanId, "");
if (honbun == null) { return ""; }
return honbun;
}
// 新規書簡画面モード用
function loadNewPageMode () {
newPageMode = eval(GM_getValue(worldKey + "newPageMode", {}));
}
function saveNewPageMode () {
GM_setValue(worldKey + "newPageMode", newPageMode.toSource());
}
}) ();