showbigsvg.js
上传用户:zhou95159
上传日期:2013-06-28
资源大小:11k
文件大小:14k
源码类别:

Oracle数据库

开发平台:

Visual C++

  1. var arrColors   = ['red','green','blue','yellow','navy','gold','dodgerblue','navajowhite','mediumpurple'];
  2. //数组排序函数,升序
  3. function s(a,b) {
  4.   return a - b;
  5. }
  6. //排序函数用法
  7. //array.sort(s);
  8. //删除数组中的一个元素,参数dx表示该元素的index
  9. Array.prototype.baoremove = function(dx)
  10. {
  11.   if(isNaN(dx)||dx>this.length){return false;}
  12.   this.splice(dx,1);
  13. }
  14. //重新排列数组,去掉为空的值或者非正常的值
  15. //参数是一个两维数组,第一维表示数值的数组,第二维表示年份的数组,
  16. //两个子数组在排序前后均须保持一一对应关系
  17. function resortArray() {
  18.   //var tmparr1 = tmparr[0];
  19.   //var tmparr2 = tmparr[1];
  20.   var len = arrUseValue.length;
  21.   var tmpi = 0;
  22.   for(var i=0; i<len; i++) {
  23.     if(isNaN(arrUseValue[tmpi])) {
  24.       arrUseValue.baoremove(tmpi);
  25.       arrUseYear.baoremove(tmpi);
  26.       tmpi = (i > 0) ? i : 0;
  27.       //tmparr1.baoremove(i);
  28.       //tmparr2.baoremove(i);
  29.     } else {
  30.       tmpi = i + 1;
  31.     }
  32.   }
  33.   //var retarr = new Array(tmparr1,tmparr2);
  34.   //return retarr;
  35. }
  36. function getMaxValue(tmparr) {
  37.   var maxValue = 0;
  38.   for (var i=0; i<tmparr.length; i++) {
  39.     var value = parseFloat(tmparr[i]);
  40.     if (value > maxValue) maxValue = value;
  41.   }
  42.   maxValue = Math.ceil(maxValue);
  43.   return maxValue;
  44. }
  45. function getMinValue(tmparr) {
  46.   var minValue = 1000000000000000;
  47.   for (var i=0; i<tmparr.length; i++) {
  48.     var value = parseFloat(tmparr[i]);
  49.     if (value < minValue) {
  50.       minValue = value;
  51.     }
  52.   }
  53.   minValue = Math.floor(minValue);
  54.   return minValue;
  55. }
  56. function getMaxPeriod(tmparr) {
  57.   var maxValue = 0;
  58.   for (var i=0; i<tmparr.length; i++) {
  59.     var value = tmparr[i][0];
  60.     if (value > maxValue) maxValue = value;
  61.   }
  62.   return maxValue;
  63. }
  64. function getMinPeriod(tmparr) {
  65.   var minPeriod = 3000;
  66.   for (var i=0; i<tmparr.length; i++) {
  67.     var value = tmparr[i][0];
  68.     if (value < minPeriod) minPeriod = value;
  69.   }
  70.   return minPeriod;
  71. }
  72. //显示提示窗口    
  73. function ShowTooltip(mousemove_event,txt)
  74. {
  75.   //obj=mousemove_event.target.parentNode;
  76.   //obj.style.setProperty("opacity","0.5");
  77.   
  78.   var ttrelem,tttelem,posx,posy,curtrans,ctx,cty;
  79.   ttrelem=svgDoc.getElementById("ttr");
  80.   tttelem=svgDoc.getElementById("ttt");
  81.   posx=mousemove_event.clientX;
  82.   posy=mousemove_event.clientY;
  83.   tttelem.childNodes.item(0).data=txt;
  84.   curtrans=svgDoc.documentElement.currentTranslate;
  85.   ctx=curtrans.x;
  86.   cty=curtrans.y;
  87.   ttrelem.setAttribute("x",posx-ctx);
  88.   ttrelem.setAttribute("y",posy-cty-20);
  89.   tttelem.setAttribute("x",posx-ctx+5);
  90.   tttelem.setAttribute("y",posy-cty-8);
  91.   ttrelem.setAttribute("width",tttelem.getComputedTextLength()+30);
  92.   tttelem.setAttribute("style","fill: #00C; font-size: 13px; visibility: visible");
  93.   ttrelem.setAttribute("style","fill: #FFC; stroke: #000; stroke-width: 0.5px;
  94.     visibility: visible");
  95. }
  96. //隐藏提示窗口
  97. function HideTooltip(mouseout_event)
  98. {
  99.   //obj=mouseout_event.target.parentNode;
  100.   //obj.style.setProperty("opacity","1.0");
  101.   
  102.   var ttrelem,tttelem;
  103.   ttrelem=svgDoc.getElementById("ttr");
  104.   tttelem=svgDoc.getElementById("ttt");
  105.   ttrelem.setAttribute("style","visibility: hidden");
  106.   tttelem.setAttribute("style","visibility: hidden");
  107. }
  108. //窗口缩放
  109. function ZoomControl()
  110. {
  111.   var curzoom;
  112.   curzoom=svgDoc.documentElement.currentScale;
  113.   svgDoc.getElementById("tooltip").setAttribute("transform","scale("+1/curzoom+")");
  114. }
  115.     
  116. //清除svg图像中的所有元素,便于重新画图
  117. function deleItem() {
  118.   //var gnode = svgDoc.getElementById("gc");
  119.   while (gnode.getChildNodes().getLength() > 0) {
  120.     gnode.removeChild(gnode.getFirstChild());
  121.   }
  122. }
  123. //画折线图,第一个参数是数值数组,
  124. //第二个参数是最小值,第三个参数是最大值
  125. function drawPolyline(tmparr,tmpminv,tmpmaxv) {
  126.   var vpoint = "";
  127.   var t = tmparr.length;
  128.   var addv = 320 / (t - 1);
  129.   var vx = 29;
  130.   var vy = 10;
  131.   tmpdiv = (tmpmaxv - tmpminv) / 10;
  132.   
  133.   tmpmaxv = Math.ceil(tmpmaxv + tmpdiv);
  134.   tmpminv = Math.floor(tmpminv - tmpdiv);
  135.   
  136.   for(var i=0;i<t;i++) {
  137.     var txtcirc = arrUseYear[i] + ", " + tmparr[i];
  138.     //确定x坐标
  139.     vx = 29 + i * addv;
  140.     vpoint += vx + ",";
  141.     //确定y坐标
  142.     //alert(tmparr[i]);
  143.     vy = 230 - (tmparr[i] - tmpminv) / (tmpmaxv - tmpminv) * 220;
  144.     vpoint += vy + ",";
  145.     //alert(vx);
  146.     //alert(vy);
  147.     //alert(vpoint);
  148.     //添加小圆点
  149.     var newcircle = svgDoc.createElement("circle");
  150.     newcircle.setAttribute("cx",vx);
  151.     newcircle.setAttribute("cy",vy);
  152.     newcircle.setAttribute("r",2);
  153.     newcircle.setAttribute("style","cursor:crosshair;fill:" + arrColors[i]);
  154.     newcircle.setAttribute("onmouseover","ShowTooltip(evt,'" + txtcirc + "')" );
  155.     newcircle.setAttribute("onmouseout","HideTooltip(evt)");
  156.     gnode.appendChild(newcircle);
  157.   }
  158.   vpoint  = vpoint.substring(0,(vpoint.length - 1));
  159.   //alert(vpoint);
  160.   var newpoly = svgDoc.createElement("polyline");
  161.   newpoly.setAttribute("points",vpoint);
  162.   newpoly.setAttribute("style","fill: none; stroke: #00C; stroke-width: 1.5px");
  163.   gnode.appendChild(newpoly);
  164. }
  165. //画柱状图,第一个参数是数值数组,
  166. //第二个参数是最小值,第三个参数是最大值
  167. function drawRectange(tmparr,tmpminv,tmpmaxv) {
  168.   var vpoint = "";
  169.   var t = tmparr.length;
  170.   //var addv = 32.5;
  171.   var addv = (349 - 29 - 15) / (t - 1);
  172.   var vx = 29;
  173.   var vy = 0;
  174.   tmpdiv = (tmpmaxv - tmpminv) / 10;
  175.   
  176.   tmpmaxv = Math.ceil(tmpmaxv + tmpdiv);
  177.   tmpminv = Math.floor(tmpminv - tmpdiv);
  178.   for(var i=0;i<t;i++) {
  179.     var txtrect = arrUseYear[i] + ", " + tmparr[i];
  180.     //确定x坐标
  181.     vx = 29 + i * addv;
  182.     //确定y坐标
  183.     vy = 230 - (tmparr[i] - tmpminv) / (tmpmaxv - tmpminv) * 220;
  184.     var newrect = svgDoc.createElement("rect");
  185.     newrect.setAttribute("x",vx);
  186.     newrect.setAttribute("y",vy);
  187.     newrect.setAttribute("width",15);
  188.     newrect.setAttribute("height",(230 - vy));
  189.     newrect.setAttribute("style","cursor:crosshair;fill:" + arrColors[i]);
  190.     newrect.setAttribute("onmouseover","ShowTooltip(evt,'" + txtrect + "')" );
  191.     newrect.setAttribute("onmouseout","HideTooltip(evt)");
  192.     gnode.appendChild(newrect);
  193.   }
  194. }
  195. //画饼图,第一个参数是数值数组,第二个参数是年份数组
  196. function drawPie(tmparr1,tmparr2) {
  197.     var basePointX     = 126.;
  198.     var basePointY     = 129.;
  199.     var currentX       = 0.0;
  200.     var currentY       = 0.0;
  201.     var offsetX1       = 0.0;
  202.     var offsetY1       = 0.0;
  203.     var offsetX2       = 0.0;
  204.     var offsetY2       = 0.0;
  205.     var radius         = 125.;
  206.     var angleSum1      = 0.;
  207.     var angleSum2      = 0.;
  208.     var vertexCount    = tmparr1.length;
  209.     var xPts           = Array(vertexCount);
  210.     var yPts           = Array(vertexCount);
  211.     var angles         = Array(vertexCount);
  212.     var pointPath      = "";
  213.     var colorCount     = arrColors.length;
  214.     var pieNode        = null;
  215.     var gcNode         = null;
  216.     
  217.     var dataSum = 0.;
  218.     for(var v=0; v<vertexCount; v++)
  219.     {
  220.        dataSum += Math.abs(parseFloat(tmparr1[v]));
  221.     }
  222.     //alert(dataSum);
  223.     for(var v=0; v<vertexCount; v++)
  224.     {
  225.        angles[v] = 360.*Math.abs(parseFloat(tmparr1[v]))/dataSum;
  226.     }
  227.     //alert(angles);
  228.     gcNode = svgDoc.getElementById("gc");
  229.     var txtstyle = "text-anchor:left;";
  230.     for(var v=0; v<vertexCount; v++)
  231.     {
  232.        angleSum2 = angleSum1 + angles[v];
  233.        var txtpv = parseInt(Math.abs(tmparr1[v])/dataSum *10000) / 100 + "%";
  234.        
  235.        offsetX1 = radius*Math.cos(angleSum1*Math.PI/180);
  236.        offsetY1 = radius*Math.sin(angleSum1*Math.PI/180);
  237.        offsetX2 = radius*Math.cos(angleSum2*Math.PI/180);
  238.        offsetY2 = radius*Math.sin(angleSum2*Math.PI/180);
  239.        currentX = basePointX+offsetX2;
  240.        currentY = basePointY-offsetY2;
  241.       // the vertical offset must be subtracted,
  242.       // so we need to "flip" the sign of offsetY1
  243.        offsetY1 *= -1;
  244.        pointPath = "M"+basePointX+","+basePointY;
  245.        pointPath += " l"+offsetX1+","+offsetY1;
  246.        if(angles[v] < 180 ) {
  247.          pointPath += " A"+radius+","+radius+" 0 0 0 ";
  248.        } else {
  249.          pointPath += " A"+radius+","+radius+" 0 1 0 ";
  250.        }
  251.        pointPath += currentX+","+currentY;
  252.        pointPath += " L"+basePointX+","+
  253.                         basePointY+"z";
  254.        fillColor  = "fill:" + arrColors[v%colorCount];
  255.        txtGnode = tmparr2[v] + "," + tmparr1[v] + "," + txtpv;
  256.        var newg = svgDoc.createElement("g");
  257.        newg.setAttribute("onmouseover","ShowTooltip(evt,'" + txtGnode + "')" );
  258.        newg.setAttribute("onmouseout","HideTooltip(evt)");
  259.        gcNode.appendChild(newg);
  260.        pieNode = svgDoc.createElement("path");
  261.        pieNode.setAttribute("d",    pointPath);
  262.        pieNode.setAttribute("style",fillColor);
  263.        newg.appendChild(pieNode);
  264.        
  265.        var recNode = svgDoc.createElement("rect");
  266.        recNode.setAttribute("x",253);
  267.        recNode.setAttribute("y",(10 + v*20));
  268.        recNode.setAttribute("width",8);
  269.        recNode.setAttribute("height",8);
  270.        recNode.setAttribute("style",fillColor);
  271.        newg.appendChild(recNode);
  272.        
  273.        var txtNode = svgDoc.createElement("text");
  274.        txtNode.setAttribute("x",264);
  275.        txtNode.setAttribute("y",(15 + v*20));
  276.        txtst = txtstyle + fillColor;
  277.        txtNode.setAttribute("style",txtst);
  278.        newg.appendChild(txtNode);
  279.        texte=svgDoc.createTextNode(tmparr2[v] + "[" + txtpv + "]");
  280.        txtNode.appendChild(texte);
  281.        angleSum1 += angles[v];
  282.     }
  283. }
  284. //设定x轴坐标,画线及添加标题,参数是年份数组
  285. function setXAxis(tmparr) {
  286.   //画x轴线
  287.   var newline = svgDoc.createElement("line");
  288.   newline.setAttribute("x1",29);
  289.   newline.setAttribute("y1",230);
  290.   newline.setAttribute("x2",349);
  291.   newline.setAttribute("y2",230);
  292.   newline.setAttribute("style","stroke-width:2;stroke:blue");
  293.   gnode.appendChild(newline);
  294.   
  295.   var t = tmparr.length - 1;
  296.   var addv = 320 / t;
  297.   var addt = 300 / t;
  298.   var sumlv = 29;
  299.   var sumtv = 20;
  300. //画x轴的文字
  301.   newtext = svgDoc.createElement("text");
  302.   newtext.setAttribute("x",sumtv);
  303.   newtext.setAttribute("y",249);
  304.   gnode.appendChild(newtext);
  305.   texte=svgDoc.createTextNode(tmparr[0]);
  306.   newtext.appendChild(texte);
  307.   for(var i=0;i<t;i++) {
  308.     //画x轴的小短线
  309.     sumlv = 29 + (i + 1) * addv;
  310.     newline = svgDoc.createElement("line");
  311.   newline.setAttribute("x1",sumlv);
  312.   newline.setAttribute("y1",0);
  313.   newline.setAttribute("x2",sumlv);
  314.   newline.setAttribute("y2",230);
  315.   newline.setAttribute("style","stroke-width:0.5;stroke:white");
  316.   gnode.appendChild(newline);
  317.   //画x轴的文字
  318.   sumtv = 17 + (i + 1) * addt;
  319.   newtext = svgDoc.createElement("text");
  320.   newtext.setAttribute("x",sumtv);
  321.   newtext.setAttribute("y",249);
  322.   gnode.appendChild(newtext);
  323.   texte=svgDoc.createTextNode(tmparr[i+1]);
  324.     newtext.appendChild(texte);
  325.   }
  326. }
  327. //设定y轴坐标,画线及添加标题,第一个参数是最小值,第二个参数是最大值
  328. function setYAxis(tmpminv,tmpmaxv) {
  329.   //画y轴线
  330.   var newline = svgDoc.createElement("line");
  331.   newline.setAttribute("x1",29);
  332.   newline.setAttribute("y1",10);
  333.   newline.setAttribute("x2",29);
  334.   newline.setAttribute("y2",230);
  335.   newline.setAttribute("style","stroke-width:2;stroke:blue");
  336.   gnode.appendChild(newline);
  337.   
  338.   var addv = 220 / 10;
  339.   var sumlv = 0;
  340.   var sumtv = 4;
  341.   tmpdiv = (tmpmaxv - tmpminv) / 10;
  342.   tmpmaxv = Math.ceil(tmpmaxv + tmpdiv);
  343.   tmpminv = Math.floor(tmpminv - tmpdiv);
  344.   var divtxt = (tmpmaxv - tmpminv) / 10;
  345.   for(var i=0;i<10;i++) {
  346.     //画y轴的小短线
  347.     sumlv = 10 + i * addv;
  348.     newline = svgDoc.createElement("line");
  349.   newline.setAttribute("x1",29);
  350.   newline.setAttribute("y1",sumlv);
  351.   newline.setAttribute("x2",349);
  352.   newline.setAttribute("y2",sumlv);
  353.   newline.setAttribute("style","stroke-width:0.5;stroke:white");
  354.   gnode.appendChild(newline);
  355. }
  356. for(var i=0;i<11;i++) {
  357.   //画y轴的文字
  358.   //if(i == 0) {
  359.     //sumtv = 10;
  360.   //} else {
  361.     sumtv = 10 + i * 22.5;
  362.   //}
  363.   txtdata = tmpmaxv - Math.round(divtxt * i);
  364.   newtext = svgDoc.createElement("text");
  365.   newtext.setAttribute("x",1);
  366.   newtext.setAttribute("y",sumtv);
  367.   gnode.appendChild(newtext);
  368.   texte=svgDoc.createTextNode(txtdata);
  369.     newtext.appendChild(texte);
  370.   }
  371. }
  372. //设定公司的名称
  373. function setCompanyName(companyname) {
  374.   parent.all['svgtitle'].innerHTML = companyname;
  375. }
  376. //设定图象的标题,涉及到下拉框和标题栏的同时变动
  377. function setGraphTitle(title) {
  378.   //
  379. }
  380. //点击动态改变图象的函数,第一个参数是数值数组,第二个参数是年份数组
  381. //function svgViewChange(tmparr1,tmparr2) {
  382. function svgViewChange(tmparr1,tmparr2,type) {
  383.   //数组清除
  384.   //var tarr = new Array(tmparr1,tmparr2);
  385.   //tarr = resortArray(tarr);
  386.   arrUseValue = tmparr1;
  387.   arrUseYear = tmparr2;
  388.   resortArray();
  389.   svgType = type;
  390.   //arrUseValue = null;
  391.   //arrUseYear = null;
  392.   //arrUseValue = tarr[0];
  393.   //arrUseYear = tarr[1];
  394.   if(svgType == 1) {
  395.     deleItem();
  396.     useMinValue = getMinValue(arrUseValue);
  397.     useMaxValue = getMaxValue(arrUseValue);
  398.     setXAxis(arrUseYear);
  399.     setYAxis(useMinValue,useMaxValue);
  400.     drawPolyline(arrUseValue,useMinValue,useMaxValue);
  401.   } else if(svgType == 2) {
  402.     deleItem();
  403.     useMinValue = getMinValue(arrUseValue);
  404.     useMaxValue = getMaxValue(arrUseValue);
  405.     setXAxis(arrUseYear);
  406.     setYAxis(useMinValue,useMaxValue);
  407.     drawRectange(arrUseValue,useMinValue,useMaxValue);
  408.   } else if(svgType == 3) {
  409.     deleItem();
  410.     useMinValue = getMinValue(arrUseValue);
  411.     useMaxValue = getMaxValue(arrUseValue);
  412.     drawPie(arrUseValue,arrUseYear);
  413.   }
  414. }
  415. function opennewwin() {
  416.   window.open ('bigimg.html', 'svgnewwindow', 'height=400, width=400, top=100, left=100, toolbar=no, menubar=no, scrollbars=no,resizable=no,location=no, status=no');
  417. }