OSDN Git Service

99dbe3bb7c58219043ccfafc54a74aeb6c19420e
[kancollesniffer/KancolleSniffer.git] / LogViewer / index.html
1 <!DOCTYPE html>
2 <html lang="ja">
3 <head>
4 <meta charset="utf-8">
5 <title>各種報告書 - KancolleSniffer</title>
6
7 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
8 <script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/js/jquery.dataTables.min.js"></script>
9 <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/css/jquery.dataTables.min.css">
10 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js"></script>
11 <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.js"></script>
12 <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.11/c3.min.css">
13 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
14 <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
15 <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
16 <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/i18n/datepicker-ja.min.js"></script>
17 <style>
18 body {
19     font-family:'Lucida Grande','Hiragino Kaku Gothic ProN', Meiryo, sans-serif;
20     line-height: 1.5;
21     font-size: 14px;
22 }
23 .tab {overflow: hidden; list-style-type: none; margin: 0 0 2em 1em; padding: 0;}
24 .tab li {background: #eee; padding: 0.3em 1.5em; float: left; margin-right: 2px;}
25 .tab1 li {padding: 0.3em 1em;}
26 .tab li.select {background: #ccc;}
27 .contents {list-style-type: none; margin: 0; padding: 0;}
28 .hide {display: none;}
29 .c3 .tick {font-family:'Lucida Grande','Hiragino Kaku Gothic ProN', Meiryo, sans-serif; font-size: 12px;}
30 .c3-legend-item {font-family:'Lucida Grande','Hiragino Kaku Gothic ProN', Meiryo, sans-serif; font-size: 14px;}
31 #loading {
32     width: 48px;
33     height: 48px;
34     display: none;
35     position: fixed;
36     top: 50%;
37     left: 50%;
38     margin-top: -24px;
39     margin-left: -24px;
40     z-index: 100;
41 }
42 </style>
43 </head>
44 <body>
45 <script>
46 /* global moment, c3 */
47
48 var oneDay = 3600 * 24 * 1000;
49
50 function showLog() {
51     var query = "?from=" + moment().subtract(1, 'months').valueOf();
52     if ($('input[name=term]:eq(1)').prop('checked')) {
53         var from = $('#term_from').datepicker("getDate");
54         var to = $('#term_to').datepicker("getDate");
55         if (from != null)
56             query = "?from=" + from.valueOf();
57         if (to != null)
58             query += "&to=" + (to.valueOf() + oneDay);
59     }
60     var jsons = [
61         "海戦・ドロップ報告書.json",
62         "海戦・ドロップ報告書.json",
63         "遠征報告書.json",
64         "開発報告書.json",
65         "建造報告書.json",
66         "改修報告書.json",
67         "資材ログ.json"
68     ];
69     $('#loading').show();
70     var url = jsons[selectedTable] + query;
71     $('#log' + selectedTable).DataTable().ajax.url(url).load();
72 }
73
74 var tables = 7;
75
76 function initTables() {
77     for (var t = 0; t < tables; t++) {
78         var opts = {
79             destroy: true,
80             deferRender: true,
81             stateSave: true,
82             order: [[0, "desc"]],
83             pageLength: 50,
84             lengthMenu: [[50, 100, 200, -1], [50, 100, 200, "All"]],
85             drawCallback: function () {
86                 $('#loading').hide();
87             }
88         };
89         if (t === 0) {
90             opts.columns = [{ data: 0 }, { data: 1 }, { data: 2 }, { data: 3 }, { data: 4 }, { data: 9 }, { data: 10 }];
91         } else if (t === 1) {
92             var entries = [];
93             for (var i = 0; i < 38; i++) {
94                 if (i === 9 || i === 10)
95                     continue;
96                 entries.push({ data: i });
97             }
98             opts.columns = entries;
99         }
100         $('#log' + t).dataTable(opts);
101     }
102 }
103
104 var timeFormat = "YYYY-MM-DD HH:mm:ss";
105 function parseDate(d) {
106     return moment(d, timeFormat);
107 }
108
109 function toString(d) {
110     return d.format(timeFormat);
111 }
112
113 function to5am(tick) {
114     return tick - tick % (3600 * 24000) - 3600 * 4000;
115 }
116
117 var selectedTable = 0;
118 var seqChartRange = 0;
119 var diffChartRange = 0;
120 var chartType = 0;
121 var showChart = false;
122 var currentPickedData;
123
124 function drawChart(data) {
125     if (data == null) {
126         $('#loading').show();
127         $.get("./資材ログ.json?time=" + Date.now(), function (d) { drawChart(d); }, "json");
128         return;
129     }
130     var picked, header;
131     if (chartType === 0) {
132         picked = pickChartData(data.data, seqChartRange);
133         header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ", "高速建造材", "高速修復材", "開発資材", "改修資材"];
134         picked.data.unshift(header);
135         drawSeqChart(picked);
136         currentPickedData = picked;
137     } else {
138         picked = pickDiffChartData(data.data, diffChartRange);
139         header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ"];
140         picked.data.unshift(header);
141         drawDiffChart(picked);
142         currentPickedData = picked;
143     }
144 }
145
146 function redrawChart() {
147     if (!currentPickedData)
148         return;
149     $('#loading').show();
150     setTimeout(function () {
151         if (chartType === 0)
152             drawSeqChart(currentPickedData);
153         else
154             drawDiffChart(currentPickedData);
155     });
156 }
157
158 var timer;
159 $(window).resize(function () {
160     if (timer)
161         clearTimeout(timer);
162     timer = setTimeout(function () {
163         if (showChart)
164             redrawChart();
165     }, 200);
166 });
167
168 function chartSize() {
169     var pxPerEm = Number($('#chart').css('fontSize').match(/(\d*(\.\d*)?)px/)[1]);
170     return {
171         height: Math.max($(document).height() - 15 * pxPerEm, 400),
172         width: Math.max($(document).width() - 6 * pxPerEm, 800)
173     };
174 }
175
176 function drawSeqChart(picked) {
177     var size = chartSize();
178     c3.generate({
179         bindto: '#chart',
180         size: {
181             height: size.height,
182             width: size.width
183         },
184         data: {
185             x: '日付',
186             xFormat: '%Y-%m-%d %X',
187             rows: picked.data,
188             axes: {
189                 燃料: 'y',
190                 弾薬: 'y',
191                 鋼材: 'y',
192                 ボーキ: 'y',
193                 高速建造材: 'y2',
194                 高速修復材: 'y2',
195                 開発資材: 'y2',
196                 改修資材: 'y2'
197             }
198         },
199         point: {
200             show: false
201         },
202         tooltip: {
203             show: $('#tooltip').prop('checked')
204         },
205         grid: {
206             x: {
207                 lines: picked.grid
208             }
209         },
210         axis: {
211             x: {
212                 type: 'timeseries',
213                 tick: {
214                     rotate: 30,
215                     format: function (x) { return moment(x).format("MM-DD HH:mm"); },
216                     values: picked.tick
217                 }
218             },
219             y2: {
220                 show: true
221             }
222         },
223         onrendered: function () { $('#loading').hide(); }
224     });
225 }
226
227 function pickChartData(data, range) {
228     var newdata = [];
229     var ticks = [];
230     var grid = [];
231     var first = moment(data[0][0]).valueOf();
232     var last = moment(data[data.length - 1][0]).valueOf();
233     var interval, tickInterval, lastTick;
234     switch (range) {
235         case 0:
236             first = moment(last).subtract(24, 'hours').valueOf();
237             break;
238         case 1:
239             first = moment(last).subtract(7, 'days').valueOf();
240             break;
241         case 2:
242             first = moment(last).subtract(1, 'months').valueOf();
243             break;
244         case 3:
245             first = moment(last).subtract(3, 'months').valueOf();
246             break;
247         case 4:
248             first = moment(data[0][0]).valueOf();
249             break;
250         case 5:
251             var fromDate = $('#chart_from').datepicker("getDate");
252             var toDate = $('#chart_to').datepicker("getDate");
253             if (fromDate == null || toDate == null)
254                 return { data: [], tick: [], grid: [] };
255             var from = fromDate.valueOf() + 3600 * 5000;
256             var to = toDate.valueOf() + oneDay + 3600 * 5000;
257             first = Math.max(first, from);
258             last = Math.min(last, to);
259             break;
260     }
261     if (last <= first + oneDay) {
262         interval = 1000;
263         tickInterval = 3600 * 1000;
264         lastTick = last - last % tickInterval;
265     } else if (last <= first + oneDay * 21) {
266         interval = 1000;
267         tickInterval = oneDay;
268         lastTick = to5am(last);
269     } else if (last <= first + oneDay * 63) {
270         interval = 3600 * 1000;
271         tickInterval = oneDay * 7;
272         lastTick = to5am(moment(last).day(1).valueOf());
273     } else if (last <= first + oneDay * 126) {
274         interval = 3600 * 6000;
275         tickInterval = oneDay * 14;
276         lastTick = to5am(moment(last).day(1).valueOf());
277     } else {
278         interval = 3600 * 12000;
279         tickInterval = oneDay * 28;
280         lastTick = to5am(moment(last).day(1).valueOf());
281     }
282     var lastData;
283     for (var i = data.length - 1; i >= 0; i--) {
284         var row = data[i];
285         var date = parseDate(row[0]).valueOf();
286         if (date > first) {
287             if (date <= last) {
288                 var v = date - date % interval;
289                 if (lastData !== v) {
290                     newdata.unshift(row);
291                     lastData = v;
292                 }
293             }
294         } else {
295             break;
296         }
297     }
298     for (var tick = lastTick; tick > lastData; tick -= tickInterval) {
299         var str = toString(moment(tick));
300         ticks.unshift(str);
301         grid.unshift({ value: str });
302     }
303     return { data: newdata, tick: ticks, grid: grid };
304 }
305
306 function drawDiffChart(picked) {
307     var size = chartSize();
308     c3.generate({
309         bindto: '#chart',
310         size: {
311             height: size.height,
312             width: size.width
313         },
314         data: {
315             x: '日付',
316             xFormat: '%Y-%m-%d %X',
317             rows: picked.data,
318             axes: {
319                 燃料: 'y',
320                 弾薬: 'y',
321                 鋼材: 'y',
322                 ボーキ: 'y'
323             },
324             type: 'bar',
325             groups: [["燃料", "弾薬", "鋼材", "ボーキ"]]
326         },
327         bar: {
328             width: {
329                 ratio: picked.width
330             }
331         },
332         tooltip: {
333             show: $('#tooltip').prop('checked')
334         },
335         grid: {
336             x: {
337                 lines: picked.grid
338             },
339             y: {
340                 lines: [
341                     { value: 0 }
342                 ]
343             }
344         },
345         axis: {
346             x: {
347                 type: 'timeseries',
348                 tick: {
349                     rotate: 30,
350                     format: function (x) { return moment(x).format("MM-DD HH:mm"); },
351                     values: picked.tick
352                 }
353             }
354         },
355         onrendered: function () { $('#loading').hide(); }
356     });
357 }
358
359 function pickDiffChartData(data, range) {
360     var newdata = [];
361     var ticks = [];
362     var grid = [];
363     var first = moment(data[0][0]).valueOf();
364     var last = moment(data[data.length - 1][0]).valueOf();
365     var interval, tickInterval, lastTick;
366     var oneDay = 3600 * 24 * 1000;
367     switch (range) {
368         case 0:
369             first = moment(last).subtract(1, 'months').valueOf();
370             break;
371         case 1:
372             first = moment(last).subtract(3, 'months').valueOf();
373             break;
374         case 2:
375             first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
376             break;
377         case 3:
378             first = moment(data[0][0]).valueOf();
379             break;
380         case 4:
381             var fromDate = $('#chart_from').datepicker("getDate");
382             var toDate = $('#chart_to').datepicker("getDate");
383             if (fromDate == null || toDate == null)
384                 return { data: [], tick: [], grid: [] };
385             var from = fromDate.valueOf() + 3600 * 5000;
386             var to = toDate.valueOf() + oneDay + 3600 * 5000;
387             first = Math.max(first, from);
388             last = Math.min(last, to);
389             break;
390     }
391     var barWidth;
392     if (last <= first + oneDay * 2 * 31) {
393         interval = oneDay;
394         tickInterval = oneDay * 2;
395         lastTick = to5am(last);
396         barWidth = 0.3;
397     } else if (last <= first + oneDay * 3 * 31) {
398         interval = oneDay;
399         tickInterval = oneDay * 7;
400         lastTick = to5am(last);
401         barWidth = 0.1;
402     } else {
403         interval = oneDay * 7;
404         tickInterval = oneDay * 28;
405         lastTick = to5am(moment(last).day(1).valueOf());
406         barWidth = 0.1;
407         if (last <= first + oneDay * 6 * 38) {
408             tickInterval = oneDay * 14;
409             barWidth = 0.3;
410         }
411     }
412     var lastDate = lastTick;
413     var prevRow;
414     for (var i = data.length - 1; i >= 0; i--) {
415         var row = data[i];
416         var date = parseDate(row[0]).valueOf();
417         if (date > first && date <= last) {
418             if (!prevRow) {
419                 prevRow = row;
420                 continue;
421             }
422             if (date <= lastDate) {
423                 var newrow = [prevRow[0]];
424                 for (var r = 1; r < 5; r++) {
425                     newrow.push(prevRow[r] - row[r]);
426                 }
427                 newdata.unshift(newrow);
428                 lastDate = lastDate - interval;
429                 prevRow = row;
430             }
431         } else {
432             break;
433         }
434     }
435     if (tickInterval >= oneDay * 7)
436         lastTick = moment(lastTick).day(1).hour(5).minute(0).valueOf();
437     for (var tick = lastTick; tick > lastDate; tick -= tickInterval) {
438         var str = toString(moment(tick));
439         ticks.unshift(str);
440         grid.unshift({ value: str });
441     }
442     return { data: newdata, tick: ticks, grid: grid, width: barWidth };
443 }
444
445 var sortieStatRange = 0;
446
447 function loadSortieData() {
448     var from, to;
449     if (sortieStatRange === 0) {
450         from = moment().subtract(1, 'months').subtract(1, 'day').valueOf();
451         to = new Date().valueOf();
452     } else {
453         var fromDate = $('#sortie_stat_from').datepicker("getDate");
454         var toDate = $('#sortie_stat_to').datepicker("getDate");
455         if (fromDate == null || toDate == null) {
456             setSortieStat([]);
457             return;
458         }
459         from = fromDate.valueOf();
460         to = toDate.valueOf() + oneDay;
461     }
462     $.ajax({
463         url: "./海戦・ドロップ報告書.json?from=" + from + "&to=" + to,
464         success: function (data) { setSortieStat(data.data); },
465         dataType: "json", cache: false
466     });
467 }
468
469 function initSortieStatResult() {
470     var now = moment();
471     var r;
472     if (sortieStatRange === 0) {
473         r = {
474             day: { stat: {} },
475             week: { stat: {} },
476             month: { stat: {} }
477         };
478         r.day.begin = moment(now).hour(5).minute(0).second(0);
479         if (now.hour() < 5) {
480             r.day.begin.subtract(1, 'days');
481         }
482         r.week.begin = moment(now).day(1).hour(5).minute(0).second(0);
483         if (now.day() === 0 || now.day() === 1 && now.hour() < 5) {
484             r.week.begin.subtract(1, 'weeks');
485         }
486         if (moment(now).endOf('month').date() === now.date() &&
487             now.hour() >= 22) { // 月末22時以降
488             r.month.begin = moment(now).hour(22).minute(0).second(0);
489         } else {
490             r.month.begin =
491                 moment(now).date(1).subtract(1, 'days').
492                     hour(22).minute(0).second(0);
493         }
494     } else {
495         r = { all: { stat: {} } };
496         r.all.begin = moment(0);
497     }
498     return r;
499 }
500
501 function gatherSortieStat(data) {
502     var initStat = function () {
503         return { start: "-", S: 0, A: 0, B: 0, C: 0, D: 0, R: 0 }
504     };
505     var r = initSortieStatResult();
506     for (var i = 0; i < data.length; i++) {
507         var row = data[i];
508         var date = moment(row[0]);
509         var map = row[1];
510         var isBoss = row[3].indexOf("ボス") !== -1;
511         var isStart = row[3].indexOf("出撃") !== -1;
512         var resR = 0;
513         for (var j = 23; j < row.length; j++) {
514             if (/^輸送/.test(row[j]) && /^0\//.test(row[j + 1]))
515                 resR++;
516         }
517         var res = row[4];
518         if (res === "E")
519             res = "D";
520         for (var term in r) {
521             if (!r.hasOwnProperty(term))
522                 continue;
523             var to = r[term];
524             if (to.begin.isAfter(date))
525                 continue;
526             for (var b = 0; b < 4; b++) {
527                 var name = b < 2 ? "合計" : map;
528                 if (b === 1 || b === 3) {
529                     if (!isBoss)
530                         continue;
531                     name = name + " - ボス";
532                 }
533                 var mo = to.stat[name];
534                 if (!mo) {
535                     mo = to.stat[name] = initStat();
536                     if (name === "合計")
537                         to.stat["合計 - ボス"] = initStat();
538                 }
539                 mo["R"] += resR;
540                 mo[res]++;
541                 if ((b === 0 || b === 2) && isStart) {
542                     if (mo.start === "-")
543                         mo.start = 0;
544                     mo.start++;
545                 }
546             }
547         }
548     }
549     return r;
550 }
551
552 function arrangeSortieStatTable(r) {
553     for (var term in r) {
554         if (!r.hasOwnProperty(term))
555             continue;
556         var table = [];
557         var pushed = {};
558         for (var map in r[term].stat) {
559             if (!r[term].stat.hasOwnProperty(map))
560                 continue;
561             if (pushed[map])
562                 continue;
563             var e = r[term].stat[map];
564             e.map = map;
565             table.push(e);
566             pushed[map] = 1;
567             var boss = map + " - ボス";
568             e = r[term].stat[boss];
569             if (!e)
570                 continue;
571             e.map = boss;
572             table.push(e);
573             pushed[boss] = 1;
574         }
575         r[term].table = table;
576     }
577 }
578
579 function setSortieStat(data) {
580     if (!data) {
581         $('#loading').show();
582         loadSortieData();
583         return;
584     }
585     var r = gatherSortieStat(data);
586     arrangeSortieStatTable(r);
587     for (var term in r) {
588         if (!r.hasOwnProperty(term))
589             continue;
590         var dt = $("#sortie_stat_" + term).DataTable();
591         dt.clear();
592         dt.rows.add(r[term].table).draw();
593     }
594     $('#loading').hide();
595 }
596
597 function initSortieStatTables() {
598     var terms = ['day', 'week', 'month', 'all'];
599     for (var i = 0; i < terms.length; i++) {
600         $("#sortie_stat_" + terms[i]).dataTable({
601             paging: false,
602             searching: false,
603             ordering: false,
604             columns: terms[i] !== 'month' ? [
605                 { data: "map" },
606                 { data: "start" },
607                 { data: "S" },
608                 { data: "A" },
609                 { data: "B" },
610                 { data: "C" },
611                 { data: "D" },
612                 { data: "R" }
613             ] : [
614                     { data: "map" },
615                     { data: "start" },
616                     { data: "S" },
617                     { data: "A" },
618                     { data: "B" },
619                     { data: "C" },
620                     { data: "D" }
621                 ]
622         });
623     }
624 }
625
626 function selectTopTab(i) {
627     var chart = tables;
628     showChart = false;
629     if (i < tables) {
630         selectedTable = i;
631         showLog();
632     } else if (i === chart) {
633         showChart = true;
634         drawChart();
635     } else if (i === chart + 1) {
636         setSortieStat();
637     }
638     if (i < tables)
639         $('#term').show();
640     else
641         $('#term').hide();
642     var tab = $('.tab0 li');
643     tab.removeClass('select');
644     tab.eq(i).addClass('select');
645     $('#main_contents .hide').hide();
646     $('#main_contents .hide').eq(i).show();
647 }
648
649 function initAction() {
650     $('.tab0 li').click(function () {
651         var tab = $('.tab0 li');
652         var i = tab.index(this);
653         selectTopTab(i);
654         sessionStorage.setItem('prevTab', i);
655     });
656     $('#range_seq li').click(function () {
657         var tab = $('#range_seq li');
658         var i = tab.index(this);
659         seqChartRange = i;
660         chartType = 0;
661         drawChart();
662         tab.removeClass('select');
663         tab.eq(i).addClass('select');
664         sessionStorage.setItem('prevSeqRange', i);
665     });
666     $('#range_diff li').click(function () {
667         var tab = $('#range_diff li');
668         var i = tab.index(this);
669         diffChartRange = i;
670         chartType = 1;
671         drawChart();
672         tab.removeClass('select');
673         tab.eq(i).addClass('select');
674         sessionStorage.setItem('prevDiffRange', i);
675     });
676     $('input[name="chart_type"]:radio').change(function () {
677         if ($(this).val() === 0) {
678             $("#range_seq").show();
679             $("#range_diff").hide();
680             chartType = 0;
681         } else {
682             $("#range_seq").hide();
683             $("#range_diff").show();
684             chartType = 1;
685         }
686         drawChart();
687         sessionStorage.setItem('chartType', $(this).val());
688     });
689     $('#tooltip').change(function () {
690         drawChart();
691         sessionStorage.setItem('chartTooltip', $(this).prop("checked"));
692     });
693     $('#range_sortie_stat li').click(function () {
694         var tab = $('#range_sortie_stat li');
695         var i = tab.index(this);
696         sortieStatRange = i;
697         tab.removeClass('select');
698         tab.eq(i).addClass('select');
699         if (sortieStatRange === 0) {
700             $('#sortie_stat_recent_tables').show();
701             $('#sortie_stat_all_table').hide();
702         } else {
703             $('#sortie_stat_recent_tables').hide();
704             $('#sortie_stat_all_table').show();
705         }
706         setSortieStat();
707     });
708 }
709
710 function initTableDatePicker() {
711     $('#term_from').datepicker({
712         defaultDate: moment().subtract(1, 'months').toDate(),
713         onClose: function () { $('input[name=term]').val(['1']) }
714     });
715     $('#term_to').datepicker({
716         onClose: function () { $('input[name=term]').val(['1']) }
717     });
718     $('#term_apply').click(showLog);
719 }
720
721 function initChartDatePicker() {
722     $('#chart_from').datepicker({
723         onClose: function () { if (useChartDatePicker()) drawChart(); }
724     });
725     $('#chart_to').datepicker({
726         onClose: function () { if (useChartDatePicker()) drawChart(); }
727     });
728 }
729
730 function useChartDatePicker() {
731     return (chartType === 0 && seqChartRange === 5) ||
732         (chartType === 1 && diffChartRange === 4);
733 }
734
735 function initSortieStatDatePicker() {
736     $('#sortie_stat_from').datepicker({
737         onClose: function () { if (sortieStatRange === 1) setSortieStat(); }
738     });
739     $('#sortie_stat_to').datepicker({
740         onClose: function () { if (sortieStatRange === 1) setSortieStat(); }
741     });
742 }
743
744 function restoreChartSettings() {
745     var type = sessionStorage.getItem('chartType');
746     chartType = type == null ? 0 : +type;
747     var tooltip = sessionStorage.getItem('chartTooltip');
748     $('#tooltip').prop('checked', tooltip === "true");
749     var range = sessionStorage.getItem('prevSeqRange');
750     seqChartRange = range == null ? 0 : +range;
751     range = sessionStorage.getItem('prevDiffRange');
752     diffChartRange = range == null ? 0 : +range;
753     $('input[name="chart_type"]:radio').eq(chartType).prop('checked', true);
754     if (chartType === 0) {
755         $('#range_seq').show();
756         $('#range_diff').hide();
757     } else {
758         $('#range_seq').hide();
759         $('#range_diff').show();
760     }
761     $('#range_diff li').removeClass('select');
762     $('#range_diff li').eq(diffChartRange).addClass('select');
763     $('#range_seq li').removeClass('select');
764     $('#range_seq li').eq(seqChartRange).addClass('select');
765 }
766
767 $(function () {
768     $.fn.dataTable.ext.errMode = 'throw';
769     initAction();
770     initTableDatePicker();
771     initChartDatePicker();
772     initSortieStatDatePicker();
773     $('table').addClass('display compact cell-border');
774     initTables();
775     initSortieStatTables();
776     $('#range_sortie_stat li').removeClass('select');
777     $('#range_sortie_stat li').eq(sortieStatRange).addClass('select');
778     restoreChartSettings();
779     var prev = sessionStorage.getItem('prevTab');
780     selectTopTab(prev == null ? 0 : +prev);
781 });
782 </script>
783
784 <div id="loading"><img src="https://kancollesniffer.osdn.jp/ajax-loader.gif" alt="読み込み中..."></div>
785
786 <ul class="tab tab0">
787 <li>ドロップ</li>
788 <li>海戦</li>
789 <li>遠征</li>
790 <li>開発</li>
791 <li>建造</li>
792 <li>改修</li>
793 <li>資材</li>
794 <li>資材グラフ</li>
795 <li>出撃統計</li>
796 </ul>
797
798 <form id="term">
799 <p>
800 <label><input type="radio" name="term" value="0" checked="checked">直近一か月</label>
801 <label><input type="radio" name="term" value="1">期間指定: </label>
802 <input type="text" id="term_from" style="width: 7em">~<input type="text" id="term_to" style="width: 7em">
803 <input type="button" id="term_apply" value="適用">
804 </p>
805 </form>
806
807 <ul class="contents" id="main_contents">
808 <li class="hide">
809 <table id="log0">
810 <thead>
811 <tr><th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>ドロップ艦種</th><th>ドロップ艦娘</th></tr>
812 </thead>
813 </table>
814
815 <li class="hide">
816 <table id="log1">
817 <thead>
818 <tr><th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>艦隊行動</th><th>味方陣形</th><th>敵陣形</th><th>敵艦隊</th><th>味方艦1</th><th>味方艦1HP</th><th>味方艦2</th><th>味方艦2HP</th><th>味方艦3</th><th>味方艦3HP</th><th>味方艦4</th><th>味方艦4HP</th><th>味方艦5</th><th>味方艦5HP</th><th>味方艦6</th><th>味方艦6HP</th><th>敵艦1</th><th>敵艦1HP</th><th>敵艦2</th><th>敵艦2HP</th><th>敵艦3</th><th>敵艦3HP</th><th>敵艦4</th><th>敵艦4HP</th><th>敵艦5</th><th>敵艦5HP</th><th>敵艦6</th><th>敵艦6HP</th><th>味方制空値</th><th>敵制空値</th><th>制空状態</th></tr>
819 </thead>
820 </table>
821
822 <li class="hide">
823 <table id="log2">
824 <thead>
825 <tr><th>日付</th><th>結果</th><th>遠征</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>高速修復材</th><th>高速建造材</th></tr>
826 </thead>
827 </table>
828
829 <li class="hide">
830 <table id="log3">
831 <thead>
832 <tr><th>日付</th><th>開発装備</th><th>種別</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>秘書艦</th><th>司令部Lv</th></tr>
833 </thead>
834 </table>
835
836 <li class="hide">
837 <table id="log4">
838 <thead>
839 <tr><th>日付</th><th>種類</th><th>名前</th><th>艦種</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>空きドック</th><th>秘書艦</th><th>司令部Lv</th></tr>
840 </thead>
841 </table>
842
843 <li class="hide">
844 <table id="log5">
845 <thead>
846 <tr><th>日付</th><th>改修装備</th><th>レベル</th><th>成功</th><th>確実化</th><th>消費装備</th><th>消費数</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>改修資材</th><th>秘書艦</th><th>二番艦</th></tr>
847 </thead>
848 </table>
849
850 <li class="hide">
851 <table id="log6">
852 <thead>
853 <tr><th>日付</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>高速建造材</th><th>高速修復材</th><th>開発資材</th><th>改修資材</th></tr>
854 </thead>
855 </table>
856
857 <li class="hide">
858 <form id="chart_type">
859 <div style="margin: 0 0 0.5em 1em;">
860 <label><input type="radio" name="chart_type" value="0" checked="checked">連続</label>
861 <label><input type="radio" name="chart_type" value="1">差分</label>
862 </div>
863 </form>
864 <ul class="tab tab1" id="range_seq" style="float: left; margin-right: 0.2em">
865 <li>一日</li>
866 <li>一週間</li>
867 <li>一か月</li>
868 <li>三か月</li>
869 <li>すべて</li>
870 <li>期間指定</li>
871 </ul>
872 <ul class="tab tab1" id="range_diff" style="float: left; margin-right: 0.2em">
873 <li>一か月(日)</li>
874 <li>三か月(日)</li>
875 <li>半年(週)</li>
876 <li>すべて(週)</li>
877 <li>期間指定</li>
878 </ul>
879 <div style="padding: 0.2em 0;">
880 <input type="text" id="chart_from" style="width: 7em">~<input type="text" id="chart_to" style="width: 7em">
881 <label><input type="checkbox" id="tooltip" value="" style="margin-left: 2em;">ツールチップ</label>
882 </div>
883 <div id="chart" style="clear: both; margin: 1em;"></div>
884
885 <li class="hide">
886 <ul class="tab tab1" id="range_sortie_stat" style="float: left; margin-right: 0.2em">
887 <li>直近</li>
888 <li>期間指定</li>
889 </ul>
890 <div style="padding: 0.2em 0;">
891 <input type="text" id="sortie_stat_from" style="width: 7em">~<input type="text" id="sortie_stat_to" style="width: 7em">
892 </div>
893
894 <div id="sortie_stat_recent_tables" style="clear: both;">
895
896 <h3>今日</h3>
897 <table id="sortie_stat_day">
898 <thead>
899 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
900 </thead>
901 </table>
902
903 <h3>今週</h3>
904 <table id="sortie_stat_week">
905 <thead>
906 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
907 </table>
908
909 <h3>今月</h3>
910 <table id="sortie_stat_month">
911 <thead>
912 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th></tr>
913 </table>
914 </div>
915
916 <div id="sortie_stat_all_table" style="display: none;">
917 <table id="sortie_stat_all">
918 <thead>
919 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
920 </thead>
921 </table>
922 </div>
923
924 </ul>
925 </body>
926 </html>