blob: 9ef57b42273406976090f4bcbe9ae883271cf2f9 [file] [log] [blame]
/**
* elColorPicker. JQuery plugin
* Create drop-down colors palette.
*
* Usage:
* $(selector).elColorPicker(opts)
*
* set color after init:
* var c = $(selector).elColorPicker(opts)
* c.val('#ffff99)
*
* Get selected color:
* var color = c.val();
*
* Notice!
* Palette created only after first click on element (lazzy loading)
*
* Options:
* colors - colors array (by default display 256 web safe colors)
* color - current (selected) color
* class - css class for display "button" (element on wich plugin was called)
* paletteClass - css class for colors palette
* palettePosition - string indicate where palette will created:
* 'inner' - palette will attach to element (acceptable in most cases)
* 'outer' - palette will attach to document.body.
* Use, when create color picker inside element with overflow == 'hidden', for example in ui.dialog
* update - function wich update button view on select color (by default set selected color as background)
* change - callback, called when color was selected (by default write color to console.log)
* name - hidden text field in wich selected color value will saved
*
* @author: Dmitry Levashov (dio) dio@std42.ru
*
**/
(function($) {
$.fn.elColorPicker = function(o) {
var self = this;
var opts = $.extend({}, $.fn.elColorPicker.defaults, o);
this.hidden = $('<input type="hidden" />').attr('name', opts.name).val(opts.color||'').appendTo(this);
this.palette = null;
this.preview = null;
this.input = null;
function setColor(c) {
self.val(c);
opts.change && opts.change(self.val());
self.palette.slideUp();
}
function init() {
self.palette = $('<div />').addClass(opts.paletteClass+' rounded-3');
for (var i=0; i < opts.colors.length; i++) {
$('<div />')
.addClass('color')
.css('background-color', opts.colors[i])
.attr({title : opts.colors[i], unselectable : 'on'})
.appendTo(self.palette)
.mouseenter(function() {
var v = $(this).attr('title');
self.input.val(v);
self.preview.css('background-color', v);
})
.click(function(e) {
e.stopPropagation();
setColor($(this).attr('title'));
});
};
self.input = $('<input type="text" />')
.addClass('rounded-3')
.attr('size', 8)
.click(function(e) {
e.stopPropagation();
$(this).focus();
})
.keydown(function(e) {
if (e.ctrlKey || e.metaKey) {
return true;
}
var k = e.keyCode;
// on esc - close palette
if (k == 27) {
return self.mouseleave();
}
// allow input only hex color value
if (k!=8 && k != 13 && k!=46 && k!=37 && k != 39 && (k<48 || k>57) && (k<65 || k > 70)) {
return false;
}
var c = $(this).val();
if (c.length == 7 || c.length == 0) {
if (k == 13) {
e.stopPropagation();
e.preventDefault();
setColor(c);
self.palette.slideUp();
}
if (e.keyCode != 8 && e.keyCode != 46 && k!=37 && k != 39) {
return false;
}
}
})
.keyup(function(e) {
var c = $(this).val();
c.length == 7 && /^#[0-9abcdef]{6}$/i.test(c) && self.val(c);
});
self.preview = $('<div />')
.addClass('preview rounded-3')
.click(function(e) {
e.stopPropagation();
setColor(self.input.val());
});
self.palette
.append($('<div />').addClass('clearfix'))
.append($('<div />').addClass('panel').append(self.input).append(self.preview));
if (opts.palettePosition == 'outer') {
self.palette.hide()
.appendTo(self.parents('body').eq(0))
.mouseleave(function() {
if (!self.palette.is(':animated')) {
$(this).slideUp();
self.val(self.val());
}
});
self.mouseleave(function(e) {
if (e.relatedTarget != self.palette.get(0)) {
if (!self.palette.is(':animated')) {
self.palette.slideUp();
self.val(self.val());
}
}
})
} else {
self.append(self.palette.hide())
.mouseleave(function(e) {
self.palette.slideUp();
self.val(self.val());
});
}
self.val(self.val());
}
this.empty().addClass(opts['class']+' rounded-3')
.css({'position' : 'relative', 'background-color' : opts.color||''})
.click(function(e) {
if (!self.hasClass('disabled')) {
!self.palette && init();
if (opts.palettePosition == 'outer' && self.palette.css('display') == 'none') {
var o = $(this).offset();
var w = self.palette.width();
var l = self.parents('body').width() - o.left >= w ? o.left : o.left + $(this).outerWidth() - w;
self.palette.css({left : l+'px', top : o.top+$(this).height()+1+'px'});
}
self.palette.slideToggle();
}
});
this.val = function(v) {
if (!v && v!=='') {
return this.hidden.val();
} else {
this.hidden.val(v);
if (opts.update) {
opts.update(this.hidden.val());
} else {
this.css('background-color', v);
}
if (self.palette) {
self.preview.css('background-color', v);
self.input.val(v);
}
}
return this;
}
return this;
}
$.fn.elColorPicker.defaults = {
'class' : 'el-colorpicker',
paletteClass : 'el-palette',
palettePosition : 'inner',
name : 'color',
color : '',
update : null,
change : function(c) { },
colors : [
'#ffffff', '#cccccc', '#999999', '#666666', '#333333', '#000000',
'#ffcccc', '#cc9999', '#996666', '#663333', '#330000',
'#ff9999', '#cc6666', '#cc3333', '#993333', '#660000',
'#ff6666', '#ff3333', '#ff0000', '#cc0000', '#990000',
'#ff9966', '#ff6633', '#ff3300', '#cc3300', '#993300',
'#ffcc99', '#cc9966', '#cc6633', '#996633', '#663300',
'#ff9933', '#ff6600', '#ff9900', '#cc6600', '#cc9933',
'#ffcc66', '#ffcc33', '#ffcc00', '#cc9900', '#996600',
'#ffffcc', '#cccc99', '#999966', '#666633', '#333300',
'#ffff99', '#cccc66', '#cccc33', '#999933', '#666600',
'#ffff66', '#ffff33', '#ffff00', '#cccc00', '#999900',
'#ccff66', '#ccff33', '#ccff00', '#99cc00', '#669900',
'#ccff99', '#99cc66', '#99cc33', '#669933', '#336600',
'#99ff33', '#99ff00', '#66ff00', '#66cc00', '#66cc33',
'#99ff66', '#66ff33', '#33ff00', '#33cc00', '#339900',
'#ccffcc', '#99cc99', '#669966', '#336633', '#003300',
'#99ff99', '#66cc66', '#33cc33', '#339933', '#006600',
'#66ff66', '#33ff33', '#00ff00', '#00cc00', '#009900',
'#66ff99', '#33ff66', '#00ff33', '#00cc33', '#009933',
'#99ffcc', '#66cc99', '#33cc66', '#339966', '#006633',
'#33ff99', '#00ff66', '#00ff99', '#00cc66', '#33cc99',
'#66ffcc', '#33ffcc', '#00ffcc', '#00cc99', '#009966',
'#ccffff', '#99cccc', '#669999', '#336666', '#003333',
'#99ffff', '#66cccc', '#33cccc', '#339999', '#006666',
'#66cccc', '#33ffff', '#00ffff', '#00cccc', '#009999',
'#66ccff', '#33ccff', '#00ccff', '#0099cc', '#006699',
'#99ccff', '#6699cc', '#3399cc', '#336699', '#003366',
'#3399ff', '#0099ff', '#0066ff', '#066ccc', '#3366cc',
'#6699ff', '#3366ff', '#0033ff', '#0033cc', '#003399',
'#ccccff', '#9999cc', '#666699', '#333366', '#000033',
'#9999ff', '#6666cc', '#3333cc', '#333399', '#000066',
'#6666ff', '#3333ff', '#0000ff', '#0000cc', '#009999',
'#9966ff', '#6633ff', '#3300ff', '#3300cc', '#330099',
'#cc99ff', '#9966cc', '#6633cc', '#663399', '#330066',
'#9933ff', '#6600ff', '#9900ff', '#6600cc', '#9933cc',
'#cc66ff', '#cc33ff', '#cc00ff', '#9900cc', '#660099',
'#ffccff', '#cc99cc', '#996699', '#663366', '#330033',
'#ff99ff', '#cc66cc', '#cc33cc', '#993399', '#660066',
'#ff66ff', '#ff33ff', '#ff00ff', '#cc00cc', '#990099',
'#ff66cc', '#ff33cc', '#ff00cc', '#cc0099', '#990066',
'#ff99cc', '#cc6699', '#cc3399', '#993366', '#660033',
'#ff3399', '#ff0099', '#ff0066', '#cc0066', '#cc3366',
'#ff6699', '#ff3366', '#ff0033', '#cc0033', '#990033'
]
};
})(jQuery);