"use strict";
var CampaignStatistics = {
statOptions: {},
inited: false,
type: 'period',
map: {
graphContainer: '#message-so-stats',
percentGrathContainer: '#percent-message-so-stats',
totalMessageContainer: '.total-message-sent',
totalMessageContainerOpen: '.total-message-open',
totalMessageContainerDelivery: '.total-message-delivery',
maxMo: '.max-message-open',
avgMo: '.avg-message-open',
minMo: '.min-message-open',
maxTime: '.max-time'
},
init: function(){
$('.dl-stats').on('click', $.proxy(this.downloadCSV, this));
this.initDatepicker();
this.getPushStats();
},
downloadCSV: function(e){
if ($(e.currentTarget).hasClass('disabled')) return;
var push_stats = this.tableData;
var data = _.values(push_stats.data);
var options = {
json : [{
"row1": "date",
"row2": "messages_send",
"row3": "messages_open"
}],
count: data.length,
from: push_stats.date_from,
to: push_stats.date_to
};
_.each(data, function(v){
options.json.push({
"position": v.datetime,
"messages_send": v.send,
"messages_open": v.open
});
});
this.exportToCSV.apply(this, [options.json, 'campaign_stats_'+ options.from +'_'+ options.to +'.csv']);
},
exportToCSV: function(json, filename){
var array = (typeof(json) != 'object') ? JSON.parse(json) : json, str = '';
for (var i = 0; i < array.length; i++) {
var line = '';
for (var index in array[i]) {
if(line != '') line += ';';
line += array[i][index];
}
str += line + '\r\n';
}
if (/Safari|Chrome/.test(navigator.userAgent)){
// Data URI
csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(str);
}
else {
// new way
var blob = new Blob([str], { type: 'text/csv' });
var csvData = URL.createObjectURL(blob);
}
$('.dl-stats').attr({
'download': filename,
'href': csvData,
'target': '_blank'
});
},
mergeTableData: function(data){
var table = [], j = 0;
(function(){
_.each(data.rows, function(d,i){
if (d.action == 'open') {
table.push({
datetime: d.datetime,
open: d.stats,
});
j++;
}
});
})(this);
j = 0;
_.each(data.rows, function(d,i){
if (d.action == 'send' && table[j]) {
table[j].send = d.stats;
j++;
}
});
return {
date_from: table[0].datetime,
date_to: table[table.length-1].datetime,
data: table
}
},
getToday: function () {
var today = new Date();
return new Date(today.getFullYear(), today.getMonth(), today.getDate());
},
getLastWeek: function(d){
var today = new Date();
return new Date(today.getFullYear(), today.getMonth(), today.getDate() - d);
},
getLastMonth: function(m){
var today = new Date();
return new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());
},
getLastYear: function () {
var today = new Date();
return new Date(today.getFullYear()- 1, today.getMonth() , today.getDate());
},
initDatepicker: function () {
var optionsFrom = {
endDate: '+0d',
todayHighlight: true,
autoclose: true,
format: 'yyyy/mm/dd',
orientation: 'left top'
};
var $zoom = $('.zoom-control');
var $dp = $('#dp_from');
if ($dp.val() == '') {
var from = $dp.datepicker(optionsFrom).datepicker('setDate', new Date());
}
$zoom.find('.day').text($dp.datepicker('getDate').format('dd'));
$zoom.find('.month').text($dp.datepicker('getDate').format('mmm'));
$zoom.find('.year').text($dp.datepicker('getDate').format('yyyy'));
},
parseMessageData: function(data){
var totalOpen = 0;
var totalSent = 0;
var totalDelivery = 0;
var openData = [];
var sendData = [];
var percentData = [];
var deliveryData = [];
var lastIndex = 0;
data.rows.forEach(function(d, index) {
d.date = new Date(d.datetime.replace(/-/ig,'/'));
d.stats = d.count;
d.type = d.action;
var percent = 0;
var current = index;
var next = index+1;
if (d.action == 'open') {
totalOpen += parseInt(d.stats);
openData.push(d);
percentData.push(d);
}
if (d.action == 'send') {
totalSent += parseInt(d.stats);
sendData.push(d);
percentData.push(d);
}
if (d.action == 'delivery') {
totalDelivery += parseInt(d.stats);
deliveryData.push(d);
}
});
var openAvg = Math.round(totalOpen / openData.length);
if ((totalOpen + totalSent + totalDelivery) == 0) return false;
var lastIndexOpen = 0, lastIndexSend = 0;
_.each(openData, function(d, i) {
if (parseInt(d.stats) != 0) lastIndexOpen = i;
});
_.each(sendData, function(d, i) {
if (parseInt(d.stats) != 0) lastIndexSend = i;
});
lastIndex = _.max([lastIndexOpen, lastIndexSend]);
if (sendData.length > 50) {
openData = openData.slice(0, lastIndex+5);
sendData = sendData.slice(0, lastIndex+5);
}
return {
totalOpen: totalOpen,
openAvg: openAvg,
totalSend: totalSent,
totalDelivery: totalDelivery,
open: openData,
send: sendData,
percent: percentData,
delivery: deliveryData
}
},
//Get stats form server by ajax and fill html
getPushStats: function(){
$(this.map.graphContainer).html('');
$(this.map.percentGrathContainer).html('');
$.ajax({
url: '/ajax/statistics/campaign',
dataType: 'json',
type: 'POST',
data: CampaignStatistics.statOptions,
success: $.proxy(function(response){
if (typeof(response.error) == 'object' && response.error.code != 0) {
showGlobalAlert( response.error.message, ALERT_ERROR);
if (response.error.code == 422) {
setTimeout( function(){ document.location.href = '/'}, 2000);
}
return false;
}
var data = this.parseMessageData(response.json_data);
if (!data) {
$(this.map.graphContainer).html('No stats yet.');
$(this.map.percentGrathContainer).html('No stats yet.');
$('.dl-stats').addClass('disabled');
}
else {
this.data = response.json_data;
this.formatter = this.data.formatter;
// Total messages
$(this.map.totalMessageContainer).text(data.totalSend);
$(this.map.totalMessageContainerOpen).text(data.totalOpen);
$(this.map.totalMessageContainerDelivery).text(data.totalDelivery);
$(this.map.avgMo).html(data.openAvg);
var openMax = d3.max( data.open.map(function(d) { return d.stats; }));
var date = _.find(data.open, function(d){ return (d.stats == openMax); });
$(this.map.maxTime).html(date.datetime);
$(this.map.maxMo).html(parseInt(openMax));
$(this.map.minMo).html(d3.min( data.open.map(function(d) { return parseInt(d.stats); })));
GraphDrawer.init(this.map.graphContainer);
GraphDrawer.drawCampaignGraph(data.open, data.send);
PercentGraphDrawer.init(this.map.percentGrathContainer);
PercentGraphDrawer.drawCampaignGraph(data.open, data.percent);
this.tableData = this.mergeTableData(response.json_data);
$('.dl-stats').removeClass('disabled');
$('.text-no-stats').hide();
}
}, this),
error: $.proxy(function(){
$('.text-no-stats').show();
$(this.map.graphContainer).html('No stats yet.')
$('.dl-stats').addClass('disabled');
}, this)
});
}
};