Liferay.ColorPicker = new Class({ /* context (Object): A DOM object which specifies the context in which to search for the item hasImage: (Boolean) If set to true, it uses the "item" param or whatever image has the .use-color-picker class as the image item: (Object|String): A DOM object or a jQuery Selector string that specifies which field to insert the selected value into onChange (Function): A function that will get called whenever the color changes onClose (Function): A function that will get called when the color picker is closed */ initialize: function(params) { var instance = this; params = params || {}; instance._onClose = params.onClose || null; instance._onChange = params.onChange || null; instance._context = params.context || document.body; instance._hasImage = params.hasImage || false; instance._item = jQuery(params.item || '.use-color-picker', instance._context); instance._baseColor = {r:255, g:0, b:0}; instance._currentColor = {r:255, g:255, b:255}; instance._lastValues = [0,0]; instance._insertImages(); instance._buildHTML(); instance._activatePicker(); }, _activatePicker: function() { var instance = this; var currentColor = instance._currentColor; var onChange = function() { var r = instance._currentColor.r; var g = instance._currentColor.g; var b = instance._currentColor.b; var backgroundColor = 'rgb(' + r + ', ' + g + ', ' + b + ')'; instance._baseDiv.find('.lfr-old-color').css('background-color', backgroundColor); if (instance._onChange) { instance._onChange(instance._currentColor); } }; instance._baseDiv.find('.lfr-color').Slider( { accept : '.lfr-color-indic', onSlide : function(cordx, cordy, x, y) { instance._lastValues = [parseInt(cordx * 255 / 100), parseInt(cordy * 255 / 100)]; instance._setGradientColor(); }, onChange : onChange } ); instance._baseDiv.find('.lfr-hue').Slider( { accept : '.lfr-hue-indic', onSlide : function( cordx, cordy,x, y) { instance._setVertColor(parseInt(cordy * 255 / 100)); instance._setGradientColor(); }, onChange : onChange } ); }, _buildHTML: function() { var instance = this; var baseDiv = jQuery('
'); var color = jQuery('
'); var hue = jQuery('
'); var currentColor = jQuery('
'); var closeButton = jQuery('
X
'); closeButton.click( function(event) { instance._toggle(event, this); } ); baseDiv.append(color).append(hue).append(currentColor).append(closeButton); baseDiv.appendTo('body'); baseDiv.hide(); baseDiv.css( { position: 'absolute', zIndex: Liferay.zIndex.ALERT + 1 } ); instance._baseDiv = baseDiv; }, _insertImages: function() { var instance = this; var context = instance._context; var items = instance._item; var colorPickerImgHTML = ''; if (items.length == 1) { var colorPickerImg; if (instance._hasImage) { colorPickerImg = items; } else { colorPickerImg = jQuery(colorPickerImgHTML); items.after(colorPickerImg); } colorPickerImg.click( function(event) { instance._toggle(event, this); } ); } else { items.each( function() { var item = jQuery(this); var colorPickerImg; if (!instance._hasImage) { colorPickerImg = jQuery(colorPickerImgHTML); } else { colorPickerImg = item; } colorPickerImg.click( function(event) { instance._toggle(event, this); } ); item.after(colorPickerImg); } ); } }, _setVertColor: function(indic) { var instance = this; var num = 256 / 6; var num2 = 256 / num; var color = indic; var color2 = color % num; var red = 255; var green = 255 - color2 * num2; var blue = 0; if (color < (num * 5)) { red = color2 * num2; green = 255; if (color < (num * 4)) { red = 0; blue = 255 - color2 * num2; if (color < (num * 3)) { green = color2 * num2; blue = 255; if (color < (num * 2)) { red = 255 - color2 * num2; green = 0; if (color < num) { red = 255; blue = color2 * num2; } } } } } instance._baseColor = { r: parseInt(red), g: parseInt(green), b: parseInt(blue) }; instance._baseDiv.find('.lfr-color').css('background-color', 'rgb(' + instance._baseColor.r + ', ' + instance._baseColor.g + ', ' + instance._baseColor.b + ')'); }, _setGradientColor: function() { var instance = this; var baseColor = instance._baseColor; var lastValues = instance._lastValues; var r = instance._toBase(baseColor.r); var g = instance._toBase(baseColor.g); var b = instance._toBase(baseColor.b); var rX = instance._toHex(r); var gX = instance._toHex(g); var bX = instance._toHex(b); instance._baseDiv.find('.lfr-current-color').css('background-color', 'rgb(' + r + ', ' + g + ', ' + b + ')'); instance._hexColor = '#' + (rX + gX + bX).toUpperCase(); instance._currentInput.val(instance._hexColor); instance._currentColor = {r: r, g: g, b: b}; }, _toggle: function(event, obj) { var instance = this; var item = jQuery(obj); var dimensions = item.offset(); instance._currentInput = item.prev(); var baseDiv = instance._baseDiv; if (baseDiv.is(':visible')) { baseDiv.hide(); if (instance._item.is('input')) { instance._item.trigger('blur'); } if (instance._onClose) { instance._onClose(); } } else { baseDiv.show(); if (instance._item.is('input')) { instance._item.trigger('focus'); } baseDiv.css( { top: dimensions.top + 'px', left: dimensions.left + 25 + 'px' } ); } }, _toBase: function(colorVal) { var instance = this; var lastValues = instance._lastValues; return Math.round((1 - (1 - (colorVal / 255)) * (lastValues[0] / 255)) * (255 - lastValues[1])); }, _toHex: function(color) { var instance = this; color = parseInt(color).toString(16); if (color.length < 2) { return "0" + color; } else { return color; } }, _toRGB: function(color) { var instance = this; color = color.replace('#', ''); if (color.length == 6 || color.length == 3) { var r, g, b; if (color.length == 6) { r = color.substring(0, 2); g = color.substring(2, 4); b = color.substring(4, 6); } else if (color.length == 3) { r = color.substring(0, 1); g = color.substring(1, 2); b = color.substring(2, 3); r = r + r; g = g + g; b = b + b; } r = parseInt(r, 16); g = parseInt(g, 16); b = parseInt(b, 16); return {r: r, g: g, b: b}; } return null; } });