/**
   * ==========初始化LineChart===========
   * @param app 是主程序入口:dynamicStackedChart
   * @param id 设置id:String
   * @param tipStr 用户自定义的笔触提示信息:String
   * @param xml 数据集:String
   * @param title 竖向标题:String
   * @param vtitle 横向标题:String
   * @param x x轴显示信息:String
   * */
   public function createLinkChart(app:dynamicStackedChart,id:String,tipStr:String,xml:String,title:String,vtitle:String,x:String):void{
    /**初始化LineChart*/
    lineChartTip=tipStr;
    var lineChart:LineChart=new LineChart();
    lineChart.id=id;
    lineChart.percentWidth=100;
    lineChart.setStyle("textAlign","center");
    lineChart.dataTipFunction=fxLineChartTips;
    lineChart.showDataTips=true;
    lineChart.height=250;
  
    /**
    * 点击Item事件
    * */
    lineChart.addEventListener(ChartItemEvent.ITEM_CLICK,
     function chartClick(evt:ChartItemEvent):void{lineChartItemClick(evt,app,tipStr,lineChart);});
  
    var lineAxis:LinearAxis=new LinearAxis();
    lineChart.verticalAxis=lineAxis;
    var lineVTitle:CategoryAxis=new CategoryAxis();
    lineChart.horizontalAxis=lineVTitle;
  
    /**设置标题和设置Legend显示数据*/
    lineAxis.title=title;
    lineVTitle.title=vtitle;
    lineVTitle.categoryField="@"+x; //Legend
  
    /**LineChart设置背景网格*/
    lineChartbackgroundElements(lineChart);
  
    lineChartLoadData(lineChart,xml,title,vtitle,x);
  
    /**LineChart的Legend 数据*/
    var lineLegend:Legend=new Legend();
    lineLegend.dataProvider=lineChart;
    lineLegend.height=28;
    app.myBox.addChild(lineChart);
    app.myBox.addChild(lineLegend);
   }
   /**LineChart 设置背景网格*/
   private function lineChartbackgroundElements(lineChart:LineChart):void{
 
    //    var gl:GridLines=new GridLines();
    //    gl.setStyle("horizontalTickAligned",true);
    //    gl.setStyle("verticalTickAligned",true);
    //  
    //    var hr:HorizontalList;
    //    lineChart.backgroundElements=[hr];
   }
   /**
   * LineChart 加载数据
   * 2010年6月17日13:37
   * 页面加载LineChart数据
   * @param app 主程序入口类型stackedChart
   * @param xml 存放数据源 String
   * @param title 竖向标题 String
   * @param vtitle 横向标题 String
   * @param x x轴显示数据 String
   * */
   private function lineChartLoadData(lineChart:LineChart,xml:String,title:String,vtitle:String,x:String):void{
    var xmls:XML=new XML(xml);
    // 绑定数据
    lineChart.dataProvider=xmls.children();
    // 动态添加lineSeries
    var xmlName:XMLList=xmls.children() as XMLList;
    // 获取XML中元素名称
    var arr:Array=new Array();
    for(var a:int=1;a<xmlName[0].attributes().length();a++)
    {
     arr.push(xmlName.attributes()[a].name().toString().replace(/^\s*|\s*$/g,"").split(" ").join(""));
    }
 
    var arrSeries:Array=new Array();
    var colorArr:Array=getRandomColor(arr.length);
    for(var i:Number=0;i<arr.length;i++)
    {
     var lineSeries:LineSeries = new LineSeries();
     lineSeries.id = i as String;
     lineSeries.yField="@"+arr[i];
     lineSeries.displayName=arr[i];
     var fa2:Fade=new Fade();
     fa2.duration=2000;
     fa2.alphaFrom=0.0;
     fa2.alphaTo=1.0;
     lineSeries.setStyle("showDataEffect",fa2);
     lineSeries.filters=[_DropShadowFilter];
     lineSeries.setStyle("itemRenderer",new ClassFactory(CircleItemRenderer));
     var storkt:SolidColorStroke=new SolidColorStroke();
     //随机生成颜色colorArr[i]
     storkt.color=colorArr[i];
     storkt.weight=1;
     lineSeries.setStyle("lineStroke",storkt);
     arrSeries.push(lineSeries);
    }
    lineChart.series = arrSeries;
   }
 
   /**
   * 2010年6月17日13:37
   * LineChart提示信息
   * @param hitdata 存放鼠标笔触点显示数据 HitData
   * */
   private function fxLineChartTips(hitdata:HitData):String{
  
    var show:String=new String("");
    var curObj:Object=hitdata.item;
    var xml:XML=new XML(curObj);
    var curSeries:LineSeries = LineSeries(hitdata.chartItem.element); // 获得当前的BarSeries
  
    /**提示信息*/
    var arrs:Array=(lineChartTip.split(";"));
  
    for(var a:int=0;a<arrs.length;a++){
     var arr1:Array=arrs[a].toString().split("=");
     if(a==0)
     {
      show=show+arr1[1]+":"+xml.attribute(arr1[0])+"\n";
     }else if(a!=arrs.length-1){
      if(arr1[0]==curSeries.displayName.toString())
      {
       show=show+arr1[1]+":"+arr1[0]+"\n";
      }
     }else{
      show=show+arr1[1]+":"+xml.attribute(curSeries.displayName).toString();
     }
   
    }
    return show;
   }
   /**
   * 2010年6月17日13:37
   * 页面加载ColumnChart数据
   * @param app 主程序入口类型stackedChart
   * @param xml 数据源 String
   * @param title 竖向标题 String
   * @param vtitle 横向标题 String
   * @param x x轴显示数据 String
   *
   * */
   public function fxColumnChartLoader(app:dynamicStackedChart,colChart:ColumnChart,xml:String,title:String,vtitle:String,x:String):void{
    /**字符创格式XML转换成XML格式*/
    var xmlData:XML=new XML(xml);
  
    /**XML格式转换成XMLList*/
    var xmlName:XMLList=xmlData.children() as XMLList;
  
    /**
    * 获取XML中每条数据的元素<day dval='12日' val="23" val2="33"/>
    * 格式必须是这个格式,第一个元素必须是描述字符串
    * 从第二个开始为要显示的数据
    * 下面是从第一个元素也就是排除第一个元素
    * dval,而是从第二个元素val
    * 开始获取要显示的数据必须是数字
    * */
    var arr:Array=new Array();
    for(var a:int=0;a<xmlName[0].attributes().length();a++)
    {
     arr.push(xmlName.attributes()[a].name().toString().replace(/^\s*|\s*$/g,"").split(" ").join(""));
    }
  
    /**
    * 动态添加ColumnSeries(柱子)
    * */
    var arrcSeries:Array=new Array();
    for(var f:Number=1;f<arr.length;f++)
    {
     var columnSeries:ColumnSeries = new ColumnSeries();
     /**设定id*/
     columnSeries.id = f as String;
     /**设定x轴显示数据*/
     columnSeries.xField="@"+x;
     /**设定y轴显示数据*/
     columnSeries.yField="@"+arr[f];
     /**设置每个column展现效果*/
     columnSeries.setStyle("showDataEffect",app.upColumn2);
     /**
     * 设置columnSeries的显示名称(displayName)
     * */
     columnSeries.displayName=arr[f];
   
     arrcSeries.push(columnSeries);
   
     /**设置提示信息显示样式*/
     columnSeries.setStyle("labelPosition","outside");
    }
  
    /**将ColumnSeries添加到ColumnChart的Series集合中去*/
    colChart.series=arrcSeries;
    /**
    * 渲染加载ColumnChart
    * 固定格式的xml格式
    **/
    colChart.dataProvider=xmlData.children();
   }
   /**
   * 2010年6月17日13:37
   * ColumnChart提示信息
   * @param hitdata 存放鼠标笔触点显示数据 HitData
   * */
   public function fxColumnChartShowDataTip(hitdata:HitData):String{
  
    var show:String=new String("");
    /**获取提示光点的所有信息*/
    var curObj:Object=hitdata.item;
    /**将获取的数据转换成xml*/
    var xml:XML=new XML(curObj);
    /**获取提示列的对象*/
    var curSeries:ColumnSeries = ColumnSeries(hitdata.chartItem.element); // 获得当前的ColumnSeries
  
    /**用户自定义格式的提示信息*/
    var arrs:Array=(columnChartTip.split(";"));
  
    for(var a:int=0;a<arrs.length;a++){
     var arr1:Array=arrs[a].toString().split("=");
     if(a==0)
     {
      /**show存放用户自定义格式的提示信息的最终数据*/
      show=show+arr1[1]+":"+xml.attribute(arr1[0])+"\n";
     }else if(a!=arrs.length-1){
      if(arr1[0]==curSeries.displayName.toString())
      {
       show=show+arr1[1]+":"+arr1[0]+"\n";
      }
     }else{
      show=show+arr1[1]+":"+xml.attribute(curSeries.displayName).toString();
     }
   
    }
    return show;
   }
   /**
   * 初始化数据报表
   * */
   public function createAdvancedDataGrid(app:dynamicStackedChart,id:String,xml:String,headerText:String):void{
 
    var advgrid:AdvancedDataGrid=new AdvancedDataGrid();
    advgrid.id=id;
    advgrid.designViewDataType="flat";
    advgrid.setStyle("textAlign","center");
    advgrid.percentWidth=100;
    advgrid.height=250;
    advgrid.addEventListener(AdvancedDataGridEvent.HEADER_RELEASE,advancedDataGridSort);
    advgrid.addEventListener(MouseEvent.CLICK,function clickadvgrideClick():void{advgrideItemClick(advgrid,app);});
    /**
    * 加载数据
    * */
    fxAdvancedDataGridLoader(advgrid,xml,headerText);
    app.myBox.addChild(advgrid);
   }
   /**
   * ================================AdvancedDataGrid========================================
   * 2010年6月17日13:37
   * 页面加载AdvancedDataGrid数据
   * @param app 主程序入口类型stackedChart
   * @param xml 存放数据源 String
   * @param headerText AdvancedDataGrid标题 String
   * */
   public function fxAdvancedDataGridLoader(advgrid:AdvancedDataGrid,xml:String,headerText:String):void{
    var xmld:XML=new XML(xml);
  
    var xmlName:XMLList=xmld.children() as XMLList;
    // 获取XML中元素名称
    var arr:Array=new Array();
    for(var a:int=0;a<xmlName[0].attributes().length();a++)
    {
     arr.push(xmlName.attributes()[a].name().toString().replace(/^\s*|\s*$/g,"").split(" ").join(""));
    }
  
    advgrid.dataProvider=xmld.children();
    var adcHeaderText:AdvancedDataGridColumnGroup=new AdvancedDataGridColumnGroup();
    adcHeaderText.headerText=headerText;
    var arrs:Array=new Array();
    for(var i:int=0;i<arr.length;i++)
    {
     var adc:AdvancedDataGridColumn=new AdvancedDataGridColumn();
     adc.dataField="@"+arr[i];
     adc.headerText=arr[i];
     arrs.push(adc);
    }
    adcHeaderText.children=arrs;
    var arrHeader:Array=new Array();
    arrHeader.push(adcHeaderText);
    advgrid.groupedColumns=arrHeader;
   }
   /**
   * 点击AdvancedDataGrid列头上的排序按钮
   */
   public function advancedDataGridSort(evt:AdvancedDataGridEvent):void {  
    var column:AdvancedDataGridColumn = AdvancedDataGridColumn(evt.currentTarget.columns[evt.columnIndex]);  
    var columnName:String=column.dataField;  
    column.sortCompareFunction=function(obj1:Object,obj2:Object):int{  
     return superSort(obj1,obj2,columnName);  
    };  
   }  
   /**
   * 根据不同的数据类型选择不同的排序方式 优先级是数字、日期、字符串
   */
   private function superSort(obj1:Object,obj2:Object,columnName:String):int{  
    //验证数据类型 Numbe Date String  
    if(!isNaN(obj1[columnName])){  
     return number_sortCompareFunc(obj1,obj2,columnName);  
    }  
    if(strIsDate(obj1[columnName])){  
     var inputFormat:String=getInputFormat(obj1[columnName]);  
     return date_sortCompareFunc(obj1,obj2,columnName,inputFormat);  
    }  
    return string_sortCompareFunc(obj1,obj2,columnName);  
   }  
   /**
   * 日期的排序
   */
   private function date_sortCompareFunc(obj1:Object, obj2:Object,columnName:String,inputFormat:String):int {  
    var date1:Date =DateField.stringToDate(obj1[columnName],inputFormat);  
    var date2:Date =DateField.stringToDate(obj2[columnName],inputFormat);  
    return ObjectUtil.dateCompare(date1, date2);  
   }  
   /**
   * 字符串的排序
   */
   private function string_sortCompareFunc(obj1:Object, obj2:Object,columnName:String):int{  
    var str1:String=obj1[columnName];  
    var str2:String=obj2[columnName];  
    return ObjectUtil.stringCompare(str1, str2,false);  
   }  
   /**
   * 数字的排序
   */
   private function number_sortCompareFunc(obj1:Object, obj2:Object,columnName:String):int{  
    var num1:Number=Number(obj1[columnName]);  
    var num2:Number=Number(obj2[columnName]);  
    return ObjectUtil.numericCompare(num1,num2);  
   }  
   /**
   * 验证一个字符串是否是日期格式
   */
   private function strIsDate(str:String):Boolean{  
    var inputFormat:String=getInputFormat(str);  
    //如果找不到日期表示符号则直接返回false  
    if(inputFormat==null){  
     return false;  
    }  
    var date:Date=DateField.stringToDate(str,inputFormat);  
    //如果是日期date不为null  
    if(date!=null){  
     return true;  
    }else{  
     return false;  
    }  
   }  
   /**
   * 得到日期的格式
   * 判断的顺序为 2009-11-12 2009/11/12 2009.11.12
   */
   private function getInputFormat(str:String):String{  
    if(str.indexOf("-")!=-1){  
     return "YYYY-MM-DD";  
    }  
    if(str.indexOf("/")!=-1){  
     return "YYYY/MM/DD";  
    }  
    if(str.indexOf(".")!=-1){  
     return "YYYY.MM.DD";  
    }  
    return null;  
   }
 
 
   /**
   * 随机产生指定数量颜色的方法
   * 产生一个集合每个颜色不相同
   * @param num 指定产生多少个颜色Number
   * @return 指定数量的颜色集合Array(uint)
   * */
   private function getRandomColor(num:Number):Array{
  
    var arrColor:Array=new Array();
  
    arrColor.push(uint(Math.random()*0xffffff));
  
    for(var i:Number=0;i<10000;i++){
     /**标记是否产生元素与arrColor中元素系统,达到每次产生不同的元素*/
     var sign:Boolean=false;
   
     var q:uint=uint(Math.random()*0xffffff);
   
     for(var j:Number=0;j<arrColor.length;j++){
      if(arrColor[j]==q)
      {
       sign=true;
      }
     }
     if(sign==false)
     {
      arrColor.push(q+10);
     }
     if(arrColor.length==num)
     {
      break;
     }
    }
    return arrColor;
   }
   /**
   * LineChart点击事件
   * */
   public function lineChartItemClick(evt:ChartItemEvent,app:dynamicStackedChart,tipStr:String,lineChart:LineChart):void{
    var psi:LineSeriesItem= evt.hitData.chartItem as LineSeriesItem;
      var tipArr:Array=tipStr.split(";");
    var nameArr:Array=new Array();
    for(var a:int=0;a<tipArr.length;a++){
     nameArr[a]=((tipArr[a]).split("="))[0];
    }
    var xmlObj:XML=new XML(psi.item);
    var str:String=new String("");
    for(var b:int=0;b<nameArr.length;b++){
  
     if(xmlObj.attribute(nameArr[b]).toString()!=""&&xmlObj.attribute(nameArr[b])!=null){
       str+=nameArr[b]+"="+xmlObj.attribute(nameArr[b])+";";
     }
   
    }
    app.jsItemClick("id="+lineChart.id+";"+str);
    //Alert.show(str,"点击LineChart的Item");
   }
   /**
   * PieChart点击事件
   * */
   public function pieChartItemClick(evt:ChartItemEvent,app:dynamicStackedChart,tipStr:String,pieChart:PieChart):void{
    var psi:PieSeriesItem= evt.hitData.chartItem as PieSeriesItem;
    var tipArr:Array=tipStr.split(";");
    var nameArr:Array=new Array();
    for(var a:int=0;a<tipArr.length;a++){
     nameArr[a]=((tipArr[a]).split("="))[0];
    }
    var xmlObj:XML=new XML(psi.item);
    var str:String=new String("");
    for(var b:int=0;b<nameArr.length;b++){
   
     if(xmlObj.attribute(nameArr[b]).toString()!=""&&xmlObj.attribute(nameArr[b])!=null){
      str+=nameArr[b]+"="+xmlObj.attribute(nameArr[b])+";";
     }
   
    }
    app.jsItemClick("id="+pieChart.id+";"+str);
//    Alert.show(str,"点击LineChart的Item");
   }
   /**
   * AreaChart点击事件
   * */
   public function areaChartItemClick(evt:ChartItemEvent,app:dynamicStackedChart,tipStr:String,areaChart:AreaChart):void{
    var psi:AreaSeriesItem= evt.hitData.chartItem as AreaSeriesItem;
    var tipArr:Array=tipStr.split(";");
    var nameArr:Array=new Array();
    for(var a:int=0;a<tipArr.length;a++){
     nameArr[a]=((tipArr[a]).split("="))[0];
    }
    var xmlObj:XML=new XML(psi.item);
    var str:String=new String("");
    for(var b:int=0;b<nameArr.length;b++){
   
     if(xmlObj.attribute(nameArr[b]).toString()!=""&&xmlObj.attribute(nameArr[b])!=null){
      str+=nameArr[b]+"="+xmlObj.attribute(nameArr[b])+";";
     }
   
    }
    app.jsItemClick("id="+areaChart.id+";"+str);
//    Alert.show(str,"点击LineChart的Item");
   }
   /**
   * ColumnChart点击事件
   * */
   public function columnChartItemClick(evt:ChartItemEvent,app:dynamicStackedChart,tipStr:String,colChart:ColumnChart):void{
    var psi:ColumnSeriesItem= evt.hitData.chartItem as ColumnSeriesItem;
    var tipArr:Array=tipStr.split(";");
    var nameArr:Array=new Array();
    for(var a:int=0;a<tipArr.length;a++){
     nameArr[a]=((tipArr[a]).split("="))[0];
    }
    var xmlObj:XML=new XML(psi.item);
    var str:String=new String("");
    for(var b:int=0;b<nameArr.length;b++){
   
     if(xmlObj.attribute(nameArr[b]).toString()!=""&&xmlObj.attribute(nameArr[b])!=null){
      str+=nameArr[b]+"="+xmlObj.attribute(nameArr[b])+";";
     }
   
    }
    app.jsItemClick("id="+colChart.id+";"+str);
//    Alert.show(str,"点击LineChart的Item");
   }
   /**
   * AdvancedDataGrid点击事件
   * */
   public function advgrideItemClick(advgride:AdvancedDataGrid,app:dynamicStackedChart):void{
    var xmls:XML=advgride.selectedItem as XML;
    var dataStr:String=new String("");
    for(var a:int=0;a<xmls.attributes().length();a++)
    {
     dataStr+=xmls.attributes()[a].name()+"="+xmls.attribute(xmls.attributes()[a].name())+";";   
    }
    app.jsItemClick("id="+advgride.id+";"+dataStr);
//    Alert.show(dataStr,"advgrid");
   }
}
}