5 <title>各種報告書 - KancolleSniffer</title>
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.18.1/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>
19 font-family:'Lucida Grande','Hiragino Kaku Gothic ProN', Meiryo, sans-serif;
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;}
46 /* global moment, c3, $ */
48 var oneDay = 3600 * 24 * 1000;
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");
56 query = "?from=" + from.valueOf();
58 query += "&to=" + (to.valueOf() + oneDay);
70 var url = jsons[selectedTable] + query;
71 $('#log' + selectedTable).DataTable().ajax.url(url).load();
76 function initTables() {
77 for (var t = 0; t < tables; t++) {
84 lengthMenu: [[50, 100, 200, -1], [50, 100, 200, "All"]],
85 drawCallback: function () {
90 opts.columns = [{ data: 0 }, { data: 1 }, { data: 2 }, { data: 3 }, { data: 4 }, { data: 9 }, { data: 10 }];
93 for (var i = 0; i < 38; i++) {
94 if (i === 9 || i === 10)
96 entries.push({ data: i });
98 opts.columns = entries;
100 $('#log' + t).dataTable(opts);
104 var timeFormat = "YYYY-MM-DD HH:mm:ss";
105 function parseDate(d) {
106 return moment(d, timeFormat);
109 function toString(d) {
110 return d.format(timeFormat);
113 function to5am(tick) {
114 return tick - tick % (3600 * 24000) - 3600 * 4000;
117 var selectedTable = 0;
118 var seqChartRange = 0;
119 var diffChartRange = 0;
121 var showChart = false;
122 var currentPickedData;
124 function drawChart(data) {
126 $('#loading').show();
127 $.get("./資材ログ.json?time=" + Date.now(), function (d) { drawChart(d); }, "json");
131 if (chartType === 0) {
132 picked = pickChartData(data.data, seqChartRange);
133 header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ", "高速建造材", "高速修復材", "開発資材", "改修資材"];
134 picked.data.unshift(header);
135 drawSeqChart(picked);
136 currentPickedData = picked;
138 picked = pickDiffChartData(data.data, diffChartRange);
139 header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ"];
140 picked.data.unshift(header);
141 drawDiffChart(picked);
142 currentPickedData = picked;
146 var chartSeq, chartDiff;
148 function redrawChart() {
149 if (!currentPickedData)
151 $('#loading').show();
152 setTimeout(function () {
154 chartSeq.resize(chartSize());
156 chartDiff.resize(chartSize());
161 $(window).resize(function () {
164 timer = setTimeout(function () {
170 function chartSize() {
171 var pxPerEm = Number($('#chart').css('fontSize').match(/(\d*(\.\d*)?)px/)[1]);
173 height: Math.max($(document).height() - 15 * pxPerEm, 400),
174 width: Math.max($(document).width() - 6 * pxPerEm, 800)
178 var seqChartUnselected = {};
180 function drawSeqChart(picked) {
181 var size = chartSize();
182 chartSeq = c3.generate({
190 xFormat: '%Y-%m-%d %X',
207 show: $('#tooltip').prop('checked')
219 format: function (x) { return moment(x).format("MM-DD HH:mm"); },
229 onclick: function(id) {
230 seqChartUnselected[id] = !seqChartUnselected[id];
235 onrendered: function () { $('#loading').hide(); }
237 for (var id in seqChartUnselected) {
238 if (seqChartUnselected.hasOwnProperty(id) && seqChartUnselected[id])
243 function pickChartData(data, range) {
247 var first = moment(data[0][0]).valueOf();
248 var last = moment(data[data.length - 1][0]).valueOf();
249 var interval, tickInterval, lastTick;
252 first = moment(last).subtract(24, 'hours').valueOf();
255 first = moment(last).subtract(7, 'days').valueOf();
258 first = moment(last).subtract(1, 'months').valueOf();
261 first = moment(last).subtract(3, 'months').valueOf();
264 first = moment(data[0][0]).valueOf();
267 var fromDate = $('#chart_from').datepicker("getDate");
268 var toDate = $('#chart_to').datepicker("getDate");
269 if (fromDate == null || toDate == null)
270 return { data: [], tick: [], grid: [] };
271 var from = fromDate.valueOf() + 3600 * 5000;
272 var to = toDate.valueOf() + oneDay + 3600 * 5000;
273 first = Math.max(first, from);
274 last = Math.min(last, to);
277 if (last <= first + oneDay) {
279 tickInterval = 3600 * 1000;
280 lastTick = last - last % tickInterval;
281 } else if (last <= first + oneDay * 21) {
283 tickInterval = oneDay;
284 lastTick = to5am(last);
285 } else if (last <= first + oneDay * 63) {
286 interval = 3600 * 1000;
287 tickInterval = oneDay * 7;
288 lastTick = to5am(moment(last).day(1).valueOf());
289 } else if (last <= first + oneDay * 126) {
290 interval = 3600 * 6000;
291 tickInterval = oneDay * 14;
292 lastTick = to5am(moment(last).day(1).valueOf());
294 interval = 3600 * 12000;
295 tickInterval = oneDay * 28;
296 lastTick = to5am(moment(last).day(1).valueOf());
299 for (var i = data.length - 1; i >= 0; i--) {
301 var date = parseDate(row[0]).valueOf();
304 var v = date - date % interval;
305 if (lastData !== v) {
306 newdata.unshift(row);
314 for (var tick = lastTick; tick > lastData; tick -= tickInterval) {
315 var str = toString(moment(tick));
317 grid.unshift({ value: str });
319 return { data: newdata, tick: ticks, grid: grid };
322 var diffChartUnselected = {};
324 function drawDiffChart(picked) {
325 var size = chartSize();
326 chartDiff = c3.generate({
334 xFormat: '%Y-%m-%d %X',
343 groups: [["燃料", "弾薬", "鋼材", "ボーキ"]]
351 show: $('#tooltip').prop('checked')
368 format: function (x) { return moment(x).format("MM-DD HH:mm"); },
375 onclick: function(id) {
376 diffChartUnselected[id] = !diffChartUnselected[id];
377 chartDiff.toggle(id);
381 onrendered: function () { $('#loading').hide(); }
383 for (var id in diffChartUnselected) {
384 if (diffChartUnselected.hasOwnProperty(id) && diffChartUnselected[id])
385 chartDiff.toggle(id);
389 function pickDiffChartData(data, range) {
393 var first = moment(data[0][0]).valueOf();
394 var last = moment(data[data.length - 1][0]).valueOf();
395 var interval, tickInterval, lastTick;
396 var oneDay = 3600 * 24 * 1000;
399 first = moment(last).subtract(1, 'months').valueOf();
402 first = moment(last).subtract(3, 'months').valueOf();
405 first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
408 first = moment(data[0][0]).valueOf();
411 var fromDate = $('#chart_from').datepicker("getDate");
412 var toDate = $('#chart_to').datepicker("getDate");
413 if (fromDate == null || toDate == null)
414 return { data: [], tick: [], grid: [] };
415 var from = fromDate.valueOf() + 3600 * 5000;
416 var to = toDate.valueOf() + oneDay + 3600 * 5000;
417 first = Math.max(first, from);
418 last = Math.min(last, to);
422 if (last <= first + oneDay * 2 * 31) {
424 tickInterval = oneDay * 2;
425 lastTick = to5am(last);
427 } else if (last <= first + oneDay * 3 * 31) {
429 tickInterval = oneDay * 7;
430 lastTick = to5am(last);
433 interval = oneDay * 7;
434 tickInterval = oneDay * 28;
435 lastTick = to5am(moment(last).day(1).valueOf());
437 if (last <= first + oneDay * 6 * 38) {
438 tickInterval = oneDay * 14;
442 var lastDate = lastTick;
444 for (var i = data.length - 1; i >= 0; i--) {
446 var date = parseDate(row[0]).valueOf();
447 if (date > first && date <= last) {
452 if (date <= lastDate) {
453 var newrow = [prevRow[0]];
454 for (var r = 1; r < 5; r++) {
455 newrow.push(prevRow[r] - row[r]);
457 newdata.unshift(newrow);
458 lastDate = lastDate - interval;
465 if (tickInterval >= oneDay * 7)
466 lastTick = moment(lastTick).day(1).hour(5).minute(0).valueOf();
467 for (var tick = lastTick; tick > lastDate; tick -= tickInterval) {
468 var str = toString(moment(tick));
470 grid.unshift({ value: str });
472 return { data: newdata, tick: ticks, grid: grid, width: barWidth };
475 var sortieStatRange = 0;
477 function loadSortieData() {
479 if (sortieStatRange === 0) {
480 from = moment().subtract(1, 'months').subtract(1, 'day').valueOf();
481 to = new Date().valueOf();
483 var fromDate = $('#sortie_stat_from').datepicker("getDate");
484 var toDate = $('#sortie_stat_to').datepicker("getDate");
485 if (fromDate == null || toDate == null) {
489 from = fromDate.valueOf();
490 to = toDate.valueOf() + oneDay;
493 url: "./海戦・ドロップ報告書.json?from=" + from + "&to=" + to,
494 success: function (data) { setSortieStat(data.data); },
495 dataType: "json", cache: false
499 function initSortieStatResult() {
502 if (sortieStatRange === 0) {
508 r.day.begin = moment(now).hour(5).minute(0).second(0);
509 if (now.hour() < 5) {
510 r.day.begin.subtract(1, 'days');
512 r.week.begin = moment(now).day(1).hour(5).minute(0).second(0);
513 if (now.day() === 0 || now.day() === 1 && now.hour() < 5) {
514 r.week.begin.subtract(1, 'weeks');
516 if (moment(now).endOf('month').date() === now.date() &&
517 now.hour() >= 22) { // 月末22時以降
518 r.month.begin = moment(now).hour(22).minute(0).second(0);
521 moment(now).date(1).subtract(1, 'days').
522 hour(22).minute(0).second(0);
525 r = { all: { stat: {} } };
526 r.all.begin = moment(0);
531 function gatherSortieStat(data) {
532 var initStat = function () {
533 return { start: "-", S: 0, A: 0, B: 0, C: 0, D: 0, R: 0 }
535 var r = initSortieStatResult();
536 for (var i = 0; i < data.length; i++) {
538 var date = moment(row[0]);
540 var isBoss = row[3].indexOf("ボス") !== -1;
541 var isStart = row[3].indexOf("出撃") !== -1;
543 for (var j = 23; j < row.length; j++) {
544 if (/^輸送/.test(row[j]) && /^0\//.test(row[j + 1]))
550 for (var term in r) {
551 if (!r.hasOwnProperty(term))
554 if (to.begin.isAfter(date))
556 for (var b = 0; b < 4; b++) {
557 var name = b < 2 ? "合計" : map;
558 if (b === 1 || b === 3) {
561 name = name + " - ボス";
563 var mo = to.stat[name];
565 mo = to.stat[name] = initStat();
567 to.stat["合計 - ボス"] = initStat();
571 if ((b === 0 || b === 2) && isStart) {
572 if (mo.start === "-")
582 function arrangeSortieStatTable(r) {
583 for (var term in r) {
584 if (!r.hasOwnProperty(term))
588 for (var map in r[term].stat) {
589 if (!r[term].stat.hasOwnProperty(map))
593 var e = r[term].stat[map];
597 var boss = map + " - ボス";
598 e = r[term].stat[boss];
605 r[term].table = table;
609 function setSortieStat(data) {
611 $('#loading').show();
615 var r = gatherSortieStat(data);
616 arrangeSortieStatTable(r);
617 for (var term in r) {
618 if (!r.hasOwnProperty(term))
620 var dt = $("#sortie_stat_" + term).DataTable();
622 dt.rows.add(r[term].table).draw();
624 $('#loading').hide();
627 function initSortieStatTables() {
628 var terms = ['day', 'week', 'month', 'all'];
629 for (var i = 0; i < terms.length; i++) {
630 $("#sortie_stat_" + terms[i]).dataTable({
634 columns: terms[i] !== 'month' ? [
656 function showAchivementTable(data) {
657 var expPerAch = 10000 / 7.0;
659 $('#loading').show();
662 success: function (data) {
663 showAchivementTable(data.data);
672 var endOfMonth = null;
675 var endOfYear = null;
677 var carryOverAch = 0;
682 for (var i = 0; i < data.length; i++) {
684 var date = parseDate(row[0]);
685 var exp = row[1] - 0;
687 var isNewYear = endOfYear == null || date.isSameOrAfter(endOfYear);
688 var isNewMonth = endOfMonth == null || date.isSameOrAfter(endOfMonth);
689 var isNewDate = nextDate == null || date.isSameOrAfter(nextDate);
690 if (isNewDate || isNewMonth || isNewYear) {
691 if (nextDate != null) {
693 (isNewDate ? nextDate.subtract(1, 'days') : endOfMonth).format("YYYY-MM-DD"),
694 new Number((lastExp - prevExp) / expPerAch).toFixed(1), dayEo,
695 new Number((lastExp - monthExp) / expPerAch + monthEo + carryOverAch + carryOverEo).toFixed(1)
698 prevExp = lastExp === -1 ? exp : lastExp;
700 endOfYear = date.clone().endOf('year').hour(22).startOf('hour');
701 if (endOfYear.isSameOrBefore(date))
702 endOfYear.add(1, 'year').endOf('year');
703 yearExp = lastExp === -1 ? exp : lastExp;
706 endOfMonth = date.clone().endOf('month').hour(22).startOf('hour');
707 if (endOfMonth.isSameOrBefore(date))
708 endOfMonth.add(1, 'month').endOf('month');
709 monthExp = lastExp === -1 ? exp : lastExp;
710 carryOverEo = monthEo * expPerAch / 50000;
711 carryOverAch = (monthExp - yearExp) / 50000;
713 result.push([endOfMonth.format("YYYY-MM 引継"),
714 carryOverAch.toFixed(1), carryOverEo.toFixed(1), (carryOverAch + carryOverEo).toFixed(1)]);
717 nextDate = date.clone().hour(5).startOf('hour');
718 if (date.hour() >= 5)
719 nextDate.add(1, 'days');
720 if (nextDate.date() === 1)
721 nextDate.add(1, 'days');
727 var dt = $('#achivement_table').DataTable();
729 dt.rows.add(result).draw();
730 $('#loading').hide();
733 function initAchievementTable() {
734 $("#achivement_table").dataTable({
738 order: [[0, "desc"]],
740 lengthMenu: [[50, 100, 200, -1], [50, 100, 200, "All"]],
741 drawCallback: function () {
742 $('#loading').hide();
747 function selectTopTab(i) {
753 } else if (i === chart) {
756 } else if (i === chart + 1) {
757 showAchivementTable();
758 } else if (i === chart + 2) {
765 var tab = $('.tab0 li');
766 tab.removeClass('select');
767 tab.eq(i).addClass('select');
768 $('#main_contents .hide').hide();
769 $('#main_contents .hide').eq(i).show();
772 function initAction() {
773 $('.tab0 li').click(function () {
774 var tab = $('.tab0 li');
775 var i = tab.index(this);
777 sessionStorage.setItem('prevTab', i);
779 $('#range_seq li').click(function () {
780 var tab = $('#range_seq li');
781 var i = tab.index(this);
785 tab.removeClass('select');
786 tab.eq(i).addClass('select');
787 sessionStorage.setItem('prevSeqRange', i);
789 $('#range_diff li').click(function () {
790 var tab = $('#range_diff li');
791 var i = tab.index(this);
795 tab.removeClass('select');
796 tab.eq(i).addClass('select');
797 sessionStorage.setItem('prevDiffRange', i);
799 $('input[name="chart_type"]:radio').change(function () {
800 if ($(this).val() === "0") {
801 $("#range_seq").show();
802 $("#range_diff").hide();
805 $("#range_seq").hide();
806 $("#range_diff").show();
810 sessionStorage.setItem('chartType', $(this).val());
812 $('#tooltip').change(function () {
814 sessionStorage.setItem('chartTooltip', $(this).prop("checked"));
816 $('#range_sortie_stat li').click(function () {
817 var tab = $('#range_sortie_stat li');
818 var i = tab.index(this);
820 tab.removeClass('select');
821 tab.eq(i).addClass('select');
822 if (sortieStatRange === 0) {
823 $('#sortie_stat_recent_tables').show();
824 $('#sortie_stat_all_table').hide();
826 $('#sortie_stat_recent_tables').hide();
827 $('#sortie_stat_all_table').show();
833 function initTableDatePicker() {
834 $('#term_from').datepicker({
835 defaultDate: moment().subtract(1, 'months').toDate(),
836 onClose: function () { $('input[name=term]').val(['1']) }
838 $('#term_to').datepicker({
839 onClose: function () { $('input[name=term]').val(['1']) }
841 $('#term_apply').click(showLog);
844 function initChartDatePicker() {
845 $('#chart_from').datepicker({
846 onClose: function () { if (useChartDatePicker()) drawChart(); }
848 $('#chart_to').datepicker({
849 onClose: function () { if (useChartDatePicker()) drawChart(); }
853 function useChartDatePicker() {
854 return (chartType === 0 && seqChartRange === 5) ||
855 (chartType === 1 && diffChartRange === 4);
858 function initSortieStatDatePicker() {
859 $('#sortie_stat_from').datepicker({
860 onClose: function () { if (sortieStatRange === 1) setSortieStat(); }
862 $('#sortie_stat_to').datepicker({
863 onClose: function () { if (sortieStatRange === 1) setSortieStat(); }
867 function restoreChartSettings() {
868 var type = sessionStorage.getItem('chartType');
869 chartType = type == null ? 0 : +type;
870 var tooltip = sessionStorage.getItem('chartTooltip');
871 $('#tooltip').prop('checked', tooltip === "true");
872 var range = sessionStorage.getItem('prevSeqRange');
873 seqChartRange = range == null ? 0 : +range;
874 range = sessionStorage.getItem('prevDiffRange');
875 diffChartRange = range == null ? 0 : +range;
876 $('input[name="chart_type"]:radio').eq(chartType).prop('checked', true);
877 if (chartType === 0) {
878 $('#range_seq').show();
879 $('#range_diff').hide();
881 $('#range_seq').hide();
882 $('#range_diff').show();
884 $('#range_diff li').removeClass('select');
885 $('#range_diff li').eq(diffChartRange).addClass('select');
886 $('#range_seq li').removeClass('select');
887 $('#range_seq li').eq(seqChartRange).addClass('select');
891 $.fn.dataTable.ext.errMode = 'throw';
893 initTableDatePicker();
894 initChartDatePicker();
895 initSortieStatDatePicker();
896 $('table').addClass('display compact cell-border');
898 initAchievementTable();
899 initSortieStatTables();
900 $('#range_sortie_stat li').removeClass('select');
901 $('#range_sortie_stat li').eq(sortieStatRange).addClass('select');
902 restoreChartSettings();
903 var prev = sessionStorage.getItem('prevTab');
904 selectTopTab(prev == null ? 0 : +prev);
908 <div id="loading"><img src="https://kancollesniffer.osdn.jp/ajax-loader.gif" alt="読み込み中..."></div>
910 <ul class="tab tab0">
925 <label><input type="radio" name="term" value="0" checked="checked">直近一か月</label>
926 <label><input type="radio" name="term" value="1">期間指定: </label>
927 <input type="text" id="term_from" style="width: 7em">~<input type="text" id="term_to" style="width: 7em">
928 <input type="button" id="term_apply" value="適用">
932 <ul class="contents" id="main_contents">
936 <tr><th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>ドロップ艦種</th><th>ドロップ艦娘</th></tr>
943 <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>
950 <tr><th>日付</th><th>結果</th><th>遠征</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>高速修復材</th><th>高速建造材</th></tr>
957 <tr><th>日付</th><th>開発装備</th><th>種別</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>秘書艦</th><th>司令部Lv</th></tr>
964 <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>
971 <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>
978 <tr><th>日付</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>高速建造材</th><th>高速修復材</th><th>開発資材</th><th>改修資材</th></tr>
983 <form id="chart_type">
984 <div style="margin: 0 0 0.5em 1em;">
985 <label><input type="radio" name="chart_type" value="0" checked="checked">連続</label>
986 <label><input type="radio" name="chart_type" value="1">差分</label>
989 <ul class="tab tab1" id="range_seq" style="float: left; margin-right: 0.2em">
997 <ul class="tab tab1" id="range_diff" style="float: left; margin-right: 0.2em">
1004 <div style="padding: 0.2em 0;">
1005 <input type="text" id="chart_from" style="width: 7em">~<input type="text" id="chart_to" style="width: 7em">
1006 <label><input type="checkbox" id="tooltip" value="" style="margin-left: 2em;">ツールチップ</label>
1008 <div id="chart" style="clear: both; margin: 1em;"></div>
1011 <table id="achivement_table">
1013 <tr><th>日付</th><th>戦果</th><th>EO</th><th>月毎</th></tr>
1018 <ul class="tab tab1" id="range_sortie_stat" style="float: left; margin-right: 0.2em">
1022 <div style="padding: 0.2em 0;">
1023 <input type="text" id="sortie_stat_from" style="width: 7em">~<input type="text" id="sortie_stat_to" style="width: 7em">
1026 <div id="sortie_stat_recent_tables" style="clear: both;">
1029 <table id="sortie_stat_day">
1031 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
1036 <table id="sortie_stat_week">
1038 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
1042 <table id="sortie_stat_month">
1044 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th></tr>
1048 <div id="sortie_stat_all_table" style="display: none;">
1049 <table id="sortie_stat_all">
1051 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>