Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
FusionChartsFree
/
Code
/
DOM
/
js
:
FusionChartsDOM.debug.js
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
/* * @author: FusionCharts Team * @description: FusionCharts DOM Manipulation script * * @publish: August 28, 2009 * @version: 1.1.0 (build: 48) */ /* * ChangeLog: * ========== * * 1.1.0 - 30/04/2009: * Made changes in architecture to fix unique id * Made changes in the way XML Islands are created * Fixed bug and escaped dataURL to support multiple parameters * Refactoring of some parameters. * Default container class name change * Addition of 'version' property * Added support for addition having FusionChartsDOM.min.js as filename * Sending FusionChartsDOM Invoker version to chart (internal) * QA1 Fixes * 21: Added ClassName forcibly for IE compatibility. * 27: Deprecated alertOnErrors and allowed accepting 0 or 1 from settings. * 31: Used the true attribute 'lang'. * 43: Added PBarLoading text that was missed out last time. * 52: Fixed double-dash issue of XML parsing for IE. * * QA47 Fixes * 89-95: Chart Messages now works from parameters * * 1.0.2 - 05/02/2009: * Added advanced RegEx parsing of CDATA * Support for ExportComponent Alias * * 1.0.1 - 05/02/2009: * Added support for non-chart objects such as 'components' * * 0.6.1 - 30/12/2008: * Bug Fix * * 0.6 - 15/12/2008: * Added FileName Friendly lookup Table 'Alias' * * 0.5 - 17/10/2008: * Added processing of chart querystrings * * 0.4.1 - 16/10/2008: * Changed "attributes" in <scripts> tag to "parameters" * * 0.4 - 01/10/2008: * Made attributes case insensitive * * 0.3 - 30/09/2008: * Final release candidate with global settings * * 0.2 - 26/09/2008: * Had to change the entire process for JS due to IE incapabilities! * * 0.1 - 23/09/2008: * First Build. Pray it works! * */ /* Check whether FusionCharts main object is already declared or not. * * Debug Info: In case you get an error, make sure - * 1. FusionChartsDOM.js (this file) is included AFTER the main FusionCharts.js * file is included. * 2. If the parent script has any modifications or errors, the main object may * be defined */ if(typeof infosoftglobal == 'undefined' || typeof infosoftglobal.FusionCharts == 'undefined') { // this string is in variable so that repeatations are not caused var ErrorMsg = "FusionChart Object was not found. Verify script inclusions."; alert(ErrorMsg); throw ErrorMsg; } // ============================================================================= // == Global Objects =========================================================== // ============================================================================= // Create FusionDOM class and map an easy to use variable to this as this is too // long of a name to be used as a workset infosoftglobal.FusionChartsDOM = {}; var FusionChartsDOM = infosoftglobal.FusionChartsDOM; // henceforth FD becomes the ref object var _FCD = infosoftglobal.FusionChartsDOM; // internal coding variable /** * Version of this JS [major, minor, revision, build] */ _FCD.version = [1, 1, 0, 41]; /** * Store and retrieve settings that are used by the FusionCharts DOM object * User can modify this section for their use. */ _FCD.Settings = { // errors can be enabled/suppressed if required debugmode: false, // the attributes supported in chart <tag> with their default values in // specific order of passing on to the fusioncharts wrapper // DEV NOTE: ANY NEW PROPERTY HERE, MUST BE REPLICATED IN "probeAttributes" // method twice parameters : { chartid: '', // programmatically generated ()no-value needed) charttype: 'Column2D', width: '400', height: '300', debugmode: '0', registerwithjs: '0', // v3 only backgroundcolor: '', scalemode: 'noScale', lang: '', detectflashversion: '', autoinstallredirect: '', chartversion: 'free', // free or v3 swfpath: 'FusionCharts/', dataurl: '', swfuri: '' // final swf path thats generated (do not change) }, xparameters: {}, // enable FD to attach itself to window.onload to render all graphs on load renderonload: true, // the message displayed before the charts are rendered loadingmessage: 'Chart not loaded.', // class applied to every container dom division created containerclassname: 'fusioncharts_container', // when set to false, if no chartId is specified, the object will raise // error autochartid: true }; //DEBUG: _FCD.xSettings = { }; /** * String resources; Separated from JS for language localization and js * compression. * DO NOT MANUALLY PUT IN ANY PROPERTY IN HERE. THE BODY DEFINITION OF THIS * OBJECT IS AT DOCUMENT END */ _FCD.R = { }; /** * Common runtime/library snippet functions that will be repeatedly and * extensively used in this script. All cross-browser functions should be * implemented here, so that debugging is faster. * DO NOT MANUALLY PUT ANY PROPERTY IN HERE. THE BODY DEFINITION OF THIS * OBJECT IS AT DOCUMENT END */ _FCD.L = { }; // ============================================================================= // == Public Functions and Variables =========================================== // ============================================================================= // Users are recommended NOT to perform any editing beyond this point. /* Array that holds global Node objects * It should cointain the properties: (as per release 0.1) * id, parameters, chartObject, swfObject, container, renderState, sourceNode */ _FCD.Nodes = Array(); /* * The initialization function that is called upon page load * Client-constructor */ _FCD.Constructor = function() { // Parse all the default settings passed via the script tag _FCD.parseSettings(); // The work of this constructor is very simple: // It calls the parseDOM method that parses all the <tags> and adds them // to the _FCD.Nodes array. _FCD.parseDOM(); // In case "renderOnLoad" is enabled in settings, then call the RenderCharts // method with forcedUpdate marked as true var $1 = _FCD.Settings.renderonload.toString(); if($1 == 'true' || $1 == '1') _FCD.RenderAllCharts(true); }; /* * this property is updated upon chart population. This helps to get the index * of a node from its char id * @param: key integer */ _FCD.indexOf = function(key) { return _FCD._indexOf[key]; }; /* * Renders charts within the <graph> tag that are in the FCD.Nodes array * @param: force boolean "force already rendered charts to re-render" */ _FCD.RenderAllCharts = function(force) { for(var i=0; i<_FCD.Nodes.length; i++) { // check whether the link is marked as already rendered // if not, then only proceed if( (_FCD.Nodes[i].renderState == true) && !force ) continue; _FCD.RenderChart(i); // call the updater function to replace proper html } }; /* * Update the HTML / re-render the chart-item specified by the arrayIndex * It simply replaces the innerHTML of the container with the html returned by * the chartObject * @param index int */ _FCD.RenderChart = function(index) { _FCD.Nodes[index].container.style.display = ''; // unhide _FCD.Nodes[index].container.innerHTML = _FCD.Nodes[index].chartObject.getSWFHTML(); // call fusionchartsutil to get access to chart object _FCD.Nodes[index].swfObject = infosoftglobal.FusionChartsUtil.getChartObject(_FCD.Nodes[index].id); _FCD.Nodes[index].renderState = true; // mark rendered }; // ============================================================================ // == Private Functions and Variables ========================================= // ============================================================================ // Users are NOT to perform any editing at this point. /* * This is an internal private propert, that holds a list of index w.r.t chartId */ _FCD._indexOf = {}; var watch1; /* * This function parses the DOM tree and correspindingly populates the * _FCD.Nodes array. * During the process, it does the required modifications w.r.t. IE. * It converts the custom tags into xmlIslands and adds all these data to * the Nodes array. */ _FCD.parseDOM = function() { // deletes the charts from objects completely. // this is risky in case the creations fail _FCD.Nodes = Array(); // get all <tags> and calls the 'process' to perform modifications var tagItems = _FCD.L.tags( _FCD.R.fcTag ); var i; // initialize counter (separate init so that this var can be reused) var newNode; for(i=0; i<tagItems.length; i++) { newNode = _FCD.processTag(tagItems[i]); _FCD.Nodes.push( newNode ); _FCD._indexOf[newNode.id] = i; // store keys in an array } // perform process on source nodes and set corresponding dataxml var sourceNodes = _FCD.processSourceNodes(); for(i=0; i<sourceNodes.length; i++) { // adding reference to source node _FCD.Nodes[i].sourceNode = sourceNodes[i]; // load data from source if(_FCD.Nodes[i].parameters.dataurl) { _FCD.Nodes[i].chartObject.setDataURL(escape(_FCD.Nodes[i].parameters.dataurl)); } else { var xmlString = _FCD.loadEmbeddedData( _FCD.Nodes[i].sourceNode ); if(!xmlString) { // error/alert not raised in case the charttype is not a chart if(!_FCD.R.chartExclusionMeta[_FCD.Nodes[i].parameters.charttype.toLowerCase()]) _FCD.notify(_FCD.R.errorNoValidData); // no need to throw error here. just notify } else { _FCD.Nodes[i].chartObject.setDataXML(xmlString); } } // DEVNOTE: IN CASE OF Internet Explorer the container links are lost upon // processing of source nodes. hence they are updated. if(_FCD.L.isIE) { _FCD.Nodes[i].container = _FCD.L.get(_FCD.Nodes[i].id +'_'+_FCD.R.containerTagName); } } }; /* * This function processes each custom chart tag and creates a FD Node out of it. * @param: tagObj object "HTML node received from getElementsByTagName" * @return property */ _FCD.processTag = function(tagObj) { // create the list of attributes. the probeAttributes method returns // all the specified attributes or the default value var newAttributes = _FCD.probeAttributes(tagObj); // read all required attributes // create a unique chart id in case id is not specified if(!newAttributes.chartid) { var $1 = _FCD.Settings.autochartid.toString(); if( $1 == 'true' || $1 == '1') newAttributes.chartid = _FCD.R.idPrefix + _FCD.L.uniqueId(); else // in case autochartid is off, throw an error { _FCD.notify(_FCD.R.errorNoChartId); throw _FCD.R.errorNoChartId; } } // compute full swf uri in case not provided if(newAttributes.swfuri=='') { newAttributes.swfuri = newAttributes.swfpath + _FCD.getSWFName(newAttributes.charttype, newAttributes.chartversion); } // create a division and append it to the required place var containerNode = _FCD.L.getNew(_FCD.R.containerTagName, 'id='+newAttributes.chartid+'_'+_FCD.R.containerTagName, 'style=display:none', // hidden (to avoid layout errors before load) 'class='+_FCD.Settings.containerclassname); containerNode.className = _FCD.Settings.containerclassname; containerNode.innerHTML = _FCD.Settings.loadingmessage; tagObj.parentNode.insertBefore(containerNode, tagObj); // append to DOM // create the chart object from the FCJS wrapper var newChart = _FCD.createChart(newAttributes); // get all chartparams and add to newchart var chartParams = _FCD.probeParameters(tagObj); for(var aParam in chartParams) { newChart.addParam(aParam, chartParams[aParam]); // also add that param to attributes list for easy access newAttributes[aParam] = chartParams[aParam]; } // get all chartvariables and add to newchart var chartVars = _FCD.probeVariables(tagObj); for(var aVar in chartVars) { newChart.addVariable(aVar, chartVars[aVar]); // also add that vars to attributes list for easy access newAttributes[aVar] = chartVars[aVar]; } // add fusionchartsdom version newChart.addVariable('FusionChartsDOM', _FCD.version.toString()); return { id: newAttributes.chartid, parameters: newAttributes, chartObject: newChart, swfObject: null, container: containerNode, renderState: false, sourceNode: null }; }; /* * This function reads the arguments from DOM node and creates a chart * @param: $1 property "list of attributes for the new chart" * @return: FusionChart */ _FCD.createChart = function($1) { // put it in try block to trap externel errors from fcjs wrapper try { // create a chart from node attributeListute values that we just excavated return new FusionCharts( $1.swfuri, $1.chartid, $1.width, $1.height, $1.debugmode, $1.registerwithjs, $1.backgroundcolor, $1.scalemode, $1.lang, $1.detectflashversion, $1.autoinstallredirect ); } catch (er) { _FCD.notify(_FCD.R.errorUnexpected + er.toString()); throw _FCD.R.errorUnexpected + er.toString(); } }; /* * This function returns an array of sourceNodes from <tags> after doing browser-specific * conversions. In case if IE, it converts to xmlIslands * @return: object "In case any browser specific modifications are rewuired it * sends the modified node(xmlIsland) else nodeList" */ _FCD.processSourceNodes = function() { // do common initial routines var allTags = _FCD.L.tags( _FCD.R.fcTag ); // loop through all fusioncharts for(var c=0; c<allTags.length; c++) { // set display style as none, to hide elements for // some browsers allTags[c].style.display='none'; } // reduce this function with lighterones depending upon the browser used if(_FCD.L.isIE) { // append a dummy xmlisland so that all fc tags can be appended here var xmlIsland = _FCD.L.getNew('xml', 'style=display:none'); document.body.appendChild(xmlIsland); // a common regex to pick up fc tags from a string var fcRegEx = new RegExp('<'+_FCD.R.fcTag+'[\\s\\S]+?<\/'+_FCD.R.fcTag+'>', 'ig'); // TODO: Parse fusioncharts using single regex // // extract all FCD Tags // not to extract tags within HTML comments / SCRIPT / Style // not to remove comments / anything within FCD tags // best of luck // alternatively doing the above in three pass // pass one: remove script/style var xmlString = document.body.innerHTML .replace(/<script[\s\S]+?<\/script>|<style[\s\S]+?<\/style>/ig, ''); // pass two: get all comments and remove those comments that have // fusioncharts tag in them var $1 = xmlString.match(/<!--[\s\S]+?-->/g); if($1) // check if any tag was returned at all { for(var i=0; i<$1.length; i++) { if($1[i].search(fcRegEx) > 0) { xmlString = xmlString = xmlString.replace($1[i], ''); } else { xmlString = xmlString.replace($1[i], '<!--'+$1[i].replace(/^<!--|-->$/g,'') .replace(/--/g,'--')+'-->'); } } } // pass three: pick the final fusioncharts tags from xmlString xmlString = xmlString.match(fcRegEx); // in case no xml is matched, returns nullstring xmlString = xmlString ? xmlString.join('') : ''; if(xmlIsland.loadXML('<root>'+xmlString+'</root>')) { allTags = xmlIsland.firstChild.childNodes; } else { // notify that inline data not loaded _FCD.notify(_FCD.R.errorInline); } } else { // self-redefinition helps to reduce browser load! allTags = _FCD.L.tags( _FCD.R.fcTag ); } // self-redefinition helps to reduce browser load! _FCD.processSourceNodes = function() { return allTags; }; return allTags; }; /* * This function fetches chart data when embedded as CDATA * @param: sourceNode object "The node from where to load data" */ _FCD.loadEmbeddedData = function(sourceNode) { try { return ( (_FCD.L.isIE) ? sourceNode.childNodes[0].childNodes[0].xml : _FCD.L.tags('data', sourceNode)[0].innerHTML) .replace(/.+CDATA\[\s*?|\s*?\]\]\s*?\-\-\>\s*?/g,''); } catch (e) { return ''; } }; /* * Looks for the required list of attributes in the DOM object and when not * found, returns a default value * @param: obj object "Node whose attributes needs be probed" * @return object */ _FCD.probeAttributes = function(obj) { var returnObj = {}; for(var $1 in _FCD.Settings.parameters) { returnObj[$1] = _FCD.L.getAttribute(obj, $1) || _FCD.Settings.parameters[$1]; } return returnObj; }; /* * Looks for the required list of swf variables in the DOM object. * @param: obj object "Node whose attributes needs be probed" * @return object */ _FCD.probeVariables = function(obj) { // @since 1.1 ChartVariables also includes parameters marked as // chart variables var returnObj = {}; var $1 = _FCD.R.chartVariables; var $2, $3; for(var c=0; c<$1.length; c++) { // make the attribute name case-safe $3 = $1[c].toLowerCase(); $2 = _FCD.L.getAttribute(obj, $3); // check whether extra parameters are defined somewhere if($2==null) { $2 = _FCD.Settings.xparameters[$3]; } if($2 != null) returnObj[$1[c]] = $2; } return returnObj; }; /* * Looks for the required list of parameters for chart and also makes sure * that values from parameters and reservedAttributes are not added * @param: obj object "Node whose attributes needs be probed" * @return array "new object parameters" */ _FCD.probeParameters = function(obj) { // it is a three stage process. // iterate through attributes, exclude constructor attributes, exclude // reserved keywords and then add the remaining to array var returnObj = {}; var c; // counter // DEVNOTE: Our great IE returns dead parameters, so create an array of // valid parameters for(c=0; c < obj.attributes.length; c++) { // do not parse invalid attributes if(!obj.attributes[c].specified) continue; // append valid values to proplist returnObj[obj.attributes[c].nodeName.toLowerCase()] = obj.attributes[c].nodeValue; } // FF is case-insenstitive for xhtml (which is w3c correct), so indivdually parse // reserved array and parameters var $1; for($1 in _FCD.Settings.parameters) { $1 = $1.toLowerCase(); if(typeof returnObj[$1] == 'undefined') continue; delete returnObj[$1]; } // remove reserved attributes var $2 = _FCD.R.reservedAttributes; for(c=0; c<$2.length; c++) { if(typeof returnObj[$2[c]] == 'undefined') continue; delete returnObj[$2[c]]; } // remove flashvars $2 = _FCD.R.chartVariables; for(c=0; c<$2.length; c++) { if(typeof returnObj[$2[c]] == 'undefined') continue; delete returnObj[$2[c]]; } return returnObj; }; /* * This method parses the settings provided at the fcSettings */ _FCD.parseSettings = function() { // locate all scripts and then find out which is the FCD script var scriptTags = _FCD.L.tags('script'); var thisScript, $2=false; // tmpVar2 = file found flag for(var j=0; j<_FCD.R.jsFileName.length; j++) { for(var i=0; i<scriptTags.length; i++) { if(scriptTags[i].src.length - (_FCD.R.jsFileName[j]).length - scriptTags[i].src.toLowerCase().indexOf(_FCD.R.jsFileName[j]) == 0) { thisScript = scriptTags[i]; $2 = true; break; // when script is found, skip searching } } if($2 == true) { break; } } // in case parsing failed, simply exit if(!thisScript) return; // convert the user settings into properties and sync each of them // the process is simple: eval the attributes from json to js properties // and then sync matching items with existing properties try { eval('var tm=null;'); // store parsed properties here eval('tm={' + (thisScript.getAttribute(_FCD.R.userSettingsTagPrefix + 'settings')||'')+'};'); _FCD.Settings = _FCD.syncProperties(_FCD.Settings, tm, _FCD.xSettings); eval('tm={' + (thisScript.getAttribute(_FCD.R.userSettingsTagPrefix + 'parameters')||'')+'};'); _FCD.Settings.parameters = _FCD.syncProperties(_FCD.Settings.parameters, tm, _FCD.Settings.xparameters); tm = null; // clean memory } catch (e) { _FCD.notify(_FCD.R.errorParseSettings + "\nDebug Info: " +e); } }; /* * This method synchronises properties from source to target * @param: target property "the property whose data is to be updated" * @param: source property "the property from which to take data" * @param: extra property "extra data from source is dumped here" * @return: property "updated target property" */ _FCD.syncProperties = function(target, source, extra) { var $1; // in case there is an extra defined, then the routine changes to // incorporate extra items for($1 in source) { if(typeof target[$1.toLowerCase()] != 'undefined') { target[$1.toLowerCase()] = source[$1]; } else { extra[$1.toLowerCase()] = source[$1]; } } return target; }; /* * Returns appropriate filename for respective chartType aliases */ _FCD.getSWFName = function(cTyp, cVer) { cTyp = cTyp.toLowerCase(); cVer = cVer.toLowerCase(); // validate at attribute level if(!_FCD.R.chartAliasMeta[cVer]) { _FCD.notify(_FCD.R.errorAlias + "\nDebug Info: Invalid parameter: ChartVersion", true); } if(!_FCD.R.chartAlias[cTyp]) { _FCD.notify(_FCD.R.errorAlias + "\nDebug Info: Invalid parameter: ChartType", true); } // get file name w.r.t. alias and as well as validate wrt version var luVal = _FCD.R.chartAlias[cTyp][ _FCD.R.chartAliasMeta[cVer][0] ]; if( typeof(luVal)=='number' ) { if(luVal == -1) { _FCD.notify(_FCD.R.errorAlias + "\nDebug Info: ChartType \"" + cTyp + "\" is not supported in ChartVersion \"" + cVer + "\"", true); } luVal = _FCD.R.chartAlias[cTyp][ luVal ]; } return _FCD.R.chartAliasMeta[cVer][1] + luVal + _FCD.R.chartAliasMeta[cVer][2]; // return after adding prefix and suffix }; /* * This function calls "alert" only if it is enabled in settings * @param: msg string "Alert message" * @param: thrw bool "Whether to throw error or not" */ _FCD.notify = function(msg, thrw) { var $1 = _FCD.Settings.debugmode.toString(), $2 = _FCD.Settings.parameters.debugmode; if($2) $2=_FCD.Settings.parameters.debugmode.toString(); if( $1 == 'true' || $1 == '1' || $2 == 'true' || $2 == '1') alert(msg); if(thrw) throw msg; }; // ============================================================================= // == Library and Resources ==================================================== // ============================================================================= /* String resources; Separated from JS for language localization and js * compression. */ _FCD.R = { // tagName for <tag> support fcTag : 'fusioncharts', // message to show in case of unexpected error errorUnexpected: 'FusionCharts Error: An unexpected error had occured '+ 'while creating chart.\nDebug Information: ', // error message when there is an error with charttype alias errorAlias: 'FusionCharts Error: There was an error processing Chart Alias', // error message when no valid datasource is found errorNoValidData: 'FusionCharts Error: Could not parse a valid data source.', // error raised when settings could not be parsed due to user error errorParseSettings: 'FusionCharts Error: Could not parse script settings.', errorNoChartId: 'FusionCharts Parameter Error: Absence of ChartId invalidates '+ '"autoChartId=true" settings.', errorInline: 'FusionCharts: Unable to parse inline data. All charts with' + 'inline data will fail to render.', // the element type in which new charts will be rendered containerTagName: 'span', // prefix for every new chartid (in acse auto id is enabled) idPrefix: 'fusioncharts_', // file name array of this script jsFileName: ['fusionchartsdom.js', 'fusionchartsdom.debug.js'], // the prefix to be used in settings and other attributes userSettingsTagPrefix: '', // these attributes will not be parsed and added to the swfobjects addparam // method (regexp) reservedAttributes: ['style', 'class', 'id', 'name', 'title', 'on.+', 'value', 'src', 'runat', 'spry:.+'], // other values: 'href', 'rel', 'dir', 'lang', 'align' , 'font', 'color', 'border', 'type', // 'size', 'alt', 'valign' chartVariables: ['XMLLoadingText', 'ParsingDataText', 'ChartNoDataText', 'RenderingChartText', 'LoadDataErrorText', 'InvalidXMLText', 'PBarLoadingText'], // meta information for chart alias table // product_name: [acess index for Alias, prefix, suffix] chartAliasMeta: { v3: [0, '', '.swf'], free: [1, 'FCF_', '.swf'] }, // charttypes that are not charts chartExclusionMeta: { exportcomponent: true }, // Chart Alias MATRIX. This method is preferred over a more efficient heuristics deviation table // because of keeping the lookup tables 'simpler to maintain' for developers unable to understand the // more complex (though more easier to compile] table. // some reference: 0 (any number above 0) stands for refering to the corresponding index for names // -1 means not available in current version chartAlias: { dragcolumn2d: ['DragColumn2D', -1], dragline: ['DragLine', -1], dragarea: ['DragArea', -1], errorbar2D: ['ErrorBar2D', -1], selectscatter: ['SelectScatter', -1], dragnode: ['DragNode', -1], kagi: ['Kagi', - 1], logcolumn2d: ['LogMSColumn2D', -1], logline2d: ['LogMSLine', -1], multilevelpie: ['MultiLevelPie' -1], multiaxisline: ['MultiAxisLine', -1], radar: ['Radar', -1], funnel: ['Funnel', 0], candlestick: ['Candlestick', 0], gantt: ['Gantt', 0], spline2d: ['Spline', -1], msspline2d: ['MSSpline', -1], splinearea2d: ['SplineArea', -1], mssplinearea2d: ['MSSplineArea', -1], inversearea2d: ['InverseMSArea', -1], inversecolumn2d: ['InverseMSColumn2D', -1], inverseline2d: ['InverseMSLine', -1], waterfall: ['Waterfall2D', -1], scatter: ['Scatter', -1], bubble: ['Bubble', -1], column3d: ['Column3D', 0], column2d: ['Column2D', 0], mscolumn3d: ['MSColumn3D', 0], mscolumn2d: ['MSColumn2D', 0], stackedbar2d: ['StackedBar2D', 0], stackedcolumn3d: ['StackedColumn3D', 0], stackedcolumn2d: ['StackedColumn2D', 0], stackedbar3d: ['StackedBar3D', -1], stackedarea2d: ['StackedArea2D', 0], stackedcolumn3dlinedy: ['StackedColumn3DLineDY', -1], // the alias name is an exception of not having suffix 3d pie2d: ['Pie2D', 0], pie3d: ['Pie3D', 0], doughnut2d: ['Doughnut2D', 0], donut2d: ['Doughnut2D', 0], doughnut3d: ['Doughnut3D', -1], donut3d: ['Doughnut3D', -1], line2d: ['Line', 0], msline2d: ['MSLine', 0], bar2d: ['Bar2D', 0], msbar2d: ['MSBar2D', 0], msbar3d: ['MSBar3D', -1], area2d: ['Area2D', 0], msarea2d: ['MSArea', 'MSArea2D'], mscombi2d: ['MSCombi2D', -1], mscombi3d: ['MSCombi3D', -1], mscombidy2d: ['MSCombiDY2D', 'MSColumn2DLineDY'], msstackedcolumn2d: ['MSStackedColumn2D', -1], msstackedcolumn2dlinedy:['MSStackedColumn2DLineDY', -1], mscolumn3dlinedy: ['MSColumn3DLineDY', 0], mscolumn3dline: ['MSColumnLine3D', -1], scrollarea2d: ['ScrollArea2D', -1], scrollcolumn2d: ['ScrollColumn2D', -1], scrollline2d: ['ScrollLine2D', -1], scrollcombi2d: ['ScrollCombi2D', -1], scrollcombidy2d: ['ScrollCombiDY2D', -1], scrollstackedcolumn2d: ['ScrollStackedColumn2D', -1], realtimearea: ['RealTimeArea', -1], realtimecolumn: ['RealTimeColumn', -1], realtimeline: ['RealTimeLine', -1], realtimestackedarea: ['RealTimeStackedArea', -1], realtimestackedcolumn: ['RealTimeStackedColumn', -1], realtimeangular: ['AngularGauge', -1], realtimebulb: ['Bulb', -1], realtimecylinder: ['Cylinder', -1], realtimehorizontalled: ['HLED', -1], realtimehorizontallinear: ['HLinearGauge', -1], realtimethermometer: ['Thermometer', -1], realtimeverticalled: ['VLED', -1], sparkline: ['SparkLine', -1], sparkcolumn: ['SparkColumn', -1], sparkwinloss: ['SparkWinLoss', -1], horizontalbullet: ['HBullet', -1], verticalbullet: ['VBullet', -1], pyramid: ['Pyramid', -1], drawingpad: ['DrawingPad', -1], exportcomponent: ['FCExporter', -1] } }; /* * Common runtime/library snippet functions that will be repeatedly and extensively * used in this script. All cross-browser functions should be implemented hers, * so that debugging is faster. */ _FCD.L = { d: document, w: window, isIE: navigator.appName == "Microsoft Internet Explorer", isFF: document.getElementById && !document.all, // attach an event to the window attachEvent: function(obj, eventName, func) { return (_FCD.L.isIE) ? obj.attachEvent('on'+eventName, func) : obj.addEventListener(eventName, func, false); }, get: function(id, obj) { return (obj || _FCD.L.d).getElementById(id); }, // implement getElementsByTagName tags: function(nm, obj) { return (obj || _FCD.L.d).getElementsByTagName(nm); }, // put getAttribute here as its not browser safe getAttribute: function(obj, attr) { return obj.getAttribute(attr); }, // put setAttribute here as its not browser safe setAttribute: function(obj, attr, val) { return obj.setAttribute(attr, val); }, // returns an unique id luid: 0, uniqueId: function() { return ++_FCD.L.luid; }, // get new dom node getNew: function(tag) { var el = _FCD.L.d.createElement(tag), arg; for(var c=1; c<arguments.length; c++) { arg = arguments[c].split('='); el.setAttribute(arg[0], arg[1]); } return el; } }; // fire the init() function upon page load _FCD.L.attachEvent( _FCD.L.w, 'load', _FCD.Constructor);