blob: c3bc84ef43ca91ad8bdc0f01b892983b6549263e [file] [log] [blame]
/**
* jQuery plugin. Create group of text input, elSelect and elColorPicker.
* Allow input border-width, border-style and border-color. Used in elRTE
*
* @author: Dmitry Levashov (dio) dio@std42.ru
**/
(function($) {
$.fn.elBorderSelect = function(o) {
var $self = this;
var self = this.eq(0);
var opts = $.extend({}, $.fn.elBorderSelect.defaults, o);
var width = $('<input type="text" />')
.attr({'name' : opts.name+'[width]', size : 3}).css('text-align', 'right')
.change(function() { $self.change(); });
var color = $('<div />').css('position', 'relative')
.elColorPicker({
'class' : 'el-colorpicker ui-icon ui-icon-pencil',
name : opts.name+'[color]',
palettePosition : 'outer',
change : function() { $self.change(); }
});
var style = $('<div />').elSelect({
tpl : '<div style="border-bottom:4px %val #000;width:100%;margin:7px 0"> </div>',
tpls : { '' : '%label'},
maxHeight : opts.styleHeight || null,
select : function() { $self.change(); },
src : {
'' : 'none',
solid : 'solid',
dashed : 'dashed',
dotted : 'dotted',
'double' : 'double',
groove : 'groove',
ridge : 'ridge',
inset : 'inset',
outset : 'outset'
}
});
self.empty()
.addClass(opts['class'])
.attr('name', opts.name||'')
.append(
$('<table />').attr('cellspacing', 0).append(
$('<tr />')
.append($('<td />').append(width).append(' px'))
.append($('<td />').append(style))
.append($('<td />').append(color))
)
);
function rgb2hex(str) {
function hex(x) {
hexDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8","9", "a", "b", "c", "d", "e", "f"];
return !x ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x% 16];
}
var rgb = (str||'').match(/\(([0-9]{1,3}),\s*([0-9]{1,3}),\s*([0-9]{1,3})\)/);
return rgb ? "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) : '';
}
function toPixels(num) {
if (!num) {
return num;
}
var m = num.match(/([0-9]+\.?[0-9]*)\s*(px|pt|em|%)/);
if (m) {
num = m[1];
unit = m[2];
}
if (num[0] == '.') {
num = '0'+num;
}
num = parseFloat(num);
if (isNaN(num)) {
return '';
}
var base = parseInt($(document.body).css('font-size')) || 16;
switch (unit) {
case 'em': return parseInt(num*base);
case 'pt': return parseInt(num*base/12);
case '%' : return parseInt(num*base/100);
}
return num;
}
this.change = function() {
opts.change && opts.change(this.val());
}
this.val = function(v) {
var w, s, c, b, m;
if (!v && v !== '') {
w = parseInt(width.val());
w = !isNaN(w) ? w+'px' : '';
s = style.val();
c = color.val();
return {
width : w,
style : s,
color : c,
css : $.trim(w+' '+s+' '+c)
}
} else {
b = '';
if (v.nodeName || v.css) {
if (!v.css) {
v = $(v);
}
b = v.css('border');
if ((b = v.css('border'))) {
w = s = c = b;
} else {
w = v.css('border-width');
s = v.css('border-style');
c = v.css('border-color');
}
} else {
w = v.width||'';
s = v.style||'';
c = v.color||'';
}
width.val(toPixels(w));
m = s ? s.match(/(solid|dashed|dotted|double|groove|ridge|inset|outset)/i) :'';
style.val(m ? m[1] : '');
color.val(c.indexOf('#') === 0 ? c : rgb2hex(c));
return this;
}
}
this.val(opts.value);
return this;
}
$.fn.elBorderSelect.defaults = {
name : 'el-borderselect',
'class' : 'el-borderselect',
value : {},
change : null
}
})(jQuery);