1756 lines
68 KiB
JavaScript
1756 lines
68 KiB
JavaScript
//RENDERER FOR CELL
|
|
|
|
function numberWithCommas(x) {
|
|
var parts = x.toString().split(".");
|
|
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
return parts.join(".");
|
|
}
|
|
|
|
function render_cell_numshort_colored(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
|
|
val = data;
|
|
is_convert = false;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
is_convert = true;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
is_convert = true;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
is_convert = true;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = is_convert ? numberFormat(val) : numberWithCommas(val.toFixed(2));
|
|
if (val > 0)
|
|
data_new = '<span class="font-green">' + data_new + '</span>';
|
|
else if (val < 0)
|
|
data_new = '<span class="font-red">' + data_new + '</span>';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
function render_cell_numshort(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
is_convert = false;
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
is_convert = true;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
is_convert = true;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
is_convert = true;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = is_convert ? numberFormat(val) : numberWithCommas(val.toFixed(2));
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
|
|
function render_cell_numshort_colored_int(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
|
|
val = data;
|
|
is_convert = false;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
is_convert = true;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
is_convert = true;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
is_convert = true;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = is_convert ? numberFormat(val, 0) : numberWithCommas(val.toFixed(0));
|
|
if (val > 0)
|
|
data_new = '<span class="font-green">' + data_new + '</span>';
|
|
else if (val < 0)
|
|
data_new = '<span class="font-red">' + data_new + '</span>';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
function render_cell_numshort_int(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
is_convert = false;
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
is_convert = true;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
is_convert = true;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
is_convert = true;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = is_convert ? numberFormat(val, 0) : numberWithCommas(val.toFixed(0));
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
|
|
function render_cell_percent_colored(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
if (val > 0)
|
|
data_new = '<span class="font-green">' + numberFormat(val) + '%</span>';
|
|
else if (val < 0)
|
|
data_new = '<span class="font-red">' + numberFormat(val) + '%</span>';
|
|
else
|
|
data_new = numberFormat(val) + '%';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
function render_cell_percent(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = numberFormat(val) + '%';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
|
|
function render_cell_percent_colored_int(data, type, full, meta) {
|
|
data_new = data;
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
if (val > 0)
|
|
data_new = '<span class="font-green">' + numberFormat(val, 0) + '%</span>';
|
|
else if (val < 0)
|
|
data_new = '<span class="font-red">' + numberFormat(val, 0) + '%</span>';
|
|
else
|
|
data_new = numberFormat(val, 0) + '%';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
function render_cell_percent_int(data, type, full, meta) {
|
|
|
|
data_new = data;
|
|
|
|
val = data;
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
break;
|
|
case '%':
|
|
val = val.slice(0, -1);
|
|
break;
|
|
}
|
|
if (!isNaN(val)) {
|
|
val = parseFloat(val);
|
|
data_new = numberFormat(val, 0) + '%';
|
|
}
|
|
|
|
return data_new;
|
|
}
|
|
|
|
//FORMATTING FOR OUTPUT
|
|
function stringFill(x, len, fill_char, fill_dir) {
|
|
if (typeof(len) == 'undefined')len = 2;
|
|
if (typeof(fill_char) == 'undefined')fill_char = '0';
|
|
if (typeof(fill_dir) == 'undefined')fill_dir = -1;
|
|
x = x.toString();
|
|
if (x.length >= len)return x;
|
|
return (
|
|
(fill_dir == 1 ? x : '') +
|
|
((new Array(x.length + (len - x.length))).join(fill_char)).toString() +
|
|
(fill_dir == -1 ? x : ''));
|
|
}
|
|
|
|
function timeFormat(time) {
|
|
if (isNaN(time))return time;
|
|
h = Math.floor(time / 60);
|
|
m = time % 60;
|
|
t = 'am';
|
|
if (h > 12) {
|
|
t = 'pm';
|
|
h -= 12;
|
|
}
|
|
return h.toFixed().toString() + ':' + stringFill(m.toFixed()) + t;
|
|
}
|
|
|
|
function dateFormat(cur) {
|
|
return (new Date(cur * 1000)).toString('MM/dd/yyyy');
|
|
}
|
|
|
|
function getUnique(array) {
|
|
var u = {}, a = [];
|
|
for (var i = 0, l = array.length; i < l; ++i) {
|
|
if (u.hasOwnProperty(array[i])) {
|
|
continue;
|
|
}
|
|
a.push(array[i]);
|
|
u[array[i]] = 1;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
function numberFormat(num, dec) {
|
|
if (typeof(dec) == 'undefined')dec = 2;
|
|
if (num >= 1000000000 || num <= -1000000000)return numberWithCommas((num / 1000000000).toFixed(dec)) + 'B';
|
|
if (num >= 1000000 || num <= -1000000)return numberWithCommas((num / 1000000).toFixed(dec)) + 'M';
|
|
if (num >= 1000 || num <= -1000)return numberWithCommas((num / 1000).toFixed(dec)) + 'K';
|
|
return parseFloat(num).toFixed(dec);
|
|
}
|
|
|
|
function percentFormat(x) {
|
|
x = parseFloat(x).toFixed(2);
|
|
return ((x > 0 ? '+' : '') + x + '%');
|
|
}
|
|
|
|
|
|
//SYS VARS
|
|
var table;
|
|
var tbl_api;
|
|
var server_uri = 'shares.php';
|
|
|
|
var selectable_list = {};
|
|
var selectable_cur_idx = 0;
|
|
var cur_tab = 0;
|
|
var cur_market = 0;
|
|
|
|
var tmr_update = 0;
|
|
|
|
selectable_list['theme_title'] = '<i class="fa fa-paint-brush"></i> <span class="padding-left">Theme</span>';
|
|
selectable_list['market_title'] = '<i class="fa fa-line-chart"></i> <span class="padding-left">Market</span>';
|
|
selectable_list['theme'] = [
|
|
{id: 0, label: '<i class="fa fa-paint-brush"></i>', title: "Light"},
|
|
{id: 1, label: '<i class="fa fa-paint-brush"></i>', title: "Dark"},
|
|
];
|
|
|
|
selectable_list['time-update_title'] = '<i class="fa fa-refresh"></i> <span class="padding-left">Update method</span>';
|
|
selectable_list['time-update'] = [
|
|
{id: 0, label: '<i class="fa fa-angle-down"></i>', title: "Manual refresh"},
|
|
{id: 1, label: '1m', title: "Refresh every minute"},
|
|
{id: 2, label: '5m', title: "Refresh every 5 minutes"},
|
|
{id: 3, label: '10m', title: "Refresh every 10 minutes"},
|
|
];
|
|
|
|
|
|
selectable_list['tab'] = [
|
|
{id: 0, label: 'Company Details', title: 'Company Details'},
|
|
{id: 1, label: 'Trading Data', title: 'Trading Data'},
|
|
{id: 2, label: 'Historical Performance', title: 'Historical Performance'},
|
|
{id: 3, label: 'Fundamental Analysis', title: 'Fundamental Analysis'},
|
|
{id: 4, label: 'Technical Analysis', title: 'Technical Analysis'}
|
|
];
|
|
|
|
|
|
//DATA KEYS AND SETTINGS
|
|
var data_keys = {
|
|
s: 'Symbol',
|
|
n: 'Name',
|
|
regularMarketPrice: 'Last Price',
|
|
currency: 'Currency',
|
|
regularMarketChange: 'Change',
|
|
regularMarketChangePercent: '% Change',
|
|
regularMarketVolume: 'Volume',
|
|
sharesOutstanding: 'Shares',
|
|
marketCap: 'Market Cap',//--
|
|
bid: 'Bid',
|
|
ask: 'Ask',
|
|
bidSize: 'Bid Size',
|
|
askSize: 'Ask Size',
|
|
regularMarketOpen: 'Open',
|
|
regularMarketDayLow: 'Day Low',
|
|
regularMarketDayHigh: 'Day High',
|
|
regularMarketPreviousClose: 'Prev Close',//--
|
|
fiftyTwoWeekLow: '52 Week Low',
|
|
fiftyTwoWeekHigh: '52 Week High',
|
|
fiftyTwoWeekLowChange: 'Change 52 Week Low',
|
|
fiftyTwoWeekHighChange: 'Change 52 Week High',
|
|
fiftyTwoWeekLowChangePercent: '% Change 52 Week Low',
|
|
fiftyTwoWeekHighChangePercent: '% Change 52 Week High',
|
|
averageDailyVolume3Month: 'Avg Daily Vol 3M',//--
|
|
//beta: 'Beta',
|
|
epsTrailingTwelveMonths: 'EPS',
|
|
ebitda: 'EBITDA',
|
|
trailingPE: 'PE Ratio',
|
|
pegRatio: 'PEG Ratio',
|
|
bookValue: 'Book Value',
|
|
priceToBook: 'Price / Book',
|
|
totalCash: 'Cash',
|
|
shortRatio: 'Short Ratio',
|
|
dividendRate: 'Div Per Share',
|
|
dividendYield: 'Div Yield',
|
|
exDividendDate: 'Ex-Dividend Date',//--
|
|
fiftyDayAverage: '50 Day MA',
|
|
twoHundredDayAverage: '200 Day MA',
|
|
fiftyDayAverageChange: 'Change 50 Day MA',
|
|
fiftyDayAverageChangePercent: '% Change 50 Day MA',
|
|
twoHundredDayAverageChange: 'Change 200 Day MA',
|
|
twoHundredDayAverageChangePercent: '% Change 200 Day MA'
|
|
};
|
|
|
|
var data_key_string_simple = ['n'];
|
|
var data_key_string = ['s', 'currency'];
|
|
var data_key_date = ['exDividendDate'];
|
|
var data_key_time = [];
|
|
var data_key_percent = ['regularMarketChangePercent','fiftyTwoWeekLowChangePercent','fiftyTwoWeekHighChangePercent','fiftyDayAverageChangePercent','twoHundredDayAverageChangePercent'];
|
|
|
|
var data_key_names = ['s','n','regularMarketPrice','currency','regularMarketChange','regularMarketChangePercent','regularMarketVolume','sharesOutstanding','marketCap','bid','ask','bidSize','askSize','regularMarketOpen','regularMarketDayLow','regularMarketDayHigh','regularMarketPreviousClose','fiftyTwoWeekLow','fiftyTwoWeekHigh','fiftyTwoWeekLowChange','fiftyTwoWeekHighChange','fiftyTwoWeekLowChangePercent','fiftyTwoWeekHighChangePercent','averageDailyVolume3Month','epsTrailingTwelveMonths','ebitda','trailingPE','pegRatio','bookValue','priceToBook','totalCash','shortRatio','dividendRate','dividendYield','exDividendDate','fiftyDayAverage','twoHundredDayAverage','fiftyDayAverageChange','fiftyDayAverageChangePercent','twoHundredDayAverageChange','twoHundredDayAverageChangePercent'];
|
|
var data_key_filter = ['s','n','regularMarketPrice','currency','regularMarketChange','regularMarketChangePercent','regularMarketVolume','sharesOutstanding','marketCap','bid','ask','bidSize','askSize','regularMarketOpen','regularMarketDayLow','regularMarketDayHigh','regularMarketPreviousClose','fiftyTwoWeekLow','fiftyTwoWeekHigh','fiftyTwoWeekLowChange','fiftyTwoWeekHighChange','fiftyTwoWeekLowChangePercent','fiftyTwoWeekHighChangePercent','averageDailyVolume3Month','epsTrailingTwelveMonths','ebitda','trailingPE','pegRatio','bookValue','priceToBook','totalCash','shortRatio','dividendRate','dividendYield','exDividendDate','fiftyDayAverage','twoHundredDayAverage','fiftyDayAverageChange','fiftyDayAverageChangePercent','twoHundredDayAverageChange','twoHundredDayAverageChangePercent'];
|
|
|
|
var sorting_data = {};
|
|
var filter_data = {}; // filter_data[market][tab][column]
|
|
|
|
var tab_keys = {
|
|
0: ['s', 'n', 'regularMarketPrice','currency','regularMarketChange','regularMarketChangePercent','regularMarketVolume','sharesOutstanding','marketCap'],
|
|
1: ['s', 'n','bid','ask','bidSize','askSize','regularMarketOpen','regularMarketDayLow','regularMarketDayHigh','regularMarketPreviousClose'],
|
|
2: ['s', 'n','fiftyTwoWeekLow','fiftyTwoWeekHigh','fiftyTwoWeekLowChange','fiftyTwoWeekHighChange','fiftyTwoWeekLowChangePercent','fiftyTwoWeekHighChangePercent','averageDailyVolume3Month'],
|
|
3: ['s', 'n','epsTrailingTwelveMonths','ebitda','trailingPE','pegRatio','bookValue','priceToBook','totalCash','shortRatio','dividendRate','dividendYield','exDividendDate'],
|
|
4: ['s', 'n', 'fiftyDayAverage','twoHundredDayAverage','fiftyDayAverageChange','fiftyDayAverageChangePercent','twoHundredDayAverageChange','twoHundredDayAverageChangePercent']
|
|
};
|
|
//INIT GET MARKETS AND START
|
|
$(document).ready(function () {
|
|
$('.refresh-data').attr('title', 'Last refreshed at ' + (new Date).toString('dd MMM yyyy, hh:mm tt'));
|
|
$.post(server_uri, {cmd: 'get-markets'}, function (data) {
|
|
if (data.success) {
|
|
selectable_list['market'] = [];
|
|
for (i in data.markets)
|
|
selectable_list['market'].push({
|
|
id: i,
|
|
label: '<i class="fa fa-line-chart"></i> <span class="padding-left">' + data.markets[i] + '</span>',
|
|
title: data.markets[i]
|
|
});
|
|
|
|
cur_market = selectable_list['market'][0].id;
|
|
|
|
$('button[data-list="market"]').data('value', cur_market).html(selectable_list['market'][0].label);
|
|
|
|
show_table()
|
|
} else {
|
|
modal_show('Initialize', 'Error getting markets');
|
|
}
|
|
|
|
});
|
|
});
|
|
|
|
|
|
//INIT TABLE AND SET FILTERS AND SORTS FUNCTIONS
|
|
function show_table() {
|
|
table = '<table class="display"><thead><tr>';
|
|
for (i in data_keys) {
|
|
table += '<th class="column-' + i + (data_key_filter.indexOf(i) >= 0 ? ' filterable' : '') + '">' +
|
|
'<span class="head-label">' +
|
|
data_keys[i] +
|
|
'</span>' +
|
|
'<span class="filter-desc"></span>' +
|
|
(data_key_filter.indexOf(i) >= 0 ? '<div data-field="' + i + '" class="filter-btn" tab-index="0"><i class="fa fa-filter"></i></div>' : '') +
|
|
'</th>';
|
|
}
|
|
|
|
table += '</tr></thead><tbody></tbody></table>';
|
|
table = $(table);
|
|
$('main.content').append(table);
|
|
table.on('processing.dt', function (e, settings, processing) {
|
|
if (processing)
|
|
$('.linear-activity').removeClass('hide');
|
|
else
|
|
$('.linear-activity').addClass('hide');
|
|
});
|
|
|
|
|
|
$.extend(
|
|
//$.fn.dataTable.ext.order
|
|
//$.fn.dataTable.ext.type.order
|
|
$.fn.dataTable.ext.oSort,
|
|
{
|
|
"range-asc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "");
|
|
x = x.replace(/\s*/g, "");
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "");
|
|
y = y.replace(/\s*/g, "");
|
|
|
|
r = /\d*(\.\d*){0,1}\-\d*(\.\d*){0,1}$/
|
|
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
x1 = parseFloat(x.split('-')[0]) * 1000000000000;
|
|
x2 = parseFloat(x.split('-')[1]) * 1000000000000;
|
|
y1 = parseFloat(y.split('-')[0]) * 1000000000000;
|
|
y2 = parseFloat(y.split('-')[1]) * 1000000000000;
|
|
|
|
x = parseFloat(x1.toFixed(0).toString() + '.' + x2.toFixed(0).toString());
|
|
y = parseFloat(y1.toFixed(0).toString() + '.' + y2.toFixed(0).toString());
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"range-desc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "");
|
|
x = x.replace(/\s*/g, "");
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "");
|
|
y = y.replace(/\s*/g, "");
|
|
|
|
r = /\d*(\.\d*){0,1}\-\d*(\.\d*){0,1}$/
|
|
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
x1 = parseFloat(x.split('-')[0]) * 1000000000000;
|
|
x2 = parseFloat(x.split('-')[1]) * 1000000000000;
|
|
y1 = parseFloat(y.split('-')[0]) * 1000000000000;
|
|
y2 = parseFloat(y.split('-')[1]) * 1000000000000;
|
|
|
|
x = parseFloat(x1.toFixed(0).toString() + '.' + x2.toFixed(0).toString());
|
|
y = parseFloat(y1.toFixed(0).toString() + '.' + y2.toFixed(0).toString());
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
"percent-asc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "");
|
|
x = x.replace(/\s*/g, "").replace(/,/g, '');
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "");
|
|
y = y.replace(/\s*/g, "").replace(/,/g, '');
|
|
r = /^(\+|\-){0,1}\d*((\.|\,)\d*){0,1}\%$/
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
x = parseFloat(x.slice(0, -1));
|
|
y = parseFloat(y.slice(0, -1));
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"percent-desc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "");
|
|
x = x.replace(/\s*/g, "").replace(/,/g, '');
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "");
|
|
y = y.replace(/\s*/g, "").replace(/,/g, '');
|
|
r = /^(\+|\-){0,1}\d*((\.|\,)\d*){0,1}\%$/
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
|
|
x = parseFloat(x.slice(0, -1));
|
|
y = parseFloat(y.slice(0, -1));
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
"time-asc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "").toString().replace(" ", "");
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "").toString().replace(" ", "");
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
h = 0;
|
|
m = 0;
|
|
if (x.slice(-2) == "pm") {
|
|
h = 12;
|
|
x = x.slice(0, -2);
|
|
}
|
|
else if (x.slice(-2) == "am") {
|
|
x = x.slice(0, -2);
|
|
}
|
|
h += parseInt(x.split(":")[0]);
|
|
m += parseInt(x.split(":")[1]);
|
|
x = h * 60 + m;
|
|
|
|
h = 0;
|
|
m = 0;
|
|
if (y.slice(-2) == "pm") {
|
|
h = 12;
|
|
y = y.slice(0, -2);
|
|
}
|
|
else if (y.slice(-2) == "am") {
|
|
y = y.slice(0, -2);
|
|
}
|
|
h += parseInt(y.split(":")[0]);
|
|
m += parseInt(y.split(":")[1]);
|
|
y = h * 60 + m;
|
|
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"time-desc": function (x, y) {
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "").toString().replace(" ", "");
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "").toString().replace(" ", "");
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
|
|
h = 0;
|
|
m = 0;
|
|
if (x.slice(-2) == "pm") {
|
|
h = 12;
|
|
x = x.slice(0, -2);
|
|
}
|
|
else if (x.slice(-2) == "am") {
|
|
x = x.slice(0, -2);
|
|
}
|
|
h += parseInt(x.split(":")[0]);
|
|
m += parseInt(x.split(":")[1]);
|
|
x = h * 60 + m;
|
|
|
|
h = 0;
|
|
m = 0;
|
|
if (y.slice(-2) == "pm") {
|
|
h = 12;
|
|
y = y.slice(0, -2);
|
|
}
|
|
else if (y.slice(-2) == "am") {
|
|
y = y.slice(0, -2);
|
|
}
|
|
h += parseInt(y.split(":")[0]);
|
|
m += parseInt(y.split(":")[1]);
|
|
y = h * 60 + m;
|
|
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
|
|
"numshort-asc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
if (x == y)return 0;
|
|
if (y == 'N/A')return -1;
|
|
if (x == 'N/A')return 1;
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "").replace(/,/g, '');
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "").replace(/,/g, '');
|
|
switch (x[x.length - 1]) {
|
|
case 'K':
|
|
x = x.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
x = x.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
x = x.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
switch (y[y.length - 1]) {
|
|
case 'K':
|
|
y = y.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
y = y.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
y = y.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
x = parseFloat(x);
|
|
y = parseFloat(y);
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"numshort-desc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
if (x == y)return 0;
|
|
if (y == 'N/A')return -1;
|
|
if (x == 'N/A')return 1;
|
|
x = x.replace(/<\/?[^>]+(>|$)/g, "").replace(/,/g, '');
|
|
y = y.replace(/<\/?[^>]+(>|$)/g, "").replace(/,/g, '');
|
|
switch (x[x.length - 1]) {
|
|
case 'K':
|
|
x = x.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
x = x.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
x = x.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
switch (y[y.length - 1]) {
|
|
case 'K':
|
|
y = y.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
y = y.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
y = y.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
x = parseFloat(x);
|
|
y = parseFloat(y);
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
"stringc-asc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
if (x == y)return 0;
|
|
if (y == 'N/A')return -1;
|
|
if (x == 'N/A')return 1;
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"stringc-desc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
if (x == y)return 0;
|
|
if (y == 'N/A')return -1;
|
|
if (x == 'N/A')return 1;
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
"datec-asc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
|
|
r = /^\d{1,2}\/\d{1,2}\/\d\d\d\d$/;
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
x = parseInt(x.split('/')[2] + stringFill(x.split('/')[0]) + stringFill(x.split('/')[1]));
|
|
y = parseInt(y.split('/')[2] + stringFill(y.split('/')[0]) + stringFill(y.split('/')[1]));
|
|
|
|
/*
|
|
if(x==y)return 0;
|
|
if(y=='N/A')return -1;
|
|
if(x=='N/A')return 1;
|
|
x=Date.parse( x ) || 0;
|
|
y=Date.parse( y ) || 0;
|
|
*/
|
|
|
|
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
},
|
|
"datec-desc": function (x, y) {
|
|
if (x == '-' || x == '—')x = 'N/A';
|
|
if (y == '-' || y == '—')y = 'N/A';
|
|
|
|
r = /^\d{1,2}\/\d{1,2}\/\d\d\d\d$/;
|
|
|
|
if (x == y)return 0;
|
|
if (!r.test(x))return 1;
|
|
if (!r.test(y))return -1;
|
|
x = parseInt(x.split('/')[2] + stringFill(x.split('/')[0]) + stringFill(x.split('/')[1]));
|
|
y = parseInt(y.split('/')[2] + stringFill(y.split('/')[0]) + stringFill(y.split('/')[1]));
|
|
|
|
/*
|
|
if(x==y)return 0;
|
|
if(y=='N/A')return -1;
|
|
if(x=='N/A')return 1;
|
|
x=Date.parse( x ) || 0;
|
|
y=Date.parse( y ) || 0;
|
|
*/
|
|
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
|
|
},
|
|
|
|
}
|
|
);
|
|
|
|
$.fn.dataTable.ext.search.push(function (settings, data, dataIndex) {
|
|
if (filter_data[cur_market] != undefined && filter_data[cur_market][cur_tab] != undefined) {
|
|
filters = filter_data[cur_market][cur_tab];
|
|
for (column in filters) {
|
|
if (filters[column] == undefined)continue;
|
|
min = filters[column].min;
|
|
max = filters[column].max;
|
|
fval = filters[column].val;
|
|
val = data[data_key_names.indexOf(column)];
|
|
if (val == undefined || (typeof(fval) == 'object' && fval.length == 0))
|
|
continue;
|
|
val = val.replace(/<\/?[^>]+(>|$)/g, "");
|
|
|
|
|
|
if (val == 'N/A' || val == '-' || val == '—')return false;
|
|
|
|
if (data_key_percent.indexOf(column) >= 0) {
|
|
val = val.toString().replace(" ", "").replace(/,/g, '');
|
|
val = val.toString().replace("%", "");
|
|
if (isNaN(val))return false;
|
|
val = parseFloat(parseFloat(val).toFixed(2));
|
|
}
|
|
else if (data_key_time.indexOf(column) >= 0) {
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
val = val.toString().replace(" ", "");
|
|
if (!r.test(val))return false;
|
|
h = 0;
|
|
m = 0;
|
|
if (val.slice(-2) == "pm") {
|
|
h = 12;
|
|
val = val.slice(0, -2);
|
|
}
|
|
else if (t.slice(-2) == "am") {
|
|
val = val.slice(0, -2);
|
|
}
|
|
h += parseInt(val.split(":")[0]);
|
|
m += parseInt(val.split(":")[1]);
|
|
val = h * 60 + m;
|
|
}
|
|
else if (data_key_date.indexOf(column) >= 0) {
|
|
val = (new Date(val)).getTime() / 1000;
|
|
}
|
|
else if (data_key_string_simple.indexOf(column) >= 0) {
|
|
if (fval.toString().length == 0)return false;
|
|
}
|
|
else if (data_key_string.indexOf(column) >= 0) {
|
|
//if(fval.indexOf(val)==-1)return false;
|
|
}
|
|
else {
|
|
val = val.replace(/,/g, '');
|
|
switch (val[val.length - 1]) {
|
|
case 'K':
|
|
val = val.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
val = val.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
val = val.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
val = parseFloat(parseFloat(val).toFixed(2));
|
|
}
|
|
|
|
if (
|
|
(data_key_string_simple.indexOf(column) >= 0 && val.toString().toLowerCase().indexOf(fval.toString().toLowerCase()) < 0) ||
|
|
(data_key_string.indexOf(column) >= 0 && fval.indexOf(val) == -1) ||
|
|
(
|
|
data_key_string.indexOf(column) < 0 && data_key_string_simple.indexOf(column) < 0 && !(
|
|
( isNaN(min) && isNaN(max) ) ||
|
|
( isNaN(min) && val <= max ) ||
|
|
( min <= val && isNaN(max) ) ||
|
|
( min <= val && val <= max )
|
|
)
|
|
)
|
|
) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
});
|
|
|
|
tbl_api = table.DataTable({
|
|
ajax: {
|
|
url: server_uri + '?cmd=get-data&market=' + cur_market,
|
|
dataSrc: 'data'
|
|
},
|
|
//orderRestore:true,
|
|
//orderSequence: [ "asc", "desc", null ],
|
|
bProcessing: false,
|
|
searching: true,
|
|
autoWidth: false,
|
|
dom: '<"top">r<"table-inner"t<"table-wait">><"bottom"flip><"clear">',
|
|
|
|
|
|
responsive: {
|
|
details: {
|
|
type: 'column',
|
|
target: 'tr'
|
|
}
|
|
},
|
|
|
|
|
|
language: {
|
|
loadingRecords: '<i class="fa fa-circle-o-notch fa-spin loading-big"></i>',
|
|
paginate: {
|
|
previous: '<i class="fa fa-angle-left"></i>',
|
|
next: '<i class="fa fa-angle-right"></i>'
|
|
}
|
|
},
|
|
lengthMenu: [25, 50, 100, 500],
|
|
|
|
columns: [
|
|
|
|
{name: 's' ,data: 's', type: 'stringc'},
|
|
{name: 'n' ,data: 'n', type: 'stringc'},
|
|
{name: 'regularMarketPrice' ,data: 'regularMarketPrice', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'currency' ,data: 'currency', type: 'stringc'},
|
|
{name: 'regularMarketChange' ,data: 'regularMarketChange', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'regularMarketChangePercent' ,data: 'regularMarketChangePercent', type: 'percent', className: 'number', render: render_cell_percent_colored },
|
|
{name: 'regularMarketVolume' ,data: 'regularMarketVolume', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'sharesOutstanding' ,data: 'sharesOutstanding', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'marketCap' ,data: 'marketCap', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
|
|
{name: 'bid' ,data: 'bid', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
{name: 'ask' ,data: 'ask', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
{name: 'bidSize' ,data: 'bidSize', type: 'numshort', className: 'number', render: render_cell_numshort_int},
|
|
{name: 'askSize' ,data: 'askSize', type: 'numshort', className: 'number', render: render_cell_numshort_int},
|
|
{name: 'regularMarketOpen' ,data: 'regularMarketOpen', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
{name: 'regularMarketDayLow' ,data: 'regularMarketDayLow', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
{name: 'regularMarketDayHigh' ,data: 'regularMarketDayHigh', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
{name: 'regularMarketPreviousClose' ,data: 'regularMarketPreviousClose', type: 'numshort', className: 'number', render: render_cell_numshort},
|
|
|
|
{name: 'fiftyTwoWeekLow' ,data: 'fiftyTwoWeekLow', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'fiftyTwoWeekHigh' ,data: 'fiftyTwoWeekHigh', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'fiftyTwoWeekLowChange' ,data: 'fiftyTwoWeekLowChange', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'fiftyTwoWeekHighChange' ,data: 'fiftyTwoWeekHighChange', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'fiftyTwoWeekLowChangePercent' ,data: 'fiftyTwoWeekLowChangePercent', type: 'percent', className: 'number', render: render_cell_percent_colored },
|
|
{name: 'fiftyTwoWeekHighChangePercent' ,data: 'fiftyTwoWeekHighChangePercent', type: 'percent', className: 'number', render: render_cell_percent_colored },
|
|
{name: 'averageDailyVolume3Month' ,data: 'averageDailyVolume3Month', type: 'numshort', className: 'number', render: render_cell_numshort_int },
|
|
|
|
//{name: 'beta' ,data: 'beta', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'epsTrailingTwelveMonths' ,data: 'epsTrailingTwelveMonths', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'ebitda' ,data: 'ebitda', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'trailingPE' ,data: 'trailingPE', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'pegRatio' ,data: 'pegRatio', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'bookValue' ,data: 'bookValue', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'priceToBook' ,data: 'priceToBook', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'totalCash' ,data: 'totalCash', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'shortRatio' ,data: 'shortRatio', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'dividendRate' ,data: 'dividendRate', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'dividendYield' ,data: 'dividendYield', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'exDividendDate' ,data: 'exDividendDate', type: 'datec' },
|
|
|
|
{name: 'fiftyDayAverage' ,data: 'fiftyDayAverage', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'twoHundredDayAverage' ,data: 'twoHundredDayAverage', type: 'numshort', className: 'number', render: render_cell_numshort },
|
|
{name: 'fiftyDayAverageChange' ,data: 'fiftyDayAverageChange', type: 'numshort', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'fiftyDayAverageChangePercent' ,data: 'fiftyDayAverageChangePercent', type: 'numshort', className: 'number', render: render_cell_percent_colored },
|
|
{name: 'twoHundredDayAverageChange' ,data: 'twoHundredDayAverageChange', type: 'percent', className: 'number', render: render_cell_numshort_colored },
|
|
{name: 'twoHundredDayAverageChangePercent' ,data: 'twoHundredDayAverageChangePercent',type: 'percent', className: 'number', render: render_cell_percent_colored },
|
|
]
|
|
});
|
|
|
|
|
|
updateSelectable();
|
|
switchTab();
|
|
|
|
}
|
|
|
|
|
|
//SWITCHING TAB REACTION
|
|
function switchTab() {
|
|
tbl_api.columns().visible(false);
|
|
cols = [];
|
|
for (i in tab_keys[cur_tab])
|
|
cols.push('.column-' + tab_keys[cur_tab][i]);
|
|
tbl_api.columns(cols).visible(true);
|
|
$('div.dataTables_wrapper').removeClass('inactive');
|
|
$('.linear-activity').addClass('hide');
|
|
if (filter_data[cur_market] != undefined && filter_data[cur_market][cur_tab] != undefined && filter_data[cur_market][cur_tab]['s'] != undefined && filter_data[cur_market][cur_tab]['s']['text'] != undefined) {
|
|
//filter_data[market][tab][column]
|
|
$('.column-s').addClass('filter-set');
|
|
$('.column-s .filter-desc').html(filter_data[cur_market][cur_tab]['s']['text']);
|
|
}
|
|
else {
|
|
$('.column-s').removeClass('filter-set');
|
|
$('.column-s .filter-desc').html('');
|
|
}
|
|
if (filter_data[cur_market] != undefined && filter_data[cur_market][cur_tab] != undefined && filter_data[cur_market][cur_tab]['n'] != undefined && filter_data[cur_market][cur_tab]['n']['text'] != undefined) {
|
|
//filter_data[market][tab][column]
|
|
$('.column-n').addClass('filter-set');
|
|
$('.column-n .filter-desc').html(filter_data[cur_market][cur_tab]['n']['text']);
|
|
}
|
|
else {
|
|
$('.column-n').removeClass('filter-set');
|
|
$('.column-n .filter-desc').html('');
|
|
}
|
|
}
|
|
$(document).on('click', '.data-view button', function () {
|
|
$('.data-view button.active').removeClass('active');
|
|
$(this).addClass('active');
|
|
|
|
if (sorting_data[cur_market] == undefined)sorting_data[cur_market] = {};
|
|
sorting_data[cur_market][cur_tab] = tbl_api.order();
|
|
|
|
cur_tab = $(this).data('tab');
|
|
$('div.dataTables_wrapper').addClass('inactive');
|
|
|
|
$('.linear-activity').removeClass('hide');
|
|
|
|
|
|
setTimeout(function () {
|
|
switchTab();
|
|
if (sorting_data[cur_market] != undefined && sorting_data[cur_market][cur_tab] != undefined)
|
|
tbl_api.order(sorting_data[cur_market][cur_tab]);
|
|
tbl_api.draw();
|
|
}, 300);
|
|
|
|
});
|
|
|
|
//REACTION ON CHANGE MODERN SELECT BOX
|
|
function applySelectable(param, value) {
|
|
switch (param) {
|
|
case 'time-update':
|
|
clearInterval(tmr_update);
|
|
switch (value) {
|
|
case 1:
|
|
tmr_update = setInterval(function () {
|
|
tbl_api.ajax.reload(null, false);
|
|
$('.refresh-data').attr('title', 'Last refreshed at ' + (new Date).toString('dd MMM yyyy, hh:mm tt'));
|
|
}, 60000);
|
|
break;
|
|
case 2:
|
|
tmr_update = setInterval(function () {
|
|
tbl_api.ajax.reload(null, false);
|
|
$('.refresh-data').attr('title', 'Last refreshed at ' + (new Date).toString('dd MMM yyyy, hh:mm tt'));
|
|
}, 5 * 60000);
|
|
break;
|
|
case 3:
|
|
tmr_update = setInterval(function () {
|
|
tbl_api.ajax.reload(null, false);
|
|
$('.refresh-data').attr('title', 'Last refreshed at ' + (new Date).toString('dd MMM yyyy, hh:mm tt'));
|
|
}, 10 * 60000);
|
|
break;
|
|
}
|
|
break;
|
|
case 'stock':
|
|
cur_market = value;
|
|
tbl_api.columns().iterator('column', function (settings, column) {
|
|
$(tbl_api.column(column).header()).removeClass('filter-set').find('.filter-desc').html('');
|
|
});
|
|
filter_data = {};
|
|
tbl_api.ajax.url(server_uri + "?cmd=get-data&market=" + value);
|
|
tbl_api.ajax.reload(null, true);
|
|
|
|
break;
|
|
case 'tab':
|
|
$('.linear-activity').removeClass('hide');
|
|
$('.data-view button.active').removeClass('active');
|
|
$('button[data-tab="' + value + '"]').addClass('active');
|
|
if (sorting_data[cur_market] == undefined)sorting_data[cur_market] = {};
|
|
sorting_data[cur_market][cur_tab] = tbl_api.order();
|
|
cur_tab = value;
|
|
setTimeout(function () {
|
|
switchTab();
|
|
if (sorting_data[cur_market] != undefined && sorting_data[cur_market][cur_tab] != undefined)
|
|
tbl_api.order(sorting_data[cur_market][cur_tab]);
|
|
tbl_api.draw();
|
|
|
|
}, 500);
|
|
|
|
break;
|
|
case 'theme':
|
|
switch (value) {
|
|
case 0:
|
|
$('body').removeClass('dark-theme');
|
|
break;
|
|
case 1:
|
|
$('body').addClass('dark-theme');
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//FILTER BUTTON REACTION
|
|
$(document).on('click', 'table thead th .filter-btn,table tbody tr .filter-btn', function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
e.stopImmediatePropagation();
|
|
self = $(this);
|
|
(function (self, e) {
|
|
var filter_input;
|
|
var fl_tm;
|
|
var val = self.data('value');
|
|
var field = self.data('field');
|
|
|
|
var is_date = data_key_date.indexOf(field) >= 0;
|
|
var is_time = data_key_time.indexOf(field) >= 0;
|
|
var is_percent = data_key_percent.indexOf(field) >= 0;
|
|
var is_string = data_key_string.indexOf(field) >= 0;
|
|
var is_string_simple = data_key_string_simple.indexOf(field) >= 0;
|
|
|
|
var formatFunction = numberFormat;
|
|
if (is_percent)
|
|
formatFunction = percentFormat;
|
|
else if (is_time)
|
|
formatFunction = timeFormat;
|
|
else if (is_date)
|
|
formatFunction = dateFormat;
|
|
else if (is_string || is_string_simple)
|
|
formatFunction = undefined;
|
|
/*
|
|
date:
|
|
time:
|
|
range:
|
|
*/
|
|
var has_centered = $(self.parent()).is('span') || ($(window).width() < 450);
|
|
|
|
ar = getUnique(tbl_api.column('.column-' + self.data('field')).data().toArray());
|
|
|
|
var min = 100000000000000;
|
|
var max = 0;
|
|
|
|
for (i in ar) {
|
|
if (ar[i] == 'N/A' || ar[i] == '-' || ar[i] == '—' || is_string)continue;
|
|
if (is_percent) {
|
|
ar[i] = parseFloat(ar[i].toString().replace("%", ""));
|
|
}
|
|
else if (is_time) {
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
t = ar[i].toString().replace(" ", "");
|
|
if (!r.test(t))continue;
|
|
h = 0;
|
|
m = 0;
|
|
if (t.slice(-2) == "pm") {
|
|
h = 12;
|
|
t = t.slice(0, -2);
|
|
}
|
|
else if (t.slice(-2) == "am") {
|
|
t = t.slice(0, -2);
|
|
}
|
|
h += parseInt(t.split(":")[0]);
|
|
m += parseInt(t.split(":")[1]);
|
|
t = h * 60 + m;
|
|
ar[i] = t;
|
|
}
|
|
else if (is_date) {
|
|
ar[i] = (new Date(ar[i])).getTime() / 1000;
|
|
}
|
|
else {
|
|
switch (ar[i][ar[i].length - 1]) {
|
|
case 'K':
|
|
ar[i] = ar[i].slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
ar[i] = ar[i].slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
ar[i] = ar[i].slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
}
|
|
if (min > parseFloat(ar[i]))min = parseFloat(ar[i]);
|
|
if (max < parseFloat(ar[i]))max = parseFloat(ar[i]);
|
|
}
|
|
|
|
filter_input = $(document.createElement('div'));
|
|
filter_input_title = $(document.createElement('div')).addClass('filter-title').html(data_keys[field]);
|
|
filter_input.addClass('popup-filter-input');
|
|
filter_input.attr('tabindex', '1');
|
|
filter_input.append(filter_input_title);
|
|
|
|
reset_btn = $(document.createElement('div'));
|
|
reset_btn.addClass('reset-btn').html('<i class="fa fa-times"></i>');
|
|
filter_input.append(reset_btn);
|
|
|
|
if (min > max && !is_string && !is_string_simple) {
|
|
no_data = $('<div class="no-data">No data</div>');
|
|
filter_input.append(no_data);
|
|
} else if (is_string) {
|
|
select = $('<select class="ui dropdown" multiple="" data-placeholder="Select filter(ctrl+click - multiple)..."></select>');
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
if (filter_data[cur_market][cur_tab][field] == undefined)filter_data[cur_market][cur_tab][field] = {};
|
|
if (filter_data[cur_market][cur_tab][field]['val'] == undefined)
|
|
filter_data[cur_market][cur_tab][field]['val'] = [];
|
|
for (i in ar)
|
|
if (ar[i] != '—')
|
|
select.append('<option value="' + ar[i] + '"' + (filter_data[cur_market][cur_tab][field]['val'].indexOf(ar[i]) >= 0 ? ' selected' : '') + '>' + ar[i] + '</option>');
|
|
filter_input.append(select);
|
|
select.chosen();
|
|
select.change(function () {
|
|
clearTimeout(fl_tm);
|
|
fl_tm = setTimeout(function () {
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
if (filter_data[cur_market][cur_tab][field] == undefined)filter_data[cur_market][cur_tab][field] = {};
|
|
|
|
if (select.val().length > 0) {
|
|
filter_data[cur_market][cur_tab][field]['val'] = select.val();
|
|
filter_data[cur_market][cur_tab][field]['text'] = select.val().join(', ');
|
|
$('.column-' + field).addClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html(select.val().join(', '));
|
|
}
|
|
else {
|
|
filter_data[cur_market][cur_tab][field] = undefined;
|
|
$('.column-' + field).removeClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html('');
|
|
}
|
|
tbl_api.draw();
|
|
}, 300);
|
|
});
|
|
}
|
|
else if (is_string_simple) {
|
|
vv = '';
|
|
if (filter_data[cur_market] != undefined && filter_data[cur_market][cur_tab] != undefined && filter_data[cur_market][cur_tab][field] != undefined && filter_data[cur_market][cur_tab][field]['val'] != undefined)
|
|
vv = filter_data[cur_market][cur_tab][field]['val'];
|
|
input = $('<input class="ui input filter-string-simple" value="' + vv + '"/>');
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
if (filter_data[cur_market][cur_tab][field] == undefined)filter_data[cur_market][cur_tab][field] = {};
|
|
if (filter_data[cur_market][cur_tab][field]['val'] == undefined)
|
|
filter_data[cur_market][cur_tab][field]['val'] = [];
|
|
filter_input.append(input);
|
|
input.focus();
|
|
input.keyup(function () {
|
|
clearTimeout(fl_tm);
|
|
fl_tm = setTimeout(function () {
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
if (filter_data[cur_market][cur_tab][field] == undefined)filter_data[cur_market][cur_tab][field] = {};
|
|
if (input.val().length > 0) {
|
|
filter_data[cur_market][cur_tab][field]['val'] = input.val();
|
|
filter_data[cur_market][cur_tab][field]['text'] = input.val();
|
|
$('.column-' + field).addClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html(input.val());
|
|
}
|
|
else {
|
|
filter_data[cur_market][cur_tab][field] = undefined;
|
|
$('.column-' + field).removeClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html('');
|
|
}
|
|
tbl_api.draw();
|
|
}, 300);
|
|
});
|
|
}
|
|
else {
|
|
slider = $(document.createElement('div'))
|
|
if (
|
|
filter_data[cur_market] != undefined &&
|
|
filter_data[cur_market][cur_tab] != undefined &&
|
|
filter_data[cur_market][cur_tab][field] != undefined
|
|
) {
|
|
cur_min = filter_data[cur_market][cur_tab][field]['min'];
|
|
if (cur_min == undefined)cur_min = min;
|
|
cur_max = filter_data[cur_market][cur_tab][field]['max'];
|
|
if (cur_max == undefined)cur_max = max;
|
|
}
|
|
else {
|
|
cur_min = min;
|
|
cur_max = max;
|
|
}
|
|
|
|
slider_lbl_min = $(document.createElement('div'));
|
|
slider_lbl_max = $(document.createElement('div'));
|
|
|
|
slider_lbl_min.addClass('lbl-from').html(formatFunction(min));
|
|
slider_lbl_max.addClass('lbl-to').html(formatFunction(max));
|
|
|
|
filter_input.append(slider_lbl_min);
|
|
filter_input.append(slider_lbl_max);
|
|
|
|
filter_input.append(slider);
|
|
|
|
slider_lbl_range_from = $(document.createElement('input'));
|
|
slider_lbl_range_to = $(document.createElement('input'));
|
|
slider_lbl_range = $(document.createElement('div'));
|
|
|
|
slider_lbl_range_from.addClass('lbl-range-from').val(formatFunction(cur_min));
|
|
slider_lbl_range_to.addClass('lbl-range-to').val(formatFunction(cur_max));
|
|
slider_lbl_range.addClass('lbl-range').html('-');
|
|
filter_input.append(slider_lbl_range_from);
|
|
filter_input.append(slider_lbl_range_to);
|
|
filter_input.append(slider_lbl_range);
|
|
|
|
if (is_date) {
|
|
|
|
slider_lbl_range_from.datepicker({
|
|
dateFormat: "mm/dd/yy",
|
|
autoclose: true,
|
|
beforeShow: function (textbox, instance) {
|
|
setTimeout(function () {
|
|
$('#ui-datepicker-div').css({
|
|
position: 'absolute',
|
|
top: slider_lbl_range_from.position().top + slider_lbl_range_from.outerHeight() + 10,
|
|
left: slider_lbl_range_from.position().left
|
|
});
|
|
}, 0);
|
|
filter_input.append($('#ui-datepicker-div'));
|
|
$('#ui-datepicker-div').hide();
|
|
}
|
|
});
|
|
slider_lbl_range_to.datepicker({
|
|
dateFormat: "mm/dd/yy",
|
|
autoclose: true,
|
|
beforeShow: function (textbox, instance) {
|
|
setTimeout(function () {
|
|
$('#ui-datepicker-div').css({
|
|
position: 'absolute',
|
|
top: slider_lbl_range_to.position().top + slider_lbl_range_to.outerHeight() + 10,
|
|
left: slider_lbl_range_to.position().left
|
|
});
|
|
}, 0);
|
|
filter_input.append($('#ui-datepicker-div'));
|
|
$('#ui-datepicker-div').hide();
|
|
}
|
|
});
|
|
}
|
|
slider.slider({
|
|
step: 0.001,
|
|
range: true,
|
|
orientation: "horizontal",
|
|
min: parseFloat(min),
|
|
max: parseFloat(max),
|
|
values: [parseFloat(cur_min), parseFloat(cur_max)],
|
|
slide: function (event, ui) {
|
|
if (document.activeElement != slider_lbl_range_from[0])slider_lbl_range_from.val(formatFunction(ui.values[0]));
|
|
if (document.activeElement != slider_lbl_range_to[0])slider_lbl_range_to.val(formatFunction(ui.values[1]));
|
|
|
|
clearTimeout(fl_tm);
|
|
fl_tm = setTimeout(function () {
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
if (filter_data[cur_market][cur_tab][field] == undefined)filter_data[cur_market][cur_tab][field] = {};
|
|
|
|
filter_data[cur_market][cur_tab][field]['min'] = (((ui.values[0] > 1000 || ui.values[0] < -1000) && Math.round(ui.values[0]) == Math.round(min) || parseFloat(min).toFixed(2) == parseFloat(ui.values[0]).toFixed(2)) ? undefined : parseFloat(parseFloat(ui.values[0]).toFixed(2)));
|
|
filter_data[cur_market][cur_tab][field]['max'] = (((ui.values[1] > 1000 || ui.values[1] < -1000) && Math.round(ui.values[1]) == Math.round(max) || parseFloat(max).toFixed(2) == parseFloat(ui.values[1]).toFixed(2)) ? undefined : parseFloat(parseFloat(ui.values[1]).toFixed(2)));
|
|
|
|
if (filter_data[cur_market][cur_tab][field]['min'] != undefined || filter_data[cur_market][cur_tab][field]['max'] != undefined) {
|
|
tbl_api.draw();
|
|
$('.column-' + field).addClass('filter-set');
|
|
if (
|
|
filter_data[cur_market][cur_tab][field]['min'] == filter_data[cur_market][cur_tab][field]['max'] ||
|
|
(filter_data[cur_market][cur_tab][field]['min'] == undefined && filter_data[cur_market][cur_tab][field]['max'] == min) ||
|
|
(filter_data[cur_market][cur_tab][field]['max'] == undefined && filter_data[cur_market][cur_tab][field]['min'] == max)
|
|
)
|
|
$('.column-' + field + ' .filter-desc').html(" = " + formatFunction(ui.values[1]));
|
|
else if (filter_data[cur_market][cur_tab][field]['min'] == undefined)
|
|
$('.column-' + field + ' .filter-desc').html(" < " + formatFunction(ui.values[1]));
|
|
else if (filter_data[cur_market][cur_tab][field]['max'] == undefined)
|
|
$('.column-' + field + ' .filter-desc').html(" > " + formatFunction(ui.values[0]));
|
|
else
|
|
$('.column-' + field + ' .filter-desc').html(formatFunction(ui.values[0]) + " - " + formatFunction(ui.values[1]));
|
|
}
|
|
else {
|
|
$('.column-' + field).removeClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html('');
|
|
filter_data[cur_market][cur_tab][field] = undefined;
|
|
tbl_api.draw();
|
|
}
|
|
}, 300);
|
|
}
|
|
});
|
|
slider_lbl_range_from.on('keyup change', function () {
|
|
v = $(this).val();
|
|
if (is_date) {
|
|
v = new Date(v);
|
|
if (v != 'Invalid Date') {
|
|
v = v.getTime() / 1000;
|
|
slider.slider('values', 0, v);
|
|
}
|
|
slider_lbl_range_from.focus();
|
|
}
|
|
else if (is_time) {
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
v = v.toString().replace(" ", "");
|
|
if (r.test(v)) {
|
|
h = 0;
|
|
m = 0;
|
|
if (v.slice(-2) == "am") {
|
|
h = 12;
|
|
v = v.slice(0, -2);
|
|
}
|
|
else if (v.slice(-2) == "pm") {
|
|
v = v.slice(0, -2);
|
|
}
|
|
h += parseInt(v.split(":")[0]);
|
|
m += parseInt(v.split(":")[1]);
|
|
v = h * 60 + m;
|
|
slider.slider('values', 0, v);
|
|
}
|
|
}
|
|
else if (is_percent) {
|
|
v = parseFloat(v);
|
|
if (!isNaN(v))slider.slider('values', 0, v);
|
|
}
|
|
else {
|
|
switch (v[v.length - 1]) {
|
|
case 'K':
|
|
v = v.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
v = v.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
v = v.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
v = parseFloat(v);
|
|
if (!isNaN(v))slider.slider('values', 0, v);
|
|
}
|
|
slider.slider('option', 'slide')(null, {values: slider.slider('values')})
|
|
});
|
|
slider_lbl_range_to.on('keyup change', function () {
|
|
v = $(this).val();
|
|
if (is_date) {
|
|
v = new Date(v);
|
|
if (v != 'Invalid Date') {
|
|
v = v.getTime() / 1000;
|
|
slider.slider('values', 1, v);
|
|
}
|
|
slider_lbl_range_to.focus();
|
|
}
|
|
else if (is_time) {
|
|
r = /^\d{1,2}\:\d\d(am|pm){0,1}$/
|
|
v = v.toString().replace(" ", "");
|
|
if (r.test(v)) {
|
|
h = 0;
|
|
m = 0;
|
|
if (v.slice(-2) == "am") {
|
|
h = 12;
|
|
v = v.slice(0, -2);
|
|
}
|
|
else if (v.slice(-2) == "pm") {
|
|
v = v.slice(0, -2);
|
|
}
|
|
h += parseInt(v.split(":")[0]);
|
|
m += parseInt(v.split(":")[1]);
|
|
v = h * 60 + m;
|
|
slider.slider('values', 1, v);
|
|
}
|
|
}
|
|
else if (is_percent) {
|
|
v = parseFloat(v);
|
|
if (!isNaN(v))slider.slider('values', 1, v);
|
|
}
|
|
else {
|
|
switch (v[v.length - 1]) {
|
|
case 'K':
|
|
v = v.slice(0, -1) * 1000;
|
|
break;
|
|
case 'M':
|
|
v = v.slice(0, -1) * 1000000;
|
|
break;
|
|
case 'B':
|
|
v = v.slice(0, -1) * 1000000000;
|
|
break;
|
|
}
|
|
v = parseFloat(v);
|
|
if (!isNaN(v))slider.slider('values', 1, v);
|
|
}
|
|
slider.slider('option', 'slide')(null, {values: slider.slider('values')})
|
|
});
|
|
}
|
|
reset_btn.click(function () {
|
|
if (filter_data[cur_market] == undefined)filter_data[cur_market] = {};
|
|
if (filter_data[cur_market][cur_tab] == undefined)filter_data[cur_market][cur_tab] = {};
|
|
filter_data[cur_market][cur_tab][field] = undefined;
|
|
tbl_api.draw();
|
|
$('.column-' + field).removeClass('filter-set');
|
|
$('.column-' + field + ' .filter-desc').html('');
|
|
f_close();
|
|
});
|
|
|
|
tab_idx = 2;
|
|
filter_input.find('*', function () {
|
|
$(this).attr('tabindex', tab_idx);
|
|
tab_idx++;
|
|
});
|
|
|
|
$('body').append(filter_input);
|
|
|
|
|
|
if (has_centered) {
|
|
filter_input.css('left', '0');
|
|
filter_input.css('right', '0');
|
|
filter_input.css('margin', 'auto');
|
|
filter_input.addClass('pull-center');
|
|
}
|
|
else if (self.offset().left > 400) {
|
|
filter_input.css('right', 'calc( 100vw - ' + (self.offset().left + self.outerWidth()) + 'px )');
|
|
filter_input.addClass('pull-right');
|
|
}
|
|
else if (self.offset().left <= 400) {
|
|
filter_input.css('left', (self.offset().left) + 'px');
|
|
filter_input.addClass('pull-left');
|
|
}
|
|
|
|
|
|
filter_input.css('top', self.offset().top);
|
|
|
|
filter_input.addClass('show');
|
|
filter_input.focus();
|
|
|
|
f_close = function () {
|
|
filter_input.addClass('hide');
|
|
filter_input.on('animationend webkitAnimationEnd oanimationend MSAnimationEnd', function () {
|
|
filter_input.remove();
|
|
});
|
|
};
|
|
|
|
|
|
filter_input.focusout(function (e) {//return;
|
|
var $elem = $(this);
|
|
|
|
setTimeout(function () {
|
|
if (!$elem.find(':focus').length && $elem[0] != document.activeElement) {
|
|
f_close();
|
|
}
|
|
}, 0);
|
|
});
|
|
})(self, e);
|
|
|
|
return false;
|
|
});
|
|
|
|
|
|
//REFRESH BUTTON CLICK
|
|
$(document).on('click', '.refresh-data', function () {
|
|
tbl_api.ajax.reload(null, false);
|
|
$('.refresh-data').attr('title', 'Last refreshed at ' + (new Date).toString('dd MMM yyyy, hh:mm tt'));
|
|
});
|
|
|
|
|
|
//TABLE CELL CLICK AND SHOW POPUP INFO
|
|
$(document).on('click', '.dataTable tbody tr td:first-child,.dataTable tbody tr td:nth-child(2)', function () {
|
|
tr = $(this).closest('tr');
|
|
row_data = tbl_api.row(tr[0]).data();
|
|
//console.log(row_data.s);
|
|
swal({
|
|
showConfirmButton: false,
|
|
showCancelButton: false,
|
|
buttonsStyling: false,
|
|
title: 'Fetching data on ' + row_data.s,
|
|
html: '<div class="share-info-modal-loading"><span><i class="fa fa-gear fa-spin"></i></span></div>',
|
|
background: ''
|
|
});
|
|
$.post(server_uri, {cmd: 'get-share-info', share: row_data.s}, function (ret) {
|
|
//console.log(ret);
|
|
if (ret.success) {
|
|
data = {};
|
|
if (ret.data != undefined && ret.data.quoteSummary != undefined && ret.data.quoteSummary.result != undefined && ret.data.quoteSummary.result[0] != undefined && ret.data.quoteSummary.result[0].summaryProfile != undefined)
|
|
data = ret.data.quoteSummary.result[0].summaryProfile;
|
|
html = '';
|
|
addr = [];
|
|
if (data.address1 != undefined)addr.push(data.address1);
|
|
if (data.address2 != undefined)addr.push(data.address2);
|
|
if (data.city != undefined)addr.push(data.city);
|
|
if (data.state != undefined)addr.push(data.state);
|
|
if (data.zip != undefined)addr.push(data.zip);
|
|
if (data.country != undefined)addr.push(data.country);
|
|
|
|
html = '<div class="modal-share-info">' +
|
|
'<h2>' + row_data.n + '</h2>' +
|
|
'<div class="modal-share-left">' +
|
|
'<div class="modal-share-line description"><label>Description: </label><div class="text-folding"><div>' + (data.longBusinessSummary != undefined ? data.longBusinessSummary : '-') + '</div></div></div>' +
|
|
'<div class="modal-share-line"><label>Address: </label><span>' + (addr.length != 0 ? '<a target="_blank" href="https://maps.google.com/?q=' + addr.join(',') + '">' + addr.join(', ') + '</a>' : '-') + '</span></div>' +
|
|
'<div class="modal-share-line"><label>Phone: </label><span>' + (data.phone != undefined && data.phone.length > 0 ? data.phone : '-') + '</span></div>' +
|
|
'<div class="modal-share-line"><label>Website: </label><span>' + (data.website != undefined && data.website.length > 0 ? '<a target="_blank" href="' + data.website + '">' + data.website + '</a>' : '-') + '</span></div>' +
|
|
'<div class="modal-share-line"><label>Industry: </label><span>' + (data.industry != undefined && data.industry.length > 0 ? data.industry : '-') + '</span></div>' +
|
|
'<div class="modal-share-line"><label>Sector: </label><span>' + (data.sector != undefined && data.sector.length > 0 ? data.sector : '-') + '</span></div>' +
|
|
'<div class="modal-share-line"><label>Employees: </label><span>' + (data.fullTimeEmployees != undefined && data.fullTimeEmployees.toString().length > 0 ? data.fullTimeEmployees : '-') + '</span></div>' +
|
|
'</div>' +
|
|
'<div class="modal-share-right">' +
|
|
'<canvas id="chart"></canvas>' +
|
|
'</div>' +
|
|
'</div>' +
|
|
'<div class="modal-share-info-summary">' +
|
|
'<table>' +
|
|
'<tr>' +
|
|
'<td>Last Trade Price</td>' +
|
|
'<td>Currency</td>' +
|
|
'<td>Change</td>' +
|
|
'<td>Change (%)</td>' +
|
|
'<td>Market Cap</td>' +
|
|
'<td>Volume</td>' +
|
|
'<td>52 Week Low</td>' +
|
|
'<td>52 Week High</td>' +
|
|
'</tr>' +
|
|
'<tr>' +
|
|
'<td><span class="mobile-label">Last Trade Price</span>' + render_cell_numshort(row_data.regularMarketPrice) + '</td>' +
|
|
'<td><span class="mobile-label">Currency</span>' + row_data.currency + '</td>' +
|
|
'<td><span class="mobile-label">Change</span>' + render_cell_numshort_colored(row_data.regularMarketChange) + '</td>' +
|
|
'<td><span class="mobile-label">Change (%)</span>' + render_cell_percent_colored(row_data.regularMarketChangePercent) + '</td>' +
|
|
'<td><span class="mobile-label">Market Cap</span>' + render_cell_numshort(row_data.marketCap) + '</td>' +
|
|
'<td><span class="mobile-label">Volume</span>' + render_cell_numshort_int(row_data.regularMarketVolume) + '</td>' +
|
|
'<td><span class="mobile-label">52 Week Low</span>' + render_cell_numshort(row_data.fiftyTwoWeekLow) + '</td>' +
|
|
'<td><span class="mobile-label">52 Week High</span>' + render_cell_numshort(row_data.fiftyTwoWeekHigh) + '</td>' +
|
|
'</tr>' +
|
|
'</table>' +
|
|
'</div>';
|
|
|
|
swal({
|
|
allowOutsideClick: true,
|
|
width: '',
|
|
customClass: 'modal-share',
|
|
showConfirmButton: true,
|
|
showCancelButton: false,
|
|
buttonsStyling: false,
|
|
title: '',
|
|
html: html,
|
|
background: ''
|
|
}).catch(swal.noop);
|
|
|
|
if (typeof ret.historical_data['quotes'] != 'undefined') {
|
|
Chart.defaults.global.defaultFontColor = $('body').hasClass('dark-theme') ? '#ffffff' : '#3e2723';
|
|
var $chart = $(document).find('#chart');
|
|
var chart = new Chart($chart.get(0), {
|
|
type: 'line',
|
|
data: {
|
|
labels: ret.historical_data['dates'],
|
|
datasets: [{
|
|
label: row_data.n,
|
|
data: ret.historical_data['quotes'],
|
|
borderColor: 'rgb(11, 137, 195)',
|
|
backgroundColor: 'rgba(11, 137, 195, 0.3)',
|
|
fill: true,
|
|
borderWidth: 1,
|
|
pointRadius: 0
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
beginAtZero: false,
|
|
min: Math.min.apply(null, ret.historical_data['quotes']) * 0.95,
|
|
max: Math.max.apply(null, ret.historical_data['quotes']) * 1.05
|
|
}
|
|
}]
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
} else {
|
|
swal({buttonsStyling: false, title: 'Oops...', text: ret.message, type: 'error', background: ''});
|
|
}
|
|
}).fail(function () {
|
|
swal({buttonsStyling: false, title: 'Oops...', text: 'Something went wrong!', type: 'error', background: ''});
|
|
});
|
|
return false;
|
|
});
|
|
|
|
//SOME PLUGINS REACTION INLINE FUNCTIONS
|
|
function updateSelectable() {
|
|
$('select').each(function () {
|
|
|
|
self = $(this);
|
|
if (self.data('selectable') == 1)return;
|
|
idx = selectable_cur_idx;
|
|
selectable_cur_idx++;
|
|
|
|
self.data('selectable', '1');
|
|
self.hide();
|
|
|
|
|
|
(function (self, idx) {
|
|
|
|
select = $('<div class="ui-select" data-width="inherit" data-vpull="bottom" data-selectable="1" data-list="autolist-' + idx + '" data-value="' + self.val() + '">' + self.find('option:selected').html() + '</div>');
|
|
selectable_list['autolist-' + idx] = {};
|
|
self.find('option').each(function () {
|
|
selectable_list['autolist-' + idx][$(this).attr('value')] = {
|
|
id: $(this).attr('value'),
|
|
label: $(this).html(),
|
|
title: $(this).html()
|
|
};
|
|
});
|
|
self.after(select);
|
|
select.on('change', function () {
|
|
self.val(select.data('value')).change();
|
|
});
|
|
})(self, idx);
|
|
|
|
|
|
});
|
|
|
|
}
|
|
$(document).on('click', '*[data-selectable="1"]', function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
self = $(this);
|
|
(function (self, e) {
|
|
var list_input;
|
|
val = self.data('value');
|
|
self.css('position', 'relative');
|
|
list = self.data('list');
|
|
if (selectable_list[list] == undefined)return;
|
|
list_input = $(document.createElement('div'));
|
|
list_input.addClass('table-select-input');
|
|
list_input.data('value', val);
|
|
list_input.attr('tabindex', '1');
|
|
if (selectable_list[list + '_title'] != undefined) {
|
|
title = $('<div class="table-select-title ripplelink">' + selectable_list[list + '_title'] + '</div>');
|
|
list_input.append(title);
|
|
|
|
var ink, d, x, y;
|
|
|
|
ink = $(document.createElement('div'))
|
|
title.prepend(ink);
|
|
ink.addClass("ink");
|
|
|
|
if (!ink.height() && !ink.width()) {
|
|
d = Math.max(self.outerWidth(), self.outerHeight());
|
|
ink.css({height: d, width: d});
|
|
}
|
|
|
|
x = e.pageX - self.offset().left - ink.width() / 2;
|
|
y = e.pageY - self.offset().top - ink.height() / 2;
|
|
|
|
ink.css({top: y + 'px', left: x + 'px'}).addClass("animate");
|
|
}
|
|
for (i in selectable_list[list]) {
|
|
list_input.append('<div class="table-select-input-item ripplelink ' + (val == selectable_list[list][i].id ? ' selected' : '') + '" data-value="' + selectable_list[list][i].id + '">' + selectable_list[list][i].title + '</div>');
|
|
}
|
|
|
|
$('body').append(list_input);
|
|
|
|
if (self.data('width') == 'inherit') {
|
|
list_input.css('width', self.outerWidth());
|
|
}
|
|
|
|
if (self.data('pull') == 'right') {
|
|
list_input.css('right', 'calc( 100vw - ' + (self.offset().left + self.outerWidth()) + 'px )');
|
|
list_input.addClass('pull-right');
|
|
}
|
|
else
|
|
list_input.css('left', self.offset().left);
|
|
|
|
if (self.data('vpull') == 'bottom') {
|
|
list_input.css('bottom', 'calc( 100vh - ' + (self.offset().top + self.outerHeight()) + 'px )');
|
|
list_input.addClass('pull-bottom');
|
|
}
|
|
else
|
|
list_input.css('top', self.offset().top);
|
|
list_input.addClass('show');
|
|
list_input.focus();
|
|
apply = function () {
|
|
val = list_input.data('value');
|
|
//console.log(val);
|
|
|
|
setTimeout(function () {
|
|
list_input.addClass('hide');
|
|
list_input.on('animationend webkitAnimationEnd oanimationend MSAnimationEnd', function () {
|
|
list_input.remove();
|
|
});
|
|
}, 500);
|
|
|
|
|
|
self.html(selectable_list[list][val].label);
|
|
self.data('value', val);
|
|
self.trigger('change');
|
|
applySelectable(self.data('field'), self.data('value'));
|
|
};
|
|
cancel = function () {
|
|
list_input.addClass('hide');
|
|
list_input.on('animationend webkitAnimationEnd oanimationend MSAnimationEnd', function () {
|
|
list_input.remove();
|
|
});
|
|
};
|
|
list_input.focusout(function (e) {
|
|
cancel();
|
|
});
|
|
list_input.find('.table-select-input-item').on('click', function () {
|
|
if ($(this).hasClass('selected'))return cancel();
|
|
list_input.find('.selected').removeClass('selected');
|
|
$(this).addClass('selected');
|
|
list_input.data('value', $(this).data('value'));
|
|
|
|
apply()
|
|
|
|
});
|
|
})(self, e);
|
|
});
|
|
$(document).on('click', '.ripplelink', function (e) {
|
|
|
|
self = $(this);
|
|
|
|
(function (self, e) {
|
|
var ink, d, x, y;
|
|
|
|
ink = $(document.createElement('div'));
|
|
self.prepend(ink);
|
|
ink.addClass("ink");
|
|
|
|
if (!ink.height() && !ink.width()) {
|
|
d = Math.max(self.outerWidth(), self.outerHeight());
|
|
ink.css({height: d, width: d});
|
|
}
|
|
|
|
x = e.pageX - self.offset().left - ink.width() / 2;
|
|
y = e.pageY - self.offset().top - ink.height() / 2;
|
|
|
|
ink.css({top: y + 'px', left: x + 'px'}).addClass("animate");
|
|
|
|
ink.on('animationend webkitAnimationEnd oanimationend MSAnimationEnd', function () {
|
|
ink.remove();
|
|
self.trigger('rippleend');
|
|
});
|
|
|
|
})(self, e);
|
|
}); |