﻿///<reference path="jquery-1.2.6.js" /> 
 
//2009-6-13 修正，drawPJLine处理只有一个数据的情况
//2009-6-13,如果数据只有一个点  firstYearLeftUnit+thisyearleftUnit+thisYearUnit = totalUnit;  ,
//          上面的处理会使firstYearLeftUnit 和 thisYearLeftUnit 重合，多了一步份数据,下面的方法还要根据第一元素的月来做运算，来确定第一个点的位置
//          下面的只处理的月度数据的情况，其他的日期类型的数据也应该做相应的补充，有待完成

     
    //*************************************
    //**********   chart   ****************
    //*************************************      
      
    var  chart=function(pContainer,left,top,width,height,bgcolor){
           //  init: function(){
                 this.Container=pContainer;
               
                 this.left=left;
                 this.top=top;
                 this.width=width;
                 this.height=height;
                 
                 //padding  top right bottom left  
                 this.toppadding=0;
                 this.rightpadding=0;
                 this.bottompadding=0;
                 this.leftpadding=0;  
                 

                 this.gridtoppadding=0;
                 this.gridrightpadding=0;
                 this.gridbottompadding=0;
                 this.gridleftpadding=0;  
                 
                                                                      
                 this.bgColor=bgcolor||"";    
                 this.filledColors;
                 this.strokedColors;  
                 this.displayYearCount=10;   
                 this.whScale =1;  // = real width /height 
                 this.displayLeftUnitOfYear = true; 
                 
                 //为下面的数据区插入横线
                 this.dataTableSplitLines=[];
                 
                 //为0时候，不显示
                 this.displayBlankForZero =false;
                 
                 // 适用于bar 年度的风格是否占一个 barWidth
                 this.yearAsUnit = true;
            
                  
                                         
           //  }           
    }
     
     
    chart.RandColor = function(){
          return "rgb("+ parseInt( Math.random() * 255) +"," +parseInt( Math.random() * 255) +"," +parseInt( Math.random() * 255)+")";
    }
      
    chart.getColor=function(colors,idx){
        if(colors ==undefined || colors==null||colors.length<idx||colors[idx]==null){
            return chart.RandColor();
        }
        else
           return colors[idx];           
    }      
      
      
      
    chart.prototype={
    
    
         getFilledColor : function(idx){
              return chart.getColor(this.filledColors,idx);
         }  ,
         
         getFilledColor2 : function(idx){
               
              if(this.filledColors ==undefined || this.filledColors==null||this.filledColors.length<idx||this.filledColors[idx]==null){
                    return "";
               }
              else
                   return this.filledColors[idx];     
         }  ,
         
         getStrokedColor : function(idx){   
              return chart.getColor(this.strokedColors,idx); 
         },
             
    
        setData : function(json){
          this.data=json;          
          
        },

        setMarkData : function(json){
          this.markData= json ;
        },
      
        setStrokedColors :function(colorArr){
           this.strokedColors=colorArr;
      
        },
        
        setfilledColors : function(colorArr){
            this.filledColors=colorArr;             
        },


       //left right top bottom
       setPadding : function(paddingArr){
       
             this.leftpadding=paddingArr[0];   
             this.rightpadding=paddingArr[1];
             
             this.toppadding=paddingArr[2];           
             this.bottompadding=paddingArr[3];
                                                                                                    
       },
       
       
       setGridPadding : function(paddingArr){
       
             this.gridleftpadding=paddingArr[0];   
             this.gridrightpadding=paddingArr[1];
             
             this.gridtoppadding=paddingArr[2];           
             this.gridbottompadding=paddingArr[3];
                                                                                                    
       },
       

       setDateType :function(datetype){
             this.dateType=datetype;
       
       },
       
       
       //设置一共显示几年的，即使前面几年没有数据也显示空白
       setDisplayYearCount :function(count){       
             this.displayYearCount=count;        
       },
       
       setWHScale : function(v){
             this.whScale =v;
       },
       
       //空白的单位是否显示
       setDisplayLeftUnitOfYear: function(v){
            this.displayLeftUnitOfYear = v;
       },
       
       setDisplayBlankForZero: function(v){
            this.displayBlankForZero = v;
       },
       
       setYearAsUnit:function(v){
            this.yearAsUnit=v
       },
       
       setDataTableSplitLines:function(arr){
            this.dataTableSplitLines=arr;
       },
       
       drawPie : function(pField){                
           
              var startAngle=0;
              var endAngle=0;
              var pieAngle=0;
              var prePieAngle=0;
              this.PercentField = pField||1;
                
              var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);
             
              painter.drawRect(vgroup,this.left,this.top,this.width,this.height,this.bgColor);
               
               
              var strAngle="";
              var color="";
              
              for(i=1;i<this.data.length;i++){ //顺序的画出各个饼图                
                       pieAngle= this.data[i][this.PercentField]/100;//this.all[i].Value / vTotal;
                       startAngle+=prePieAngle;
                       prePieAngle=pieAngle;
                       endAngle=pieAngle; 
                       
                       var  color=this.getFilledColor(i-1);
                       
                       var  vPieEl=painter.drawPieSlice(vgroup,this.left+this.leftpadding,this.top+this.toppadding,this.width-this.leftpadding-this.rightpadding,this.height-this.toppadding-this.bottompadding,startAngle,endAngle,color);
                                         
                       vPieEl.title=this.data[i][0] +" : "+ endAngle * 100 +"%";// +this.all[i].TooltipText;
                      
                      /*  可以把这个内容转移到painter类下面
                       var objFill=document.createElement("v:fill");
                       objFill.rotate="t";
                       objFill.focus="100%";
                       objFill.type="gradient";
                       objFill.angle=parseInt( 360 * (startAngle + endAngle /2));
                       vPieEl.appendChild(objFill);
                        */  
         
                       
              }
              
        },
        
  
       
    //只有曲线
    drawPolyLine : function(){
            
          if(this.data.length==0)return;
        
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
          //painter.drawRect(vgroup,this.left,this.top,this.width,this.height);

          this.preData=this.dataPreProcess();                                    
            
          //var xArrLine=this.drawHLineGroup(vgroup,100,this.preData["y0"],this.preData["ySpace"]);                  
          //var yArrLine= this.drawVLineGroup(vgroup,this.preData["xArr"]);
                    
          //this.drawYLabels(vgroup,xArrLine,this.left+this.width,this.top,1500,this.height);
           
          for(var i=0 ;i<this.preData["lineArr"].length;i++){                
                var line=painter.drawPolyline(vgroup,0,0,21600,21600,this.preData["lineArr"][i],this.getStrokedColor(i),1,"solid",this.getFilledColor(i));                        
          }
         
          return vgroup;
             
    },
    
    
    
    //一下2个函数是为了画评级走势图 临时公开的函数，以后需要每种图都统一成这样的模式     
    preProcess:function(chartType){          
          this.preData=this.dataPreProcess(chartType);             
                    
    } ,  
      
    drawCanvas:function(){
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);   
          return vgroup;
    },
    
    drawPJLine : function(){
          if(this.data.length==0)return;
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
          //painter.drawRect(vgroup,this.left,this.top,this.width,this.height);

          this.preData=this.dataPreProcess("pjline");                                    
            
          //var xArrLine=this.drawHLineGroup(vgroup,100,this.preData["y0"],this.preData["ySpace"]);                  
          //var yArrLine= this.drawVLineGroup(vgroup,this.preData["xArr"]);
                    
          //this.drawYLabels(vgroup,xArrLine,this.left+this.width,this.top,1500,this.height);
           
           
          for(var i=0 ;i<this.preData["lineArr"].length;i++){
               
               var space =0; 
               var lastp;
               for(j=1;j<this.preData["lineArr"][i].length;j++){
                   var p2 = this.preData["lineArr"][i][j];
                   var p1=this.preData["lineArr"][i][j-1];
                   //painter.drawLine=function(pContainer,pfromx,pfromy,ptox,ptoy,pcolor,pweight,pdashstyle){
                   painter.drawLine(vgroup,p1[0],p1[1],p2[0],p1[1],this.getStrokedColor(i),"3","solid");  //横线
                   painter.drawLine(vgroup,p2[0],p1[1],p2[0],p2[1],this.getStrokedColor(i),"0.5","solid") ;//竖线
                   //为画最后一个点准备数据
                   if(space==0){
                        space=p2[0]-p1[0];
                   }
                   lastp=p2;
                           
               }
               //画最后一个点
               if(space>0){
                    painter.drawLine(vgroup,lastp[0],lastp[1],lastp[0]+space,lastp[1],this.getStrokedColor(i),"3","solid"); 
               }else{
                    //处理只有一个数据的情况
                    space=this.preData["xSpace"];
                    lastp=this.preData["lineArr"][0][0];
                    painter.drawLine(vgroup,lastp[0],lastp[1],lastp[0]+space,lastp[1],this.getStrokedColor(i),"3","solid");
               }
                
          }
         
          return vgroup;
             
    },
    
    
//    drawMark :function(){
//    
//    },
    
    
    drawBox:function(xCoordArr,yCoordArr,dispCoordLable,xLabelInfo,yLabelInfo){
        
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
          painter.drawRect(vgroup,this.left,this.top,this.width,this.height);
          
          var xSpace =parseInt(this.width/(xCoordArr.length+1));
          var ySpace=parseInt(this.height/(yCoordArr.length+1));                    
          
          var xPosArr={};
          var yPosArr={};
          
          for(var i= 0;i<xCoordArr.length+1;i++){
               xPosArr[i]=i*xSpace;
               painter.drawLine(vgroup,xPosArr[i],0,xPosArr[i],yCoordArr.length*ySpace,"black","0.5","solid");     
          }
    
          for(var i=0;i<yCoordArr.length+1;i++){
              yPosArr[i]=21600-(i+1)*ySpace;
              painter.drawLine(vgroup,0,yPosArr[i],xCoordArr.length*xSpace,yPosArr[i],"black","0.5","solid");
          }                              
           
           //画坐标标记
          if(dispCoordLable!=false){  
          
                      if(xLabelInfo){
                              var w = xLabelInfo[0]||xSpace;
                              var h = xLabelInfo[1]||2000;
                              var s = xLabelInfo[2]||"font-size:12px;font-weight:bold;text-align:center; "
                              var o = xLabelInfo[3]||1000 ;//offset
                      }
                      else
                      {
                              var w =   xSpace;
                              var h =  2000;
                              var s =  "font-size:12px;font-weight:bold;text-align:center; " ;
                              var o =  1000 ;//offset
                      }
                             
                                                   
                      //xLabel
                      for(var i=0;i<xCoordArr.length;i++){  
                               if(xCoordArr[i]=="")continue;       
                                painter.drawText(vgroup,xCoordArr[i],xPosArr[i],yPosArr[0]+o,w,h,s);
                      }      
                      
                      if(yLabelInfo){
                              w = yLabelInfo[0]||xSpace;
                              h = yLabelInfo[1]||2000;
                              s = yLabelInfo[2]||"font-size:12px;font-weight:bold;text-align:center; "
                              o = xLabelInfo[3]||1000 ;//offset
                      }
                      else{
                              w =  xSpace;
                              h =  2000;
                              s =  "font-size:12px;font-weight:bold;text-align:center; "
                              o = 1000 ;//offset
                      }
                                                                                  
                      //yLabel                    
                      for(var i=0;i<yCoordArr.length;i++){
                           if(yCoordArr[i]=="")continue;
                           painter.drawText(vgroup,yCoordArr[i],xPosArr[xCoordArr.length]+o,yPosArr[i]-parseInt(ySpace/2)-h/2,w,h,"font-size:12px;font-weight:bold; ");                      
                      }      
                             
                      /*                      
                      //xLabel
                      for(var i=0;i<xCoordArr.length;i++){         
                                painter.drawText(vgroup,xCoordArr[i],xPosArr[i],yPosArr[0]+1000,xSpace,2000,"font-size:12px;font-weight:bold;text-align:center; ");
                      }       
                                                                                  
                      //yLabel                    
                      for(var i=0;i<yCoordArr.length;i++){
                           painter.drawText(vgroup,yCoordArr[i],xPosArr[xCoordArr.length]+1000,yPosArr[i]-parseInt(ySpace/2),xSpace,ySpace,"font-size:12px;font-weight:bold; ");                      
                      }                                                                                        
                      */
                      
           }
           
            //标记具体的值 块
            for(var i=0;i<this.data.length;i++){
                    if(this.data[i][0]==-1||this.data[i][1]==-1)continue;
                    painter.drawRect(vgroup, xPosArr[this.data[i][0]], yPosArr[this.data[i][1]]-ySpace,xSpace,ySpace,this.getFilledColor(i),this.getStrokedColor(i));
            }        
    
    },
    
    //曲线+横线 +竖线+纵坐标标志,没有用到，只提供一个范例
    drawPolyLine2:function(){
    
          
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
          painter.drawRect(vgroup,this.left,this.top,this.width,this.height);

          this.preData=this.dataPreProcess();                                    
          
  
          var xArrLine=this.drawHLineGroup(vgroup,100,this.preData["y0"],this.preData["ySpace"]);                  
          var yArrLine= this.drawVLineGroup(vgroup,this.preData["xArr"]);
          
          
          this.drawYLabels(vgroup,xArrLine,this.left+this.width,this.top,1500,this.height);
           
          for(var i=0 ;i<this.preData["lineArr"].length;i++){
            var line=painter.drawPolyline(vgroup,0,0,21600,21600,this.preData["lineArr"][i],this.getStrokedColor(i),1,"solid",this.getFilledColor(i));
            //line.style.zIndex=10-i;
            
          }
         
          return vgroup;
    
             
             /*
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
          painter.drawRect(vgroup,this.left,this.top,this.width,this.height);

          var r=this.dataPreProcess();                                    
          
  
          var xArrLine=this.drawHLineGroup(vgroup,100,r["y0"],r["ySpace"]);                  
          var yArrLine= this.drawVLineGroup(vgroup,r["xArr"]);
          
          
          this.drawYLabels(vgroup,xArrLine,this.left+this.width,this.top,1500,this.height);
           
          for(var i=0 ;i<r["lineArr"].length;i++){
            var line=painter.drawPolyline(vgroup,0,0,21600,21600,r["lineArr"][i],this.getStrokedColor(i),1,"solid",this.getFilledColor(i));
            //line.style.zIndex=10-i;
            
          }
         
          return r;
    */
    
    },
    
    drawDataTable : function(pcontainer,tableData,ptextheight,pleft,ptop,pwidth,pheight,extX,extTitle,prectclass,ptextclass,ptextinset){
            
            //extX 扩展区的宽度
            //pwidth 整个表格区的width
            //pheight整个表格区的height 
              
            //var d =new Date();
           
              
           var lastyear="";
           var lastx=0;
           var step=0; 
  
           var textheight=ptextheight||2000;
            
           var vGroup = painter.drawGroup(pcontainer,pleft||0,ptop||0,pwidth||21600,pheight||21600);  
   
           //header 
           for(var  n in this.preData["xArr"]){ 
                   //可能存在 xArr 第一个元素之前的 空白
                   //if (lastyear==0){
                          //lastx=this.preData["xArr"][n];
                          //lastyear=n;    
                          //continue;                                    
                   //}                        
                   //alert(this.preData["xArr"][n]) ;
                           
                   var p = painter.drawText2(vGroup,lastyear,lastx ,0,this.preData["xArr"][n] -lastx,textheight, "cDTTitle_rect","cDTTitle_text");                                                                               
                   
                   if(lastyear!=""){
                           if(step==0){
                               step=this.preData["xArr"][n] -lastx;
                           }
                   }
                   
                   lastyear=n;
                   lastx=this.preData["xArr"][n];                                                           
           }
           
           var splitLines = [];
                       //content  
           for(var i=1;i<tableData.length;i++){
              var x= this.preData["xArr"][tableData[i][0].substr(0,4)];          
              
               
              for(var j=1;j<tableData[i].length;j++){                              
                    //painter.drawText(vGroup,tableData[i][j],x,j*textheight,step-10,textheight,ptextstyle,ptextinset);  
                    //按列输出                                     
                    painter.drawText2(vGroup,tableData[i][j],x,j*textheight,step,textheight,prectclass||"cDTItem_rect",ptextclass||"cDTItem_text",ptextinset||"0pt,0pt,2pt,0pt");
                    
                    //判断分割线的所在的纵坐标
                    if(i==1){
                        for(var k=0;k<this.dataTableSplitLines;k++){
                            if(this.dataTableSplitLines[k]==j){
                                splitLines.push(j*textheight+textheight);
                            }
                        }
                    }
                    
                    
              }                              
           }
           
           
           //extend title
           if(extX!=undefined){
                painter.drawText2(vGroup,extTitle||"",lastx,0,extX,textheight,"cDTTitle_ext_rect","cDTTitle_ext_text" );                      
                //var p=  painter.drawText2(vGroup,extTitle||"",lastx ,0,this.preData["xArr"][n] -lastx,textheight,);                
           }
           
           //extend data
           for(var i=1;i<tableData[0].length;i++){
                painter.drawText2(vGroup,tableData[0][i],lastx,i*textheight,extX,textheight,"cDTItem_ext_rect","cDTItem_ext_text");            
           }
           
             
           
           //画分割线
           for(var i=0;i<splitLines.length;i++){
              var line= painter.drawLine(vGroup,0,splitLines[i],21600+extX,splitLines[i],"#555","0.8","dot");              
           }
           
           
 
           return vGroup;
    
    },
    
    drawBar : function(barWidth){
            //yearAsUnit 年度风格信息是否占一个 barWidth
            
            var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);
            painter.drawRect(vgroup,this.left,this.top,this.width,this.height,"");
            
            this.preData=this.dataPreProcess("bar",barWidth);                                    
                
            for(var i=0;i<this.preData["lineArr"].length;i++){
               // var line=painter.drawPolyline(vgroup,0,0,21600,21600,r["lineArr"][i],this.getStrokedColor(i),1,"solid",this.getFilledColor(i));
                //line.style.zIndex=10-i;
                   
                 var fc=  this.getFilledColor(i);
                 for(var j=0 ;j<this.preData["lineArr"][i].length;j++){
                     if(this.preData["lineArr"][i][j][1]<this.preData["y0"]){                         
                           painter.drawRect(vgroup,this.preData["lineArr"][i][j][0]+i*barWidth,this.preData["lineArr"][i][j][1],barWidth,this.preData["y0"]-this.preData["lineArr"][i][j][1],fc);
                     }
                     else
                     {
                           painter.drawRect(vgroup,this.preData["lineArr"][i][j][0]+i*barWidth,this.preData["y0"],barWidth,this.preData["lineArr"][i][j][1]-this.preData["y0"],fc);
                     }
                 }
            }                                                            
     
            return vgroup
   },
    
   
    
 
    
    drawBubble : function(container, xStart,xEnd ,yStart,yEnd, zBase ,ZScale){
    
           //hwPercent h/w  , px 
           //var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);
           //painter.drawRect(vgroup,this.left,this.top,this.width,this.height,"");
           
           vgroup=container;
            
          //----------------------
          /*
          
          var  xCoordArr =[0, parseInt(21600/3),parseInt(21600/3*2),21600];
          var  yCoordArr =[0, parseInt(21600/3),parseInt(21600/3*2),21600];
          
           
            
          for(var i= 0;i<xCoordArr.length;i++){                
               painter.drawLine(vgroup,xCoordArr[i],0,xCoordArr[i],21600,"black","0.5","solid");     
          }
    
          for(var i=0;i<yCoordArr.length;i++){               
              painter.drawLine(vgroup,0,yCoordArr[i],21600,yCoordArr[i],"black","0.5","solid");
          }                              
           */
            
           
           //------------------------
         
           
           zBase=zBase||500;
           ZScale=ZScale||100;
             
           var bubbleArr=Array();
           for(var k=0;k<this.data.length;k++){
               var d =this.data[k];              
               bubbleArr[k]=Array();
               for(var i=1;i< d.length;i++){
                  var x =     parseInt(this.leftpadding +  21600/(xEnd-xStart)*d[i][0]);
                  var y =     parseInt(21600-this.bottompadding-21600/(yEnd-yStart)*d[i][1]);
                  //还缺少坐标平移的转换，碰到负数会出问题
                  
                  var w =     zBase+d[i][2]*ZScale ;
                  var h =     this.whScale *w ;
                  bubbleArr[k].push([x,y,w,h]);            
               }
           }
              
           for(var i=0;i<bubbleArr.length;i++){
               var b=bubbleArr[i];                
               for(var j=0;j<bubbleArr[i].length;j++){
                      painter.drawOval(vgroup,b[j][0],b[j][1],b[j][2],b[j][3],{filledcolor:this.getFilledColor(i)});
               }
           }
  
           return  vgroup;          
  
    }, 
    
     drawScatter : function(container, xStart,xEnd ,yStart,yEnd, zBase){
            
           vgroup=container;
            
           zBase=zBase||500;
             
             
           var ySpace = 21600/( yEnd-yStart);
           var xSpace = 21600/(xEnd -xStart);
             
           var bubbleArr=Array();
           for(var k=0;k<this.data.length;k++){
               var d =this.data[k];              
               bubbleArr[k]=Array();
               for(var i=1;i< d.length;i++){
                  var x =     parseInt(this.leftpadding + xSpace*(d[i][0]-xStart));
                  var y =     parseInt(21600-this.bottompadding-  ySpace*(d[i][1]-yStart));
                    
                   
                  var w =     zBase; //到目前和Bubble不同的地方，
                  var h =     this.whScale *w ;
                  bubbleArr[k].push([x,y,w,h]);            
               }
           }
            
           for(var i=0;i<bubbleArr.length;i++){
               var b=bubbleArr[i];                
               for(var j=0;j<bubbleArr[i].length;j++){
                      painter.drawOval(vgroup,b[j][0],b[j][1],b[j][2],b[j][3],{filledcolor:this.getFilledColor(i)});
               }
           }
  
           return  vgroup;            
    
    /*
    
     return
     
    
    
    */
           
           
    }, 
    
 
    draw9Box:function(xCoordArr,yCoordArr,dispCoordLable,xLabelInfo,yLabelInfo){
          var vgroup=painter.drawGroup(this.Container,this.left,this.top,this.width,this.height);                       
           
          var xSpace =parseInt(this.width/(xCoordArr.length+1));
          var ySpace=parseInt(this.height/(yCoordArr.length+1));                    
          
          var xPosArr={};
          var yPosArr={};
          
           
           //画坐标标记
          if(dispCoordLable!=false){  
           
                  
           
                      if(xLabelInfo){
                              var w = xLabelInfo[0]||xSpace;
                              var h = xLabelInfo[1]||2000;
                              var s = xLabelInfo[2]||"font-size:12px;font-weight:bold;text-align:center; "
                      }
                      else
                      {
                              var w =   xSpace;
                              var h =  2000;
                              var s =  "font-size:12px;font-weight:bold;text-align:center; "
                      }
                             
                                                   
                      //xLabel
                      for(var i=0;i<xCoordArr.length;i++){  
                               if(xCoordArr[i]=="")continue;       
                                painter.drawText(vgroup,xCoordArr[i],xPosArr[i],yPosArr[0]+1000,w,h,s);
                      }      
                      
                      if(yLabelInfo){
                              w = yLabelInfo[0]||xSpace;
                              h = yLabelInfo[1]||2000;
                              s = yLabelInfo[2]||"font-size:12px;font-weight:bold;text-align:center; "
                      }
                      else{
                              w =  xSpace;
                              h =  2000;
                              s =  "font-size:12px;font-weight:bold;text-align:center; "
                      
                      }
                                                                                  
                      //yLabel                    
                      for(var i=0;i<yCoordArr.length;i++){
                           if(yCoordArr[i]=="")continue;
                           painter.drawText(vgroup,yCoordArr[i],xPosArr[xCoordArr.length]+1000,yPosArr[i]-parseInt(ySpace/2)-h/2,w,h,"font-size:12px;font-weight:bold; ");                      
                      }      
                             
                      /*                      
                      //xLabel
                      for(var i=0;i<xCoordArr.length;i++){         
                                painter.drawText(vgroup,xCoordArr[i],xPosArr[i],yPosArr[0]+1000,xSpace,2000,"font-size:12px;font-weight:bold;text-align:center; ");
                      }       
                                                                                  
                      //yLabel                    
                      for(var i=0;i<yCoordArr.length;i++){
                           painter.drawText(vgroup,yCoordArr[i],xPosArr[xCoordArr.length]+1000,yPosArr[i]-parseInt(ySpace/2),xSpace,ySpace,"font-size:12px;font-weight:bold; ");                      
                      }                                                                                        
                      */
                      
           }
           
            //标记具体的值 块
            for(var i=0;i<this.data.length;i++){
                    painter.drawRect(vgroup, xPosArr[this.data[i][0]], yPosArr[this.data[i][1]]-ySpace,xSpace,ySpace,this.getFilledColor(i),this.getStrokedColor(i));
            }        
    
    },
    
     
    
   // parseInt(21600-this.bottompadding-(yValue-yMin)*ySpace);
       
    drawHLineGroup:function(container,step,y0,ySpace,pcolor,pweight,pstyle){     
          
          //画横线           
          var yArr = {};
          yArr[0]=y0;
          var count=0;
          var tmpy=y0-step*ySpace;
          while(tmpy>=this.bottompadding){
              count-=step;
             
              yArr[-count]=tmpy ;
              //yArr[-count]=Math.round(tmpy);
              tmpy-=step*ySpace;      
          }
          
          count=0;
          tmpy=y0+step*ySpace;
          while(tmpy<=21600-this.bottompadding){
             count+=step;
             yArr[-count]=tmpy ;
             //yArr[-count]=Math.round(tmpy);
              
             tmpy+=step*ySpace;
          }
           
           
         var style=pstyle||"dot" ;
         var color=pcolor||"gray";
         var weight=pweight||"0.5";
           
         if(!(pweight==0||pstyle=="none"))  {
             for(var n in yArr){
                   painter.drawLine(container,this.gridleftpadding,yArr[n],21600-this.gridrightpadding, yArr[n],color,weight,style); 
             }
          }
                            
           return yArr;
    
    } ,
    
    //画横线 和上面的并存,并且调用了上面的
    drawHLineGroup2:function(container,lineCount,pcolor,pweight,pstyle){     
         
    
         
         //y0,ySpace,vMin,vMax,         
         var step = (this.preData["yMax"] - this.preData["yMin"])/lineCount;
                 
         if(step>=10) step=parseInt(step);
        
         /*
         if(step<200&&step>=150) 
         {
              step = 200
         }
         if(step<150&&step>=100){
              step  = 100
         }         
         else if(step<100&&step>=50)
         {
              step =20;//parseInt(step/10)*10
         }
         else if(step<50&&step>=10)
         {
              step =10;//parseInt(step/10)*10
         }
         else if(step<10&&step>=5)
         {
              step = 2;
         }
         else if(step<5&&step>=1)
         {
              step = 1;
         }
\
         else if(step<1&&step>=0.1)
         {
              step = 0.1;
         }
         else if(step<0.1 && step>=0.01)
         {
              step= 0.01
         }
         else if(step<0.01 ) 
         {
              step =0.001;
         }
         */
        
          
         return this.drawHLineGroup(container,step,this.preData["y0"],this.preData["ySpace"],pcolor,pweight,pstyle) ;
        
    
    } ,
     
    //自定义yArr画横线
    drawHLineGroup3:function(container,yArr,pcolor,pweight,pstyle){     
            
           
         var style=pstyle||"dot" ;
         var color=pcolor||"gray";
         var weight=pweight||"0.5";
           
         if(!(pweight==0||pstyle=="none"))  {
             for(var n in yArr){
                   painter.drawLine(container,this.gridleftpadding,yArr[n],21600-this.gridrightpadding, yArr[n],color,weight,style); 
             }
          }
         
          return yArr;
    
    } ,
    
    
    
    
     //画竖线,根据年分割的  
    drawVLineGroup:function(container,xArr,pcolor,pweight,pstyle){            
         var style=pstyle||"solid" ;
         var color=pcolor||"#bbbbbb";
         var weight=pweight||"0.5";     
         
         var first="";
         var last="";  
         for(var n in xArr){
            if(first=="")
                 first=n;            
            last=n;            
         }  
                    
           
         for(var n in xArr){             
             if ( n!=first&&n!=last)             
                    var line= painter.drawLine(container,xArr[n],this.gridtoppadding,xArr[n],21600-this.gridbottompadding,color,weight, style);                                        
                     
         }      
          
         return xArr;
         
    },
    
    
     //画竖线，xArr 中的线都画
    drawVLineGroup3:function(container,xArr,pcolor,pweight,pstyle){            
         var style=pstyle||"solid" ;
         var color=pcolor||"#bbbbbb";
         var weight=pweight||"0.5";     
                   
         for(var n in xArr){                        
              var line= painter.drawLine(container,xArr[n],this.gridtoppadding,xArr[n],21600-this.gridbottompadding,color,weight, style); 
         }      
          
         return xArr;
         
    },
    
    
    
    
     //画竖线,根据日期自动分割 ,图示返回了新的对象，可以用于写标签
    drawVLineGroup_date:function(container,dateArr,totalCount,pcolor,pweight,pstyle){            
         var style=pstyle||"dot" ;
         var color=pcolor||"#bbbbbb";
         var weight=pweight||"0.5";     
         
         var first="";
         var last="";  
         
         var count=0;
         for(var n in dateArr){
            /*
            if(first=="")
                 first=n;            
            last=n;            
            */
            count++;
            last=n;
         }
         
         var step= count / (totalCount-1);  
         step=parseInt(step); 
         var i= 0 ;   
         var newDateArr =Array();
         for(var n in dateArr){                
                    //if ( n!=first&&n!=last)             
                //if(i % step == 0||last==n){                   
                if(i % step == 0){
                      painter.drawLine(container,dateArr[n],this.gridtoppadding,dateArr[n],21600-this.gridbottompadding,color,weight, style);      
                      newDateArr[n]=dateArr[n];                                               
                }                                                      
                i++;                 
         }                    
                       
         return   newDateArr;
                    
    },
    
    
    //画坐标线
    drawCroodLine:function(container){
            
            painter.drawLine(container,this.leftpadding,this.toppadding,this.leftpadding,this.height-this.bottompadding,"black","1px", "solid");      
            painter.drawLine(container,this.leftpadding, this.height - this.toppadding,this.width-this.rightpadding,this.height - this.toppadding,"888","0.5pt", "solid");  
            
    },
     
     
     drawXLables : function(pcontainer,ptextheight,pleft,ptop,pwidth,pheight,prectclass,ptextclass,ptextinset){
            
            //extX 扩展区的宽度
            //pwidth 整个表格区的width
            //pheight整个表格区的height 
              
            //var d =new Date();
           
              
           var lastyear="";
           var lastx=0;
           var step=0; 
  
           var textheight=ptextheight||2000;            
           var vGroup = painter.drawGroup(pcontainer,pleft||0,ptop||0,pwidth||21600,pheight||21600);  
     
              
   
           //header 
           for(var  n in this.preData["xArr"]){ 
                   //可能存在 xArr 第一个元素之前的 空白
                   //if (lastyear==0){
                          //lastx=this.preData["xArr"][n];
                          //lastyear=n;    
                          //continue;                                    
                   //}                        
                   //alert(this.preData["xArr"][n]) ;
                         
                   var p=  painter.drawText2(vGroup,lastyear,lastx ,0,this.preData["xArr"][n] -lastx,textheight, prectclass||"cDTTitle_rect","");                                                                               
                   
                   if(lastyear!=""){
                           if(step==0){
                               step=this.preData["xArr"][n] -lastx;
                           }
                   }
                   
                   lastyear=n;
                   lastx=this.preData["xArr"][n];                                                           
           }
         } ,
     
     
    
    //画纵坐标标志 label 
    drawYLabels : function(container,yArr,left,top,width,height,ptextstyle,labelFun){                        
              //与chart具有同样的高度
                            
           var textstyle=ptextstyle||   "text-align:right;color:black;z-index:990;";
           var group =painter.drawGroup(container,left,top,width,height);                 
               //painter.drawRect(group,left,top,width,height,"red");
           for(var n in yArr){    
                 if(labelFun==undefined){ 
                     painter.drawText(group,n,0,parseInt(yArr[n]-800),21600,1600,textstyle);      
                  }
                  else
                  {
            
                     painter.drawText(group,labelFun(n),0,parseInt(yArr[n]-800),21600,1600,textstyle);      
                  }
           }
                       
           return group;                          
    },
    
     
    //new drawYLabels 将会逐渐被代替
    drawYLabels2 : function(container,yArr,left,top,width,height,itemheight,itemrectclass,itemtextclass,itemtextinset,labelFun){                        
            //与chart具有同样的高度
           
           
                           
                     
           //var textstyle=ptextstyle||   "text-align:right;color:black;z-index:990;";
           var group =painter.drawGroup(container,left,top,width,height);                 
               //painter.drawRect(group,left,top,width,height,"red");
           for(var n in yArr){    
                 if(labelFun==undefined){   
                       var num=2;           
                       var n2=format(n,num) ; 
                       //with(Math) var n2=  round(n*pow(10,num))/pow(10,num);                         
                       painter.drawText2(group,n2,0,parseInt(yArr[n]-itemheight/2),21600,itemheight,itemrectclass,itemtextclass,itemtextinset);      
                  }
                  else
                  {                     
                    painter.drawText2(group,labelFun(n),0,parseInt(yArr[n]-itemheight/2),21600,itemheight,itemrectclass,itemtextclass,itemtextinset);                                         
                  }
           }
                       
           return group;                          
    
    },
     
     
          
    //画横坐标Label
    drawXLabels2 : function(container,xArr,left,top,width,height,itemwidth,itemrectclass,itemtextclass,itemtextinset,labelFun){                        
            //与chart具有同样的高度
                         
                     
           //var textstyle=ptextstyle||   "text-align:right;color:black;z-index:990;";
           var group =painter.drawGroup(container,left,top,width,height);                 
               //painter.drawRect(group,left,top,width,height,"red");
           for(var n in xArr){    
                 if(labelFun==undefined){   
                       var num=1;               
                       var n2=format(n,num) ;
                       painter.drawText2(group,n2,parseInt(xArr[n]-itemwidth/2),0,21600,21600,itemrectclass,itemtextclass,itemtextinset);      
                  }
                  else
                  {
                    painter.drawText2(group,labelFun(n),0,parseInt(xArr[n]-itemheight/2),21600,itemheight,itemrectclass,itemtextclass,itemtextinset);                                         
                  }
           }
                       
           return group;                          
    
    },
     
     
     //画横坐标标志       年-月  
    drawXLabels_date : function(container,dateArr,left,top,width,height ,labelwidth ,itemheight,itemrectclass,itemtextclass,itemtextinset,labelFun){                        
           //与chart具有同样的宽度                                         
           var group =painter.drawGroup(container,left,top,width,height);                              
           for(var n in dateArr){    
                 if(labelFun==undefined){                      
                       painter.drawText2(group,n.substr(0,7),parseInt(dateArr[n]-labelwidth/2),0,labelwidth,itemheight,itemrectclass,itemtextclass,itemtextinset);                                          
                  }
                  else
                  {
                        painter.drawText2(group,labelFun(n),0,parseInt(yArr[n]-itemheight/2),21600,itemheight,itemrectclass,itemtextclass,itemtextinset);                                         
                  }
           }
                       
           return group;                          
    }, 
     
     
     
     //画横坐标标志 年-月-日    
    drawXLabels_date2 : function(container,dateArr,left,top,width,height ,labelwidth ,itemheight,itemrectclass,itemtextclass,itemtextinset,labelFun){                        
           //与chart具有同样的宽度                                         
           var group =painter.drawGroup(container,left,top,width,height);                              
           for(var n in dateArr){    
                 if(labelFun==undefined){                      
                       painter.drawText2(group,n,parseInt(dateArr[n]-labelwidth/2),0,labelwidth,itemheight,itemrectclass,itemtextclass,itemtextinset);                                          
                  }
                  else
                  {
                        painter.drawText2(group,labelFun(n),0,parseInt(yArr[n]-itemheight/2),21600,itemheight,itemrectclass,itemtextclass,itemtextinset);                                         
                  }
           }
                       
           return group;                          
    }, 
     
     
     
     
     
      
      //自定义的 lenged 字符串
      drawLegendHTML:function(containter,html,pleft,ptop,pwidth,pheight){
      
           //pContainer,ptxt,pleft,ptop,pwidth,pheight,prectclass,ptextclass,ptextinset
           return  containter.appendChild(painter.drawText2(containter ,html,pleft||0,ptop||0,pwidth||21600,pheight||21600));
                    
      },
       
      drawLegend : function(container,fArr,colorFlag,left,top,width,height,extDataBefore,extDataAfter){
                                                       
                                                        
              var vgroup=painter.drawGroup(container,left,top,width,height);             
              var rect=painter.drawRect(vgroup, left, top, width, height);
              var textbox=painter.drawTextBox(rect);               
              with(textbox){                         
                 style.vTextAnchor="middle";
              }
                            
                          
              var objLegendTable=document.createElement("table");
              textbox.appendChild(objLegendTable);
                
              objLegendTable.cellPadding=0;
              //objLegendTable.cellSpacing=3;
              objLegendTable.width="100%";
              objLegendTable.style.width="100%";
              objLegendTable.style.textAlign="right";
               
             
              if(fArr==null||fArr==undefined||fArr.length==0){                           
                          //******************
                          //legent Table header
                          var objRow=objLegendTable.insertRow();  
                          objRow.insertCell();
                           
                          if(true||typeof this.data[0] ==Array){
                                     
                                  for(var i=0;i<this.data[0].length;i++){                                                      
                                       if(i==0){
                                          objRow.insertCell();
                                          continue;
                                       }                                                                                         
                                       
                                      objCell=objRow.insertCell();          
                                      //objCell.style.padding="5px";
                                      objCell.style.color="black";
                                      objCell.style.font="caption";
                                      objCell.innerText=this.data[0][i];
                      
                                  }
                                                         
                          }                       
                         //Legend content  
                         for(var i=1;i<this.data.length;i++){                                                     
                                  objRow=objLegendTable.insertRow();                               
                                  var  colorCell=objRow.insertCell();//颜色标记                               
                                  with(colorCell){                               
                                     style.textAlign="center";
                                     style.virtialAlign="middle";                              
                                  }
                                  
                                  var colorDiv=document.createElement("div");
                                  
                                  
                                  colorCell.appendChild(colorDiv);
                                  with(colorDiv){
                                     style.width="15px";
                                     style.height="8px";                                     
                                     style.backgroundColor= (colorFlag=="stroked"? this.getStrokedColor(i-1) : this.getFilledColor(i-1));                                  
                                  }                                  
                                   
                                 
                                objRow.style.height="16px";
                                for(j=0 ;j<this.data[i].length;j++){                                   
                                   var objCell=objRow.insertCell();                           
                                   objCell.style.font="icon";
                                   //objCell.style.padding="3px";
                                   objCell.innerText=this.data[i][j];
                                } 
                                                                    
                         }                              
               }  
               else
               {//自己指定legend数组
                //------------------------------                                                         
                                    for(var i=0;i<fArr.length;i++){  
                                    
                                            //和上面的代码重复了                         
                                          objRow=objLegendTable.insertRow();                               
                                          var  colorCell=objRow.insertCell();//颜色标记                               
                                          with(colorCell){                               
                                             style.textAlign="center";
                                             style.virtialAlign="middle";   
                                             innerText="●";  //▲■▼                                             
                                             style.width="10px";
                                                    style.color= (colorFlag=="stroked"? this.getStrokedColor(i) : this.getFilledColor(i)); 
                                                 style.fontSize="7pt";
                                                                      
                                          }
                                          
                                          
                                          
                                          /*
                                          var colorDiv=document.createElement("div");
                                          colorCell.appendChild(colorDiv);
                                          
                                        
                                          
                                          with(colorDiv){
                                                 colorDiv.innerText="●";//▲■▼                                           
                                                //style.width="15px";
                                                 //style.height="8px";
                                                 //style.backgroundColor= (colorFlag=="stroked"? this.getStrokedColor(i) : this.getFilledColor(i));
                                                 style.color= (colorFlag=="stroked"? this.getStrokedColor(i) : this.getFilledColor(i)); 
                                                 style.fontSize="7pt";
                                                  
                                          }
                                          */
                                        
                                         objCell=objRow.insertCell();                           
                                         objCell.style.font="icon";
                                         objCell.style.padding="3px";
                                         objCell.innerText=fArr[i]
                                    }         
                                             
                }  
               
               //-----------------------------------------         
                       
            
             if(extDataBefore!=undefined&&extDataBefore!=null&&extDataBefore!=""){
                  textbox.insertBefore(extDataBefore,objLegendTable);             
             }
             
             if(extDataAfter!=undefined&&extDataAfter!=null&&extDataAfter!=""){
                   
                  textbox.appendChild(extDataAfter)        
             }
             
             
             
                                              
  },  
    
    YTrans:function(yValue,yMin,ySpace){
         return parseInt(21600-this.bottompadding-(yValue-yMin)*ySpace);
    },
     
     
    
    drawMark:function(markColorHash,markSignHash,paddingTop){
     
         if(this.preData["markArr"]) {
         
               var pd=this.preData["markArr"];
               for(i=0;i<pd.length;i++){
                   //prectclass,ptextclass,ptextinset
                   var color="green";
                   if(pd[i].length>=3){
                       if(markColorHash&&markColorHash[pd[i][2]]) {
                          color=markColorHash[pd[i][2]];
                       }                       
                   }
                   
                   var sign="▼";
                   if(markSignHash&&markSignHash[pd[i][2]]){
                      sign=markSignHash[pd[i][2]];
                   }
                   
                   var a=painter.drawText2(this.Container,sign,pd[i][0],paddingTop||pd[i][1],1000,1000,"cMark_rect","cMark_text",undefined,"color:"+color);
               
                  
               }               
         }
    },
    
      
    //for polyline ,bar
    dataPreProcess: function(pchartType,barWidth){
           
          var chartType =pchartType||"line";
           
          if (chartType=="pjline" ){
                var yMax=5;
                var yMin=0;
          
          }else{
                  //传入数据的max and min，并非坐标上的            
                  var yMax=-999999;
                  var yMin= 999999;
                  //max & min    value
                  for(var i=0;i<this.data.length;i++){
                        for(var j=1;j<this.data[i].length;j++){
                            if(yMax< this.data[i][j] ){ yMax=this.data[i][j]};
                            if(yMin>this.data[i][j]) { yMin=this.data[i][j]};
                         }
                  }
                  
                  //每次y以 0 为原点
                  if(yMin>0)yMin=0;
                  
                  //数据在没有数据的情况下可能：
                  //yMin和yMax都等于0,为保证不出错那么，进行如下的操作
                  //保证可以现实出框架，但是没有具体的图形
                  if(( yMax-yMin)<0.000001){
                        yMax= Infinity;
                        yMin=0;
                  }
          }        
          //每个实际的单位需要多少个vml坐标的点。
          var ySpace=(21600-this.toppadding-this.bottompadding)/(yMax-yMin);                                
          var xNum=this.data.length-1;
          
          var xSpace=(21600-this.leftpadding-this.rightpadding)/xNum;    
          var y0= this.YTrans(0,yMin,ySpace);
           
          var lineArr=new Array(); 
          var xArr={};         
            
          //--           
          var yearHash={}
          var yearCount=0;
          var tmplast="";                                                     
          for(var i=1;i<this.data.length;i++){                                                            
              if(tmplast!=this.data[i][0].substr(0,4)){                                                                                    
                   tmplast=this.data[i][0].substr(0,4);  
                   yearHash[this.data[i][0]]=tmplast;
                   yearCount++;
              }                                                      
          }   
          
          //最后一年一共有多少个实际数据点   
          var thisYearUnit = 0;           
          var thisYear=this.data[this.data.length-1][0].substr(0,4);
          for(var i=this.data.length-1;i>0;i--){
              if(thisYear!=this.data[i][0].substr(0,4))
                  break;
              else
                  thisYearUnit++;                                                                                                   
          }
          
          //第一年一共有多少个数据点    
          var firstYearUnit=0;
          var firstYear=this.data[1][0].substr(0,4);
          for(var i=1;i<this.data.length;i++){   
              if(firstYear!=this.data[i][0].substr(0,4))                                                                 
                   break;                               
              else                               
                   firstYearUnit++;                                                         
          } 
            
          var dateType=this.dateType||"season";
          var totalUnitOfYear=4;
          if( dateType=="season"){                              
              totalUnitOfYear =4;  
          }
          else if(dateType=="month"){                             
              totalUnitOfYear=12;                                                             
          }
          else if(dateType=="halfyear"){
             totalUnitOfYear=2;
          }
          else if(dateType=="year"){
              totalUnitOfYear=1;
          }
          else if(dateType=="week"){
              totalUnitOfYear=52;
          }
                       
          var firstYearLeftUnit=0;  
          var thisYearLeftUnit=0;                                                
           
          firstYearLeftUnit=totalUnitOfYear-firstYearUnit; 
          thisYearLeftUnit=totalUnitOfYear-thisYearUnit;
            
          //是否显示总共10年或5年  
          if(this.displayYearCount==0){
                  var emptyYearCount = 0;
                  var emptyUnitCount = 0;
          }
          else{
                  var emptyYearCount = this.displayYearCount - yearCount;           
                  var emptyUnitCount = emptyYearCount*totalUnitOfYear;
          }          
             
          //只有1年的情况 2009-3-22                      
          //2009-6-13,只有1年的情况 firstYearLeftUnit+thisyearleftUnit+thisYearUnit = totalUnit;  ,
          //上面的处理会使firstYearLeftUnit 和 thisYearLeftUnit 重合，多了一步份数据,下面的方法还要根据第一元素的月来做运算，来确定第一个点的位置
          //下面的只处理的月度数据的情况，其他的日期类型的数据也应该做相应的补充
          if(yearCount==1){
                firstYearLeftUnit = 0;                            
                var tmpflag = false;
                var tmpreg  =/^\d+[-](\d+)/ig;                 
                if(tmpreg.test( this.data[1][0] )){                     
                    
                    var firstMonth = parseInt(RegExp.$1);                     
                    if ( totalUnitOfYear == 12) {                         
                       firstYearLeftUnit += firstMonth-1;
                       thisYearLeftUnit  -= firstMonth-1;                         
                       flag = true;                        
                    }                        
                }
                
                 
          }
                      
          firstYearLeftUnit += emptyUnitCount;
             
          if(!this.displayLeftUnitOfYear){
            firstYearLeftUnit=0;
            thisYearLeftUnit=0;
          }             
           
          var tmpMarkHash={};
          if(this.markData!=undefined){
              for(var i=1;i<this.markData.length;i++){
                 tmpMarkHash[this.markData[i][0]]=this.markData[i][1];
              }
          }
         
          var markArr=[];
          var dateArr={};
          
          switch(chartType){
             case "line":                       
                      xNum+=firstYearLeftUnit + thisYearLeftUnit;                                                                           
                      xSpace=(21600-this.leftpadding-this.rightpadding)/xNum;                                                                                                                                                            
                       
                      for(var i=1;i<this.data[0].length;i++){
                            lineArr[i-1]="";
                      }
                     
                      for(var i=1;i<this.data.length;i++){                                                                                          
                             //draw line                                        
                             for(var j=1;j<this.data[i].length;j++){   
                             
                                    var xPos=parseInt((i-1+firstYearLeftUnit)*xSpace)+this.leftpadding; 
                                    
                                    //xPos2 用途是 线条整体向右移动一个单位，否则，xPos2应该用xPos代替
                                    var xPos2=parseInt((i+firstYearLeftUnit)*xSpace)+this.leftpadding; 
                                    
                                    var yPos=this.YTrans(this.data[i][j],yMin,ySpace) 
                                    
                                    if(this.displayBlankForZero&&this.data[i][j]==0){
                                        ;   
                                    }
                                    else{
                                        lineArr[j-1]+=' '+xPos2+','+yPos; 
                                    }
                                    //lineArr[j-1]+=' '+xPos+','+yPos; 
                                    
                                    
                                    
                                    //计算 dataArr{}
                                    if(j==1){
                                        dateArr[this.data[i][0]] =xPos;
                                    }
                                    
                                    
                                    //计算标记点坐标
                                    if(j==1&&tmpMarkHash[this.data[i][0]]){
                                       markArr[markArr.length]=[xPos,yPos,tmpMarkHash[this.data[i][0]]];
                                    }
                                    
                                    //如果是面积图，则连接起始点
                                    if(i==this.data.length-1&&this.getFilledColor2(j-1)!=""){
                                         var xPos0 = firstYearLeftUnit*xSpace+ this.leftpadding ;
                                         lineArr[j-1]+=" "+xPos2+","+y0+" "+xPos0+" ,"+y0+" "+  xPos0+","+ this.YTrans(this.data[1][j],yMin,ySpace);
                                    }
                                     
                             }  
                             
                             //make xArr
                             if(yearHash[this.data[i][0]]!=undefined){
                                      xArr[yearHash[this.data[i][0]]]=xPos;
                             }                                                  
                      } 
                      
                      
                      //add last  item for xArr
                      xArr[(parseInt(thisYear)+1).toString()]= parseInt(this.data.length-1+ firstYearLeftUnit+thisYearLeftUnit)*xSpace + this.leftpadding;  //21600-this.rightpadding-this.leftpadding;//
                      
                      //changefirst item for xArr;
                      xArr[firstYear]= this.leftpadding +emptyUnitCount*xSpace;                      
                      break;
                      
             case "bar":
             
                       
                      if(this.yearAsUnit){              
                         //每条竖线也占有一个Bar的宽度
                         xNum+=yearCount;    
                         xNum+= emptyYearCount;
                         
                      }
                       
                      
                      xNum+=thisYearLeftUnit+firstYearLeftUnit;
                      
                  
                     //为了画最后一条竖线                                         
                     // xNum++;
                      
                      xSpace=(21600-this.leftpadding-this.rightpadding)/xNum; 
                       
                      var lineArr=new Array();                  
                      for(var i=1;i<this.data[0].length;i++){
                         lineArr[i-1]=new Array();
                      }                                  
                   
                      //make xArr and LineArr;
                      var totalSpace=this.leftpadding+firstYearLeftUnit*xSpace ; 
                      if(this.yearAsUnit){
                            totalSpace+=emptyYearCount*xSpace;
                      }
                              
                      //考虑第一条竖线的位置，坐标整体向左移动
                      //一共显示多少个系列
                      
                      var colNum = this.data[0].length-1;                       
                      totalSpace-=barWidth/2*colNum;
                      
                      for(var i=1;i<this.data.length;i++){  
                      
                            if(yearHash[this.data[i][0]]!=undefined){                                             
                                     if(this.yearAsUnit){              
                                          xArr[yearHash[this.data[i][0]]]= totalSpace+barWidth*(this.data[i].length-1)/2                                           
                                          totalSpace+=xSpace ;                                
                                     }
                                     else
                                        xArr[yearHash[this.data[i][0]]]= totalSpace+barWidth*(this.data[i].length-1);
                                  
                            }      
                            
                             
                            
                            for(var j=1;j<this.data[i].length;j++){                             
                                   var yPos=this.YTrans(this.data[i][j],yMin,ySpace);                                                                       
                                   var xPos = parseInt(totalSpace);
                                     
                                   lineArr[j-1].push([xPos,yPos]); 
                                   
                                   //标记
                                   if(j==1&&tmpMarkHash[this.data[i][0]]){
                                        markArr.push([ parseInt(totalSpace),yPos,tmpMarkHash[this.data[i][0]]  ]);
                                   } 
                            
                            } 
                            totalSpace+=xSpace;   
                                                     
                      } 
                        
                      //set first and last xline  
                      xArr[firstYear] = this.leftpadding+emptyUnitCount*xSpace   ;  
                      
                       
                      if(this.yearAsUnit){              
                            xArr[firstYear] +=emptyYearCount*xSpace ;
                         
                      }                                            
                      
                      xArr[parseInt( thisYear) + 1] = totalSpace+ thisYearLeftUnit*xSpace + barWidth*colNum/2; //(thisYearLeftUnit+1)*xSpace+ parseInt( barWidth /2);                 
                 
                      break;
           case  "pjline":
                            
                      xNum+=firstYearLeftUnit+ thisYearLeftUnit;                                                                                                  
                      xSpace=(21600-this.leftpadding-this.rightpadding)/xNum;                                                                                                                                                            
                          
                      for(var i=1;i<this.data[0].length;i++){
                            lineArr[i-1]=new Array();
                      }
                     
                      for(var i=1;i<this.data.length;i++){                                                                                          
                             //draw line                                        
                             for(var j=1;j<this.data[i].length;j++){   
                             
                                    var xPos=parseInt((i-1+firstYearLeftUnit)*xSpace)+this.leftpadding; 
                                    var yPos=this.YTrans(this.data[i][j],yMin,ySpace)                                                     
                                    lineArr[j-1].push([xPos,yPos]); 
                                    
                                    //计算标记点坐标
                                    if(j==1&&tmpMarkHash[this.data[i][0]]){
                                       markArr[markArr.length]=[xPos,yPos,tmpMarkHash[this.data[i][0]]];
                                    }
                                                             
                             }                               
                             //make xArr
                             if(yearHash[this.data[i][0]]!=undefined){
                                    xArr[yearHash[this.data[i][0]]]=xPos;
                             } 
                                                 
                      } 
                       
                        
                      //add last  item for xArr               //parseInt((i-1+firstYearLeftUnit)*xSpace)+this.leftpadding; 
                      xArr[(parseInt(thisYear)+1).toString()]= parseInt(this.data.length - 1+ firstYearLeftUnit+ thisYearLeftUnit )*xSpace+this.leftpadding;  //21600-this.rightpadding-this.leftpadding;//
                      
                      //changefirst item for xArr;
                      xArr[firstYear]= this.leftpadding+emptyUnitCount*xSpace;
                     
                      
                      break;
          
           }
           
           
           if(true){
                   if(this.displayLeftUnitOfYear){  
                             
               
                           
                         var tmpXArr={};   
                         var yearSpace=0;
                         yearSpace=  xArr[(parseInt(firstYear) +1).toString() ] -xArr[firstYear];
                         
                                                     
                         for(var i=0;i<=emptyYearCount;i++){
                                //tmpXArr[(firstYear-i-1).toString()] = xArr[firstYear]-(i)* yearSpace ;
                                tmpXArr[(firstYear-i).toString()] = xArr[firstYear]-(i)* yearSpace ;
                         }    
                          
                         for( var n in xArr){
                               tmpXArr[n]=xArr[n];                  
                         } 
                        
                         //排序
                         var tmpArr=[];
                         for(var n in tmpXArr){
                               tmpArr.push(n);
                         }
                         tmpArr.sort();
                          
                         var newArr={}; 
                         for(i =0 ;i <tmpArr.length;i++){
                            newArr[tmpArr[i]] = tmpXArr[tmpArr[i]];
                         } 
                          
                         xArr =   newArr;
                                                 
                   } 
                   
                    
           }
           
           
          //xArr 竖线的位置
          //lineArr 是图表的数据
          return {"xNum":xNum,"yMin":yMin,"yMax":yMax,"ySpace":ySpace,"xSpace":xSpace,"y0":y0,"lineArr":lineArr,"xArr":xArr,"yearCount":yearCount+1,"markArr":markArr,"dateArr":dateArr};
                     
    }
    
    
 }//chart
           
    
    //**********************************************
    //********** painter ***************************
    //**********************************************
     var painter =function(){};
         painter.drawPolyline=function(pContainer,pleft,ptop,pwidth,pheight,ppoints,pcolor,pweight,pstyle,pfcolor){
                var vLine=document.createElement("v:polyline");
                pContainer.appendChild(vLine);
                with(vLine){
                         coordsize="21600,21600";
                         style.width=pwidth+"px";
                         style.height=pheight+ "px";
                         style.top=ptop+"px";
                         style.left=pleft+"px"; 
                          
                      
                         points.value=ppoints;
                         //points=ppoints;
  
                         var color=pcolor||"";
                         if(pcolor==""){
                            stroked="false"
                         } 
                         else
                         {                                
                               stroked="true";
                               //strokecolor.value=color;
                               strokecolor=color;
                               strokeweight=pweight||"0.5"
                               strokestyle=pstyle||"solid";                   
                         } 
                          
                          
                         var fcolor=pfcolor||"";
                         if(fcolor!="") {
                             filled="true";
                             //fillcolor.value=fcolor;   
                             fillcolor=fcolor;   
                                  
                         }
                         else{
                             filled="false";
                         }
                          
                   
                          
                    }           
                    return vLine;
         }
        
 
       
       painter.drawGroup=function(pContainer,pleft,ptop,pwidth,pheight,pcoordsize ){
       
              var vGroup=document.createElement("v:group");
              pContainer.appendChild(vGroup);
              
              with(vGroup){           
                      
                     style.top=ptop+'px';
                     style.left=pleft+'px';
                     style.width=pwidth+'px';
                     style.height=pheight+'px';              
                     coordsize=pcoordsize||"21600,21600";
                     style.position="relative";
                     //style.position="static";
                     //style.position="absolute";
                      
                     
              }
              
 
              return vGroup;
       }
     
       //new ,drawText 将会逐渐被代替
       painter.drawText2=function(pContainer,ptxt,pleft,ptop,pwidth,pheight,prectclass,ptextclass,ptextinset,ptextstyle){
       
              var s = "<v:rect style='top:"+ptop+"px; left:"+pleft+"px; width:"+pwidth+"px; height:"+pheight+"px' class="+prectclass+" stroked=false><v:textbox>bbb</v:textbox></v:rect>";                              
              var vDataItem=document.createElement(s);
              
              //vDataItem.innerText = ptxt;
              //pContainer.appendChild(vDataItem);
              //vDataItem.innerHTML = "<v:rect style='top:"+ptop+"px; left:"+pleft+"px; width:"+pwidth+"px; height:"+pheight+"px' class="+prectclass+"></v:rect>";
              //vDataItem.outerHTML=
              //  var s="<v:rect style='top:"+ptop+"px;left:"+pleft+"px;width:"+pwidth+"px;height:"+pheight+"px' class="+prectclass+"><v:textbox  "+textstyle+" inset='"+textinset+"'  class='"+ptextclass+"'>"+ptxt+"</v:textbox></v:rect>"
              //var s="<?xml:namespace prefix=v ns='urn:schemas-microsoft-com:vml' /><v:rect style='top:"+ptop+"px;left:"+pleft+"px;width:"+pwidth+"px;height:"+pheight+"px' class="+prectclass+"></v:rect>";
              //vDataItem.outerHTML=s;
              
              //alert(vDataItem.outerHTML);
              //return vDataItem;
             
                          
             // return; 
              with(vDataItem){
                    
                    //style.top=ptop+"px";
                    //style.left=pleft+"px";
                    //style.width=pwidth+"px";
                   // style.height=pheight+"px"; 
                    //if(prectclass!=undefined && prectclass!="")
                    //   className= prectclass;
                  
                    //stroked="false";
                                
                     
                   
                    var textinset=ptextinset||"0pt,0pt,0pt,0pt"
                    
                    var textstyle=ptextstyle||"";
                    if(textstyle!=""){
                       textstyle=" style='"+textstyle+"' "
                    }
                    else
                       textstyle="";
                       
                 
                    
                    if(ptextclass!=undefined&&ptextclass!="")
                            innerHTML="<v:textbox  "+textstyle+" inset='"+textinset+"'  class='"+ptextclass+"'>"+ptxt+"</v:textbox>"; 
                    else
                            innerHTML="<v:textbox  "+textstyle+" inset='"+textinset+"'>"+ptxt+"</v:textbox>"; 
                    
                    
               
               }
               
               
               pContainer.appendChild(vDataItem); 
              return vDataItem;
            
        }

     
        painter.drawText=function(pContainer,ptxt,pleft,ptop,pwidth,pheight,ptextstyle,ptextinset,prectstyle ){
              var vDataItem=document.createElement("v:rect");
              pContainer.appendChild(vDataItem);
              with(vDataItem){
                    style.top=ptop+"px";
                    style.left=pleft+"px";
                    style.width=pwidth+"px";
                    style.height=pheight+"px";
                    style.textAlign="right";
                    style.verticalAlign="middle";
                  

                        
                    stroked="false";
                                       
                    var textstyle=ptextstyle||"font-size:9pt";
                    textstyle+=";line-height:19px;";
                     
                    //if(!textstyle.search(/font-size/ig)) 
                    //    textstyle+=";font-size:10px";
                    var textinset=ptextinset||"0pt,0pt,0pt,0pt"
                    //innerHTML="<v:textbox inset= '"+textinset+"' style='"+textstyle+"'>"+ptxt+"</v:textbox>";       
                    innerHTML="<v:textbox inset= '"+textinset+"' style='"+textstyle+"'>"+ptxt+"</v:textbox>";       
               
               }
               
              return vDataItem;
        }

        painter.drawTextBox =function(pContainer,pstyle){
              var vDataItem=document.createElement("v:textbox");
              pContainer.appendChild(vDataItem);
              with(vDataItem){
                     //style.value=pstyle;
               }
               
              return vDataItem;
        }
        
        painter.drawTextBox2 =function(pContainer,ptext,pstyle){
              var vDataItem=document.createElement("v:textbox");
              pContainer.appendChild(vDataItem);
              with(vDataItem){
                   innerHTML=ptext;
                   if(pstyle!=undefined&&pstyle!="")
                   style.value=pstyle;                
               }                                              
              return vDataItem;
        }
        


        painter.drawLine=function(pContainer,pfromx,pfromy,ptox,ptoy,pcolor,pweight,pdashstyle){
              var vLine=document.createElement("v:line"); 
              
              pContainer.appendChild(vLine);
              with(vLine){
                  from=pfromx+','+pfromy;
                  to=ptox+','+ptoy;
              
              }
              vStroke=document.createElement("v:stroke");
              vLine.appendChild(vStroke);
              with(vStroke){
                  on="true";            
                  color=pcolor||""   ;              
                  weight=pweight||"0.5";              
                  dashstyle=pdashstyle||"solid";
                   //style="single";
                         
              }    
         
             return vLine;
         }


          
        painter.drawRect=function(pContainer,pleft,ptop,pwidth,pheight,filledcolor,strokecolor){
                  var vRect=document.createElement("v:rect");
                  pContainer.appendChild(vRect);
                  with(vRect){
                      style.width=pwidth+"px"
                      style.height=pheight+"px"
                      style.left=pleft+"px";
                      style.top=ptop+"px";
                   }
                   var fcolor=filledcolor||"";
                   if(fcolor!=""){
                        vRect.filled=true;
                        vRect.fillcolor=filledcolor;
                    }
                  
                   var scolor=strokecolor||"";
                   if(scolor==""){
                      vRect.stroked="false";
                   }
                   else
                   {
                      vRect.stroked="true";
                      vRect.strokecolor=strokecolor;
                   }
                    
                   return vRect;
        }
           
                
        painter.drawPieSlice = function(pContainer,pleft, ptop, pwidth,pheight,startAngle, Angle,pfillColor) {
               
               var vPieEl=document.createElement("v:shape");
               pContainer.appendChild(vPieEl);
                
               var mX=65536*360;// 2^16,  Math.pow(2,16) * 360;
                
               with(vPieEl){
               
                   style.top=ptop+"px";
                   style.left=pleft+"px";
                   style.width=pwidth+"px";
                   style.height=pheight+"px";
                   coordsize="1400,1400";
                   //vPieEl.strokecolor="white";
                   filled="true";
                   fillColor=pfillColor;   
               
                  
               }
               //vPieEl.path="M 750 700 AE 750 700 750 700 " + parseInt(mX * startAngle) +" " + parseInt(mX * Angle) +" xe";
                //vPieEl.path="M 750 700 AE 750 700 1500 1400 " + parseInt(mX * startAngle) +" " + parseInt(mX * Angle) +" xe";
                vPieEl.path="M 700 700 AE 700 700 700 700 " + parseInt(mX * startAngle) +" " + parseInt(mX * Angle) +" xe";
        
              return vPieEl;
        }            
      
      
         
      
        painter.drawOval = function(pContainer,pleft,ptop,pwidth,pheight,config){
        
             var conf= config||{};
        
             var v =document.createElement("v:oval");
               
             with(v){
                  style.top= ptop-pheight/2;
                  style.left=pleft-pwidth/2;
                  style.width=pwidth;
                  style.height=pheight;
                  
                     
                  v.stroked=conf["strocked"]||false;                  
                  if(conf["strokedcolor"]){
                      v.stroked="true";
                      v.strokeweight=conf["strokeweight"]||"0.75pt";
                      v.stockecolor=conf["strokedcolor"];
                  } 
                  
                   
                  if(conf["filledcolor"]){
                     v.fill="true";
                     v.fillcolor=conf["filledcolor"];                     
                  }
                  
                    
             }
            
            pContainer.appendChild(v);                     
        }
      
      
        //2个工具类
        //像素值对应的     
        painter.px2coord=function(currentPX,totalPX,totalCoord){
              totalCoord=totalCoord||21600;
              return parseInt(  (totalCoord /totalPX)*currentPX);
        }  
        
        painter.coord2px=function(currentCoord,totalPX,totalCoord){
              
              totalCoord=totalCoord||21600;
              
              return parseInt((totalPX/totalCoord)*currentPX);
              
        }  

