💘足跡 3.0.1 関数(1)
  

最初に追加される関数その1です。
その2はこちら。



[FOO-EXEC-DATA]
/* -- fooExecのサブ。リストデータを読み込み -- */
fooExec_dataLoad = e => { // 値を引き継いでいる
xhr("/cgi-bin/diary.cgi?oid=new-diary;n=13;c=886;s=217352", null, dat => {
let dt = keys(dat, "FOOTPRINT-DATA");
dt = dt.replace(/<.+?>/g, "").replace(/^\t+|\t+$/g, "").replace(/\t \t/g, "\t");
echo("sxText", dt); // 初期値を格納して置く
echo("sxTopDoc", "レコード数:" + dt.split("\t").length + " 文字数:" + dt.length);
fooExec_dataShow(e); // 引き継いだ値を使わないで次へ引き継いでいる
});
};

/* -- fooExecのサブ。初期のリスト生成 -- */
fooExec_dataShow = e => {
// データは改行単位だから前後の改行を取り除く。
let dx = echo("sxText").replace(/^\s|\s+$/g, "").split("\n");
let dt = { "A":0, "B":0, "C":0, "D":0, "E":0 }; // クラス別を初期化
let cell3 = evalDec(key(e, "CELL3-DATA")).replace(/\r?\n/g, "").
replace(/\/\*.*?\*\/\s/g, "").replace(/^\s+|\s+$/, "").
replace(/\s+\,/g, ",").replace(/\,\s+/g, ",").split(",");
for(let i = 0; i < dx.length; i++){
// ゼロが圧縮されているから展開
let s = dx[i];
s = s.replace(/\[(\d+)\]/g, (r, r1) => "0 ".repeat(r1-0));
let o = Fce("li"); o.id = "li" + (i + 1); // idは1から始まりノード番号と異なる
let dc = datRep(s, cell3);
o.className = "tp" + dc[1]; // レコード(li)にクラス(ABCDE)を指定
dt[dc[1]]++;
echo(o, dc[0]);
Fid("ulDat").append(o); // レコード単位で追加
}
let obj = Ftag("ulDat", "li");
for(let i = 0; i < obj.length; i++){
let a = Ftag(obj[i], "span");
for(let j=0; j < a.length; j++){
let b = a[j].textContent.replace(/\s/g, "");
// UID以外のidは参照番号になっているから置換する。
if(j > 2 && b != "-" && a[j].classList.contains("log-uid")){
let o = Fid("li" + b); // 参照番号から実態(UID)へ
if(o) a[j].textContent = o.childNodes[1].textContent;
}
}
}
let o = Ftag("nb1Disp", "span"); // 2段目のボタン
let a = Object.keys(dt);
// A-Eのデータを取り出してボタンに数値を挿入(offsetに注意)
for(let i = 0; i < 5; i++) o[i+10].lastChild.before(":", dt[a[i]]);
Ftag("nb2Disp", "span")[1].append(" ", obj.length); // UIDに総数を追加

Fid("eLine").click(); // 退会者を非表示に
Fid("nb2Disp").childNodes[0].click(); // Noで並び替え
sxDataInc(); // 初期値を定義

setTimeout(() => { // 少し間を空ける
doc.body.classList.remove("memo-off"); // メモ欄を表示可能に
Fid("ulDat").scrollIntoView(); // リストの先頭へ(操作可能状態)

// ここでアイドル状態になる。追加関数の実装で実行はなし。
xhr("/cgi-bin/diary.cgi?oid=new-diary;n=3;c=253;s=217397 ", null, ea => {
try { eval(dataKey(ea, "FOO-ADD-EXEC")); }
catch (err) { alert("追加関数の何処かが変です\n\n" + err); }
});
}, 400);
};

/* -- ナビ領域にあるボタンのエントリ -- */
naviCmd = (no, obj) =>{ // noは連番で0から始まる
const bcc = doc.body.classList; // 処理の要のクラスリスト
const bccRemove = () => { // 内部関数で全て非表示に
bcc.remove("tw0","tw1","tw2","tw3","tw4","tw5","tw6","tw7","tw8","tw9");
};

const cls = obj.classList; // ボタン自身のクラスリスト
const par = Fid("ulDat"); // リストの親分
const dts = par.childNodes; // リストの子分でレコードを返す
if(naviCmd.c711 == undefined){ // ボタン履歴未定義対策・初期値
naviCmd.c711 = 4; naviCmd.c701 = Fid("css1"); // グループBの初期値
naviCmd.c710 = 0; naviCmd.c700 = Fid("btnC7"); // グループAの初期値
}

let cmd = 0; // 類似する処理の為の値
if(no.includes(".")){ // 区切りはドット
let a = no.split("."); // 小数点が無い場合は0
no = a[0] - 0; cmd = a[1] - 0; // 小数点以下がコマンド
} else no = no - 0; // 数字を数値に

switch(no){ // ---- switch 引数はボタンの番号 ----
case 0 :
break;
case 1 :
switch (cmd) { // ---- switch in switch indent -4 ----
case 0 : Fid("ulDat").scrollIntoView(); break;
case 1 : Fid("ulDatMemo").scrollIntoView();
if(echo("ulMemo0") == "") setTimeout(() => memoEntry(), 700);
break;
} // ---- switch in switch out ----
break;

case 2 : break;
case 3 : break;

// メニューリスト上段
case 4 : cls.toggle("ac"); // 共通のコマンドで青色に変化する
let isSx = bcc.contains("sx-off"); // sxDispが非表示?
let isDt = bcc.contains("dt-off"); // dtDispが非表示?
let dcls = Fid("dtDisp").classList; // 状態識別子「z」を参照する
switch (cmd){ // ---- switch in switch indent -4 ----
case 0 : // dtの操作
if(!isSx){ // sxが表示中なら
if(isDt){ // dtを表示させる
dcls.remove("z"); // dtを上に
bcc.remove("dt-off"); // dtを表示
} else { // sx,dt共に表示中
if(!dcls.contains("z")){ // dtが下でなければ
bcc.add("dt-off"); // dtを非表示に
} else { // でなければ
dcls.remove("z"); // dtを上に
cls.toggle("ac"); // ラベルの色を元に戻す
}
}
} else bcc.toggle("dt-off"); // sxが非表示ならトグル
break;
case 1 : // sxの操作 ※case0と類似で三項演算子で複合可能
if(!isDt){ // dtが表示中なら
if(isSx){ // sxを表示させる
dcls.add("z"); // dtを15ににして下に
bcc.remove("sx-off"); // sxを表示
} else { // sx,dt共に表示中
if(dcls.contains("z")){ // もしもsxが上なら
bcc.add("sx-off"); // sxを非表示に
} else { // でなければ
dcls.add("z"); // dtを下に
cls.toggle("ac"); // ラベルの色を元に戻す
}
}
} else bcc.toggle("sx-off"); // dtが非表示ならトグル
break;

case 2 : xmlLoopSet = !xmlLoopSet; break;
case 3 : xhrDataSet = !xhrDataSet; break;

case 4 : // リストグループA/Bの切り替え
bcc.toggle("bc"); // ラベルグループの切り替え
bcc.add("non-tl"); // 可変リストを徐々に透明に
bccRemove(); // リストをリセット
setTimeout(() => { // ちょっと間をおいて
// 対応する列を表示させて
// ちょっと間をおいて透明度を戻す
bcc.add("tw" + naviCmd["c71" + (cls.contains("ac") ? 1 : 0)]);
setTimeout(() => { bcc.remove("non-tl"); }, 200);
}, 50);
break;
case 5 : // メモ帳更新モード切り替え
bcc.toggle("edit-on"); // フラグのトグル
break;
case 6 : // ナビボタンC/D切り替え
bcc.add("cd-cg"); // 単なる領域切り替え
setTimeout(() => { // 少し間をおいてる
bcc.toggle("cd"); // cd-cgは文字色が背景色に変化する
// c/dとも同じ個数のボタンで外観は変化しない
setTimeout(() => bcc.remove("cd-cg"), 300);
}, 300);
break;

} // ---- switch in switch out ----
break;

case 6 : // 列のタイトルイベント
let isVol = cls.contains("nav-vol");
let us = naviCmd.c6;
if(cmd == us){
let sc = cls.contains("sect");
cls.remove("sect", "sect-rev");
cls.add(sc ? "sect-rev" : "sect");
exDomSort(cmd, isVol, sc);
} else {
  cls.add("sect");
if(us != null) Fid("nb2Disp").childNodes[us].classList.remove("sect", "sect-rev");
for(let ds of dts){
ds.childNodes[cmd].classList.add("sect");
if(us != null) ds.childNodes[us].classList.remove("sect", "sect-rev");
}
exDomSort(cmd, isVol, 0);
naviCmd.c6 = cmd;
}
setTimeout(() => { par.scrollIntoView() }, 500);
break;

case 7 : if(cls.contains("eec")) return;
let ab = Fid("nb00").classList.contains("ac") ? 1 : 0;
naviCmd["c70" + ab].classList.remove("eec");
bcc.add("non-tl");
cls.add("eec");
bccRemove();
bcc.add("tw" + cmd);
setTimeout(() => { bcc.remove("non-tl"); }, 50);
naviCmd["c70" + ab] = obj;
naviCmd["c71" + ab] = cmd;
break;

case 8 :
bcc.add("cg-tp");
cls.toggle("ccb");
bcc.toggle("non-tp" + "ABCDE".charAt(cmd));
setTimeout(() => bcc.remove("cg-tp"), 100);
break;

case 4 : createDataMain(); break;
case 9 : Fid("ulDat").classList.toggle("hide"); break;
case 10 : Fid("mainDisp").classList.toggle("hide"); break;
case 11 : let o = Ftag("nb1Disp", "span");
for(let i = 8; i < 13; i++) o[i].click();
}
};

/* -- リストの内容を編集領域に -- */
sxDataInc = () => {
let s1 = "", s2 = "";
for(j = 1; j <= Fid("ulDat").childNodes.length; j++){
let par = Fid("li" + j);
let o = par.childNodes;
for(let i = 0; i < o.length; i++){
let ds = o[i].textContent;
ds = ds.replace(/'(\d\d) (\d\d)\/(\d\d) (\d\d):(\d\d)/, "$1$2$3$4$5");
ds = ds.replace(/'(\d\d) (\d\d)\/(\d\d)/, "$1$2$3");
ds = ds.replace(/\,|\s/g, "");
//UIDは1つだけで残りは数値で参照
if(i > 2 && ds != "0" && o[i].classList.contains("log-uid")) ds = echo("M" + ds);
s1 += ds + (i == o.length -1 ? "" : " ");
}
// 0 の連続は纏める
s1 = s1.replace(/(0 ){3,}/g, e => `[${e.length/2}]`);
s1 += "\n";
}
s1 = s1.replace(/\s+$/, "");
echo("sxText", s1);
echo("upText", "");
setTimeout(() => Fid("sdiBtn").classList.remove("up"), 500);
sxCheck();
};

/* -- レコード毎の要素の生成 A-Zのクラスも戻す -- */
datRep = (s, u) => {
// parInfo
// echo("parInfo", "cell:" + u.length);
let o = s.split(" ");
let dt = "", dc = "";
for(let i = 0; i < u.length; i++){
s = o[i];
dt += `<span class="log-${u[i]}`;
if([16,19].includes(i) && s < o[3]) dt += " old";
dt += '"';
if(i > 2) s = s.replace(/(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/, "'$1 $2/$3 $4:$5");
if(u[i].includes("vol"))
s = s.replace(/(\d+)(\d{3})(\d{3})$/, "$1,$2,$3").
replace(/(\d+)(\d{3})$/, "$1,$2");
if(u[i].includes("ms")) s = s.replace(/(\d\d)(\d\d)(\d\d)/, "'$1 $2/$3");
if("ABCDE".includes(s)) dc = s;
if(i == 0) dt += ` id="M${o[1]}" onclick="cellCmd(this, ${i})"`;
if(i == 1) dt += ` onclick="cellCmd(this, ${i})"`;

if([17,20,28,31].includes(i) && s != "0") dt += ` onclick="uidScroll(${s})"`;
dt += `>${s}</span>`;
}
return [dt, dc];
};

[/FOO-EXEC-DATA]