ASPxClientWebChartControl = _aspxCreateClass(ASPxClientControl, {
 constructor: function(name){
  this.constructor.prototype.constructor.call(this, name);    
  this.ObjectHotTracked = new ASPxClientEvent();
  this.ObjectSelected = new ASPxClientEvent();
  this.printFrame = null;
  this.exportWindow = null;
 },
 GetHtmlElement : function(evt) {
  return __aspxIE ? evt.srcElement : evt.target;
 },  
 CalculateEventX: function(clickedElement, mouseEventX) {
  var left = _aspxGetAbsoluteX(clickedElement);  
  return Math.abs(mouseEventX - left);
 },
 CalculateEventY: function(clickedElement, mouseEventY) {
  var top = _aspxGetAbsoluteY(clickedElement);
  return Math.abs(mouseEventY - top);
 }, 
 OnClick : function(evt) {
  var processOnServer = this.IsServerEventAssigned("ObjectSelected");
  var mouseEventX = _aspxGetEventX(evt);
  var mouseEventY = _aspxGetEventY(evt);  
  var htmlElement = this.GetHtmlElement(evt);  
  var x = this.CalculateEventX(htmlElement, mouseEventX);
  var y = this.CalculateEventY(htmlElement, mouseEventY);  
  if(_aspxIsExists(this.RaiseObjectSelected))
   processOnServer = this.RaiseObjectSelected(x, y, htmlElement, mouseEventX, mouseEventY);
  if(processOnServer) {
   var eventParams = "SELECT:" + x + ":" + y;
   if(this.autoPostBack)
    this.SendPostBack(eventParams);
   else if(_aspxIsExists(this.callBack))
    this.ChartCallback(eventParams);
  }
 },
 OnMouseMove : function(evt) {
  if(_aspxIsExists(this.RaiseObjectHotTracked)) {
   var mouseEventX = _aspxGetEventX(evt);
   var mouseEventY = _aspxGetEventY(evt);  
   var htmlElement = this.GetHtmlElement(evt);  
   var x = this.CalculateEventX(htmlElement, mouseEventX);
   var y = this.CalculateEventY(htmlElement, mouseEventY);  
   this.RaiseObjectHotTracked(x, y, htmlElement, mouseEventX, mouseEventY);
  }
 },
   ensurePrintFrame: function() {
     if(this.printFrame == null) {
   this.printFrame = window.frames[this.createFrameElement("DXPrinter").id];
  }
 }, 
 createFrameElement: function(name) {
  var f = document.createElement("iframe");
  f.frameBorder = "0";
  f.style.overflow = "hidden";
  f.style.width = "0px";
  f.style.height = "0px";
  f.name = name;
  f.id = name;
  document.body.appendChild(f);
  return f;
 },
 getFrame: function() {
  this.ensurePrintFrame();
  return this.printFrame;
 },
 CallbackSaveToDisk: function(result) {
  this.getFrame().location = result;
 }, 
 CallbackSaveToWindow: function(result) {
  if(this.exportWindow != null && !this.exportWindow.closed) {
   this.exportWindow.location = result;
  }
 }, 
 OnCallback: function(result) {
  var printSign = "PRINT:";
  if (result.indexOf(printSign) >= 0) {
   this.CallbackSaveToDisk(result.substring(printSign.length));
   return;
  }
  var saveToDiskSign = "SAVETODISK:";
  if (result.indexOf(saveToDiskSign) >= 0) {
   this.CallbackSaveToDisk(result.substring(saveToDiskSign.length));
   return;
  }
  var saveToWindowSign = "SAVETOWINDOW:";
  if (result.indexOf(saveToWindowSign) >= 0) {
   this.CallbackSaveToWindow(result.substring(saveToWindowSign.length));
   return;
  }
  var resultParams = result.split("|");
  if(resultParams.length >= 3) {
   var htmlImage = this.GetMainElement();
   if(_aspxIsExists(htmlImage))
    htmlImage.setAttribute("src", resultParams[0]);
   var htmlField = document.getElementById(resultParams[1]);
   if(_aspxIsExists(htmlField))
    htmlField.setAttribute("value", resultParams[2]);
   if(resultParams.length >= 5) {
    this.LoadHitInfo(eval(resultParams[3]));    
    var objectModel = "";
    for(var i = 4; i < resultParams.length; i++)
     objectModel += resultParams[i];
    this.InitObjectModel(eval("(" + objectModel + ")"));
   }
  }
 },
 LoadHitInfo: function(hitInfo) {
  this.hitTestController = new ChartHitTestController(hitInfo);
 },
 InitObjectModel: function(objectModel) {
  this.chart = new ASPxClientWebChart(this, objectModel);
 },
 SetOperaCursor: function(cursor, htmlElement) {
  var divId = this.name + "_DIV";
  var div = _aspxGetElementById(divId);
  if(!_aspxIsExists(div) || (div.tagName != "DIV") || (div != htmlElement.parentNode))
   div = null;
  oldCursor = div != null ? div.style.cursor : htmlElement.style.cursor;   
  if(!_aspxIsExists(oldCursor))
   oldCursor = "default";
  if(cursor != oldCursor) {
   if(div == null) {
    div = document.createElement("div");
    div.id = divId;    
    div.style.backgroundColor = "transparent";
    div.style.border = "none";
    div.style.cursor = cursor;
    htmlElement.parentNode.replaceChild(div, htmlElement);
    div.appendChild(htmlElement);
   }
   else
    div.parentNode.replaceChild(htmlElement, div);
  }
 },
 ChartCallback: function(eventParams) {
  this.ShowLoadingPanel();
  this.CreateCallback(eventParams);
 },
 ShowLoadingPanel: function() {
  this.CreateLoadingPanelWithAbsolutePosition(this.GetMainElement().parentNode, this.GetMainElement());
 }
});
function __chartClick(evt, name) {
 var control = aspxGetControlCollection().Get(name);
 if(control != null)
  control.OnClick(evt);
}
function __chartMouseMove(evt, name) { 
 var control = aspxGetControlCollection().Get(name);
 if(control != null)
  control.OnMouseMove(evt);
}
ASPxClientScaleType = _aspxCreateClass(null, {});
ASPxClientScaleType.Qualitative = "Qualitative";
ASPxClientScaleType.Numerical = "Numerical";
ASPxClientScaleType.DateTime = "DateTime";
ASPxClientAlignment = _aspxCreateClass(null, {});
ASPxClientAlignment.Near = "Near";
ASPxClientAlignment.Center = "Center";
ASPxClientAlignment.Far = "Far";
ASPxClientTitleDockStyle = _aspxCreateClass(null, {});
ASPxClientTitleDockStyle.Left = "Left";
ASPxClientTitleDockStyle.Top = "Top";
ASPxClientTitleDockStyle.Right = "Right";
ASPxClientTitleDockStyle.Bottom = "Bottom";
ASPxClientValueLevel = _aspxCreateClass(null, {});
ASPxClientValueLevel.Value = "Value";
ASPxClientValueLevel.Value_1 = "Value_1";
ASPxClientValueLevel.Value_2 = "Value_2";
ASPxClientValueLevel.Low = "Low";
ASPxClientValueLevel.High = "High";
ASPxClientValueLevel.Open = "Open";
ASPxClientValueLevel.Close = "Close";
ASPxClientWebChartControl.prototype.GetChart = function() {
 return this.chart;
};
ASPxClientWebChartControl.prototype.SetCursor = function(cursor) {   
 var htmlElement = this.GetMainElement();
 if(_aspxIsExists(htmlElement)) {
  if(__aspxOpera)
   this.SetOperaCursor(cursor, htmlElement);
  else
   htmlElement.style.cursor = cursor;
 }
};
ASPxClientWebChartControl.prototype.RaiseObjectHotTracked = function(x, y, htmlElement, absoluteX, absoluteY) {
 var hitObjects = this.HitTest(x, y);
 if(hitObjects == null)
  return;
 var hitInfo = new ASPxClientWebChartHitInfo(hitObjects);
 for(var i = 0; i < hitObjects.length; i++) {
  var args = new ASPxClientWebChartControlHotTrackEventArgs(
   false,
   hitObjects[i].object, 
   hitObjects[i].additionalObject, 
   hitInfo,
   this.chart,
   htmlElement, 
   x, y, 
   absoluteX, absoluteY);
  this.ObjectHotTracked.FireEvent(this, args);
  if(!args.cancel)
   break;
 }
};
ASPxClientWebChartControl.prototype.RaiseObjectSelected = function(x, y, htmlElement, absoluteX, absoluteY) {
 var processOnServer = this.IsServerEventAssigned("ObjectSelected"); 
 var hitObjects = this.HitTest(x, y);
 if(hitObjects == null)
  return processOnServer;
 var hitInfo = new ASPxClientWebChartHitInfo(hitObjects);
 for(var i = 0; i < hitObjects.length; i++) {
  var args = new ASPxClientWebChartControlHotTrackEventArgs(
   processOnServer,
   hitObjects[i].object, 
   hitObjects[i].additionalObject,   
   hitInfo,
   this.chart,
   htmlElement, 
   x, y, 
   absoluteX, absoluteY);
  this.ObjectSelected.FireEvent(this, args);
  processOnServer = args.processOnServer;
  if(!args.cancel)
   break;
 }
 return processOnServer;
};
ASPxClientWebChartControl.prototype.HitTest = function(x, y) {
 if(_aspxIsExists(this.hitTestController))
  return this.hitTestController.HitTest(x, y);
 else
  return null;
};
ASPxClientWebChartControl.prototype.PerformCallback = function(args) {
 if (!_aspxIsExists(this.callBack)) return;  
 if (!_aspxIsExists(args)) args = "";
 this.ChartCallback("CUSTOMCALLBACK:" + args);
};
ASPxClientWebChartControl.prototype.Print = function() {
 if (!_aspxIsExists(this.callBack)) return;  
 this.ChartCallback("PRINT");
};
ASPxClientWebChartControl.prototype.SaveToDisk = function(format, filename) {
 if (!_aspxIsExists(this.callBack)) return;
 if (filename == undefined)
  this.ChartCallback("SAVETODISK:" + format + ":");
 else 
  this.ChartCallback("SAVETODISK:" + format + ":" + filename);
};
ASPxClientWebChartControl.prototype.SaveToWindow = function(format) {
 if (!_aspxIsExists(this.callBack)) return;  
 this.exportWindow = window.open('', '_blank', 'toolbars=no, resizable=yes, scrollbars=yes');
 this.ChartCallback("SAVETOWINDOW:" + format);
};
ASPxClientWebChartControl.prototype.GetMainDOMElement = function() {
 return this.GetMainElement();
}
ASPxClientWebChartControlHotTrackEventArgs = _aspxCreateClass(ASPxClientProcessingModeEventArgs, {
 constructor: function(processOnServer, hitObject, additionalHitObject, hitInfo, chart, htmlElement, x, y, absoluteX, absoluteY) {
  this.constructor.prototype.constructor.call(this, processOnServer);
  this.hitObject = hitObject;  
  this.additionalHitObject = additionalHitObject;
  this.hitInfo = hitInfo;
  this.chart = chart;
  this.htmlElement = htmlElement;
  this.x = x;
  this.y = y;
  if(typeof(absoluteX) != "undefined")
   this.absoluteX = absoluteX;
  else
   this.absoluteX = 0;
  if(typeof(absoluteY) != "undefined")  
   this.absoluteY = absoluteY;
  else
   this.absoluteY = 0;
  this.cancel = false;
 }
});
ASPxClientHitObject = _aspxCreateClass(null, {
 constructor: function(object, additionalObject) {
  this.object = object;
  this.additionalObject = additionalObject;
 }
});
ASPxClientWebChartHitInfo = _aspxCreateClass(null, {
 constructor: function(hitObjects) {
  this.inChart = false;
  this.inChartTitle = false;
  this.inAxis = false;
  this.inAxisLabelItem = false;
  this.inAxisTitle = false;
  this.inConstantLine = false;
  this.inDiagram = false;
  this.inNonDefaultPane = false;
  this.inLegend = false;
  this.inSeries = false;
  this.inSeriesLabel = false;
  this.inSeriesPoint = false;
  this.inSeriesTitle = false;
  this.inTrendLine = false;
  this.inFibonacciIndicator = false;
  this.inRegressionLine = false;
  for(var i = 0; i < hitObjects.length; i++) {
   if(hitObjects[i].object instanceof ASPxClientWebChart)
    this.inChart = true;
   else if(hitObjects[i].object instanceof ASPxClientChartTitle)
    this.inChartTitle = true;
   else if(
    (hitObjects[i].object instanceof ASPxClientAxis) || 
    (hitObjects[i].object instanceof ASPxClientAxis3D) || 
    (hitObjects[i].object instanceof ASPxClientRadarAxis))
    this.inAxis = true;
   else if(hitObjects[i].object instanceof ASPxClientConstantLine)
    this.inConstantLine = true;
   else if(
    (hitObjects[i].object instanceof ASPxClientSimpleDiagram) || 
    (hitObjects[i].object instanceof ASPxClientXYDiagram) || 
    (hitObjects[i].object instanceof ASPxClientXYDiagram3D) || 
    (hitObjects[i].object instanceof ASPxClientRadarDiagram))
    this.inDiagram = true;
   else if(hitObjects[i].object instanceof ASPxClientXYDiagramPane)
    this.inNonDefaultPane = true;
   else if(hitObjects[i].object instanceof ASPxClientLegend)
    this.inLegend = true;
   else if(hitObjects[i].object instanceof ASPxClientSeries)
    this.inSeries = true;
   else if(hitObjects[i].object instanceof ASPxClientSeriesLabel)
    this.inSeriesLabel = true;
   else if(hitObjects[i].object instanceof ASPxClientSeriesTitle)
    this.inSeriesTitle = true;
   else if(hitObjects[i].object instanceof ASPxClientTrendLine)
    this.inTrendLine = true;
   else if(hitObjects[i].object instanceof ASPxClientFibonacciIndicator)
    this.inFibonacciIndicator = true;
   else if(hitObjects[i].object instanceof ASPxClientRegressionLine)
    this.inRegressionLine = true;
   if(hitObjects[i].additionalObject != null) {
    if(hitObjects[i].additionalObject instanceof ASPxClientSeriesPoint)
     this.inSeriesPoint = true;    
    if(hitObjects[i].additionalObject instanceof ASPxClientAxisLabelItem)
     this.inAxisLabelItem = true;
    if(hitObjects[i].additionalObject instanceof ASPxClientAxisTitle)
     this.inAxisTitle = true;
   }     
  }
 }
});
ASPxClientDiagramCoordinates = _aspxCreateClass(null, {
 constructor: function() {
  this.argumentScaleType = '';
  this.valueScaleType = '';
  this.qualitativeArgument = '';
  this.numericalArgument = 0;
  this.dateTimeArgument = null;
  this.numericalValue = 0;
  this.dateTimeValue = null;
 },
 IsEmpty: function() {
  return this.argumentScaleType == '';
 }
});
ASPxClientWebChartElement = _aspxCreateClass(null, {
 constructor: function(chart, interimObject) {
  this.chart = chart;  
  if(_aspxIsExists(interimObject)) {
   this.InitializeProperties(interimObject);
   this.InitializeHitObjects(interimObject);
  }
  else
   this.InitializeDefault();
 },
 InitializeProperties: function(interimObject) {
  throw "ASPxClientWebChartElement abstract error";
 },
 InitializeDefault: function() {
  throw "ASPxClientWebChartElement abstract error";
 },
 InitializeHitObjects: function(interimObject) {
  var chartControl = this.chart != null ? this.chart.chartControl : this.chartControl;
  if(_aspxIsExists(chartControl)) {
   if(_aspxIsExists(chartControl.hitTestController)) {
    var hitTestController = chartControl.hitTestController;
    if(_aspxIsExists(interimObject.hi))
     hitTestController.objects[interimObject.hi] = this;
    else if(_aspxIsExists(interimObject.hia))
     hitTestController.additionalObjects[interimObject.hia] = this;
   }
  }  
 },
 CreateArray: function(interimArray, createArrayItem) {
  if(!_aspxIsExists(interimArray))
   return [];
  if(!(interimArray instanceof Array))
   throw ASPxClientWebChartElement.objectModelError;     
  var result = new Array();
  for(var i = 0; i < interimArray.length; i++)
   result.push(createArrayItem(this.chart, this, interimArray[i]));
  return result;   
 }
});
ASPxClientWebChartElement.objectModelError = "Client object model error";
ASPxClientWebChartEmptyElement = _aspxCreateClass(ASPxClientWebChartElement, {
 constructor: function(chart, interimObject) {
  this.constructor.prototype.constructor.call(this, chart, interimObject);
 },
 InitializeProperties: function(interimObject) {
 },
 InitializeDefault: function() {
 }
});
ASPxClientWebChartRequiredElement = _aspxCreateClass(ASPxClientWebChartElement, {
 constructor: function(chart, interimObject) {
  this.constructor.prototype.constructor.call(this, chart, interimObject);
 },
 InitializeDefault: function() {
  throw ASPxClientWebChartElement.objectModelError;
 } 
});
ASPxClientWebChartElementNamed = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, interimObject) {
  this.constructor.prototype.constructor.call(this, chart, interimObject);
 },
 InitializeProperties: function(interimObject) {
  if(!_aspxIsExists(interimObject.n))
   throw ASPxClientWebChartElement.objectModelError;
  this.name = interimObject.n;
 }
});
ASPxClientWebChart = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chartControl, interimChart) {
  this.chartControl = chartControl; 
  this.constructor.prototype.constructor.call(this, null, interimChart);
 },
 InitializeProperties: function(interimObject) {
  this.diagram = 
   _aspxIsExists(interimObject.d) ? 
   this.CreateXYDiagram(interimObject.d) : 
   new ASPxClientSimpleDiagram(this);
  this.series = this.CreateSeriesArray(interimObject.s);
  this.titles = this.CreateTitles(interimObject.ti);
  this.legend = new ASPxClientLegend(this, interimObject.l);
  this.appearanceName = interimObject.an;
  this.paletteName = interimObject.pn;
 },
 CreateXYDiagram: function(interimXYDiagram) {
  if(interimXYDiagram.t == "XYD")
   return new ASPxClientXYDiagram(this, interimXYDiagram);
  else if(interimXYDiagram.t == "XYD3")
   return new ASPxClientXYDiagram3D(this, interimXYDiagram);
  else if(interimXYDiagram.t == "RD")
   return new ASPxClientRadarDiagram(this, interimXYDiagram);
  else
   throw ASPxClientWebChartElement.objectModelError;
 },
 CreateSeriesArray: function(interimSeriesArray) {
  return this.CreateArray(interimSeriesArray, function(nullChart, chart, intermSeries) {
   return new ASPxClientSeries(chart, intermSeries);
  });
 },
 CreateTitles: function(interimTitles) {
  return this.CreateArray(interimTitles, function(nullChart, chart, interimTitle) {
   return new ASPxClientChartTitle(chart, interimTitle);
  });
 }
});
ASPxClientSimpleDiagram = _aspxCreateClass(ASPxClientWebChartEmptyElement, {
 constructor: function(chart) {
  this.constructor.prototype.constructor.call(this, chart);
 }
});
ASPxClientXYDiagramBase = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, interimXYDiagram) {
  this.constructor.prototype.constructor.call(this, chart, interimXYDiagram);
 },
 InitializeProperties: function(interimObject) {
  this.axisX = this.CreateAxis(interimObject.x);
  this.axisY = this.CreateAxis(interimObject.y);
 },
 CreateAxis: function(interimAxis) {
  throw "ASPxClientXYDiagramBase abstract error";
 }
});
ASPxClientXYDiagram = _aspxCreateClass(ASPxClientXYDiagramBase, {
 constructor: function(chart, interimXYDiagram) {
  this.constructor.prototype.constructor.call(this, chart, interimXYDiagram);
 },
 InitializeProperties: function(interimObject) {
  ASPxClientXYDiagramBase.prototype.InitializeProperties.call(this, interimObject);
  if (!_aspxIsExists(interimObject.dr))
   throw ASPxClientWebChartElement.objectModelError;
  this.secondaryAxesX = this.CreateSecondaryAxes(interimObject.sx);
  this.secondaryAxesY = this.CreateSecondaryAxes(interimObject.sy);
  this.defaultPane = new ASPxClientXYDiagramPane(this.chart, this, interimObject.dp);
  this.panes = this.CreatePanes(interimObject.pa);
  this.rotated = interimObject.dr;  
 },
 CreateAxis: function(interimAxis) {
  return new ASPxClientAxis(this.chart, this, interimAxis);
 },
 CreateSecondaryAxes: function(interimSecondaryAxes) {
  return this.CreateArray(interimSecondaryAxes, function(chart, diagram, interimSecondaryAxis) {
   return new ASPxClientAxis(chart, diagram, interimSecondaryAxis);
  });
 },
 CreatePanes: function(interimPanes) {
  return this.CreateArray(interimPanes, function(chart, diagram, interimPane) {
   return new ASPxClientXYDiagramPane(chart, diagram, interimPane);
  });
 },
 FindPaneByXY: function(x, y) {
  if(this.defaultPane.InPane(x, y))
   return this.defaultPane;
  for(var i = 0; i < this.panes.length; i++)
   if(this.panes[i].InPane(x, y))
    return this.panes[i];
  return null;    
 },
 FindAxisXByID: function(axisID) {
  if(this.axisX.axisID == axisID) 
   return this.axisX;
  for(var i = 0; i < this.secondaryAxesX.length; i++)
   if(this.secondaryAxesX[i].axisID == axisID)
    return this.secondaryAxesX[i];
  return null;
 },
 FindAxisYByID: function(axisID) {
  if(this.axisY.axisID == axisID) 
   return this.axisY;
  for(var i = 0; i < this.secondaryAxesY.length; i++)
   if(this.secondaryAxesY[i].axisID == axisID)
    return this.secondaryAxesY[i];
  return null;
 },
 PointToDiagram: function(x, y) {
  var coordinates = new ASPxClientDiagramCoordinates();
  var pane = this.FindPaneByXY(x, y);
  if(pane == null)
   return coordinates;
  var primaryAxisX = this.FindAxisXByID(pane.primaryAxisXID);
  var primaryAxisY = this.FindAxisYByID(pane.primaryAxisYID);
  if(primaryAxisX == null || primaryAxisY == null)
   return coordinates;  
  x -= pane.boundsLeft;
  y -= pane.boundsTop;
  var xRatio = x / pane.boundsWidth;
  var yRatio = 1.0 - y / pane.boundsHeight;
  if (this.rotated) {
   var temp = xRatio;
   xRatio = yRatio;
   yRatio = temp;
  }
  if (primaryAxisX.reverse)
   xRatio = 1.0 - xRatio;
  if (primaryAxisY.reverse)
   yRatio = 1.0 - yRatio;
  var argumentInternal = primaryAxisX.range.GetInternalValue(xRatio);
  var valueInternal = primaryAxisY.range.GetInternalValue(yRatio);
  var argument = primaryAxisX.GetNativeArgument(argumentInternal);
  var value = primaryAxisY.GetNativeArgument(valueInternal);
  if (typeof(argument) == 'string') {
   coordinates.qualitativeArgument = argument;  
   coordinates.argumentScaleType = ASPxClientScaleType.Qualitative;
  }
  else if (argument instanceof Date) {
   coordinates.dateTimeArgument = argument;
   coordinates.argumentScaleType = ASPxClientScaleType.DateTime;
  }
  else {
   coordinates.numericalArgument = argument;
   coordinates.argumentScaleType = ASPxClientScaleType.Numerical;
  }
  if (value instanceof Date) {
   coordinates.dateTimeValue = value;
   coordinates.valueScaleType = ASPxClientScaleType.DateTime;
  }
  else {
   coordinates.numericalValue = value;
   coordinates.valueScaleType = ASPxClientScaleType.Numerical;
  }  
  return coordinates;
 }
});
ASPxClientXYDiagramPane = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor : function(chart, diagram, interimPane) {
  this.constructor.prototype.constructor.call(this, chart, interimPane);
  this.diagram = diagram;
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  this.primaryAxisXID = interimObject.paxi;
  this.primaryAxisYID = interimObject.payi;
  if (_aspxIsExists(interimObject.dx))
   this.boundsLeft = interimObject.dx;
  if (_aspxIsExists(interimObject.dy))
   this.boundsTop = interimObject.dy;
  if (_aspxIsExists(interimObject.dw))
   this.boundsWidth = interimObject.dw;
  if (_aspxIsExists(interimObject.dh))
   this.boundsHeight = interimObject.dh;
 },
 InPane: function(x, y) {
  if(_aspxIsExists(this.boundsLeft) && _aspxIsExists(this.boundsTop) && 
   _aspxIsExists(this.boundsWidth) && _aspxIsExists(this.boundsHeight) && 
   (this.boundsWidth > 0) && (this.boundsHeight > 0)) {
   x -= this.boundsLeft;
   y -= this.boundsTop;
   return (x >= 0) && (x <= this.boundsWidth) && (y >= 0) && (y <= this.boundsHeight);
  }
  return false;
 }
});
ASPxClientXYDiagram3D = _aspxCreateClass(ASPxClientXYDiagramBase, {
 constructor: function(chart, interimXYDiagram) {
  this.constructor.prototype.constructor.call(this, chart, interimXYDiagram);
 },
 CreateAxis: function(interimAxis) {  
  return new ASPxClientAxis3D(this.chart, this, interimAxis);
 }
});
ASPxClientRadarDiagram = _aspxCreateClass(ASPxClientXYDiagramBase, {
 constructor: function(chart, interimXYDiagram) {
  this.constructor.prototype.constructor.call(this, chart, interimXYDiagram);
 },
 CreateAxis: function(interimAxis) {
  return new ASPxClientRadarAxis(this.chart, this, interimAxis);  
 }
});
ASPxClientQualitativeMap = _aspxCreateClass(null, {
 constructor: function(interimMap) {
  if (!_aspxIsExists(interimMap.vl))
   throw ASPxClientWebChartElement.objectModelError;
  this.values = interimMap.vl;   
 },
 GetNativeValue: function(internalValue) {
  var roundedValue = Math.round(internalValue);
  return (roundedValue < 0 || roundedValue >= this.values.length) ? null : this.values[roundedValue];
 }
});
ASPxClientNumericalMap = _aspxCreateClass(null, {
 constructor: function(interimMap) {
  if(!_aspxIsExists(interimMap.l))
   throw ASPxClientWebChartElement.objectModelError;
  this.logarithmic = interimMap.l;
  if(this.logarithmic) {
   if(!_aspxIsExists(interimMap.lb) || !_aspxIsExists(interimMap.mlv))
    throw ASPxClientWebChartElement.objectModelError;
   this.logarithmicBase = interimMap.lb;
   this.minLogValue = interimMap.mlv;
  } 
 },
 GetValueSign: function(value) {
  if(value < 0) 
   return -1;
  if(value > 0) 
   return 1;
  return 0;
 },
 TransformBackward: function(value) {
  return isFinite(value) ? Math.pow(this.logarithmicBase, Math.abs(value) + this.minLogValue) * this.GetValueSign(value) : value;
 },
 GetNativeValue: function(internalValue) {
  return this.logarithmic ? this.TransformBackward(internalValue) : internalValue;
 }
});
ASPxClientDateTimeMap = _aspxCreateClass(null, {
 constructor: function(interimMap) {
  if (!_aspxIsExists(interimMap.su) || !_aspxIsExists(interimMap.sa) || !_aspxIsExists(interimMap.sv))
   throw ASPxClientWebChartElement.objectModelError;
  this.measureUnit = interimMap.su;
  this.gridAlignment = interimMap.sa;
  this.startDate = interimMap.sv;
 },
 Round: function(dateTime) {
  var initialDateTime = dateTime;
  if (this.measureUnit != 'Millisecond') {
   if (dateTime.getUTCMilliseconds() >= 500)
    dateTime.setUTCSeconds(dateTime.getUTCSeconds() + 1);
   dateTime.setUTCMilliseconds(0);
   if (this.measureUnit != 'Second') {
    if (dateTime.getUTCSeconds() >= 30)
     dateTime.setUTCMinutes(dateTime.getUTCMinutes() + 1);
    dateTime.setUTCSeconds(0);
    if (this.measureUnit != 'Minute') {
     if (dateTime.getUTCMinutes() >= 30)
      dateTime.setUTCHours(dateTime.getUTCHours() + 1);
     dateTime.setMinutes(0);
     if (this.measureUnit != 'Hour') {
      if (dateTime.getUTCHours() >= 12)
       dateTime.setUTCDate(dateTime.getUTCDate() + 1);
      dateTime.setUTCHours(0);
      if (this.measureUnit != 'Day') {
       if (this.measureUnit == 'Week')
        dateTime.setUTCDate(dateTime.getUTCDate() - dateTime.getUTCDay());
       else {
        var half;
        if (dateTime.getUTCMonth() == 2)
         half = 15;
        else
         half = 16;
        if (dateTime.getUTCDate() >= half)
         dateTime.setUTCMonth(dateTime.getUTCMonth() + 1);
        dateTime.setUTCDate(1);
        if (this.measureUnit != 'Month') {
         if (this.measureUnit == 'Quarter')
          dateTime.setUTCMonth(Math.floor(dateTime.getUTCMonth() / 3) * 3);
         else if (this.measureUnit == 'Year') {
          if (dateTime.getUTCMonth() >= 6)
           dateTime.setUTCFullYear(dateTime.getUTCFullYear() + 1);
          dateTime.setMonth(0);
         }
         else
          return initialDate;
        }           
       }
      }
     }
    }
   }
  }
  return dateTime;
 },
 GetDate: function(n) {
  return new Date(this.startDate.getTime() + n);
 },
 GetMonth: function(n) {
  var monthsCount = Math.abs(n);
  var years = Math.floor(monthsCount / 12);
  var monthsFractional = monthsCount - years * 12;
  var months = Math.floor(monthsFractional);
  var fraction = monthsFractional - months;
  if (n < 0) {
   years = -years;
   months = -months;
   fraction = -fraction;
  }
  var year = this.startDate.getUTCFullYear() + years;
  var month = this.startDate.getUTCMonth() + months;
  if (month < 0) {
   year = year - 1;
   month = month + 12;
  }
  else if (month >= 12) {
   year = year + 1;
   month = month - 12;
  }
  var result = new Date(Date.UTC(year, month, 1));
  if (fraction < 0) {
   var previousMonth;
   if (month == 0) 
    previousMonth = new Date(Date.UTC(year - 1, 11, 1));
   else 
    previousMonth = new Date(Date.UTC(year, month - 1, 1));
   return new Date(result.getTime() + (result.getTime() - previousMonth.getTime()) * fraction);
  }
  else {
   var nextMonth;
   if (month == 11) 
    nextMonth = new Date(Date.UTC(year + 1, 1, 1));
   else 
    nextMonth = new Date(Date.UTC(year, month + 1, 1));
   return new Date(result.getTime() + (nextMonth.getTime() - result.getTime()) * fraction);
  }
 },
 GetNativeValue: function(internalValue) {
  var nativeValue;
  if (this.gridAlignment == 'Year')
   nativeValue = this.GetMonth(internalValue * 12);
  else if (this.gridAlignment == 'Quarter')
   nativeValue = this.GetMonth(internalValue * 3);
  else if (this.gridAlignment == 'Month')
   nativeValue = this.GetMonth(internalValue);
  else if (this.gridAlignment == 'Week')
   nativeValue = this.GetDate(internalValue * 1000 * 60 * 60 * 24 * 7);
  else if (this.gridAlignment == 'Day')
   nativeValue = this.GetDate(internalValue * 1000 * 60 * 60 * 24);
  else if (this.gridAlignment == 'Hour')
   nativeValue = this.GetDate(internalValue * 1000 * 60 * 60);
  else if (this.gridAlignment == 'Minute')
   nativeValue = this.GetDate(internalValue * 1000 * 60);
  else if (this.gridAlignment == 'Second')
   nativeValue = this.GetDate(internalValue * 1000);
  else if (this.gridAlignment == 'Millisecond')
   nativeValue = this.GetDate(internalValue);
  else 
   nativeValue = this.GetDate(0);
  return this.Round(nativeValue);
 }
});
ASPxClientAxisBase = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor: function(chart, diagram, interimAxis) {
  this.constructor.prototype.constructor.call(this, chart, interimAxis);
  this.diagram = diagram;
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  if (!_aspxIsExists(interimObject.r))
   throw ASPxClientWebChartElement.objectModelError;
  this.range = new ASPxClientAxisRange(this.chart, this, interimObject.r);
  if (_aspxIsExists(interimObject.m))
   this.scale = this.CreateMap(interimObject.m);
  if (_aspxIsExists(interimObject.l))
   this.labelItems = this.CreateLabelItems(interimObject.l);
 },
 CreateMap: function(interimMap) {
  if (interimMap.t == "N")
   return new ASPxClientNumericalMap(interimMap);
  if (interimMap.t == "Q")
   return new ASPxClientQualitativeMap(interimMap);
  if (interimMap.t == "D")
   return new ASPxClientDateTimeMap(interimMap);
  throw ASPxClientWebChartElement.objectModelError;
 },
 CreateLabelItems: function(interimLabelItems) {
   return this.CreateArray(interimLabelItems, createLabelItem = function(chart, axis, interimLabelItem) {
   return new ASPxClientAxisLabelItem(chart, axis, interimLabelItem);
  });
 },
 GetNativeArgument: function(value) {
  return (this.scale == null) ? value : this.scale.GetNativeValue(value);
 }
});
ASPxClientAxis = _aspxCreateClass(ASPxClientAxisBase, {
 constructor: function(chart, diagram, interimAxis) {
  this.constructor.prototype.constructor.call(this, chart, diagram, interimAxis);
 },
 InitializeProperties: function(interimObject) {
  ASPxClientAxisBase.prototype.InitializeProperties.call(this, interimObject);
  if (!_aspxIsExists(interimObject.ar) || !_aspxIsExists(interimObject.t))
   throw ASPxClientWebChartElement.objectModelError;
  this.axisTitle = new ASPxClientAxisTitle(this.chart, this, interimObject.t);
  this.title = this.axisTitle.text;
  this.strips = this.CreateStrips(interimObject.s);  
  this.constantLines = this.CreateConstantLines(interimObject.cl);  
  this.reverse = interimObject.ar;
  this.axisID = interimObject.id;
 },
 CreateStrips: function(interimStrips) {
  return this.CreateArray(interimStrips, createStrip = function(chart, axis, interimStrip) {
   return new ASPxClientStrip(chart, axis, interimStrip);
  });
 },
 CreateConstantLines: function(interimConstantLines) {
  return this.CreateArray(interimConstantLines, function(chart, axis, interimConstantLine) {
   return new ASPxClientConstantLine(chart, axis, interimConstantLine);
  });
 }
});
ASPxClientAxis3D = _aspxCreateClass(ASPxClientAxisBase, {
 constructor: function(chart, diagram, interimAxis) {
  this.constructor.prototype.constructor.call(this, chart, diagram, interimAxis);
 }
});
ASPxClientRadarAxis = _aspxCreateClass(ASPxClientAxisBase, {
 constructor: function(chart, diagram, interimAxis) {
  this.constructor.prototype.constructor.call(this, chart, diagram, interimAxis);
 }
});
ASPxClientAxisTitle = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, axis, interimAxisTitle) {
  this.constructor.prototype.constructor.call(this, chart, interimAxisTitle);
  this.axis = axis;    
 },
 InitializeProperties: function(interimObject) {  
  if (!_aspxIsExists(interimObject.tx))
   throw ASPxClientWebChartElement.objectModelError;
  this.text = interimObject.tx;
 }
});
ASPxClientAxisLabelItem = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, axis, interimLabelItem) {
  this.constructor.prototype.constructor.call(this, chart, interimLabelItem);
  this.axis = axis;    
 },
 InitializeProperties: function(interimObject) {  
  if (!_aspxIsExists(interimObject.tx) || !_aspxIsExists(interimObject.av) || !_aspxIsExists(interimObject.iv))
   throw ASPxClientWebChartElement.objectModelError;
  this.text = interimObject.tx;
  this.axisValue = interimObject.av;
  this.axisValueInternal = interimObject.iv;
 }
});
ASPxClientAxisRange = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, axis, interimRange) {
  this.constructor.prototype.constructor.call(this, chart, interimRange);
  this.axis = axis;    
 },
 InitializeProperties: function(interimObject) {  
  if (!_aspxIsExists(interimObject.ii) || !_aspxIsExists(interimObject.ia))
   throw ASPxClientWebChartElement.objectModelError;
  this.minValue = interimObject.mi;
  this.maxValue = interimObject.ma;
  this.minValueInternal = interimObject.ii;
  this.maxValueInternal = interimObject.ia;
 },
 GetInternalValue: function(ratio) {
  return this.minValueInternal + (this.maxValueInternal - this.minValueInternal) * ratio;
 }
});
ASPxClientStrip = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor: function(chart, axis, interimStrip) {
  this.constructor.prototype.constructor.call(this, chart, interimStrip);
  this.axis = axis;
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  if(_aspxIsExists(interimObject.mi))
   this.minValue = interimObject.mi;
  if(_aspxIsExists(interimObject.ma))   
   this.maxValue = interimObject.ma;   
 }
});
ASPxClientConstantLine = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor: function(chart, axis, interimConstantLine) {
  this.constructor.prototype.constructor.call(this, chart, interimConstantLine);
  this.axis = axis;
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  if(!_aspxIsExists(interimObject.v))
   throw ASPxClientWebChartElement.objectModelError;
  this.value = interimObject.v;
  this.title = _aspxIsExists(interimObject.ti) ? interimObject.ti : "";
 }
});
ASPxClientSeries = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor: function(chart, interimSeries) {
  this.constructor.prototype.constructor.call(this, chart, interimSeries);
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  this.viewType = _aspxIsExists(interimObject.v) ? interimObject.v : "Bar";
  this.argumentScaleType = _aspxIsExists(interimObject.as) ? interimObject.as : "Qualitative";
  this.valueScaleType = _aspxIsExists(interimObject.vs) ? interimObject.vs : "Numerical";
  if(_aspxIsExists(interimObject.ax))
   this.axisX = interimObject.ax;
  if(_aspxIsExists(interimObject.ay))
   this.axisY = interimObject.ay;
  if(_aspxIsExists(interimObject.pa))
   this.pane = interimObject.pa;
  this.visible = !_aspxIsExists(interimObject.nvi);
  this.label = new ASPxClientSeriesLabel(this.chart, this, interimObject.l);
  this.points = this.CreatePoints(interimObject.p);
  if(_aspxIsExists(interimObject.ti))
   this.titles = this.CreateTitles(interimObject.ti);
  if(_aspxIsExists(interimObject.tr))
   this.trendLines = this.CreateTrendLines(interimObject.tr);
  if(_aspxIsExists(interimObject.fi))
   this.fibonacciIndicators = this.CreateFibonacciIndicators(interimObject.fi);
  if(_aspxIsExists(interimObject.rl))
   this.regressionLines = this.CreateRegressionLines(interimObject.rl);
 },
 CreatePoints: function(interimPoints) {
  return this.CreateArray(interimPoints, createPoint = function(chart, series, interimPoint) {
   return new ASPxClientSeriesPoint(chart, series, interimPoint);
  });
 },
 CreateTitles: function(interimTitles) {
  return this.CreateArray(interimTitles, createTitle = function(chart, series, interimTitle) {
   return new ASPxClientSeriesTitle(chart, series, interimTitle);
  });
 },
 CreateTrendLines: function(interimTrendLines) {
  return this.CreateArray(interimTrendLines, createTrendLine = function(chart, series, interimTrendLine) {
   return new ASPxClientTrendLine(chart, series, interimTrendLine);
  });
 },
 CreateFibonacciIndicators: function(interimFibonacciIndicators) {
  return this.CreateArray(interimFibonacciIndicators, createFibonacciIndicator = function(chart, series, interimFibonacciIndicator) {
   return new ASPxClientFibonacciIndicator(chart, series, interimFibonacciIndicator);
  });
 },
 CreateRegressionLines: function(interimRegressionLines) {
   return this.CreateArray(interimRegressionLines, createRegressionLine = function(chart, series, interimRegressionLine) {
   return new ASPxClientRegressionLine(chart, series, interimRegressionLine);
  });
 }
});
ASPxClientSeriesLabel = _aspxCreateClass(ASPxClientWebChartElement, {
 constructor: function(chart, series, interimSeriesLabel) {
  this.constructor.prototype.constructor.call(this, chart, interimSeriesLabel);  
  this.series = series;
 },
 InitializeProperties: function(interimObject) {
 },
 InitializeDefault: function() {
  this.text = "";
 }
});
ASPxClientSeriesPoint = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, series, interimSeriesPoint) {
  this.constructor.prototype.constructor.call(this, chart, interimSeriesPoint);
  this.series = series;
 },
 InitializeProperties: function(interimObject) {
  if(!_aspxIsExists(interimObject.x) || !_aspxIsExists(interimObject.y) || !(interimObject.y instanceof Array))
   throw ASPxClientWebChartElement.objectModelError;    
  this.argument = interimObject.x;
  this.values = interimObject.y;
 }
});
ASPxClientLegend = _aspxCreateClass(ASPxClientWebChartEmptyElement, {
 constructor: function(chart, interimLegend) {
  this.constructor.prototype.constructor.call(this, chart, interimLegend);  
 }
});
ASPxClientTitleBase = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, interimTitle) {
  this.constructor.prototype.constructor.call(this, chart, interimTitle);
 },
 InitializeProperties: function(interimObject) {
  if(!_aspxIsExists(interimObject.l) || !(interimObject.l instanceof Array))
   throw ASPxClientWebChartElement.objectModelError;
  this.lines = interimObject.l;
  this.alignment = interimObject.a;
  this.dock = interimObject.d;
 }
});
ASPxClientChartTitle = _aspxCreateClass(ASPxClientTitleBase, {
 constructor: function(chart, interimChartTitle) {
  this.constructor.prototype.constructor.call(this, chart, interimChartTitle);
 }
});
ASPxClientSeriesTitle = _aspxCreateClass(ASPxClientTitleBase, {
 constructor: function(chart, series, interimSeriesTitle) {
  this.constructor.prototype.constructor.call(this, chart, interimSeriesTitle);
  this.series = series;
 }
});
ASPxClientFinancialIndicator = _aspxCreateClass(ASPxClientWebChartElementNamed, {
 constructor: function(chart, series, interimFinancialIndicator) {
  this.constructor.prototype.constructor.call(this, chart, interimFinancialIndicator);
  this.series = series;
 },
 InitializeProperties: function(interimObject) {
  ASPxClientWebChartElementNamed.prototype.InitializeProperties.call(this, interimObject);
  if(!_aspxIsExists(interimObject.p1) || !_aspxIsExists(interimObject.p2))
   throw ASPxClientWebChartElement.objectModelError;  
  this.point1 = new ASPxClientFinancialIndicatorPoint(this.chart, this, interimObject.p1);
  this.point2 = new ASPxClientFinancialIndicatorPoint(this.chart, this, interimObject.p2);
 }
});
ASPxClientTrendLine = _aspxCreateClass(ASPxClientFinancialIndicator, {
 constructor: function(chart, series, interimTrendLine) {
  this.constructor.prototype.constructor.call(this, chart, series, interimTrendLine);
 }
});
ASPxClientFibonacciIndicator = _aspxCreateClass(ASPxClientFinancialIndicator, {
 constructor: function(chart, series, interimFibonacciIndicator) {
  this.constructor.prototype.constructor.call(this, chart, series, interimFibonacciIndicator);
 }
});
ASPxClientFinancialIndicatorPoint = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, financialIndicator, interimFinancialIndicatorPoint) {
  this.constructor.prototype.constructor.call(this, chart, interimFinancialIndicatorPoint);
  this.financialIndicator = financialIndicator;
 },
 InitializeProperties: function(interimObject) {
  if(!_aspxIsExists(interimObject.a) || !_aspxIsExists(interimObject.vl))
   throw ASPxClientWebChartElement.objectModelError;
  this.argument = interimObject.a;
  this.valueLevel = interimObject.vl;
 }
});
ASPxClientRegressionLine = _aspxCreateClass(ASPxClientWebChartRequiredElement, {
 constructor: function(chart, series, interimRegressionLine) {
  this.constructor.prototype.constructor.call(this, chart, interimRegressionLine);
  this.series = series;
 },
 InitializeProperties: function(interimObject) {  
  this.valueLevel = interimObject.vl;
 }
});
