blob: 1b641c17f287996b95338080212258a344474c06 [file] [log] [blame]
/**
* jQuery plugin. Create group of text input fields and selects for setting padding/margin. Used in elRTE
*
* @author: Dmitry Levashov (dio) dio@std42.ru
**/
(function($) {
$.fn.elPaddingInput = function(o) {
var self = this;
var opts = $.extend({}, $.fn.elPaddingInput.defaults, {name : this.attr('name')}, o);
this.regexps = {
main : new RegExp(opts.type == 'padding' ? 'padding\s*:\s*([^;"]+)' : 'margin\s*:\s*([^;"]+)', 'im'),
left : new RegExp(opts.type == 'padding' ? 'padding-left\s*:\s*([^;"]+)' : 'margin-left\s*:\s*([^;"]+)', 'im'),
top : new RegExp(opts.type == 'padding' ? 'padding-top\s*:\s*([^;"]+)' : 'margin-top\s*:\s*([^;"]+)', 'im'),
right : new RegExp(opts.type == 'padding' ? 'padding-right\s*:\s*([^;"]+)' : 'margin-right\s*:\s*([^;"]+)', 'im'),
bottom : new RegExp(opts.type == 'padding' ? 'padding-bottom\s*:\s*([^;"]+)' : 'margin-bottom\s*:\s*([^;"]+)', 'im')
};
$.each(['left', 'top', 'right', 'bottom'], function() {
self[this] = $('<input type="text" />')
.attr('size', 3)
.css('text-align', 'right')
.css('border-'+this, '2px solid red')
.bind('change', function() { $(this).val(parseNum($(this).val())); change(); })
.attr('name', opts.name+'['+this+']');
});
$.each(['uleft', 'utop', 'uright', 'ubottom'], function() {
self[this] = $('<select />')
.append('<option value="px">px</option>')
.append('<option value="em">em</option>')
.append('<option value="pt">pt</option>')
.bind('change', function() { change(); })
.attr('name', opts.name+'['+this+']');
if (opts.percents) {
self[this].append('<option value="%">%</option>');
}
});
this.empty().addClass(opts['class'])
.append(this.left).append(this.uleft).append(' x ')
.append(this.top).append(this.utop).append(' x ')
.append(this.right).append(this.uright).append(' x ')
.append(this.bottom).append(this.ubottom);
this.val = function(v) {
if (!v && v!=='') {
var l = parseNum(this.left.val());
var t = parseNum(this.top.val());
var r = parseNum(this.right.val());
var b = parseNum(this.bottom.val());
var ret = {
left : l=='auto' || l==0 ? l : (l!=='' ? l+this.uleft.val() : ''),
top : t=='auto' || t==0 ? t : (t!=='' ? t+this.utop.val() : ''),
right : r=='auto' || r==0 ? r : (r!=='' ? r+this.uright.val() : ''),
bottom : b=='auto' || b==0 ? b : (b!=='' ? b+this.ubottom.val() : ''),
css : ''
};
if (ret.left!=='' && ret.right!=='' && ret.top!=='' && ret.bottom!=='') {
if (ret.left == ret.right && ret.top == ret.bottom) {
ret.css = ret.top+' '+ret.left;
} else{
ret.css = ret.top+' '+ret.right+' '+ret.bottom+' '+ret.left;
}
}
return ret;
} else {
if (v.nodeName || v.css) {
if (!v.css) {
v = $(v);
}
var val = {left : '', top : '', right: '', bottom : ''};
var style = (v.attr('style')||'').toLowerCase();
if (style) {
style = $.trim(style);
var m = style.match(this.regexps.main);
if (m) {
var tmp = $.trim(m[1]).replace(/\s+/g, ' ').split(' ', 4);
val.top = tmp[0];
val.right = tmp[1] && tmp[1]!=='' ? tmp[1] : val.top;
val.bottom = tmp[2] && tmp[2]!=='' ? tmp[2] : val.top;
val.left = tmp[3] && tmp[3]!=='' ? tmp[3] : val.right;
} else {
$.each(['left', 'top', 'right', 'bottom'], function() {
var name = this.toString();
m = style.match(self.regexps[name]);
if (m) {
val[name] = m[1];
}
});
}
}
var v = val;
}
$.each(['left', 'top', 'right', 'bottom'], function() {
var name = this.toString();
self[name].val('');
self['u'+name].val();
if (typeof(v[name]) != 'undefined' && v[name] !== null) {
v[name] = v[name].toString();
var _v = parseNum(v[name]);
self[name].val(_v);
var m = v[name].match(/(px|em|pt|%)/i);
self['u'+name].val(m ? m[1] : 'px');
}
});
return this;
}
}
function parseNum(num) {
num = $.trim(num.toString());
if (num[0] == '.') {
num = '0'+num;
}
n = parseFloat(num);
return !isNaN(n) ? n : (num == 'auto' ? num : '');
}
function change() {
opts.change && opts.change(self);
}
this.val(opts.value);
return this;
}
$.fn.elPaddingInput.defaults = {
name : 'el-paddinginput',
'class' : 'el-paddinginput',
type : 'padding',
value : {},
percents : true,
change : null
}
})(jQuery);