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.
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/README.md +57 -0
- data/Rakefile +4 -0
- data/flot-rails.gemspec +22 -0
- data/lib/flot-rails.rb +1 -0
- data/lib/flot/rails.rb +6 -0
- data/lib/flot/rails/engine.rb +7 -0
- data/lib/flot/rails/version.rb +6 -0
- data/vendor/assets/javascripts/excanvas.js +1427 -0
- data/vendor/assets/javascripts/excanvas.min.js +1 -0
- data/vendor/assets/javascripts/jquery.colorhelpers.js +179 -0
- data/vendor/assets/javascripts/jquery.colorhelpers.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.crosshair.js +167 -0
- data/vendor/assets/javascripts/jquery.flot.crosshair.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.fillbetween.js +183 -0
- data/vendor/assets/javascripts/jquery.flot.fillbetween.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.image.js +238 -0
- data/vendor/assets/javascripts/jquery.flot.image.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.js +2599 -0
- data/vendor/assets/javascripts/jquery.flot.min.js +6 -0
- data/vendor/assets/javascripts/jquery.flot.navigate.js +336 -0
- data/vendor/assets/javascripts/jquery.flot.navigate.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.pie.js +750 -0
- data/vendor/assets/javascripts/jquery.flot.pie.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.resize.js +60 -0
- data/vendor/assets/javascripts/jquery.flot.resize.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.selection.js +344 -0
- data/vendor/assets/javascripts/jquery.flot.selection.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.stack.js +184 -0
- data/vendor/assets/javascripts/jquery.flot.stack.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.symbol.js +70 -0
- data/vendor/assets/javascripts/jquery.flot.symbol.min.js +1 -0
- data/vendor/assets/javascripts/jquery.flot.threshold.js +103 -0
- data/vendor/assets/javascripts/jquery.flot.threshold.min.js +1 -0
- 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,"&").replace(/"/g,""")}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);
|