flot-rails 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +3 -0
  3. data/README.md +57 -0
  4. data/Rakefile +4 -0
  5. data/flot-rails.gemspec +22 -0
  6. data/lib/flot-rails.rb +1 -0
  7. data/lib/flot/rails.rb +6 -0
  8. data/lib/flot/rails/engine.rb +7 -0
  9. data/lib/flot/rails/version.rb +6 -0
  10. data/vendor/assets/javascripts/excanvas.js +1427 -0
  11. data/vendor/assets/javascripts/excanvas.min.js +1 -0
  12. data/vendor/assets/javascripts/jquery.colorhelpers.js +179 -0
  13. data/vendor/assets/javascripts/jquery.colorhelpers.min.js +1 -0
  14. data/vendor/assets/javascripts/jquery.flot.crosshair.js +167 -0
  15. data/vendor/assets/javascripts/jquery.flot.crosshair.min.js +1 -0
  16. data/vendor/assets/javascripts/jquery.flot.fillbetween.js +183 -0
  17. data/vendor/assets/javascripts/jquery.flot.fillbetween.min.js +1 -0
  18. data/vendor/assets/javascripts/jquery.flot.image.js +238 -0
  19. data/vendor/assets/javascripts/jquery.flot.image.min.js +1 -0
  20. data/vendor/assets/javascripts/jquery.flot.js +2599 -0
  21. data/vendor/assets/javascripts/jquery.flot.min.js +6 -0
  22. data/vendor/assets/javascripts/jquery.flot.navigate.js +336 -0
  23. data/vendor/assets/javascripts/jquery.flot.navigate.min.js +1 -0
  24. data/vendor/assets/javascripts/jquery.flot.pie.js +750 -0
  25. data/vendor/assets/javascripts/jquery.flot.pie.min.js +1 -0
  26. data/vendor/assets/javascripts/jquery.flot.resize.js +60 -0
  27. data/vendor/assets/javascripts/jquery.flot.resize.min.js +1 -0
  28. data/vendor/assets/javascripts/jquery.flot.selection.js +344 -0
  29. data/vendor/assets/javascripts/jquery.flot.selection.min.js +1 -0
  30. data/vendor/assets/javascripts/jquery.flot.stack.js +184 -0
  31. data/vendor/assets/javascripts/jquery.flot.stack.min.js +1 -0
  32. data/vendor/assets/javascripts/jquery.flot.symbol.js +70 -0
  33. data/vendor/assets/javascripts/jquery.flot.symbol.min.js +1 -0
  34. data/vendor/assets/javascripts/jquery.flot.threshold.js +103 -0
  35. data/vendor/assets/javascripts/jquery.flot.threshold.min.js +1 -0
  36. metadata +41 -6
@@ -0,0 +1 @@
1
+ if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()};
@@ -0,0 +1,179 @@
1
+ /* Plugin for jQuery for working with colors.
2
+ *
3
+ * Version 1.1.
4
+ *
5
+ * Inspiration from jQuery color animation plugin by John Resig.
6
+ *
7
+ * Released under the MIT license by Ole Laursen, October 2009.
8
+ *
9
+ * Examples:
10
+ *
11
+ * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
12
+ * var c = $.color.extract($("#mydiv"), 'background-color');
13
+ * console.log(c.r, c.g, c.b, c.a);
14
+ * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
15
+ *
16
+ * Note that .scale() and .add() return the same modified object
17
+ * instead of making a new one.
18
+ *
19
+ * V. 1.1: Fix error handling so e.g. parsing an empty string does
20
+ * produce a color rather than just crashing.
21
+ */
22
+
23
+ (function($) {
24
+ $.color = {};
25
+
26
+ // construct color object with some convenient chainable helpers
27
+ $.color.make = function (r, g, b, a) {
28
+ var o = {};
29
+ o.r = r || 0;
30
+ o.g = g || 0;
31
+ o.b = b || 0;
32
+ o.a = a != null ? a : 1;
33
+
34
+ o.add = function (c, d) {
35
+ for (var i = 0; i < c.length; ++i)
36
+ o[c.charAt(i)] += d;
37
+ return o.normalize();
38
+ };
39
+
40
+ o.scale = function (c, f) {
41
+ for (var i = 0; i < c.length; ++i)
42
+ o[c.charAt(i)] *= f;
43
+ return o.normalize();
44
+ };
45
+
46
+ o.toString = function () {
47
+ if (o.a >= 1.0) {
48
+ return "rgb("+[o.r, o.g, o.b].join(",")+")";
49
+ } else {
50
+ return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")";
51
+ }
52
+ };
53
+
54
+ o.normalize = function () {
55
+ function clamp(min, value, max) {
56
+ return value < min ? min: (value > max ? max: value);
57
+ }
58
+
59
+ o.r = clamp(0, parseInt(o.r), 255);
60
+ o.g = clamp(0, parseInt(o.g), 255);
61
+ o.b = clamp(0, parseInt(o.b), 255);
62
+ o.a = clamp(0, o.a, 1);
63
+ return o;
64
+ };
65
+
66
+ o.clone = function () {
67
+ return $.color.make(o.r, o.b, o.g, o.a);
68
+ };
69
+
70
+ return o.normalize();
71
+ }
72
+
73
+ // extract CSS color property from element, going up in the DOM
74
+ // if it's "transparent"
75
+ $.color.extract = function (elem, css) {
76
+ var c;
77
+ do {
78
+ c = elem.css(css).toLowerCase();
79
+ // keep going until we find an element that has color, or
80
+ // we hit the body
81
+ if (c != '' && c != 'transparent')
82
+ break;
83
+ elem = elem.parent();
84
+ } while (!$.nodeName(elem.get(0), "body"));
85
+
86
+ // catch Safari's way of signalling transparent
87
+ if (c == "rgba(0, 0, 0, 0)")
88
+ c = "transparent";
89
+
90
+ return $.color.parse(c);
91
+ }
92
+
93
+ // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"),
94
+ // returns color object, if parsing failed, you get black (0, 0,
95
+ // 0) out
96
+ $.color.parse = function (str) {
97
+ var res, m = $.color.make;
98
+
99
+ // Look for rgb(num,num,num)
100
+ if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))
101
+ return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10));
102
+
103
+ // Look for rgba(num,num,num,num)
104
+ if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
105
+ return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4]));
106
+
107
+ // Look for rgb(num%,num%,num%)
108
+ if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))
109
+ return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55);
110
+
111
+ // Look for rgba(num%,num%,num%,num)
112
+ if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
113
+ return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4]));
114
+
115
+ // Look for #a0b1c2
116
+ if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))
117
+ return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16));
118
+
119
+ // Look for #fff
120
+ if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))
121
+ return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16));
122
+
123
+ // Otherwise, we're most likely dealing with a named color
124
+ var name = $.trim(str).toLowerCase();
125
+ if (name == "transparent")
126
+ return m(255, 255, 255, 0);
127
+ else {
128
+ // default to black
129
+ res = lookupColors[name] || [0, 0, 0];
130
+ return m(res[0], res[1], res[2]);
131
+ }
132
+ }
133
+
134
+ var lookupColors = {
135
+ aqua:[0,255,255],
136
+ azure:[240,255,255],
137
+ beige:[245,245,220],
138
+ black:[0,0,0],
139
+ blue:[0,0,255],
140
+ brown:[165,42,42],
141
+ cyan:[0,255,255],
142
+ darkblue:[0,0,139],
143
+ darkcyan:[0,139,139],
144
+ darkgrey:[169,169,169],
145
+ darkgreen:[0,100,0],
146
+ darkkhaki:[189,183,107],
147
+ darkmagenta:[139,0,139],
148
+ darkolivegreen:[85,107,47],
149
+ darkorange:[255,140,0],
150
+ darkorchid:[153,50,204],
151
+ darkred:[139,0,0],
152
+ darksalmon:[233,150,122],
153
+ darkviolet:[148,0,211],
154
+ fuchsia:[255,0,255],
155
+ gold:[255,215,0],
156
+ green:[0,128,0],
157
+ indigo:[75,0,130],
158
+ khaki:[240,230,140],
159
+ lightblue:[173,216,230],
160
+ lightcyan:[224,255,255],
161
+ lightgreen:[144,238,144],
162
+ lightgrey:[211,211,211],
163
+ lightpink:[255,182,193],
164
+ lightyellow:[255,255,224],
165
+ lime:[0,255,0],
166
+ magenta:[255,0,255],
167
+ maroon:[128,0,0],
168
+ navy:[0,0,128],
169
+ olive:[128,128,0],
170
+ orange:[255,165,0],
171
+ pink:[255,192,203],
172
+ purple:[128,0,128],
173
+ violet:[128,0,128],
174
+ red:[255,0,0],
175
+ silver:[192,192,192],
176
+ white:[255,255,255],
177
+ yellow:[255,255,0]
178
+ };
179
+ })(jQuery);
@@ -0,0 +1 @@
1
+ (function(b){b.color={};b.color.make=function(f,e,c,d){var h={};h.r=f||0;h.g=e||0;h.b=c||0;h.a=d!=null?d:1;h.add=function(k,j){for(var g=0;g<k.length;++g){h[k.charAt(g)]+=j}return h.normalize()};h.scale=function(k,j){for(var g=0;g<k.length;++g){h[k.charAt(g)]*=j}return h.normalize()};h.toString=function(){if(h.a>=1){return"rgb("+[h.r,h.g,h.b].join(",")+")"}else{return"rgba("+[h.r,h.g,h.b,h.a].join(",")+")"}};h.normalize=function(){function g(j,k,i){return k<j?j:(k>i?i:k)}h.r=g(0,parseInt(h.r),255);h.g=g(0,parseInt(h.g),255);h.b=g(0,parseInt(h.b),255);h.a=g(0,h.a,1);return h};h.clone=function(){return b.color.make(h.r,h.b,h.g,h.a)};return h.normalize()};b.color.extract=function(e,d){var f;do{f=e.css(d).toLowerCase();if(f!=""&&f!="transparent"){break}e=e.parent()}while(!b.nodeName(e.get(0),"body"));if(f=="rgba(0, 0, 0, 0)"){f="transparent"}return b.color.parse(f)};b.color.parse=function(f){var e,c=b.color.make;if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10))}if(e=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseFloat(e[4]))}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55)}if(e=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55,parseFloat(e[4]))}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return c(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return c(parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16))}var d=b.trim(f).toLowerCase();if(d=="transparent"){return c(255,255,255,0)}else{e=a[d]||[0,0,0];return c(e[0],e[1],e[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
@@ -0,0 +1,167 @@
1
+ /*
2
+ Flot plugin for showing crosshairs, thin lines, when the mouse hovers
3
+ over the plot.
4
+
5
+ crosshair: {
6
+ mode: null or "x" or "y" or "xy"
7
+ color: color
8
+ lineWidth: number
9
+ }
10
+
11
+ Set the mode to one of "x", "y" or "xy". The "x" mode enables a
12
+ vertical crosshair that lets you trace the values on the x axis, "y"
13
+ enables a horizontal crosshair and "xy" enables them both. "color" is
14
+ the color of the crosshair (default is "rgba(170, 0, 0, 0.80)"),
15
+ "lineWidth" is the width of the drawn lines (default is 1).
16
+
17
+ The plugin also adds four public methods:
18
+
19
+ - setCrosshair(pos)
20
+
21
+ Set the position of the crosshair. Note that this is cleared if
22
+ the user moves the mouse. "pos" is in coordinates of the plot and
23
+ should be on the form { x: xpos, y: ypos } (you can use x2/x3/...
24
+ if you're using multiple axes), which is coincidentally the same
25
+ format as what you get from a "plothover" event. If "pos" is null,
26
+ the crosshair is cleared.
27
+
28
+ - clearCrosshair()
29
+
30
+ Clear the crosshair.
31
+
32
+ - lockCrosshair(pos)
33
+
34
+ Cause the crosshair to lock to the current location, no longer
35
+ updating if the user moves the mouse. Optionally supply a position
36
+ (passed on to setCrosshair()) to move it to.
37
+
38
+ Example usage:
39
+ var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
40
+ $("#graph").bind("plothover", function (evt, position, item) {
41
+ if (item) {
42
+ // Lock the crosshair to the data point being hovered
43
+ myFlot.lockCrosshair({ x: item.datapoint[0], y: item.datapoint[1] });
44
+ }
45
+ else {
46
+ // Return normal crosshair operation
47
+ myFlot.unlockCrosshair();
48
+ }
49
+ });
50
+
51
+ - unlockCrosshair()
52
+
53
+ Free the crosshair to move again after locking it.
54
+ */
55
+
56
+ (function ($) {
57
+ var options = {
58
+ crosshair: {
59
+ mode: null, // one of null, "x", "y" or "xy",
60
+ color: "rgba(170, 0, 0, 0.80)",
61
+ lineWidth: 1
62
+ }
63
+ };
64
+
65
+ function init(plot) {
66
+ // position of crosshair in pixels
67
+ var crosshair = { x: -1, y: -1, locked: false };
68
+
69
+ plot.setCrosshair = function setCrosshair(pos) {
70
+ if (!pos)
71
+ crosshair.x = -1;
72
+ else {
73
+ var o = plot.p2c(pos);
74
+ crosshair.x = Math.max(0, Math.min(o.left, plot.width()));
75
+ crosshair.y = Math.max(0, Math.min(o.top, plot.height()));
76
+ }
77
+
78
+ plot.triggerRedrawOverlay();
79
+ };
80
+
81
+ plot.clearCrosshair = plot.setCrosshair; // passes null for pos
82
+
83
+ plot.lockCrosshair = function lockCrosshair(pos) {
84
+ if (pos)
85
+ plot.setCrosshair(pos);
86
+ crosshair.locked = true;
87
+ }
88
+
89
+ plot.unlockCrosshair = function unlockCrosshair() {
90
+ crosshair.locked = false;
91
+ }
92
+
93
+ function onMouseOut(e) {
94
+ if (crosshair.locked)
95
+ return;
96
+
97
+ if (crosshair.x != -1) {
98
+ crosshair.x = -1;
99
+ plot.triggerRedrawOverlay();
100
+ }
101
+ }
102
+
103
+ function onMouseMove(e) {
104
+ if (crosshair.locked)
105
+ return;
106
+
107
+ if (plot.getSelection && plot.getSelection()) {
108
+ crosshair.x = -1; // hide the crosshair while selecting
109
+ return;
110
+ }
111
+
112
+ var offset = plot.offset();
113
+ crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));
114
+ crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));
115
+ plot.triggerRedrawOverlay();
116
+ }
117
+
118
+ plot.hooks.bindEvents.push(function (plot, eventHolder) {
119
+ if (!plot.getOptions().crosshair.mode)
120
+ return;
121
+
122
+ eventHolder.mouseout(onMouseOut);
123
+ eventHolder.mousemove(onMouseMove);
124
+ });
125
+
126
+ plot.hooks.drawOverlay.push(function (plot, ctx) {
127
+ var c = plot.getOptions().crosshair;
128
+ if (!c.mode)
129
+ return;
130
+
131
+ var plotOffset = plot.getPlotOffset();
132
+
133
+ ctx.save();
134
+ ctx.translate(plotOffset.left, plotOffset.top);
135
+
136
+ if (crosshair.x != -1) {
137
+ ctx.strokeStyle = c.color;
138
+ ctx.lineWidth = c.lineWidth;
139
+ ctx.lineJoin = "round";
140
+
141
+ ctx.beginPath();
142
+ if (c.mode.indexOf("x") != -1) {
143
+ ctx.moveTo(crosshair.x, 0);
144
+ ctx.lineTo(crosshair.x, plot.height());
145
+ }
146
+ if (c.mode.indexOf("y") != -1) {
147
+ ctx.moveTo(0, crosshair.y);
148
+ ctx.lineTo(plot.width(), crosshair.y);
149
+ }
150
+ ctx.stroke();
151
+ }
152
+ ctx.restore();
153
+ });
154
+
155
+ plot.hooks.shutdown.push(function (plot, eventHolder) {
156
+ eventHolder.unbind("mouseout", onMouseOut);
157
+ eventHolder.unbind("mousemove", onMouseMove);
158
+ });
159
+ }
160
+
161
+ $.plot.plugins.push({
162
+ init: init,
163
+ options: options,
164
+ name: 'crosshair',
165
+ version: '1.0'
166
+ });
167
+ })(jQuery);
@@ -0,0 +1 @@
1
+ (function(b){var a={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function c(h){var j={x:-1,y:-1,locked:false};h.setCrosshair=function e(l){if(!l){j.x=-1}else{var k=h.p2c(l);j.x=Math.max(0,Math.min(k.left,h.width()));j.y=Math.max(0,Math.min(k.top,h.height()))}h.triggerRedrawOverlay()};h.clearCrosshair=h.setCrosshair;h.lockCrosshair=function f(k){if(k){h.setCrosshair(k)}j.locked=true};h.unlockCrosshair=function g(){j.locked=false};function d(k){if(j.locked){return}if(j.x!=-1){j.x=-1;h.triggerRedrawOverlay()}}function i(k){if(j.locked){return}if(h.getSelection&&h.getSelection()){j.x=-1;return}var l=h.offset();j.x=Math.max(0,Math.min(k.pageX-l.left,h.width()));j.y=Math.max(0,Math.min(k.pageY-l.top,h.height()));h.triggerRedrawOverlay()}h.hooks.bindEvents.push(function(l,k){if(!l.getOptions().crosshair.mode){return}k.mouseout(d);k.mousemove(i)});h.hooks.drawOverlay.push(function(m,k){var n=m.getOptions().crosshair;if(!n.mode){return}var l=m.getPlotOffset();k.save();k.translate(l.left,l.top);if(j.x!=-1){k.strokeStyle=n.color;k.lineWidth=n.lineWidth;k.lineJoin="round";k.beginPath();if(n.mode.indexOf("x")!=-1){k.moveTo(j.x,0);k.lineTo(j.x,m.height())}if(n.mode.indexOf("y")!=-1){k.moveTo(0,j.y);k.lineTo(m.width(),j.y)}k.stroke()}k.restore()});h.hooks.shutdown.push(function(l,k){k.unbind("mouseout",d);k.unbind("mousemove",i)})}b.plot.plugins.push({init:c,options:a,name:"crosshair",version:"1.0"})})(jQuery);
@@ -0,0 +1,183 @@
1
+ /*
2
+ Flot plugin for computing bottoms for filled line and bar charts.
3
+
4
+ The case: you've got two series that you want to fill the area
5
+ between. In Flot terms, you need to use one as the fill bottom of the
6
+ other. You can specify the bottom of each data point as the third
7
+ coordinate manually, or you can use this plugin to compute it for you.
8
+
9
+ In order to name the other series, you need to give it an id, like this
10
+
11
+ var dataset = [
12
+ { data: [ ... ], id: "foo" } , // use default bottom
13
+ { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom
14
+ ];
15
+
16
+ $.plot($("#placeholder"), dataset, { line: { show: true, fill: true }});
17
+
18
+ As a convenience, if the id given is a number that doesn't appear as
19
+ an id in the series, it is interpreted as the index in the array
20
+ instead (so fillBetween: 0 can also mean the first series).
21
+
22
+ Internally, the plugin modifies the datapoints in each series. For
23
+ line series, extra data points might be inserted through
24
+ interpolation. Note that at points where the bottom line is not
25
+ defined (due to a null point or start/end of line), the current line
26
+ will show a gap too. The algorithm comes from the jquery.flot.stack.js
27
+ plugin, possibly some code could be shared.
28
+ */
29
+
30
+ (function ($) {
31
+ var options = {
32
+ series: { fillBetween: null } // or number
33
+ };
34
+
35
+ function init(plot) {
36
+ function findBottomSeries(s, allseries) {
37
+ var i;
38
+ for (i = 0; i < allseries.length; ++i) {
39
+ if (allseries[i].id == s.fillBetween)
40
+ return allseries[i];
41
+ }
42
+
43
+ if (typeof s.fillBetween == "number") {
44
+ i = s.fillBetween;
45
+
46
+ if (i < 0 || i >= allseries.length)
47
+ return null;
48
+
49
+ return allseries[i];
50
+ }
51
+
52
+ return null;
53
+ }
54
+
55
+ function computeFillBottoms(plot, s, datapoints) {
56
+ if (s.fillBetween == null)
57
+ return;
58
+
59
+ var other = findBottomSeries(s, plot.getData());
60
+ if (!other)
61
+ return;
62
+
63
+ var ps = datapoints.pointsize,
64
+ points = datapoints.points,
65
+ otherps = other.datapoints.pointsize,
66
+ otherpoints = other.datapoints.points,
67
+ newpoints = [],
68
+ px, py, intery, qx, qy, bottom,
69
+ withlines = s.lines.show,
70
+ withbottom = ps > 2 && datapoints.format[2].y,
71
+ withsteps = withlines && s.lines.steps,
72
+ fromgap = true,
73
+ i = 0, j = 0, l;
74
+
75
+ while (true) {
76
+ if (i >= points.length)
77
+ break;
78
+
79
+ l = newpoints.length;
80
+
81
+ if (points[i] == null) {
82
+ // copy gaps
83
+ for (m = 0; m < ps; ++m)
84
+ newpoints.push(points[i + m]);
85
+ i += ps;
86
+ }
87
+ else if (j >= otherpoints.length) {
88
+ // for lines, we can't use the rest of the points
89
+ if (!withlines) {
90
+ for (m = 0; m < ps; ++m)
91
+ newpoints.push(points[i + m]);
92
+ }
93
+ i += ps;
94
+ }
95
+ else if (otherpoints[j] == null) {
96
+ // oops, got a gap
97
+ for (m = 0; m < ps; ++m)
98
+ newpoints.push(null);
99
+ fromgap = true;
100
+ j += otherps;
101
+ }
102
+ else {
103
+ // cases where we actually got two points
104
+ px = points[i];
105
+ py = points[i + 1];
106
+ qx = otherpoints[j];
107
+ qy = otherpoints[j + 1];
108
+ bottom = 0;
109
+
110
+ if (px == qx) {
111
+ for (m = 0; m < ps; ++m)
112
+ newpoints.push(points[i + m]);
113
+
114
+ //newpoints[l + 1] += qy;
115
+ bottom = qy;
116
+
117
+ i += ps;
118
+ j += otherps;
119
+ }
120
+ else if (px > qx) {
121
+ // we got past point below, might need to
122
+ // insert interpolated extra point
123
+ if (withlines && i > 0 && points[i - ps] != null) {
124
+ intery = py + (points[i - ps + 1] - py) * (qx - px) / (points[i - ps] - px);
125
+ newpoints.push(qx);
126
+ newpoints.push(intery)
127
+ for (m = 2; m < ps; ++m)
128
+ newpoints.push(points[i + m]);
129
+ bottom = qy;
130
+ }
131
+
132
+ j += otherps;
133
+ }
134
+ else { // px < qx
135
+ if (fromgap && withlines) {
136
+ // if we come from a gap, we just skip this point
137
+ i += ps;
138
+ continue;
139
+ }
140
+
141
+ for (m = 0; m < ps; ++m)
142
+ newpoints.push(points[i + m]);
143
+
144
+ // we might be able to interpolate a point below,
145
+ // this can give us a better y
146
+ if (withlines && j > 0 && otherpoints[j - otherps] != null)
147
+ bottom = qy + (otherpoints[j - otherps + 1] - qy) * (px - qx) / (otherpoints[j - otherps] - qx);
148
+
149
+ //newpoints[l + 1] += bottom;
150
+
151
+ i += ps;
152
+ }
153
+
154
+ fromgap = false;
155
+
156
+ if (l != newpoints.length && withbottom)
157
+ newpoints[l + 2] = bottom;
158
+ }
159
+
160
+ // maintain the line steps invariant
161
+ if (withsteps && l != newpoints.length && l > 0
162
+ && newpoints[l] != null
163
+ && newpoints[l] != newpoints[l - ps]
164
+ && newpoints[l + 1] != newpoints[l - ps + 1]) {
165
+ for (m = 0; m < ps; ++m)
166
+ newpoints[l + ps + m] = newpoints[l + m];
167
+ newpoints[l + 1] = newpoints[l - ps + 1];
168
+ }
169
+ }
170
+
171
+ datapoints.points = newpoints;
172
+ }
173
+
174
+ plot.hooks.processDatapoints.push(computeFillBottoms);
175
+ }
176
+
177
+ $.plot.plugins.push({
178
+ init: init,
179
+ options: options,
180
+ name: 'fillbetween',
181
+ version: '1.0'
182
+ });
183
+ })(jQuery);