/* global console */
/* global visualizer */
/* global jQuery */
var vizClipboard1=null;
(function($, visualizer){
function initActionsButtons(v) {
if($('a.visualizer-chart-shortcode').length > 0 && vizClipboard1 === null) {
vizClipboard1 = new ClipboardJS('a.visualizer-chart-shortcode'); // jshint ignore:line
vizClipboard1.on('success', function(e) {
window.alert(v.i10n['copied']);
});
}
if($('a.visualizer-action[data-visualizer-type=copy]').length > 0) {
$('a.visualizer-action[data-visualizer-type=copy]').on('click', function(e) {
e.preventDefault();
});
var clipboard = new ClipboardJS('a.visualizer-action[data-visualizer-type=copy]'); // jshint ignore:line
clipboard.on('success', function(e) {
window.alert(v.i10n['copied']);
});
}
$('a.visualizer-action[data-visualizer-type!=copy]').off('click').on('click', function(e) {
var type = $(this).attr( 'data-visualizer-type' );
var chart = $(this).attr( 'data-visualizer-chart-id' );
var container = $(this).attr( 'data-visualizer-container-id' );
var lock = $('.visualizer-front.visualizer-front-' + chart);
var mime = $(this).attr( 'data-visualizer-mime' );
lock.lock();
e.preventDefault();
$.ajax({
url : v.rest_url.replace('#id#', chart).replace('#type#', type),
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'X-WP-Nonce', v.wp_nonce );
},
success: function(data) {
if (data && data.data) {
switch(type){
case 'csv':
var blob = new Blob([data.data.csv], {type: mime });
if(window.navigator.msSaveOrOpenBlob){
window.navigator.msSaveOrOpenBlob(blob, data.data.name);
} else {
var url = window.URL.createObjectURL(blob);
var $a = $("");
$a.attr("href", url);
$("body").append($a);
$a.attr("download", data.data.name);
$a[0].click();
setTimeout(function () {
window.URL.revokeObjectURL(url);
$a.remove();
}, 100);
}
break;
case 'xls':
if(window.navigator.msSaveOrOpenBlob){
blob = new Blob([s2ab(atob(data.data.raw))], {type: '' });
window.navigator.msSaveOrOpenBlob(blob, data.data.name);
} else {
var $a = $(""); // jshint ignore:line
$a.attr("href", data.data.csv);
$("body").append($a);
$a.attr("download", data.data.name);
$a[0].click();
$a.remove();
}
break;
case 'print':
case 'image':
$('body').trigger('visualizer:action:specificchart', {action: type, id: container, data: data.data.csv, dataObj: data.data});
break;
default:
if(window.visualizer_perform_action) {
window.visualizer_perform_action(type, chart, data.data);
}
break;
}
}
lock.unlock();
}
});
});
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i=0; i !== s.length; ++i) {
view[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
}
$(document).ready(function(){
// for updating the currently displayed chart (preview mode)
window.vizUpdateChartPreview = function(){
var event = new CustomEvent('visualizer:render:currentchart:update', {detail: {visualizer: visualizer}});
document.body.dispatchEvent(event);
};
initChartDisplay();
initActionsButtons(visualizer);
registerDefaultActions();
});
// Refresh charts if chart not generated.
function refreshEachCharts() {
setTimeout( function() {
displayChartsOnFrontEnd();
}, 100 );
}
function initChartDisplay() {
if(visualizer.is_front == true){ // jshint ignore:line
displayChartsOnFrontEnd();
}else{
showChart();
}
}
/**
* If an `id` is provided, that particular chart will load.
*/
function showChart(id) {
// clone the visualizer object so that the original object is not affected.
var viz = Object.assign(visualizer, window.visualizer || {});
if(id){
viz.id = id;
}
$('body').trigger('visualizer:render:chart:start', viz);
}
function displayChartsOnFrontEnd() {
// display all charts that are NOT to be lazy-loaded.
$( 'div.viz-facade-loaded:not(.visualizer-lazy):not(.visualizer-cw-error):empty' ).removeClass( 'viz-facade-loaded' );
$('div.visualizer-front:not(.visualizer-lazy):not(.viz-facade-loaded)').each(function(index, element){
if ( $(element).is(':visible') ) {
var id = $(element).addClass('viz-facade-loaded').attr('id');
showChart(id);
}
refreshEachCharts();
});
// interate through all charts that are to be lazy-loaded and observe each one.
$('div.visualizer-front.visualizer-lazy').each(function(index, element){
var id = $(element).attr('id');
var limit = $(element).attr('data-lazy-limit');
if(!limit){
limit = 300;
}
var target = document.querySelector('#' + id);
// configure the intersection observer instance
var intersectionObserverOptions = {
root: null,
rootMargin: limit + 'px',
threshold: 0
};
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
observer.unobserve(target);
showChart($(entry.target).attr('id'));
}
});
}, intersectionObserverOptions);
// start observing.
observer.observe(target);
});
}
function registerDefaultActions(){
$('body').off('visualizer:action:specificchart:defaultprint').on('visualizer:action:specificchart:defaultprint', function(event, v){
var iframe = $('