3 <li each={name, i in mainTabs} class={select: mainTab === i} onclick={parent.changeTab}>{name}</li>
7 /* global moment, c3, opts */
9 this.mainTab = +sessionStorage.getItem('prevTab');
10 opts.observable.trigger("mainTabChanged", this.mainTab);
12 this.changeTab = function(e) {
13 this.mainTab = e.item.i;
14 sessionStorage.setItem('prevTab', e.item.i);
15 opts.observable.trigger("mainTabChanged", e.item.i);
21 <form id="term" show={enabled}>
23 <label><input type="radio" name="term" value="0" checked="checked">直近一か月</label>
24 <label><input type="radio" name="term" value="1">期間指定: </label>
25 <input type="text" id="term_from" style="width: 7em">~<input type="text" id="term_to" style="width: 7em">
26 <input type="button" id="term_apply" value="適用">
31 this.on("mount", function() {
32 $('#term_from').datepicker({
33 defaultDate: moment().subtract(1, 'months').toDate(),
34 onClose: function() { $('input[name=term]').val(['1']); }
36 $('#term_to').datepicker({
37 onClose: function() { $('input[name=term]').val(['1']); }
39 $('#term_apply').click(function() {
40 opts.observable.trigger("termApplied");
47 opts.observable.on("mainTabChanged", function(idx) {
48 self.update({enabled: idx >= 0 && idx < self.logTables});
54 <div each={header, i in tables} show={mainTab === i}>
55 <table class="display compact cell-border" id={"log" + i}>
64 "<th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>ドロップ艦種</th><th>ドロップ艦娘", // ドロップ
65 "<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>", // 海戦
66 "<th>日付</th><th>結果</th><th>遠征</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>高速修復材</th><th>高速建造材</th>", // 遠征
67 "<th>日付</th><th>開発装備</th><th>種別</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>秘書艦</th><th>司令部Lv</th>", // 開発
68 "<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>", // 建造
69 "<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>", // 改修
70 "<th>日付</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>高速建造材</th><th>高速修復材</th><th>開発資材</th><th>改修資材</th>" // 戦果
83 this.on("mount", function() {
84 var records = this.root.querySelectorAll("tr");
85 for (var i = 0; i < records.length; i++)
86 records[i].innerHTML = this.tables[i];
93 opts.observable.on("mainTabChanged", function(idx) {
94 self.update({mainTab: idx});
98 opts.observable.on("termApplied", function() {
102 this.init = function() {
103 for (var t = 0; t < this.tables.length; t++) {
108 order: [[0, "desc"]],
110 lengthMenu: [[50, 100, 200, -1], [50, 100, 200, "All"]],
111 drawCallback: function() {
112 $('#loading').hide();
116 opts.columns = [{ data: 0 }, { data: 1 }, { data: 2 }, { data: 3 }, { data: 4 }, { data: 9 }, { data: 10 }];
117 } else if (t === 1) {
119 for (var i = 0; i < 38; i++) {
120 if (i === 9 || i === 10)
122 entries.push({ data: i });
124 opts.columns = entries;
126 $('#log' + t).dataTable(opts);
130 this.show = function() {
131 if (this.mainTab >= this.jsons.length)
133 var query = "?from=" + moment().subtract(1, 'months').valueOf();
134 if ($('input[name=term]:eq(1)').prop('checked')) {
135 var from = $('#term_from').datepicker("getDate");
136 var to = $('#term_to').datepicker("getDate");
138 query = "?from=" + from.valueOf();
140 query += "&to=" + (to.valueOf() + this.oneDay);
142 $('#loading').show();
143 var url = this.jsons[this.mainTab] + query;
144 $('#log' + this.mainTab).DataTable().ajax.url(url).load();
150 <form id="chart_type" show={mainTabs[mainTab] === "資材グラフ"}>
151 <div style="margin: 0 0 0.5em 1em;">
152 <label><input type="radio" name="chart_type" value="0" checked={opts.chartSpec.type === 0} onchange={chartTypeChange}>連続</label>
153 <label><input type="radio" name="chart_type" value="1" checked={opts.chartSpec.type === 1} onchange={chartTypeChange}>差分</label>
159 opts.chartSpec.type = +sessionStorage.getItem('chartType');
162 this.chartTypeChange = function(e) {
163 opts.chartSpec.type = +e.target.value;
164 sessionStorage.setItem('chartType', opts.chartSpec.type);
165 opts.observable.trigger("chartTypeChanged");
166 opts.observable.trigger("chartSpecChanged");
169 opts.observable.on("mainTabChanged", function(idx) {
170 self.update({mainTab: idx});
176 <div show={mainTabs[mainTab] === "資材グラフ"}>
177 <ul class="tab tabsub" style="float: left; margin-right: 0.2em" show={chartSpec.type === 0}>
178 <li each={name, i in seqChartRanges} class={select: chartSpec.seqRange === i} onclick={parent.rangeTabChange}>{name}</li>
181 <ul class="tab tabsub" style="float: left; margin-right: 0.2em" show={chartSpec.type === 1}>
182 <li each={name, i in diffChartRanges} class={select: chartSpec.diffRange === i} onclick={parent.rangeTabChange}>{name}</li>
184 <div style="padding: 0.2em 0;">
185 <input type="text" id="chart_from" style="width: 7em">~<input type="text" id="chart_to" style="width: 7em">
186 <label><input type="checkbox" id="tooltip" value="" style="margin-left: 2em;" onchange={tooltipChange} checked={opts.chartSpec.tooltip === 1}>ツールチップ</label>
191 this.seqChartRanges = [
200 this.diffChartRanges = [
208 opts.chartSpec.seqRange = +sessionStorage.getItem('seqChartRange');
209 opts.chartSpec.diffRange = +sessionStorage.getItem('diffChartRange');
210 opts.chartSpec.tooltip = +sessionStorage.getItem('chartTooltip');
211 this.chartSpec = opts.chartSpec;
213 this.rangeTabChange = function(e) {
214 if (opts.chartSpec.type === 0) {
215 opts.chartSpec.seqRange = e.item.i;
216 sessionStorage.setItem('seqChartRange', e.item.i);
218 opts.chartSpec.diffRange = e.item.i;
219 sessionStorage.setItem('diffChartRange', e.item.i);
221 opts.observable.trigger("chartSpecChanged");
224 this.tooltipChange = function(e) {
225 opts.chartSpec.tooltip = +e.target.checked;
226 sessionStorage.setItem('chartTooltip', this.tooltip);
227 opts.observable.trigger("chartSpecChanged");
230 this.useDatePicker = function() {
231 return opts.chartSpec.type === 0 && opts.chartSpec.seqRange === 5 ||
232 opts.chartSpec.type === 1 && opts.chartSpec.diffRange === 4;
235 this.init = function() {
236 $('#chart_from').datepicker({
237 onClose: function() { if (self.useDatePicker()) self.drawChart(); }
239 $('#chart_to').datepicker({
240 onClose: function() { if (self.useDatePicker()) self.drawChart(); }
244 this.on("mount", this.init);
249 opts.observable.on("mainTabChanged", function(idx) {
250 self.update({mainTab: idx});
253 opts.observable.on("chartTypeChanged", function() {
263 opts.observable.on("chartSpecChanged", function() {
264 if (opts.chartSpec.type === 0)
268 opts.observable.on("chartSizeChanged", function() {
269 if (opts.chartSpec.type === 0)
273 this.resize = function() {
276 $('#loading').show();
277 setTimeout(function() {
278 self.chart.resize(self.chartSize());
282 this.drawChart = function(data) {
284 $('#loading').show();
287 success: function(d) { self.drawChart(d); },
288 dataType: "json", cache: false
293 picked = this.pickChartData(data.data, opts.chartSpec.seqRange);
294 header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ", "高速建造材", "高速修復材", "開発資材", "改修資材"];
295 picked.data.unshift(header);
296 this.drawSeqChart(picked);
299 this.unselected = {};
301 this.drawSeqChart = function(picked) {
302 var size = this.chartSize();
303 this.chart = c3.generate({
311 xFormat: '%Y-%m-%d %X',
328 show: opts.chartSpec.tooltip
340 format: function(x) { return moment(x).format("MM-DD HH:mm"); },
350 onclick: function(id) {
351 self.unselected[id] = !self.unselected[id];
352 self.chart.toggle(id);
356 onrendered: function() { $('#loading').hide(); }
358 for (var id in self.unselected) {
359 if (self.unselected.hasOwnProperty(id) && self.unselected[id])
360 self.chart.toggle(id);
364 this.pickChartData = function(data, range) {
368 var first = moment(data[0][0]).valueOf();
369 var last = moment(data[data.length - 1][0]).valueOf();
370 var interval, tickInterval, lastTick;
373 first = moment(last).subtract(24, 'hours').valueOf();
376 first = moment(last).subtract(7, 'days').valueOf();
379 first = moment(last).subtract(1, 'months').valueOf();
382 first = moment(last).subtract(3, 'months').valueOf();
385 first = moment(data[0][0]).valueOf();
388 var fromDate = $('#chart_from').datepicker("getDate");
389 var toDate = $('#chart_to').datepicker("getDate");
390 if (fromDate === null || toDate === null)
391 return { data: [], tick: [], grid: [] };
392 var from = fromDate.valueOf() + 3600 * 5000;
393 var to = toDate.valueOf() + this.oneDay + 3600 * 5000;
394 first = Math.max(first, from);
395 last = Math.min(last, to);
398 if (last <= first + this.oneDay) {
400 tickInterval = 3600 * 1000;
401 lastTick = last - last % tickInterval;
402 } else if (last <= first + this.oneDay * 21) {
404 tickInterval = this.oneDay;
405 lastTick = this.to5am(last);
406 } else if (last <= first + this.oneDay * 63) {
407 interval = 3600 * 1000;
408 tickInterval = this.oneDay * 7;
409 lastTick = this.to5am(moment(last).day(1).valueOf());
410 } else if (last <= first + this.oneDay * 126) {
411 interval = 3600 * 6000;
412 tickInterval = this.oneDay * 14;
413 lastTick = this.to5am(moment(last).day(1).valueOf());
415 interval = 3600 * 12000;
416 tickInterval = this.oneDay * 28;
417 lastTick = this.to5am(moment(last).day(1).valueOf());
420 for (var i = data.length - 1; i >= 0; i--) {
422 var date = this.parseDate(row[0]).valueOf();
425 var v = date - date % interval;
426 if (lastData !== v) {
427 newdata.unshift(row);
435 for (var tick = lastTick; tick > lastData; tick -= tickInterval) {
436 var str = self.toDateString(moment(tick));
438 grid.unshift({ value: str });
440 return { data: newdata, tick: ticks, grid: grid };
449 opts.observable.on("chartSpecChanged", function() {
450 if (opts.chartSpec.type === 1)
454 opts.observable.on("chartSizeChanged", function() {
455 if (opts.chartSpec.type === 1)
459 this.resize = function() {
462 $('#loading').show();
463 setTimeout(function() {
464 self.chart.resize(self.chartSize());
468 this.drawChart = function(data) {
470 $('#loading').show();
473 success: function(d) { self.drawChart(d); },
474 dataType: "json", cache: false
479 picked = this.pickChartData(data.data, opts.chartSpec.diffRange);
480 header = ["日付", "燃料", "弾薬", "鋼材", "ボーキ"];
481 picked.data.unshift(header);
482 this.drawDiffChart(picked);
485 this.unselected = {};
487 this.drawDiffChart = function(picked) {
488 var size = this.chartSize();
489 this.chart = c3.generate({
497 xFormat: '%Y-%m-%d %X',
506 groups: [["燃料", "弾薬", "鋼材", "ボーキ"]]
514 show: opts.chartSpec.tooltip
531 format: function(x) { return moment(x).format("MM-DD HH:mm"); },
538 onclick: function(id) {
539 self.unselected[id] = !self.unselected[id];
540 self.chart.toggle(id);
544 onrendered: function() { $('#loading').hide(); }
546 for (var id in self.unselected) {
547 if (self.unselected.hasOwnProperty(id) && self.unselected[id])
548 self.chart.toggle(id);
552 this.pickChartData = function(data, range) {
556 var first = moment(data[0][0]).valueOf();
557 var last = moment(data[data.length - 1][0]).valueOf();
558 var interval, tickInterval, lastTick;
561 first = moment(last).subtract(1, 'months').valueOf();
564 first = moment(last).subtract(3, 'months').valueOf();
567 first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
570 first = moment(data[0][0]).valueOf();
573 var fromDate = $('#chart_from').datepicker("getDate");
574 var toDate = $('#chart_to').datepicker("getDate");
575 if (fromDate === null || toDate === null)
576 return { data: [], tick: [], grid: [] };
577 var from = fromDate.valueOf() + 3600 * 5000;
578 var to = toDate.valueOf() + this.oneDay + 3600 * 5000;
579 first = Math.max(first, from);
580 last = Math.min(last, to);
584 if (last <= first + this.oneDay * 2 * 31) {
585 interval = this.oneDay;
586 tickInterval = this.oneDay * 2;
587 lastTick = this.to5am(last);
589 } else if (last <= first + this.oneDay * 3 * 31) {
590 interval = this.oneDay;
591 tickInterval = this.oneDay * 7;
592 lastTick = this.to5am(last);
595 interval = this.oneDay * 7;
596 tickInterval = this.oneDay * 28;
597 lastTick = this.to5am(moment(last).day(1).valueOf());
599 if (last <= first + this.oneDay * 6 * 38) {
600 tickInterval = this.oneDay * 14;
604 var lastDate = lastTick;
606 for (var i = data.length - 1; i >= 0; i--) {
608 var date = this.parseDate(row[0]).valueOf();
609 if (date > first && date <= last) {
614 if (date <= lastDate) {
615 var newrow = [prevRow[0]];
616 for (var r = 1; r < 5; r++) {
617 newrow.push(prevRow[r] - row[r]);
619 newdata.unshift(newrow);
620 lastDate = lastDate - interval;
627 if (tickInterval >= this.oneDay * 7)
628 lastTick = moment(lastTick).day(1).hour(5).minute(0).valueOf();
629 for (var tick = lastTick; tick > lastDate; tick -= tickInterval) {
630 var str = self.toDateString(moment(tick));
632 grid.unshift({ value: str });
634 return { data: newdata, tick: ticks, grid: grid, width: barWidth };
637 </differential-chart>
640 <div show={mainTabs[mainTab] === "資材グラフ"}>
641 <div id="chart" style="clear: both; margin: 1em;"></div>
648 opts.observable.on("mainTabChanged", function(idx) {
649 self.update({mainTab: idx});
650 if (self.mainTabs[idx] === "資材グラフ")
651 opts.observable.trigger("chartSpecChanged");
655 $(window).resize(function() {
657 clearTimeout(self.timer);
658 self.timer = setTimeout(function() {
659 if (self.mainTabs[self.mainTab] === "資材グラフ")
660 opts.observable.trigger("chartSizeChanged");
661 else if (self.mainTabs[self.mainTab] === "戦果")
662 opts.observable.trigger("achivementChartSizeChanged");
669 <div show={mainTabs[mainTab] === "戦果"}>
670 <span style="margin-left: 1em;">期間: </span><select style="width: 7em; margin-bottom: 1em;" name="月" onchange={monthChange}>
671 <option each={m, i in months} value={m}>{m}</option>
673 <table id="achivement_table" class="display compact cell-border">
675 <tr><th>日付</th><th>戦果</th><th>EO</th><th>月毎</th></tr>
678 <div id="achivementChart" style="margin: 1em;"></div>
682 this.on("mount", function() {
683 $("#achivement_table").dataTable({
687 order: [[0, "desc"]],
691 drawCallback: function() {
692 $('#loading').hide();
699 opts.observable.on("mainTabChanged", function(idx) {
700 self.update({mainTab: idx});
701 if (self.mainTabs[self.mainTab] === "戦果")
707 this.monthChange = function(event) {
708 if (event.target.selectedIndex === 0) {
712 var dt = $('#achivement_table').DataTable();
714 dt.rows.add(this.result[event.target.value]).draw();
715 this.showChart(event.target.value);
718 this.calcResult = function(data) {
720 var expPerAch = 10000 / 7.0;
722 var endOfMonth = moment(0);
725 var endOfYear = moment(0);
727 var carryOverAch = 0;
730 var lastDate = moment(0);
732 var nextDate = moment(0);
733 for (var i = 0; i < data.length; i++) {
735 var date = this.parseDate(row[0]);
736 var exp = row[1] - 0;
738 var isNewYear = date.isSameOrAfter(endOfYear);
739 var isNewMonth = date.isSameOrAfter(endOfMonth);
740 var isNewDate = date.isSameOrAfter(nextDate);
741 if (isNewDate || isNewMonth || isNewYear) {
742 if (lastDate.add(1, 'hours').isSameOrBefore(date)) {
743 // 2時を過ぎて最初のexpを戦果の計算に使うと、2時をまたいだ出撃の戦果が前日に加算される。
744 // そこで2時前のexpを使って戦果を計算するが、2時前のexpが正しく出力されていない場合は
745 // 戦果を正しく計算できない。記録の間隔が1時間以上空いているときは、2時をまたいだ出撃が
746 // 行われていない可能性が高いので計算には今のexpを使うことにする。
747 // これは5時基準で出力された過去のデータで、妥当な戦果を計算するために必要な処理である。
750 if (nextDate.valueOf() !== 0) {
751 var d = isNewDate ? nextDate.subtract(1, 'days') : endOfMonth;
752 var m = d.format("YYYY-MM");
755 this.result[m].push([
756 d.format("YYYY-MM-DD"),
757 new Number((lastExp - prevExp) / expPerAch).toFixed(1), dayEo,
758 new Number((lastExp - monthExp) / expPerAch + monthEo + carryOverAch + carryOverEo).toFixed(1)
761 prevExp = lastExp === -1 ? exp : lastExp;
763 endOfYear = date.clone().endOf('year').hour(22).startOf('hour');
764 if (endOfYear.isSameOrBefore(date))
765 endOfYear.add(1, 'year').endOf('year');
766 yearExp = lastExp === -1 ? exp : lastExp;
769 endOfMonth = date.clone().endOf('month').hour(22).startOf('hour');
770 if (endOfMonth.isSameOrBefore(date))
771 endOfMonth.add(1, 'month').endOf('month');
772 monthExp = lastExp === -1 ? exp : lastExp;
773 carryOverEo = monthEo * expPerAch / 50000;
774 carryOverAch = (monthExp - yearExp) / 50000;
776 m = endOfMonth.format("YYYY-MM");
779 this.result[m].push([endOfMonth.format("YYYY-MM 引継"),
780 carryOverAch.toFixed(1), carryOverEo.toFixed(1), (carryOverAch + carryOverEo).toFixed(1)]);
783 nextDate = date.clone().hour(2).startOf('hour');
784 if (date.hour() >= 2)
785 nextDate.add(1, 'days');
786 if (nextDate.date() === 1)
787 nextDate.add(1, 'days');
789 if (date.isBefore(date.clone().endOf('month').hour(22).startOf('hour'))) {
790 // 月末22時から翌0時までのEOのボーナス戦果は消える。
799 this.calcChartData = function() {
801 for (var month in this.result) {
802 var data = this.chartData[month] = [];
803 var result = this.result[month];
806 data.push(["日付", "戦果", "EO", "月毎"]);
807 for (var i = 0; i < result.length; i++) {
809 if (row[0].match(/引継/))
811 d = moment(row[0], "YYYY-MM-DD").date();
813 var ach = Number(row[3] - eo).toFixed(1);
814 data.push([d, ach, eo, row[3]]);
816 var endOfMonth = moment(month, "YYYY-MM").endOf("month").date();
817 while (d < endOfMonth) {
819 data.push([d, null, null, null]);
824 this.chartSize = function() {
825 var width = Math.max($(document).width() - 6 * this.pxPerEm, 800);
832 opts.observable.on("achivementChartSizeChanged", function() {
835 $('#loading').show();
836 setTimeout(function() {
837 self.chart.resize(self.chartSize());
841 this.showChart = function(month) {
842 this.chart = c3.generate({
843 bindto: "#achivementChart",
844 size: this.chartSize(),
847 rows: this.chartData[month],
854 onrendered: function() { $('#loading').hide(); }
858 this.show = function(data) {
860 $('#loading').show();
863 success: function(data) {
864 self.show(data.data);
871 this.calcResult(data);
872 this.calcChartData();
873 this.months = Object.keys(this.result).sort(function(a, b) {
881 var dt = $('#achivement_table').DataTable();
883 dt.rows.add(this.result[this.months[0]]).draw();
884 this.showChart(this.months[0]);
890 <div show={mainTabs[mainTab] === "出撃統計"}>
892 <ul class="tab tabsub" style="float: left; margin-right: 0.2em">
893 <li each={tabs} class={select: parent.type === type} onclick={parent.changeTab}>{label}</li>
896 <div style="padding: 0.2em 0;">
897 <input type="text" id="sortie_stat_from" style="width: 7em">~<input type="text" id="sortie_stat_to" style="width: 7em">
900 <div style="clear: both;" show={type === "recent"}>
902 <table id="sortie_stat_day">
904 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
908 <table id="sortie_stat_week">
910 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
913 <table id="sortie_stat_month">
915 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th></tr>
919 <div id="sortie_stat_all_table" show={type === "range"}>
920 <table id="sortie_stat_all">
922 <tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
940 this.type = "recent";
941 this.changeTab = function(e) {
942 this.type = e.item.type;
949 this.on("mount", function() {
950 $("[id^=sortie]").addClass('display compact cell-border');
954 opts.observable.on("mainTabChanged", function(idx) {
955 self.update({mainTab: idx});
956 if (self.mainTabs[self.mainTab] === "出撃統計")
960 this.init = function() {
962 this.initDatePicker();
965 this.initTable = function() {
966 var terms = ['day', 'week', 'month', 'all'];
967 for (var i = 0; i < terms.length; i++) {
968 $("#sortie_stat_" + terms[i]).dataTable({
972 columns: terms[i] !== 'month' ? [
994 this.initDatePicker = function() {
995 $('#sortie_stat_from').datepicker({
996 onClose: function() { if (self.type === "range") self.show(); }
998 $('#sortie_stat_to').datepicker({
999 onClose: function() { if (self.type === "range") self.show(); }
1005 this.loadData = function() {
1007 if (this.type === "recent") {
1008 from = moment().subtract(1, 'months').subtract(1, 'day').valueOf();
1009 to = new Date().valueOf();
1011 var fromDate = $('#sortie_stat_from').datepicker("getDate");
1012 var toDate = $('#sortie_stat_to').datepicker("getDate");
1013 if (fromDate === null || toDate === null) {
1017 from = fromDate.valueOf();
1018 to = toDate.valueOf() + this.oneDay;
1021 url: "./海戦・ドロップ報告書.json?from=" + from + "&to=" + to,
1022 success: function(data) { self.show(data.data); },
1023 dataType: "json", cache: false
1027 this.initResult = function() {
1030 if (this.type === "recent") {
1036 r.day.begin = moment(now).hour(5).minute(0).second(0);
1037 if (now.hour() < 5) {
1038 r.day.begin.subtract(1, 'days');
1040 r.week.begin = moment(now).day(1).hour(5).minute(0).second(0);
1041 if (now.day() === 0 || now.day() === 1 && now.hour() < 5) {
1042 r.week.begin.subtract(1, 'weeks');
1044 if (moment(now).endOf('month').date() === now.date() &&
1045 now.hour() >= 22) { // 月末22時以降
1046 r.month.begin = moment(now).hour(22).minute(0).second(0);
1049 moment(now).date(1).subtract(1, 'days').
1050 hour(22).minute(0).second(0);
1053 r = { all: { stat: {} } };
1054 r.all.begin = moment(0);
1059 this.gatherData = function(data) {
1060 var initStat = function() {
1061 return { start: "-", S: 0, A: 0, B: 0, C: 0, D: 0, R: 0 };
1063 var r = this.initResult();
1064 for (var i = 0; i < data.length; i++) {
1066 var date = moment(row[0]);
1068 var isBoss = row[3].indexOf("ボス") !== -1;
1069 var isStart = row[3].indexOf("出撃") !== -1;
1071 for (var j = 23; j < row.length; j++) {
1072 if (/^輸送/.test(row[j]) && /^0\x2f/.test(row[j + 1]))
1078 for (var term in r) {
1079 if (!r.hasOwnProperty(term))
1082 if (to.begin.isAfter(date))
1084 for (var b = 0; b < 4; b++) {
1085 var name = b < 2 ? "合計" : map;
1086 if (b === 1 || b === 3) {
1089 name = name + " - ボス";
1091 var mo = to.stat[name];
1093 mo = to.stat[name] = initStat();
1095 to.stat["合計 - ボス"] = initStat();
1099 if ((b === 0 || b === 2) && isStart) {
1100 if (mo.start === "-")
1110 this.arrangeTable = function(r) {
1111 for (var term in r) {
1112 if (!r.hasOwnProperty(term))
1116 for (var map in r[term].stat) {
1117 if (!r[term].stat.hasOwnProperty(map))
1121 var e = r[term].stat[map];
1125 var boss = map + " - ボス";
1126 e = r[term].stat[boss];
1133 r[term].table = table;
1137 this.show = function(data) {
1139 $('#loading').show();
1143 var r = this.gatherData(data);
1144 this.arrangeTable(r);
1145 for (var term in r) {
1146 if (!r.hasOwnProperty(term))
1148 var dt = $("#sortie_stat_" + term).DataTable();
1150 dt.rows.add(r[term].table).draw();
1152 $('#loading').hide();