5 <title>各種報告書 - KancolleSniffer</title>
7 <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
8 <script src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/js/jquery.dataTables.min.js"></script>
9 <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/css/jquery.dataTables.min.css">
10 <script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js"></script>
11 <script src="//cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.js"></script>
12 <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.css">
13 <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
14 <script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
15 <link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
16 <script src="//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: 0em 0em 2em 1em; padding: 0em;}
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: 0em; padding: 0em;}
28 .hide {display: none;}
47 var query = "?from=" + moment().subtract(1, 'months').valueOf();
48 if ($('input[name=term]:eq(1)').prop('checked')) {
49 from = $('#term_from').datepicker("getDate");
50 to = $('#term_to').datepicker("getDate");
52 query = "?from=" + from.valueOf();
54 query += "&to=" + (to.valueOf() + 3600 * 24 * 1000);
66 var url = jsons[selectedTable] + query;
67 $('#log' + selectedTable).DataTable().ajax.url(url).load();
74 for (var t = 0; t < tables; t++) {
81 lengthMenu: [[50, 100, 200, -1],[50, 100, 200, "All"]],
82 drawCallback: function () {
87 opts.columns = [{data: 0}, {data: 1}, {data: 2}, {data: 3}, {data: 4}, {data: 9}, {data: 10}];
90 for (i = 0; i < 35; i++) {
91 if (i == 9 || i == 10)
93 entries.push({data: i})
95 opts.columns = entries;
97 $('#log' + t).dataTable(opts);
101 const timeFormat = "YYYY-MM-DD HH:mm:ss";
102 function parseDate(d)
104 return moment(d, timeFormat);
109 return d.format(timeFormat);
114 return tick - tick % (3600 * 24000) - 3600 * 4000;
117 var selectedTable = 0;
118 var seqChartRange = 0;
119 var diffChartRange = 0;
122 function drawChart(data)
125 $('#loading').show();
126 $.get("./資材ログ.json?time=" + Date.now(), function (data) { drawChart(data);}, "json");
135 function drawSeqChart(data)
137 picked = pickChartData(data.data, seqChartRange);
138 var header = ["日付","燃料","弾薬","鋼材","ボーキ","高速建造材","高速修復材","開発資材","改修資材"];
139 picked.data.unshift(header);
140 var chart = c3.generate({
148 xFormat: '%Y-%m-%d %X',
165 show: $('#tooltip').prop('checked')
177 format: function (x) { return moment(x).format("MM-DD HH:mm"); },
186 onrendered: function () { $('#loading').hide(); }
190 function pickChartData(data, range)
195 var first = moment(data[0][0]).valueOf();
196 var last = moment(data[data.length - 1][0]).valueOf();
197 var interval, tickInterval, lastTick;
198 const oneDay = 3600 * 24 * 1000;
201 first = moment(last).subtract(24, 'hours').valueOf();
204 first = moment(last).subtract(7, 'days').valueOf();
207 first = moment(last).subtract(1, 'months').valueOf();
210 first = moment(last).subtract(3, 'months').valueOf();
213 first = moment(data[0][0]).valueOf();
216 fromDate = $('#chart_from').datepicker("getDate");
217 toDate = $('#chart_to').datepicker("getDate");
218 if (fromDate == null || toDate == null)
219 return { data: [], tick: [], grid: [] };
220 from = fromDate.valueOf() + 3600 * 5000;
221 to = toDate.valueOf() + oneDay + 3600 * 5000;
222 first = Math.max(first, from);
223 last = Math.min(last, to);
226 if (last <= first + oneDay) {
228 tickInterval = 3600 * 1000;
229 lastTick = last - last % tickInterval;
230 } else if (last <= first + oneDay * 21) {
232 tickInterval = oneDay;
233 lastTick = to5am(last);
234 } else if (last <= first + oneDay * 63) {
235 interval = 3600 * 2000;
236 tickInterval = oneDay * 7;
237 lastTick = to5am(moment(last).day(1).valueOf());
239 interval = 3600 * 12000;
240 tickInterval = oneDay * 14;
241 lastTick = to5am(moment(last).day(1).valueOf());
244 for (var i = data.length - 1; i >= 0; i--) {
246 var date = parseDate(row[0]).valueOf();
249 var v = date - date % interval;
250 if (last_data != v) {
251 newdata.unshift(row);
259 for (var tick = lastTick; tick > last_data; tick -= tickInterval)
261 var str = toString(moment(tick));
263 grid.unshift({value: str});
265 return { data: newdata, tick: ticks, grid: grid };
268 function drawDiffChart(data)
270 picked = pickDiffChartData(data.data, diffChartRange);
271 var header = ["日付","燃料","弾薬","鋼材","ボーキ"];
272 picked.data.unshift(header);
273 var chart = c3.generate({
281 xFormat: '%Y-%m-%d %X',
290 groups: [["燃料", "弾薬", "鋼材", "ボーキ"]]
298 show: $('#tooltip').prop('checked')
315 format: function (x) { return moment(x).format("MM-DD HH:mm"); },
321 onrendered: function () { $('#loading').hide(); }
325 function pickDiffChartData(data, range)
330 var first = moment(data[0][0]).valueOf();
331 var last = moment(data[data.length - 1][0]).valueOf();
332 var interval, tickInterval, lastTick;
333 const oneDay = 3600 * 24 * 1000;
336 first = moment(last).subtract(1, 'months').valueOf();
339 first = moment(last).subtract(3, 'months').valueOf();
342 first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
345 first = moment(data[0][0]).valueOf();
348 fromDate = $('#chart_from').datepicker("getDate");
349 toDate = $('#chart_to').datepicker("getDate");
350 if (fromDate == null || toDate == null)
351 return { data: [], tick: [], grid: [] };
352 from = fromDate.valueOf() + 3600 * 5000;
353 to = toDate.valueOf() + oneDay + 3600 * 5000;
354 first = Math.max(first, from);
355 last = Math.min(last, to);
358 if (last <= first + oneDay * 2 * 31) {
360 tickInterval = oneDay * 2;
361 lastTick = to5am(last);
363 } else if (last <= first + oneDay * 3 * 31) {
365 tickInterval = oneDay * 7;
366 lastTick = to5am(last);
369 interval = oneDay * 7;
370 tickInterval = oneDay * 14;
371 lastTick = to5am(moment(last).day(1).valueOf());
373 if (last <= first + oneDay * 8 * 31){
374 tickInterval = oneDay * 7;
378 var last_date = lastTick;
380 for (var i = data.length - 1; i >= 0; i--) {
382 var date = parseDate(row[0]).valueOf();
383 if (date > first && date <= last) {
388 if (date <= last_date) {
389 var newrow = [prev_row[0]];
390 for (var r = 1; r < 5; r++) {
391 newrow.push(prev_row[r] - row[r] )
393 newdata.unshift(newrow);
394 last_date = last_date - interval;
401 if (tickInterval >= oneDay * 7)
402 lastTick = moment(lastTick).day(1).hour(5).minute(0).valueOf();
403 for (var tick = lastTick; tick > last_date; tick -= tickInterval)
405 var str = toString(moment(tick));
407 grid.unshift({value: str});
409 return { data: newdata, tick: ticks, grid: grid, width: barWidth };
412 function setSortieStat(data) {
414 $('#loading').show();
415 var from = moment().subtract(1, 'months').valueOf();
416 $.get("./海戦・ドロップ報告書.json?time=" + Date.now() + "&from=" + from, function (data) { setSortieStat(data.data);}, "json");
424 var initStat = function () { return {start:"-", S:0, A:0, B:0, C:0, D:0, R:0} };
426 r.day.begin = moment(now).hour(5).minute(0);
427 if (now.hour() < 5) {
428 r.day.begin.subtract(1, 'days');
430 r.week.begin = moment(now).day(1).hour(5).minute(0);
431 if (now.day() == 0 || now.day() == 1 && now.hour() < 5) {
432 r.week.begin.subtract(1, 'weeks');
434 r.month.begin = moment(now).date(1).hour(5).minute(0);
435 if (now.date() == 1 && now.hours() < 5) {
436 r.month.begin.subtract(1, 'months');
438 for (var i = 0; i < data.length; i++) {
440 var date = moment(row[0]);
442 var isBoss = row[3].indexOf("ボス") != -1;
443 var isStart = row[3].indexOf("出撃") != -1;
445 for (var j = 23; j < row.length; j++) {
446 if (/^輸送/.test(row[j]) && /^0\//.test(row[j + 1]))
452 for (var term in r) {
454 if (to.begin.isAfter(date))
456 for (var b = 0; b < 4; b++) {
457 var name = b < 2 ? "合計" : map;
458 if (b == 1 || b == 3) {
461 name = name + " - ボス";
463 var mo = to.stat[name];
465 mo = to.stat[name] = initStat();
467 to.stat["合計 - ボス"] = initStat();
471 if ((b == 0 || b == 2) && isStart)
482 for (map in r[term].stat)
484 var e = r[term].stat[map];
488 var dt = $("#sortie_stat_" + term).DataTable();
490 dt.rows.add(table).draw();
492 $('#loading').hide();
495 function initSortieStat()
497 var terms = ['day', 'week', 'month'];
498 for (var i = 0; i < terms.length; i++) {
499 $("#sortie_stat_" + terms[i]).dataTable({
503 columns: terms[i] != 'month' ? [
525 function selectTopTab(i)
531 } else if (i == chart) {
533 } else if (i == chart + 1) {
540 var tab = $('.tab0 li');
541 tab.removeClass('select');
542 tab.eq(i).addClass('select');
543 $('.contents .hide').hide();
544 $('.contents .hide').eq(i).show();
547 function initAction()
549 $('.tab0 li').click(function() {
550 var tab = $('.tab0 li');
551 var i = tab.index(this)
553 sessionStorage.setItem('prevTab', i);
555 $('#range_seq li').click(function() {
556 var tab = $('#range_seq li');
557 var i = tab.index(this);
561 tab.removeClass('select');
562 tab.eq(i).addClass('select');
563 sessionStorage.setItem('prevSeqRange', i);
565 $('#range_diff li').click(function() {
566 var tab = $('#range_diff li');
567 var i = tab.index(this);
571 tab.removeClass('select');
572 tab.eq(i).addClass('select');
573 sessionStorage.setItem('prevDiffRange', i);
575 $('input[name="chart_type"]:radio').change(function() {
576 if ($(this).val() == 0) {
577 $("#range_seq").show();
578 $("#range_diff").hide();
581 $("#range_seq").hide();
582 $("#range_diff").show();
586 sessionStorage.setItem('chartType', $(this).val());
588 $('#tooltip').change(function() {
593 function initTableDatePicker()
595 $('#term_from').datepicker({
596 defaultDate: moment().subtract(1, 'months').toDate(),
597 onClose: function() {$('input[name=term]').val(['1'])}
599 $('#term_to').datepicker({
600 onClose: function() {$('input[name=term]').val(['1'])}
602 $('#term_apply').click(showLog);
605 function initChartDatePicker()
607 $('#chart_from').datepicker({
608 onClose: function() {if (useChartDatePicker()) drawChart();}
610 $('#chart_to').datepicker({
611 onClose: function() {if (useChartDatePicker()) drawChart();}
615 function useChartDatePicker()
617 return (chartType == 0 && seqChartRange == 5) ||
618 (chartType == 1 && diffChartRange == 4);
622 $.fn.dataTable.ext.errMode = 'throw';
624 initTableDatePicker();
625 initChartDatePicker();
626 $('table').addClass('display compact cell-border');
629 var type = sessionStorage.getItem('chartType');
630 chartType = type == null ? 0 : +type;
631 var range = sessionStorage.getItem('prevSeqRange');
632 seqChartRange = range == null ? 0 : +range;
633 range = sessionStorage.getItem('prevDiffRange');
634 seqDiffRange = range == null ? 0 : +range;
635 $('input[name="chart_type"]:radio').eq(chartType).prop("checked", true);
636 if (chartType == 0) {
637 $('#range_seq').show()
638 $('#range_diff').hide()
640 $('#range_seq').hide()
641 $('#range_diff').show()
643 $('#range_diff li').removeClass('select');
644 $('#range_diff li').eq(diffChartRange).addClass('select');
645 $('#range_seq li').removeClass('select');
646 $('#range_seq li').eq(seqChartRange).addClass('select');
647 var prev = sessionStorage.getItem('prevTab');
648 selectTopTab(prev == null ? 0 : +prev);
652 <div id="loading"><img src="http://kancollesniffer.osdn.jp/ajax-loader.gif" alt="読み込み中..."></div>
654 <ul class="tab tab0">
668 <label><input type="radio" name="term" value="0" checked="checked">直近一か月</label>
669 <label><input type="radio" name="term" value="1">期間指定: </label>
670 <input type="text" id="term_from" style="width: 7em">~<input type="text" id="term_to" style="width: 7em">
671 <input type="button" id="term_apply" value="適用">
675 <ul class="contents">
679 <tr><th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>ドロップ艦種</th><th>ドロップ艦娘</th></tr>
686 <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></tr>
693 <tr><th>日付</th><th>結果</th><th>遠征</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>高速修復材</th><th>高速建造材</th></tr>
700 <tr><th>日付</th><th>開発装備</th><th>種別</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>秘書艦</th><th>司令部Lv</th></tr>
707 <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>
714 <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>
721 <tr><th>日付</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>高速建造材</th><th>高速修復材</th><th>開発資材</th><th>改修資材</th></tr>
726 <form id="chart_type">
727 <div style="margin: 0px 0px 0.5em 1em;">
728 <label><input type="radio" name="chart_type" value="0" checked="checked">連続</label>
729 <label><input type="radio" name="chart_type" value="1">差分</label>
732 <ul class="tab tab1" id="range_seq" style="float: left; margin-right: 0.2em">
740 <ul class="tab tab1" id="range_diff" style="float: left; margin-right: 0.2em">
747 <div style="padding: 0.2em 0em;">
748 <input type="text" id="chart_from" style="width: 7em">~<input type="text" id="chart_to" style="width: 7em">
749 <label><input type="checkbox" id="tooltip" value="" style="margin-left: 2em;">ツールチップ</label>
751 <div id="chart" style="clear: both; width: 800px; margin: 1em;"></div>
755 <table id="sortie_stat_day">
757 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
762 <table id="sortie_stat_week">
764 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
768 <table id="sortie_stat_month">
770 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th></tr>