diff --git a/ui/ui.colorpicker.js b/ui/ui.colorpicker.js index f19a3347a..60a93d6a4 100644 --- a/ui/ui.colorpicker.js +++ b/ui/ui.colorpicker.js @@ -1,472 +1,472 @@ /* - * jQuery UI Draggable + * jQuery UI Color Picker * * Copyright (c) 2008 Stefan Petre, Paul Bakaus * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * - * http://docs.jquery.com/UI/Draggables + * http://docs.jquery.com/UI/ColorPicker * * Depends: * ui.core.js */ (function ($) { - $.widget("ui.colorpicker", { - - init: function() { - - this.charMin = 65; - var o = this.options, self = this, - tpl = '
'; - - if (typeof o.color == 'string') { - this.color = this.HexToHSB(o.color); - } else if (o.color.r != undefined && o.color.g != undefined && o.color.b != undefined) { - this.color = this.RGBToHSB(o.color); - } else if (o.color.h != undefined && o.color.s != undefined && o.color.b != undefined) { - this.color = this.fixHSB(o.color); - } else { - return this; - } - - this.origColor = this.color; - this.picker = $(tpl); - - if (o.flat) { - this.picker.appendTo(this.element).show(); - } else { - this.picker.appendTo(document.body); - } - - this.fields = this.picker.find('input') - .bind('keydown', function(e) { return self.keyDown.call(self, e); }) - .bind('change', function(e) { return self.change.call(self, e); }) - .bind('blur', function(e) { return self.blur.call(self, e); }) - .bind('focus', function(e) { return self.focus.call(self, e); }); - - this.picker.find('span').bind('mousedown', function(e) { return self.downIncrement.call(self, e); }); - - this.selector = this.picker.find('div.ui-colorpicker-color').bind('mousedown', function(e) { return self.downSelector.call(self, e); }); - this.selectorIndic = this.selector.find('div div'); - this.hue = this.picker.find('div.ui-colorpicker-hue div'); - this.picker.find('div.ui-colorpicker-hue').bind('mousedown', function(e) { return self.downHue.call(self, e); }); - - this.newColor = this.picker.find('div.ui-colorpicker-new-color'); - this.currentColor = this.picker.find('div.ui-colorpicker-current-color'); - - this.picker.find('div.ui-colorpicker-submit') - .bind('mouseenter', function(e) { return self.enterSubmit.call(self, e); }) - .bind('mouseleave', function(e) { return self.leaveSubmit.call(self, e); }) - .bind('click', function(e) { return self.clickSubmit.call(self, e); }); - - this.fillRGBFields(this.color); - this.fillHSBFields(this.color); - this.fillHexFields(this.color); - this.setHue(this.color); - this.setSelector(this.color); - this.setCurrentColor(this.color); - this.setNewColor(this.color); - - if (o.flat) { - this.picker.css({ - position: 'relative', - display: 'block' - }); - } else { - $(this.element).bind(o.eventName+".colorpicker", function(e) { return self.show.call(self, e); }); - } - - }, - - destroy: function() { - - this.picker.remove(); - this.element.removeData("colorpicker").unbind(".colorpicker"); - - }, - - fillRGBFields: function(hsb) { - var rgb = this.HSBToRGB(hsb); - this.fields - .eq(1).val(rgb.r).end() - .eq(2).val(rgb.g).end() - .eq(3).val(rgb.b).end(); - }, - fillHSBFields: function(hsb) { - this.fields - .eq(4).val(hsb.h).end() - .eq(5).val(hsb.s).end() - .eq(6).val(hsb.b).end(); - }, - fillHexFields: function (hsb) { - this.fields - .eq(0).val(this.HSBToHex(hsb)).end(); - }, - setSelector: function(hsb) { - this.selector.css('backgroundColor', '#' + this.HSBToHex({h: hsb.h, s: 100, b: 100})); - this.selectorIndic.css({ - left: parseInt(150 * hsb.s/100, 10), - top: parseInt(150 * (100-hsb.b)/100, 10) - }); - }, - setHue: function(hsb) { - this.hue.css('top', parseInt(150 - 150 * hsb.h/360, 10)); - }, - setCurrentColor: function(hsb) { - this.currentColor.css('backgroundColor', '#' + this.HSBToHex(hsb)); - }, - setNewColor: function(hsb) { - this.newColor.css('backgroundColor', '#' + this.HSBToHex(hsb)); - }, - keyDown: function(e) { - var pressedKey = e.charCode || e.keyCode || -1; - if ((pressedKey >= this.charMin && pressedKey <= 90) || pressedKey == 32) { - return false; - } - }, - change: function(e, target) { - - var col; - target = target || e.target; - if (target.parentNode.className.indexOf('-hex') > 0) { - this.color = col = this.HexToHSB(this.value); - this.fillRGBFields(col.color); - this.fillHSBFields(col); - } else if (target.parentNode.className.indexOf('-hsb') > 0) { - this.color = col = this.fixHSB({ - h: parseInt(this.fields.eq(4).val(), 10), - s: parseInt(this.fields.eq(5).val(), 10), - b: parseInt(this.fields.eq(6).val(), 10) - }); - this.fillRGBFields(col); - this.fillHexFields(col); - } else { - this.color = col = this.RGBToHSB(this.fixRGB({ - r: parseInt(this.fields.eq(1).val(), 10), - g: parseInt(this.fields.eq(2).val(), 10), - b: parseInt(this.fields.eq(3).val(), 10) - })); - this.fillHexFields(col); - this.fillHSBFields(col); - } - this.setSelector(col); - this.setHue(col); - this.setNewColor(col); - - this.trigger('change', e, { options: this.options, hsb: col, hex: this.HSBToHex(col), rgb: this.HSBToRGB(col) }); - }, - blur: function(e) { - - var col = this.color; - this.fillRGBFields(col); - this.fillHSBFields(col); - this.fillHexFields(col); - this.setHue(col); - this.setSelector(col); - this.setNewColor(col); - this.fields.parent().removeClass('ui-colorpicker-focus'); - - }, - focus: function(e) { - - this.charMin = e.target.parentNode.className.indexOf('-hex') > 0 ? 70 : 65; - this.fields.parent().removeClass('ui-colorpicker-focus'); - $(e.target.parentNode).addClass('ui-colorpicker-focus'); - - }, - downIncrement: function(e) { - - var field = $(e.target).parent().find('input').focus(), self = this; - this.currentIncrement = { - el: $(e.target).parent().addClass('ui-colorpicker-slider'), - max: e.target.parentNode.className.indexOf('-hsb-h') > 0 ? 360 : (e.target.parentNode.className.indexOf('-hsb') > 0 ? 100 : 255), - y: e.pageY, - field: field, - val: parseInt(field.val(), 10) - }; - $(document).bind('mouseup.cpSlider', function(e) { return self.upIncrement.call(self, e); }); - $(document).bind('mousemove.cpSlider', function(e) { return self.moveIncrement.call(self, e); }); - return false; - - }, - moveIncrement: function(e) { - this.currentIncrement.field.val(Math.max(0, Math.min(this.currentIncrement.max, parseInt(this.currentIncrement.val + e.pageY - this.currentIncrement.y, 10)))); - this.change.apply(this, [e, this.currentIncrement.field.get(0)]); - return false; - }, - upIncrement: function(e) { - this.currentIncrement.el.removeClass('ui-colorpicker-slider').find('input').focus(); - this.change.apply(this, [e, this.currentIncrement.field.get(0)]); - $(document).unbind('mouseup.cpSlider'); - $(document).unbind('mousemove.cpSlider'); - return false; - }, - downHue: function(e) { - - this.currentHue = { - y: this.picker.find('div.ui-colorpicker-hue').offset().top - }; - - this.change.apply(this, [e, this - .fields - .eq(4) - .val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10)) - .get(0)]); - - var self = this; - $(document).bind('mouseup.cpSlider', function(e) { return self.upHue.call(self, e); }); - $(document).bind('mousemove.cpSlider', function(e) { return self.moveHue.call(self, e); }); - return false; - - }, - moveHue: function(e) { - - this.change.apply(this, [e, this - .fields - .eq(4) - .val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10)) - .get(0)]); - - return false; - - }, - upHue: function(e) { - $(document).unbind('mouseup.cpSlider'); - $(document).unbind('mousemove.cpSlider'); - return false; - }, - downSelector: function(e) { - - var self = this; - this.currentSelector = { - pos: this.picker.find('div.ui-colorpicker-color').offset() - }; - - this.change.apply(this, [e, this - .fields - .eq(6) - .val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10)) - .end() - .eq(5) - .val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10)) - .get(0) - ]); - $(document).bind('mouseup.cpSlider', function(e) { return self.upSelector.call(self, e); }); - $(document).bind('mousemove.cpSlider', function(e) { return self.moveSelector.call(self, e); }); - return false; - - }, - moveSelector: function(e) { - - this.change.apply(this, [e, this - .fields - .eq(6) - .val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10)) - .end() - .eq(5) - .val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10)) - .get(0) - ]); - return false; - - }, - upSelector: function(e) { - $(document).unbind('mouseup.cpSlider'); - $(document).unbind('mousemove.cpSlider'); - return false; - }, - enterSubmit: function(e) { - this.picker.find('div.ui-colorpicker-submit').addClass('ui-colorpicker-focus'); - }, - leaveSubmit: function(e) { - this.picker.find('div.ui-colorpicker-submit').removeClass('ui-colorpicker-focus'); - }, - clickSubmit: function(e) { - - var col = this.color; - this.origColor = col; - this.setCurrentColor(col); - - this.trigger("submit", e, { options: this.options, hsb: col, hex: this.HSBToHex(col), rgb: this.HSBToRGB(col) }); - return false; - - }, - show: function(e) { - - this.trigger("beforeShow", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }); - - var pos = this.element.offset(); - var viewPort = this.getScroll(); - var top = pos.top + this.element[0].offsetHeight; - var left = pos.left; - if (top + 176 > viewPort.t + Math.min(viewPort.h,viewPort.ih)) { - top -= this.element[0].offsetHeight + 176; - } - if (left + 356 > viewPort.l + Math.min(viewPort.w,viewPort.iw)) { - left -= 356; - } - this.picker.css({left: left + 'px', top: top + 'px'}); - if (this.trigger("show", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }) != false) { - this.picker.show(); - } - - var self = this; - $(document).bind('mousedown.colorpicker', function(e) { return self.hide.call(self, e); }); - return false; - - }, - hide: function(e) { - - if (!this.isChildOf(this.picker[0], e.target, this.picker[0])) { - if (this.trigger("hide", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }) != false) { - this.picker.hide(); - } - $(document).unbind('mousedown.colorpicker'); - } - - }, - isChildOf: function(parentEl, el, container) { - if (parentEl == el) { - return true; - } - if (parentEl.contains && !$.browser.safari) { - return parentEl.contains(el); - } - if ( parentEl.compareDocumentPosition ) { - return !!(parentEl.compareDocumentPosition(el) & 16); - } - var prEl = el.parentNode; - while(prEl && prEl != container) { - if (prEl == parentEl) - return true; - prEl = prEl.parentNode; - } - return false; - }, - getScroll: function() { - var t,l,w,h,iw,ih; - if (document.documentElement) { - t = document.documentElement.scrollTop; - l = document.documentElement.scrollLeft; - w = document.documentElement.scrollWidth; - h = document.documentElement.scrollHeight; - } else { - t = document.body.scrollTop; - l = document.body.scrollLeft; - w = document.body.scrollWidth; - h = document.body.scrollHeight; - } - iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0; - ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0; - return { t: t, l: l, w: w, h: h, iw: iw, ih: ih }; - }, - fixHSB: function(hsb) { - return { - h: Math.min(360, Math.max(0, hsb.h)), - s: Math.min(100, Math.max(0, hsb.s)), - b: Math.min(100, Math.max(0, hsb.b)) - }; - }, - fixRGB: function(rgb) { - return { - r: Math.min(255, Math.max(0, rgb.r)), - g: Math.min(255, Math.max(0, rgb.g)), - b: Math.min(255, Math.max(0, rgb.b)) - }; - }, - HexToRGB: function (hex) { - var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16); - return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)}; - }, - HexToHSB: function(hex) { - return this.RGBToHSB(this.HexToRGB(hex)); - }, - RGBToHSB: function(rgb) { - var hsb = {}; - hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b); - hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b); - hsb.b = Math.round((hsb.b /255)*100); - if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0; - else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b); - else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60 + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b); - else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r); - else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r); - else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g); - else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g); - else hsb.h = 0; - hsb.h = Math.round(hsb.h); - return hsb; - }, - HSBToRGB: function(hsb) { - var rgb = {}; - var h = Math.round(hsb.h); - var s = Math.round(hsb.s*255/100); - var v = Math.round(hsb.b*255/100); - if(s == 0) { - rgb.r = rgb.g = rgb.b = v; - } else { - var t1 = v; - var t2 = (255-s)*v/255; - var t3 = (t1-t2)*(h%60)/60; - if(h==360) h = 0; - if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3;} - else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3;} - else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3;} - else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3;} - else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3;} - else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3;} - else {rgb.r=0; rgb.g=0; rgb.b=0;} - } - return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)}; - }, - RGBToHex: function(rgb) { - var hex = [ - rgb.r.toString(16), - rgb.g.toString(16), - rgb.b.toString(16) - ]; - $.each(hex, function (nr, val) { - if (val.length == 1) { - hex[nr] = '0' + val; - } - }); - return hex.join(''); - }, - HSBToHex: function(hsb) { - return this.RGBToHex(this.HSBToRGB(hsb)); - }, - setColor: function(col) { - if (typeof col == 'string') { - col = this.HexToHSB(col); - } else if (col.r != undefined && col.g != undefined && col.b != undefined) { - col = this.RGBToHSB(col); - } else if (col.h != undefined && col.s != undefined && col.b != undefined) { - col = this.fixHSB(col); - } else { - return this; - } - - this.color = col; - this.origColor = col; - this.fillRGBFields(col); - this.fillHSBFields(col); - this.fillHexFields(col); - this.setHue(col); - this.setSelector(col); - this.setCurrentColor(col); - this.setNewColor(col); - - } - - }); +$.widget("ui.colorpicker", { - $.extend($.ui.colorpicker, { - defaults: { - eventName: 'click', - color: 'ff0000', - flat: false + init: function() { + + this.charMin = 65; + var o = this.options, self = this, + tpl = '
'; + + if (typeof o.color == 'string') { + this.color = this.HexToHSB(o.color); + } else if (o.color.r != undefined && o.color.g != undefined && o.color.b != undefined) { + this.color = this.RGBToHSB(o.color); + } else if (o.color.h != undefined && o.color.s != undefined && o.color.b != undefined) { + this.color = this.fixHSB(o.color); + } else { + return this; } - }); + + this.origColor = this.color; + this.picker = $(tpl); + + if (o.flat) { + this.picker.appendTo(this.element).show(); + } else { + this.picker.appendTo(document.body); + } + + this.fields = this.picker.find('input') + .bind('keydown', function(e) { return self.keyDown.call(self, e); }) + .bind('change', function(e) { return self.change.call(self, e); }) + .bind('blur', function(e) { return self.blur.call(self, e); }) + .bind('focus', function(e) { return self.focus.call(self, e); }); + + this.picker.find('span').bind('mousedown', function(e) { return self.downIncrement.call(self, e); }); + + this.selector = this.picker.find('div.ui-colorpicker-color').bind('mousedown', function(e) { return self.downSelector.call(self, e); }); + this.selectorIndic = this.selector.find('div div'); + this.hue = this.picker.find('div.ui-colorpicker-hue div'); + this.picker.find('div.ui-colorpicker-hue').bind('mousedown', function(e) { return self.downHue.call(self, e); }); + + this.newColor = this.picker.find('div.ui-colorpicker-new-color'); + this.currentColor = this.picker.find('div.ui-colorpicker-current-color'); + + this.picker.find('div.ui-colorpicker-submit') + .bind('mouseenter', function(e) { return self.enterSubmit.call(self, e); }) + .bind('mouseleave', function(e) { return self.leaveSubmit.call(self, e); }) + .bind('click', function(e) { return self.clickSubmit.call(self, e); }); + + this.fillRGBFields(this.color); + this.fillHSBFields(this.color); + this.fillHexFields(this.color); + this.setHue(this.color); + this.setSelector(this.color); + this.setCurrentColor(this.color); + this.setNewColor(this.color); + + if (o.flat) { + this.picker.css({ + position: 'relative', + display: 'block' + }); + } else { + $(this.element).bind(o.eventName+".colorpicker", function(e) { return self.show.call(self, e); }); + } + + }, + + destroy: function() { + + this.picker.remove(); + this.element.removeData("colorpicker").unbind(".colorpicker"); + + }, + + fillRGBFields: function(hsb) { + var rgb = this.HSBToRGB(hsb); + this.fields + .eq(1).val(rgb.r).end() + .eq(2).val(rgb.g).end() + .eq(3).val(rgb.b).end(); + }, + fillHSBFields: function(hsb) { + this.fields + .eq(4).val(hsb.h).end() + .eq(5).val(hsb.s).end() + .eq(6).val(hsb.b).end(); + }, + fillHexFields: function (hsb) { + this.fields + .eq(0).val(this.HSBToHex(hsb)).end(); + }, + setSelector: function(hsb) { + this.selector.css('backgroundColor', '#' + this.HSBToHex({h: hsb.h, s: 100, b: 100})); + this.selectorIndic.css({ + left: parseInt(150 * hsb.s/100, 10), + top: parseInt(150 * (100-hsb.b)/100, 10) + }); + }, + setHue: function(hsb) { + this.hue.css('top', parseInt(150 - 150 * hsb.h/360, 10)); + }, + setCurrentColor: function(hsb) { + this.currentColor.css('backgroundColor', '#' + this.HSBToHex(hsb)); + }, + setNewColor: function(hsb) { + this.newColor.css('backgroundColor', '#' + this.HSBToHex(hsb)); + }, + keyDown: function(e) { + var pressedKey = e.charCode || e.keyCode || -1; + if ((pressedKey >= this.charMin && pressedKey <= 90) || pressedKey == 32) { + return false; + } + }, + change: function(e, target) { + + var col; + target = target || e.target; + if (target.parentNode.className.indexOf('-hex') > 0) { + this.color = col = this.HexToHSB(this.value); + this.fillRGBFields(col.color); + this.fillHSBFields(col); + } else if (target.parentNode.className.indexOf('-hsb') > 0) { + this.color = col = this.fixHSB({ + h: parseInt(this.fields.eq(4).val(), 10), + s: parseInt(this.fields.eq(5).val(), 10), + b: parseInt(this.fields.eq(6).val(), 10) + }); + this.fillRGBFields(col); + this.fillHexFields(col); + } else { + this.color = col = this.RGBToHSB(this.fixRGB({ + r: parseInt(this.fields.eq(1).val(), 10), + g: parseInt(this.fields.eq(2).val(), 10), + b: parseInt(this.fields.eq(3).val(), 10) + })); + this.fillHexFields(col); + this.fillHSBFields(col); + } + this.setSelector(col); + this.setHue(col); + this.setNewColor(col); + + this.trigger('change', e, { options: this.options, hsb: col, hex: this.HSBToHex(col), rgb: this.HSBToRGB(col) }); + }, + blur: function(e) { + + var col = this.color; + this.fillRGBFields(col); + this.fillHSBFields(col); + this.fillHexFields(col); + this.setHue(col); + this.setSelector(col); + this.setNewColor(col); + this.fields.parent().removeClass('ui-colorpicker-focus'); + + }, + focus: function(e) { + + this.charMin = e.target.parentNode.className.indexOf('-hex') > 0 ? 70 : 65; + this.fields.parent().removeClass('ui-colorpicker-focus'); + $(e.target.parentNode).addClass('ui-colorpicker-focus'); + + }, + downIncrement: function(e) { + + var field = $(e.target).parent().find('input').focus(), self = this; + this.currentIncrement = { + el: $(e.target).parent().addClass('ui-colorpicker-slider'), + max: e.target.parentNode.className.indexOf('-hsb-h') > 0 ? 360 : (e.target.parentNode.className.indexOf('-hsb') > 0 ? 100 : 255), + y: e.pageY, + field: field, + val: parseInt(field.val(), 10) + }; + $(document).bind('mouseup.cpSlider', function(e) { return self.upIncrement.call(self, e); }); + $(document).bind('mousemove.cpSlider', function(e) { return self.moveIncrement.call(self, e); }); + return false; + + }, + moveIncrement: function(e) { + this.currentIncrement.field.val(Math.max(0, Math.min(this.currentIncrement.max, parseInt(this.currentIncrement.val + e.pageY - this.currentIncrement.y, 10)))); + this.change.apply(this, [e, this.currentIncrement.field.get(0)]); + return false; + }, + upIncrement: function(e) { + this.currentIncrement.el.removeClass('ui-colorpicker-slider').find('input').focus(); + this.change.apply(this, [e, this.currentIncrement.field.get(0)]); + $(document).unbind('mouseup.cpSlider'); + $(document).unbind('mousemove.cpSlider'); + return false; + }, + downHue: function(e) { + + this.currentHue = { + y: this.picker.find('div.ui-colorpicker-hue').offset().top + }; + + this.change.apply(this, [e, this + .fields + .eq(4) + .val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10)) + .get(0)]); + + var self = this; + $(document).bind('mouseup.cpSlider', function(e) { return self.upHue.call(self, e); }); + $(document).bind('mousemove.cpSlider', function(e) { return self.moveHue.call(self, e); }); + return false; + + }, + moveHue: function(e) { + + this.change.apply(this, [e, this + .fields + .eq(4) + .val(parseInt(360*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentHue.y))))/150, 10)) + .get(0)]); + + return false; + + }, + upHue: function(e) { + $(document).unbind('mouseup.cpSlider'); + $(document).unbind('mousemove.cpSlider'); + return false; + }, + downSelector: function(e) { + + var self = this; + this.currentSelector = { + pos: this.picker.find('div.ui-colorpicker-color').offset() + }; + + this.change.apply(this, [e, this + .fields + .eq(6) + .val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10)) + .end() + .eq(5) + .val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10)) + .get(0) + ]); + $(document).bind('mouseup.cpSlider', function(e) { return self.upSelector.call(self, e); }); + $(document).bind('mousemove.cpSlider', function(e) { return self.moveSelector.call(self, e); }); + return false; + + }, + moveSelector: function(e) { + + this.change.apply(this, [e, this + .fields + .eq(6) + .val(parseInt(100*(150 - Math.max(0,Math.min(150,(e.pageY - this.currentSelector.pos.top))))/150, 10)) + .end() + .eq(5) + .val(parseInt(100*(Math.max(0,Math.min(150,(e.pageX - this.currentSelector.pos.left))))/150, 10)) + .get(0) + ]); + return false; + + }, + upSelector: function(e) { + $(document).unbind('mouseup.cpSlider'); + $(document).unbind('mousemove.cpSlider'); + return false; + }, + enterSubmit: function(e) { + this.picker.find('div.ui-colorpicker-submit').addClass('ui-colorpicker-focus'); + }, + leaveSubmit: function(e) { + this.picker.find('div.ui-colorpicker-submit').removeClass('ui-colorpicker-focus'); + }, + clickSubmit: function(e) { + + var col = this.color; + this.origColor = col; + this.setCurrentColor(col); + + this.trigger("submit", e, { options: this.options, hsb: col, hex: this.HSBToHex(col), rgb: this.HSBToRGB(col) }); + return false; + + }, + show: function(e) { + + this.trigger("beforeShow", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }); + + var pos = this.element.offset(); + var viewPort = this.getScroll(); + var top = pos.top + this.element[0].offsetHeight; + var left = pos.left; + if (top + 176 > viewPort.t + Math.min(viewPort.h,viewPort.ih)) { + top -= this.element[0].offsetHeight + 176; + } + if (left + 356 > viewPort.l + Math.min(viewPort.w,viewPort.iw)) { + left -= 356; + } + this.picker.css({left: left + 'px', top: top + 'px'}); + if (this.trigger("show", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }) != false) { + this.picker.show(); + } + + var self = this; + $(document).bind('mousedown.colorpicker', function(e) { return self.hide.call(self, e); }); + return false; + + }, + hide: function(e) { + + if (!this.isChildOf(this.picker[0], e.target, this.picker[0])) { + if (this.trigger("hide", e, { options: this.options, hsb: this.color, hex: this.HSBToHex(this.color), rgb: this.HSBToRGB(this.color) }) != false) { + this.picker.hide(); + } + $(document).unbind('mousedown.colorpicker'); + } + + }, + isChildOf: function(parentEl, el, container) { + if (parentEl == el) { + return true; + } + if (parentEl.contains && !$.browser.safari) { + return parentEl.contains(el); + } + if ( parentEl.compareDocumentPosition ) { + return !!(parentEl.compareDocumentPosition(el) & 16); + } + var prEl = el.parentNode; + while(prEl && prEl != container) { + if (prEl == parentEl) + return true; + prEl = prEl.parentNode; + } + return false; + }, + getScroll: function() { + var t,l,w,h,iw,ih; + if (document.documentElement) { + t = document.documentElement.scrollTop; + l = document.documentElement.scrollLeft; + w = document.documentElement.scrollWidth; + h = document.documentElement.scrollHeight; + } else { + t = document.body.scrollTop; + l = document.body.scrollLeft; + w = document.body.scrollWidth; + h = document.body.scrollHeight; + } + iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0; + ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0; + return { t: t, l: l, w: w, h: h, iw: iw, ih: ih }; + }, + fixHSB: function(hsb) { + return { + h: Math.min(360, Math.max(0, hsb.h)), + s: Math.min(100, Math.max(0, hsb.s)), + b: Math.min(100, Math.max(0, hsb.b)) + }; + }, + fixRGB: function(rgb) { + return { + r: Math.min(255, Math.max(0, rgb.r)), + g: Math.min(255, Math.max(0, rgb.g)), + b: Math.min(255, Math.max(0, rgb.b)) + }; + }, + HexToRGB: function (hex) { + var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16); + return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)}; + }, + HexToHSB: function(hex) { + return this.RGBToHSB(this.HexToRGB(hex)); + }, + RGBToHSB: function(rgb) { + var hsb = {}; + hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b); + hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b); + hsb.b = Math.round((hsb.b /255)*100); + if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0; + else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b); + else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60 + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b); + else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r); + else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r); + else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g); + else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g); + else hsb.h = 0; + hsb.h = Math.round(hsb.h); + return hsb; + }, + HSBToRGB: function(hsb) { + var rgb = {}; + var h = Math.round(hsb.h); + var s = Math.round(hsb.s*255/100); + var v = Math.round(hsb.b*255/100); + if(s == 0) { + rgb.r = rgb.g = rgb.b = v; + } else { + var t1 = v; + var t2 = (255-s)*v/255; + var t3 = (t1-t2)*(h%60)/60; + if(h==360) h = 0; + if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3;} + else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3;} + else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3;} + else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3;} + else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3;} + else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3;} + else {rgb.r=0; rgb.g=0; rgb.b=0;} + } + return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)}; + }, + RGBToHex: function(rgb) { + var hex = [ + rgb.r.toString(16), + rgb.g.toString(16), + rgb.b.toString(16) + ]; + $.each(hex, function (nr, val) { + if (val.length == 1) { + hex[nr] = '0' + val; + } + }); + return hex.join(''); + }, + HSBToHex: function(hsb) { + return this.RGBToHex(this.HSBToRGB(hsb)); + }, + setColor: function(col) { + if (typeof col == 'string') { + col = this.HexToHSB(col); + } else if (col.r != undefined && col.g != undefined && col.b != undefined) { + col = this.RGBToHSB(col); + } else if (col.h != undefined && col.s != undefined && col.b != undefined) { + col = this.fixHSB(col); + } else { + return this; + } + + this.color = col; + this.origColor = col; + this.fillRGBFields(col); + this.fillHSBFields(col); + this.fillHexFields(col); + this.setHue(col); + this.setSelector(col); + this.setCurrentColor(col); + this.setNewColor(col); + + } + +}); + +$.extend($.ui.colorpicker, { + defaults: { + eventName: 'click', + color: 'ff0000', + flat: false + } +}); })(jQuery); \ No newline at end of file