showsvg.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 = 152 / (t - 1);
  129.   var vx = 20;
  130.   var vy = 0;
  131.   tmpdiv = (tmpmaxv - tmpminv) / 5;
  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 = 20 + i * addv;
  140.     vpoint += vx + ",";
  141.     //确定y坐标
  142.     //alert(tmparr[i]);
  143.     vy = 120 - (tmparr[i] - tmpminv) / (tmpmaxv - tmpminv) * 120;
  144.     vpoint += vy + ",";
  145.     
  146.     //添加小圆点
  147.     var newcircle = svgDoc.createElement("circle");
  148.     newcircle.setAttribute("cx",vx);
  149.     newcircle.setAttribute("cy",vy);
  150.     newcircle.setAttribute("r",2);
  151.     newcircle.setAttribute("style","cursor:crosshair;fill:" + arrColors[i]);
  152.     newcircle.setAttribute("onmouseover","ShowTooltip(evt,'" + txtcirc + "')" );
  153.     newcircle.setAttribute("onmouseout","HideTooltip(evt)");
  154.     gnode.appendChild(newcircle);
  155.   }
  156.   vpoint  = vpoint.substring(0,(vpoint.length - 1));
  157.   //alert(vpoint);
  158.   var newpoly = svgDoc.createElement("polyline");
  159.   newpoly.setAttribute("points",vpoint);
  160.   newpoly.setAttribute("style","fill: none; stroke: #00C; stroke-width: 1.5px");
  161.   gnode.appendChild(newpoly);
  162. }
  163. //画柱状图,第一个参数是数值数组,
  164. //第二个参数是最小值,第三个参数是最大值
  165. function drawRectange(tmparr,tmpminv,tmpmaxv) {
  166.   var vpoint = "";
  167.   var t = tmparr.length;
  168.   //var addv = 32.5;
  169.   var addv = 130 / (t - 1);
  170.   var vx = 27;
  171.   var vy = 0;
  172.   tmpdiv = (tmpmaxv - tmpminv) / 5;
  173.   
  174.   tmpmaxv = Math.ceil(tmpmaxv + tmpdiv);
  175.   tmpminv = Math.floor(tmpminv - tmpdiv);
  176.   for(var i=0;i<t;i++) {
  177.     var txtrect = arrUseYear[i] + ", " + tmparr[i];
  178.     //确定x坐标
  179.     vx = 27 + i * addv;
  180.     //确定y坐标
  181.     vy = 120 - (tmparr[i] - tmpminv) / (tmpmaxv - tmpminv) * 120;
  182.     var newrect = svgDoc.createElement("rect");
  183.     newrect.setAttribute("x",vx);
  184.     newrect.setAttribute("y",vy);
  185.     newrect.setAttribute("width",15);
  186.     newrect.setAttribute("height",(120 - vy));
  187.     newrect.setAttribute("style","cursor:crosshair;fill:" + arrColors[i]);
  188.     newrect.setAttribute("onmouseover","ShowTooltip(evt,'" + txtrect + "')" );
  189.     newrect.setAttribute("onmouseout","HideTooltip(evt)");
  190.     gnode.appendChild(newrect);
  191.   }
  192. }
  193. //画饼图,第一个参数是数值数组,第二个参数是年份数组
  194. function drawPie(tmparr1,tmparr2) {
  195.     var basePointX     = 62.;
  196.     var basePointY     = 65.;
  197.     var currentX       = 0.0;
  198.     var currentY       = 0.0;
  199.     var offsetX1       = 0.0;
  200.     var offsetY1       = 0.0;
  201.     var offsetX2       = 0.0;
  202.     var offsetY2       = 0.0;
  203.     var radius         = 60.;
  204.     var angleSum1      = 0.;
  205.     var angleSum2      = 0.;
  206.     var vertexCount    = tmparr1.length;
  207.     var xPts           = Array(vertexCount);
  208.     var yPts           = Array(vertexCount);
  209.     var angles         = Array(vertexCount);
  210.     var pointPath      = "";
  211.     var colorCount     = arrColors.length;
  212.     var pieNode        = null;
  213.     var gcNode         = null;
  214.     
  215.     var dataSum = 0.;
  216.     for(var v=0; v<vertexCount; v++)
  217.     {
  218.        dataSum += Math.abs(parseFloat(tmparr1[v]));
  219.     }
  220.     //alert(dataSum);
  221.     for(var v=0; v<vertexCount; v++)
  222.     {
  223.        angles[v] = 360.*Math.abs(parseFloat(tmparr1[v]))/dataSum;
  224.     }
  225.     //alert(angles);
  226.     gcNode = svgDoc.getElementById("gc");
  227.     var txtstyle = "text-anchor:left;";
  228.     for(var v=0; v<vertexCount; v++)
  229.     {
  230.        angleSum2 = angleSum1 + angles[v];
  231.        var txtpv = parseInt(Math.abs(tmparr1[v])/dataSum *10000) / 100 + "%";
  232.        
  233.        offsetX1 = radius*Math.cos(angleSum1*Math.PI/180);
  234.        offsetY1 = radius*Math.sin(angleSum1*Math.PI/180);
  235.        offsetX2 = radius*Math.cos(angleSum2*Math.PI/180);
  236.        offsetY2 = radius*Math.sin(angleSum2*Math.PI/180);
  237.        currentX = basePointX+offsetX2;
  238.        currentY = basePointY-offsetY2;
  239.       // the vertical offset must be subtracted,
  240.       // so we need to "flip" the sign of offsetY1
  241.        offsetY1 *= -1;
  242.        pointPath = "M"+basePointX+","+basePointY;
  243.        pointPath += " l"+offsetX1+","+offsetY1;
  244.        if(angles[v] < 180 ) {
  245.          pointPath += " A"+radius+","+radius+" 0 0 0 ";
  246.        } else {
  247.          pointPath += " A"+radius+","+radius+" 0 1 0 ";
  248.        }
  249.        pointPath += currentX+","+currentY;
  250.        pointPath += " L"+basePointX+","+
  251.                         basePointY+"z";
  252.        fillColor  = "fill:" + arrColors[v%colorCount];
  253.        txtGnode = tmparr2[v] + "," + tmparr1[v] + "," + txtpv;
  254.        //alert(txtGnode);
  255.        var newg = svgDoc.createElement("g");
  256.        //newg.addEventListener("mouseover",OpacityDown,true);
  257.        //newg.addEventListener("mouseout",OpacityUp,true);
  258.        newg.setAttribute("onmouseover","ShowTooltip(evt,'" + txtGnode + "')" );
  259.        newg.setAttribute("onmouseout","HideTooltip(evt)");
  260.        gcNode.appendChild(newg);
  261.        pieNode = svgDoc.createElement("path");
  262.        pieNode.setAttribute("d",    pointPath);
  263.        pieNode.setAttribute("style",fillColor);
  264.        newg.appendChild(pieNode);
  265.        
  266.        var recNode = svgDoc.createElement("rect");
  267.        recNode.setAttribute("x",123);
  268.        recNode.setAttribute("y",(10 + v*10));
  269.        recNode.setAttribute("width",3);
  270.        recNode.setAttribute("height",3);
  271.        recNode.setAttribute("style",fillColor);
  272.        newg.appendChild(recNode);
  273.        
  274.        var txtNode = svgDoc.createElement("text");
  275.        txtNode.setAttribute("x",128);
  276.        txtNode.setAttribute("y",(15 + v*10));
  277.        txtst = txtstyle + fillColor;
  278.        txtNode.setAttribute("style",txtst);
  279.        newg.appendChild(txtNode);
  280.        texte=svgDoc.createTextNode(tmparr2[v] + "[" + txtpv + "]");
  281.        txtNode.appendChild(texte);
  282.        angleSum1 += angles[v];
  283.     }
  284. }
  285. //设定x轴坐标,画线及添加标题,参数是年份数组
  286. function setXAxis(tmparr) {
  287.   //画x轴线
  288.   var newline = svgDoc.createElement("line");
  289.   newline.setAttribute("x1",20);
  290.   newline.setAttribute("y1",120);
  291.   newline.setAttribute("x2",172);
  292.   newline.setAttribute("y2",120);
  293.   newline.setAttribute("style","stroke-width:2;stroke:blue");
  294.   gnode.appendChild(newline);
  295.   
  296.   var t = tmparr.length - 1;
  297.   var addv = 152 / t;
  298.   var addt = 144 / t;
  299.   var sumlv = 20;
  300.   var sumtv = 17;
  301. //画x轴的文字
  302.   newtext = svgDoc.createElement("text");
  303.   newtext.setAttribute("x",sumtv);
  304.   newtext.setAttribute("y",127);
  305.   gnode.appendChild(newtext);
  306.   texte=svgDoc.createTextNode(tmparr[0]);
  307.   newtext.appendChild(texte);
  308.   for(var i=0;i<t;i++) {
  309.     //画x轴的小短线
  310.     sumlv = 20 + (i + 1) * addv;
  311.     newline = svgDoc.createElement("line");
  312.   newline.setAttribute("x1",sumlv);
  313.   newline.setAttribute("y1",0);
  314.   newline.setAttribute("x2",sumlv);
  315.   newline.setAttribute("y2",120);
  316.   newline.setAttribute("style","stroke-width:0.5;stroke:white");
  317.   gnode.appendChild(newline);
  318.   //画x轴的文字
  319.   sumtv = 17 + (i + 1) * addt;
  320.   newtext = svgDoc.createElement("text");
  321.   newtext.setAttribute("x",sumtv);
  322.   newtext.setAttribute("y",127);
  323.   gnode.appendChild(newtext);
  324.   texte=svgDoc.createTextNode(tmparr[i+1]);
  325.     newtext.appendChild(texte);
  326.   }
  327. }
  328. //设定y轴坐标,画线及添加标题,第一个参数是最小值,第二个参数是最大值
  329. function setYAxis(tmpminv,tmpmaxv) {
  330.   //画y轴线
  331.   var newline = svgDoc.createElement("line");
  332.   newline.setAttribute("x1",20);
  333.   newline.setAttribute("y1",0);
  334.   newline.setAttribute("x2",20);
  335.   newline.setAttribute("y2",120);
  336.   newline.setAttribute("style","stroke-width:2;stroke:blue");
  337.   gnode.appendChild(newline);
  338.   
  339.   var addv = 24;
  340.   var sumlv = 0;
  341.   var sumtv = 4;
  342.   tmpdiv = (tmpmaxv - tmpminv) / 5;
  343.   tmpmaxv = Math.ceil(tmpmaxv + tmpdiv);
  344.   tmpminv = Math.floor(tmpminv - tmpdiv);
  345.   var divtxt = (tmpmaxv - tmpminv) / 5;
  346.   for(var i=0;i<5;i++) {
  347.     //画y轴的小短线
  348.     sumlv = 0 + i * addv;
  349.     newline = svgDoc.createElement("line");
  350.   newline.setAttribute("x1",20);
  351.   newline.setAttribute("y1",sumlv);
  352.   newline.setAttribute("x2",172);
  353.   newline.setAttribute("y2",sumlv);
  354.   newline.setAttribute("style","stroke-width:0.5;stroke:white");
  355.   gnode.appendChild(newline);
  356. }
  357. for(var i=0;i<6;i++) {
  358.   //画y轴的文字
  359.   if(i == 0) {
  360.     sumtv = 7;
  361.   } else {
  362.     sumtv = 4 + i * 24;
  363.   }
  364.   txtdata = tmpmaxv - Math.round(divtxt * i);
  365.   newtext = svgDoc.createElement("text");
  366.   newtext.setAttribute("x",1);
  367.   newtext.setAttribute("y",sumtv);
  368.   gnode.appendChild(newtext);
  369.   texte=svgDoc.createTextNode(txtdata);
  370.     newtext.appendChild(texte);
  371.   }
  372. }
  373. //设定公司的名称
  374. function setCompanyName(companyname) {
  375.   parent.all['svgtitle'].innerHTML = companyname;
  376. }
  377. //设定图象的标题,涉及到下拉框和标题栏的同时变动
  378. function setGraphTitle(title) {
  379.   //
  380. }
  381. //点击动态改变图象的函数,第一个参数是数值数组,第二个参数是年份数组
  382. //function svgViewChange(tmparr1,tmparr2) {
  383. function svgViewChange(tmparr1,tmparr2,type) {
  384.   arrUseValue = tmparr1;
  385.   arrUseYear = tmparr2;
  386.   //alert(arrUseValue);
  387.   //alert(arrUseYear);
  388.   resortArray();
  389.   svgType = type;
  390.   if(svgType == 1) {
  391.     deleItem();
  392.     useMinValue = getMinValue(arrUseValue);
  393.     useMaxValue = getMaxValue(arrUseValue);
  394.     setXAxis(arrUseYear);
  395.     setYAxis(useMinValue,useMaxValue);
  396.     drawPolyline(arrUseValue,useMinValue,useMaxValue);
  397.   } else if(svgType == 2) {
  398.     deleItem();
  399.     useMinValue = getMinValue(arrUseValue);
  400.     useMaxValue = getMaxValue(arrUseValue);
  401.     setXAxis(arrUseYear);
  402.     setYAxis(useMinValue,useMaxValue);
  403.     drawRectange(arrUseValue,useMinValue,useMaxValue);
  404.   } else if(svgType == 3) {
  405.     deleItem();
  406.     useMinValue = getMinValue(arrUseValue);
  407.     useMaxValue = getMaxValue(arrUseValue);
  408.     drawPie(arrUseValue,arrUseYear);
  409.   }
  410. }
  411. function opennewwin() {
  412.   mynewwin = window.open ('bigimg.html', 'svgnewwindow', 'height=320, width=370, top=100, left=100, toolbar=no, menubar=no, scrollbars=no,resizable=no,location=no, status=no');
  413. }