%PDF- %PDF-
| Direktori : /home1/lightco1/www/media/com_joomailermailchimpintegration/backend/js/analytics360/ |
| Current File : //home1/lightco1/www/media/com_joomailermailchimpintegration/backend/js/analytics360/a360.js |
/**
* a360.js
*
* Javascript for MailChimp's Analytics360 WordPress plugin. See analytics360.php for license, readme, etc.
*/
;(function($j) {
window.a360 = {};
if (!Function.prototype._cfBind) {
Function.prototype._cfBind = function(obj) {
var f = this;
return (function() {
return f.apply(obj, arguments);
});
};
}
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(elt /*, from*/) {
var len = this.length;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++) {
if (from in this && this[from] === elt) return from;
}
return -1;
};
}
if (!String.prototype.commaize && !Number.prototype.commaize) {
String.prototype.commaize = Number.prototype.commaize = function() {
nStr = this + '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
};
}
a360.displayDates = {
start: null,
end: null,
lastStart: null,
lastEnd: null
};
a360.renderers = {
vml: {
setFillColor: function(element, color) {
$j(element).attr('fillcolor', color);
},
setStrokeColor: function(element, color) {
$j(element).get(0).stroked = true;
$j(element).get(0).strokecolor = color;
},
setStrokeWeight: function(element, weight) {
$j(element).get(0).stroked = true;
$j(element).get(0).strokeweight = weight;
},
setRadius: function(element, radius) {
$j(element).css({ width: (radius * 2), height: (radius * 2) });
},
setY: function(element, value) {
$j(element).css('top', value);
},
getDimensions: function(element) {
return { width: parseFloat($j(element).css('width')), height: parseFloat($j(element).css('height')) };
},
getOffset: function(element) {
return { top: parseFloat($j(element).css('top')), left: parseFloat($j(element).css('left')) };
},
getCenterOffset: function(circle) {
var o = a360.gfx.getOffset(circle);
var d = a360.gfx.getDimensions(circle);
return { top: o.top + (d.height / 2), left: o.left + (d.width / 2) };
},
setAttribute: function(element, name, value) {
$j(element).get(0)[name] = value;
},
getAttribute: function(element, name) {
return $j(element).get(0)[name];
},
circleName: 'oval',
renderer: 'vml'
},
svg: {
setFillColor: function(element, color) {
$j(element).attr('fill', color);
},
setStrokeColor: function(element, color) {
$j(element).attr('stroke', color);
},
setStrokeWeight: function(element, weight) {
$j(element).attr('stroke-width', weight);
},
setRadius: function(element, radius) {
$j(element).attr('r').baseVal.value = radius;
},
setY: function(element, value) {
$j(element).attr('cy').baseVal.value = value;
},
getDimensions: function(element) {
return { width: parseFloat($j(element).get(0).getAttribute('width')), height: parseFloat($j(element).get(0).getAttribute('height')) };
},
getOffset: function(element) {
return { top: parseFloat($j(element).get(0).getAttribute('y')), left: parseFloat($j(element).get(0).getAttribute('x')) };
},
getCenterOffset: function(circle) {
return { top: parseFloat(a360.gfx.getAttribute(circle, 'cy')), left: parseFloat(a360.gfx.getAttribute(circle, 'cx')) };
},
setAttribute: function(element, name, value) {
$j(element).get(0).setAttribute(name, value);
},
getAttribute: function(element, name) {
return $j(element).get(0).getAttribute(name);
},
circleName: 'circle',
renderer: 'svg'
}
};
// Will be one of the renderer objects above once we determine which
// engine we're working with.
a360.gfx = null;
a360.easeOut = function (frame, start, delta, nFrames) {
return -delta * (frame /= nFrames) * (frame - 2) + start;
};
a360.animateLineChart = function(startCoords, endCoords, frame, nFrames) {
var chartLine = null;
var chartFill = null;
if (a360.gfx.renderer == 'svg') {
var chartLine = $j('path[stroke=#92BCD0]');
var chartFill = $j('path[fill=#92BCD0]');
}
else {
var nShapes = $j('shape').size();
var chartLine = $j('shape:eq(' + (nShapes - 1) + ') path');
var chartFill = $j('shape:eq(' + (nShapes - 2) + ') path');
}
var interpValues = $j.map(startCoords, function(coord, i) {
return {
x: coord.x,
y: a360.easeOut(frame, startCoords[i].y, endCoords[i].y - startCoords[i].y, nFrames)
};
});
a360.lineChart.jqCircles.each(function(index) {
a360.gfx.setY(this, (a360.gfx.renderer == 'svg' ?
interpValues[index].y :
Math.round(interpValues[index].y - (a360.gfx.getDimensions(this).height / 2)))
);
});
if (a360.gfx.renderer == 'svg') {
var d = 'M' + interpValues[0].x + ',' + interpValues[0].y;
$j.each(interpValues, function(i, coord) {
d += 'L' + coord.x + ',' + coord.y;
});
a360.gfx.setAttribute(chartLine, 'd', d);
d += 'L' + interpValues[interpValues.length - 1].x + ',' + (a360.lineChart.height + a360.lineChart.offsetY);
d += 'L' + interpValues[0].x + ',' + (a360.lineChart.height + a360.lineChart.offsetY);
a360.gfx.setAttribute(chartFill, 'd', d);
}
else {
// vml freaks out if you give it floats
var d = 'm ' + interpValues[0].x + ',' + Math.round(interpValues[0].y);
d += ' l ';
$j.each(interpValues, function(i, coord) {
d += coord.x + ',' + Math.round(coord.y) + ' ';
});
a360.gfx.setAttribute(chartLine, 'v', d + ' e');
d += interpValues[interpValues.length - 1].x + ',' + (a360.lineChart.height + a360.lineChart.offsetY) + ' ';
d += interpValues[0].x + ',' + (a360.lineChart.height + a360.lineChart.offsetY);
a360.gfx.setAttribute(chartFill, 'v', d + ' x');
}
};
a360.handleDashboardReady = function() {
var jqA360 = $j(a360);
jqA360.bind('fetchingGAVisits', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'loading'); });
jqA360.bind('gaVisitsFetched', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'normal'); });
jqA360.bind('gaVisitsFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-site-traffic'), 'Could not fetch visit data: ' + error); });
jqA360.bind('gaVisitsFetched', a360.updateVisitsChart._cfBind(a360));
jqA360.bind('mediumFilterChanged', a360.updateVisitStats._cfBind(a360));
// geo map
jqA360.bind('fetchingGAGeo', function() { a360.setHeaderStatus($j('#a360-box-traffic-by-region'), 'loading'); });
jqA360.bind('gaGeoFetched', function() { a360.setHeaderStatus($j('#a360-box-traffic-by-region'), 'normal'); });
jqA360.bind('gaGeoFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-traffic-by-region'), 'Could not fetch geo data: ' + error); });
jqA360.bind('gaGeoFetched', a360.updateMap._cfBind(a360));
// pie chart
jqA360.bind('fetchingGAReferralMedia', function() { a360.setHeaderStatus($j('#a360-box-referring-traffic-overview'), 'loading'); });
jqA360.bind('gaReferralMediaFetched', function() { a360.setHeaderStatus($j('#a360-box-referring-traffic-overview'), 'normal'); });
jqA360.bind('gaReferralMediaFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-referring-traffic-overview'), 'Could not fetch referral data: ' + error); });
jqA360.bind('gaReferralMediaFetched', a360.updateReferralMediumChart._cfBind(a360));
// wp posts
jqA360.bind('fetchingWPPosts', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'loading'); });
jqA360.bind('wpPostsFetched', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'normal'); });
jqA360.bind('wpPostsFetched', function() { $j('#a360-linechart-legend li.blog-post').show('fast'); });
jqA360.bind('wpPostsFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-site-traffic'), 'Could not fetch WordPress post data: ' + error); });
jqA360.bind('wpPostsFetched', a360.updateVisitsChartWithPosts._cfBind(a360));
//if (MCapikey.length) {
jqA360.bind('fetchingMCCampaigns', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'loading'); });
jqA360.bind('mcCampaignsFetched', function() { a360.setHeaderStatus($j('#a360-box-site-traffic'), 'normal'); });
jqA360.bind('mcCampaignsFetched', function() { $j('#a360-linechart-legend li.campaign').show('fast'); });
jqA360.bind('mcCampaignsFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-site-traffic'), 'Could not fetch MailChimp campaign data: ' + error); });
jqA360.bind('mcCampaignsFetched', a360.updateVisitsChartWithCampaigns._cfBind(a360));
jqA360.bind('fetchingMCListGrowth', function() { a360.setHeaderStatus($j('#a360-box-list-growth'), 'loading'); });
jqA360.bind('mcListGrowthFetched', function() { a360.setHeaderStatus($j('#a360-box-list-growth'), 'normal'); });
jqA360.bind('mcListGrowthFetchFailed', function(event, listID, error) { a360.addHeaderError($j('#a360-box-list-growth'), 'Could not fetch MailChimp list data: ' + error); });
jqA360.bind('mcListGrowthFetched', a360.updateListGrowth._cfBind(a360));
//}
// top referrals table
jqA360.bind('fetchingGATopReferrals', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'loading'); });
jqA360.bind('gaTopReferralsFetched', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'normal'); });
jqA360.bind('gaTopReferralsFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-box-top-referrers'), 'Could not fetch referral data: ' + error); });
jqA360.bind('gaTopReferralsFetched', a360.updateTopReferrersChart._cfBind(a360));
jqA360.bind('fetchingGAKeywords', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'loading'); });
jqA360.bind('gaKeywordsFetched', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'normal'); });
jqA360.bind('gaKeywordsFetchFailed', function(event, sourceName, error) { a360.addHeaderError($j('#a360-box-top-referrers'), 'Could not fetch keyword data: ' + error); });
jqA360.bind('gaKeywordsFetched', a360.handleKeywordsFetched._cfBind(a360));
jqA360.bind('fetchingGAEmailReferrals', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'loading'); });
jqA360.bind('gaEmailReferralsFetched', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'normal'); });
jqA360.bind('gaEmailReferralsFetchFailed', function(event, sourceName, error) { a360.addHeaderError($j('#a360-box-top-referrers'), 'Could not fetch email referral data: ' + error); });
jqA360.bind('gaEmailReferralsFetched', a360.handleEmailReferralsFetched._cfBind(a360));
jqA360.bind('fetchingGAReferralPaths', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'loading'); });
jqA360.bind('gaReferralPathsFetched', function() { a360.setHeaderStatus($j('#a360-box-top-referrers'), 'normal'); });
jqA360.bind('gaReferralPathsFetchFailed', function(event, sourceName, error) { a360.addHeaderError($j('#a360-box-top-referrers'), 'Could not fetch referral paths: ' + error); });
jqA360.bind('gaReferralPathsFetched', a360.handleReferralPathsFetched._cfBind(a360));
// top content table
jqA360.bind('fetchingGATopContent', function() { a360.setHeaderStatus($j('#a360-top-content'), 'loading'); });
jqA360.bind('gaTopContentFetched', function() { a360.setHeaderStatus($j('#a360-top-content'), 'normal'); });
jqA360.bind('gaTopContentFetchFailed', function(event, error) { a360.addHeaderError($j('#a360-top-content'), 'Could not fetch top content data: ' + error); });
jqA360.bind('gaTopContentFetched', a360.updateTopContentChart._cfBind(a360));
// display date change triggers other stuff
jqA360.bind('displayDatesChanged', function(event, start, end) {
a360.clearTableStack(jQuery('#a360-top-referrers'));
a360.clearTableStack(jQuery('#a360-top-content'));
a360.fetchGAVisits();
a360.fetchGAGeo();
a360.fetchGATopReferrals();
a360.fetchGAReferralMedia();
a360.fetchGATopContent();
});
var selectDateRange = function(start, end) {
if (start.equals(a360.displayDates.start) && end.equals(a360.displayDates.end)) {
return;
}
var jqdp = $j('#a360-datepicker-calendars');
jqdp.dpmmClearSelected();
var d = new Date(end.valueOf());
var nDays = 0;
while (d.isAfter(start) || d.equals(start)) { // this is a bit pricey
jqdp.dpmmSetSelected(d.toString('dd/MM/yyyy'));
d.addDays(-1);
nDays++;
}
a360.displayDates.start = start;
a360.displayDates.end = end;
var startInputVal = new Date($j('#a360-current-start-date input').val().replace(/-/g, '/'));
var endInputVal = new Date($j('#a360-current-end-date input').val().replace(/-/g, '/'));
if (isNaN(startInputVal.valueOf()) || !(startInputVal.equals(start))) {
$j('#a360-datepicker-start-date').val(start.toString('yyyy-MM-dd'));
}
if (isNaN(endInputVal.valueOf()) || !(endInputVal.equals(end))) {
$j('#a360-datepicker-end-date').val(end.toString('yyyy-MM-dd'));
}
$j('#a360-current-start-date span').html(start.toString('MMM dd, yyyy'));
$j('#a360-current-end-date span').html(end.toString('MMM dd, yyyy'));
$j('#a360-current-start-date input').val(start.toString('MMM dd, yyyy'));
$j('#a360-current-end-date input').val(end.toString('MMM dd, yyyy'));
$j('#a360-current-date-range-desc').html(nDays + ' day' + (nDays > 1 ? 's' : '') + ' selected');
};
var toggleDatePopup = function() {
if ($j('#a360-datepicker-popup').hasClass('open')) {
$j('#a360-datepicker-pane').slideUp();
$j('#a360-datepicker-popup').removeClass('open');
$j('#a360-current-date-range input').hide();
$j('#a360-current-date-range span').show();
if (!a360.displayDates.lastStart || !a360.displayDates.lastEnd ||
!a360.displayDates.lastStart.equals(a360.displayDates.start) ||
!a360.displayDates.lastEnd.equals(a360.displayDates.end)
) {
a360.displayDates.lastStart = a360.displayDates.start;
a360.displayDates.lastEnd = a360.displayDates.end;
$j(a360).trigger('displayDatesChanged', [a360.displayDates.start, a360.displayDates.end]);
}
}
else {
$j('#a360-datepicker-popup').addClass('open');
$j('#a360-datepicker-pane').slideDown();
$j('#a360-current-date-range input').show();
$j('#a360-current-date-range span').hide();
}
};
var buildDatepicker = function() {
if (!$j('#a360-datepicker-popup').data('datepicker')) {
var dpmm = $j('#a360-datepicker-calendars').datePickerMultiMonth({
numMonths: 2,
inline: true,
selectMultiple: true,
startDate: '01/01/2000',
endDate: Date.today().toString('dd/MM/yyyy'),
renderCallback: function(jqCell, date, m, y) {
var element = jqCell.get(0);
element.onselectstart = function() {
return false;
};
element.unselectable = "on";
element.style.MozUserSelect = "none";
jqCell.click(function(event) {
if (event.shiftKey) {
if (date.isBefore(a360.displayDates.start)) {
selectDateRange(date, a360.displayDates.end);
}
else if (date.isAfter(a360.displayDates.start)) {
selectDateRange(a360.displayDates.start, date);
}
else if (date.between(a360.displayDates.start, a360.displayDates.end)) {
if (date.valueOf() - a360.displayDates.start.valueOf() > a360.displayDates.end.valueOf() - date.valueOf()) {
selectDateRange(date, a360.displayDates.end);
}
else {
selectDateRange(a360.displayDates.start, date);
}
}
}
else {
if (a360.displayDates.start.equals(a360.displayDates.end)) {
selectDateRange(a360.displayDates.start, date);
}
else {
selectDateRange(date, date);
}
}
});
}
});
$j('#a360-datepicker-calendars').data('datepicker', dpmm);
}
};
$j('#a360-datepicker-popup')
.hover(function(){ $j('#a360-datepicker-popup').addClass('hover'); }, function() { $j('#a360-datepicker-popup').removeClass('hover'); })
.click(function(event) {
if (event.target.nodeName.toLowerCase() == 'input') {
return true;
}
toggleDatePopup();
});
$j('#a360-current-start-date input, #a360-current-end-date input').keydown(function() {
clearTimeout($j(this).data('idleTimer'));
$j(this).data('idleTimer', setTimeout((function() {
var d = new Date($j(this).val().replace(/-/g, '/'));
if (isNaN(d.valueOf())) {
$j(this).addClass('invalid');
}
else {
$j(this).removeClass('invalid');
}
if ($j('input.invalid', $j(this).parent()).size() == 0) {
selectDateRange(
new Date($j('#a360-current-start-date input').val().replace(/-/g, '/')),
new Date($j('#a360-current-end-date input').val().replace(/-/g, '/'))
);
}
})._cfBind(this), 500));
});
$j('#a360-apply-date-range').click(function() {
toggleDatePopup();
});
buildDatepicker();
selectDateRange(Date.today().addMonths(-1), Date.today().addDays(-1));
// kick it off
jqA360.trigger('displayDatesChanged', [a360.displayDates.start, a360.displayDates.end]);
if (jQuery('#a360-list-growth-list-id').size()) {
jQuery('#a360-list-growth-list-id').change(function() {
a360.fetchMCListGrowth(jQuery('#a360-list-growth-list-id').val());
});
jQuery('#a360-list-growth-list-id').trigger('change');
}
};
a360.updateVisitStats = function(event, medium) {
$j('#a360-stat-visits').html(a360.visitStats.mediumSummaries[medium].totalVisits.commaize());
$j('#a360-stat-pageviews').html(a360.visitStats.mediumSummaries[medium].totalPageviews.commaize());
$j('#a360-stat-pages-per-visit').html(a360.visitStats.mediumSummaries[medium].totalPagesPerVisit.commaize());
$j('#a360-stat-bounce-rate').html(a360.visitStats.mediumSummaries[medium].bounceRate);
$j('#a360-stat-time-on-site').html(a360.visitStats.mediumSummaries[medium].avgTimeOnSite);
$j('#a360-stat-new-visits').html(a360.visitStats.mediumSummaries[medium].percentNewVisits);
$j('.a360-stats-list').slideDown();
$j.each({
'a360-stat-visits-spark': a360.visitStats.mediumSummaries[medium].visits,
'a360-stat-pageviews-spark': a360.visitStats.mediumSummaries[medium].pageviews,
'a360-stat-pages-per-visit-spark': a360.visitStats.mediumSummaries[medium].pagesPerVisit,
'a360-stat-bounce-rate-spark': a360.visitStats.mediumSummaries[medium].bounceRates,
'a360-stat-time-on-site-spark': a360.visitStats.mediumSummaries[medium].timeOnSite,
'a360-stat-new-visits-spark': a360.visitStats.mediumSummaries[medium].newVisits
}, function(id, filteredData) {
var table = new google.visualization.DataTable();
var spark = new google.visualization.ImageSparkLine($j('#' + id).empty().get(0));
table.addColumn('number', id);
table.addRows(filteredData.length);
$j.each(filteredData, function(i, value) {
table.setValue(i, 0, value);
});
spark.draw(table, {
width:180,
height: 25,
showAxisLines: false,
showValueLabels: false,
labelPosition: 'none'
});
});
};
a360.updateMap = function(event, data) {
var table = new google.visualization.DataTable();
table.addColumn('string', 'Country');
table.addColumn('number', 'Visits');
var rows = [];
$j.each(data, function(i, datum) {
rows.push({ country: datum.dimensions.country, visits: datum.metrics.visits });
});
table.addRows(rows.length);
$j.each(rows, function(i, row) {
table.setValue(i, 0, row.country);
table.setValue(i, 1, parseInt(row.visits, 10));
});
var geomap = new google.visualization.GeoMap($j('#a360-geo-map').empty().get(0));
geomap.draw(table, { dataMode: 'regions', width:'600px', colors: [0xC1D8EC, 0xD98E26] });
};
a360.updateReferralMediumChart = function(event, data) {
var table = new google.visualization.DataTable();
table.addColumn('string', 'Medium');
table.addColumn('number', 'Visits');
var rows = [];
var media = {};
var nMedia = 0;
var totalVisits = 0;
$j.each(data, function(i, row) {
var medium = 'other';
//var medium = row.dimensions.medium;
switch (row.dimensions.medium) {
case '(none)':
case '(not set)':
medium = 'direct traffic';
break;
case 'referral':
medium = 'referring traffic';
break;
case 'email':
medium = 'email campaigns';
break;
case 'organic':
medium = 'search engines';
break;
}
if (media[medium]) {
media[medium] += row.metrics.visits;
}
else {
media[medium] = row.metrics.visits;
nMedia++;
}
totalVisits += row.metrics.visits;
});
table.addRows(nMedia);
var i = 0;
var legendText = [];
var colors = ['#5D83AD', '#91AFD1', '#BDD2EF', '#1b4065', '#777777'];
$j.each(media, function(medium, visits) {
if (visits === undefined) {
return true;
}
table.setValue(i, 0, medium);
table.setValue(i, 1, visits);
legendText.push('\
<li>\
<div class="a360-color-swatch" style="background:' + colors[i] + '"></div><strong>' + medium + '</strong>\
<div>' + visits.commaize() + ' (' + ((100 * visits / totalVisits).toPrecision(2)) + '%)</div>\
</li>\
');
i++;
});
var d = $j('#a360-box-referring-traffic-overview').width() * 0.45;
$j('#a360-referring-traffic-chart').width(d).css('padding-top', Math.min(d * .3, 40));
var piechart = new google.visualization.PieChart($j('#a360-referring-traffic-chart').empty().get(0));
piechart.draw(table, {
is3D:false,
legend: 'none',
width: d,
height: d,
legendFontSize:14,
legendTextColor:'#777777',
colors: colors
});
$j('#a360-referring-traffic-overview-legend').html('\
<ul>\
' + legendText.join("\n") + '\
</ul>\
').css('left', d + (d * .2) + 'px');
};
a360.updateTopReferrersChart = function(event, data) {
var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'Source/Medium');
dataTable.addColumn('number', 'Visits');
dataTable.addColumn('number', 'Pages/Visit');
dataTable.addColumn('string', 'Avg. Time on Site');
var rows = [];
var media = {};
var nRows = 0;
//console.dir(data);
// our code on the server runs a separate request to google for each medium
$j.each(data, function(medium, referrals) {
if (!referrals || typeof referrals != 'object' || !('length' in referrals)) {
return true;
}
$j.each(referrals, function(i, row) {
var key = row.dimensions.source + ' / ' + row.dimensions.medium;
if (media[key]) {
media[key].visits += row.metrics.visits;
media[key].pagesPerVisit += row.metrics.visits ? (row.metrics.pageviews / row.metrics.visits) : 0;
media[key].timeOnSite += row.metrics.timeOnSite;
}
else {
media[key] = {};
if (row.dimensions.medium == 'organic' || row.dimensions.medium == 'cpc') {
media[key].markup = '<a title="Show Top Keywords from ' + row.dimensions.source.replace(/\"/, '\'') + '" href="javascript:a360.fetchGAKeywords(\'' + row.dimensions.source + '\');">' + row.dimensions.source + ' / ' + row.dimensions.medium + '</a>';
}
else if (row.dimensions.medium == 'referral') {
media[key].markup = '<a title="Show Top Referring Paths from ' + row.dimensions.source.replace(/\"/, '\'') + '" href="javascript:a360.fetchGAReferralPaths(\'' + row.dimensions.source + '\');">' + row.dimensions.source + ' / ' + row.dimensions.medium + '</a>';
}
else if (row.dimensions.medium == 'email') {
media[key].markup = '<a title="Show Top Email Campaigns" href="javascript:a360.fetchGAEmailReferrals(\'' + row.dimensions.source + '\');">' + row.dimensions.source + ' / ' + row.dimensions.medium + '</a>';
}
else if (row.dimensions.source !== undefined){
media[key].markup = '<a title="Show Top Referring Paths from ' + row.dimensions.source.replace(/\"/, '\'') + '" href="javascript:a360.fetchGAReferralPaths(\'' + row.dimensions.source + '\');">' + row.dimensions.source.replace(/\"/, '\'') + ' / ' + row.dimensions.medium + '</a>';
}
media[key].visits = row.metrics.visits;
media[key].pagesPerVisit = row.metrics.visits ? (row.metrics.pageviews / row.metrics.visits) : 0;
media[key].timeOnSite = row.metrics.timeOnSite;
nRows++;
}
});
});
$j.each(media, function(id, row) { row.timeOnSite = a360.secToDuration(row.visits ? Math.round((row.timeOnSite) / row.visits) : 0); });
dataTable.addRows(nRows);
var i = 0;
$j.each(media, function(medium, row) {
dataTable.setValue(i, 0, row.markup);
dataTable.setValue(i, 1, row.visits);
dataTable.setValue(i, 2, parseFloat(row.pagesPerVisit.toPrecision(3)));
dataTable.setValue(i, 3, row.timeOnSite);
i++;
});
a360.pushTable(jQuery('#a360-top-referrers'), dataTable, 'Top Referrers');
};
a360.handleKeywordsFetched = function(event, data, sourceName) {
var keywordData = new google.visualization.DataTable();
keywordData.addColumn('string', 'Keyword');
keywordData.addColumn('number', 'Pageviews');
keywordData.addColumn('number', 'Unique Pageviews');
keywordData.addColumn('string', 'Avg. Time on Page');
keywordData.addRows(data.length);
$j.each(data, function(i, row) {
keywordData.setValue(i, 0, row.dimensions.keyword);
keywordData.setValue(i, 1, row.metrics.pageviews);
keywordData.setValue(i, 2, row.metrics.uniquePageviews);
keywordData.setValue(i, 3,
a360.secToDuration(Math.round(row.metrics.timeOnPage / (row.metrics.pageviews - row.metrics.exits)))
);
});
a360.pushTable(jQuery('#a360-top-referrers'), keywordData, 'Keywords from ' + sourceName);
};
a360.handleReferralPathsFetched = function(event, data, sourceName) {
var keywordData = new google.visualization.DataTable();
keywordData.addColumn('string', 'Referring Page');
keywordData.addColumn('number', 'Pageviews');
keywordData.addColumn('number', 'Unique Pageviews');
keywordData.addColumn('string', 'Avg. Time on Page');
keywordData.addRows(data.length);
$j.each(data, function(i, row) {
keywordData.setValue(i, 0, '<a class="a360-outgoing" href="http://' + row.dimensions.source + row.dimensions.referralPath + '">' + row.dimensions.referralPath + '</a>');
keywordData.setValue(i, 1, row.metrics.pageviews);
keywordData.setValue(i, 2, row.metrics.uniquePageviews);
keywordData.setValue(i, 3,
a360.secToDuration((row.metrics.pageviews - row.metrics.exits) > 0 ? Math.round(row.metrics.timeOnPage / (row.metrics.pageviews - row.metrics.exits)) : 0)
);
});
a360.pushTable(jQuery('#a360-top-referrers'), keywordData, 'Referring Paths from ' + sourceName);
};
a360.handleEmailReferralsFetched = function(event, data, sourceName) {
var keywordData = new google.visualization.DataTable();
keywordData.addColumn('string', 'Campaign');
keywordData.addColumn('number', 'Pageviews');
keywordData.addColumn('number', 'Unique Pageviews');
keywordData.addColumn('string', 'Avg. Time on Page');
keywordData.addRows(data.length);
$j.each(data, function(i, row) {
keywordData.setValue(i, 0, row.dimensions.campaign);
keywordData.setValue(i, 1, row.metrics.pageviews);
keywordData.setValue(i, 2, row.metrics.uniquePageviews);
keywordData.setValue(i, 3,
a360.secToDuration((row.metrics.pageviews - row.metrics.exits) > 0 ? Math.round(row.metrics.timeOnPage / (row.metrics.pageviews - row.metrics.exits)) : 0)
);
});
a360.pushTable(jQuery('#a360-top-referrers'), keywordData, 'Email Campaigns');
};
a360.updateTopContentChart = function(event, data) {
var contentData = new google.visualization.DataTable();
contentData.addColumn('string', 'Page');
contentData.addColumn('number', 'Pageviews');
contentData.addColumn('number', 'Unique Pageviews');
contentData.addColumn('string', 'Avg. Time on Page');
contentData.addRows(data.length);
var secs = 0;
$j.each(data, function(i, row) {
contentData.setValue(i, 0, '<a class="a360-outgoing" href="' + row.dimensions.pagePath + '">' + row.dimensions.pagePath + '</a>');
contentData.setValue(i, 1, row.metrics.pageviews);
contentData.setValue(i, 2, row.metrics.uniquePageviews);
if (row.metrics.pageviews - row.metrics.exits > 0) {
secs = Math.round(row.metrics.timeOnPage / (row.metrics.pageviews - row.metrics.exits));
}
else {
secs = 0;
}
contentData.setValue(i, 3, a360.secToDuration(secs));
});
a360.pushTable(jQuery('#a360-top-content'), contentData, 'Top Content');
};
a360.updateListGrowth = function(event, data) {
var listData = new google.visualization.DataTable();
listData.addColumn('string', 'Month');
listData.addColumn('number', 'subscribes');
listData.addColumn('number', 'import');
listData.addColumn('number', 'existing');
listData.addRows(data.length);
$j.each(data, function(i, month) {
listData.setCell(i, 0, month.month);
listData.setCell(i, 1, parseInt(month.optins, 10));
listData.setCell(i, 2, parseInt(month.imports, 10));
listData.setCell(i, 3, parseInt(month.existing, 10));
});
var d = $j('#a360-list-growth-chart').parent().width() * 0.9;
$j('#a360-list-growth-chart').width(Math.min(d, 350));
var chart = new google.visualization.ColumnChart($j('#a360-list-growth-chart').empty().get(0));
chart.draw(listData, {
isStacked: true,
legend: 'bottom',
height:Math.min(d * .75, 300),
width:Math.min(d, 350),
colors: ['#5D83AD', '#91AFD1', '#BDD2EF']
});
};
a360.setMediumFilter = function(mediumFilter, tab) {
a360.hideTooltip();
a360.lineChart.drawFrame = $j($j('#a360-all-traffic-graph rect')[1]);
a360.lineChart.height = a360.gfx.getDimensions(a360.lineChart.drawFrame).height;
a360.lineChart.offsetY = a360.gfx.getOffset(a360.lineChart.drawFrame).top;
var endCoords = [];
var startCoords = [];
var valueToY = function(value) {
return a360.lineChart.height + a360.lineChart.offsetY - (
(value - a360.lineChart.bottomLineValue) / (a360.lineChart.topLineValue - a360.lineChart.bottomLineValue) * a360.lineChart.height
);
};
a360.lineChart.jqCircles.each(function(index) {
var offset = a360.gfx.getCenterOffset(this);
startCoords.push({
x: offset.left,
y: offset.top
});
endCoords.push({
x: offset.left,
y: valueToY(a360.lineChart.visitData.getProperty(index, 1, 'dayStats').getVisits(mediumFilter) || 0)
});
});
tab = tab ? tab : $j('#a360-' + mediumFilter.replace(/[^\w]/g, '-') +'-traffic-tab');
if (tab && $j(tab).size()) {
$j(tab).addClass('a360-selected').siblings().removeClass('a360-selected');
}
else {
$j('#a360-box-site-traffic ul.a360-tabs li:last').addClass('a360-selected').siblings().removeClass('a360-selected');
}
var frame = 0;
var nFrames = 20;
setTimeout(function() {
if (frame <= nFrames) {
setTimeout(arguments.callee, 25);
a360.animateLineChart(startCoords, endCoords, frame++, nFrames);
}
}, 25);
a360.visitStats.mediumFilter = mediumFilter;
$j(a360).trigger('mediumFilterChanged', [mediumFilter]);
};
a360.updateVisitsChart = function(event, data) {
var visitData = new google.visualization.DataTable();
visitData.addColumn('date', 'Date');
visitData.addColumn('number', 'Visits');
if (!data || data.length == 0) {
visitData.addRows(1);
visitData.setCell(0, 0, 'No Visit Data');
}
else {
visitData.addRows(a360.visitStats.nDays);
i = 0;
$j.each(a360.visitStats.days, function(dateKey, day) {
visitData.setCell(i, 0, day.date);
visitData.setCell(i, 1, day.getVisits('all traffic'));
visitData.setProperty(i, 1, 'dayStats', day);
i++;
});
}
$j('#a360-box-site-traffic ul.a360-tabs').empty();
$j.each(a360.visitStats.mediumSummaries, function(name, summary) {
if (['all traffic', 'cpc', 'email', 'organic', 'referral'].indexOf(name) >= 0) {
var tab = $j('<li id="a360-' + name.replace(/[^\w]/g, '-') +'-traffic-tab">' + name + '</li>').click(function() {
a360.setMediumFilter(name, this);
});
$j('#a360-box-site-traffic ul.a360-tabs').prepend(tab);
}
});
var tabWidth = 0; // IE can't figure this bit out on its own; mostly harmless in other browsers.
$j('#a360-box-site-traffic ul.a360-tabs li').each(function() {
var jq = $j(this);
tabWidth += jq.width() +
parseInt(jq.css('margin-left'), 10) +
parseInt(jq.css('margin-right'), 10) +
parseInt(jq.css('padding-left'), 10) +
parseInt(jq.css('padding-right'), 10);
});
$j('#a360-box-site-traffic ul.a360-tabs').width(tabWidth + 2);
var dateFormatter = new google.visualization.DateFormat({formatType: 'medium'});
dateFormatter.format(visitData, 0);
a360.lineChart.visitData = visitData;
$j('#a360-all-traffic-graph').css('opacity', 1);
var chart = new google.visualization.AreaChart($j('#a360-all-traffic-graph').empty().get(0));
google.visualization.events.addListener(chart, 'ready', function() {
setTimeout(function() {
var iframe = $j('#a360-all-traffic-graph iframe').get(0);
var iframeDoc = iframe.contentWindow || iframe.contentDocument;
if (iframeDoc.document) {
iframeDoc = iframeDoc.document;
}
a360.lineChart.iframeDoc = iframeDoc;
var svg = $j('svg', iframeDoc);
var vml = $j($j('group', iframeDoc)[0]);
a360.gfx = svg.size() ? a360.renderers.svg : a360.renderers.vml;
var graphics = svg.size() ? svg.clone() : $j(vml.html());
$j('#a360-all-traffic-graph').empty().append(graphics);
a360.gfx.setStrokeColor($j('#a360-all-traffic-graph rect:first'), '#ffffff'); // ie wub
if (a360.gfx.renderer == 'svg') {
var yAxisValues = $j('text').map(function() {
if (this.getAttribute('transform') !== null) {
return null;
}
else {
return parseFloat(this.childNodes[0].textContent.replace(/,/g, ''));
}
});
a360.lineChart.topLineValue = yAxisValues[yAxisValues.length - 1];
a360.lineChart.bottomLineValue = yAxisValues[0];
// copy a background "all traffic" fill area
var chartFill = $j('path[fill=#92BCD0]');
a360.gfx.setFillColor(chartFill.clone().insertBefore(chartFill), '#cfcfcf');
}
else {
var yAxisValues = $j('textpath').map(function() {
if (this.string.indexOf(' ') > -1) {
return null;
}
else {
return parseFloat(this.string.replace(/,/g, ''));
}
});
a360.lineChart.topLineValue = yAxisValues[yAxisValues.length - 1];
a360.lineChart.bottomLineValue = yAxisValues[0];
// @todo: get the background fill working in IE
//var chartFill = $j('shape:eq(' + ($j('shape').size() - 2) + ')');
//var clonedFill = chartFill.clone().insertBefore(chartFill);
//$j('fill', clonedFill).attr('color', '#cfcfcf').attr('id', 'blah');
}
var circles = a360.lineChart.jqCircles = $j(a360.gfx.circleName, graphics);
circles.each(function(index) {
$j(this).attr('onclick', null);
$j(this).hover(function() {
a360.gfx.setStrokeWeight($j(this), $j(this).data('strokeWeight') + 1);
}, function() {
a360.gfx.setStrokeWeight($j(this), $j(this).data('strokeWeight'));
});
a360.gfx.setFillColor($j(this), '#ffffff');
a360.gfx.setStrokeColor($j(this), '#92BCD0');
a360.gfx.setStrokeWeight($j(this).data('strokeWeight', 1), 1);
a360.gfx.setRadius($j(this).data('radius', 3), 3);
$j(this).click(function(event) {
a360.hideTooltip();
a360.gfx.setRadius($j(this), $j(this).data('radius') + 3);
var extra = '';
var postProp = a360.lineChart.visitData.getProperty(index, 0, 'post');
if (postProp) {
extra += '\
<div class="a360-post-point-link">\
<a href="' + postProp.guid + '"><strong>Post</strong>: ' + postProp.post_title.substring(0, 12) + '…</a>\
</div>\
';
}
var campaignProp = a360.lineChart.visitData.getProperty(index, 0, 'campaignSent');
if (campaignProp) {
extra += '\
<div class="a360-campaign-point-link">\
<a href="' + campaignProp.archive_url + '"><strong>Campaign</strong>: ' + campaignProp.title.substring(0, 12) + '…</a>\
</div>\
';
}
var visits = '';
if (a360.visitStats.mediumFilter !== 'all traffic') {
visits = (visitData.getProperty(index, 1, 'dayStats').getVisits(a360.visitStats.mediumFilter).commaize() || '0') + ' <span style="color:#aaaaaa">(out of ' + visitData.getValue(index, 1).commaize() + ')</span>';
}
else {
visits = visitData.getValue(index, 1).commaize();
}
var content = '\
<strong>' + visitData.getValue(index, 0).toString('dddd, MMM dd yyyy') + '</strong><br/>\
' + extra + '\
' + '<strong>Visits</strong>: ' + visits + '\
';
a360.renderTooltip(event, $j('#a360-all-traffic-graph'), content);
return false;
});
});
$j('#a360-all-traffic-graph').show();
// now fetch posts and campaigns for overlay
a360.fetchWPPosts();
if (MCapikey.length) {
a360.fetchMCCampaigns();
}
$j('#a360-all-traffic-graph').animate({ opacity: 1 }, function() {
a360.setMediumFilter(a360.visitStats.mediumFilter);
});
}, 500);
});
chart.draw(visitData, {
width: '100%',
height: 300,
legend: 'none',
title: '',
backgroundColor: { stroke: null, strokeSize: 0, fill:'#ffffff' },
borderColor: '#92BCD0',
colors: ['#92BCD0'],
axisFontSize: 11,
enableTooltip: false,
min: 0
});
};
a360.updateVisitsChartWithPosts = function(event, data) {
$j.each(data, function(i, post) {
if (post.post_date) {
var postDate = new Date(post.post_date.substring(0, 'yyyy-mm-dd'.length).replace(/-/g, '/'));
var nRows = a360.lineChart.visitData.getNumberOfRows();
for (var i = 0; i < nRows; i++) {
var dataDate = a360.lineChart.visitData.getValue(i, 0);
if (postDate.equals(dataDate)) {
var circle = a360.lineChart.jqCircles[i];
$j(circle).data('strokeWeight', 3);
a360.gfx.setStrokeWeight(circle, 3);
if (a360.lineChart.visitData.getProperty(i, 0, 'campaignSent')) {
a360.gfx.setFillColor(circle, '#00576F');
a360.gfx.setStrokeColor(circle, '#D98E26');
}
else {
a360.gfx.setFillColor(circle, '#D98E26');
a360.gfx.setStrokeColor(circle, '#D98E26');
}
a360.gfx.setRadius($j(circle).data('radius', 5), 5);
a360.lineChart.visitData.setProperty(i, 0, 'post', post);
}
}
}
});
};
a360.updateVisitsChartWithCampaigns = function(event, data) {
$j.each(data, function(i, campaign) {
if (campaign.send_time) {
var sendDate = new Date(campaign.send_time.substring(0, 'yyyy-mm-dd'.length).replace(/-/g, '/'));
var nRows = a360.lineChart.visitData.getNumberOfRows();
for (var i = 0; i < nRows; i++) {
var dataDate = a360.lineChart.visitData.getValue(i, 0);
if (sendDate.equals(dataDate)) {
var circle = a360.lineChart.jqCircles[i];
$j(circle).data('strokeWeight', 3);
a360.gfx.setStrokeWeight(circle, 3);
if (a360.lineChart.visitData.getProperty(i, 0, 'post')) {
a360.gfx.setFillColor(circle, '#00576F');
a360.gfx.setStrokeColor(circle, '#D98E26');
}
else {
a360.gfx.setFillColor(circle, '#00576F');
a360.gfx.setStrokeColor(circle, '#00576F');
}
a360.gfx.setRadius($j(circle).data('radius', 5), 5);
a360.lineChart.visitData.setProperty(i, 0, 'campaignSent', campaign);
}
}
}
});
};
a360.hideTooltip = function() {
$j('.a360-tooltip-container').remove();
if (a360.lineChart.jqCircles) {
a360.lineChart.jqCircles.each(function() { a360.gfx.setRadius($j(this), $j(this).data('radius')); });
}
};
a360.renderTooltip = function(event, container, content) {
var containerOffset = container.offset();
var className = '';
var left = 0;
var top = 0;
var lr = '';
var ul = '';
if (event.pageX + 200 - containerOffset.left > jQuery(container).width()) {
lr = 'right';
left = event.pageX - containerOffset.left - 180;
}
else {
lr = 'left';
left = event.pageX - containerOffset.left - 5;
}
if (event.pageY - containerOffset.top < 100) {
ul = 'upper';
top = event.pageY - containerOffset.top - 40;
}
else {
ul = 'lower';
top = event.pageY - containerOffset.top - 60;
}
var markup = '';
if (ul == 'upper') {
markup = '\
<div class="a360-tooltip-upper-' + lr + '-point"></div>\
<div class="a360-tooltip-upper-' + lr + '-top"></div>\
';
}
else {
markup = '\
<div class="a360-tooltip-lower-star-top"></div>\
';
}
markup += '\
<div class="a360-tooltip-body">' + content + '</div>\
';
if (ul == 'upper') {
markup += '<div class="a360-tooltip-upper-star-bottom"></div>';
}
else {
markup += '\
<div class="a360-tooltip-lower-' + lr + '-bottom"></div>\
<div class="a360-tooltip-lower-' + lr + '-point"></div>\
';
}
var fade = (('support' in $j) && $j.support.opacity) || !($j.browser.msie);
if (fade) {
var t = $j('<div class="a360-tooltip-container">' + markup + '</div>').css({ left: left, top: top, opacity: 0.1 });
$j(container).prepend(t);
t.click(function(event) {
a360.hideTooltip();
}).animate({
top: (ul == 'upper' ? '+=40' : '-=' + (t.height() - 60)),
opacity: 1
}, 300);
}
else {
// ie no likey
var t = $j('<div class="a360-tooltip-container">' + markup + '</div>').css({ left: left, top: top });
$j(container).prepend(t);
t.click(function(event) {
a360.hideTooltip();
}).animate({
top: (ul == 'upper' ? '+=40' : '-=' + (t.height() - 70))
}, 0);
}
};
a360.pushTable = function(container, data, title) {
var table = new a360.Table(data, title);
container = $j(container);
var stack = container.data('tableStack') || container.data('tableStack', []).data('tableStack');
stack.push(table);
table.draw(container);
a360.setHeaderTitle(container.parents('.a360-box'), table.title);
container.parents('.a360-box').find('.a360-breadcrumbs').html(a360.getTableBreadcrumbs(container));
};
a360.popTable = function(container) {
var stack = container.data('tableStack');
stack.pop();
container.empty();
if (stack.length) {
var table = stack[stack.length - 1];
table.draw(container);
a360.setHeaderTitle(container.parents('.a360-box'), table.title);
container.parents('.a360-box').find('.a360-breadcrumbs').html(a360.getTableBreadcrumbs(container));
}
};
a360.clearTableStack = function(container) {
container.data('tableStack', []);
a360.setHeaderTitle(container.parents('.a360-box'), '');
container.parents('.a360-box').find('.a360-breadcrumbs').html('');
};
a360.getTableBreadcrumbs = function(container) {
var stack = container.data('tableStack');
if (stack.length < 2) {
return '';
}
var links = [];
$j.each(stack, function(i, table) {
if (i < stack.length - 1) {
links.push('<a href="#" onclick="a360.popTable(jQuery(this).parents(\'.a360-box\').find(\'.a360-table-container\')); return false">' + table.title + '</a>');
}
else {
links.push(table.title);
}
});
return links.join(' » ');
};
a360.Table = function(data, title) {
this.data = data;
this.title = title;
this.jqContainer = null;
this.tableViz = null;
this.sortedColumn = 2;
this.page = 0;
};
a360.Table.prototype.draw = function(container) {
this.jqContainer = $j(container);
this.tableViz = new google.visualization.Table(this.jqContainer.empty().get(0));
google.visualization.events.addListener(this.tableViz, 'ready', this.handleRedraw._cfBind(this));
google.visualization.events.addListener(this.tableViz, 'sort', (function(info) {
this.sortedColumn = info.column + 1;
this.handleRedraw();
})._cfBind(this));
google.visualization.events.addListener(this.tableViz, 'page', (function(info) {
this.page = info.page;
this.handleRedraw();
})._cfBind(this));
this.tableViz.draw(this.data, {
width: '100%',
page: 'enable',
showRowNumber: true,
sortAscending: false,
sortColumn: 1,
allowHtml: true,
startPage: this.page,
cssClassNames: {
headerRow: 'a360-table-header',
tableRow: 'a360-table-row',
selectedTableRow: 'a360-table-row-selected',
hoverTableRow: 'a360-table-row-hover',
oddTableRow: 'a360-table-row-odd'
}
});
};
a360.Table.prototype.handleRedraw = function() {
jQuery('.a360-table-header td', this.jqContainer).each(function(i) {
jQuery(this).width(['2%', '47%', '15%', '15%', '20%'][i]);
});
jQuery('button', this.jqContainer).addClass('button');
jQuery('td', this.jqContainer).removeClass('sorted');
var sortedColumn = this.sortedColumn;
jQuery('.a360-table-header, .a360-table-row, .a360-table-row-odd', this.jqContainer).each(function() {
jQuery('td:eq(' + (sortedColumn) + ')', this).addClass('sorted');
});
};
a360.lineChart = {
iframeDoc: null,
jqCircles: null,
visitData: null,
drawFrame: null,
height: null,
offsetY: null,
topLineValue: 0,
bottomLineValue: 0
};
a360.maxFetchAttempts = 10;
a360.fetchFailed = function(f, args, failureEventName, failureEventArgs) {
f.attempts = ('attempts' in f) ? f.attempts + 1 : 1;
if (f.attempts < a360.maxFetchAttempts) {
f.apply(a360, (args || []));
}
else {
$j(a360).trigger(failureEventName, failureEventArgs);
f.attempts = 0;
}
};
a360.fetchSucceeded = function(f, eventName, eventArgs) {
f.attempts = 0;
$j(a360).trigger(eventName, eventArgs);
};
a360.setHeaderTitle = function(box, title) {
$j('.a360-box-header h3', box).html(title);
};
// note that box needs to be position:relative or absolute.
a360.addHeaderError = function(box, error) {
$j('.a360-box-status', box).removeClass().addClass('a360-box-status a360-error').click(function(event) {
a360.renderTooltip(event, box, error);
});
};
a360.setHeaderStatus = function(box, status) {
$j('.a360-box-status', box).unbind().removeClass().addClass('a360-box-status a360-' + status);
};
a360.secToDuration = function(sec) {
var min = Math.floor(sec / 60);
var hours = (min < 60 ? 0 : Math.floor(min / 60));
min -= hours * 60;
var sec = sec - (hours * 3600) - (min * 60);
hours = hours < 10 ? '0' + hours : hours + '';
min = min < 10 ? '0' + min : min + '';
sec = sec < 10 ? '0' + sec : sec + '';
return hours + ':' + min + ':' + sec;
};
a360.visitStats = {
days: {},
mediumSummaries: {},
nDays: 0,
mediumFilter: 'all traffic'
};
a360.MediumSummary = function(medium) {
this.medium = medium;
this.totalVisits = 0;
this.totalBounceRate = 0;
this.totalNewVisits = 0;
this.totalPageviews = 0;
this.totalTimeOnSite = 0;
this.avgTimeOnSite = '';
this.bounceRate = '';
this.percentNewVisits = '';
this.totalPagesPerVisit = '';
// for sparklines
this.visits = [];
this.bounceRates = [];
//this.bounceRates = [];
this.newVisits = [];
this.pageviews = [];
this.timeOnSite = [];
this.pagesPerVisit = [];
};
// a day's stats
/**
* {
* metric1: {
* 'all traffic': value,
* medium1: value,
* medium2: value
* ...
* },
* metric2: {
* 'all traffic': value,
* ...
* }
* }
*/
a360.DayStats = function(date) {
this.date = date;
// create getters for each of our metrics. each method takes a medium as argument, so, ex:
// var visits = day.getVisits('cpc');
// var views = day.getPageviews('cpc');
// etc ...
$j.each(['visits', 'bounces', 'newVisits', 'pageviews', 'timeOnSite', 'pagesPerVisit', 'entrances'], (function(i, metric) {
this[metric] = { 'all traffic': 0 };
this['get' + metric.substring(0, 1).toUpperCase() + metric.substr(1)] = (function(medium) {
return this[metric][medium];
})._cfBind(this);
})._cfBind(this));
};
a360.fetchGAVisits = function() {
$j(a360).trigger('fetchingGAVisits');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
format: 'raw',
a360_action: 'get_ga_data',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd'),
data_type: 'visits'
}, function(result, status) {
if (result.success) {
a360.visitStats.days = {};
a360.visitStats.mediumSummaries = {
'all traffic': new a360.MediumSummary('all traffic')
};
a360.visitStats.nDays = 0;
var data = result.data;
var medium = '';
var summary = null;
for (var i = 0; i < data.length; i++) {
var dateKey = data[i].dimensions.date;
medium = data[i].dimensions.medium;
// if this is the first time we've seen this date
if (dateKey !== undefined && !(dateKey in a360.visitStats.days)) {
a360.visitStats.days[dateKey] = new a360.DayStats(new Date(
parseInt(dateKey.substr(0, 4), 10),
parseInt(dateKey.substr(4, 2), 10) - 1,
parseInt(dateKey.substr(6, 2), 10)
));
a360.visitStats.nDays++;
}
var dayStats = a360.visitStats.days[dateKey];
$j.each(data[i].metrics, function(metricKey, value) {
dayStats[metricKey][medium] = value;
dayStats[metricKey]['all traffic'] = (('all traffic' in dayStats[metricKey]) ? dayStats[metricKey]['all traffic'] + value : value);
});
if (!(medium in a360.visitStats.mediumSummaries)) {
a360.visitStats.mediumSummaries[medium] = new a360.MediumSummary(medium);
}
summary = a360.visitStats.mediumSummaries[medium];
summary.visits.push(data[i].metrics.visits);
summary.totalVisits += data[i].metrics.visits;
summary.bounceRates.push(data[i].metrics.entrances > 0 ? data[i].metrics.bounces / data[i].metrics.entrances : 0);
summary.totalBounceRate += (data[i].metrics.entrances > 0 ? data[i].metrics.bounces / data[i].metrics.entrances : 0);
summary.newVisits.push(data[i].metrics.visits > 0 ? data[i].metrics.newVisits / data[i].metrics.visits : 0);
summary.totalNewVisits += data[i].metrics.newVisits;
summary.pageviews.push(data[i].metrics.pageviews);
summary.totalPageviews += data[i].metrics.pageviews;
summary.timeOnSite.push(data[i].metrics.visits > 0 ? data[i].metrics.timeOnSite / data[i].metrics.visits : 0);
summary.totalTimeOnSite += data[i].metrics.timeOnSite;
summary.pagesPerVisit.push(data[i].metrics.visits > 0 ? data[i].metrics.pageviews / data[i].metrics.visits : 0);
}
$j.each(a360.visitStats.mediumSummaries, function(medium, summary) {
summary.avgTimeOnSite = a360.secToDuration(Math.round(summary.totalTimeOnSite / summary.totalVisits));
summary.bounceRate = (summary.totalBounceRate / a360.visitStats.nDays * 100).toPrecision(4) + '%';
summary.percentNewVisits = ((summary.totalNewVisits / summary.totalVisits) * 100).toPrecision(4) + '%';
summary.totalPagesPerVisit = (summary.totalPageviews / summary.totalVisits).toPrecision(3);
});
// compose summary for all traffic
medium = 'all traffic';
summary = a360.visitStats.mediumSummaries[medium];
$j.each(a360.visitStats.days, function(dateKey, day) {
summary.visits.push(day.getVisits(medium));
summary.totalVisits += day.visits[medium];
summary.bounceRates.push(day.entrances[medium] > 0 ? day.bounces[medium] / day.entrances[medium] : 0);
summary.totalBounceRate += (day.entrances[medium] > 0 ? day.bounces[medium] / day.entrances[medium] : 0);
summary.newVisits.push(day.visits[medium] > 0 ? day.newVisits[medium] / day.visits[medium] : 0);
summary.totalNewVisits += day.newVisits[medium];
summary.pageviews.push(day.pageviews[medium]);
summary.totalPageviews += day.pageviews[medium];
summary.timeOnSite.push(day.visits[medium] > 0 ? day.timeOnSite[medium] / day.visits[medium] : 0);
summary.totalTimeOnSite += day.timeOnSite[medium];
summary.pagesPerVisit.push(day.visits[medium] > 0 ? day.pageviews[medium] / day.visits[medium] : 0);
});
summary.avgTimeOnSite = a360.secToDuration(Math.round(summary.totalTimeOnSite / summary.totalVisits));
summary.bounceRate = (summary.totalBounceRate / a360.visitStats.nDays * 100).toPrecision(4) + '%';
summary.percentNewVisits = ((summary.totalNewVisits / summary.totalVisits) * 100).toPrecision(4) + '%';
summary.totalPagesPerVisit = (summary.totalPageviews / summary.totalVisits).toPrecision(3);
a360.fetchSucceeded(a360.fetchGAVisits, 'gaVisitsFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchGAVisits, undefined, 'gaVisitsFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchGATopContent = function() {
$j(a360).trigger('fetchingGATopContent');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd'),
data_type: 'top_content'
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGATopContent, 'gaTopContentFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchGATopContent, undefined, 'gaTopContentFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchGAGeo = function() {
$j(a360).trigger('fetchingGAGeo');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd'),
data_type: 'geo'
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGAGeo, 'gaGeoFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchGAGeo, undefined, 'gaGeoFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchGATopReferrals = function() {
$j(a360).trigger('fetchingGATopReferrals');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd'),
data_type: 'top_referrals'
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGATopReferrals, 'gaTopReferralsFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchGATopReferrals, undefined, 'gaTopReferralsFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchGAReferralMedia = function() {
$j(a360).trigger('fetchingGAReferralMedia');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd'),
data_type: 'referral_media'
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGAReferralMedia, 'gaReferralMediaFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchGAReferralMedia, undefined, 'gaReferralMediaFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchWPPosts = function() {
$j(a360).trigger('fetchingWPPosts');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_fetch_posts',
a360_action: 'get_wp_posts',
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchWPPosts, 'wpPostsFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchWPPosts, undefined, 'wpPostsFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchMCCampaigns = function() {
$j(a360).trigger('fetchingMCCampaigns');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_mc_data',
data_type: 'campaigns',
start_date: a360.displayDates.start.toString('yyyy-MM-dd HH:mm:ss'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd HH:mm:ss')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchMCCampaigns, 'mcCampaignsFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchMCCampaigns, undefined, 'mcCampaignsFetchFailed', [result.error]);
}
}, 'json');
};
a360.fetchMCListGrowth = function(listID) {
$j(a360).trigger('fetchingMCListGrowth');
$j.get('', {
option: 'com_joomailermailchimpintegration',
controller: 'analytics',
task: 'a360_request_handler',
action: 'AJAX',
format: 'raw',
a360_action: 'get_mc_data',
data_type: 'list_growth',
list_id: listID,
start_date: a360.displayDates.start.toString('yyyy-MM-dd HH:mm:ss'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd HH:mm:ss')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchMCListGrowth, 'mcListGrowthFetched', [result.data]);
}
else {
a360.fetchFailed(a360.fetchMCListGrowth, [listID], 'mcListGrowthFetchFailed', [listID, result.error]);
}
}, 'json');
};
a360.fetchGAKeywords = function(sourceName) {
$j(a360).trigger('fetchingGAKeywords');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
data_type: 'keywords',
source_name: sourceName,
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGAKeywords, 'gaKeywordsFetched', [result.data, sourceName]);
}
else {
a360.fetchFailed(a360.fetchGAKeywords, [sourceName], 'gaKeywordsFetchFailed', [sourceName, result.error]);
}
}, 'json');
};
a360.fetchGAReferralPaths = function(sourceName) {
$j(a360).trigger('fetchingGAReferralPaths');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
data_type: 'referral_paths',
source_name: sourceName,
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGAReferralPaths, 'gaReferralPathsFetched', [result.data, sourceName]);
}
else {
a360.fetchFailed(a360.fetchGAReferralPaths, [sourceName], 'gaReferralPathsFetchFailed', [sourceName, result.error]);
}
}, 'json');
};
a360.fetchGAEmailReferrals = function(sourceName) {
$j(a360).trigger('fetchingGAEmailReferrals');
$j.get('', {
controller: 'analytics',
option: 'com_joomailermailchimpintegration',
task: 'a360_request_handler',
a360_action: 'get_ga_data',
data_type: 'email_referrals',
source_name: sourceName,
start_date: a360.displayDates.start.toString('yyyy-MM-dd'),
end_date: a360.displayDates.end.toString('yyyy-MM-dd')
}, function(result, status) {
if (result.success) {
a360.fetchSucceeded(a360.fetchGAReferralPaths, 'gaEmailReferralsFetched', [result.data, sourceName]);
}
else {
a360.fetchFailed(a360.fetchGAReferralPaths, [sourceName], 'gaEmailReferralsFetchFailed', [sourceName, result.error]);
}
}, 'json');
};
$j(document).ready(function() {
//if (a360.pageName == 'dashboard') {
(a360.handleDashboardReady._cfBind(a360))();
//}
});
})(jQuery);