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 += ""; } 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)) }