/*!
* JQuery Palette Color Picker v1.13 by Carlos Cabo ( @putuko )
* https://github.com/carloscabo/jquery-palette-color-picker
*/
(function($) {
// La magia aquĆ
'use strict';
// Public core
$.paletteColorPicker = function( el, options ) {
var
ns = 'palette-color-picker', // Base attr / class
$el = $(el),
plugin = this,
timer = null,
current_value = $el.val(),
target = $el.attr('name'),
$button = $('
')
.addClass(ns+'-button')
.attr('data-target', target),
$bubble = $('
')
.addClass(ns+'-bubble'),
// Final settings will be stored here
settings = {},
// Default settings
defaults = {
custom_class: null,
colors: null,
position: 'upside', // upside | downside
insert: 'before', // default
clear_btn: 'first', // default
timeout: 2000, // default
set_background: false, // default
close_all_but_this: false // default
},
click_handler = ('ontouchstart' in document.documentElement ? 'touchstart click' : 'click');
// Init
plugin.init = function() {
// Extand settings with user options
plugin.settings = $.extend({}, defaults, options);
// If input has not value add it
var
val = $el.attr('value');
if (typeof val === typeof undefined || val === false) {
val = '';
$el.attr('value', val);
}
// Backup initial value
$el.attr('data-initialvalue', $el.attr('value') );
// If color were not passed as options get them from data-palette attribute
if (plugin.settings.colors === null) {
plugin.settings.colors = $el.data('palette');
}
// If color is array of string, convert to obj
if (typeof plugin.settings.colors[0] === 'string') {
plugin.settings.colors = $.map(plugin.settings.colors, function(el, idx) {
var b = {}; b[el] = el; return b;
});
}
// Capitalize position
plugin.settings.insert = plugin.settings.insert.charAt(0).toUpperCase() + plugin.settings.insert.slice(1);
// Add custom_class
if (plugin.settings.custom_class) {
$bubble.addClass(plugin.settings.custom_class);
}
// Create color swatches
$.each( plugin.settings.colors, function( idx, obj ) {
var
key = Object.keys( obj )[0],
col = obj[key],
$sw = $('').addClass('swatch')
.attr({
'title': key,
'data-color': col,
'data-name': key
}).css('background-color', col);
if ( key === current_value ) {
$sw.addClass('active');
$button.css('background', col);
}
$sw.appendTo( $bubble );
});
// Create clear button if not null
if (plugin.settings.clear_btn !== null) {
var
$clear_btn = $('').addClass('swatch clear').attr('title', 'Clear selection');
if (plugin.settings.clear_btn === 'last') {
$clear_btn.addClass('last').appendTo( $bubble );
} else {
$clear_btn.prependTo( $bubble );
}
}
// Public
plugin.destroy = function() {
$button.remove();
$.removeData( $el[0] );
};
// Clears all
plugin.clear = function() {
$bubble.find('.active').removeClass('active');
$button.removeAttr('style');
$el.val('');
};
// Reset to initial value
plugin.reset = function() {
// Dont had initial value
if ( $el.attr('data-initialvalue') === '' ) {
plugin.clear();
} else {
// Had initial value
var iv = $el.attr('data-initialvalue');
$bubble.find('[data-name="'+iv+'"]').trigger('click');
}
};
// reload value after it has been changed programatically
plugin.reload = function() {
var newVal = $el.val();
if ( newVal === '' || typeof newVal === typeof undefined || newVal === false ) {
// Doesn't have the value to load so loading initial value
plugin.reset();
} else {
// setting the value to new value
if($bubble.find('[data-name="'+newVal+'"]').length) {
// value will only be set if the color exists in options
$bubble.find('[data-name="'+newVal+'"]').trigger('click');
} else {
// setting to the initial value if color does not exists
plugin.reset();
}
}
};
// Events
// Simple click
$button.append( $bubble ).on( click_handler, function(e){
e.preventDefault();
e.stopPropagation();
var $b = $( this );
// don't close on clicking the bubble
if (!$(e.target).hasClass(ns+'-bubble')) {
// Call the callback, if set
if (typeof plugin.settings.onbeforeshow_callback === 'function') {
plugin.settings.onbeforeshow_callback(this);
}
$b.toggleClass('active');
var $current_bubble = $b.find('.'+ns+'-bubble');
// Forces hiding other bubbles
if (plugin.settings.close_all_but_this) {
$('.'+ns+'-bubble').not($current_bubble).fadeOut();
}
$current_bubble.fadeToggle();
if ($b.hasClass('active')) {
clearTimeout(plugin.timer);
plugin.timer = setTimeout(function(){
$b.trigger('pcp.fadeout');
}, plugin.settings.timeout);
}
}
})
// Fade timer
.on('pcp.fadeout', function() {
$( this ).removeClass('active').find('.'+ns+'-bubble').fadeOut();
})
// Enter bubble
.on('mouseenter', '.'+ns+'-bubble', function() {
clearTimeout(plugin.timer);
})
// Leave bubble
.on('mouseleave', '.'+ns+'-bubble', function() {
plugin.timer = setTimeout(function(){
$button.trigger('pcp.fadeout');
}, plugin.settings.timeout);
})
// Click on swatches
.on(click_handler, '.'+ns+'-bubble span.swatch', function(e){
e.preventDefault();
e.stopPropagation();
var
col = $( this ).attr('data-color'),
name = $( this ).attr('data-name'),
// Select all button in document with same data target to keep them synconized
$button = $('.'+ns+'-button[data-target="' + $( this ).closest( '.'+ns+'-button' ).attr('data-target') + '"]'),
$bubble = $( this ).closest( '.'+ns+'-bubble' );
// console.log('.'+ns+'-button [data-target="' + $( this ).closest( '.'+ns+'-button' ).attr('data-target') + '"]');
$bubble.find('.active').removeClass('active');
// Set background on color
// User clicked in the clear swatch
if ( $(e.target).is('.clear') ) {
$button.removeAttr('style');
col = '';
} else {
$(this).addClass('active');
$button.css('background', col);
}
// Call the callback, if set
if (typeof plugin.settings.onchange_callback === "function") {
plugin.settings.onchange_callback(col);
}
if( plugin.settings.set_background === false ) {
$('[name="' + $button.attr('data-target') + '"]').val(name);
} else {
$('[name="' + $button.attr('data-target') + '"]').css({'background-color' : col});
}
})['insert'+plugin.settings.insert]( $el );
// Upside / downside, default is upside
if ( plugin.settings.position === 'downside' || ($el.offset().top) + 20 < $bubble.outerHeight() ) {
$bubble.addClass('downside');
}
};
// Close on clicking outside the palette
$('body').on(click_handler,function(event) {
if (!$(event.target).hasClass(ns+'-button')) {
$( $button ).removeClass('active').find('.'+ns+'-bubble').fadeOut();
}
});
// Start
plugin.init();
};
// add the plugin to the jQuery.fn object
$.fn.paletteColorPicker = function(options) {
return this.each(function() {
if (typeof $(this).data('paletteColorPickerPlugin') === 'undefined') {
$(this).data('paletteColorPickerPlugin', new $.paletteColorPicker(this, options));
}
});
};
})(jQuery);
// Sample usage
// $(function() {
// $('[data-palette-color-picker]').paletteColorPicker();
// });