tinymce-rails 3.4.3.2 → 3.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -335,7 +335,7 @@
335
335
  * @method restoreDraft
336
336
  */
337
337
  restoreDraft : function() {
338
- var self = this, storage = self.storage;
338
+ var self = this, storage = self.storage, content;
339
339
 
340
340
  if (storage) {
341
341
  content = storage.getItem(self.key);
@@ -219,7 +219,10 @@
219
219
  t.focus(id);
220
220
 
221
221
  if (n.nodeName == 'A' || n.nodeName == 'a') {
222
- if (n.className == 'mceMax') {
222
+ if (n.className == 'mceClose') {
223
+ t.close(null, id);
224
+ return Event.cancel(e);
225
+ } else if (n.className == 'mceMax') {
223
226
  w.oldPos = w.element.getXY();
224
227
  w.oldSize = w.element.getSize();
225
228
 
@@ -18,25 +18,29 @@
18
18
  }
19
19
  return e;
20
20
  }
21
-
21
+
22
22
  function skipWhitespaceNodesBackwards(e) {
23
- return skipWhitespaceNodes(e, function(e) { return e.previousSibling; });
23
+ return skipWhitespaceNodes(e, function(e) {
24
+ return e.previousSibling;
25
+ });
24
26
  }
25
-
27
+
26
28
  function skipWhitespaceNodesForwards(e) {
27
- return skipWhitespaceNodes(e, function(e) { return e.nextSibling; });
29
+ return skipWhitespaceNodes(e, function(e) {
30
+ return e.nextSibling;
31
+ });
28
32
  }
29
-
33
+
30
34
  function hasParentInList(ed, e, list) {
31
35
  return ed.dom.getParent(e, function(p) {
32
36
  return tinymce.inArray(list, p) !== -1;
33
37
  });
34
38
  }
35
-
39
+
36
40
  function isList(e) {
37
41
  return e && (e.tagName === 'OL' || e.tagName === 'UL');
38
42
  }
39
-
43
+
40
44
  function splitNestedLists(element, dom) {
41
45
  var tmp, nested, wrapItem;
42
46
  tmp = skipWhitespaceNodesBackwards(element.lastChild);
@@ -54,12 +58,12 @@
54
58
  }
55
59
  return element;
56
60
  }
57
-
61
+
58
62
  function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
59
63
  e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
60
64
  return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
61
65
  }
62
-
66
+
63
67
  function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
64
68
  var prev = skipWhitespaceNodesBackwards(e.previousSibling);
65
69
  if (prev) {
@@ -68,7 +72,7 @@
68
72
  return e;
69
73
  }
70
74
  }
71
-
75
+
72
76
  function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
73
77
  var next = skipWhitespaceNodesForwards(e.nextSibling);
74
78
  if (next) {
@@ -77,7 +81,7 @@
77
81
  return e;
78
82
  }
79
83
  }
80
-
84
+
81
85
  function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
82
86
  if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
83
87
  return merge(e1, e2, differentStylesMasterElement);
@@ -87,7 +91,7 @@
87
91
  }
88
92
  return e2;
89
93
  }
90
-
94
+
91
95
  function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
92
96
  if (!e1 || !e2) {
93
97
  return false;
@@ -101,17 +105,17 @@
101
105
  return false;
102
106
  }
103
107
  }
104
-
108
+
105
109
  function isListForIndent(e) {
106
110
  var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
107
- return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
111
+ return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
108
112
  }
109
-
113
+
110
114
  function containsOnlyAList(e) {
111
115
  var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
112
116
  return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
113
117
  }
114
-
118
+
115
119
  function merge(e1, e2, masterElement) {
116
120
  var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
117
121
  if (e1.tagName === 'P') {
@@ -127,7 +131,7 @@
127
131
  attemptMerge(lastOriginal, firstNew, false);
128
132
  return e1;
129
133
  }
130
-
134
+
131
135
  function findItemToOperateOn(e, dom) {
132
136
  var item;
133
137
  if (!dom.is(e, 'li,ol,ul')) {
@@ -138,42 +142,95 @@
138
142
  }
139
143
  return e;
140
144
  }
141
-
145
+
142
146
  tinymce.create('tinymce.plugins.Lists', {
143
147
  init: function(ed, url) {
144
- var enterDownInEmptyList = false;
148
+ var LIST_TABBING = 0;
149
+ var LIST_EMPTY_ITEM = 1;
150
+ var LIST_ESCAPE = 2;
151
+ var LIST_UNKNOWN = 3;
152
+ var state = LIST_UNKNOWN;
145
153
 
146
- function isTriggerKey(e) {
154
+ function isTabInList(e) {
147
155
  return e.keyCode === 9 && (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
148
- };
156
+ }
157
+
158
+ function isOnLastListItem() {
159
+ var li = getLi();
160
+ var grandParent = li.parentNode.parentNode;
161
+ var isLastItem = li.parentNode.lastChild === li;
162
+ return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
163
+ }
164
+
165
+ function isNestedList(grandParent) {
166
+ if (isList(grandParent)) {
167
+ return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
168
+ } else {
169
+ return grandParent.tagName === 'LI';
170
+ }
171
+ }
149
172
 
150
- function isEnterInEmptyListItem(ed, e) {
151
- var sel = ed.selection, n;
152
- if (e.keyCode === 13) {
153
- n = sel.getStart();
173
+ function isInEmptyListItem() {
174
+ return ed.selection.isCollapsed() && isEmptyListItem(getLi());
175
+ }
154
176
 
155
- // Get start will return BR if the LI only contains a BR
156
- if (n.tagName == 'BR' && n.parentNode.tagName == 'LI')
157
- n = n.parentNode;
177
+ function getLi() {
178
+ var n = ed.selection.getStart();
179
+ // Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
180
+ return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
181
+ }
158
182
 
159
- // Check for empty LI or a LI with just one BR since Gecko and WebKit uses BR elements to place the caret
160
- enterDownInEmptyList = sel.isCollapsed() && n && n.tagName === 'LI' && (n.childNodes.length === 0 || (n.firstChild.nodeName == 'BR' && n.childNodes.length === 1));
161
- return enterDownInEmptyList;
183
+ function isEmptyListItem(li) {
184
+ var numChildren = li.childNodes.length;
185
+ if (li.tagName === 'LI') {
186
+ return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || isEmptyWebKitLi(li) || isEmptyIE9Li(li));
162
187
  }
163
- };
188
+ return false;
189
+ }
190
+
191
+ function isEmptyWebKitLi(li) {
192
+ // Check for empty LI or a LI with just a child that is a BR since Gecko and WebKit uses BR elements to place the caret
193
+ return tinymce.isWebKit && li.firstChild.nodeName == 'BR';
194
+ }
164
195
 
165
- function cancelKeys(ed, e) {
166
- if (isTriggerKey(e) || isEnterInEmptyListItem(ed, e)) {
196
+ function isEmptyIE9Li(li) {
197
+ // only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
198
+ var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.nodeName == 'LI'});
199
+ var isLastLi = li == lis[lis.length - 1];
200
+ var child = li.firstChild;
201
+ return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
202
+ }
203
+
204
+ function isEnter(e) {
205
+ return e.keyCode === 13;
206
+ }
207
+
208
+ function getListKeyState(e) {
209
+ if (isTabInList(e)) {
210
+ return LIST_TABBING;
211
+ } else if (isEnter(e) && isOnLastListItem()) {
212
+ return LIST_ESCAPE;
213
+ } else if (isEnter(e) && isInEmptyListItem()) {
214
+ return LIST_EMPTY_ITEM;
215
+ } else {
216
+ return LIST_UNKNOWN;
217
+ }
218
+ }
219
+
220
+ function cancelEnterAndTab(_, e) {
221
+ if (state == LIST_TABBING || state == LIST_EMPTY_ITEM) {
167
222
  return Event.cancel(e);
168
223
  }
169
- };
224
+ }
170
225
 
171
226
  function imageJoiningListItem(ed, e) {
227
+ var prevSibling;
228
+
172
229
  if (!tinymce.isGecko)
173
230
  return;
174
231
 
175
232
  var n = ed.selection.getStart();
176
- if (e.keyCode != 8 || n.tagName !== 'IMG')
233
+ if (e.keyCode != 8 || n.tagName !== 'IMG')
177
234
  return;
178
235
 
179
236
  function lastLI(node) {
@@ -195,11 +252,16 @@
195
252
  destination.appendChild(parentNode.childNodes[0]);
196
253
  }
197
254
 
255
+ // Check if there is a previous sibling
256
+ prevSibling = n.parentNode.previousSibling;
257
+ if (!prevSibling)
258
+ return;
259
+
198
260
  var ul;
199
- if (n.parentNode.previousSibling.tagName === 'UL' || n.parentNode.previousSibling.tagName === 'OL')
200
- ul = n.parentNode.previousSibling;
201
- else if (n.parentNode.previousSibling.previousSibling.tagName === 'UL' || n.parentNode.previousSibling.previousSibling.tagName === 'OL')
202
- ul = n.parentNode.previousSibling.previousSibling;
261
+ if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
262
+ ul = prevSibling;
263
+ else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
264
+ ul = prevSibling.previousSibling;
203
265
  else
204
266
  return;
205
267
 
@@ -221,7 +283,7 @@
221
283
  addChildren(clone, li);
222
284
  else
223
285
  li.appendChild(clone);
224
-
286
+
225
287
  // remove the old copy of the image
226
288
  n.parentNode.parentNode.removeChild(n.parentNode);
227
289
 
@@ -229,6 +291,16 @@
229
291
  ed.selection.moveToBookmark(bookmark);
230
292
  }
231
293
 
294
+ // fix the cursor position to ensure it is correct in IE
295
+ function setCursorPositionToOriginalLi(li) {
296
+ var list = ed.dom.getParent(li, 'ol,ul');
297
+ if (list != null) {
298
+ var lastLi = list.lastChild;
299
+ lastLi.appendChild(ed.getDoc().createElement(''));
300
+ ed.selection.setCursorLocation(lastLi, 0);
301
+ }
302
+ }
303
+
232
304
  this.ed = ed;
233
305
  ed.addCommand('Indent', this.indent, this);
234
306
  ed.addCommand('Outdent', this.outdent, this);
@@ -238,72 +310,74 @@
238
310
  ed.addCommand('InsertOrderedList', function() {
239
311
  this.applyList('OL', 'UL');
240
312
  }, this);
241
-
313
+
242
314
  ed.onInit.add(function() {
243
315
  ed.editorCommands.addCommands({
244
316
  'outdent': function() {
245
317
  var sel = ed.selection, dom = ed.dom;
318
+
246
319
  function hasStyleIndent(n) {
247
320
  n = dom.getParent(n, dom.isBlock);
248
321
  return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
249
322
  }
323
+
250
324
  return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
251
325
  }
252
326
  }, 'state');
253
327
  });
254
-
328
+
255
329
  ed.onKeyUp.add(function(ed, e) {
256
- var n, rng;
257
- if (isTriggerKey(e)) {
330
+ if (state == LIST_TABBING) {
258
331
  ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
259
332
  return Event.cancel(e);
260
- } else if (enterDownInEmptyList && isEnterInEmptyListItem(ed, e)) {
261
- if (ed.queryCommandState('InsertOrderedList')) {
262
- ed.execCommand('InsertOrderedList');
263
- } else {
264
- ed.execCommand('InsertUnorderedList');
265
- }
266
- n = ed.selection.getStart();
267
- if (n && n.tagName === 'LI') {
268
- // Fix the caret position on IE since it jumps back up to the previous list item.
269
- n = ed.dom.getParent(n, 'ol,ul').nextSibling;
270
- if (n && n.tagName === 'P') {
271
- if (!n.firstChild) {
272
- n.appendChild(ed.getDoc().createTextNode(''));
273
- }
274
- rng = ed.dom.createRng();
275
- rng.setStart(n.firstChild, 1);
276
- rng.setEnd(n.firstChild, 1);
277
- ed.selection.setRng(rng);
278
- }
333
+ } else if (state == LIST_EMPTY_ITEM) {
334
+ var li = getLi();
335
+ var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey;
336
+ ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
337
+ if (tinymce.isIE) {
338
+ setCursorPositionToOriginalLi(li);
279
339
  }
280
340
  return Event.cancel(e);
341
+ } else if (state == LIST_ESCAPE) {
342
+ if (tinymce.isIE8) {
343
+ // append a zero sized nbsp so that caret is positioned correctly in IE8 after escaping and applying formatting.
344
+ // if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
345
+ // escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
346
+ var n = ed.getDoc().createTextNode('\uFEFF');
347
+ ed.selection.getNode().appendChild(n);
348
+ } else if (tinymce.isIE9) {
349
+ // IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
350
+ ed.execCommand('Outdent');
351
+ return Event.cancel(e);
352
+ }
281
353
  }
282
354
  });
283
- ed.onKeyPress.add(cancelKeys);
284
- ed.onKeyDown.add(cancelKeys);
355
+ ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
356
+ ed.onKeyDown.add(cancelEnterAndTab);
285
357
  ed.onKeyDown.add(imageJoiningListItem);
358
+ ed.onKeyPress.add(cancelEnterAndTab);
286
359
  },
287
-
360
+
288
361
  applyList: function(targetListType, oppositeListType) {
289
362
  var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
290
- selectedBlocks = ed.selection.getSelectedBlocks();
291
-
363
+ selectedBlocks = ed.selection.getSelectedBlocks();
364
+
292
365
  function cleanupBr(e) {
293
366
  if (e && e.tagName === 'BR') {
294
367
  dom.remove(e);
295
368
  }
296
369
  }
297
-
370
+
298
371
  function makeList(element) {
299
372
  var list = dom.create(targetListType), li;
373
+
300
374
  function adjustIndentForNewList(element) {
301
375
  // If there's a margin-left, outdent one level to account for the extra list margin.
302
376
  if (element.style.marginLeft || element.style.paddingLeft) {
303
377
  t.adjustPaddingFunction(false)(element);
304
378
  }
305
379
  }
306
-
380
+
307
381
  if (element.tagName === 'LI') {
308
382
  // No change required.
309
383
  } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
@@ -331,7 +405,7 @@
331
405
  attemptMergeWithAdjacent(list, true);
332
406
  applied.push(element);
333
407
  }
334
-
408
+
335
409
  function doWrapList(start, end, template) {
336
410
  var li, n = start, tmp, i;
337
411
  while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
@@ -358,10 +432,11 @@
358
432
  }
359
433
  makeList(li);
360
434
  }
361
-
435
+
362
436
  function processBrs(element, callback) {
363
437
  var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
364
- breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
438
+ breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
439
+
365
440
  function isAnyPartSelected(start, end) {
366
441
  var r = dom.createRng(), sel;
367
442
  bookmark.keep = true;
@@ -375,12 +450,14 @@
375
450
  r.setEndAfter(end);
376
451
  return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
377
452
  }
453
+
378
454
  function nextLeaf(br) {
379
455
  if (br.nextSibling)
380
456
  return br.nextSibling;
381
457
  if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
382
458
  return nextLeaf(br.parentNode);
383
459
  }
460
+
384
461
  // Split on BRs within the range and process those.
385
462
  startSection = element.firstChild;
386
463
  // First mark the BRs that have any part of the previous section selected.
@@ -415,7 +492,7 @@
415
492
  callback(startSection, undefined, previousBR);
416
493
  }
417
494
  }
418
-
495
+
419
496
  function wrapList(element) {
420
497
  processBrs(element, function(startSection, br, previousBR) {
421
498
  // Need to indent this part
@@ -424,7 +501,7 @@
424
501
  cleanupBr(previousBR);
425
502
  });
426
503
  }
427
-
504
+
428
505
  function changeList(element) {
429
506
  if (tinymce.inArray(applied, element) !== -1) {
430
507
  return;
@@ -436,7 +513,7 @@
436
513
  }
437
514
  applied.push(element);
438
515
  }
439
-
516
+
440
517
  function convertListItemToParagraph(element) {
441
518
  var child, nextChild, mergedElement, splitLast;
442
519
  if (tinymce.inArray(applied, element) !== -1) {
@@ -458,7 +535,7 @@
458
535
  if (dom.isBlock(child)) {
459
536
  child = dom.split(child.parentNode, child);
460
537
  splitLast = true;
461
- nextChild = child.nextSibling && child.nextSibling.firstChild;
538
+ nextChild = child.nextSibling && child.nextSibling.firstChild;
462
539
  } else {
463
540
  nextChild = child.nextSibling;
464
541
  if (splitLast && child.tagName === 'BR') {
@@ -470,7 +547,7 @@
470
547
  }
471
548
  }
472
549
  }
473
-
550
+
474
551
  each(selectedBlocks, function(e) {
475
552
  e = findItemToOperateOn(e, dom);
476
553
  if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
@@ -503,23 +580,23 @@
503
580
  }
504
581
  this.process(actions);
505
582
  },
506
-
583
+
507
584
  indent: function() {
508
585
  var ed = this.ed, dom = ed.dom, indented = [];
509
-
586
+
510
587
  function createWrapItem(element) {
511
588
  var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
512
589
  dom.insertAfter(wrapItem, element);
513
590
  return wrapItem;
514
591
  }
515
-
592
+
516
593
  function createWrapList(element) {
517
594
  var wrapItem = createWrapItem(element),
518
- list = dom.getParent(element, 'ol,ul'),
519
- listType = list.tagName,
520
- listStyle = dom.getStyle(list, 'list-style-type'),
521
- attrs = {},
522
- wrapList;
595
+ list = dom.getParent(element, 'ol,ul'),
596
+ listType = list.tagName,
597
+ listStyle = dom.getStyle(list, 'list-style-type'),
598
+ attrs = {},
599
+ wrapList;
523
600
  if (listStyle !== '') {
524
601
  attrs.style = 'list-style-type: ' + listStyle + ';';
525
602
  }
@@ -527,7 +604,7 @@
527
604
  wrapItem.appendChild(wrapList);
528
605
  return wrapList;
529
606
  }
530
-
607
+
531
608
  function indentLI(element) {
532
609
  if (!hasParentInList(ed, element, indented)) {
533
610
  element = splitNestedLists(element, dom);
@@ -538,17 +615,17 @@
538
615
  indented.push(element);
539
616
  }
540
617
  }
541
-
618
+
542
619
  this.process({
543
620
  'LI': indentLI,
544
621
  defaultAction: this.adjustPaddingFunction(true)
545
622
  });
546
-
623
+
547
624
  },
548
-
625
+
549
626
  outdent: function() {
550
627
  var t = this, ed = t.ed, dom = ed.dom, outdented = [];
551
-
628
+
552
629
  function outdentLI(element) {
553
630
  var listElement, targetParent, align;
554
631
  if (!hasParentInList(ed, element, outdented)) {
@@ -577,17 +654,18 @@
577
654
  outdented.push(element);
578
655
  }
579
656
  }
580
-
657
+
581
658
  this.process({
582
659
  'LI': outdentLI,
583
660
  defaultAction: this.adjustPaddingFunction(false)
584
661
  });
585
-
662
+
586
663
  each(outdented, attemptMergeWithAdjacent);
587
664
  },
588
-
665
+
589
666
  process: function(actions) {
590
667
  var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
668
+
591
669
  function processElement(element) {
592
670
  dom.removeClass(element, '_mce_act_on');
593
671
  if (!element || element.nodeType !== 1) {
@@ -600,13 +678,16 @@
600
678
  }
601
679
  action(element);
602
680
  }
681
+
603
682
  function recurse(element) {
604
683
  t.splitSafeEach(element.childNodes, processElement);
605
684
  }
685
+
606
686
  function brAtEdgeOfSelection(container, offset) {
607
687
  return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
608
688
  container.childNodes[offset].tagName === 'BR';
609
689
  }
690
+
610
691
  selectedBlocks = sel.getSelectedBlocks();
611
692
  if (selectedBlocks.length === 0) {
612
693
  selectedBlocks = [ dom.getRoot() ];
@@ -631,7 +712,7 @@
631
712
  // Avoids table or image handles being left behind in Firefox.
632
713
  t.ed.execCommand('mceRepaint');
633
714
  },
634
-
715
+
635
716
  splitSafeEach: function(elements, f) {
636
717
  if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
637
718
  /Firefox\/3\.[0-4]/.test(navigator.userAgent))) {
@@ -640,7 +721,7 @@
640
721
  each(elements, f);
641
722
  }
642
723
  },
643
-
724
+
644
725
  classBasedEach: function(elements, f) {
645
726
  var dom = this.ed.dom, nodes, element;
646
727
  // Mark nodes
@@ -655,7 +736,7 @@
655
736
  nodes = dom.select('._mce_act_on');
656
737
  }
657
738
  },
658
-
739
+
659
740
  adjustPaddingFunction: function(isIndent) {
660
741
  var indentAmount, indentUnits, ed = this.ed;
661
742
  indentAmount = ed.settings.indentation;
@@ -673,7 +754,7 @@
673
754
  ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
674
755
  };
675
756
  },
676
-
757
+
677
758
  getInfo: function() {
678
759
  return {
679
760
  longname : 'Lists',