ruby-trade 0.1

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 (144) hide show
  1. data/.gitignore +5 -0
  2. data/README.md +99 -0
  3. data/examples/market_maker.rb +42 -0
  4. data/lib/Gemfile +6 -0
  5. data/lib/Gemfile.lock +23 -0
  6. data/lib/client.rb +203 -0
  7. data/lib/order.rb +49 -0
  8. data/lib/ruby-trade.rb +1 -0
  9. data/rubytrade.gemspec +12 -0
  10. data/server/Gemfile +12 -0
  11. data/server/Gemfile.lock +57 -0
  12. data/server/account.rb +39 -0
  13. data/server/app.rb +20 -0
  14. data/server/exchange.rb +59 -0
  15. data/server/order-book.rb +113 -0
  16. data/server/order.rb +60 -0
  17. data/server/public/app.js +51 -0
  18. data/server/public/dist/css/bootstrap-theme.css +459 -0
  19. data/server/public/dist/css/bootstrap-theme.min.css +9 -0
  20. data/server/public/dist/css/bootstrap.css +7098 -0
  21. data/server/public/dist/css/bootstrap.min.css +9 -0
  22. data/server/public/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  23. data/server/public/dist/fonts/glyphicons-halflings-regular.svg +229 -0
  24. data/server/public/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  25. data/server/public/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  26. data/server/public/dist/js/bootstrap.js +2002 -0
  27. data/server/public/dist/js/bootstrap.min.js +9 -0
  28. data/server/public/flot/API.md +1464 -0
  29. data/server/public/flot/CONTRIBUTING.md +99 -0
  30. data/server/public/flot/FAQ.md +75 -0
  31. data/server/public/flot/LICENSE.txt +22 -0
  32. data/server/public/flot/Makefile +12 -0
  33. data/server/public/flot/NEWS.md +893 -0
  34. data/server/public/flot/PLUGINS.md +143 -0
  35. data/server/public/flot/README.md +110 -0
  36. data/server/public/flot/build.log +0 -0
  37. data/server/public/flot/examples/ajax/data-eu-gdp-growth-1.json +4 -0
  38. data/server/public/flot/examples/ajax/data-eu-gdp-growth-2.json +4 -0
  39. data/server/public/flot/examples/ajax/data-eu-gdp-growth-3.json +4 -0
  40. data/server/public/flot/examples/ajax/data-eu-gdp-growth-4.json +4 -0
  41. data/server/public/flot/examples/ajax/data-eu-gdp-growth-5.json +4 -0
  42. data/server/public/flot/examples/ajax/data-eu-gdp-growth.json +4 -0
  43. data/server/public/flot/examples/ajax/data-japan-gdp-growth.json +4 -0
  44. data/server/public/flot/examples/ajax/data-usa-gdp-growth.json +4 -0
  45. data/server/public/flot/examples/ajax/index.html +173 -0
  46. data/server/public/flot/examples/annotating/index.html +87 -0
  47. data/server/public/flot/examples/axes-interacting/index.html +97 -0
  48. data/server/public/flot/examples/axes-multiple/index.html +77 -0
  49. data/server/public/flot/examples/axes-time-zones/date.js +893 -0
  50. data/server/public/flot/examples/axes-time-zones/index.html +114 -0
  51. data/server/public/flot/examples/axes-time-zones/tz/africa +1181 -0
  52. data/server/public/flot/examples/axes-time-zones/tz/antarctica +413 -0
  53. data/server/public/flot/examples/axes-time-zones/tz/asia +2717 -0
  54. data/server/public/flot/examples/axes-time-zones/tz/australasia +1719 -0
  55. data/server/public/flot/examples/axes-time-zones/tz/backward +117 -0
  56. data/server/public/flot/examples/axes-time-zones/tz/etcetera +81 -0
  57. data/server/public/flot/examples/axes-time-zones/tz/europe +2856 -0
  58. data/server/public/flot/examples/axes-time-zones/tz/factory +10 -0
  59. data/server/public/flot/examples/axes-time-zones/tz/iso3166.tab +276 -0
  60. data/server/public/flot/examples/axes-time-zones/tz/leapseconds +100 -0
  61. data/server/public/flot/examples/axes-time-zones/tz/northamerica +3235 -0
  62. data/server/public/flot/examples/axes-time-zones/tz/pacificnew +28 -0
  63. data/server/public/flot/examples/axes-time-zones/tz/solar87 +390 -0
  64. data/server/public/flot/examples/axes-time-zones/tz/solar88 +390 -0
  65. data/server/public/flot/examples/axes-time-zones/tz/solar89 +395 -0
  66. data/server/public/flot/examples/axes-time-zones/tz/southamerica +1711 -0
  67. data/server/public/flot/examples/axes-time-zones/tz/systemv +38 -0
  68. data/server/public/flot/examples/axes-time-zones/tz/yearistype.sh +38 -0
  69. data/server/public/flot/examples/axes-time-zones/tz/zone.tab +441 -0
  70. data/server/public/flot/examples/axes-time/index.html +137 -0
  71. data/server/public/flot/examples/background.png +0 -0
  72. data/server/public/flot/examples/basic-options/index.html +91 -0
  73. data/server/public/flot/examples/basic-usage/index.html +57 -0
  74. data/server/public/flot/examples/canvas/index.html +75 -0
  75. data/server/public/flot/examples/categories/index.html +64 -0
  76. data/server/public/flot/examples/examples.css +97 -0
  77. data/server/public/flot/examples/image/hs-2004-27-a-large-web.jpg +0 -0
  78. data/server/public/flot/examples/image/index.html +69 -0
  79. data/server/public/flot/examples/index.html +80 -0
  80. data/server/public/flot/examples/interacting/index.html +130 -0
  81. data/server/public/flot/examples/navigate/arrow-down.gif +0 -0
  82. data/server/public/flot/examples/navigate/arrow-left.gif +0 -0
  83. data/server/public/flot/examples/navigate/arrow-right.gif +0 -0
  84. data/server/public/flot/examples/navigate/arrow-up.gif +0 -0
  85. data/server/public/flot/examples/navigate/index.html +153 -0
  86. data/server/public/flot/examples/percentiles/index.html +79 -0
  87. data/server/public/flot/examples/realtime/index.html +122 -0
  88. data/server/public/flot/examples/resize/index.html +76 -0
  89. data/server/public/flot/examples/selection/index.html +141 -0
  90. data/server/public/flot/examples/series-errorbars/index.html +150 -0
  91. data/server/public/flot/examples/series-pie/index.html +818 -0
  92. data/server/public/flot/examples/series-toggle/index.html +121 -0
  93. data/server/public/flot/examples/series-types/index.html +90 -0
  94. data/server/public/flot/examples/shared/jquery-ui/jquery-ui.min.css +6 -0
  95. data/server/public/flot/examples/shared/jquery-ui/jquery-ui.min.js +6 -0
  96. data/server/public/flot/examples/stacking/index.html +107 -0
  97. data/server/public/flot/examples/symbols/index.html +76 -0
  98. data/server/public/flot/examples/threshold/index.html +76 -0
  99. data/server/public/flot/examples/tracking/index.html +135 -0
  100. data/server/public/flot/examples/visitors/index.html +146 -0
  101. data/server/public/flot/examples/zooming/index.html +144 -0
  102. data/server/public/flot/excanvas.js +1428 -0
  103. data/server/public/flot/excanvas.min.js +1 -0
  104. data/server/public/flot/jquery.colorhelpers.js +179 -0
  105. data/server/public/flot/jquery.colorhelpers.min.js +21 -0
  106. data/server/public/flot/jquery.flot.canvas.js +345 -0
  107. data/server/public/flot/jquery.flot.canvas.min.js +28 -0
  108. data/server/public/flot/jquery.flot.categories.js +190 -0
  109. data/server/public/flot/jquery.flot.categories.min.js +44 -0
  110. data/server/public/flot/jquery.flot.crosshair.js +176 -0
  111. data/server/public/flot/jquery.flot.crosshair.min.js +59 -0
  112. data/server/public/flot/jquery.flot.errorbars.js +353 -0
  113. data/server/public/flot/jquery.flot.errorbars.min.js +63 -0
  114. data/server/public/flot/jquery.flot.fillbetween.js +226 -0
  115. data/server/public/flot/jquery.flot.fillbetween.min.js +30 -0
  116. data/server/public/flot/jquery.flot.image.js +241 -0
  117. data/server/public/flot/jquery.flot.image.min.js +53 -0
  118. data/server/public/flot/jquery.flot.js +3061 -0
  119. data/server/public/flot/jquery.flot.min.js +29 -0
  120. data/server/public/flot/jquery.flot.navigate.js +346 -0
  121. data/server/public/flot/jquery.flot.navigate.min.js +86 -0
  122. data/server/public/flot/jquery.flot.pie.js +817 -0
  123. data/server/public/flot/jquery.flot.pie.min.js +56 -0
  124. data/server/public/flot/jquery.flot.resize.js +60 -0
  125. data/server/public/flot/jquery.flot.resize.min.js +19 -0
  126. data/server/public/flot/jquery.flot.selection.js +360 -0
  127. data/server/public/flot/jquery.flot.selection.min.js +79 -0
  128. data/server/public/flot/jquery.flot.stack.js +188 -0
  129. data/server/public/flot/jquery.flot.stack.min.js +36 -0
  130. data/server/public/flot/jquery.flot.symbol.js +71 -0
  131. data/server/public/flot/jquery.flot.symbol.min.js +14 -0
  132. data/server/public/flot/jquery.flot.threshold.js +142 -0
  133. data/server/public/flot/jquery.flot.threshold.min.js +43 -0
  134. data/server/public/flot/jquery.flot.time.js +431 -0
  135. data/server/public/flot/jquery.flot.time.min.js +9 -0
  136. data/server/public/flot/jquery.js +9472 -0
  137. data/server/public/flot/jquery.min.js +2 -0
  138. data/server/public/index.html +53 -0
  139. data/server/public/jquery-2.0.3.min.js +6 -0
  140. data/server/public/sockjs-0.2.1.min.js +27 -0
  141. data/server/server.rb +156 -0
  142. data/server/test/test_order_book.rb +118 -0
  143. data/server/web_server.rb +110 -0
  144. metadata +188 -0
@@ -0,0 +1 @@
1
+ if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.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 M(j){var p=j.indexOf("(",3);var i=j.indexOf(")",p+1);var m=j.substring(p+1,i).split(",");if(m.length!=4||j.charAt(3)!="a"){m[3]=1}return m}function c(i){return parseFloat(i)/100}function r(j,m,i){return Math.min(i,Math.max(m,j))}function I(ag){var i,ai,aj,ah,ak,Z;ah=parseFloat(ag[0])/360%360;if(ah<0){ah++}ak=r(c(ag[1]),0,1);Z=r(c(ag[2]),0,1);if(ak==0){i=ai=aj=Z}else{var j=Z<0.5?Z*(1+ak):Z+ak-Z*ak;var m=2*Z-j;i=a(m,j,ah+1/3);ai=a(m,j,ah);aj=a(m,j,ah-1/3)}return"#"+k[Math.floor(i*255)]+k[Math.floor(ai*255)]+k[Math.floor(aj*255)]}function a(j,i,m){if(m<0){m++}if(m>1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();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 m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" <g_vml_:group",' coordsize="',d*i,",",d*ag,'"',' coordorigin="0,0"',' style="width:',i,"px;height:",ag,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var Z=[];Z.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",n(az.x/d),",","Dy=",n(az.y/d),"");var av=az;var au=V(this,aj+al,ah);var ar=V(this,aj,ah+ay);var an=V(this,aj+al,ah+ay);av.x=ab.max(av.x,au.x,ar.x,an.x);av.y=ab.max(av.y,au.y,ar.y,an.y);ax.push("padding:0 ",n(av.x/d),"px ",n(av.y/d),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",Z.join(""),", sizingmethod='clip');")}else{ax.push("top:",n(az.y/d),"px;left:",n(az.x/d),"px;")}ax.push(' ">','<g_vml_:image src="',aq.src,'"',' style="width:',d*al,"px;"," height:",d*ay,'px"',' cropleft="',ao/ai,'"',' croptop="',am/aw,'"',' cropright="',(ai-ao-at)/ai,'"',' cropbottom="',(aw-am-aA)/aw,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(ao){var Z=10;var ap=10;var ag=5000;var ai={x:null,y:null};var an={x:null,y:null};for(var aj=0;aj<this.currentPath_.length;aj+=ag){var am=[];var ah=false;am.push("<g_vml_:shape",' filled="',!!ao,'"',' style="position:absolute;width:',Z,"px;height:",ap,'px;"',' coordorigin="0,0"',' coordsize="',d*Z,",",d*ap,'"',' stroked="',!ao,'"',' path="');var aq=false;for(var ak=aj;ak<Math.min(aj+ag,this.currentPath_.length);ak++){if(ak%ag==0&&ak>0){am.push(" m ",n(this.currentPath_[ak-1].x),",",n(this.currentPath_[ak-1].y))}var m=this.currentPath_[ak];var al;switch(m.type){case"moveTo":al=m;am.push(" m ",n(m.x),",",n(m.y));break;case"lineTo":am.push(" l ",n(m.x),",",n(m.y));break;case"close":am.push(" x ");m=null;break;case"bezierCurveTo":am.push(" c ",n(m.cp1x),",",n(m.cp1y),",",n(m.cp2x),",",n(m.cp2y),",",n(m.x),",",n(m.y));break;case"at":case"wa":am.push(" ",m.type," ",n(m.x-this.arcScaleX_*m.radius),",",n(m.y-this.arcScaleY_*m.radius)," ",n(m.x+this.arcScaleX_*m.radius),",",n(m.y+this.arcScaleY_*m.radius)," ",n(m.xStart),",",n(m.yStart)," ",n(m.xEnd),",",n(m.yEnd));break}if(m){if(ai.x==null||m.x<ai.x){ai.x=m.x}if(an.x==null||m.x>an.x){an.x=m.x}if(ai.y==null||m.y<ai.y){ai.y=m.y}if(an.y==null||m.y>an.y){an.y=m.y}}}am.push(' ">');if(!ao){w(this,am)}else{G(this,am,ai,an)}am.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",am.join(""))}};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("<g_vml_:stroke",' opacity="',Z,'"',' joinstyle="',m.lineJoin,'"',' miterlimit="',m.miterLimit,'"',' endcap="',S(m.lineCap),'"',' weight="',i,'px"',' color="',p,'" />')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH<ap;aH++){var ao=av[aH];aE.push(ao.offset*am+ax+" "+ao.color)}ai.push('<g_vml_:fill type="',aj.type_,'"',' method="none" focus="100%"',' color="',au,'"',' color2="',at,'"',' colors="',aE.join(","),'"',' opacity="',ay,'"',' g_o_:opacity2="',az,'"',' angle="',an,'"',' focusposition="',aF.x,",",aF.y,'" />')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("<g_vml_:fill",' position="',ah/j*aB*aB,",",aC/p*aA*aA,'"',' type="tile"',' src="',aj.src_,'" />')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('<g_vml_:fill color="',aw,'" opacity="',aG,'" />')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('<g_vml_:line from="',-j,' 0" to="',ar,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!ai,'" stroked="',!!ai,'" style="position:absolute;width:1px;height:1px;">');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('<g_vml_:skew on="t" matrix="',an,'" ',' offset="',al,'" origin="',j,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',af(am),'" style="v-text-align:',Z,";font:",af(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.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=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()};
@@ -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,21 @@
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
+ */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/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(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/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(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={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,345 @@
1
+ /* Flot plugin for drawing all elements of a plot on the canvas.
2
+
3
+ Copyright (c) 2007-2013 IOLA and Ole Laursen.
4
+ Licensed under the MIT license.
5
+
6
+ Flot normally produces certain elements, like axis labels and the legend, using
7
+ HTML elements. This permits greater interactivity and customization, and often
8
+ looks better, due to cross-browser canvas text inconsistencies and limitations.
9
+
10
+ It can also be desirable to render the plot entirely in canvas, particularly
11
+ if the goal is to save it as an image, or if Flot is being used in a context
12
+ where the HTML DOM does not exist, as is the case within Node.js. This plugin
13
+ switches out Flot's standard drawing operations for canvas-only replacements.
14
+
15
+ Currently the plugin supports only axis labels, but it will eventually allow
16
+ every element of the plot to be rendered directly to canvas.
17
+
18
+ The plugin supports these options:
19
+
20
+ {
21
+ canvas: boolean
22
+ }
23
+
24
+ The "canvas" option controls whether full canvas drawing is enabled, making it
25
+ possible to toggle on and off. This is useful when a plot uses HTML text in the
26
+ browser, but needs to redraw with canvas text when exporting as an image.
27
+
28
+ */
29
+
30
+ (function($) {
31
+
32
+ var options = {
33
+ canvas: true
34
+ };
35
+
36
+ var render, getTextInfo, addText;
37
+
38
+ // Cache the prototype hasOwnProperty for faster access
39
+
40
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
41
+
42
+ function init(plot, classes) {
43
+
44
+ var Canvas = classes.Canvas;
45
+
46
+ // We only want to replace the functions once; the second time around
47
+ // we would just get our new function back. This whole replacing of
48
+ // prototype functions is a disaster, and needs to be changed ASAP.
49
+
50
+ if (render == null) {
51
+ getTextInfo = Canvas.prototype.getTextInfo,
52
+ addText = Canvas.prototype.addText,
53
+ render = Canvas.prototype.render;
54
+ }
55
+
56
+ // Finishes rendering the canvas, including overlaid text
57
+
58
+ Canvas.prototype.render = function() {
59
+
60
+ if (!plot.getOptions().canvas) {
61
+ return render.call(this);
62
+ }
63
+
64
+ var context = this.context,
65
+ cache = this._textCache;
66
+
67
+ // For each text layer, render elements marked as active
68
+
69
+ context.save();
70
+ context.textBaseline = "middle";
71
+
72
+ for (var layerKey in cache) {
73
+ if (hasOwnProperty.call(cache, layerKey)) {
74
+ var layerCache = cache[layerKey];
75
+ for (var styleKey in layerCache) {
76
+ if (hasOwnProperty.call(layerCache, styleKey)) {
77
+ var styleCache = layerCache[styleKey],
78
+ updateStyles = true;
79
+ for (var key in styleCache) {
80
+ if (hasOwnProperty.call(styleCache, key)) {
81
+
82
+ var info = styleCache[key],
83
+ positions = info.positions,
84
+ lines = info.lines;
85
+
86
+ // Since every element at this level of the cache have the
87
+ // same font and fill styles, we can just change them once
88
+ // using the values from the first element.
89
+
90
+ if (updateStyles) {
91
+ context.fillStyle = info.font.color;
92
+ context.font = info.font.definition;
93
+ updateStyles = false;
94
+ }
95
+
96
+ for (var i = 0, position; position = positions[i]; i++) {
97
+ if (position.active) {
98
+ for (var j = 0, line; line = position.lines[j]; j++) {
99
+ context.fillText(lines[j].text, line[0], line[1]);
100
+ }
101
+ } else {
102
+ positions.splice(i--, 1);
103
+ }
104
+ }
105
+
106
+ if (positions.length == 0) {
107
+ delete styleCache[key];
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ context.restore();
117
+ };
118
+
119
+ // Creates (if necessary) and returns a text info object.
120
+ //
121
+ // When the canvas option is set, the object looks like this:
122
+ //
123
+ // {
124
+ // width: Width of the text's bounding box.
125
+ // height: Height of the text's bounding box.
126
+ // positions: Array of positions at which this text is drawn.
127
+ // lines: [{
128
+ // height: Height of this line.
129
+ // widths: Width of this line.
130
+ // text: Text on this line.
131
+ // }],
132
+ // font: {
133
+ // definition: Canvas font property string.
134
+ // color: Color of the text.
135
+ // },
136
+ // }
137
+ //
138
+ // The positions array contains objects that look like this:
139
+ //
140
+ // {
141
+ // active: Flag indicating whether the text should be visible.
142
+ // lines: Array of [x, y] coordinates at which to draw the line.
143
+ // x: X coordinate at which to draw the text.
144
+ // y: Y coordinate at which to draw the text.
145
+ // }
146
+
147
+ Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
148
+
149
+ if (!plot.getOptions().canvas) {
150
+ return getTextInfo.call(this, layer, text, font, angle, width);
151
+ }
152
+
153
+ var textStyle, layerCache, styleCache, info;
154
+
155
+ // Cast the value to a string, in case we were given a number
156
+
157
+ text = "" + text;
158
+
159
+ // If the font is a font-spec object, generate a CSS definition
160
+
161
+ if (typeof font === "object") {
162
+ textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family;
163
+ } else {
164
+ textStyle = font;
165
+ }
166
+
167
+ // Retrieve (or create) the cache for the text's layer and styles
168
+
169
+ layerCache = this._textCache[layer];
170
+
171
+ if (layerCache == null) {
172
+ layerCache = this._textCache[layer] = {};
173
+ }
174
+
175
+ styleCache = layerCache[textStyle];
176
+
177
+ if (styleCache == null) {
178
+ styleCache = layerCache[textStyle] = {};
179
+ }
180
+
181
+ info = styleCache[text];
182
+
183
+ if (info == null) {
184
+
185
+ var context = this.context;
186
+
187
+ // If the font was provided as CSS, create a div with those
188
+ // classes and examine it to generate a canvas font spec.
189
+
190
+ if (typeof font !== "object") {
191
+
192
+ var element = $("<div>&nbsp;</div>")
193
+ .css("position", "absolute")
194
+ .addClass(typeof font === "string" ? font : null)
195
+ .appendTo(this.getTextLayer(layer));
196
+
197
+ font = {
198
+ lineHeight: element.height(),
199
+ style: element.css("font-style"),
200
+ variant: element.css("font-variant"),
201
+ weight: element.css("font-weight"),
202
+ family: element.css("font-family"),
203
+ color: element.css("color")
204
+ };
205
+
206
+ // Setting line-height to 1, without units, sets it equal
207
+ // to the font-size, even if the font-size is abstract,
208
+ // like 'smaller'. This enables us to read the real size
209
+ // via the element's height, working around browsers that
210
+ // return the literal 'smaller' value.
211
+
212
+ font.size = element.css("line-height", 1).height();
213
+
214
+ element.remove();
215
+ }
216
+
217
+ textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family;
218
+
219
+ // Create a new info object, initializing the dimensions to
220
+ // zero so we can count them up line-by-line.
221
+
222
+ info = styleCache[text] = {
223
+ width: 0,
224
+ height: 0,
225
+ positions: [],
226
+ lines: [],
227
+ font: {
228
+ definition: textStyle,
229
+ color: font.color
230
+ }
231
+ };
232
+
233
+ context.save();
234
+ context.font = textStyle;
235
+
236
+ // Canvas can't handle multi-line strings; break on various
237
+ // newlines, including HTML brs, to build a list of lines.
238
+ // Note that we could split directly on regexps, but IE < 9 is
239
+ // broken; revisit when we drop IE 7/8 support.
240
+
241
+ var lines = (text + "").replace(/<br ?\/?>|\r\n|\r/g, "\n").split("\n");
242
+
243
+ for (var i = 0; i < lines.length; ++i) {
244
+
245
+ var lineText = lines[i],
246
+ measured = context.measureText(lineText);
247
+
248
+ info.width = Math.max(measured.width, info.width);
249
+ info.height += font.lineHeight;
250
+
251
+ info.lines.push({
252
+ text: lineText,
253
+ width: measured.width,
254
+ height: font.lineHeight
255
+ });
256
+ }
257
+
258
+ context.restore();
259
+ }
260
+
261
+ return info;
262
+ };
263
+
264
+ // Adds a text string to the canvas text overlay.
265
+
266
+ Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
267
+
268
+ if (!plot.getOptions().canvas) {
269
+ return addText.call(this, layer, x, y, text, font, angle, width, halign, valign);
270
+ }
271
+
272
+ var info = this.getTextInfo(layer, text, font, angle, width),
273
+ positions = info.positions,
274
+ lines = info.lines;
275
+
276
+ // Text is drawn with baseline 'middle', which we need to account
277
+ // for by adding half a line's height to the y position.
278
+
279
+ y += info.height / lines.length / 2;
280
+
281
+ // Tweak the initial y-position to match vertical alignment
282
+
283
+ if (valign == "middle") {
284
+ y = Math.round(y - info.height / 2);
285
+ } else if (valign == "bottom") {
286
+ y = Math.round(y - info.height);
287
+ } else {
288
+ y = Math.round(y);
289
+ }
290
+
291
+ // FIXME: LEGACY BROWSER FIX
292
+ // AFFECTS: Opera < 12.00
293
+
294
+ // Offset the y coordinate, since Opera is off pretty
295
+ // consistently compared to the other browsers.
296
+
297
+ if (!!(window.opera && window.opera.version().split(".")[0] < 12)) {
298
+ y -= 2;
299
+ }
300
+
301
+ // Determine whether this text already exists at this position.
302
+ // If so, mark it for inclusion in the next render pass.
303
+
304
+ for (var i = 0, position; position = positions[i]; i++) {
305
+ if (position.x == x && position.y == y) {
306
+ position.active = true;
307
+ return;
308
+ }
309
+ }
310
+
311
+ // If the text doesn't exist at this position, create a new entry
312
+
313
+ position = {
314
+ active: true,
315
+ lines: [],
316
+ x: x,
317
+ y: y
318
+ };
319
+
320
+ positions.push(position);
321
+
322
+ // Fill in the x & y positions of each line, adjusting them
323
+ // individually for horizontal alignment.
324
+
325
+ for (var i = 0, line; line = lines[i]; i++) {
326
+ if (halign == "center") {
327
+ position.lines.push([Math.round(x - line.width / 2), y]);
328
+ } else if (halign == "right") {
329
+ position.lines.push([Math.round(x - line.width), y]);
330
+ } else {
331
+ position.lines.push([Math.round(x), y]);
332
+ }
333
+ y += line.height;
334
+ }
335
+ };
336
+ }
337
+
338
+ $.plot.plugins.push({
339
+ init: init,
340
+ options: options,
341
+ name: "canvas",
342
+ version: "1.0"
343
+ });
344
+
345
+ })(jQuery);