blob: 515ec5d4050dc2654ee49a6a2704bf0295d812ee [file] [log] [blame]
/**
* @class button - table cell properties
*
* @param elRTE rte объект-редактор
* @param String name название кнопки
*
*
* @author: Dmitry Levashov (dio) dio@std42.ru
* @copyright: Studio 42, http://www.std42.ru
**/
(function($) {
elRTE.prototype.ui.prototype.buttons.tbcellprops = function(rte, name) {
this.constructor.prototype.constructor.call(this, rte, name);
var self = this;
this.src = null;
this.labels = null;
function init() {
self.labels = {
main : 'Properies',
adv : 'Advanced',
events : 'Events',
id : 'ID',
'class' : 'Css class',
style : 'Css style',
dir : 'Script direction',
lang : 'Language'
}
self.src = {
main : {
type : $('<select />').css('width', '100%')
.append($('<option />').val('td').text(self.rte.i18n('Data')))
.append($('<option />').val('th').text(self.rte.i18n('Header'))),
width : $('<input type="text" />').attr('size', 4),
wunit : $('<select />')
.append($('<option />').val('%').text('%'))
.append($('<option />').val('px').text('px')),
height : $('<input type="text" />').attr('size', 4),
hunit : $('<select />')
.append($('<option />').val('%').text('%'))
.append($('<option />').val('px').text('px')),
align : $('<select />').css('width', '100%')
.append($('<option />').val('').text(self.rte.i18n('Not set')))
.append($('<option />').val('left').text(self.rte.i18n('Left')))
.append($('<option />').val('center').text(self.rte.i18n('Center')))
.append($('<option />').val('right').text(self.rte.i18n('Right')))
.append($('<option />').val('justify').text(self.rte.i18n('Justify'))),
border : $('<div />'),
padding : $('<div />'),
bg : $('<div />'),
bgimg : $('<input type="text" />').css('width', '90%'),
apply : $('<select />').css('width', '100%')
.append($('<option />').val('').text(self.rte.i18n('Current cell')))
.append($('<option />').val('row').text(self.rte.i18n('All cells in row')))
.append($('<option />').val('column').text(self.rte.i18n('All cells in column')))
.append($('<option />').val('table').text(self.rte.i18n('All cells in table')))
},
adv : {
id : $('<input type="text" />'),
'class' : $('<input type="text" />'),
style : $('<input type="text" />'),
dir : $('<select />').css('width', '100%')
.append($('<option />').text(self.rte.i18n('Not set')).val(''))
.append($('<option />').text(self.rte.i18n('Left to right')).val('ltr'))
.append($('<option />').text(self.rte.i18n('Right to left')).val('rtl')),
lang : $('<input type="text" />')
},
events : {}
}
$.each(self.src, function() {
for (var n in this) {
this[n].attr('name', n);
if (this[n].attr('type') == 'text' && !this[n].attr('size') && n!='bgimg') {
this[n].css('width', '100%')
}
}
});
$.each(
['onblur', 'onfocus', 'onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmouseout', 'onmouseleave', 'onkeydown', 'onkeypress', 'onkeyup'],
function() {
self.src.events[this] = $('<input type="text" />').css('width', '100%');
});
}
this.command = function() {
!this.src && init();
this.cell = this.rte.dom.selfOrParent(this.rte.selection.getNode(), /^(TD|TH)$/);
if (!this.cell) {
return;
}
this.src.main.type.val(this.cell.nodeName.toLowerCase());
this.cell = $(this.cell);
this.src.main.border.elBorderSelect({styleHeight : 117, value : this.cell});
this.src.main.bg.elColorPicker({palettePosition : 'outer', 'class' : 'el-colorpicker ui-icon ui-icon-pencil'});
this.src.main.padding.elPaddingInput({ value : this.cell});
var w = this.cell.css('width') || this.cell.attr('width');
this.src.main.width.val(parseInt(w)||'');
this.src.main.wunit.val(w.indexOf('px') != -1 ? 'px' : '%');
var h = this.cell.css('height') || this.cell.attr('height');
this.src.main.height.val(parseInt(h)||'');
this.src.main.hunit.val(h.indexOf('px') != -1 ? 'px' : '%');
this.src.main.align.val(this.cell.attr('align') || this.cell.css('text-align'));
this.src.main.bg.val(this.cell.css('background-color'));
var bgimg = this.cell.css('background-image');
this.src.main.bgimg.val(bgimg && bgimg!='none' ? bgimg.replace(/url\(([^\)]+)\)/i, "$1") : '');
this.src.main.apply.val('');
var opts = {
rtl : this.rte.rtl,
submit : function(e, d) { e.stopPropagation(); e.preventDefault(); self.set(); d.close(); },
dialog : {
width : 520,
title : this.rte.i18n('Table cell properties')
}
}
var d = new elDialogForm(opts);
for (var tab in this.src) {
d.tab(tab, this.rte.i18n(this.labels[tab]));
if (tab == 'main') {
d.append([this.rte.i18n('Width'), $('<span />').append(this.src.main.width).append(this.src.main.wunit)], 'main', true)
.append([this.rte.i18n('Height'), $('<span />').append(this.src.main.height).append(this.src.main.hunit)], 'main', true)
.append([this.rte.i18n('Table cell type'), this.src.main.type], 'main', true)
.append([this.rte.i18n('Border'), this.src.main.border], 'main', true)
.append([this.rte.i18n('Alignment'), this.src.main.align], 'main', true)
.append([this.rte.i18n('Paddings'), this.src.main.padding], 'main', true)
.append([this.rte.i18n('Background'), $('<span />').append($('<span />').css({'float' : 'left', 'margin-right' : '3px'}).append(this.src.main.bg)).append(this.src.main.bgimg)], 'main', true)
.append([this.rte.i18n('Apply to'), this.src.main.apply], 'main', true);
} else {
for (var name in this.src[tab]) {
var v = this.cell.attr(name) || '';
if (tab == 'events') {
v = this.rte.utils.trimEventCallback(v);
}
d.append([this.rte.i18n(this.labels[name] ? this.labels[name] : name), this.src[tab][name].val(v)], tab, true);
}
}
}
d.open()
}
this.set = function() {
// $(t).remove();
var target = this.cell,
apply = this.src.main.apply.val();
switch (this.src.main.apply.val()) {
case 'row':
target = this.cell.parent('tr').children('td,th');
break;
case 'column':
target = $(this.rte.dom.tableColumn(this.cell.get(0)));
break;
case 'table':
target = this.cell.parents('table').find('td,th');
break;
}
for (var tab in this.src) {
if (tab != 'main') {
for (var n in this.src[tab]) {
var v = $.trim(this.src[tab][n].val());
if (v) {
target.attr(n, v);
} else {
target.removeAttr(n);
}
}
}
}
target.removeAttr('width')
.removeAttr('height')
.removeAttr('border')
.removeAttr('align')
.removeAttr('bordercolor')
.removeAttr('bgcolor');
var t = this.src.main.type.val();
var w = parseInt(this.src.main.width.val()) || '';
var h = parseInt(this.src.main.height.val()) || '';
var i = $.trim(this.src.main.bgimg.val());
var b = this.src.main.border.val();
var css = {
'width' : w ? w+this.src.main.wunit.val() : '',
'height' : h ? h+this.src.main.hunit.val() : '',
'background-color' : this.src.main.bg.val(),
'background-image' : i ? 'url('+i+')' : '',
'border' : $.trim(b.width+' '+b.style+' '+b.color),
'text-align' : this.src.main.align.val() || ''
};
var p = this.src.main.padding.val();
if (p.css) {
css.padding = p.css;
} else {
css['padding-top'] = p.top;
css['padding-right'] = p.right;
css['padding-bottom'] = p.bottom;
css['padding-left'] = p.left;
}
target = target.get();
$.each(target, function() {
var type = this.nodeName.toLowerCase();
var $this = $(this);
if (type != t) {
var attr = {}
for (var i in self.src.adv) {
var v = $this.attr(i)
if (v) {
attr[i] = v.toString();
}
}
for (var i in self.src.events) {
var v = $this.attr(i)
if (v) {
attr[i] = v.toString();
}
}
var colspan = $this.attr('colspan')||1;
var rowspan = $this.attr('rowspan')||1;
if (colspan>1) {
attr.colspan = colspan;
}
if (rowspan>1) {
attr.rowspan = rowspan;
}
$this.replaceWith($('<'+t+' />').html($this.html()).attr(attr).css(css) );
} else {
$this.css(css);
}
});
this.rte.ui.update();
}
this.update = function() {
if (this.rte.dom.parent(this.rte.selection.getNode(), /^TABLE$/)) {
this.domElem.removeClass('disabled');
} else {
this.domElem.addClass('disabled');
}
}
}
})(jQuery);