2 Raphael
.colorwheel = function (x
, y
, size
, initcolor
, element
) {
3 return new ColorWheel(x
, y
, size
, initcolor
, element
);
8 ColorWheel = function (x
, y
, size
, initcolor
, element
) {
10 var w3
= 3 * size
/ 200,
13 segments
= pi
* size
/ 5,
16 padding
= 2 * size
/ 200,
19 var H
= 1, S
= 1, B
= 1, s
= size
- (size20
* 4);
20 var r
= element
? Raphael(element
, size
, size
) : Raphael(x
, y
, size
, size
),
21 xy
= s
/ 6 + size20
* 2 + padding
,
22 wh
= s
* 2 / 3 - padding
* 2;
28 var a
= pi
/ 2 - pi
* 2 / segments
* 1.3,
30 R2
= size2
- padding
- size20
* 2,
31 path
= ["M", size2
, padding
, "A", R
, R
, 0, 0, 1, R
* Math
.cos(a
) + R
+ padding
, R
- R
* Math
.sin(a
) + padding
, "L", R2
* Math
.cos(a
) + R
+ padding
, R
- R2
* Math
.sin(a
) + padding
, "A", R2
, R2
, 0, 0, 0, size2
, padding
+ size20
* 2, "z"].join();
32 for (var i
= 0; i
< segments
; i
++) {
35 fill
: "hsb(" + i
* (255 / segments
) / 255 + ", 1, 0.78)",
36 transform
: "r" + [(360 / segments
) * i
, size2
, size2
]
39 r
.path(["M", size2
, padding
, "A", R
, R
, 0, 1, 1, size2
- 1, padding
, "l1,0", "M", size2
, padding
+ size20
* 2, "A", R2
, R2
, 0, 1, 1, size2
- 1, padding
+ size20
* 2, "l1,0"]).attr({
43 t
.cursorhsb
= r
.set();
44 var h
= size20
* 2 + 2;
45 t
.cursorhsb
.push(r
.rect(size2
- h
/ fi
/ 2, padding
- 1, h
/ fi
, h
, 3 * size
/ 200).attr({
50 t
.cursorhsb
.push(t
.cursorhsb
[0].clone().attr({
55 t
.ring
= r
.path(["M", size2
, padding
, "A", R
, R
, 0, 1, 1, size2
- 1, padding
, "l1,0M", size2
, padding
+ size20
* 2, "A", R2
, R2
, 0, 1, 1, size2
- 1, padding
+ size20
* 2, "l1,0"]).attr({
62 t
.main
= r
.rect(xy
, xy
, wh
, wh
).attr({
72 t
.square
= r
.rect(xy
- 1, xy
- 1, wh
+ 2, wh
+ 2).attr({
81 t
.cursor
.push(r
.circle(size2
, size2
, size20
/ 2).attr({
86 t
.cursor
.push(t
.cursor
[0].clone().attr({
100 t
.ring
.drag(function (dx
, dy
, x
, y
) {
101 t
.docOnMove(dx
, dy
, x
, y
);
103 t
.hsbOnTheMove
= true;
104 t
.setH(x
- t
.x
- t
.size2
, y
- t
.y
- t
.size2
);
106 t
.hsbOnTheMove
= false;
108 t
.square
.drag(function (dx
, dy
, x
, y
) {
109 t
.docOnMove(dx
, dy
, x
, y
);
111 t
.clrOnTheMove
= true;
112 t
.setSB(x
- t
.x
, y
- t
.y
);
114 t
.clrOnTheMove
= false;
117 t
.color(initcolor
|| "#f00");
118 this.onchanged
&& this.onchanged(this.color());
120 proto
= ColorWheel
.prototype;
121 proto
.setH = function (x
, y
) {
122 var d
= Raphael
.angle(x
, y
, 0, 0),
124 this.cursorhsb
.attr({transform
: "r" + [d
+ 90, this.size2
, this.size2
]});
125 this.H
= (d
+ 90) / 360;
126 this.main
.attr({fill
: "hsb(" + this.H
+ ",1,1)"});
127 this.onchange
&& this.onchange(this.color());
129 proto
.setSB = function (x
, y
) {
131 x
< me
.size2
- me
.wh
/ 2 && (x
= me
.size2
- me
.wh
/ 2);
132 x
> me
.size2
+ me
.wh
/ 2 && (x
= me
.size2
+ me
.wh
/ 2);
133 y
< me
.size2
- me
.wh
/ 2 && (y
= me
.size2
- me
.wh
/ 2);
134 y
> me
.size2
+ me
.wh
/ 2 && (y
= me
.size2
+ me
.wh
/ 2);
135 me
.cursor
.attr({cx
: x
, cy
: y
});
136 me
.B
= 1 - (y
- me
.xy
) / me
.wh
;
137 me
.S
= (x
- me
.xy
) / me
.wh
;
138 me
.onchange
&& me
.onchange(me
.color());
140 proto
.docOnMove = function (dx
, dy
, x
, y
) {
141 if (this.hsbOnTheMove
) {
142 this.setH(x
- this.x
- this.size2
, y
- this.y
- this.size2
);
144 if (this.clrOnTheMove
) {
145 this.setSB(x
- this.x
, y
- this.y
);
148 proto
.remove = function () {
149 this.raphael
.remove();
150 this.color = function () {
154 proto
.color = function (color
) {
156 color
= Raphael
.color(color
);
157 var d
= color
.h
* 360;
161 this.cursorhsb
.attr({transform
: "r" + [d
, this.size2
, this.size2
]});
162 this.main
.attr({fill
: "hsb(" + this.H
+ ",1,1)"});
163 var x
= this.S
* this.wh
+ this.xy
,
164 y
= (1 - this.B
) * this.wh
+ this.xy
;
165 this.cursor
.attr({cx
: x
, cy
: y
});
168 return Raphael
.hsb2rgb(this.H
, this.S
, this.B
).hex
;