Dick's Sporting Goods im Vergleich: Vergleiche bis zu 10 Aktien mit frei konfigurierbaren Kennzahlen (2024)

');if( !stock_id || !stocks.hasOwnProperty(stock_id) ){for( var key in stocks ){stock_id = key;break;}}this.stock_id = stock_id;var select_options = '';for( var key in stocks ){var checked = ( key == this.stock_id )? ' selected="selected"' : '';var source = (stocks[key].hasOwnProperty('source_name') && stocks[key].source_name)? ' ('+stocks[key].source_name+')' : '';select_options = select_options +'

';}this.isin = stocks[this.stock_id].isin;this.$element.html('

'+''+''+''+'

');this.$stock_id = this.$element.find('select[name="stock_id"]');this.$stock_id.selectpicker();this.$stock_id.on('change',$.proxy(function(){var stock_id = this.$stock_id.val();if( stock_id != this.stock_id ){var prev_stock_id = this.stock_id;var new_stock_id = stock_id;this.stock_id = new_stock_id;this.$element.trigger('as.stock.change',[{ 'elem' : this, 'prev_stock_id' : prev_stock_id, 'new_stock_id' : new_stock_id }]);}}, this));this.$element.find('button[name="stock_delete"]').on('click',$.proxy(function(){this.$element.trigger('as.stock.delete',[{ 'stock_id' : this.stock_id }]);}, this));},remove : function(){this.$stock_id = null;this.stock_id = null;this.color = null;this.stocks = null;this.$element.remove();this.$element = null;},getData : function(){return this.stocks.hasOwnProperty(this.stock_id)? this.stocks[this.stock_id] : null;}});var FundamentalChart = Class.extend({init : function( global_id, settings_identifier, name, settings ){this.global_id = global_id;this.name = name;this.settings = settings;if( !this.settings.hasOwnProperty('representation') ){this.settings.representation = {};}if( !this.settings.representation.hasOwnProperty('prefix') ){this.settings.representation.prefix = '';}if( !this.settings.representation.hasOwnProperty('postfix') ){this.settings.representation.postfix = '';}if( !this.settings.representation.hasOwnProperty('precision') ){this.settings.representation.precision = 2;}if( !this.settings.representation.hasOwnProperty('scaling_factor') ){this.settings.representation.scaling_factor = 1;}this.$element = $('

');var $figure = this.$element.find('figure');this.figure = $figure[0];this.trace = {hoverinfo : 'text',x: [],y: [],stock_id : [],text: [],type: 'bar',marker : {color : []}};},createChart : function(){var data = [this.trace];var layout = {textinfo : '',title: '',margin: {l: 30,r: 40,b: 70,t: 20,},};var config = {responsive: true, displayModeBar:false, locale: 'de'}Plotly.newPlot(this.figure, data, layout, config);},clear : function(){},remove : function(){Plotly.purge(this.figure);this.figure = null;this.trace = null;this.settings = null;this.name = null;this.global_id = null;this.$element.remove();this.$element = null;},removeStock : function( stock_id, prevent_restyle ){var i = this.trace.stock_id.indexOf( stock_id );if( i > -1 ){this.trace.x.splice(i, 1);this.trace.y.splice(i, 1);this.trace.stock_id.splice(i, 1);this.trace.text.splice(i, 1);this.trace.marker.color.splice(i, 1);if( !prevent_restyle ){this.repaint();}}return i;},setData : function(title, x, y, stock_id, color ){if( this.settings.dtype != 'int' && this.settings.dtype != 'float' && this.settings.dtype != 'num' ){return;}if( title ){this.$element.find('.card-header').html(title);}for( var i = 0; i < stock_id.length; i++ ){if( y[i] != null ){y[i] = y[i]*this.settings.representation.scaling_factor;}}var text = [];for( var i = 0; i < stock_id.length; i++ ){if( y[i] == null ){var i2 = this.trace.stock_id.indexOf(stock_id[i]);if( i2 > -1 ){y[i] = this.trace.y[i2];}}text[i] = x[i];if( y[i] != null ){text[i] = text[i] + '
' + this.settings.representation.prefix + y[i].nf(this.settings.representation.precision) + this.settings.representation.postfix;}}this.trace.text = text;this.trace.x = x;this.trace.y = y;this.trace.stock_id = stock_id;this.trace.marker.color = color;this.repaint();},repaint : function(){Plotly.deleteTraces(this.figure, 0);Plotly.addTraces( this.figure, [this.trace] );var min = null;var max = null;for( var i = 0; i < this.trace.y.length; i++ ){if( this.trace.y[i] == null || isNaN(this.trace.y[i]) ){continue;}if( min == null || min > this.trace.y[i] ){min = this.trace.y[i];}if( max == null || max < this.trace.y[i] ){max = this.trace.y[i];}}if( this.settings.representation.postfix.indexOf('%') > -1 ){if( max > 50 ){max = Math.max(100,max*1.05);}else if( max > 20 ){max = 50;}else if( max > 10 ){max = 20;}else if( max > 5 ){max = 10;}else if( max > 1 ){max = 5;}else{max = 1;}min = Math.min(0, min*1.05);}else{min = Math.min(0,min);max = Math.max(0,max);}if( min != null ){var update = {yaxis : {autorange:false,range: [min,max]}};Plotly.relayout( this.figure, update );}}});JSFinancialChart = Class.extend({init : function( id, options ){this.id = id;this.interval = 'D';this.time_format = '#Y-#m-#d';this.adjustment = 'partial';this.timerange = 365;if( options.hasOwnProperty('timerange') ){this.timerange = options.timerange;}this.is_registered = false;this.quotes_is_getting = false;this.stock_ids = [];this.sorted_ids = [];this.stock_colors = {};this.stock_titles = {};this.cur_stock_id = null;this.queued_stock_ids = [];this.$element = $('

');this.is_visible = true;this.needs_repainting = false;var $figure = this.$element.find('figure');this.figure = $figure[0];this.layout = {dragmode: 'zoom',margin: {t: 20,r: 20,},showlegend: true,xaxis: {type : 'date',autotick: true,rangeslider: {visible: false }},yaxis: {autorange: true,},legend: {orientation: 'h'}};},setTimeRange : function(timerange){timerange = timerange*1;if( this.timerange == timerange ){ return; }this.timerange = timerange;var new_interval = 'D';this.time_format = '#Y-#m-#d';if( timerange < 2 ){new_interval = '1';this.time_format = '#Y-#m-#d #H:#i:#s';}else if( timerange < 8 ){new_interval = '60';this.time_format = '#Y-#m-#d #H:#i:#s';}this.queued_stock_ids = [];if( new_interval != this.interval ){for( var i = 0; i < this.stock_ids.length; i++ ){this.queued_stock_ids.push(this.stock_ids[i]);tdfUM.removeHistQuotes( { 'stock' : this.stock_ids[i], 'id' : this.id, 'interval' : this.interval, 'adjustment' : this.adjustment } );}this.interval = new_interval;this.getHistQuotes();}else{this.doSort(null);this.repaint();}},show : function(){if( !this.is_visible ){this.is_visible = true;this.$element.show();if(this.needs_repainting ){this.repaint();}}},hide : function(){if( this.is_visible ){this.is_visible = false;this.$element.hide();}},createChart : function(){var data = [];var config = { responsive: true, displayModeBar:false, locale: 'de' };Plotly.newPlot(this.figure, data, this.layout, config);},repaint : function(){if( !this.is_visible ){this.needs_repainting = true;return;}console.log('repaint finance chart');this.needs_repainting = false;while( this.figure.data.length > 0 ){Plotly.deleteTraces(this.figure, [0]);}if( !this.stock_ids.length ){return;}// use available end times and the time range to calculate a start timevar start_time = this.getStartTime();// get the start value of the first trace, it will be used as a scaling factor for the other tracesvar stock_index = 0;var stock_id = this.stock_ids[stock_index];var start_value = null;if( tdfUM.quotes.hasOwnProperty(stock_id) &&tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ){for( var i = 0; i < tdfUM.quotes[stock_id][this.interval][this.adjustment].length; i++ ){var quote = tdfUM.quotes[stock_id][this.interval][this.adjustment][i];if( quote.length > 4 && quote[4] != null && quote[0] >= start_time ){start_time = quote[0];start_value = quote[4];break;}}}// calculate scaling factors for all tracesvar factors = [];for( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ){factors.push(1);}if( start_value ){for( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ){var stock_id = this.stock_ids[stock_index];if( tdfUM.quotes.hasOwnProperty(stock_id) &&tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ){for( var i = 0; i < tdfUM.quotes[stock_id][this.interval][this.adjustment].length; i++ ){var quote = tdfUM.quotes[stock_id][this.interval][this.adjustment][i];if( quote.length > 4 && quote[4] != null && quote[0] >= start_time ){factors[stock_index] = start_value/quote[4]break;}}}}}// calculate tracesvar traces = [];for( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ){var stock_id = this.stock_ids[stock_index];if( tdfUM.quotes.hasOwnProperty(stock_id) &&tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ){//var color_parts = this.stock_colors[stock_id].replace('rgb(','').replace(')','').split(',');//color_parts[0] = Math.min(255,color_parts[0]*1.25+75);//color_parts[1] = Math.min(255,color_parts[1]*1.25+75);//color_parts[2] = Math.min(255,color_parts[2]*1.25+75);//var color2 = 'rgb('+color_parts.join(',')+')';var trace = {stock_id : stock_id,name: this.stock_titles[stock_id],hoverinfo: 'text',x: [],//open: [],//high: [],//low: [],//close: [],y: [],text: [],type: 'scatter',//type: 'candlestick',mode: 'lines',xaxis: 'x',yaxis: 'y',//increasing: {line: {color: color2}},//decreasing: {line: {color: this.stock_colors[stock_id]}},line: {color: this.stock_colors[stock_id],}}for( var i = 0; i < tdfUM.quotes[stock_id][this.interval][this.adjustment].length; i++ ){var quote = tdfUM.quotes[stock_id][this.interval][this.adjustment][i];if( quote.length > 4 && quote[4] != null && quote[0] >= start_time ){var date = new Date(quote[0]);var date_string = getDateString(date,this.time_format);trace.x.push(date_string);trace.y.push(quote[4]*factors[stock_index]);//trace.open.push(quote[1]*factors[stock_index]);//trace.high.push(quote[2]*factors[stock_index]);//trace.low.push(quote[3]*factors[stock_index]);//trace.close.push(quote[4]*factors[stock_index]);trace.text.push(quote[4].nf(2));}}traces.push(trace);}}Plotly.addTraces( this.figure, traces );},getStartTime: function(){// use available end times and the time range to calculate a start timevar last_time = null;var start_time = null;for ( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ) {var stock_id = this.stock_ids[stock_index];if ( tdfUM.quotes.hasOwnProperty(stock_id) &&tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ) {var last_stock_time = null;for ( var i = tdfUM.quotes[stock_id][this.interval][this.adjustment].length - 1; i > -1; i-- ) {var quote = tdfUM.quotes[stock_id][this.interval][this.adjustment][i];if (quote.length > 4 && quote[4] != null) {last_stock_time = quote[0];break;}}if ( last_stock_time != null && (last_time == null || last_stock_time < last_time) ) {last_time = last_stock_time;}}}if (last_time == null) {return;}if (this.timerange < 2) {var start_time = last_time;} else {var start_time = last_time - this.timerange * 24 * 60 * 60 * 1000;}var start_date = new Date(start_time);start_date.setHours(0, 0, 0, 0);start_time = start_date.getTime();return start_time},doSort: function (start_time){},addStock: function(stock, color) {if (this.stock_ids.indexOf(stock.id) > -1) {return;}this.stock_ids.push(stock.id);this.stock_colors[stock.id] = color;this.stock_titles[stock.id] = stock.name;this.queued_stock_ids.push(stock.id);tdfUM.addStockInfo([stock]);tdfUM.registerStockElement( { 'stock' : stock.id, 'elem' : this, 'id' : this.id } );this.getHistQuotes();},getHistQuotes: function() {if (this.quotes_is_getting || this.queued_stock_ids.length < 1) {this.quotes_is_getting = false;return;}TF_MODALS.setProgressModalMessage({modal_body:'Lade Kursdaten...'});TF_MODALS.showProgressModal();this.cur_stock_id = this.queued_stock_ids.shift();this.quotes_is_getting = true;tdfUM.getHistQuotes( { 'stock' : this.cur_stock_id, 'callback' : $.proxy(this.handleQuotesData,this), 'id' : this.id, 'interval' : this.interval, 'adjustment' : this.adjustment } );},handleQuotesData: function() {if (this.queued_stock_ids.length < 1) {TF_MODALS.hideProgressModal();this.doSort(null);this.repaint();}this.quotes_is_getting = false;this.getHistQuotes();},removeStock : function( stock_id ){var i = this.stock_ids.indexOf(stock_id);if( i > -1 ){tdfUM.deRegisterStockElement( { 'stock' : stock_id, 'id' : this.id } );tdfUM.removeHistQuotes( { 'stock' : stock_id, 'id' : this.id, 'interval' : this.interval, 'adjustment' : this.adjustment } );this.stock_ids.splice(i,1);delete this.stock_colors[stock_id];delete this.stock_titles[stock_id];this.removeStockTrace(stock_id);}},removeStockTrace : function(stock_id){var figure_i = -1;for( var i = 0; i < this.figure.data.length; i++ ){if( this.figure.data[i].stock_id == stock_id ){figure_i = i;break;}}if( figure_i == 0 ){ // scaling has to be redonethis.repaint();}else if( figure_i > 0 ){Plotly.deleteTraces(this.figure, [figure_i]);}},clear : function(){for( var i = 0; i < this.stock_ids.length; i++ ){tdfUM.deRegisterStockElement( { 'stock' : this.stock_ids[i], 'id' : this.id } );tdfUM.removeHistQuotes( { 'stock' : this.stock_ids[i], 'id' : this.id, 'interval' : this.interval, 'adjustment' : this.adjustment } );}this.stock_ids = [];this.stock_colors = {};this.stock_titles = {};while( this.figure.data.length > 0 ){Plotly.deleteTraces(this.figure, [0]);}},changeStock : function( prev_stock_id, stock ){var i = this.stock_ids.indexOf(prev_stock_id);if( i > -1 ){tdfUM.deRegisterStockElement( { 'stock' : prev_stock_id, 'id' : this.id } );tdfUM.removeHistQuotes( { 'stock' : prev_stock_id, 'id' : this.id, 'interval' : this.interval, 'adjustment' : this.adjustment } );tdfUM.addStockInfo( [stock] );this.stock_ids[i] = stock.id;this.stock_titles[stock.id] = stock.name;this.queued_stock_ids.push(stock.id);tdfUM.registerStockElement( { 'stock' : stock.id, 'elem' : this, 'id' : this.id } );this.getHistQuotes();}}});JSSurfaceChart = JSFinancialChart.extend({init: function (id, options) {this._super(id, options);this.stock_width = 3;this.filtered_stock_data = [];this.trace = {y: [],z: [],customdata: [],hovertemplate: "Aktie: %{customdata[3]},
Aktienkurs: %{customdata[1]},
Datum: %{customdata[0]|%e-%B-%Y}
Performance %{customdata[2]}%",name: "",type: "surface",};this.layout = {//dragmode: 'zoom',margin: {t: 20,r: 20,},showlegend: true,autosize: true,coloraxis: {showscale: false,},scene: {camera: {up: {},eye: {x: 25.25,y: 10.25,z: 1,},},aspectratio: {x: 8,y: 30,z: 10,},xaxis: {title: '',type: 'category',tickmode: "array",tickvals: [],ticktext: [],},yaxis: {title: '',type: 'date',},zaxis: {title: 'Kurs',type: 'linear',ticksuffix: '%',showticksuffix: 'all',},},legend: {orientation: 'h'},};},createChart: function () {var data = [this.trace];var config = { responsive: true, displayModeBar: false, scrollZoom: true, locale: 'de' };Plotly.newPlot(this.figure, data, this.layout, config);},repaint: function () {if( !this.is_visible ){this.needs_repainting = true;return;}console.log('repaint surface chart');this.needs_repainting = false;if (!this.stock_ids.length) {Plotly.newPlot(this.figure, [], this.layout);}var start_time = this.getStartTime()if (this.sorted_ids.length === 0 || this.filtered_stock_data.length === 0){this.doSort(start_time);}if(this.sorted_ids.length === 0 || this.filtered_stock_data.length === 0){Plotly.react(this.figure, [], this.layout);return}// calculate trace// Init Variablesvar z_value_matrix = [];// Stockdata constantsconst DATE = 0,OPEN = 1,HIGH = 2,LOW = 3,CLOSE = 4,VOLUME = 5;var customdata = []var y_value = this.filtered_stock_data[0].filter(x => x[0] >= start_time).map(x => x[0])var layout_index = []if(this.sorted_ids && this.sorted_ids.length > 0){layout_index = this.sorted_ids.map( (_, i) => i * (this.stock_width + 1) );}// Iterate through stocksfor ( var stock_index = 0; stock_index < this.filtered_stock_data.length; stock_index++ ) {var stock_id = this.sorted_ids[stock_index];// Init Variables// Get the stockvar stock = this.filtered_stock_data[stock_index]var stock_z_value = [];var stock_customdata = []// Start open price (for calculating performance in percent)const base_value = stock.find(x => x[0] >= start_time && !isNaN(x[1]))[OPEN];// Iterating through quotes of a stockfor ( var i = 0; i < stock.length; i++ ) {// init variablesvar quote = stock[i]var quote_performances = [];// Verify quotedataif ( quote.length > 4 && quote[0] >= start_time ) {var yield = this.calcYieldPercent(base_value, quote[CLOSE])if(yield) yield = yield.toFixed(2)// Add customdatastock_customdata.push([new Date(quote[DATE]),quote[CLOSE],yield,this.stock_titles[stock_id],]);// Add the performance value multiple times (due the width of each stock plot)for ( var j = stock_index; j <= stock_index + this.stock_width; j++ ) {quote_performances.push(yield);}// add the performanceList to the stockPerformancestock_z_value.push(quote_performances);}}// Add the customata value multiple times (due the width of each stock plot)for ( var j = stock_index; j <= stock_index + this.stock_width; j++ ) {customdata.push(stock_customdata);}// Add the stockdata to the z_value_matrixz_value_matrix.push(stock_z_value);}var reshaped_z_values = [];// Refrmat zValues// inputshape: (stockLength, quoteLength, widthofStockPlot)// outputshape: (quoteLength, widthOfStock * stockLength)// For each rowfor (i = 0; i < z_value_matrix.length; i++) {var trace = z_value_matrix[i];// Concat all columnsfor (j = 0; j < trace.length; j++) {if (!reshaped_z_values[j]) {reshaped_z_values[j] = [];}column = trace[j];reshaped_z_values[j] = reshaped_z_values[j].concat(column);}}// Set trace valuesthis.trace.y = y_value;this.trace.z = reshaped_z_values;this.trace.customdata = customdata;//this.figure.data[0] = this.trace;this.layout.scene.xaxis.tickvals = layout_index;this.layout.scene.xaxis.ticktext = this.sorted_ids.map( (x) => this.stock_titles[x] );this.layout.scene.aspectratio.x = this.sorted_ids.length * 2// Plotly react does not show customdate correctlyPlotly.newPlot(this.figure, [this.trace], this.layout);//Plotly.react(this.figure, [this.trace], this.layout);},calcDate: function(date){var date_obj = new Date(date)if(this.interval === "D"){date_obj.setUTCHours(0,0,0,0)}else if(this.interval === "1"){date_obj.setUTCSeconds(0,0)}return date_obj.getTime()},calcYieldPercent: function (base_value, act_value) {if(act_value === null){return null}return (act_value / base_value) * 100;},doSort: function (start_time) {// Init Variabblesconst DATE = 0,OPEN = 1,HIGH = 2,LOW = 3,CLOSE = 4,VOLUME = 5;var sorted_ids = [];var yield_list = [];if(start_time == null){start_time = this.getStartTime()}var [stocks, intersection_dates] = this.filterCorrelationDataV2(start_time)// Return if stocks aren't loaded yetif(stocks.length == 0 || stocks[0].length === 0){return []}/// Iterate over each Stockfor ( var stock_index = 0; stock_index < stocks.length; stock_index++ ) {var stock = stocks[stock_index].filter(x => intersection_dates.includes(x[0]));var stockYield = [0];// Iterate over each Stock datum and add the performance yieldfor (var j = 1; j < stock.length; j++) {var date = stock[j][DATE];var yieldPercent = (stock[j][CLOSE] / stock[j - 1][CLOSE]) - 1;stockYield.push(yieldPercent);}yield_list.push(stockYield);}// Now we have a List with all Yields in Percent --> calculate standardderivation and meaning of each stockfor (index in yield_list) {var yields = yield_list[index];var mean = yields.reduce((acc, value) => acc + value, 0) / yields.length;var standardderivation = Math.sqrt(yields.map((x) => Math.pow(x - mean, 2)).reduce((acc, value) => acc + value, 0) / yields.length);yield_list[index] = {yields,mean: mean,std: standardderivation,};}var correlation_list = [];// Define Correleationmatrix [[Corelleation stock 1],.. ,[Corelleation stock n]]for (i = 0; i < yield_list.length; i++) {correlationOfStockIList = [];// Define List of all Correlationsfor (j = 0; j < yield_list.length; j++) {stockj = yield_list[j];stocki = yield_list[i];if (i == j) {correlationOfStockIList.push(-2);continue;}sumKor = stocki.yields.map((yield_i, index) =>(yield_i - stocki.mean) *(stockj.yields[index] - stockj.mean));var correlationij = sumKor.reduce((acc, value) => acc + value, 0) / stocki.yields.length;correlationOfStockIList.push(correlationij / (stocki.std * stockj.std));}correlation_list.push(correlationOfStockIList);}sort_list = [0];actual_index = 0;// Sort ids by corerelationwhile (true) {var correlastion_stocks = correlation_list[actual_index];maxCorr = Math.max(...correlastion_stocks);if (maxCorr == -2) { break; }max_index = correlastion_stocks.indexOf(maxCorr);sort_list.push(max_index);filtered_corr_list = correlation_list.map((x) =>x.map((y, index) => max_index === index || actual_index === index ? -2 : y ));correlation_list = filtered_corr_list;actual_index = max_index;}var first_chart = stocks[sort_list[0]]var last_chart = stocks[sort_list[sort_list.length -1]]var first_chart_performance = first_chart[first_chart.length - 1][CLOSE]/ first_chart.find(x => !isNaN(x[2]))[OPEN]var last_chart_performance = last_chart[last_chart.length - 1][CLOSE]/ last_chart.find(x => !isNaN(x[2]))[OPEN]if (first_chart_performance < last_chart_performance) {sort_list = sort_list.reverse();}sorted_ids = sort_list.map((x) => this.stock_ids[x]);if(sorted_ids.length > 0){this.sorted_ids = sorted_idsthis.filtered_stock_data = sort_list.map(x => stocks[x])}},filterCorrelationDataV2: function(start_time){var length_list = [];for ( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ) {var stock_id = this.stock_ids[stock_index];if ( tdfUM.quotes.hasOwnProperty(stock_id) && tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ) {var stock = tdfUM.quotes[stock_id][this.interval][this.adjustment].filter(x => this.calcDate(x[0]) >= start_time);length_list.push(stock.length)}else{length_list.push(0)}}var max_stock_length = Math.max(...length_list)var max_stock_index = length_list.indexOf(max_stock_length)var max_timestamp_list = tdfUM.quotes[this.stock_ids[max_stock_index]][this.interval][this.adjustment].map(x => this.calcDate(x[0])).filter(x => x >= start_time)var stock_list = []// Iterate through stocksfor ( var stock_index = 0; stock_index < this.stock_ids.length; stock_index++ ) {var stock_id = this.stock_ids[stock_index];if ( tdfUM.quotes.hasOwnProperty(stock_id) && tdfUM.quotes[stock_id].hasOwnProperty(this.interval) &&tdfUM.quotes[stock_id][this.interval].hasOwnProperty(this.adjustment) ) {// Init Variables// Get the stockvar stock = tdfUM.quotes[stock_id][this.interval][this.adjustment];var stock_data = []// Iterating through quotes of a stockfor ( var i = 0; i < max_stock_length; i++ ) {// init variablesvar find_quote = stock.find(x => this.calcDate(x[0]) === max_timestamp_list[i])// If quote does not exist for the stockif(!find_quote){//console.log("quote does not exist")var index = stock.findIndex(x => this.calcDate(x[0]) >= max_timestamp_list[i])// Samples missing dataif(index > 0 ){var stock_before = stock[index-1]var stock_after = stock[index]var quote = [max_timestamp_list[i], (stock_before[1]+ stock_after[1])/ 2, (stock_before[2]+ stock_after[2])/ 2, (stock_before[3]+ stock_after[3])/ 2, (stock_before[4]+ stock_after[4])/ 2, (stock_before[5]+ stock_after[5])/ 2]}// If stock has not the same timerange (begins after start_date)else if(index === 0){var quote = [max_timestamp_list[i], NaN, NaN, NaN, NaN, NaN]}else {var quote = [max_timestamp_list[i], NaN, NaN, NaN, NaN, NaN]}}else {// Get quotevar quote = find_quote}stock_data.push(quote)}stock_list.push(stock_data)}}for(var i = 0; i < stock_list.length; i++){stock_list[i] = stock_list[i].map(x => [this.calcDate(x[0]), x[1], x[2], x[3], x[4], x[5]])}var date_intersection = stock_list[0].filter(x => !isNaN(x[1]))for(var i = 1; i < stock_list.length; i++){var filtered_stock = stock_list[i].filter(x => !isNaN(x[1])).map(x => x[0])date_intersection = date_intersection.filter((x,i, array) => filtered_stock.includes(x[0]))}date_intersection = [...new Set(date_intersection.map(x => x[0]))];return [stock_list,date_intersection]},removeStockTrace : function(stock_id){i = this.sorted_ids.indexOf(stock_id);if(i > -1){this.filtered_stock_data.splice(i, 1)this.sorted_ids.splice(i, 1);}this.repaint();}});COLOR_CIRCLE = ['rgb(33,67,156)','rgb(40,55,148)','rgb(58,48,145)','rgb(96,46,145)','rgb(138,40,141)','rgb(187,8,130)','rgb(208,11,77)','rgb(195,15,54)','rgb(232,4,4)','rgb(232,49,4)','rgb(232,80,4)','rgb(232,110,4)','rgb(232,152,4)','rgb(232,176,22)','rgb(189,186,19)','rgb(152,193,20)','rgb(118,177,15)','rgb(54,177,12)','rgb(13,159,25)','rgb(22,166,109)','rgb(11,163,145)','rgb(12,129,162)','rgb(17,115,170)','rgb(9,86,164)',]var StockComparer = Class.extend({init : function ( id, elem, options ){// set element and get options//------------------------------------------------------------------------this.id = id;this.$element = $(elem);this.options = this.addOptionDefaults( options );// start setup//------------------------------------------------------------------------TF_MODALS.showProgressModal();TF_MODALS.setProgressModalMessage({modal_body:'Starte Setup...'});this.$stock_names = this.$element.find('.stock-name');this.$stocks_names = this.$element.find('.stocks-names');this.$stock_comparison_names = this.$element.find('.comparison-names');this.$stock_links = $('.stock-link');this.$stocks_links = $('.stocks-link');this.$stock_links_container = $('#stock-links');// charts//------------------------------------------------------------------------// set up colors. We use the regular color circle, but resort the circle to// make sure we are using colors with a large contrastthis.color_circle = [];this.used_color_nums = [];var color_circle = [];for( var i = 0; i < COLOR_CIRCLE.length; i++ ){color_circle.push(COLOR_CIRCLE[i]);}var length = color_circle.length;var start = 0;var step = Math.ceil(length/3);while(length > 0){for( var i = start; i < length; i=i+step ){this.color_circle.push(color_circle[i]);this.used_color_nums.push(0)color_circle.splice(i,1);length--;}if(step <= 1){break;}step = Math.ceil(step/2);start = step;}for(var i = 0; i < color_circle.length; i++){this.color_circle.push(color_circle[i]);this.used_color_nums.push(0)}// chartsthis.fundamental_charts = {};this.$chart_list = this.$element.find('.as-chart-list').first();this.js_finance_chart = new JSFinancialChart( 'finance-chart', {'timerange':365} );this.js_surface_chart = new JSSurfaceChart( 'surface-chart', {'timerange':365} );this.$chart_list.find('.finance-chart').append(this.js_finance_chart.$element);this.$chart_list.find('.finance-chart').append(this.js_surface_chart.$element);this.js_finance_chart.createChart();this.js_surface_chart.createChart();this.$chartMenu = $('

' +'

'+'

'+'

' +'' +'' +'

'+'

'+'

'+'

'+''+''+''+''+''+''+'

'+'

'+'

' +'

');this.$chart_list.find(".finance-chart").prepend(this.$chartMenu);this.js_surface_chart.hide();this.$chartType_btn = this.$chartMenu.find('button[name="charttype"]');this.$chartType_btn.on("click",$.proxy(function (event) {var $btn = $(event.currentTarget);var type = $btn.data("val");this.$chartType_btn.removeClass('active');$btn.addClass('active');if (type == 0) {this.js_surface_chart.hide();this.js_finance_chart.show();} else if (type == 1) {this.js_finance_chart.hide();this.js_surface_chart.show();}}, this));this.$timerange_btn = this.$chartMenu.find('button[name="timerange"]');this.$timerange_btn.filter('[data-val="365"]').addClass('active');this.$timerange_btn.on('click',$.proxy(function( event ){if( this.js_surface_chart.quotes_is_getting || this.js_finance_chart.quotes_is_getting ){return;}var $btn = $(event.currentTarget);var timerange = $btn.data('val');this.$timerange_btn.removeClass('active');$btn.addClass('active');this.js_surface_chart.setTimeRange(timerange);this.js_finance_chart.setTimeRange(timerange);}, this));// stocks//------------------------------------------------------------------------// set up stock itemsthis.stock_items_cnt = 1;this.stock_items = [];this.$stock_list = this.$element.find('.as-stock-list').first();this.$stock_list.on('as.stock.delete',$.proxy(function(event,data){if( !data.hasOwnProperty('stock_id') ){return;}this.removeStock( data.stock_id );}, this))this.$stock_list.on('as.stock.change',$.proxy(function(event,data){if( !data.hasOwnProperty('prev_stock_id') || !data.hasOwnProperty('new_stock_id') ){return;}this.changeStockSource( data.prev_stock_id, data.new_stock_id );}, this));// stock add form (not a classic form since it must be positioned within the// main form, which would disrupt the functionality of the main form)this.$search_name = this.$element.find('input[name="search_name"]');this.$search_stock_id = this.$element.find('input[name="search_stock_id"]');this.$search_submit = this.$element.find('button[name="search_submit"]');var self = this;this.$search_submit.on('click',$.proxy(function(){this.submitStockSearch();}, this));this.$search_name.on('change',$.proxy(function( event ){var $group = this.$search_name.closest('.form-group');var $block = $group.find('.feedback');$block.html('').removeClass('valid-feedback').removeClass('invalid-feedback');$group.removeClass('is-valid').removeClass('is-invalid');this.$search_name.removeClass('is-valid').removeClass('is-invalid');}, this));this.$search_name.typeahead({valueField: 'stock',menu: '

    ',item: '

  • ',ajax : {url : PATH_BASE+"/ajax/searchStocks.php?access_token="+ACCESS_TOKEN},matcher: function(item) {return true;},onSelect : $.proxy(function(data){if( typeof data == 'object' && data.hasOwnProperty('value') ){var stock = JSON.parse(data.value);if( typeof stock == 'object' && stock.hasOwnProperty('id') && stock.hasOwnProperty('name') && stock.id && stock.name ){this.$search_stock_id.val(stock.id);this.$search_name.val(stock.name);this.submitStockSearch();return;}}this.handleSearchResult( null );}, self)});// main form//------------------------------------------------------------------------TF_MODALS.setProgressModalMessage({modal_body:'Initialisiere Regelwerk...'});// filter formthis.has_changes = false; // has changes that need savingthis.has_filter_changes = false; // has filter changes that need savingthis.$form = this.$element.find('form[name="viz_form"]');this.$main_feedback = this.$form.find('.main-feedback');this.$form.validator('destroy');this.submit_options = {};this.$form.validator({custom: {nullable: formcheck_numberinput_nullable,min: formcheck_numberinput_min,max: formcheck_numberinput_max,relmin: formcheck_numberinput_relmin,relmax: formcheck_numberinput_relmax,}}).on('submit', $.proxy(this.onSubmit, this));this.$filter_complete = this.$form.find('input.has_factors');this.$stocks_complete = this.$form.find('input.has_stocks');this.$configurations = this.$element.find('select[name="configuration"]');this.$configurations.on('change',$.proxy(this.onConfigurationChange, this));this.$delete_stocks = this.$element.find('button[name="delete_stocks"]');this.$delete_stocks.on('click',$.proxy(this.clearStocks, this));// filter setup//------------------------------------------------------------------------TF_MODALS.setProgressModalMessage({modal_body:'Lade Filter...'});// prepare filter containersthis.sections_filterlist = {};$filter_lists = this.$element.find('.as-filter-list').toArray();for( var i = 0; i < $filter_lists.length; i++ ){var $filter_list = $($filter_lists[i]);var section_data = $filter_list.data();this.sections_filterlist[section_data.id] = $filter_list;}this.sections_filterlistmenu = {};$filter_list_menues = this.$element.find('.as-filter-listmenu').toArray();for( var i = 0; i < $filter_list_menues.length; i++ ){var $filter_list_menu = $($filter_list_menues[i]);var section_data = $filter_list_menu.data();if( !this.sections_filterlist.hasOwnProperty(section_data.id) ){$filter_list_menu.remove(); // invalid section, remove containercontinue;}this.sections_filterlistmenu[section_data.id] = $filter_list_menu;}// prepare sections and summariesthis.sections = [];this.sections_data = [];for( var section in this.sections_filterlist ){var section_data = this.sections_filterlist[section].data();this.sections.push(section);this.sections_data.push(section_data);}// prepare filtersthis.filters = {};for( var i = 0; i < this.sections.length; i++ ){var section = this.sections[i];var section_data = this.sections_data[i];// insert filtersif( this.sections_filterlistmenu.hasOwnProperty(section) ){// insert filtersfor( var f_id in AS_FILTERS[section_data.api_section] ){var settings = AS_FILTERS[section_data.api_section][f_id];var description_btn_html = '';if( settings.hasOwnProperty('description') && settings.description ){description_btn_html = '';}var $menu_item = $('

    '+settings.name+'

    '+description_btn_html+'

    ');$menu_item.find('button[name="add-filter"]').on('click',{'section' : section, 'id' : f_id},$.proxy(this.onAddFilter, this));if( description_btn_html ){$menu_item.find('.info-filter').on('click',{'api_section' : section_data.api_section, 'id' : f_id},$.proxy(this.onShowFilterInfo, this))}$menu_item.on('dragstart',{'section' : section, 'id' : f_id},$.proxy(this.onDragFilterFromMenu, this));this.sections_filterlistmenu[section].append($menu_item);this.sortFilters(this.sections_filterlistmenu[section],'.list-group-item');}// allow dragging and dropping of filtersthis.sections_filterlist[section].parent().on('dragover',function(event){ event.preventDefault(); });this.sections_filterlist[section].parent().on('drop',$.proxy(this.onDropFilterFromMenu, this));}else{// insert filtersfor( var f_id in AS_FILTERS[section_data.api_section] ){this.addFilter( {'section' : section, 'id' : f_id} );}// sort filtersthis.sortFilters(this.sections_filterlist[section]);}}TF_MODALS.hideProgressModal();if(this.options.hasOwnProperty('stocks')){for( var i = 0; i < this.options.stocks.length; i++ ){this.addStock(this.options.stocks[i].id,this.options.stocks[i].stocks, true);}}this.onConfigurationChange();},sortFilters : function( filterlist, items_selector ){if( !items_selector ){items_selector = '.as-filter';}filterlist.children('.as-group-heading').remove();filterlist.children(items_selector).sort(compareScanFactors).appendTo(filterlist);var group_title = "";filterlist.children(items_selector).each(function(){var cur_group_title = this.getAttribute('data-group');if( cur_group_title != group_title && cur_group_title != "" ){$('

    '+cur_group_title+'

    ').insertBefore( $(this) );group_title = cur_group_title;}});},onConfigurationChange : function(){var val = this.$configurations.val();this.setChangedStatus(true);this.loadConfiguration(val);},loadConfiguration : function( val ){if( !this.options.configurations.hasOwnProperty(val) ){val = '0';}if( val != '0' ){this.clearFilterForms();var configuration = this.options.configurations[val];if(configuration.hasOwnProperty('settings') && configuration.settings){// set parametersfor( var api_section in configuration.settings ){for( var p_i = 0; p_i < configuration.settings[api_section].length; p_i++ ){var value = configuration.settings[api_section][p_i];if( typeof value == 'object' ){var section = api_section;if( this.sections.indexOf(section) > -1 ){var filter = this.addFilter( {'section' : section, 'id' : value.id} );if( filter ){filter.setValue( value );}}}}}this.checkFilterRequirements();this.$form.submit();}}var cur_val = this.$configurations.val();if( cur_val != val ){this.$configurations.val(val);this.$configurations.selectpicker('refresh');}this.setChangedStatus(false);this.setFilterChangedStatus(false);},addOptionDefaults : function( options ){var result = $.extend({}, AS_DEFAULTS, this.$element.data(), options)return result;},setSearchBarURL : function( ){if( typeof history.replaceState !== 'function' ){return;}var search_bar_url = PATH_FULL+"/aktien-vergleiche/";if( this.stock_items.length > 0 ){var stock_ids = [];var stock_names = [];var first_data = null;for( var i = 0; i < this.stock_items.length; i++ ){var data = this.stock_items[i].getData();if( first_data == null ){ first_data = data; }stock_ids.push(this.stock_items[i].stock_id);stock_names.push(data.name);}this.$stock_names.html(first_data.name);if( first_data.isin ){var stock_part_url = first_data.isin+"/"+first_data.source+"/"+( first_data.name.tf_url_friendly() );}else{var stock_part_url = first_data.id+"/"+first_data.source+"/"+( first_data.name.tf_url_friendly() );}search_bar_url = search_bar_url + stock_part_url;var comma_ids = stock_ids.slice(1,stock_ids.length).join('-');this.$stock_links.each(function(){var tool = $(this).data('tool');$(this).attr('href',PATH_FULL+"/"+tool+"/"+stock_part_url);});this.$stocks_links.each(function(){var tool = $(this).data('tool');if( tool == 'aktien-faktenbox' ){var url = PATH_FULL+"/"+tool+"/aktien-"+( comma_ids? first_data.id+'-'+comma_ids : first_data.id );}else{var url = PATH_FULL+"/"+tool+"/"+stock_part_url+( comma_ids? '/aktien-'+comma_ids : '');}$(this).attr('href',url);});this.$stock_links_container.show();if( this.stock_items.length > 1 ){search_bar_url = search_bar_url+'/aktien-'+comma_ids;if( stock_names.length < 3 ){this.$stock_comparison_names.html('im Vergleich mit '+stock_names[1]);}else if( stock_names.length < 5 ){var comma_names = stock_names.slice(1,stock_names.length-1).join(', ');var last_name = stock_names.slice(stock_names.length-1,stock_names.length);this.$stock_comparison_names.html('im Vergleich mit '+comma_names+' und '+last_name);}else{var comma_names = stock_names.slice(1,4).join(', ');if( stock_names.length - 3 == 2 ){this.$stock_comparison_names.html('im Vergleich mit '+comma_names+' und '+(stock_names.length - 4)+' weitere Aktie');}else{this.$stock_comparison_names.html('im Vergleich mit '+comma_names+' und '+(stock_names.length - 4)+' weiteren Aktien');}}if( stock_names.length < 2 ){this.$stocks_names.html(stock_names[0]);}else if( stock_names.length < 4 ){var comma_names = stock_names.slice(0,stock_names.length-1).join(', ');var last_name = stock_names.slice(stock_names.length-1,stock_names.length);this.$stocks_names.html(comma_names+' und '+last_name);}else{var comma_names = stock_names.slice(0,3).join(', ');if( stock_names.length - 3 == 1 ){this.$stocks_names.html(comma_names+' und '+(stock_names.length - 3)+' weitere Aktie');}else{this.$stocks_names.html(comma_names+' und '+(stock_names.length - 3)+' weiteren Aktien');}}}else{this.$stocks_names.html(first_data.name);this.$stock_comparison_names.html('');}}else{this.$stock_names.html("Aktien Vergleiche");this.$stocks_names.html('');this.$stock_comparison_names.html('');this.$stock_links.each(function(){var tool = $(this).data('tool');$(this).attr('href',PATH_FULL+"/"+tool);});this.$stocks_links.each(function(){var tool = $(this).data('tool');$(this).attr('href',PATH_FULL+"/"+tool);});this.$stock_links_container.hide();}history.replaceState(null, null, search_bar_url);},checkFilterRequirements : function(){var is_complete = 0;for( var key in this.filters ){for( var i = 0; i < this.filters[key].length; i++ ){if( this.filters[key][i].isInUse() ){is_complete = true;break;}}}var is_filter_complete_checked = this.$filter_complete.is(':checked');if( is_complete != is_filter_complete_checked ){this.$filter_complete.prop('checked',is_complete);this.$filter_complete.change();}},checkStockRequirements : function(){var is_stocks_complete_checked = this.$stocks_complete.is(':checked');var is_complete = this.stock_items.length > 0;if( is_complete != is_stocks_complete_checked ){this.$stocks_complete.prop('checked',is_complete);this.$stocks_complete.change();}},submitStockSearch : function( event ){if( this.stock_items.length >= this.options.max_stocks ){error_message = '

    • Sie können maximal '+this.options.max_stocks+' Aktien vergleichen.

    ';var $group = this.$search_name.closest('.form-group');var $block = $group.find('.feedback');$block.html(error_message).removeClass('valid-feedback').addClass('invalid-feedback');$group.removeClass('is-valid');this.$search_name.removeClass('is-valid').addClass('is-invalid');this.$search_stock_id.val('');this.$search_name.val('');return;}var data = {'stock_id' : this.$search_stock_id.val(),'name' : this.$search_name.val(),'access_token' : ACCESS_TOKEN};if( !data.stock_id && !data.name ){this.handleSearchResult( null );return;}this.$element.addClass('is-processing');$.ajax({url: '/ajax/form-stocksearch.php',method: 'POST',type: 'POST',data: data,dataType: 'json',context: this,success: function(data,textStatus,jqXHR){this.$element.removeClass('is-processing');TF_MODALS.showMessageModal(data);if( typeof data == 'object' && data.hasOwnProperty('status') &&data.status == 'success' && data.hasOwnProperty('data') ){this.handleSearchResult( data.data );}else{this.handleSearchResult( null );}},error: function(jqXHR,textStatus,errorThrown){this.handleSearchResult( null );this.$element.removeClass('is-processing');TF_MODALS.showMessageModal(data);}})},handleSearchResult : function( stocks ){var error_message = '';if( typeof stocks != 'object' || jQuery.isEmptyObject(stocks) ){var $name_val = this.$search_name.val();if( $name_val ){error_message = '

    • Zu diesem Suchbegriff konnten keine Aktien gefunden werden

    ';}else{error_message = '

    • Bitte geben Sie einen Suchbegriff an.

    ';}}else{var isin = '';for( key in stocks ){isin = stocks[key].isin;break;}for( i = 0; i < this.stock_items.length; i++){if( this.stock_items[i].isin == isin ){error_message = '

    • Diese Aktie befindet sich bereits in der Vergleichsliste

    ';}}}var $group = this.$search_name.closest('.form-group');var $block = $group.find('.feedback');if( !error_message ){var stock_id = this.$search_stock_id.val();this.addStock( stock_id, stocks );this.$search_stock_id.val('');this.$search_name.val('');$block.html(error_message).removeClass('valid-feedback').removeClass('invalid-feedback');$group.removeClass('is-valid').removeClass('is-invalid');this.$search_name.removeClass('is-valid').removeClass('is-invalid');}else{// add error message and clear fields$block.html(error_message).removeClass('valid-feedback').addClass('invalid-feedback');$group.removeClass('is-valid');this.$search_name.removeClass('is-valid').addClass('is-invalid');this.$search_stock_id.val('');this.$search_name.val('');}},addStock : function( stock_id, stocks, prevent_update ){var color_min_i = -1;var color_min_num = Number.MAX_VALUE;for(var i = 0; i < this.used_color_nums.length; i++){if( this.used_color_nums[i] < color_min_num ){color_min_i = i;color_min_num = this.used_color_nums[i];}}this.used_color_nums[color_min_i]++;tdfUM.addStockInfo(stocks);var stock_item = new StockItem(this.stock_items_cnt,stock_id,stocks,this.color_circle[color_min_i]);this.stock_items_cnt++;this.stock_items.push(stock_item);var stock = stock_item.getData();this.js_finance_chart.addStock(stock, this.color_circle[color_min_i]);this.js_surface_chart.addStock(stock, this.color_circle[color_min_i]);this.$stock_list.append(stock_item.$element);this.setSearchBarURL();this.checkStockRequirements();if( !prevent_update ){this.submit_options = {'stock_id' : stock_item.stock_id};this.$form.submit();}},removeStock : function( stock_id ){var stock_i = -1;for( var i = 0; i < this.stock_items.length; i++ ){if( this.stock_items[i].stock_id == stock_id ){stock_i = i;break;}}if( stock_i > -1 ){this.js_finance_chart.removeStock( stock_id );this.js_surface_chart.removeStock(stock_id);var item = this.stock_items[stock_i];this.stock_items.splice(stock_i, 1);var color_i = this.color_circle.indexOf(item.color);if( color_i > -1 ){this.used_color_nums[color_i]--;}item.remove();for( global_id in this.fundamental_charts ){this.fundamental_charts[global_id].removeStock( stock_id );}this.setSearchBarURL();this.checkStockRequirements();}},clearStocks : function( ){this.js_finance_chart.clear( );this.js_surface_chart.clear();for( var i = 0; i < this.stock_items.length; i++ ){this.stock_items[i].remove();}this.stock_items = [];this.stock_items_cnt = 1for( var i = 0; i < this.used_color_nums.length; i++ ){this.used_color_nums[i] = 0;}for( global_id in this.fundamental_charts ){this.fundamental_charts[global_id].setData('',[],[],[],[]);}this.setSearchBarURL();this.checkStockRequirements();},changeStockSource : function( prev_stock_id, new_stock_id ){var stock = null;for( var i = 0; i < this.stock_items.length; i++ ){if( this.stock_items[i].stock_id == new_stock_id ){stock = this.stock_items[i].getData();break;}}if( stock != null ){this.js_finance_chart.changeStock( prev_stock_id, stock );this.js_surface_chart.changeStock(prev_stock_id, stock);for( global_id in this.fundamental_charts ){this.fundamental_charts[global_id].removeStock( prev_stock_id );}this.submit_options = {'stock_id' : new_stock_id};this.$form.submit();}},onFilterStateChange : function( event, data ){if( !data.hasOwnProperty('id') || !data.hasOwnProperty('section') || !data.hasOwnProperty('global_id') ){return;}var filter_index = this.getFilterIndex( data.id, data.global_id );if( filter_index == -1 ){return;}// remove filter entirely if it has been truly deactivatedif( !this.filters[data.id][filter_index].isInUse() ){this.removeFilter(data.id, data.global_id);if( this.fundamental_charts.hasOwnProperty(data.global_id) ){this.fundamental_charts[data.global_id].remove();delete this.fundamental_charts[data.global_id];}}this.onFilterInputChange(event,data);this.$form.validator('update');this.checkFilterRequirements();},onFilterInputChange : function( event, data ){if( !data.hasOwnProperty('id') || !data.hasOwnProperty('section') ){return;}this.setChangedStatus(true);this.setFilterChangedStatus(true);},onAddFilter : function( event, data ){if( !data ){ data = event.data; }if( !data.hasOwnProperty('id') || !data.hasOwnProperty('section') ){return;}var options = {'section' : data.section, 'id' : data.id};this.addFilter( options );this.onFilterInputChange(event,options);this.$form.validator('update');this.checkFilterRequirements();},onDragFilterFromMenu : function(event){if( !event.data.hasOwnProperty('id') || !event.data.hasOwnProperty('section') ){event.preventDefault();return;}event.originalEvent.dataTransfer.setData("text", JSON.stringify(event.data));},onDropFilterFromMenu : function(event){event.preventDefault();var data = event.originalEvent.dataTransfer.getData("text");var options = JSON.parse(data);this.addFilter( options );this.onFilterInputChange(event,options);this.$form.validator('update');this.checkFilterRequirements();},onShowFilterInfo : function(event){if( !event.data.hasOwnProperty('id') || !event.data.hasOwnProperty('api_section') ||!AS_FILTERS.hasOwnProperty(event.data.api_section) ||!AS_FILTERS[event.data.api_section].hasOwnProperty(event.data.id) ) {return;}var id = event.data.id;var api_section = event.data.api_section;var desc_id = 'as-description-'+api_section+'-'+id;var options = {'modal_header' : AS_FILTERS[api_section][id].name,'modal_body' : '

    keine Beschreibung vorhanden

    ',}var do_formatting = false;if( AS_FILTERS[api_section][id].hasOwnProperty('formatted_description') &&AS_FILTERS[api_section][id].formatted_description ){options['modal_body'] = '

    '+AS_FILTERS[api_section][id].formatted_description+'

    ';}else if( AS_FILTERS[api_section][id].hasOwnProperty('description') &&AS_FILTERS[api_section][id].description ){do_formatting = true;options['modal_body'] = '

    '+AS_FILTERS[api_section][id].description+'

    ';}TF_MODALS.showMessageModal(options);if( do_formatting ){MathJax.Hub.Queue(["Typeset",MathJax.Hub,desc_id]);TF_MODALS.modals.message.element.on('hide.bs.modal',{'id' : id, 'api_section' : api_section},function(event){if( !event.data.hasOwnProperty('id') || !event.data.hasOwnProperty('api_section') ||!AS_FILTERS.hasOwnProperty(event.data.api_section) ||!AS_FILTERS[event.data.api_section].hasOwnProperty(event.data.id) ) {return;}var id = event.data.id;var api_section = event.data.api_section;var desc_id = 'as-description-'+api_section+'-'+id;AS_FILTERS[api_section][id].formatted_description = $('#'+desc_id).html();});}},getSettings : function(options){var values = { 'stock_ids' : [], 'filters_fundamental' : [], 'filters_indicators' : [], 'filters_signals' : [], 'filters_scoring_systems' : []};if( options.hasOwnProperty('stock_id') && !this.has_filter_changes ){values.stock_ids = [options.stock_id * 1]}else{for( var i = 0; i < this.stock_items.length; i++ ){values.stock_ids.push( this.stock_items[i].stock_id * 1 );}}for( var id in this.filters ){for( var i = 0; i < this.filters[id].length; i++ ){if( this.filters[id][i].isInUse() ){var filter_data = this.filters[id][i].getValue();if( filter_data != null ){filter_data['min'] = null;filter_data['max'] = null;var api_section = this.filters[id][i].api_section;values[api_section].push(filter_data);}else{this.filters[id][i].deactivate();}}}}return values;},onSubmit : function( event ){var submit_options = this.submit_options;this.submit_options = {};if (event.isDefaultPrevented()) {return;}event.preventDefault();var settings = this.getSettings(submit_options);var data = {'data' : JSON.stringify(settings), access_token: ACCESS_TOKEN }TF_MODALS.showProgressModal();TF_MODALS.setProgressModalMessage({modal_body:'Lade Chart Daten...'});$.ajax({url: '/ajax/form-viz-comparisons.php',method: 'POST',data: data,dataType: 'json',context: this,success: function(data,textStatus,jqXHR){this.handleResult(data);TF_MODALS.hideProgressModal();this.showFormErrors( data, this.$main_feedback );TF_MODALS.showMessageModal(data);},error: function(jqXHR,textStatus,errorThrown){var errors = [{'id' : 'form_id', 'message' : 'Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal.'}];if(textstatus==="timeout") {errors.message = 'Es ist ein Fehler aufgetreten (Timeout). Bitte versuchen Sie es später noch einmal.';}var data = {'errors' : errors, 'status' : "error", 'action' : 'processed'}this.handleResult(data);TF_MODALS.hideProgressModal();this.showFormErrors( data, this.$main_feedback );TF_MODALS.showMessageModal(data);}});},handleResult : function( data){if( !data.hasOwnProperty('data') || !data.data.hasOwnProperty('viz_data') ||!data.data.viz_data.hasOwnProperty('columns') || !data.data.viz_data.hasOwnProperty('values') ||!data.data.viz_data.values.length ){return;}// make sure there is a fundamental chart for each filtervar global_ids = [];for( var id in this.filters ){for( var i = 0; i < this.filters[id].length; i++ ){var global_id = this.filters[id][i].global_id+"";if( this.fundamental_charts.hasOwnProperty(global_id) ){global_ids.push(global_id);}else{for( var api_section in AS_FILTERS ){if( typeof AS_FILTERS[api_section] == 'object' && AS_FILTERS[api_section].hasOwnProperty(id) &&typeof AS_FILTERS[api_section][id] == 'object' ){var filter_data = this.filters[id][i].getValue();var settings_identifier = this.getFilterSettingsIdentifier(filter_data);global_ids.push(global_id);this.fundamental_charts[global_id] = new FundamentalChart( global_id, settings_identifier, AS_FILTERS[api_section][id].name, AS_FILTERS[api_section][id] );this.$chart_list.append(this.fundamental_charts[global_id].$element);this.fundamental_charts[global_id].createChart();break;}}}}}// remove fundamental charts whose corresponding filters have been deactivatedfor( var global_id in this.fundamental_charts ){if( global_ids.indexOf(global_id) < 0 ){this.fundamental_charts[global_id].remove();delete this.fundamental_charts[global_id];}}// show datavar stock_ids = [];var colors = [];var x = [];var y_by_global_id = {};for( var global_id in this.fundamental_charts ){y_by_global_id[global_id] = [];}for( var s_i = 0; s_i < this.stock_items.length; s_i++ ){var stock = this.stock_items[s_i].getData();if( stock == null ){ continue; }stock_ids.push(this.stock_items[s_i].stock_id);colors.push(this.stock_items[s_i].color);x.push(stock.name);for( var global_id in this.fundamental_charts ){y_by_global_id[global_id].push(null);}}var stock_id_i = data.data.viz_data.columns.global_id.indexOf('stock_id');for( var row_i = 0; row_i < data.data.viz_data.values.length; row_i++ ){var stock_id = data.data.viz_data.values[row_i][stock_id_i]+"";var stock_i = stock_ids.indexOf(stock_id);if( stock_i > -1 ){for( var col_i = 0; col_i < data.data.viz_data.columns.global_id.length; col_i++ ){var global_id = data.data.viz_data.columns.global_id[col_i];if( !this.fundamental_charts.hasOwnProperty(global_id) ){ continue; }y_by_global_id[global_id][stock_i] = data.data.viz_data.values[row_i][col_i];}}}for( var col_i = 0; col_i < data.data.viz_data.columns.global_id.length; col_i++ ){var global_id = data.data.viz_data.columns.global_id[col_i];if( !this.fundamental_charts.hasOwnProperty(global_id) ){ continue; }this.fundamental_charts[global_id].setData(data.data.viz_data.columns.name[col_i],x.slice(0,x.length),y_by_global_id[global_id],stock_ids.slice(0,stock_ids.length),colors.slice(0,colors.length));}},clear : function(){this.clearFilterForms();},reset : function(){this.clearFilterForms();},clearFilterForms : function(){// reset filters and remove individual filter summariesfor( key in this.filters ){var used_sections = [];for( var i = this.filters[key].length-1; i >= 0; i-- ){this.removeFilter(key,this.filters[key][i].global_id);}}this.checkFilterRequirements();this.$form.validator('update');},getFilterSettingsIdentifier : function( filter_data ){var id = filter_data.id;if( filter_data.hasOwnProperty('parameters') && !jQuery.isEmptyObject(filter_data.parameters) ){var parameters = [];for( var key in filter_data.parameters ){parameters.push([key,filter_data.parameters[key]]);}parameters.sort(function(a,b){if( a[0] < b[0] ){ return -1; }else if( a[0] > b[0] ){ return 1; }else{ return 0; }});for( var i = 0; i < parameters.length; i++ ){id = id + '_' + parameters[i][0] + '_' + parameters[i][1];}}return id;},getFilterIndex : function( id, global_id ){if( this.filters.hasOwnProperty(id) ){for( var i = 0; i < this.filters[id].length; i++ ){if( this.filters[id][i].global_id == global_id ){return i;}}}return -1;},removeFilter : function( id, global_id ){var f_index = this.getFilterIndex(id,global_id);if( f_index == -1 ){return;}else{this.filters[id][f_index].remove();this.filters[id].splice(f_index, 1);}},addFilter : function( options, insert_after_global_id ){if( !options || !options.hasOwnProperty('id') || !options.hasOwnProperty('section') ){return null;}try{var i = this.sections.indexOf(options.section);if( i < 0 ){return null;}var section_data = this.sections_data[i];options.api_section = section_data.api_section;options.api_group = 'buy';options.filter_type = section_data.filter_type;options.allow_display_only = false;options.use_card_container = true;var filter = new ASParameterFactor( options );}catch( e ){console.log(e);alert('Ein Kriterium konnte nicht hinzugefügt werden, möglicherweise weil Sie nicht das Recht haben Kriterien dieser Art zu nutzen.');return null;}this.sections_filterlist[options.section].append(filter.$element);if( !this.filters.hasOwnProperty(options.id) ){this.filters[options.id] = [];}var insert_after_filter = null;if( insert_after_global_id ){// insert after specific filtervar filter_index = this.getFilterIndex( options.id, insert_after_global_id );if( filter_index > -1 ){insert_after_filter = this.filters[options.id][filter_index];}}else{// insert after last filter of this id in this sectionfor( var i = 0; i < this.filters[options.id].length; i++ ){if( this.filters[options.id][i].section == options.section ){insert_after_filter = this.filters[options.id][i];}}}this.filters[options.id].push(filter);filter.$element.on('as.filter.change',$.proxy(this.onFilterInputChange, this) );filter.$element.on('as.filter.statechange',$.proxy(this.onFilterStateChange, this) );filter.$element.on('as.filter.add',$.proxy(this.onAddFilter, this) );if(insert_after_filter){filter.$element.insertAfter( insert_after_filter.$element );}return filter;},setChangedStatus : function( has_changes ){if( has_changes == this.has_changes ){return;}this.has_changes = has_changes;},setFilterChangedStatus : function( has_changes ){if( has_changes == this.has_filter_changes ){return;}this.has_filter_changes = has_changes;},showFormErrors : function(data, $feedback){if(data.hasOwnProperty('status') && data.status == 'error' && data.hasOwnProperty('errors')){var html = '';var html = '

      ';for( var i = 0; i < data.errors.length; i++ ){html = html+'
    • '+data.errors[i].message+'
    • ';}if($feedback && $feedback.length){$feedback.addClass('invalid-feedback');$feedback.html(html);}else{// show errors in modalif( !data.hasOwnProperty('modal_body') ){var modal_data = {'modal_header' : 'Es sind Fehler aufgetreten','modal_body' : html,'modal_allow_close' : true,'status' : data.status}TF_MODALS.showMessageModal( modal_data );}}}else if($feedback && $feedback.length){$feedback.removeClass('invalid-feedback');$feedback.html('');}},});AS_DEFAULTS = {max_stocks : 10}
    Dick's Sporting Goods im Vergleich: Vergleiche bis zu 10 Aktien mit frei konfigurierbaren Kennzahlen (2024)

    References

    Top Articles
    Latest Posts
    Article information

    Author: Francesca Jacobs Ret

    Last Updated:

    Views: 5739

    Rating: 4.8 / 5 (48 voted)

    Reviews: 95% of readers found this page helpful

    Author information

    Name: Francesca Jacobs Ret

    Birthday: 1996-12-09

    Address: Apt. 141 1406 Mitch Summit, New Teganshire, UT 82655-0699

    Phone: +2296092334654

    Job: Technology Architect

    Hobby: Snowboarding, Scouting, Foreign language learning, Dowsing, Baton twirling, Sculpting, Cabaret

    Introduction: My name is Francesca Jacobs Ret, I am a innocent, super, beautiful, charming, lucky, gentle, clever person who loves writing and wants to share my knowledge and understanding with you.