: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/*jshint undef: true, unused:true, browser:true */
/*global jQuery: true, tinycolor: false */
/*!=========================================================================
* jQuery Color Picker Sliders
* An advanced responsive color selector with color swatches and support for
* human perceived lightness. Works in all modern browsers and on touch devices.
* https://github.com/istvan-meszaros/css-colorpickersliders
* http://www.virtuosoft.eu/code/css-colorpickersliders/
* Copyright 2013 István Ujj-Mészáros
* Thanks for the contributors:
* imaguiraga - https://github.com/imaguiraga
* balmasich - https://github.com/balmasich
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* TinyColor: https://github.com/bgrins/TinyColor
* Using color math algorithms from EasyRGB Web site:
* http://www.easyrgb.com/index.php?X=MATH
* ====================================================================== */
$.fn.ColorPickerSliders = function(options) {
return this.each(function(i, el) {
var alreadyinitialized = false,
triggerelement = $(this),
MAXLIGHT = 101, // 101 needed for bright colors (maybe due to rounding errors)
MAXVALIDCHROMA = 144; // maximum valid chroma value found convertible to rgb (blue)
if (alreadyinitialized) {
alreadyinitialized = true;
if (triggerelement.is("input")) {
color.tiny = tinycolor(triggerelement.val());
if (!color.tiny.format) {
color.tiny = tinycolor(settings.color);
color.tiny = tinycolor(settings.color);
color.hsla = color.tiny.toHsl();
color.rgba = color.tiny.toRgb();
color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba);
function updateColor(newcolor, disableinputupdate) {
var updatedcolor = tinycolor(newcolor);
if (updatedcolor.format) {
container.removeClass("cp-unconvertible-cie-color");
color.tiny = updatedcolor;
color.hsla = updatedcolor.toHsl();
color.rgba = updatedcolor.toRgb();
color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba);
_updateAllElements(disableinputupdate);
$('.cp-container.cp-popup').hide();
var viewportwidth = $(window).width(),
offset = triggerelement.offset(),
popuporiginalwidth = container.data('popup-original-width');
if (typeof popuporiginalwidth === "undefined") {
popuporiginalwidth = container.outerWidth();
container.data('popup-original-width', popuporiginalwidth);
if (offset.left + popuporiginalwidth + 12 <= viewportwidth) {
container.css('left', offset.left).width(popuporiginalwidth);
else if (popuporiginalwidth <= viewportwidth) {
container.css('left', viewportwidth - popuporiginalwidth - 12).width(popuporiginalwidth);
container.css('left', 0).width(viewportwidth - 12);
container.css('top', offset.top + triggerelement.outerHeight()).show();
function _initSettings() {
color: 'hsl(342, 52%, 70%)',
swatches: ['FFFFFF', 'C0C0C0', '808080', '000000', 'FF0000', '800000', 'FFFF00', '808000', '00FF00', '008000', '00FFFF', '008080', '0000FF', '000080', 'FF00FF', '800080'],
customswatches: 'colorpickkersliders', // false or a grop name
connectedinput: false, // can be a jquery object or a selector
updateinterval: 30, // update interval of the sliders while in drag (ms)
previewontriggerelement: true,
previewcontrasttreshold: 15,
previewformat: 'rgb', // rgb/hsl/hex
erroneousciecolormarkers: true,
invalidcolorsopacity: 1, // everything below 1 causes slightly slower responses
finercierangeedges: true, // can be disabled for faster responses
titleswatchesadd: "Add color to swatches",
titleswatchesremove: "Remove color from swatches",
titleswatchesreset: "Reset to default swatches",
if (options.hasOwnProperty('order')) {
settings.order = $.extend({
cie: 3, // cie sliders can increase response time of all sliders!
if (!options.hasOwnProperty('labels')) {
settings.labels = $.extend({
hslsaturation: 'Saturation',
hsllightness: 'Lightness',
cielightness: 'CIE-Lightness',
// force preview when browser doesn't support css gradients
if ((!settings.order.hasOwnProperty('preview') || settings.order.preview === false) && !$.fn.ColorPickerSliders.gradientSupported()) {
settings.order.preview = 10;
if (settings.order.opacity !== false) {
sliders[settings.order.opacity] = '<div class="cp-slider cp-opacity cp-transparency"><span>' + settings.labels.opacity + '</span><div class="cp-marker"></div></div>';
if (settings.order.hsl !== false) {
sliders[settings.order.hsl] = '<div class="cp-slider cp-hslhue cp-transparency"><span>' + settings.labels.hslhue + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-hslsaturation cp-transparency"><span>' + settings.labels.hslsaturation + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-hsllightness cp-transparency"><span>' + settings.labels.hsllightness + '</span><div class="cp-marker"></div></div>';
if (settings.order.rgb !== false) {
sliders[settings.order.rgb] = '<div class="cp-slider cp-rgbred cp-transparency"><span>' + settings.labels.rgbred + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-rgbgreen cp-transparency"><span>' + settings.labels.rgbgreen + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-rgbblue cp-transparency"><span>' + settings.labels.rgbblue + '</span><div class="cp-marker"></div></div>';
if (settings.order.cie !== false) {
sliders[settings.order.cie] = '<div class="cp-slider cp-cielightness cp-transparency"><span>' + settings.labels.cielightness + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-ciechroma cp-transparency"><span>' + settings.labels.ciechroma + '</span><div class="cp-marker"></div></div><div class="cp-slider cp-ciehue cp-transparency"><span>' + settings.labels.ciehue + '</span><div class="cp-marker"></div></div>';
if (settings.order.preview !== false) {
sliders[settings.order.preview] = '<div class="cp-preview cp-transparency"><input type="text" readonly="readonly"></div>';
color_picker_html += '<div class="cp-sliders">';
for (var i = 0; i < sliders.length; i++) {
if (typeof sliders[i] === "undefined") {
color_picker_html += sliders[i];
color_picker_html += '</div>';
color_picker_html += '<div class="cp-swatches"><button type="button" class="add" title="' + settings.titleswatchesadd + '"></button><button type="button" class="remove" title="' + settings.titleswatchesremove + '"></button><button type="button" class="reset" title="' + settings.titleswatchesreset + '"></button><ul></ul><div style="clear:both"></div></div>';
if (triggerelement.is("input")) {
container = $('<div class="cp-container"></div>').insertAfter(triggerelement);
container = $('<div class="cp-container"></div>');
triggerelement.append(container);
container = $('<div class="cp-container"></div>').appendTo('body');
container.append(color_picker_html);
if (settings.connectedinput instanceof jQuery) {
settings.connectedinput.add(triggerelement);
else if (settings.connectedinput === false) {
settings.connectedinput = triggerelement;
settings.connectedinput = $(settings.connectedinput).add(triggerelement);
container.addClass('cp-popup');
var preview = settings.connectedinput.closest('.style-choice').find('.preview');
preview = preview.length ? preview : settings.connectedinput.closest('.section-stream').find('.preview')
container.data('preview', preview);
container.data('input', settings.connectedinput);
container.data('prop', settings.connectedinput.attr('id'));
function _initElements() {
swatchescontainer: $(".cp-swatches", container),
swatches: $(".cp-swatches ul", container),
swatches_add: $(".cp-swatches button.add", container),
swatches_remove: $(".cp-swatches button.remove", container),
swatches_reset: $(".cp-swatches button.reset", container),
all_sliders: $(".cp-sliders, .cp-preview input", container),
hue: $(".cp-hslhue span", container),
hue_marker: $(".cp-hslhue .cp-marker", container),
saturation: $(".cp-hslsaturation span", container),
saturation_marker: $(".cp-hslsaturation .cp-marker", container),
lightness: $(".cp-hsllightness span", container),
lightness_marker: $(".cp-hsllightness .cp-marker", container),
opacity: $(".cp-opacity span", container),
opacity_marker: $(".cp-opacity .cp-marker", container),
red: $(".cp-rgbred span", container),
red_marker: $(".cp-rgbred .cp-marker", container),
green: $(".cp-rgbgreen span", container),
green_marker: $(".cp-rgbgreen .cp-marker", container),
blue: $(".cp-rgbblue span", container),
blue_marker: $(".cp-rgbblue .cp-marker", container),
cielightness: $(".cp-cielightness span", container),
cielightness_marker: $(".cp-cielightness .cp-marker", container),
ciechroma: $(".cp-ciechroma span", container),
ciechroma_marker: $(".cp-ciechroma .cp-marker", container),
ciehue: $(".cp-ciehue span", container),
ciehue_marker: $(".cp-ciehue .cp-marker", container),
preview: $(".cp-preview input", container)
if (settings.connectedinput) {
if (settings.connectedinput instanceof jQuery) {
elements.connectedinput = settings.connectedinput;
elements.connectedinput = $(settings.connectedinput);
if (!settings.customswatches) {
elements.swatches_add.hide();
elements.swatches_remove.hide();
elements.swatches_reset.hide();
function destroyColorPicker() {
if (container instanceof jQuery) {
alreadyinitialized = false;
function resetColorPicker() {
triggerelement.on('colorpickersliders.destroy', function() {
triggerelement.on('colorpickersliders.reset', function() {
triggerelement.on('colorpickersliders.updateColor', function(e, newcolor) {
triggerelement.on('colorpickersliders.showPopup', function() {
triggerelement.on('colorpickersliders.hidePopup', function() {
$(document).on("colorpickersliders.changeswatches", function() {
if (!settings.flat && !settings.disableautopopup) {
// we need tabindex defined to be focusable
if (typeof triggerelement.attr("tabindex") === "undefined") {
triggerelement.attr("tabindex", -1);
// buttons doesn't get focus in webkit browsers
// https://bugs.webkit.org/show_bug.cgi?id=22261
// and only input and button are focusable on iPad
// so it is safer to register click on any other than inputs
if (!triggerelement.is("input")) {
$(triggerelement).on("click", function(ev) {
$(document).on("click", function() {
$(triggerelement).on("focus", function(ev) {
$(triggerelement).on("blur", function(ev) {
container.on("touchstart mousedown", function(ev) {
container.on("contextmenu", function(ev) {
elements.swatches.on("click", "li span", function(ev) {
var color = $(this).css("background-color");
elements.swatches_add.on("click", function(ev) {
_addCurrentColorToSwatches();
elements.swatches_remove.on("click", function(ev) {
_removeActualColorFromSwatches();
elements.swatches_reset.on("click", function(ev) {
elements.sliders.hue.parent().on("touchstart mousedown", function(ev) {
var percent = _updateMarkerPosition(dragTarget, ev);
_updateColorsProperty('hsla', 'h', 3.6 * percent);
elements.sliders.saturation.parent().on("touchstart mousedown", function(ev) {
dragTarget = "saturation";
var percent = _updateMarkerPosition(dragTarget, ev);
_updateColorsProperty('hsla', 's', percent / 100);
elements.sliders.lightness.parent().on("touchstart mousedown", function(ev) {
dragTarget = "lightness";
var percent = _updateMarkerPosition(dragTarget, ev);
_updateColorsProperty('hsla', 'l', percent / 100);