var helper;
var chartBuilder;
var dataProvider;
chartBuilder = {
lineChart: {
graphs: function (parsedJson) {
var graphs = [];
$.each(parsedJson.chart.graphs.graph, function (i, obj1) {
var obj = {
"balloonText": "[[category]]: [[value]]",
"title": obj1["@title"],
"valueField": i.toString(),
"lineColor": "#" + obj1["@color"],
"lineThickness": parseInt(obj1["@line_width"]),
"fillAlphas": 0,
"hidden": obj1["@visible"] == "no"
};
graphs.push(obj);
});
return graphs;
},
createChart: function (jsonData, eleId) {
var chart = AmCharts.makeChart(eleId, {
"type": "serial",
"backgroundColor": "#eeeeee",
"backgroundAlpha": 1,
"legend": {
"useGraphSettings": false,
"markerType": "circle",
"position": "right",
"fontSize": 10,
"labelWidth": 90,
"forceWidth": true,
"width": 120
},
"dataProvider": dataProvider.formatLineChartData(jsonData),
"valueAxes": [{
"title": ""
}],
"graphs": chartBuilder.lineChart.graphs(jsonData),
"chartCursor": {
"cursorAlpha": 0,
"zoomable": false
},
"categoryField": "category",
"categoryAxis": {
"gridAlpha": 0.2,
"dateFormats": [{"period":"fff","format":"JJ:NN:SS"},
{"period":"ss","format":"JJ:NN:SS"},
{"period":"mm","format":"JJ:NN"},
{"period":"hh","format":"JJ:NN"},
{"period":"DD","format":"MMMM DD"},
{"period":"WW","format":"MMMM DD"},
{"period":"MM","format":"MMMM"},
{"period":"YYYY","format":"YYYY"}]
},
"export": {
"enabled": true,
"position": "bottom-right"
}
});
},
init: function (eleId, url) {
dataProvider.fetchData(url, function (xmlData) {
var jsonData = dataProvider.formatXMLData(xmlData);
chartBuilder.lineChart.createChart(jsonData, eleId);
});
}
},
priceChart: {
graphs: function (parsedJson) {
var graphs = [];
$.each(parsedJson.chart.graphs.graph, function (i, obj1) {
var obj = {
"balloonText": "[[category]]: [[value]]",
"title": obj1["@title"],
"valueField": i.toString(),
"lineColor": "#" + obj1["@color"],
"lineThickness": parseInt(obj1["@line_width"]),
"fillAlphas": 0,
"hidden": obj1["@visible"] == "no"
};
graphs.push(obj);
});
return graphs;
},
createChart: function (jsonData, eleId) {
var chart = AmCharts.makeChart(eleId, {
"type": "serial",
"backgroundColor": "#eeeeee",
"backgroundAlpha": 1,
"dataDateFormat": "MM/DD/YYYY",
"legend": {
"useGraphSettings": false,
"markerType": "circle",
"divId": "share_view_legenddiv", // use the id of the dev container.refer to html below
"fontSize": 10,
"position": "absolute",
"left": 0,
"top": 0,
},
"dataProvider": dataProvider.formatLineChartData(jsonData),
"valueAxes": [{
"title": ""
}],
"graphs": chartBuilder.priceChart.graphs(jsonData),
"chartCursor": {
"cursorAlpha": 0,
"zoomable": false
},
"categoryField": "category",
"categoryAxis": {
"parseDates":true,
"gridAlpha": 0.2,
"equalSpacing": true,
"dateFormats": [{ "period": "fff", "format": "JJ:NN:SS" },
{ "period": "ss", "format": "JJ:NN:SS" },
{ "period": "mm", "format": "JJ:NN" },
{ "period": "hh", "format": "JJ:NN" },
{ "period": "DD", "format": "MMMM DD" },
{ "period": "WW", "format": "MMMM DD" },
{ "period": "MM", "format": "MMMM DD" },
{ "period": "YYYY", "format": "YYYY" }]
},
"export": {
"enabled": true,
"position": "bottom-right"
}
});
},
init: function (eleId, url) {
dataProvider.fetchData(url, function (xmlData) {
var jsonData = dataProvider.formatXMLData(xmlData);
chartBuilder.priceChart.createChart(jsonData, eleId);
});
}
},
marketChart: {
graphs: function (parsedJson) {
var graphs = [];
$.each(parsedJson.chart.graphs.graph, function (i, obj1) {
var obj = {
"balloonText": "[[category]]: [[value]]",
"title": obj1["@title"],
"valueField": i.toString(),
"lineColor": "#" + obj1["@color"],
"lineThickness": parseInt(obj1["@line_width"]),
"fillAlphas": 0,
"hidden": obj1["@visible"] == "no",
"id":obj1["@gid"]
};
graphs.push(obj);
});
return graphs;
},
createChart: function (jsonData, eleId) {
var chart = AmCharts.makeChart(eleId, {
"type": "serial",
"backgroundColor": "#eeeeee",
"backgroundAlpha": 1,
"dataProvider": dataProvider.formatLineChartData(jsonData),
"valueAxes": [{
"title": ""
}],
"graphs": chartBuilder.marketChart.graphs(jsonData),
"chartCursor": {
"cursorAlpha": 0,
"zoomable": false
},
"categoryField": "category",
"categoryAxis": {
"parseDates":true,
"gridAlpha": 0.2,
"equalSpacing": true,
"dateFormats": [{ "period": "fff", "format": "JJ:NN:SS" },
{ "period": "ss", "format": "JJ:NN:SS" },
{ "period": "mm", "format": "JJ:NN" },
{ "period": "hh", "format": "JJ:NN" },
{ "period": "DD", "format": "MMMM DD" },
{ "period": "WW", "format": "MMMM DD" },
{ "period": "MM", "format": "MMMM DD" },
{ "period": "YYYY", "format": "YYYY" }]
},
"legend": {
"enabled": false,
},
"export": {
"enabled": false,
"position": "bottom-right"
}
});
},
init: function (eleId, url) {
debugger;
dataProvider.fetchData(url, function (xmlData) {
var jsonData = dataProvider.formatXMLData(xmlData);
chartBuilder.marketChart.createChart(jsonData, eleId);
});
}
},
intraDayChart: {
createChart: function (jsonData, eleId) {
var intraDayChart = AmCharts.makeChart(eleId, {
"type": "stock",
"theme": "light",
"categoryAxesSettings": {
"minPeriod": "mm"
},
"dataSets": [{
"color": "#b0de09",
"fieldMappings": [{
"fromField": "value",
"toField": "value"
}, {
"fromField": "volume",
"toField": "volume"
}],
"dataProvider": dataProvider.formatintraDayData(jsonData),
"categoryField": "date"
}],
"panels": [{
"showCategoryAxis": false,
"title": "Value",
"percentHeight": 70,
"stockGraphs": [{
"id": "g1",
"valueField": "value",
"type": "smoothedLine",
"lineThickness": 2,
"bullet": "round"
}],
"stockLegend": {
"valueTextRegular": " ",
"markerType": "none"
}
}, {
"title": "Volume",
"percentHeight": 30,
"stockGraphs": [{
"valueField": "volume",
"type": "column",
"cornerRadiusTop": 2,
"fillAlphas": 1
}],
"stockLegend": {
"valueTextRegular": " ",
"markerType": "none"
}
}],
"chartCursorSettings": {
"valueBalloonsEnabled": true
},
"panelsSettings": {
"usePrefixes": true
},
"export": {
"enabled": true,
"position": "bottom-right"
}
});
},
init: function (eleId, url) {
dataProvider.fetchData(url, function (csvData) {
var csvHeader = "Date,,,,Value,Volume\n";
var jsonData = dataProvider.formatCSVData(csvData,csvHeader);
chartBuilder.intraDayChart.createChart(jsonData, eleId);
});
}
},
ohlcChart: {
createChart: function (jsonData, eleId) {
var ohlcChart = AmCharts.makeChart(eleId, {
"type": "stock",
"theme": "light",
"categoryAxesSettings": {
"minPeriod": "mm"
},
"dataSets": [{
"fieldMappings": [{
"fromField": "open",
"toField": "open"
}, {
"fromField": "close",
"toField": "close"
}, {
"fromField": "high",
"toField": "high"
}, {
"fromField": "low",
"toField": "low"
}, {
"fromField": "volume",
"toField": "volume"
}],
"color": "#7f8da9",
"dataProvider": dataProvider.formatOHLCdata(jsonData),
"title": "Value",
"categoryField": "date"
}],
"panels": [
{
"stockGraphs": [{
"type": "ohlc",
"id": "g1",
"openField": "open",
"closeField": "close",
"highField": "high",
"lowField": "low",
"valueField": "close",
"lineColor": "#7f8da9",
"fillColors": "#7f8da9",
"negativeLineColor": "#db4c3c",
"negativeFillColors": "#db4c3c",
"fillAlphas": 1,
"useDataSetColors": false,
"balloonText": "open:[[open]]
close:[[close]]
low:[[low]]
high:[[high]]",
}],
"stockLegend": {
"valueTextRegular": undefined,
"periodValueTextComparing": "[[percents.value.close]]%"
}
},
{
"title": "Volume",
"percentHeight": 30,
"marginTop": 1,
"showCategoryAxis": true,
"valueAxes": [{
"dashLength": 5
}],
"categoryAxis": {
"dashLength": 5
},
"stockGraphs": [{
"valueField": "volume",
"type": "column",
"balloonText": "Volume:[[value]]",
"fillAlphas": 1
}],
"stockLegend": {
"markerType": "none",
"markerSize": 0,
"labelText": "",
"periodValueTextRegular": "[[value.close]]"
}
}
],
"chartCursorSettings": {
"valueBalloonsEnabled": true
},
"chartScrollbarSettings": {
"graph": "g1",
"graphType": "line",
"usePeriod": "hh"
}
});
},
init: function (eleId, url) {
dataProvider.fetchData(url, function (csvData) {
var csvHeader = "Date,Open,High,Low,Close,Volume\n";
var jsonData = dataProvider.formatCSVData(csvData, csvHeader);
chartBuilder.ohlcChart.createChart(jsonData, eleId);
});
}
},
candlestickChart: {
createChart: function (jsonData, eleId) {
var candleStickChart = AmCharts.makeChart(eleId, {
"type": "stock",
"theme": "light",
"categoryAxesSettings": {
"minPeriod": "mm"
},
"dataSets": [{
"fieldMappings": [{
"fromField": "open",
"toField": "open"
}, {
"fromField": "close",
"toField": "close"
}, {
"fromField": "high",
"toField": "high"
}, {
"fromField": "low",
"toField": "low"
}, {
"fromField": "volume",
"toField": "volume"
}],
"color": "#7f8da9",
"dataProvider": dataProvider.formatOHLCdata(jsonData),
"title": "Value",
"categoryField": "date"
}],
"panels": [
{
"stockGraphs": [{
"type": "candlestick",
"id": "g1",
"openField": "open",
"closeField": "close",
"highField": "high",
"lowField": "low",
"valueField": "close",
"lineColor": "#7f8da9",
"fillColors": "#7f8da9",
"negativeLineColor": "#db4c3c",
"negativeFillColors": "#db4c3c",
"fillAlphas": 1,
"useDataSetColors": false,
"balloonText": "open:[[open]]
close:[[close]]
low:[[low]]
high:[[high]]",
}],
"stockLegend": {
"valueTextRegular": undefined,
"periodValueTextComparing": "[[percents.value.close]]%"
}
},
{
"title": "Volume",
"percentHeight": 30,
"marginTop": 1,
"showCategoryAxis": true,
"valueAxes": [{
"dashLength": 5
}],
"categoryAxis": {
"dashLength": 5
},
"stockGraphs": [{
"valueField": "volume",
"type": "column",
"balloonText": "Volume:[[value]]",
"fillAlphas": 1
}],
"stockLegend": {
"markerType": "none",
"markerSize": 0,
"labelText": "",
"periodValueTextRegular": "[[value.close]]"
}
}
],
"chartCursorSettings": {
"valueBalloonsEnabled": true
},
"chartScrollbarSettings": {
"graph": "g1",
"graphType": "line",
"usePeriod": "hh"
}
});
},
init: function (eleId, url) {
dataProvider.fetchData(url, function (csvData) {
var csvHeader = "Date,Open,High,Low,Close,Volume\n";
var jsonData = dataProvider.formatCSVData(csvData, csvHeader);
chartBuilder.candlestickChart.createChart(jsonData, eleId);
});
}
}
};
dataProvider = {
fetchData: function (url,callback) {
$.get(url, function (result) {
callback(result);
});
},
formatXMLData: function (xml) {
var dom = xml.firstElementChild;
var json = helper.xml2json(dom);
var cleanJson = json.replace("undefined", "");
var parsedJson = JSON.parse(cleanJson);
return parsedJson;
},
oldformatLineChartData: function (parsedJson) {
var output = [];
for (var i = 0; i < parsedJson.chart.series.value.length; i++) {
var obj = { "category": parsedJson.chart.series.value[i]["#text"] };
$.each(parsedJson.chart.graphs.graph, function (k, obj1) {
if (obj1.value[i] && obj1.value[i]["#text"])
obj[k.toString()] = parseFloat(obj1.value[i]["#text"]);
});
output.push(obj);
};
return output;
},
formatLineChartData: function (parsedJson) {
var output = [];
debugger;
for (var i = 0; i < parsedJson.chart.series.value.length; i++) {
var obj = { "category": parsedJson.chart.series.value[i]["#text"] };
$.each(parsedJson.chart.graphs.graph, function (k, obj1) {
var val = null;
$.each(obj1.value, function (m, obj2) {
if (obj2["@xid"] == parsedJson.chart.series.value[i]["@xid"])
val = parseFloat(obj2["#text"]);
});
obj[k.toString()] = val;
});
output.push(obj);
};
return output;
},
formatCSVData: function (csv,csvHeader) {
debugger;
csv = csvHeader + csv;
var json = JSON.parse(helper.CSV2JSON(csv));
return json;
},
formatintraDayData: function (parsedJson) {
var chartData = [];
$.each(parsedJson, function (index, obj) {
if (obj.Value && parseFloat(obj.Value) > 0 && obj.Volume && parseFloat(obj.Volume) > 0) {
chartData.push({
"date": new Date(obj.Date),
"value": parseFloat(obj.Value),
"volume": parseFloat(obj.Volume)
});
}
});
return chartData;
},
formatOHLCdata:function(parsedJson){
var chartData = [];
$.each(parsedJson,function(index,obj){
chartData.push({
"date":new Date(obj.Date),
"open":parseFloat(obj.Open),
"high":parseFloat(obj.High),
"low":parseFloat(obj.Low),
"close":parseFloat(obj.Close),
"volume":parseFloat(obj.Volume)
});
});
return chartData;
}
};
helper = {
parseXml: function (xml) {
var dom = null;
if (window.DOMParser) {
try {
dom = (new DOMParser()).parseFromString(xml, "text/xml");
}
catch (e) { dom = null; }
}
else if (window.ActiveXObject) {
try {
dom = new ActiveXObject('Microsoft.XMLDOM');
dom.async = false;
if (!dom.loadXML(xml)) // parse error ..
window.alert(dom.parseError.reason + dom.parseError.srcText);
}
catch (e) { dom = null; }
}
else
alert("cannot parse xml string!");
return dom;
},
xml2json: function (xml, tab) {
var X = {
toObj: function (xml) {
var o = {};
if (xml.nodeType == 1) { // element node ..
if (xml.attributes.length) // element with attributes ..
for (var i = 0; i < xml.attributes.length; i++)
o["@" + xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue || "").toString();
if (xml.firstChild) { // element has child nodes ..
var textChild = 0, cdataChild = 0, hasElementChild = false;
for (var n = xml.firstChild; n; n = n.nextSibling) {
if (n.nodeType == 1) hasElementChild = true;
else if (n.nodeType == 3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) textChild++; // non-whitespace text
else if (n.nodeType == 4) cdataChild++; // cdata section node
}
if (hasElementChild) {
if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node ..
X.removeWhite(xml);
for (var n = xml.firstChild; n; n = n.nextSibling) {
if (n.nodeType == 3) // text node
o["#text"] = X.escape(n.nodeValue);
else if (n.nodeType == 4) // cdata node
o["#cdata"] = X.escape(n.nodeValue);
else if (o[n.nodeName]) { // multiple occurence of element ..
if (o[n.nodeName] instanceof Array)
o[n.nodeName][o[n.nodeName].length] = X.toObj(n);
else
o[n.nodeName] = [o[n.nodeName], X.toObj(n)];
}
else // first occurence of element..
o[n.nodeName] = X.toObj(n);
}
}
else { // mixed content
if (!xml.attributes.length)
o = X.escape(X.innerXml(xml));
else
o["#text"] = X.escape(X.innerXml(xml));
}
}
else if (textChild) { // pure text
if (!xml.attributes.length)
o = X.escape(X.innerXml(xml));
else
o["#text"] = X.escape(X.innerXml(xml));
}
else if (cdataChild) { // cdata
if (cdataChild > 1)
o = X.escape(X.innerXml(xml));
else
for (var n = xml.firstChild; n; n = n.nextSibling)
o["#cdata"] = X.escape(n.nodeValue);
}
}
if (!xml.attributes.length && !xml.firstChild) o = null;
}
else if (xml.nodeType == 9) { // document.node
o = X.toObj(xml.documentElement);
}
else
alert("unhandled node type: " + xml.nodeType);
return o;
},
toJson: function (o, name, ind) {
var json = name ? ("\"" + name + "\"") : "";
if (o instanceof Array) {
for (var i = 0, n = o.length; i < n; i++)
o[i] = X.toJson(o[i], "", ind + "\t");
json += (name ? ":[" : "[") + (o.length > 1 ? ("\n" + ind + "\t" + o.join(",\n" + ind + "\t") + "\n" + ind) : o.join("")) + "]";
}
else if (o == null)
json += (name && ":") + "null";
else if (typeof (o) == "object") {
var arr = [];
for (var m in o)
arr[arr.length] = X.toJson(o[m], m, ind + "\t");
json += (name ? ":{" : "{") + (arr.length > 1 ? ("\n" + ind + "\t" + arr.join(",\n" + ind + "\t") + "\n" + ind) : arr.join("")) + "}";
}
else if (typeof (o) == "string")
json += (name && ":") + "\"" + o.toString() + "\"";
else
json += (name && ":") + o.toString();
return json;
},
innerXml: function (node) {
var s = ""
if ("innerHTML" in node)
s = node.innerHTML;
else {
var asXml = function (n) {
var s = "";
if (n.nodeType == 1) {
s += "<" + n.nodeName;
for (var i = 0; i < n.attributes.length; i++)
s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue || "").toString() + "\"";
if (n.firstChild) {
s += ">";
for (var c = n.firstChild; c; c = c.nextSibling)
s += asXml(c);
s += "" + n.nodeName + ">";
}
else
s += "/>";
}
else if (n.nodeType == 3)
s += n.nodeValue;
else if (n.nodeType == 4)
s += "";
return s;
};
for (var c = node.firstChild; c; c = c.nextSibling)
s += asXml(c);
}
return s;
},
escape: function (txt) {
return txt.replace(/[\\]/g, "\\\\")
.replace(/[\"]/g, '\\"')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r');
},
removeWhite: function (e) {
e.normalize();
for (var n = e.firstChild; n;) {
if (n.nodeType == 3) { // text node
if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
var nxt = n.nextSibling;
e.removeChild(n);
n = nxt;
}
else
n = n.nextSibling;
}
else if (n.nodeType == 1) { // element node
X.removeWhite(n);
n = n.nextSibling;
}
else // any other node
n = n.nextSibling;
}
return e;
}
};
if (xml.nodeType == 9) // document node
xml = xml.documentElement;
var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t");
return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}";
},
CSV2JSON: function (csv) {
var array = helper.CSVToArray(csv);
var objArray = [];
for (var i = 1; i < array.length; i++) {
objArray[i - 1] = {};
for (var k = 0; k < array[0].length && k < array[i].length; k++) {
var key = array[0][k];
objArray[i - 1][key] = array[i][k]
}
}
var json = JSON.stringify(objArray);
var str = json.replace(/},/g, "},\r\n");
return str;
},
CSVToArray: function (strData, strDelimiter) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp((
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"), "gi");
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec(strData)) {
var strMatchedDelimiter = arrMatches[1];
if (strMatchedDelimiter.length && (strMatchedDelimiter != strDelimiter)) {
arrData.push([]);
}
if (arrMatches[2]) {
var strMatchedValue = arrMatches[2].replace(
new RegExp("\"\"", "g"), "\"");
} else {
var strMatchedValue = arrMatches[3];
}
arrData[arrData.length - 1].push(strMatchedValue);
}
return (arrData);
}
};
function toggleGraphStatus(id,ele){
if(AmCharts.charts[0].getGraphById(id).hidden)
AmCharts.charts[0].showGraph(AmCharts.charts[0].getGraphById(id))
else
AmCharts.charts[0].hideGraph(AmCharts.charts[0].getGraphById(id))
}