jvectormap-rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. data/Gemfile +3 -0
  2. data/History.txt +3 -0
  3. data/LICENSE +21 -0
  4. data/README.md +4 -0
  5. data/Rakefile +38 -0
  6. data/jvectormap-rails.gemspec +20 -0
  7. data/lib/jvectormap-rails.rb +26 -0
  8. data/lib/jvectormap/rails/engine.rb +8 -0
  9. data/lib/jvectormap/rails/railtie.rb +17 -0
  10. data/lib/jvectormap/rails/version.rb +8 -0
  11. data/tasks/jvectormap.rake +6 -0
  12. data/vendor/assets/javascripts/jvectormap.js +26 -0
  13. data/vendor/assets/javascripts/jvectormap/jquery-jvectormap.js +45 -0
  14. data/vendor/assets/javascripts/jvectormap/jquery-mousewheel.js +84 -0
  15. data/vendor/assets/javascripts/jvectormap/lib/abstract-canvas-element.js +67 -0
  16. data/vendor/assets/javascripts/jvectormap/lib/abstract-element.js +73 -0
  17. data/vendor/assets/javascripts/jvectormap/lib/abstract-shape-element.js +85 -0
  18. data/vendor/assets/javascripts/jvectormap/lib/color-scale.js +44 -0
  19. data/vendor/assets/javascripts/jvectormap/lib/data-series.js +139 -0
  20. data/vendor/assets/javascripts/jvectormap/lib/jvectormap.js +99 -0
  21. data/vendor/assets/javascripts/jvectormap/lib/numeric-scale.js +147 -0
  22. data/vendor/assets/javascripts/jvectormap/lib/ordinal-scale.js +7 -0
  23. data/vendor/assets/javascripts/jvectormap/lib/proj.js +181 -0
  24. data/vendor/assets/javascripts/jvectormap/lib/simple-scale.js +7 -0
  25. data/vendor/assets/javascripts/jvectormap/lib/svg-canvas-element.js +22 -0
  26. data/vendor/assets/javascripts/jvectormap/lib/svg-circle-element.js +5 -0
  27. data/vendor/assets/javascripts/jvectormap/lib/svg-element.js +48 -0
  28. data/vendor/assets/javascripts/jvectormap/lib/svg-group-element.js +9 -0
  29. data/vendor/assets/javascripts/jvectormap/lib/svg-path-element.js +6 -0
  30. data/vendor/assets/javascripts/jvectormap/lib/svg-shape-element.js +7 -0
  31. data/vendor/assets/javascripts/jvectormap/lib/vector-canvas.js +16 -0
  32. data/vendor/assets/javascripts/jvectormap/lib/vml-canvas-element.js +45 -0
  33. data/vendor/assets/javascripts/jvectormap/lib/vml-circle-element.js +26 -0
  34. data/vendor/assets/javascripts/jvectormap/lib/vml-element.js +106 -0
  35. data/vendor/assets/javascripts/jvectormap/lib/vml-group-element.js +13 -0
  36. data/vendor/assets/javascripts/jvectormap/lib/vml-path-element.js +111 -0
  37. data/vendor/assets/javascripts/jvectormap/lib/vml-shape-element.js +49 -0
  38. data/vendor/assets/javascripts/jvectormap/lib/world-map.js +977 -0
  39. data/vendor/assets/javascripts/jvectormap/maps/ar_merc_en.js +1 -0
  40. data/vendor/assets/javascripts/jvectormap/maps/ar_mill_en.js +1 -0
  41. data/vendor/assets/javascripts/jvectormap/maps/at_merc_en.js +1 -0
  42. data/vendor/assets/javascripts/jvectormap/maps/at_mill_en.js +1 -0
  43. data/vendor/assets/javascripts/jvectormap/maps/au_merc_en.js +1 -0
  44. data/vendor/assets/javascripts/jvectormap/maps/au_mill_en.js +1 -0
  45. data/vendor/assets/javascripts/jvectormap/maps/be_merc_en.js +1 -0
  46. data/vendor/assets/javascripts/jvectormap/maps/be_mill_en.js +1 -0
  47. data/vendor/assets/javascripts/jvectormap/maps/ca_lcc_en.js +1 -0
  48. data/vendor/assets/javascripts/jvectormap/maps/ca_merc_en.js +1 -0
  49. data/vendor/assets/javascripts/jvectormap/maps/ca_mill_en.js +1 -0
  50. data/vendor/assets/javascripts/jvectormap/maps/ch_merc_en.js +1 -0
  51. data/vendor/assets/javascripts/jvectormap/maps/ch_mill_en.js +1 -0
  52. data/vendor/assets/javascripts/jvectormap/maps/cn_merc_en.js +1 -0
  53. data/vendor/assets/javascripts/jvectormap/maps/cn_mill_en.js +1 -0
  54. data/vendor/assets/javascripts/jvectormap/maps/co_merc_en.js +1 -0
  55. data/vendor/assets/javascripts/jvectormap/maps/co_mill_en.js +1 -0
  56. data/vendor/assets/javascripts/jvectormap/maps/de_merc_en.js +1 -0
  57. data/vendor/assets/javascripts/jvectormap/maps/de_mill_en.js +1 -0
  58. data/vendor/assets/javascripts/jvectormap/maps/dk_merc_en.js +1 -0
  59. data/vendor/assets/javascripts/jvectormap/maps/dk_mill_en.js +1 -0
  60. data/vendor/assets/javascripts/jvectormap/maps/es_merc_en.js +1 -0
  61. data/vendor/assets/javascripts/jvectormap/maps/es_mill_en.js +1 -0
  62. data/vendor/assets/javascripts/jvectormap/maps/europe_merc_en.js +1 -0
  63. data/vendor/assets/javascripts/jvectormap/maps/europe_mill_en.js +1 -0
  64. data/vendor/assets/javascripts/jvectormap/maps/fr_merc_en.js +1 -0
  65. data/vendor/assets/javascripts/jvectormap/maps/fr_mill_en.js +1 -0
  66. data/vendor/assets/javascripts/jvectormap/maps/in_merc_en.js +1 -0
  67. data/vendor/assets/javascripts/jvectormap/maps/in_mill_en.js +1 -0
  68. data/vendor/assets/javascripts/jvectormap/maps/it_merc_en.js +1 -0
  69. data/vendor/assets/javascripts/jvectormap/maps/it_mill_en.js +1 -0
  70. data/vendor/assets/javascripts/jvectormap/maps/nl_merc_en.js +1 -0
  71. data/vendor/assets/javascripts/jvectormap/maps/nl_mill_en.js +1 -0
  72. data/vendor/assets/javascripts/jvectormap/maps/no_merc_en.js +1 -0
  73. data/vendor/assets/javascripts/jvectormap/maps/no_mill_en.js +1 -0
  74. data/vendor/assets/javascripts/jvectormap/maps/nz_merc_en.js +1 -0
  75. data/vendor/assets/javascripts/jvectormap/maps/nz_mill_en.js +1 -0
  76. data/vendor/assets/javascripts/jvectormap/maps/ph_regions_merc_en.js +1 -0
  77. data/vendor/assets/javascripts/jvectormap/maps/ph_regions_mill_en.js +1 -0
  78. data/vendor/assets/javascripts/jvectormap/maps/pl_merc_en.js +1 -0
  79. data/vendor/assets/javascripts/jvectormap/maps/pl_mill_en.js +1 -0
  80. data/vendor/assets/javascripts/jvectormap/maps/pt_merc_en.js +1 -0
  81. data/vendor/assets/javascripts/jvectormap/maps/pt_mill_en.js +1 -0
  82. data/vendor/assets/javascripts/jvectormap/maps/se_merc_en.js +1 -0
  83. data/vendor/assets/javascripts/jvectormap/maps/se_mill_en.js +1 -0
  84. data/vendor/assets/javascripts/jvectormap/maps/th_merc_en.js +1 -0
  85. data/vendor/assets/javascripts/jvectormap/maps/th_mill_en.js +1 -0
  86. data/vendor/assets/javascripts/jvectormap/maps/th_regions_merc_en.js +1 -0
  87. data/vendor/assets/javascripts/jvectormap/maps/th_regions_mill_en.js +1 -0
  88. data/vendor/assets/javascripts/jvectormap/maps/uk_merc_en.js +1 -0
  89. data/vendor/assets/javascripts/jvectormap/maps/uk_mill_en.js +1 -0
  90. data/vendor/assets/javascripts/jvectormap/maps/us-il-chicago_mill_en.js +1 -0
  91. data/vendor/assets/javascripts/jvectormap/maps/us-ny-newyork_mill_en.js +1 -0
  92. data/vendor/assets/javascripts/jvectormap/maps/us_aea_en.js +1 -0
  93. data/vendor/assets/javascripts/jvectormap/maps/us_lcc_en.js +1 -0
  94. data/vendor/assets/javascripts/jvectormap/maps/us_merc_en.js +1 -0
  95. data/vendor/assets/javascripts/jvectormap/maps/us_mill_en.js +1 -0
  96. data/vendor/assets/javascripts/jvectormap/maps/ve_merc_en.js +1 -0
  97. data/vendor/assets/javascripts/jvectormap/maps/ve_mill_en.js +1 -0
  98. data/vendor/assets/javascripts/jvectormap/maps/world_merc_en.js +1 -0
  99. data/vendor/assets/javascripts/jvectormap/maps/world_mill_en.js +1 -0
  100. data/vendor/assets/javascripts/jvectormap/maps/za_merc_en.js +1 -0
  101. data/vendor/assets/javascripts/jvectormap/maps/za_mill_en.js +1 -0
  102. data/vendor/assets/stylesheets/jvectormap.css +37 -0
  103. metadata +165 -0
@@ -0,0 +1,7 @@
1
+ jvm.OrdinalScale = function(scale){
2
+ this.scale = scale;
3
+ };
4
+
5
+ jvm.OrdinalScale.prototype.getValue = function(value){
6
+ return this.scale[value];
7
+ };
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Contains methods for transforming point on sphere to
3
+ * Cartesian coordinates using various projections.
4
+ * @class
5
+ */
6
+ jvm.Proj = {
7
+ degRad: 180 / Math.PI,
8
+ radDeg: Math.PI / 180,
9
+ radius: 6381372,
10
+
11
+ sgn: function(n){
12
+ if (n > 0) {
13
+ return 1;
14
+ } else if (n < 0) {
15
+ return -1;
16
+ } else {
17
+ return n;
18
+ }
19
+ },
20
+
21
+ /**
22
+ * Converts point on sphere to the Cartesian coordinates using Miller projection
23
+ * @param {Number} lat Latitude in degrees
24
+ * @param {Number} lng Longitude in degrees
25
+ * @param {Number} c Central meridian in degrees
26
+ */
27
+ mill: function(lat, lng, c){
28
+ return {
29
+ x: this.radius * (lng - c) * this.radDeg,
30
+ y: - this.radius * Math.log(Math.tan((45 + 0.4 * lat) * this.radDeg)) / 0.8
31
+ };
32
+ },
33
+
34
+ /**
35
+ * Inverse function of mill()
36
+ * Converts Cartesian coordinates to point on sphere using Miller projection
37
+ * @param {Number} x X of point in Cartesian system as integer
38
+ * @param {Number} y Y of point in Cartesian system as integer
39
+ * @param {Number} c Central meridian in degrees
40
+ */
41
+ mill_inv: function(x, y, c){
42
+ return {
43
+ lat: (2.5 * Math.atan(Math.exp(0.8 * y / this.radius)) - 5 * Math.PI / 8) * this.degRad,
44
+ lng: (c * this.radDeg + x / this.radius) * this.degRad
45
+ };
46
+ },
47
+
48
+ /**
49
+ * Converts point on sphere to the Cartesian coordinates using Mercator projection
50
+ * @param {Number} lat Latitude in degrees
51
+ * @param {Number} lng Longitude in degrees
52
+ * @param {Number} c Central meridian in degrees
53
+ */
54
+ merc: function(lat, lng, c){
55
+ return {
56
+ x: this.radius * (lng - c) * this.radDeg,
57
+ y: - this.radius * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360))
58
+ };
59
+ },
60
+
61
+ /**
62
+ * Inverse function of merc()
63
+ * Converts Cartesian coordinates to point on sphere using Mercator projection
64
+ * @param {Number} x X of point in Cartesian system as integer
65
+ * @param {Number} y Y of point in Cartesian system as integer
66
+ * @param {Number} c Central meridian in degrees
67
+ */
68
+ merc_inv: function(x, y, c){
69
+ return {
70
+ lat: (2 * Math.atan(Math.exp(y / this.radius)) - Math.PI / 2) * this.degRad,
71
+ lng: (c * this.radDeg + x / this.radius) * this.degRad
72
+ };
73
+ },
74
+
75
+ /**
76
+ * Converts point on sphere to the Cartesian coordinates using Albers Equal-Area Conic
77
+ * projection
78
+ * @see <a href="http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html">Albers Equal-Area Conic projection</a>
79
+ * @param {Number} lat Latitude in degrees
80
+ * @param {Number} lng Longitude in degrees
81
+ * @param {Number} c Central meridian in degrees
82
+ */
83
+ aea: function(lat, lng, c){
84
+ var fi0 = 0,
85
+ lambda0 = c * this.radDeg,
86
+ fi1 = 29.5 * this.radDeg,
87
+ fi2 = 45.5 * this.radDeg,
88
+ fi = lat * this.radDeg,
89
+ lambda = lng * this.radDeg,
90
+ n = (Math.sin(fi1)+Math.sin(fi2)) / 2,
91
+ C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),
92
+ theta = n*(lambda-lambda0),
93
+ ro = Math.sqrt(C-2*n*Math.sin(fi))/n,
94
+ ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n;
95
+
96
+ return {
97
+ x: ro * Math.sin(theta) * this.radius,
98
+ y: - (ro0 - ro * Math.cos(theta)) * this.radius
99
+ };
100
+ },
101
+
102
+ /**
103
+ * Converts Cartesian coordinates to the point on sphere using Albers Equal-Area Conic
104
+ * projection
105
+ * @see <a href="http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html">Albers Equal-Area Conic projection</a>
106
+ * @param {Number} x X of point in Cartesian system as integer
107
+ * @param {Number} y Y of point in Cartesian system as integer
108
+ * @param {Number} c Central meridian in degrees
109
+ */
110
+ aea_inv: function(xCoord, yCoord, c){
111
+ var x = xCoord / this.radius,
112
+ y = yCoord / this.radius,
113
+ fi0 = 0,
114
+ lambda0 = c * this.radDeg,
115
+ fi1 = 29.5 * this.radDeg,
116
+ fi2 = 45.5 * this.radDeg,
117
+ n = (Math.sin(fi1)+Math.sin(fi2)) / 2,
118
+ C = Math.cos(fi1)*Math.cos(fi1)+2*n*Math.sin(fi1),
119
+ ro0 = Math.sqrt(C-2*n*Math.sin(fi0))/n,
120
+ ro = Math.sqrt(x*x+(ro0-y)*(ro0-y)),
121
+ theta = Math.atan( x / (ro0 - y) );
122
+
123
+ return {
124
+ lat: (Math.asin((C - ro * ro * n * n) / (2 * n))) * this.degRad,
125
+ lng: (lambda0 + theta / n) * this.degRad
126
+ };
127
+ },
128
+
129
+ /**
130
+ * Converts point on sphere to the Cartesian coordinates using Lambert conformal
131
+ * conic projection
132
+ * @see <a href="http://mathworld.wolfram.com/LambertConformalConicProjection.html">Lambert Conformal Conic Projection</a>
133
+ * @param {Number} lat Latitude in degrees
134
+ * @param {Number} lng Longitude in degrees
135
+ * @param {Number} c Central meridian in degrees
136
+ */
137
+ lcc: function(lat, lng, c){
138
+ var fi0 = 0,
139
+ lambda0 = c * this.radDeg,
140
+ lambda = lng * this.radDeg,
141
+ fi1 = 33 * this.radDeg,
142
+ fi2 = 45 * this.radDeg,
143
+ fi = lat * this.radDeg,
144
+ n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),
145
+ F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,
146
+ ro = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi / 2 ), n ),
147
+ ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n );
148
+
149
+ return {
150
+ x: ro * Math.sin( n * (lambda - lambda0) ) * this.radius,
151
+ y: - (ro0 - ro * Math.cos( n * (lambda - lambda0) ) ) * this.radius
152
+ };
153
+ },
154
+
155
+ /**
156
+ * Converts Cartesian coordinates to the point on sphere using Lambert conformal conic
157
+ * projection
158
+ * @see <a href="http://mathworld.wolfram.com/LambertConformalConicProjection.html">Lambert Conformal Conic Projection</a>
159
+ * @param {Number} x X of point in Cartesian system as integer
160
+ * @param {Number} y Y of point in Cartesian system as integer
161
+ * @param {Number} c Central meridian in degrees
162
+ */
163
+ lcc_inv: function(xCoord, yCoord, c){
164
+ var x = xCoord / this.radius,
165
+ y = yCoord / this.radius,
166
+ fi0 = 0,
167
+ lambda0 = c * this.radDeg,
168
+ fi1 = 33 * this.radDeg,
169
+ fi2 = 45 * this.radDeg,
170
+ n = Math.log( Math.cos(fi1) * (1 / Math.cos(fi2)) ) / Math.log( Math.tan( Math.PI / 4 + fi2 / 2) * (1 / Math.tan( Math.PI / 4 + fi1 / 2) ) ),
171
+ F = ( Math.cos(fi1) * Math.pow( Math.tan( Math.PI / 4 + fi1 / 2 ), n ) ) / n,
172
+ ro0 = F * Math.pow( 1 / Math.tan( Math.PI / 4 + fi0 / 2 ), n ),
173
+ ro = this.sgn(n) * Math.sqrt(x*x+(ro0-y)*(ro0-y)),
174
+ theta = Math.atan( x / (ro0 - y) );
175
+
176
+ return {
177
+ lat: (2 * Math.atan(Math.pow(F/ro, 1/n)) - Math.PI / 2) * this.degRad,
178
+ lng: (lambda0 + theta / n) * this.degRad
179
+ };
180
+ }
181
+ };
@@ -0,0 +1,7 @@
1
+ jvm.SimpleScale = function(scale){
2
+ this.scale = scale;
3
+ };
4
+
5
+ jvm.SimpleScale.prototype.getValue = function(value){
6
+ return value;
7
+ };
@@ -0,0 +1,22 @@
1
+ jvm.SVGCanvasElement = function(container, width, height){
2
+ this.classPrefix = 'SVG';
3
+ jvm.SVGCanvasElement.parentClass.call(this, 'svg');
4
+ jvm.AbstractCanvasElement.apply(this, arguments);
5
+ }
6
+
7
+ jvm.inherits(jvm.SVGCanvasElement, jvm.SVGElement);
8
+ jvm.mixin(jvm.SVGCanvasElement, jvm.AbstractCanvasElement);
9
+
10
+ jvm.SVGCanvasElement.prototype.setSize = function(width, height){
11
+ this.width = width;
12
+ this.height = height;
13
+ this.node.setAttribute('width', width);
14
+ this.node.setAttribute('height', height);
15
+ };
16
+
17
+ jvm.SVGCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {
18
+ this.scale = scale;
19
+ this.transX = transX;
20
+ this.transY = transY;
21
+ this.rootElement.node.setAttribute('transform', 'scale('+scale+') translate('+transX+', '+transY+')');
22
+ };
@@ -0,0 +1,5 @@
1
+ jvm.SVGCircleElement = function(config, style){
2
+ jvm.SVGCircleElement.parentClass.call(this, 'circle', config, style);
3
+ };
4
+
5
+ jvm.inherits(jvm.SVGCircleElement, jvm.SVGShapeElement);
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Wrapper for SVG element.
3
+ * @constructor
4
+ * @extends jvm.AbstractElement
5
+ * @param {String} name Tag name of the element
6
+ * @param {Object} config Set of parameters to initialize element with
7
+ */
8
+
9
+ jvm.SVGElement = function(name, config){
10
+ jvm.SVGElement.parentClass.apply(this, arguments);
11
+ }
12
+
13
+ jvm.inherits(jvm.SVGElement, jvm.AbstractElement);
14
+
15
+ jvm.SVGElement.svgns = "http://www.w3.org/2000/svg";
16
+
17
+ /**
18
+ * Creates DOM element.
19
+ * @param {String} tagName Name of element
20
+ * @private
21
+ * @returns DOMElement
22
+ */
23
+ jvm.SVGElement.prototype.createElement = function( tagName ){
24
+ return document.createElementNS( jvm.SVGElement.svgns, tagName );
25
+ };
26
+
27
+ /**
28
+ * Adds CSS class for underlying DOM element.
29
+ * @param {String} className Name of CSS class name
30
+ */
31
+ jvm.SVGElement.prototype.addClass = function( className ){
32
+ this.node.setAttribute('class', className);
33
+ };
34
+
35
+ /**
36
+ * Returns constructor for element by name prefixed with 'VML'.
37
+ * @param {String} ctr Name of basic constructor to return
38
+ * proper implementation for.
39
+ * @returns Function
40
+ * @private
41
+ */
42
+ jvm.SVGElement.prototype.getElementCtr = function( ctr ){
43
+ return jvm['SVG'+ctr];
44
+ };
45
+
46
+ jvm.SVGElement.prototype.getBBox = function(){
47
+ return this.node.getBBox();
48
+ };
@@ -0,0 +1,9 @@
1
+ jvm.SVGGroupElement = function(){
2
+ jvm.SVGGroupElement.parentClass.call(this, 'g');
3
+ }
4
+
5
+ jvm.inherits(jvm.SVGGroupElement, jvm.SVGElement);
6
+
7
+ jvm.SVGGroupElement.prototype.add = function(element){
8
+ this.node.appendChild( element.node );
9
+ };
@@ -0,0 +1,6 @@
1
+ jvm.SVGPathElement = function(config, style){
2
+ jvm.SVGPathElement.parentClass.call(this, 'path', config, style);
3
+ this.node.setAttribute('fill-rule', 'evenodd');
4
+ }
5
+
6
+ jvm.inherits(jvm.SVGPathElement, jvm.SVGShapeElement);
@@ -0,0 +1,7 @@
1
+ jvm.SVGShapeElement = function(name, config, style){
2
+ jvm.SVGShapeElement.parentClass.call(this, name, config);
3
+ jvm.AbstractShapeElement.apply(this, arguments);
4
+ };
5
+
6
+ jvm.inherits(jvm.SVGShapeElement, jvm.SVGElement);
7
+ jvm.mixin(jvm.SVGShapeElement, jvm.AbstractShapeElement);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Class for vector images manipulations.
3
+ * @constructor
4
+ * @param {DOMElement} container to place canvas to
5
+ * @param {Number} width
6
+ * @param {Number} height
7
+ */
8
+ jvm.VectorCanvas = function(container, width, height) {
9
+ this.mode = window.SVGAngle ? 'svg' : 'vml';
10
+ if (this.mode == 'svg') {
11
+ this.impl = new jvm.SVGCanvasElement(container, width, height);
12
+ } else {
13
+ this.impl = new jvm.VMLCanvasElement(container, width, height);
14
+ }
15
+ return this.impl;
16
+ };
@@ -0,0 +1,45 @@
1
+ jvm.VMLCanvasElement = function(container, width, height){
2
+ this.classPrefix = 'VML';
3
+ jvm.VMLCanvasElement.parentClass.call(this, 'group');
4
+ jvm.AbstractCanvasElement.apply(this, arguments);
5
+ this.node.style.position = 'absolute';
6
+ };
7
+
8
+ jvm.inherits(jvm.VMLCanvasElement, jvm.VMLElement);
9
+ jvm.mixin(jvm.VMLCanvasElement, jvm.AbstractCanvasElement);
10
+
11
+ jvm.VMLCanvasElement.prototype.setSize = function(width, height){
12
+ var paths,
13
+ groups,
14
+ i,
15
+ l;
16
+
17
+ this.width = width;
18
+ this.height = height;
19
+ this.node.style.width = width + "px";
20
+ this.node.style.height = height + "px";
21
+ this.node.coordsize = width+' '+height;
22
+ this.node.coordorigin = "0 0";
23
+ if (this.rootElement) {
24
+ paths = this.rootElement.node.getElementsByTagName('shape');
25
+ for(i = 0, l = paths.length; i < l; i++) {
26
+ paths[i].coordsize = width+' '+height;
27
+ paths[i].style.width = width+'px';
28
+ paths[i].style.height = height+'px';
29
+ }
30
+ groups = this.node.getElementsByTagName('group');
31
+ for(i = 0, l = groups.length; i < l; i++) {
32
+ groups[i].coordsize = width+' '+height;
33
+ groups[i].style.width = width+'px';
34
+ groups[i].style.height = height+'px';
35
+ }
36
+ }
37
+ };
38
+
39
+ jvm.VMLCanvasElement.prototype.applyTransformParams = function(scale, transX, transY) {
40
+ this.scale = scale;
41
+ this.transX = transX;
42
+ this.transY = transY;
43
+ this.rootElement.node.coordorigin = (this.width-transX-this.width/100)+','+(this.height-transY-this.height/100);
44
+ this.rootElement.node.coordsize = this.width/scale+','+this.height/scale;
45
+ };
@@ -0,0 +1,26 @@
1
+ jvm.VMLCircleElement = function(config, style){
2
+ jvm.VMLCircleElement.parentClass.call(this, 'oval', config, style);
3
+ };
4
+
5
+ jvm.inherits(jvm.VMLCircleElement, jvm.VMLShapeElement);
6
+
7
+ jvm.VMLCircleElement.prototype.applyAttr = function(attr, value){
8
+ switch (attr) {
9
+ case 'r':
10
+ this.node.style.width = value*2+'px';
11
+ this.node.style.height = value*2+'px';
12
+ this.applyAttr('cx', this.get('cx') || 0);
13
+ this.applyAttr('cy', this.get('cy') || 0);
14
+ break;
15
+ case 'cx':
16
+ if (!value) return;
17
+ this.node.style.left = value - (this.get('r') || 0) + 'px';
18
+ break;
19
+ case 'cy':
20
+ if (!value) return;
21
+ this.node.style.top = value - (this.get('r') || 0) + 'px';
22
+ break;
23
+ default:
24
+ jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this, attr, value);
25
+ }
26
+ };
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Wrapper for VML element.
3
+ * @constructor
4
+ * @extends jvm.AbstractElement
5
+ * @param {String} name Tag name of the element
6
+ * @param {Object} config Set of parameters to initialize element with
7
+ */
8
+
9
+ jvm.VMLElement = function(name, config){
10
+ if (!jvm.VMLElement.VMLInitialized) {
11
+ jvm.VMLElement.initializeVML();
12
+ }
13
+
14
+ jvm.VMLElement.parentClass.apply(this, arguments);
15
+ };
16
+
17
+ jvm.inherits(jvm.VMLElement, jvm.AbstractElement);
18
+
19
+ /**
20
+ * Shows if VML was already initialized for the current document or not.
21
+ * @static
22
+ * @private
23
+ * @type {Boolean}
24
+ */
25
+ jvm.VMLElement.VMLInitialized = false;
26
+
27
+ /**
28
+ * Initializes VML handling before creating the first element
29
+ * (adds CSS class and creates namespace). Adds one of two forms
30
+ * of createElement method depending of support by browser.
31
+ * @static
32
+ * @private
33
+ */
34
+
35
+ // The following method of VML handling is borrowed from the
36
+ // Raphael library by Dmitry Baranovsky.
37
+
38
+ jvm.VMLElement.initializeVML = function(){
39
+ try {
40
+ if (!document.namespaces.rvml) {
41
+ document.namespaces.add("rvml","urn:schemas-microsoft-com:vml");
42
+ }
43
+ /**
44
+ * Creates DOM element.
45
+ * @param {String} tagName Name of element
46
+ * @private
47
+ * @returns DOMElement
48
+ */
49
+ jvm.VMLElement.prototype.createElement = function (tagName) {
50
+ return document.createElement('<rvml:' + tagName + ' class="rvml">');
51
+ };
52
+ } catch (e) {
53
+ /**
54
+ * @private
55
+ */
56
+ jvm.VMLElement.prototype.createElement = function (tagName) {
57
+ return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
58
+ };
59
+ }
60
+ document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
61
+ jvm.VMLElement.VMLInitialized = true;
62
+ };
63
+
64
+ /**
65
+ * Returns constructor for element by name prefixed with 'VML'.
66
+ * @param {String} ctr Name of basic constructor to return
67
+ * proper implementation for.
68
+ * @returns Function
69
+ * @private
70
+ */
71
+ jvm.VMLElement.prototype.getElementCtr = function( ctr ){
72
+ return jvm['VML'+ctr];
73
+ };
74
+
75
+ /**
76
+ * Adds CSS class for underlying DOM element.
77
+ * @param {String} className Name of CSS class name
78
+ */
79
+ jvm.VMLElement.prototype.addClass = function( className ){
80
+ jvm.$(this.node).addClass(className);
81
+ };
82
+
83
+ /**
84
+ * Applies attribute value to the underlying DOM element.
85
+ * @param {String} name Name of attribute
86
+ * @param {Number|String} config Value of attribute to apply
87
+ * @private
88
+ */
89
+ jvm.VMLElement.prototype.applyAttr = function( attr, value ){
90
+ this.node[attr] = value;
91
+ };
92
+
93
+ /**
94
+ * Returns boundary box for the element.
95
+ * @returns {Object} Boundary box with numeric fields: x, y, width, height
96
+ * @override
97
+ */
98
+ jvm.VMLElement.prototype.getBBox = function(){
99
+ var node = jvm.$(this.node);
100
+ return {
101
+ x: node.position().left / this.canvas.scale,
102
+ y: node.position().top / this.canvas.scale,
103
+ width: node.width() / this.canvas.scale,
104
+ height: node.height() / this.canvas.scale
105
+ };
106
+ };