1class ccew_call_ajax extends elementorModules.frontend.handlers.Base { 2 getDefaultSettings() { 3 return { 4 selectors: { 5 renderHtml: '.ccew_htmlContainer', 6 ccew_html_container: '.ccew_html_container', 7 ccew_table_widget: '.ccew_table_widget' 8 }, 9 }; 10 } 11 12 getDefaultElements() { 13 const selectors = this.getSettings('selectors'); 14 return { 15 $renderHtml: this.$element.find(selectors.renderHtml), 16 $ccew_html_container: this.$element.find(selectors.ccew_html_container), 17 $ccew_table_widget: this.$element.find(selectors.ccew_table_widget, ) 18 }; 19 } 20 21 bindEvents() { 22 var ccew_table_widget = this.elements.$ccew_table_widget; 23 var selector = this.elements.$renderHtml; 24 if (this.elements.$renderHtml.length === 0) { 25 //console.log("Please add the coingecko key."); 26 return; 27 } 28 var id_selector = this.elements.$ccew_html_container; 29 var data = selector.html(); 30 31 var ajaxURL = selector.attr("data-ajax-url"); 32 var wp_nonce = selector.attr("data-ajax-nonce"); 33 var id = id_selector.attr("id"); 34 var type = JSON.parse(data); 35 var request = { 36 'action': 'ccew_getData', 37 'settings': JSON.parse(data), 38 'nonce': wp_nonce, 39 } 40 41 jQuery.fn.generateSmallChart = function() { 42 var thisEle = jQuery(this) 43 var coin_id = 'bitcoin', 44 period = jQuery(this).data("period"), 45 chartfill = jQuery(this).data("chart-fill"), 46 color = jQuery(this).data("color"), 47 bgcolor=jQuery(this).data("bgcolor"), 48 pointsSettings = jQuery(this).data("points"), 49 currencyPrice = jQuery(this).data("currency-price"), 50 currencySymbol = jQuery(this).data("currency-symbol"), 51 points = 0; 52 1 == pointsSettings && (points = 2); 53 var historicalData = jQuery(this).data("content"); 54 undefined !== historicalData ? (historicalData = historicalData.map(function(value) { 55 var convertedPrice = parseFloat(value) * currencyPrice; 56 var decimalPosition = convertedPrice >= 1 ? 2 : convertedPrice < 1e-6 ? 8 : 6; 57 return convertedPrice.toFixed(decimalPosition) 58 }), createChart(thisEle, historicalData, chartfill,color,bgcolor, points, currencySymbol)) : thisEle.before('<span class="no-graphical-data">' + thisEle.data("msz") + "</span>") 59 } 60 61 function createChart(element, chartData, chartfill,color,bgcolor, points, currencySymbol) { 62 var data = { 63 labels: chartData, 64 datasets: [{ 65 fill: chartfill, 66 lineTension: .25, 67 pointRadius: points, 68 data: chartData, 69 backgroundColor: bgcolor, 70 borderColor: color, 71 pointBorderColor: color 72 }] 73 }, 74 maxval = Math.max.apply(Math, chartData) + 1 * Math.max.apply(Math, chartData) / 100, 75 minval = Math.min.apply(Math, chartData) - 1 * Math.min.apply(Math, chartData) / 100, 76 settings, chart = new Chart(element, { 77 type: "line", 78 data: data, 79 options: { 80 layout:{ 81 padding:0 82 }, 83 hover: { 84 mode: "nearest", 85 intersect: true 86 }, 87 maintainAspectRatio: false, 88 scales: { 89 x: { 90 display: false 91 }, 92 y: { 93 display: false, 94 } 95 }, 96 animation: { 97 duration: 400 98 }, 99 plugins:{ 100 legend: { 101 display: false 102 }, 103 tooltip: { 104 intersect: false, 105 displayColors: false, 106 callbacks: { 107 label: function(context){ 108 let value = context.formattedValue 109 return currencySymbol+""+value; 110 }, 111 title: function(context){ 112 return ""; 113 } 114 } 115 } 116 } 117 } 118 }) 119 } 120 121 122 function chart_call_back(container, symbol) { 123 124 var graphContainer = container; 125 126 // var StrokeColor = color; 127 128 var currencySymbol = symbol; 129 130 131 anychart.onDocumentReady(function() { 132 for (var i = 0; i < graphContainer.length; i++) { 133 var containerID = graphContainer[i].id; 134 var stage = anychart.graphics.create(containerID); 135 var chartPrice = graphContainer[i].dataset.chartprice; 136 chartPrice = JSON.parse(chartPrice); 137 var StrokeColor = graphContainer[i].dataset.stroke_color; 138 var coin_price = graphContainer[i].dataset.currency_price; 139 // create charts 140 var chart1 = anychart.sparkline(); 141
142 chart1.data(chartPrice); 143 chart1.stroke(StrokeColor); 144 chart1.height('70%'); 145 //chart1.padding('2px 12px'); 146 // chart1.height('100'); 147 //chart1.bounds(8, 0, 0, 20); 148 chart1.container(stage); 149 // chart1.padding('12px 12px'); 150 // setting the tooltips with formatting 151 var columnTooltip = chart1.tooltip(); 152 var decimalPostion = coin_price >= 1 ? 2 : coin_price < 1e-6 ? 8 : 6; 153 columnTooltip.format(currencySymbol + "{%value}{decimalsCount:" + decimalPostion + ",groupsSeparator:\\,}"); 154 155 // initiate chart drawing 156 chart1.draw(); 157 }; 158 159 160 }); 161 162 } 163 164 function ccew_ajax_data() { 165 if (type.widget_type == 'advanced_table') { 166 var table_id = ''; 167 jQuery.fn.ccewDatatable = function() { 168 table_id = jQuery(this).attr('id'); 169 var $ccew_table = jQuery(this); 170 var columns = []; 171 var pagination = parseInt(type.pagination) 172 var loadingLbl = type.loading_lbl; 173 var prevtext = type.prev 174 var nexttext = type.next 175 var zeroRecords = type.no_data 176 var fiatSymbol = type.symbol 177 var numberFormat = type.number_formating 178 $ccew_table.find('thead th').each(function(index) { 179 var thisTH = jQuery(this); 180 var index = thisTH.data('index'); 181 var classes = thisTH.data('classes'); 182 183 columns.push({ 184 data: index, 185 name: index, 186 render: function(data, type, row, meta) { 187 188 if (meta.settings.json === undefined) { return data; } 189 switch (index) { 190 case 'rank': 191 return data; 192 break; 193 case 'name': 194 if (typeof dynamicLink != 'undefined' && dynamicLink != "") { 195 var coinLink = currencyLink + '/' + row.symbol + '/' + row.id; 196 var html = jQuery('<div>', { class: classes }).append(jQuery('<a>', { class: 'ccew_links', title: row.name, href: (/^(https?:)?\/\//i.test(coinLink) ? coinLink : '#') }).append(jQuery('<span>', { class: 'ccew_coin_logo' }).html(row.logo), jQuery('<span>', { class: 'ccew_coin_symbol', text: '(' + row.symbol + ')' }), jQuery('<br>'), jQuery('<span>', { class: 'ccew_coin_name ccew-desktop', text: row.name }))).prop('outerHTML'); 197 } else { 198 var html = jQuery('<div>', { class: classes }).append(jQuery('<span>', { class: 'ccew_coin_logo' }).html(row.logo), jQuery('<span>', { class: 'ccew_coin_symbol', text: '(' + row.symbol + ')' }), jQuery('<br>'), jQuery('<span>', { class: 'ccew_coin_name ccew-desktop', text: data })).prop('outerHTML'); 199 } 200 return html; 201 case 'price': 202 if (typeof data !== 'undefined' && data != null) { 203 var formatedVal = ccew_numeral_formating(data); 204 return html = '<div data-val="' + row.price + '" class="' + classes + '"><span class="ccew-formatted-price">' + fiatSymbol + formatedVal + '</span></div>'; 205 } else { 206 return html = '<div class="' + classes + '>?</div>'; 207 } 208 break; 209 case 'change_percentage_24h': 210 if (typeof data !== 'undefined' && data != null) { 211 var changesCls = "up"; 212 var wrpchangesCls = "ccew-up"; 213 if (typeof Math.sign === 'undefined') { Math.sign = function(x) { return x > 0 ? 1 : x < 0 ? -1 : x; } } 214 if (Math.sign(data) == -1) { 215 var changesCls = "down"; 216 var wrpchangesCls = "ccew-down"; 217 } 218 var html = '<div class="' + classes + ' ' + wrpchangesCls + '"><span class="changes ' + changesCls + '"><i class="ccew_icon-' + changesCls + '" aria-hidden="true"></i>' + data + '%</span></div>'; 219 return html; 220 } else { 221 return html = '<div class="' + classes + '">?</span></div>'; 222 } 223 break; 224 case 'market_cap': 225 if (typeof data !== 'undefined' && data != null) { 226 var formatedVal = ccew_numeral_formating(data); 227 if (numberFormat) { 228 var formatedVal = numeral(data).format('(0.00 a)').toUpperCase(); 229 } 230 return html = '<div data-val="' + row.market_cap + '" class="' + classes + '"><span class="ccew-formatted-market-cap">' + fiatSymbol + formatedVal + '</span></div>'; 231 } else { 232 return html = '<div class="' + classes + '>?</div>'; 233 } 234 break; 235 case 'total_volume': 236 if (typeof data !== 'undefined' && data != null) { 237 var formatedVal = ccew_numeral_formating(data); 238 if (numberFormat) { 239 var formatedVal = numeral(data).format('(0.00 a)').toUpperCase(); 240 } 241 return html = '<div data-val="' + row.total_volume
241+ '" class="' + classes + '"><span class="ccew-formatted-total-volume">' + fiatSymbol + formatedVal + '</span></div>'; 242 } else { 243 return html = '<div class="' + classes + '>?</div>'; 244 } 245 break; 246 case 'supply': 247 if (typeof data !== 'undefined' && data != null && row.supply != 'N/A') { 248 var formatedVal = ccew_numeral_formating(data); 249 if (numberFormat) { 250 var formatedVal = numeral(data).format('(0.00 a)').toUpperCase(); 251 } 252 return html = '<div data-val="' + row.supply + '" class="' + classes + '"><span class="ccew-formatted-supply">' + formatedVal + ' ' + row.symbol + '</span></div>'; 253 } else { 254 return html = '<div class="' + classes + '">N/A</div>'; 255 } 256 break; 257 default: 258 return data; 259 } 260 }, 261 "createdCell": function(td, cellData, rowData, row, col) { 262 jQuery(td).attr('data-sort', cellData); 263 } 264 }); 265 }); 266 267 268 var table = $ccew_table.DataTable({ 269 "deferRender": true, 270 "serverSide": true, 271 "ajax": { 272 "url": ajaxURL, 273 "type": "POST", 274 "dataType": "JSON", 275 "data": request, 276 "error": function(xhr, error, thrown) { 277 alert('Something wrong with Server'); 278 } 279 }, 280 "destroy": true, 281 "ordering": false, 282 "searching": false, 283 "pageLength": pagination, 284 "columns": columns, 285 "responsive": true, 286 "lengthChange": false, 287 "pagingType": "simple", 288 "processing": true, 289 "dom": '<"top"iflp<"clear">>rt<"bottom"iflp<"clear">>', 290 "language": { 291 "processing": loadingLbl, 292 "loadingRecords": loadingLbl, 293 "paginate": { 294 "next": nexttext, 295 "previous": prevtext 296 }, 297 }, 298 "zeroRecords": zeroRecords, 299 "emptyTable": zeroRecords, 300 "renderer": { 301 "header": "bootstrap", 302 }, 303 "drawCallback": function(settings) { 304 $ccew_table.tableHeadFixer({ 305 // fix table header 306 head: true, 307 // fix table footer 308 foot: false, 309 left: 2, 310 right: false, 311 'z-index': 1 312 }); 313 314 }, 315 316 }); 317 } 318 jQuery(ccew_table_widget).each(function() { 319 jQuery(this).ccewDatatable(); 320 new Tablesort(this, { 321 descending: true 322 }); 323 }); 324 325 function ccew_numeral_formating(data) { 326 if (data >= 25 || data <= -1) { 327 var formatedVal = numeral(data).format('0,0.00'); 328 } else if (data >= 0.50 && data < 25) { 329 var formatedVal = numeral(data).format('0,0.000'); 330 } else if (data >= 0.01 && data < 0.50) { 331 var formatedVal = numeral(data).format('0,0.0000'); 332 } else if (data >= 0.0001 && data < 0.01) { 333 var formatedVal = numeral(data).format('0,0.00000'); 334 } else { 335 var formatedVal = numeral(data).format('0,0.00000000'); 336 } 337 return formatedVal; 338 } 339 340 } else { 341 jQuery.ajax({ 342 type: "POST", 343 dataType: "JSON", 344 url: ajaxURL, 345 data: request, 346 success: function(response) { 347 if (response.status == 'success') { 348 var data = response.data 349 jQuery('#' + id).html(data); 350 if (type.widget_type == "list" || type.widget_type == 'to
350p_gainer_loser') { 351 var container = jQuery(id_selector).find('.ccew-coin-graph'); 352 var symbol = container.data('currency') + ' '; 353 chart_call_back(container, symbol); 354 }else if(type.widget_type == 'card'){ 355 jQuery("#"+ id+" .ccew-sparkline-charts").generateSmallChart() 356 } 357 358 } else { 359 console.log("response status failed"); 360 } 361 }, 362 error: function(data) { 363 console.log(data.status + ':' + data.statusText, data.responseText); 364 } 365 }) 366 } 367 } 368 setInterval(ccew_ajax_data, 600000); 369 ccew_ajax_data(); 370 } 371} 372 373 374 375// Safe image fallback handler for coin logos - works globally 376jQuery(document).ready(function() { 377 jQuery(document).on('error', '.ccew-coin-logo', function() { 378 const fallbackSrc = jQuery(this).data('fallback-src'); 379 if (fallbackSrc && this.src !== fallbackSrc) { 380 this.src = fallbackSrc; 381 } 382 }); 383}); 384 385jQuery(window).on('elementor/frontend/init', () => { 386 387 const addHandler = ($element) => { 388 elementorFrontend.elementsHandler.addHandler(ccew_call_ajax, { 389 $element, 390 }); 391 }; 392 393 elementorFrontend.hooks.addAction('frontend/element_ready/cryptocurrency-elementor-widget.default', addHandler); 394 395});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.