2
* jQuery UI Color Picker @VERSION
4
* Copyright (c) 2008 Stefan Petre, Paul Bakaus
5
* Dual licensed under the MIT (MIT-LICENSE.txt)
6
* and GPL (GPL-LICENSE.txt) licenses.
8
* http://docs.jquery.com/UI/ColorPicker
15
$.widget("ui.colorpicker", {
20
var o = this.options, self = this,
21
tpl = '<div class="ui-colorpicker clearfix"><div class="ui-colorpicker-color"><div><div></div></div></div><div class="ui-colorpicker-hue"><div></div></div><div class="ui-colorpicker-new-color"></div><div class="ui-colorpicker-current-color"></div><div class="ui-colorpicker-hex"><label for="ui-colorpicker-hex" title="hex"></label><input type="text" maxlength="6" size="6" /></div><div class="ui-colorpicker-rgb-r ui-colorpicker-field"><label for="ui-colorpicker-rgb-r"></label><input type="text" maxlength="3" size="2" /><span></span></div><div class="ui-colorpicker-rgb-g ui-colorpicker-field"><label for="ui-colorpicker-rgb-g"></label><input type="text" maxlength="3" size="2" /><span></span></div><div class="ui-colorpicker-rgb-b ui-colorpicker-field"><label for="ui-colorpicker-rgb-b"</label><input type="text" maxlength="3" size="2" /><span></span></div><div class="ui-colorpicker-hsb-h ui-colorpicker-field"><label for="ui-colorpicker-hsb-h"></label><input type="text" maxlength="3" size="2" /><span></span></div><div class="ui-colorpicker-hsb-s ui-colorpicker-field"><label for="ui-colorpicker-hsb-s"></label><input type="text" maxlength="3" size="2" /><span></span></div><div class="ui-colorpicker-hsb-b ui-colorpicker-field"><label for="ui-colorpicker-hsb-b"></label><input type="text" maxlength="3" size="2" /><span></span></div><button class="ui-colorpicker-submit ui-default-state" name="submit" type="button">Done</button></div>';
23
if (typeof o.color == 'string') {
24
this.color = this._HexToHSB(o.color);
25
} else if (o.color.r != undefined && o.color.g != undefined && o.color.b != undefined) {
26
this.color = this._RGBToHSB(o.color);
27
} else if (o.color.h != undefined && o.color.s != undefined && o.color.b != undefined) {
28
this.color = this._fixHSB(o.color);
33
this.origColor = this.color;
37
this.picker.appendTo(this.element).show();
39
this.picker.appendTo(document.body);
42
this.fields = this.picker.find('input')
43
.bind('keydown', function(e) { return self._keyDown.call(self, e); })
44
.bind('change', function(e) { return self._change.call(self, e); })
45
.bind('blur', function(e) { return self._blur.call(self, e); })
46
.bind('focus', function(e) { return self._focus.call(self, e); });
48
this.picker.find('span').bind('mousedown', function(e) { return self._downIncrement.call(self, e); });
50
this.selector = this.picker.find('div.ui-colorpicker-color').bind('mousedown', function(e) { return self._downSelector.call(self, e); });
51
this.selectorIndic = this.selector.find('div div');
52
this.hue = this.picker.find('div.ui-colorpicker-hue div');
53
this.picker.find('div.ui-colorpicker-hue').bind('mousedown', function(e) { return self._downHue.call(self, e); });
55
this.newColor = this.picker.find('div.ui-colorpicker-new-color');
56
this.currentColor = this.picker.find('div.ui-colorpicker-current-color');
58
this.picker.find('.ui-colorpicker-submit')
59
.bind('mouseenter', function(e) { return self._enterSubmit.call(self, e); })
60
.bind('mouseleave', function(e) { return self._leaveSubmit.call(self, e); })
61
.bind('click', function(e) { return self._clickSubmit.call(self, e); });
63
this._fillRGBFields(this.color);
64
this._fillHSBFields(this.color);
65
this._fillHexFields(this.color);
66
this._setHue(this.color);
67
this._setSelector(this.color);
68
this._setCurrentColor(this.color);
69
this._setNewColor(this.color);
77
$(this.element).bind(o.eventName+".colorpicker", function(e) { return self._show.call(self, e); });
85
this.element.removeData("colorpicker").unbind(".colorpicker");
89
_fillRGBFields: function(hsb) {
90
var rgb = this._HSBToRGB(hsb);
92
.eq(1).val(rgb.r).end()
93
.eq(2).val(rgb.g).end()
94
.eq(3).val(rgb.b).end();
96
_fillHSBFields: function(hsb) {
98
.eq(4).val(hsb.h).end()
99
.eq(5).val(hsb.s).end()
100
.eq(6).val(hsb.b).end();
102
_fillHexFields: function (hsb) {
104
.eq(0).val(this._HSBToHex(hsb)).end();
106
_setSelector: function(hsb) {
107
this.selector.css('backgroundColor', '#' + this._HSBToHex({h: hsb.h, s: 100, b: 100}));
108
this.selectorIndic.css({
109
left: parseInt(150 * hsb.s/100, 10),
110
top: parseInt(150 * (100-hsb.b)/100, 10)
113
_setHue: function(hsb) {
114
this.hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
116
_setCurrentColor: function(hsb) {
117
this.currentColor.css('backgroundColor', '#' + this._HSBToHex(hsb));
119
_setNewColor: function(hsb) {
120
this.newColor.css('backgroundColor', '#' + this._HSBToHex(hsb));
122
_keyDown: function(e) {
123
var pressedKey = e.charCode || e.keyCode || -1;
124
if ((pressedKey >= this.charMin && pressedKey <= 90) || pressedKey == 32) {
128
_change: function(e, target) {
131
target = target || e.target;
132
if (target.parentNode.className.indexOf('-hex') > 0) {
133
this.color = col = this._HexToHSB(this.value);
134
this._fillRGBFields(col.color);
135
this._fillHSBFields(col);
136
} else if (target.parentNode.className.indexOf('-hsb') > 0) {
137
this.color = col = this._fixHSB({
138
h: parseInt(this.fields.eq(4).val(), 10),
139
s: parseInt(this.fields.eq(5).val(), 10),
140
b: parseInt(this.fields.eq(6).val(), 10)
142
this._fillRGBFields(col);
143
this._fillHexFields(col);
145
this.color = col = this._RGBToHSB(this._fixRGB({
146
r: parseInt(this.fields.eq(1).val(), 10),
147
g: parseInt(this.fields.eq(2).val(), 10),
148
b: parseInt(this.fields.eq(3).val(), 10)
150
this._fillHexFields(col);
151
this._fillHSBFields(col);
153
this._setSelector(col);
155
this._setNewColor(col);
157
this._trigger('change', e, { options: this.options, hsb: col, hex: this._HSBToHex(col), rgb: this._HSBToRGB(col) });
161
var col = this.color;
162
this._fillRGBFields(col);
163
this._fillHSBFields(col);
164
this._fillHexFields(col);
166
this._setSelector(col);
167
this._setNewColor(col);
168
this.fields.parent().removeClass('ui-colorpicker-focus');
171
_focus: function(e) {
173
this.charMin = e.target.parentNode.className.indexOf('-hex') > 0 ? 70 : 65;
174
this.fields.parent().removeClass('ui-colorpicker-focus');
175
$(e.target.parentNode).addClass('ui-colorpicker-focus');
178
_downIncrement: function(e) {
180
var field = $(e.target).parent().find('input').focus(), self = this;
181
this.currentIncrement = {
182
el: $(e.target).parent().addClass('ui-colorpicker-slider'),
183
max: e.target.parentNode.className.indexOf('-hsb-h') > 0 ? 360 : (e.target.parentNode.className.indexOf('-hsb') > 0 ? 100 : 255),
186
val: parseInt(field.val(), 10)
188
$(document).bind('mouseup.cpSlider', function(e) { return self._upIncrement.call(self, e); });
189
$(document).bind('mousemove.cpSlider', function(e) { return self._moveIncrement.call(self, e); });
193
_moveIncrement: function(e) {
194
this.currentIncrement.field.val(Math.max(0, Math.min(this.currentIncrement.max, parseInt(this.currentIncrement.val + e.pageY - this.currentIncrement.y, 10))));
195
this._change.apply(this, [e, this.currentIncrement.field.get(0)]);
198
_upIncrement: function(e) {
199
this.currentIncrement.el.removeClass('ui-colorpicker-slider').find('input').focus();
200
this._change.apply(this, [e, this.currentIncrement.field.get(0)]);
201
$(document).unbind('mouseup.cpSlider');
202
$(document).unbind('mousemove.cpSlider');
205
_downHue: function(e) {
208
y: this.picker.find('div.ui-colorpicker-hue').offset().top
211
this._change.apply(this, [e, this
214
.val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10))
218
$(document).bind('mouseup.cpSlider', function(e) { return self._upHue.call(self, e); });
219
$(document).bind('mousemove.cpSlider', function(e) { return self._moveHue.call(self, e); });
223
_moveHue: function(e) {
225
this._change.apply(this, [e, this
228
.val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10))
234
_upHue: function(e) {
235
$(document).unbind('mouseup.cpSlider');
236
$(document).unbind('mousemove.cpSlider');
239
_downSelector: function(e) {
242
this.currentSelector = {
243
pos: this.picker.find('div.ui-colorpicker-color').offset()
246
this._change.apply(this, [e, this
249
.val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10))
252
.val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10))
255
$(document).bind('mouseup.cpSlider', function(e) { return self._upSelector.call(self, e); });
256
$(document).bind('mousemove.cpSlider', function(e) { return self._moveSelector.call(self, e); });
260
_moveSelector: function(e) {
262
this._change.apply(this, [e, this
265
.val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10))
268
.val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10))
274
_upSelector: function(e) {
275
$(document).unbind('mouseup.cpSlider');
276
$(document).unbind('mousemove.cpSlider');
279
_enterSubmit: function(e) {
280
this.picker.find('.ui-colorpicker-submit').addClass('ui-colorpicker-focus');
282
_leaveSubmit: function(e) {
283
this.picker.find('.ui-colorpicker-submit').removeClass('ui-colorpicker-focus');
285
_clickSubmit: function(e) {
287
var col = this.color;
288
this.origColor = col;
289
this._setCurrentColor(col);
291
this._trigger("submit", e, { options: this.options, hsb: col, hex: this._HSBToHex(col), rgb: this._HSBToRGB(col) });
297
this._trigger("beforeShow", e, { options: this.options, hsb: this.color, hex: this._HSBToHex(this.color), rgb: this._HSBToRGB(this.color) });
299
var pos = this.element.offset();
300
var viewPort = this._getScroll();
301
var top = pos.top + this.element[0].offsetHeight;
303
if (top + 176 > viewPort.t + Math.min(viewPort.h,viewPort.ih)) {
304
top -= this.element[0].offsetHeight + 176;
306
if (left + 356 > viewPort.l + Math.min(viewPort.w,viewPort.iw)) {
309
this.picker.css({left: left + 'px', top: top + 'px'});
310
if (this._trigger("show", e, { options: this.options, hsb: this.color, hex: this._HSBToHex(this.color), rgb: this._HSBToRGB(this.color) }) != false) {
315
$(document).bind('mousedown.colorpicker', function(e) { return self._hide.call(self, e); });
321
if (!this._isChildOf(this.picker[0], e.target, this.picker[0])) {
322
if (this._trigger("hide", e, { options: this.options, hsb: this.color, hex: this._HSBToHex(this.color), rgb: this._HSBToRGB(this.color) }) != false) {
325
$(document).unbind('mousedown.colorpicker');
329
_isChildOf: function(parentEl, el, container) {
330
if (parentEl == el) {
333
if (parentEl.contains && !$.browser.safari) {
334
return parentEl.contains(el);
336
if ( parentEl.compareDocumentPosition ) {
337
return !!(parentEl.compareDocumentPosition(el) & 16);
339
var prEl = el.parentNode;
340
while(prEl && prEl != container) {
341
if (prEl == parentEl)
343
prEl = prEl.parentNode;
347
_getScroll: function() {
349
if (document.documentElement) {
350
t = document.documentElement.scrollTop;
351
l = document.documentElement.scrollLeft;
352
w = document.documentElement.scrollWidth;
353
h = document.documentElement.scrollHeight;
355
t = document.body.scrollTop;
356
l = document.body.scrollLeft;
357
w = document.body.scrollWidth;
358
h = document.body.scrollHeight;
360
iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
361
ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
362
return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
364
_fixHSB: function(hsb) {
366
h: Math.min(360, Math.max(0, hsb.h)),
367
s: Math.min(100, Math.max(0, hsb.s)),
368
b: Math.min(100, Math.max(0, hsb.b))
371
_fixRGB: function(rgb) {
373
r: Math.min(255, Math.max(0, rgb.r)),
374
g: Math.min(255, Math.max(0, rgb.g)),
375
b: Math.min(255, Math.max(0, rgb.b))
378
_HexToRGB: function (hex) {
379
var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
380
return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
382
_HexToHSB: function(hex) {
383
return this._RGBToHSB(this._HexToRGB(hex));
385
_RGBToHSB: function(rgb) {
387
hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b);
388
hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b);
389
hsb.b = Math.round((hsb.b /255)*100);
390
if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0;
391
else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b);
392
else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60 + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b);
393
else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r);
394
else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r);
395
else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g);
396
else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g);
398
hsb.h = Math.round(hsb.h);
401
_HSBToRGB: function(hsb) {
403
var h = Math.round(hsb.h);
404
var s = Math.round(hsb.s*255/100);
405
var v = Math.round(hsb.b*255/100);
407
rgb.r = rgb.g = rgb.b = v;
410
var t2 = (255-s)*v/255;
411
var t3 = (t1-t2)*(h%60)/60;
413
if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3;}
414
else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3;}
415
else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3;}
416
else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3;}
417
else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3;}
418
else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3;}
419
else {rgb.r=0; rgb.g=0; rgb.b=0;}
421
return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
423
_RGBToHex: function(rgb) {
429
$.each(hex, function (nr, val) {
430
if (val.length == 1) {
436
_HSBToHex: function(hsb) {
437
return this._RGBToHex(this._HSBToRGB(hsb));
439
setColor: function(col) {
440
if (typeof col == 'string') {
441
col = this._HexToHSB(col);
442
} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
443
col = this._RGBToHSB(col);
444
} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
445
col = this._fixHSB(col);
451
this.origColor = col;
452
this._fillRGBFields(col);
453
this._fillHSBFields(col);
454
this._fillHexFields(col);
456
this._setSelector(col);
457
this._setCurrentColor(col);
458
this._setNewColor(col);
464
$.extend($.ui.colorpicker, {
b'\\ No newline at end of file'