[ Index ]

PHP Cross Reference of Joomla 1.5.26 DE

title

Body

[close]

/plugins/editors/tinymce/jscripts/tiny_mce/themes/advanced/ -> editor_template_src.js (source)

   1  /**
   2   * $Id: editor_template_src.js 1045 2009-03-04 20:03:18Z spocke $
   3   *
   4   * @author Moxiecode
   5   * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
   6   */
   7  
   8  (function(tinymce) {
   9      var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode;
  10  
  11      // Tell it to load theme specific language pack(s)
  12      tinymce.ThemeManager.requireLangPack('advanced');
  13  
  14      tinymce.create('tinymce.themes.AdvancedTheme', {
  15          sizes : [8, 10, 12, 14, 18, 24, 36],
  16  
  17          // Control name lookup, format: title, command
  18          controls : {
  19              bold : ['bold_desc', 'Bold'],
  20              italic : ['italic_desc', 'Italic'],
  21              underline : ['underline_desc', 'Underline'],
  22              strikethrough : ['striketrough_desc', 'Strikethrough'],
  23              justifyleft : ['justifyleft_desc', 'JustifyLeft'],
  24              justifycenter : ['justifycenter_desc', 'JustifyCenter'],
  25              justifyright : ['justifyright_desc', 'JustifyRight'],
  26              justifyfull : ['justifyfull_desc', 'JustifyFull'],
  27              bullist : ['bullist_desc', 'InsertUnorderedList'],
  28              numlist : ['numlist_desc', 'InsertOrderedList'],
  29              outdent : ['outdent_desc', 'Outdent'],
  30              indent : ['indent_desc', 'Indent'],
  31              cut : ['cut_desc', 'Cut'],
  32              copy : ['copy_desc', 'Copy'],
  33              paste : ['paste_desc', 'Paste'],
  34              undo : ['undo_desc', 'Undo'],
  35              redo : ['redo_desc', 'Redo'],
  36              link : ['link_desc', 'mceLink'],
  37              unlink : ['unlink_desc', 'unlink'],
  38              image : ['image_desc', 'mceImage'],
  39              cleanup : ['cleanup_desc', 'mceCleanup'],
  40              help : ['help_desc', 'mceHelp'],
  41              code : ['code_desc', 'mceCodeEditor'],
  42              hr : ['hr_desc', 'InsertHorizontalRule'],
  43              removeformat : ['removeformat_desc', 'RemoveFormat'],
  44              sub : ['sub_desc', 'subscript'],
  45              sup : ['sup_desc', 'superscript'],
  46              forecolor : ['forecolor_desc', 'ForeColor'],
  47              forecolorpicker : ['forecolor_desc', 'mceForeColor'],
  48              backcolor : ['backcolor_desc', 'HiliteColor'],
  49              backcolorpicker : ['backcolor_desc', 'mceBackColor'],
  50              charmap : ['charmap_desc', 'mceCharMap'],
  51              visualaid : ['visualaid_desc', 'mceToggleVisualAid'],
  52              anchor : ['anchor_desc', 'mceInsertAnchor'],
  53              newdocument : ['newdocument_desc', 'mceNewDocument'],
  54              blockquote : ['blockquote_desc', 'mceBlockQuote']
  55          },
  56  
  57          stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'],
  58  
  59          init : function(ed, url) {
  60              var t = this, s, v, o;
  61      
  62              t.editor = ed;
  63              t.url = url;
  64              t.onResolveName = new tinymce.util.Dispatcher(this);
  65  
  66              // Default settings
  67              t.settings = s = extend({
  68                  theme_advanced_path : true,
  69                  theme_advanced_toolbar_location : 'bottom',
  70                  theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",
  71                  theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",
  72                  theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap",
  73                  theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6",
  74                  theme_advanced_toolbar_align : "center",
  75                  theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",
  76                  theme_advanced_more_colors : 1,
  77                  theme_advanced_row_height : 23,
  78                  theme_advanced_resize_horizontal : 1,
  79                  theme_advanced_resizing_use_cookie : 1,
  80                  theme_advanced_font_sizes : "1,2,3,4,5,6,7",
  81                  readonly : ed.settings.readonly
  82              }, ed.settings);
  83  
  84              // Setup default font_size_style_values
  85              if (!s.font_size_style_values)
  86                  s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt";
  87  
  88              if (tinymce.is(s.theme_advanced_font_sizes, 'string')) {
  89                  s.font_size_style_values = tinymce.explode(s.font_size_style_values);
  90                  s.font_size_classes = tinymce.explode(s.font_size_classes || '');
  91  
  92                  // Parse string value
  93                  o = {};
  94                  ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes;
  95                  each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) {
  96                      var cl;
  97  
  98                      if (k == v && v >= 1 && v <= 7) {
  99                          k = v + ' (' + t.sizes[v - 1] + 'pt)';
 100  
 101                          if (ed.settings.convert_fonts_to_spans) {
 102                              cl = s.font_size_classes[v - 1];
 103                              v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt');
 104                          }
 105                      }
 106  
 107                      if (/^\s*\./.test(v))
 108                          cl = v.replace(/\./g, '');
 109  
 110                      o[k] = cl ? {'class' : cl} : {fontSize : v};
 111                  });
 112  
 113                  s.theme_advanced_font_sizes = o;
 114              }
 115  
 116              if ((v = s.theme_advanced_path_location) && v != 'none')
 117                  s.theme_advanced_statusbar_location = s.theme_advanced_path_location;
 118  
 119              if (s.theme_advanced_statusbar_location == 'none')
 120                  s.theme_advanced_statusbar_location = 0;
 121  
 122              // Init editor
 123              ed.onInit.add(function() {
 124                  ed.onNodeChange.add(t._nodeChanged, t);
 125  
 126                  if (ed.settings.content_css !== false)
 127                      ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css"));
 128              });
 129  
 130              ed.onSetProgressState.add(function(ed, b, ti) {
 131                  var co, id = ed.id, tb;
 132  
 133                  if (b) {
 134                      t.progressTimer = setTimeout(function() {
 135                          co = ed.getContainer();
 136                          co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild);
 137                          tb = DOM.get(ed.id + '_tbl');
 138  
 139                          DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}});
 140                          DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}});
 141                      }, ti || 0);
 142                  } else {
 143                      DOM.remove(id + '_blocker');
 144                      DOM.remove(id + '_progress');
 145                      clearTimeout(t.progressTimer);
 146                  }
 147              });
 148  
 149              DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css");
 150  
 151              if (s.skin_variant)
 152                  DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css");
 153          },
 154  
 155          createControl : function(n, cf) {
 156              var cd, c;
 157  
 158              if (c = cf.createControl(n))
 159                  return c;
 160  
 161              switch (n) {
 162                  case "styleselect":
 163                      return this._createStyleSelect();
 164  
 165                  case "formatselect":
 166                      return this._createBlockFormats();
 167  
 168                  case "fontselect":
 169                      return this._createFontSelect();
 170  
 171                  case "fontsizeselect":
 172                      return this._createFontSizeSelect();
 173  
 174                  case "forecolor":
 175                      return this._createForeColorMenu();
 176  
 177                  case "backcolor":
 178                      return this._createBackColorMenu();
 179              }
 180  
 181              if ((cd = this.controls[n]))
 182                  return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]});
 183          },
 184  
 185          execCommand : function(cmd, ui, val) {
 186              var f = this['_' + cmd];
 187  
 188              if (f) {
 189                  f.call(this, ui, val);
 190                  return true;
 191              }
 192  
 193              return false;
 194          },
 195  
 196          _importClasses : function(e) {
 197              var ed = this.editor, c = ed.controlManager.get('styleselect');
 198  
 199              if (c.getLength() == 0) {
 200                  each(ed.dom.getClasses(), function(o) {
 201                      c.add(o['class'], o['class']);
 202                  });
 203              }
 204          },
 205  
 206          _createStyleSelect : function(n) {
 207              var t = this, ed = t.editor, cf = ed.controlManager, c = cf.createListBox('styleselect', {
 208                  title : 'advanced.style_select',
 209                  onselect : function(v) {
 210                      if (c.selectedValue === v) {
 211                          ed.execCommand('mceSetStyleInfo', 0, {command : 'removeformat'});
 212                          c.select();
 213                          return false;
 214                      } else
 215                          ed.execCommand('mceSetCSSClass', 0, v);
 216                  }
 217              });
 218  
 219              if (c) {
 220                  each(ed.getParam('theme_advanced_styles', '', 'hash'), function(v, k) {
 221                      if (v)
 222                          c.add(t.editor.translate(k), v);
 223                  });
 224  
 225                  c.onPostRender.add(function(ed, n) {
 226                      if (!c.NativeListBox) {
 227                          Event.add(n.id + '_text', 'focus', t._importClasses, t);
 228                          Event.add(n.id + '_text', 'mousedown', t._importClasses, t);
 229                          Event.add(n.id + '_open', 'focus', t._importClasses, t);
 230                          Event.add(n.id + '_open', 'mousedown', t._importClasses, t);
 231                      } else
 232                          Event.add(n.id, 'focus', t._importClasses, t);
 233                  });
 234              }
 235  
 236              return c;
 237          },
 238  
 239          _createFontSelect : function() {
 240              var c, t = this, ed = t.editor;
 241  
 242              c = ed.controlManager.createListBox('fontselect', {title : 'advanced.fontdefault', cmd : 'FontName'});
 243              if (c) {
 244                  each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {
 245                      c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});
 246                  });
 247              }
 248  
 249              return c;
 250          },
 251  
 252          _createFontSizeSelect : function() {
 253              var t = this, ed = t.editor, c, i = 0, cl = [];
 254  
 255              c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) {
 256                  if (v.fontSize)
 257                      ed.execCommand('FontSize', false, v.fontSize);
 258                  else {
 259                      each(t.settings.theme_advanced_font_sizes, function(v, k) {
 260                          if (v['class'])
 261                              cl.push(v['class']);
 262                      });
 263  
 264                      ed.editorCommands._applyInlineStyle('span', {'class' : v['class']}, {check_classes : cl});
 265                  }
 266              }});
 267  
 268              if (c) {
 269                  each(t.settings.theme_advanced_font_sizes, function(v, k) {
 270                      var fz = v.fontSize;
 271  
 272                      if (fz >= 1 && fz <= 7)
 273                          fz = t.sizes[parseInt(fz) - 1] + 'pt';
 274  
 275                      c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))});
 276                  });
 277              }
 278  
 279              return c;
 280          },
 281  
 282          _createBlockFormats : function() {
 283              var c, fmts = {
 284                  p : 'advanced.paragraph',
 285                  address : 'advanced.address',
 286                  pre : 'advanced.pre',
 287                  h1 : 'advanced.h1',
 288                  h2 : 'advanced.h2',
 289                  h3 : 'advanced.h3',
 290                  h4 : 'advanced.h4',
 291                  h5 : 'advanced.h5',
 292                  h6 : 'advanced.h6',
 293                  div : 'advanced.div',
 294                  blockquote : 'advanced.blockquote',
 295                  code : 'advanced.code',
 296                  dt : 'advanced.dt',
 297                  dd : 'advanced.dd',
 298                  samp : 'advanced.samp'
 299              }, t = this;
 300  
 301              c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'});
 302              if (c) {
 303                  each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {
 304                      c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v});
 305                  });
 306              }
 307  
 308              return c;
 309          },
 310  
 311          _createForeColorMenu : function() {
 312              var c, t = this, s = t.settings, o = {}, v;
 313  
 314              if (s.theme_advanced_more_colors) {
 315                  o.more_colors_func = function() {
 316                      t._mceColorPicker(0, {
 317                          color : c.value,
 318                          func : function(co) {
 319                              c.setColor(co);
 320                          }
 321                      });
 322                  };
 323              }
 324  
 325              if (v = s.theme_advanced_text_colors)
 326                  o.colors = v;
 327  
 328              if (s.theme_advanced_default_foreground_color)
 329                  o.default_color = s.theme_advanced_default_foreground_color;
 330  
 331              o.title = 'advanced.forecolor_desc';
 332              o.cmd = 'ForeColor';
 333              o.scope = this;
 334  
 335              c = t.editor.controlManager.createColorSplitButton('forecolor', o);
 336  
 337              return c;
 338          },
 339  
 340          _createBackColorMenu : function() {
 341              var c, t = this, s = t.settings, o = {}, v;
 342  
 343              if (s.theme_advanced_more_colors) {
 344                  o.more_colors_func = function() {
 345                      t._mceColorPicker(0, {
 346                          color : c.value,
 347                          func : function(co) {
 348                              c.setColor(co);
 349                          }
 350                      });
 351                  };
 352              }
 353  
 354              if (v = s.theme_advanced_background_colors)
 355                  o.colors = v;
 356  
 357              if (s.theme_advanced_default_background_color)
 358                  o.default_color = s.theme_advanced_default_background_color;
 359  
 360              o.title = 'advanced.backcolor_desc';
 361              o.cmd = 'HiliteColor';
 362              o.scope = this;
 363  
 364              c = t.editor.controlManager.createColorSplitButton('backcolor', o);
 365  
 366              return c;
 367          },
 368  
 369          renderUI : function(o) {
 370              var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;
 371  
 372              n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});
 373  
 374              if (!DOM.boxModel)
 375                  n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});
 376  
 377              n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});
 378              n = tb = DOM.add(n, 'tbody');
 379  
 380              switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {
 381                  case "rowlayout":
 382                      ic = t._rowLayout(s, tb, o);
 383                      break;
 384  
 385                  case "customlayout":
 386                      ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p);
 387                      break;
 388  
 389                  default:
 390                      ic = t._simpleLayout(s, tb, o, p);
 391              }
 392  
 393              n = o.targetNode;
 394  
 395              // Add classes to first and last TRs
 396              nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8
 397              DOM.addClass(nl[0], 'mceFirst');
 398              DOM.addClass(nl[nl.length - 1], 'mceLast');
 399  
 400              // Add classes to first and last TDs
 401              each(DOM.select('tr', tb), function(n) {
 402                  DOM.addClass(n.firstChild, 'mceFirst');
 403                  DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast');
 404              });
 405  
 406              if (DOM.get(s.theme_advanced_toolbar_container))
 407                  DOM.get(s.theme_advanced_toolbar_container).appendChild(p);
 408              else
 409                  DOM.insertAfter(p, n);
 410  
 411              Event.add(ed.id + '_path_row', 'click', function(e) {
 412                  e = e.target;
 413  
 414                  if (e.nodeName == 'A') {
 415                      t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1'));
 416  
 417                      return Event.cancel(e);
 418                  }
 419              });
 420  /*
 421              if (DOM.get(ed.id + '_path_row')) {
 422                  Event.add(ed.id + '_tbl', 'mouseover', function(e) {
 423                      var re;
 424      
 425                      e = e.target;
 426  
 427                      if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) {
 428                          re = DOM.get(ed.id + '_path_row');
 429                          t.lastPath = re.innerHTML;
 430                          DOM.setHTML(re, e.parentNode.title);
 431                      }
 432                  });
 433  
 434                  Event.add(ed.id + '_tbl', 'mouseout', function(e) {
 435                      if (t.lastPath) {
 436                          DOM.setHTML(ed.id + '_path_row', t.lastPath);
 437                          t.lastPath = 0;
 438                      }
 439                  });
 440              }
 441  */
 442  
 443              if (!ed.getParam('accessibility_focus'))
 444                  Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();});
 445  
 446              if (s.theme_advanced_toolbar_location == 'external')
 447                  o.deltaHeight = 0;
 448  
 449              t.deltaHeight = o.deltaHeight;
 450              o.targetNode = null;
 451  
 452              return {
 453                  iframeContainer : ic,
 454                  editorContainer : ed.id + '_parent',
 455                  sizeContainer : sc,
 456                  deltaHeight : o.deltaHeight
 457              };
 458          },
 459  
 460          getInfo : function() {
 461              return {
 462                  longname : 'Advanced theme',
 463                  author : 'Moxiecode Systems AB',
 464                  authorurl : 'http://tinymce.moxiecode.com',
 465                  version : tinymce.majorVersion + "." + tinymce.minorVersion
 466              }
 467          },
 468  
 469          resizeBy : function(dw, dh) {
 470              var e = DOM.get(this.editor.id + '_tbl');
 471  
 472              this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);
 473          },
 474  
 475          resizeTo : function(w, h) {
 476              var ed = this.editor, s = ed.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'), dh;
 477  
 478              // Boundery fix box
 479              w = Math.max(s.theme_advanced_resizing_min_width || 100, w);
 480              h = Math.max(s.theme_advanced_resizing_min_height || 100, h);
 481              w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w);
 482              h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h);
 483  
 484              // Calc difference between iframe and container
 485              dh = e.clientHeight - ifr.clientHeight;
 486  
 487              // Resize iframe and container
 488              DOM.setStyle(ifr, 'height', h - dh);
 489              DOM.setStyles(e, {width : w, height : h});
 490          },
 491  
 492          destroy : function() {
 493              var id = this.editor.id;
 494  
 495              Event.clear(id + '_resize');
 496              Event.clear(id + '_path_row');
 497              Event.clear(id + '_external_close');
 498          },
 499  
 500          // Internal functions
 501  
 502          _simpleLayout : function(s, tb, o, p) {
 503              var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c;
 504  
 505              if (s.readonly) {
 506                  n = DOM.add(tb, 'tr');
 507                  n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
 508                  return ic;
 509              }
 510  
 511              // Create toolbar container at top
 512              if (lo == 'top')
 513                  t._addToolbars(tb, o);
 514  
 515              // Create external toolbar
 516              if (lo == 'external') {
 517                  n = c = DOM.create('div', {style : 'position:relative'});
 518                  n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'});
 519                  DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'});
 520                  n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0});
 521                  etb = DOM.add(n, 'tbody');
 522  
 523                  if (p.firstChild.className == 'mceOldBoxModel')
 524                      p.firstChild.appendChild(c);
 525                  else
 526                      p.insertBefore(c, p.firstChild);
 527  
 528                  t._addToolbars(etb, o);
 529  
 530                  ed.onMouseUp.add(function() {
 531                      var e = DOM.get(ed.id + '_external');
 532                      DOM.show(e);
 533  
 534                      DOM.hide(lastExtID);
 535  
 536                      var f = Event.add(ed.id + '_external_close', 'click', function() {
 537                          DOM.hide(ed.id + '_external');
 538                          Event.remove(ed.id + '_external_close', 'click', f);
 539                      });
 540  
 541                      DOM.show(e);
 542                      DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1);
 543  
 544                      // Fixes IE rendering bug
 545                      DOM.hide(e);
 546                      DOM.show(e);
 547                      e.style.filter = '';
 548  
 549                      lastExtID = ed.id + '_external';
 550  
 551                      e = null;
 552                  });
 553              }
 554  
 555              if (sl == 'top')
 556                  t._addStatusBar(tb, o);
 557  
 558              // Create iframe container
 559              if (!s.theme_advanced_toolbar_container) {
 560                  n = DOM.add(tb, 'tr');
 561                  n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
 562              }
 563  
 564              // Create toolbar container at bottom
 565              if (lo == 'bottom')
 566                  t._addToolbars(tb, o);
 567  
 568              if (sl == 'bottom')
 569                  t._addStatusBar(tb, o);
 570  
 571              return ic;
 572          },
 573  
 574          _rowLayout : function(s, tb, o) {
 575              var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a;
 576  
 577              dc = s.theme_advanced_containers_default_class || '';
 578              da = s.theme_advanced_containers_default_align || 'center';
 579  
 580              each(explode(s.theme_advanced_containers || ''), function(c, i) {
 581                  var v = s['theme_advanced_container_' + c] || '';
 582  
 583                  switch (v.toLowerCase()) {
 584                      case 'mceeditor':
 585                          n = DOM.add(tb, 'tr');
 586                          n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
 587                          break;
 588  
 589                      case 'mceelementpath':
 590                          t._addStatusBar(tb, o);
 591                          break;
 592  
 593                      default:
 594                          a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase();
 595                          a = 'mce' + t._ufirst(a);
 596  
 597                          n = DOM.add(DOM.add(tb, 'tr'), 'td', {
 598                              'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da
 599                          });
 600  
 601                          to = cf.createToolbar("toolbar" + i);
 602                          t._addControls(v, to);
 603                          DOM.setHTML(n, to.renderHTML());
 604                          o.deltaHeight -= s.theme_advanced_row_height;
 605                  }
 606              });
 607  
 608              return ic;
 609          },
 610  
 611          _addControls : function(v, tb) {
 612              var t = this, s = t.settings, di, cf = t.editor.controlManager;
 613  
 614              if (s.theme_advanced_disable && !t._disabled) {
 615                  di = {};
 616  
 617                  each(explode(s.theme_advanced_disable), function(v) {
 618                      di[v] = 1;
 619                  });
 620  
 621                  t._disabled = di;
 622              } else
 623                  di = t._disabled;
 624  
 625              each(explode(v), function(n) {
 626                  var c;
 627  
 628                  if (di && di[n])
 629                      return;
 630  
 631                  // Compatiblity with 2.x
 632                  if (n == 'tablecontrols') {
 633                      each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) {
 634                          n = t.createControl(n, cf);
 635  
 636                          if (n)
 637                              tb.add(n);
 638                      });
 639  
 640                      return;
 641                  }
 642  
 643                  c = t.createControl(n, cf);
 644  
 645                  if (c)
 646                      tb.add(c);
 647              });
 648          },
 649  
 650          _addToolbars : function(c, o) {
 651              var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a;
 652  
 653              a = s.theme_advanced_toolbar_align.toLowerCase();
 654              a = 'mce' + t._ufirst(a);
 655  
 656              n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a});
 657  
 658              if (!ed.getParam('accessibility_focus'))
 659                  h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));
 660  
 661              h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->'));
 662  
 663              // Create toolbar and add the controls
 664              for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {
 665                  tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i});
 666  
 667                  if (s['theme_advanced_buttons' + i + '_add'])
 668                      v += ',' + s['theme_advanced_buttons' + i + '_add'];
 669  
 670                  if (s['theme_advanced_buttons' + i + '_add_before'])
 671                      v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;
 672  
 673                  t._addControls(v, tb);
 674  
 675                  //n.appendChild(n = tb.render());
 676                  h.push(tb.renderHTML());
 677  
 678                  o.deltaHeight -= s.theme_advanced_row_height;
 679              }
 680  
 681              h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));
 682              DOM.setHTML(n, h.join(''));
 683          },
 684  
 685          _addStatusBar : function(tb, o) {
 686              var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;
 687  
 688              n = DOM.add(tb, 'tr');
 689              n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});
 690              n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : '&#160;');
 691              DOM.add(n, 'a', {href : '#', accesskey : 'x'});
 692  
 693              if (s.theme_advanced_resizing) {
 694                  DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});
 695  
 696                  if (s.theme_advanced_resizing_use_cookie) {
 697                      ed.onPostRender.add(function() {
 698                          var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl');
 699  
 700                          if (!o)
 701                              return;
 702  
 703                          if (s.theme_advanced_resize_horizontal)
 704                              c.style.width = Math.max(10, o.cw) + 'px';
 705  
 706                          c.style.height = Math.max(10, o.ch) + 'px';
 707                          DOM.get(ed.id + '_ifr').style.height = Math.max(10, parseInt(o.ch) + t.deltaHeight) + 'px';
 708                      });
 709                  }
 710  
 711                  ed.onPostRender.add(function() {
 712                      Event.add(ed.id + '_resize', 'mousedown', function(e) {
 713                          var c, p, w, h, n, pa;
 714  
 715                          // Measure container
 716                          c = DOM.get(ed.id + '_tbl');
 717                          w = c.clientWidth;
 718                          h = c.clientHeight;
 719  
 720                          miw = s.theme_advanced_resizing_min_width || 100;
 721                          mih = s.theme_advanced_resizing_min_height || 100;
 722                          maw = s.theme_advanced_resizing_max_width || 0xFFFF;
 723                          mah = s.theme_advanced_resizing_max_height || 0xFFFF;
 724  
 725                          // Setup placeholder
 726                          p = DOM.add(DOM.get(ed.id + '_parent'), 'div', {'class' : 'mcePlaceHolder'});
 727                          DOM.setStyles(p, {width : w, height : h});
 728  
 729                          // Replace with placeholder
 730                          DOM.hide(c);
 731                          DOM.show(p);
 732  
 733                          // Create internal resize obj
 734                          r = {
 735                              x : e.screenX,
 736                              y : e.screenY,
 737                              w : w,
 738                              h : h,
 739                              dx : null,
 740                              dy : null
 741                          };
 742  
 743                          // Start listening
 744                          mf = Event.add(DOM.doc, 'mousemove', function(e) {
 745                              var w, h;
 746  
 747                              // Calc delta values
 748                              r.dx = e.screenX - r.x;
 749                              r.dy = e.screenY - r.y;
 750  
 751                              // Boundery fix box
 752                              w = Math.max(miw, r.w + r.dx);
 753                              h = Math.max(mih, r.h + r.dy);
 754                              w = Math.min(maw, w);
 755                              h = Math.min(mah, h);
 756  
 757                              // Resize placeholder
 758                              if (s.theme_advanced_resize_horizontal)
 759                                  p.style.width = w + 'px';
 760  
 761                              p.style.height = h + 'px';
 762  
 763                              return Event.cancel(e);
 764                          });
 765  
 766                          me = Event.add(DOM.doc, 'mouseup', function(e) {
 767                              var ifr;
 768  
 769                              // Stop listening
 770                              Event.remove(DOM.doc, 'mousemove', mf);
 771                              Event.remove(DOM.doc, 'mouseup', me);
 772  
 773                              c.style.display = '';
 774                              DOM.remove(p);
 775  
 776                              if (r.dx === null)
 777                                  return;
 778  
 779                              ifr = DOM.get(ed.id + '_ifr');
 780  
 781                              if (s.theme_advanced_resize_horizontal)
 782                                  c.style.width = Math.max(10, r.w + r.dx) + 'px';
 783  
 784                              c.style.height = Math.max(10, r.h + r.dy) + 'px';
 785                              ifr.style.height = Math.max(10, ifr.clientHeight + r.dy) + 'px';
 786  
 787                              if (s.theme_advanced_resizing_use_cookie) {
 788                                  Cookie.setHash("TinyMCE_" + ed.id + "_size", {
 789                                      cw : r.w + r.dx,
 790                                      ch : r.h + r.dy
 791                                  });
 792                              }
 793                          });
 794  
 795                          return Event.cancel(e);
 796                      });
 797                  });
 798              }
 799  
 800              o.deltaHeight -= 21;
 801              n = tb = null;
 802          },
 803  
 804          _nodeChanged : function(ed, cm, n, co) {
 805              var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn;
 806  
 807              if (s.readonly)
 808                  return;
 809  
 810              tinymce.each(t.stateControls, function(c) {
 811                  cm.setActive(c, ed.queryCommandState(t.controls[c][1]));
 812              });
 813  
 814              cm.setActive('visualaid', ed.hasVisual);
 815              cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);
 816              cm.setDisabled('redo', !ed.undoManager.hasRedo());
 817              cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));
 818  
 819              p = DOM.getParent(n, 'A');
 820              if (c = cm.get('link')) {
 821                  if (!p || !p.name) {
 822                      c.setDisabled(!p && co);
 823                      c.setActive(!!p);
 824                  }
 825              }
 826  
 827              if (c = cm.get('unlink')) {
 828                  c.setDisabled(!p && co);
 829                  c.setActive(!!p && !p.name);
 830              }
 831  
 832              if (c = cm.get('anchor')) {
 833                  c.setActive(!!p && p.name);
 834  
 835                  if (tinymce.isWebKit) {
 836                      p = DOM.getParent(n, 'IMG');
 837                      c.setActive(!!p && DOM.getAttrib(p, 'mce_name') == 'a');
 838                  }
 839              }
 840  
 841              p = DOM.getParent(n, 'IMG');
 842              if (c = cm.get('image'))
 843                  c.setActive(!!p && n.className.indexOf('mceItem') == -1);
 844  
 845              if (c = cm.get('styleselect')) {
 846                  if (n.className) {
 847                      t._importClasses();
 848                      c.select(n.className);
 849                  } else
 850                      c.select();
 851              }
 852  
 853              if (c = cm.get('formatselect')) {
 854                  p = DOM.getParent(n, DOM.isBlock);
 855  
 856                  if (p)
 857                      c.select(p.nodeName.toLowerCase());
 858              }
 859  
 860              if (ed.settings.convert_fonts_to_spans) {
 861                  ed.dom.getParent(n, function(n) {
 862                      if (n.nodeName === 'SPAN') {
 863                          if (!cl && n.className)
 864                              cl = n.className;
 865  
 866                          if (!fz && n.style.fontSize)
 867                              fz = n.style.fontSize;
 868  
 869                          if (!fn && n.style.fontFamily)
 870                              fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();
 871                      }
 872  
 873                      return false;
 874                  });
 875  
 876                  if (c = cm.get('fontselect')) {
 877                      c.select(function(v) {
 878                          return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn;
 879                      });
 880                  }
 881  
 882                  if (c = cm.get('fontsizeselect')) {
 883                      c.select(function(v) {
 884                          if (v.fontSize && v.fontSize === fz)
 885                              return true;
 886  
 887                          if (v['class'] && v['class'] === cl)
 888                              return true;
 889                      });
 890                  }
 891              } else {
 892                  if (c = cm.get('fontselect'))
 893                      c.select(ed.queryCommandValue('FontName'));
 894  
 895                  if (c = cm.get('fontsizeselect')) {
 896                      v = ed.queryCommandValue('FontSize');
 897                      c.select(function(iv) {
 898                          return iv.fontSize == v;
 899                      });
 900                  }
 901              }
 902  
 903              if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {
 904                  p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});
 905                  DOM.setHTML(p, '');
 906  
 907                  ed.dom.getParent(n, function(n) {
 908                      var na = n.nodeName.toLowerCase(), u, pi, ti = '';
 909  
 910                      // Ignore non element and hidden elements
 911                      if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))
 912                          return;
 913  
 914                      // Fake name
 915                      if (v = DOM.getAttrib(n, 'mce_name'))
 916                          na = v;
 917  
 918                      // Handle prefix
 919                      if (tinymce.isIE && n.scopeName !== 'HTML')
 920                          na = n.scopeName + ':' + na;
 921  
 922                      // Remove internal prefix
 923                      na = na.replace(/mce\:/g, '');
 924  
 925                      // Handle node name
 926                      switch (na) {
 927                          case 'b':
 928                              na = 'strong';
 929                              break;
 930  
 931                          case 'i':
 932                              na = 'em';
 933                              break;
 934  
 935                          case 'img':
 936                              if (v = DOM.getAttrib(n, 'src'))
 937                                  ti += 'src: ' + v + ' ';
 938  
 939                              break;
 940  
 941                          case 'a':
 942                              if (v = DOM.getAttrib(n, 'name')) {
 943                                  ti += 'name: ' + v + ' ';
 944                                  na += '#' + v;
 945                              }
 946  
 947                              if (v = DOM.getAttrib(n, 'href'))
 948                                  ti += 'href: ' + v + ' ';
 949  
 950                              break;
 951  
 952                          case 'font':
 953                              if (s.convert_fonts_to_spans)
 954                                  na = 'span';
 955  
 956                              if (v = DOM.getAttrib(n, 'face'))
 957                                  ti += 'font: ' + v + ' ';
 958  
 959                              if (v = DOM.getAttrib(n, 'size'))
 960                                  ti += 'size: ' + v + ' ';
 961  
 962                              if (v = DOM.getAttrib(n, 'color'))
 963                                  ti += 'color: ' + v + ' ';
 964  
 965                              break;
 966  
 967                          case 'span':
 968                              if (v = DOM.getAttrib(n, 'style'))
 969                                  ti += 'style: ' + v + ' ';
 970  
 971                              break;
 972                      }
 973  
 974                      if (v = DOM.getAttrib(n, 'id'))
 975                          ti += 'id: ' + v + ' ';
 976  
 977                      if (v = n.className) {
 978                          v = v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g, '');
 979  
 980                          if (v && v.indexOf('mceItem') == -1) {
 981                              ti += 'class: ' + v + ' ';
 982  
 983                              if (DOM.isBlock(n) || na == 'img' || na == 'span')
 984                                  na += '.' + v;
 985                          }
 986                      }
 987  
 988                      na = na.replace(/(html:)/g, '');
 989                      na = {name : na, node : n, title : ti};
 990                      t.onResolveName.dispatch(t, na);
 991                      ti = na.title;
 992                      na = na.name;
 993  
 994                      //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";
 995                      pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);
 996  
 997                      if (p.hasChildNodes()) {
 998                          p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild);
 999                          p.insertBefore(pi, p.firstChild);
1000                      } else
1001                          p.appendChild(pi);
1002                  }, ed.getBody());
1003              }
1004          },
1005  
1006          // Commands gets called by execCommand
1007  
1008          _sel : function(v) {
1009              this.editor.execCommand('mceSelectNodeDepth', false, v);
1010          },
1011  
1012          _mceInsertAnchor : function(ui, v) {
1013              var ed = this.editor;
1014  
1015              ed.windowManager.open({
1016                  url : tinymce.baseURL + '/themes/advanced/anchor.htm',
1017                  width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)),
1018                  height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)),
1019                  inline : true
1020              }, {
1021                  theme_url : this.url
1022              });
1023          },
1024  
1025          _mceCharMap : function() {
1026              var ed = this.editor;
1027  
1028              ed.windowManager.open({
1029                  url : tinymce.baseURL + '/themes/advanced/charmap.htm',
1030                  width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),
1031                  height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
1032                  inline : true
1033              }, {
1034                  theme_url : this.url
1035              });
1036          },
1037  
1038          _mceHelp : function() {
1039              var ed = this.editor;
1040  
1041              ed.windowManager.open({
1042                  url : tinymce.baseURL + '/themes/advanced/about.htm',
1043                  width : 480,
1044                  height : 380,
1045                  inline : true
1046              }, {
1047                  theme_url : this.url
1048              });
1049          },
1050  
1051          _mceColorPicker : function(u, v) {
1052              var ed = this.editor;
1053  
1054              v = v || {};
1055  
1056              ed.windowManager.open({
1057                  url : tinymce.baseURL + '/themes/advanced/color_picker.htm',
1058                  width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),
1059                  height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),
1060                  close_previous : false,
1061                  inline : true
1062              }, {
1063                  input_color : v.color,
1064                  func : v.func,
1065                  theme_url : this.url
1066              });
1067          },
1068  
1069          _mceCodeEditor : function(ui, val) {
1070              var ed = this.editor;
1071  
1072              ed.windowManager.open({
1073                  url : tinymce.baseURL + '/themes/advanced/source_editor.htm',
1074                  width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),
1075                  height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),
1076                  inline : true,
1077                  resizable : true,
1078                  maximizable : true
1079              }, {
1080                  theme_url : this.url
1081              });
1082          },
1083  
1084          _mceImage : function(ui, val) {
1085              var ed = this.editor;
1086  
1087              // Internal image object like a flash placeholder
1088              if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1)
1089                  return;
1090  
1091              ed.windowManager.open({
1092                  url : tinymce.baseURL + '/themes/advanced/image.htm',
1093                  width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)),
1094                  height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)),
1095                  inline : true
1096              }, {
1097                  theme_url : this.url
1098              });
1099          },
1100  
1101          _mceLink : function(ui, val) {
1102              var ed = this.editor;
1103  
1104              ed.windowManager.open({
1105                  url : tinymce.baseURL + '/themes/advanced/link.htm',
1106                  width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)),
1107                  height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)),
1108                  inline : true
1109              }, {
1110                  theme_url : this.url
1111              });
1112          },
1113  
1114          _mceNewDocument : function() {
1115              var ed = this.editor;
1116  
1117              ed.windowManager.confirm('advanced.newdocument', function(s) {
1118                  if (s)
1119                      ed.execCommand('mceSetContent', false, '');
1120              });
1121          },
1122  
1123          _mceForeColor : function() {
1124              var t = this;
1125  
1126              this._mceColorPicker(0, {
1127                  color: t.fgColor,
1128                  func : function(co) {
1129                      t.fgColor = co;
1130                      t.editor.execCommand('ForeColor', false, co);
1131                  }
1132              });
1133          },
1134  
1135          _mceBackColor : function() {
1136              var t = this;
1137  
1138              this._mceColorPicker(0, {
1139                  color: t.bgColor,
1140                  func : function(co) {
1141                      t.bgColor = co;
1142                      t.editor.execCommand('HiliteColor', false, co);
1143                  }
1144              });
1145          },
1146  
1147          _ufirst : function(s) {
1148              return s.substring(0, 1).toUpperCase() + s.substring(1);
1149          }
1150      });
1151  
1152      tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);
1153  }(tinymce));


Generated: Wed Mar 28 15:54:07 2012 Cross-referenced by PHPXref 0.7.1