refinerycms 0.9.5.14 → 0.9.5.15

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.
@@ -69,7 +69,7 @@ eval("#{(defined? Refinery::Initializer) ? Refinery : Rails}::Initializer").run
69
69
  config.gem "rails", :version => ">= 2.3.4", :lib => "rails"
70
70
  config.gem "aasm", :version => ">= 2.1.3", :lib => "aasm", :source => "http://gemcutter.org"
71
71
  config.gem "unicode", :version => ">= 0.1", :lib => "unicode"
72
- config.gem "slim_scrooge", :source => "http://gemcutter.org"
73
- config.gem "hpricot", :version => "0.8.1", :lib => "hpricot", :source => "http://gemcutter.org"
72
+ config.gem "slim_scrooge", :version => ">= 1.0.1", :lib => "slim_scrooge", :source => "http://gemcutter.org"
73
+ config.gem "hpricot", :version => "= 0.8.1", :lib => "hpricot", :source => "http://gemcutter.org"
74
74
  #===REFINERY END OF REQUIRED GEMS===
75
75
  end
@@ -10,7 +10,7 @@ var wymeditor_boot_options = {
10
10
  , langPath: "/javascripts/wymeditor/lang/"
11
11
  , iframeBasePath: '/'
12
12
  , toolsItems: [
13
- {'name': 'Bold', 'title': 'Bold', 'css': 'wym_tools_strong'}
13
+ {'name': 'Bold', 'title': 'Bold', 'css': 'wym_tools_strong'}
14
14
  ,{'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'}
15
15
  ,{'name': 'InsertOrderedList', 'title': 'Ordered_List', 'css': 'wym_tools_ordered_list'}
16
16
  ,{'name': 'InsertUnorderedList', 'title': 'Unordered_List', 'css': 'wym_tools_unordered_list'}
@@ -24,7 +24,7 @@ var wymeditor_boot_options = {
24
24
 
25
25
  ,toolsHtml: "<ul class='wym_tools wym_section'>" + WYMeditor.TOOLS_ITEMS + WYMeditor.CLASSES + "</ul>"
26
26
 
27
- ,toolsItemHtml:
27
+ ,toolsItemHtml:
28
28
  "<li class='" + WYMeditor.TOOL_CLASS + "'>"
29
29
  + "<a href='#' name='" + WYMeditor.TOOL_NAME + "' title='" + WYMeditor.TOOL_TITLE + "'>" + WYMeditor.TOOL_TITLE + "</a>"
30
30
  + "</li>"
@@ -35,13 +35,13 @@ var wymeditor_boot_options = {
35
35
  ,{'name': 'h2', 'title':'Heading_2', 'css':'wym_containers_h2'}
36
36
  ,{'name': 'h3', 'title':'Heading_3', 'css':'wym_containers_h3'}
37
37
  ,{'name': 'p', 'title':'Paragraph', 'css':'wym_containers_p'}
38
- ]
38
+ ]
39
39
 
40
40
  , classesHtml: "<li class='wym_tools_class'><a href='#' name='" + WYMeditor.APPLY_CLASS + "' title='"+ titleize(WYMeditor.APPLY_CLASS) +"'></a><ul class='wym_classes wym_classes_hidden'>" + WYMeditor.CLASSES_ITEMS + "</ul></li>"
41
41
 
42
42
  , classesItemHtml: "<li><a href='#' name='"+ WYMeditor.CLASS_NAME + "'>"+ WYMeditor.CLASS_TITLE+ "</a></li>"
43
43
  , classesItemHtmlMultiple: "<li class='wym_tools_class_multiple_rules'><span>" + WYMeditor.CLASS_TITLE + "</span><ul>{classesItemHtml}</ul></li>"
44
-
44
+
45
45
  , classesItems: [{name:'text-align', rules:['left', 'center', 'right', 'justify'], join: '-'}, {name: 'image-align', rules:['left', 'right'], join: '-'}, {name: 'font-size', rules:['small','normal','large'], join: '-'}]
46
46
 
47
47
  , containersHtml: "<ul class='wym_containers wym_section'>" + WYMeditor.CONTAINERS_ITEMS + "</ul>"
@@ -51,10 +51,10 @@ var wymeditor_boot_options = {
51
51
  + "<a href='#' name='" + WYMeditor.CONTAINER_NAME + "' title='" + WYMeditor.CONTAINER_TITLE + "'></a>"
52
52
  + "</li>"
53
53
 
54
- , boxHtml:
54
+ , boxHtml:
55
55
  "<div class='wym_box'>"
56
- + "<div class='wym_area_top'>"
57
- + WYMeditor.TOOLS
56
+ + "<div class='wym_area_top'>"
57
+ + WYMeditor.TOOLS
58
58
  + WYMeditor.CONTAINERS
59
59
  + "</div>"
60
60
  + "<div class='wym_area_main'>"
@@ -63,8 +63,8 @@ var wymeditor_boot_options = {
63
63
  + WYMeditor.STATUS
64
64
  + "</div>"
65
65
  + "</div>"
66
-
67
- , iframeHtml:
66
+
67
+ , iframeHtml:
68
68
  "<div class='wym_iframe wym_section'>"
69
69
  + "<iframe id='WYMeditor_" + WYMeditor.INDEX + "' src='" + WYMeditor.IFRAME_BASE_PATH + "wymiframe' frameborder='0'"
70
70
  + " onload='this.contentWindow.parent.WYMeditor.INSTANCES[" + WYMeditor.INDEX + "].initIframe(this);'></iframe>"
@@ -74,7 +74,7 @@ var wymeditor_boot_options = {
74
74
 
75
75
  , dialogLinkHtml: ""
76
76
 
77
- , dialogTableHtml:
77
+ , dialogTableHtml:
78
78
  "<div class='wym_dialog wym_dialog_table'>"
79
79
  + "<form>"
80
80
  + "<input type='hidden' id='wym_dialog_type' class='wym_dialog_type' value='"+ WYMeditor.DIALOG_TABLE + "' />"
@@ -97,8 +97,8 @@ var wymeditor_boot_options = {
97
97
  + "</div>"
98
98
  + "</form>"
99
99
  + "</div>"
100
-
101
- , dialogPasteHtml:
100
+
101
+ , dialogPasteHtml:
102
102
  "<div class='wym_dialog wym_dialog_paste'>"
103
103
  + "<form>"
104
104
  + "<input type='hidden' id='wym_dialog_type' class='wym_dialog_type' value='" + WYMeditor.DIALOG_PASTE + "' />"
@@ -135,15 +135,15 @@ var wymeditor_boot_options = {
135
135
  , postInit: function(wym)
136
136
  {
137
137
  wym._iframe.style.height = wym._element.height() + "px";
138
- wymeditors_loaded += 1;
139
- if(WYMeditor.INSTANCES.length == wymeditors_loaded){
138
+ wymeditors_loaded += 1;
139
+ if(WYMeditor.INSTANCES.length == wymeditors_loaded){
140
140
  WYMeditor.loaded();
141
141
  }
142
142
  }
143
143
  };
144
144
 
145
145
  // custom function added by us to hook into when all wymeditor instances on the page have finally loaded:
146
- WYMeditor.loaded = function(){}
146
+ WYMeditor.loaded = function(){};
147
147
 
148
148
  jQuery(function()
149
149
  {
@@ -200,7 +200,7 @@ jQuery.extend(WYMeditor, {
200
200
  TOGGLE_HTML : "ToggleHtml",
201
201
  FORMAT_BLOCK : "FormatBlock",
202
202
  PREVIEW : "Preview",
203
-
203
+
204
204
  UNLINK : "Unlink",
205
205
  INSERT_UNORDEREDLIST : "InsertUnorderedList",
206
206
  INSERT_ORDEREDLIST : "InsertOrderedList",
@@ -230,7 +230,7 @@ jQuery.extend(WYMeditor, {
230
230
  ATTRIBUTE: 2,
231
231
  TEXT: 3
232
232
  },
233
-
233
+
234
234
  /*
235
235
  Class: WYMeditor.editor
236
236
  WYMeditor editor main class, instanciated for each editor occurrence.
@@ -302,7 +302,7 @@ jQuery.extend(WYMeditor, {
302
302
  * }
303
303
  * );
304
304
  * @desc Example description here
305
- *
305
+ *
306
306
  * @name WYMeditor
307
307
  * @description WYMeditor is a web-based WYSIWYM XHTML editor
308
308
  * @param Hash hash A hash of parameters
@@ -318,23 +318,23 @@ jQuery.fn.wymeditor = function(options) {
318
318
  options = jQuery.extend({
319
319
 
320
320
  html: "",
321
-
321
+
322
322
  basePath: false,
323
-
323
+
324
324
  skinPath: false,
325
325
  jsSkinPath: false,
326
326
  cssSkinPath: false,
327
-
327
+
328
328
  wymPath: false,
329
-
329
+
330
330
  iframeBasePath: false,
331
-
331
+
332
332
  jQueryPath: false,
333
-
333
+
334
334
  styles: false,
335
-
335
+
336
336
  stylesheet: false,
337
-
337
+
338
338
  skin: "default",
339
339
  initSkin: true,
340
340
  loadSkin: true,
@@ -344,7 +344,7 @@ jQuery.fn.wymeditor = function(options) {
344
344
  direction: "ltr",
345
345
 
346
346
  boxHtml: "<div class='wym_box'>"
347
- + "<div class='wym_area_top'>"
347
+ + "<div class='wym_area_top'>"
348
348
  + WYMeditor.TOOLS
349
349
  + "</div>"
350
350
  + "<div class='wym_area_left'></div>"
@@ -374,7 +374,7 @@ jQuery.fn.wymeditor = function(options) {
374
374
  + WYMeditor.INDEX + "].initIframe(this)'"
375
375
  + "></iframe>"
376
376
  + "</div>",
377
-
377
+
378
378
  editorStyles: [],
379
379
 
380
380
  toolsHtml: "<div class='wym_tools wym_section'>"
@@ -383,7 +383,7 @@ jQuery.fn.wymeditor = function(options) {
383
383
  + WYMeditor.TOOLS_ITEMS
384
384
  + "</ul>"
385
385
  + "</div>",
386
-
386
+
387
387
  toolsItemHtml: "<li class='"
388
388
  + WYMeditor.TOOL_CLASS
389
389
  + "'><a href='#' name='"
@@ -395,7 +395,7 @@ jQuery.fn.wymeditor = function(options) {
395
395
  + "</a></li>",
396
396
 
397
397
  toolsItems: [
398
- {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'},
398
+ {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'},
399
399
  {'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'},
400
400
  {'name': 'Superscript', 'title': 'Superscript',
401
401
  'css': 'wym_tools_superscript'},
@@ -425,7 +425,7 @@ jQuery.fn.wymeditor = function(options) {
425
425
  + WYMeditor.CONTAINERS_ITEMS
426
426
  + "</ul>"
427
427
  + "</div>",
428
-
428
+
429
429
  containersItemHtml:"<li class='"
430
430
  + WYMeditor.CONTAINER_CLASS
431
431
  + "'>"
@@ -434,7 +434,7 @@ jQuery.fn.wymeditor = function(options) {
434
434
  + "'>"
435
435
  + WYMeditor.CONTAINER_TITLE
436
436
  + "</a></li>",
437
-
437
+
438
438
  containersItems: [
439
439
  {'name': 'P', 'title': 'Paragraph', 'css': 'wym_containers_p'},
440
440
  {'name': 'H1', 'title': 'Heading_1', 'css': 'wym_containers_h1'},
@@ -486,33 +486,33 @@ jQuery.fn.wymeditor = function(options) {
486
486
  classUnhiddenSelector: ".wym_classes",
487
487
  classHiddenSelector: ".wym_classes_hidden",
488
488
  htmlValSelector: ".wym_html_val",
489
-
489
+
490
490
  hrefSelector: ".wym_href",
491
491
  srcSelector: ".wym_src",
492
492
  titleSelector: ".wym_title",
493
493
  targetSelector: ".wym_target",
494
494
  altSelector: ".wym_alt",
495
495
  textSelector: ".wym_text",
496
-
496
+
497
497
  rowsSelector: ".wym_rows",
498
498
  colsSelector: ".wym_cols",
499
499
  captionSelector: ".wym_caption",
500
500
  summarySelector: ".wym_summary",
501
-
501
+
502
502
  submitSelector: ".wym_submit",
503
503
  cancelSelector: ".wym_cancel",
504
504
  previewSelector: "",
505
-
505
+
506
506
  dialogTypeSelector: ".wym_dialog_type",
507
507
  dialogLinkSelector: ".wym_dialog_link",
508
508
  dialogImageSelector: ".wym_dialog_image",
509
509
  dialogTableSelector: ".wym_dialog_table",
510
510
  dialogPasteSelector: ".wym_dialog_paste",
511
511
  dialogPreviewSelector: ".wym_dialog_preview",
512
-
512
+
513
513
  updateSelector: ".wymupdate",
514
514
  updateEvent: "click",
515
-
515
+
516
516
  dialogFeatures: "menubar=no,titlebar=no,toolbar=no,resizable=no"
517
517
  + ",width=560,height=300,top=0,left=0",
518
518
 
@@ -539,7 +539,7 @@ jQuery.fn.wymeditor = function(options) {
539
539
  + "</head>"
540
540
  + WYMeditor.DIALOG_BODY
541
541
  + "</html>",
542
-
542
+
543
543
  dialogLinkHtml: "<div class='wym_dialog wym_dialog_link'>"
544
544
  + "<form>"
545
545
  + "<fieldset>"
@@ -564,7 +564,7 @@ jQuery.fn.wymeditor = function(options) {
564
564
  + "</fieldset>"
565
565
  + "</form>"
566
566
  + "</div>",
567
-
567
+
568
568
  dialogImageHtml: "<div class='wym_dialog wym_dialog_image'>"
569
569
  + "<form>"
570
570
  + "<fieldset>"
@@ -593,7 +593,7 @@ jQuery.fn.wymeditor = function(options) {
593
593
  + "</fieldset>"
594
594
  + "</form>"
595
595
  + "</div>",
596
-
596
+
597
597
  dialogTableHtml: "<div class='wym_dialog wym_dialog_table'>"
598
598
  + "<form>"
599
599
  + "<input type='hidden' id='wym_dialog_type' class='wym_dialog_type' value='"
@@ -645,16 +645,16 @@ jQuery.fn.wymeditor = function(options) {
645
645
  + "</div>",
646
646
 
647
647
  dialogPreviewHtml: "<div class='wym_dialog wym_dialog_preview'></div>",
648
-
648
+
649
649
  dialogStyles: [],
650
650
 
651
651
  stringDelimiterLeft: "{",
652
652
  stringDelimiterRight:"}",
653
-
653
+
654
654
  preInit: null,
655
655
  preBind: null,
656
656
  postInit: null,
657
-
657
+
658
658
  preInitDialog: null,
659
659
  postInitDialog: null
660
660
 
@@ -688,6 +688,7 @@ WYMeditor.editor.prototype.init = function() {
688
688
 
689
689
  //load subclass - browser specific
690
690
  //unsupported browsers: do nothing
691
+
691
692
  if (jQuery.browser.msie) {
692
693
  var WymClass = new WYMeditor.WymClassExplorer(this);
693
694
  }
@@ -700,21 +701,21 @@ WYMeditor.editor.prototype.init = function() {
700
701
  else if (jQuery.browser.safari) {
701
702
  var WymClass = new WYMeditor.WymClassSafari(this);
702
703
  }
703
-
704
+
704
705
  if(WymClass) {
705
-
706
+
706
707
  if(jQuery.isFunction(this._options.preInit)) this._options.preInit(this);
707
708
 
708
709
  var SaxListener = new WYMeditor.XhtmlSaxListener();
709
710
  jQuery.extend(SaxListener, WymClass);
710
711
  this.parser = new WYMeditor.XhtmlParser(SaxListener);
711
-
712
+
712
713
  if(this._options.styles || this._options.stylesheet){
713
714
  this.configureEditorUsingRawCss();
714
715
  }
715
-
716
+
716
717
  this.helper = new WYMeditor.XmlHelper();
717
-
718
+
718
719
  //extend the Wymeditor object
719
720
  //don't use jQuery.extend since 1.1.4
720
721
  //jQuery.extend(this, WymClass);
@@ -727,17 +728,17 @@ WYMeditor.editor.prototype.init = function() {
727
728
  //but keep it compatible with jQuery < 1.2.3, see #122
728
729
  if( jQuery.isFunction( jQuery.fn.data ) )
729
730
  jQuery.data(this._box.get(0), WYMeditor.WYM_INDEX, this._index);
730
-
731
+
731
732
  var h = WYMeditor.Helper;
732
733
 
733
734
  //construct the iframe
734
735
  var iframeHtml = this._options.iframeHtml;
735
736
  iframeHtml = h.replaceAll(iframeHtml, WYMeditor.INDEX, this._index);
736
737
  iframeHtml = h.replaceAll(iframeHtml, WYMeditor.IFRAME_BASE_PATH, this._options.iframeBasePath);
737
-
738
+
738
739
  //construct wymbox
739
740
  var boxHtml = jQuery(this._box).html();
740
-
741
+
741
742
  boxHtml = h.replaceAll(boxHtml, WYMeditor.LOGO, this._options.logoHtml);
742
743
  boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS, this._options.toolsHtml);
743
744
  boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS,this._options.containersHtml);
@@ -745,7 +746,7 @@ WYMeditor.editor.prototype.init = function() {
745
746
  boxHtml = h.replaceAll(boxHtml, WYMeditor.HTML, this._options.htmlHtml);
746
747
  boxHtml = h.replaceAll(boxHtml, WYMeditor.IFRAME, iframeHtml);
747
748
  boxHtml = h.replaceAll(boxHtml, WYMeditor.STATUS, this._options.statusHtml);
748
-
749
+
749
750
  //construct tools list
750
751
  var aTools = eval(this._options.toolsItems);
751
752
  var sTools = "";
@@ -767,7 +768,7 @@ WYMeditor.editor.prototype.init = function() {
767
768
  //construct classes list
768
769
  var aClasses = eval(this._options.classesItems);
769
770
  var sClasses = "";
770
-
771
+
771
772
  for(var i = 0; i < aClasses.length; i++) {
772
773
  var oClass = aClasses[i];
773
774
  if(oClass.name) {
@@ -779,7 +780,7 @@ WYMeditor.editor.prototype.init = function() {
779
780
  sClass = h.replaceAll(sClass, WYMeditor.CLASS_TITLE, rule.title || titleize(rule));
780
781
  sRules += sClass;
781
782
  }.bind(this)); // need to bind 'this' or else it will think 'this' is the window.
782
-
783
+
783
784
  var sClassMultiple = this._options.classesItemHtmlMultiple;
784
785
  sClassMultiple = h.replaceAll(sClassMultiple, WYMeditor.CLASS_TITLE, oClass.title || titleize(oClass.name));
785
786
  sClassMultiple = h.replaceAll(sClassMultiple, '{classesItemHtml}', sRules);
@@ -795,7 +796,7 @@ WYMeditor.editor.prototype.init = function() {
795
796
  }
796
797
 
797
798
  boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES_ITEMS, sClasses);
798
-
799
+
799
800
  //construct containers list
800
801
  var aContainers = eval(this._options.containersItems);
801
802
  var sContainers = "";
@@ -817,16 +818,16 @@ WYMeditor.editor.prototype.init = function() {
817
818
 
818
819
  //l10n
819
820
  boxHtml = this.replaceStrings(boxHtml);
820
-
821
+
821
822
  //load html in wymbox
822
823
  jQuery(this._box).html(boxHtml);
823
-
824
+
824
825
  //hide the html value
825
826
  jQuery(this._box).find(this._options.htmlSelector).hide();
826
-
827
+
827
828
  //enable the skin
828
829
  this.loadSkin();
829
-
830
+
830
831
  }
831
832
  };
832
833
 
@@ -834,19 +835,19 @@ WYMeditor.editor.prototype.bindEvents = function() {
834
835
 
835
836
  //copy the instance
836
837
  var wym = this;
837
-
838
+
838
839
  //handle click event on tools buttons
839
840
  jQuery(this._box).find(this._options.toolSelector).click(function() {
840
841
  wym.exec(jQuery(this).attr(WYMeditor.NAME));
841
842
  return(false);
842
843
  });
843
-
844
+
844
845
  //handle click event on containers buttons
845
846
  jQuery(this._box).find(this._options.containerSelector).click(function() {
846
847
  wym.container(jQuery(this).attr(WYMeditor.NAME));
847
848
  return(false);
848
849
  });
849
-
850
+
850
851
  //handle keyup event on html value: set the editor value
851
852
  jQuery(this._box).find(this._options.htmlValSelector).keyup(function() {
852
853
  jQuery(wym._doc.body).html(jQuery(this).val());
@@ -869,29 +870,29 @@ WYMeditor.editor.prototype.bindEvents = function() {
869
870
  replacers.push(classRule.name + (classRule.join || "") + classRule.rules[i]);
870
871
  }
871
872
  }
872
-
873
+
873
874
  oClass = {expr: (classRule.rules[indexOf].expr || null)}
874
875
  }
875
876
  }
876
877
  }.bind(this));
877
878
  }
878
-
879
+
879
880
  if(oClass) {
880
881
  var jqexpr = oClass.expr;
881
882
  // remove all related classes.
882
883
  replacers.each(function(removable_class){
883
884
  wym.removeClass(removable_class, jqexpr);
884
885
  });
885
-
886
+
886
887
  wym.toggleClass(sName, jqexpr);
887
888
  }
888
-
889
+
889
890
  // now hide the menu
890
891
  wym.exec(WYMeditor.APPLY_CLASS);
891
-
892
+
892
893
  return(false);
893
894
  });
894
-
895
+
895
896
  //handle event on update element
896
897
  jQuery(this._options.updateSelector).bind(this._options.updateEvent, function() {
897
898
  wym.update();
@@ -932,7 +933,7 @@ WYMeditor.editor.prototype.xhtml = function() {
932
933
  * @description Executes a button command
933
934
  */
934
935
  WYMeditor.editor.prototype.exec = function(cmd) {
935
-
936
+
936
937
  //base function for execCommand
937
938
  //open a dialog or exec
938
939
  switch(cmd) {
@@ -940,19 +941,19 @@ WYMeditor.editor.prototype.exec = function(cmd) {
940
941
  var container = this.container();
941
942
  if(container || this._selected_image) this.dialog(WYMeditor.DIALOG_LINK);
942
943
  break;
943
-
944
+
944
945
  case WYMeditor.INSERT_IMAGE:
945
946
  this.dialog(WYMeditor.DIALOG_IMAGE);
946
947
  break;
947
-
948
+
948
949
  case WYMeditor.INSERT_TABLE:
949
950
  this.dialog(WYMeditor.DIALOG_TABLE);
950
951
  break;
951
-
952
+
952
953
  case WYMeditor.PASTE:
953
954
  this.dialog(WYMeditor.DIALOG_PASTE);
954
955
  break;
955
-
956
+
956
957
  case WYMeditor.TOGGLE_HTML:
957
958
  this.update();
958
959
  this.toggleHtml();
@@ -961,17 +962,17 @@ WYMeditor.editor.prototype.exec = function(cmd) {
961
962
  if(!jQuery(this._box).find(this._options.htmlSelector).is(':visible'))
962
963
  this.listen();
963
964
  break;
964
-
965
+
965
966
  case WYMeditor.PREVIEW:
966
967
  this.dialog(WYMeditor.PREVIEW);
967
968
  break;
968
-
969
+
969
970
  case WYMeditor.APPLY_CLASS:
970
971
  jQuery(this._box).find(this._options.classUnhiddenSelector).toggleClass(this._options.classHiddenSelector.substring(1)); // substring(1) to remove the . at the start
971
972
  jQuery(this._box).find("a[name=" + WYMeditor.APPLY_CLASS +"]").toggleClass('selected');
972
973
  //this.dialog(WYMeditor.DIALOG_CLASS);
973
974
  break;
974
-
975
+
975
976
  default:
976
977
  this._exec(cmd);
977
978
  break;
@@ -984,16 +985,16 @@ WYMeditor.editor.prototype.exec = function(cmd) {
984
985
  WYMeditor.editor.prototype.container = function(sType) {
985
986
 
986
987
  if(sType) {
987
-
988
+
988
989
  var container = null;
989
-
990
+
990
991
  if(sType.toLowerCase() == WYMeditor.TH) {
991
-
992
+
992
993
  container = this.container();
993
-
994
+
994
995
  //find the TD or TH container
995
996
  switch(container.tagName.toLowerCase()) {
996
-
997
+
997
998
  case WYMeditor.TD: case WYMeditor.TH:
998
999
  break;
999
1000
  default:
@@ -1001,44 +1002,44 @@ WYMeditor.editor.prototype.container = function(sType) {
1001
1002
  container = this.findUp(this.container(), aTypes);
1002
1003
  break;
1003
1004
  }
1004
-
1005
+
1005
1006
  //if it exists, switch
1006
1007
  if(container!=null) {
1007
-
1008
+
1008
1009
  sType = (container.tagName.toLowerCase() == WYMeditor.TD)? WYMeditor.TH: WYMeditor.TD;
1009
1010
  this.switchTo(container,sType);
1010
1011
  this.update();
1011
1012
  }
1012
1013
  } else {
1013
-
1014
+
1014
1015
  //set the container type
1015
1016
  var aTypes=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5,
1016
1017
  WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE);
1017
1018
 
1018
1019
  container = this.findUp(this.container(), aTypes);
1019
-
1020
+
1020
1021
  if(container) {
1021
-
1022
+
1022
1023
  var newNode = null;
1023
-
1024
+
1024
1025
  //blockquotes must contain a block level element
1025
1026
  if(sType.toLowerCase() == WYMeditor.BLOCKQUOTE) {
1026
-
1027
+
1027
1028
  var blockquote = this.findUp(this.container(), WYMeditor.BLOCKQUOTE);
1028
-
1029
+
1029
1030
  if(blockquote == null) {
1030
-
1031
+
1031
1032
  newNode = this._doc.createElement(sType);
1032
1033
  container.parentNode.insertBefore(newNode,container);
1033
1034
  newNode.appendChild(container);
1034
1035
  this.setFocusToNode(newNode.firstChild);
1035
-
1036
+
1036
1037
  } else {
1037
-
1038
+
1038
1039
  var nodes = blockquote.childNodes;
1039
1040
  var lgt = nodes.length;
1040
1041
  var firstNode = null;
1041
-
1042
+
1042
1043
  if(lgt > 0) firstNode = nodes.item(0);
1043
1044
  for(var x=0; x<lgt; x++) {
1044
1045
  blockquote.parentNode.insertBefore(nodes.item(0),blockquote);
@@ -1047,9 +1048,9 @@ WYMeditor.editor.prototype.container = function(sType) {
1047
1048
  if(firstNode) this.setFocusToNode(firstNode);
1048
1049
  }
1049
1050
  }
1050
-
1051
+
1051
1052
  else this.switchTo(container,sType);
1052
-
1053
+
1053
1054
  this.update();
1054
1055
  }
1055
1056
  }
@@ -1061,7 +1062,7 @@ WYMeditor.editor.prototype.container = function(sType) {
1061
1062
  * @description Toggles class on selected element, or one of its parents
1062
1063
  */
1063
1064
  WYMeditor.editor.prototype.toggleClass = function(sClass, jqexpr) {
1064
-
1065
+
1065
1066
  var container = jQuery((this._selected_image ? this._selected_image : this.selected(true)));
1066
1067
  if (jqexpr != null) { container = jQuery(container.parentsOrSelf(jqexpr)); }
1067
1068
  container.toggleClass(sClass);
@@ -1073,13 +1074,13 @@ WYMeditor.editor.prototype.toggleClass = function(sClass, jqexpr) {
1073
1074
  * @description Removes class on selected element, or one of its parents
1074
1075
  */
1075
1076
  WYMeditor.editor.prototype.removeClass = function(sClass, jqexpr) {
1076
-
1077
+
1077
1078
  var container = jQuery((this._selected_image ? this._selected_image : jQuery(this.selected(true))));
1078
1079
  if (jqexpr != null) { container = jQuery(container.parentsOrSelf(jqexpr)); }
1079
1080
  container.removeClass(sClass);
1080
1081
 
1081
1082
  if(!container.attr(WYMeditor.CLASS)) container.removeAttr(this._class);
1082
-
1083
+
1083
1084
  }
1084
1085
 
1085
1086
  /* @name findUp
@@ -1092,19 +1093,19 @@ WYMeditor.editor.prototype.findUp = function(node, filter) {
1092
1093
  if(node) {
1093
1094
 
1094
1095
  var tagname = node.tagName.toLowerCase();
1095
-
1096
+
1096
1097
  if(typeof(filter) == WYMeditor.STRING) {
1097
-
1098
+
1098
1099
  while(tagname != filter && tagname != WYMeditor.BODY) {
1099
-
1100
+
1100
1101
  node = node.parentNode;
1101
1102
  tagname = node.tagName.toLowerCase();
1102
1103
  }
1103
-
1104
+
1104
1105
  } else {
1105
-
1106
+
1106
1107
  var bFound = false;
1107
-
1108
+
1108
1109
  while(!bFound && tagname != WYMeditor.BODY) {
1109
1110
  for(var i = 0; i < filter.length; i++) {
1110
1111
  if(tagname == filter[i]) {
@@ -1118,10 +1119,10 @@ WYMeditor.editor.prototype.findUp = function(node, filter) {
1118
1119
  }
1119
1120
  }
1120
1121
  }
1121
-
1122
+
1122
1123
  if(tagname != WYMeditor.BODY) return(node);
1123
1124
  else return(null);
1124
-
1125
+
1125
1126
  } else return(null);
1126
1127
  };
1127
1128
 
@@ -1133,17 +1134,17 @@ WYMeditor.editor.prototype.switchTo = function(selectionOrNode,sType) {
1133
1134
  if (selectionOrNode.getRangeAt) {
1134
1135
  // We have a selection object so we need to create a temporary node around it (bold is easy). This node will be replaced anyway.
1135
1136
  this.exec(WYMeditor.BOLD);
1136
- selectionOrNode = selectionOrNode.focusNode.parentNode;
1137
+ selectionOrNode = selectionOrNode.focusNode.parentNode;
1137
1138
  }
1138
-
1139
+
1139
1140
  // we have a node.
1140
1141
  var html = jQuery(selectionOrNode).html();
1141
1142
  var newNode = this._doc.createElement(sType);
1142
1143
  selectionOrNode.parentNode.replaceChild(newNode,selectionOrNode);
1143
-
1144
+
1144
1145
  jQuery(newNode).html(html);
1145
1146
  this.setFocusToNode(newNode);
1146
-
1147
+
1147
1148
  return newNode;
1148
1149
  };
1149
1150
 
@@ -1164,7 +1165,7 @@ WYMeditor.editor.prototype.replaceStrings = function(sVal) {
1164
1165
 
1165
1166
  //replace all the strings in sVal and return it
1166
1167
  for (var key in WYMeditor.STRINGS[this._options.lang]) {
1167
- sVal = WYMeditor.Helper.replaceAll(sVal, this._options.stringDelimiterLeft + key
1168
+ sVal = WYMeditor.Helper.replaceAll(sVal, this._options.stringDelimiterLeft + key
1168
1169
  + this._options.stringDelimiterRight,
1169
1170
  WYMeditor.STRINGS[this._options.lang][key]);
1170
1171
  };
@@ -1207,7 +1208,7 @@ WYMeditor.editor.prototype.dialog = function( dialogType ) {
1207
1208
  // change undo or redo on cancel to true to have this happen when a user closes (cancels) a dialogue
1208
1209
  this._undo_on_cancel = false;
1209
1210
  this._redo_on_cancel = false;
1210
-
1211
+
1211
1212
  //set to P if parent = BODY
1212
1213
  if (![WYMeditor.DIALOG_TABLE, WYMeditor.DIALOG_PASTE].include(dialogType))
1213
1214
  {
@@ -1220,7 +1221,7 @@ WYMeditor.editor.prototype.dialog = function( dialogType ) {
1220
1221
  // somehow select the wymeditor textarea or simulate a click or a keydown on it.
1221
1222
  }
1222
1223
  }
1223
-
1224
+
1224
1225
  selected = this.selected();
1225
1226
  if (dialogType == WYMeditor.DIALOG_LINK && jQuery.browser.mozilla) {
1226
1227
  selection = this._iframe.contentWindow.getSelection();
@@ -1240,7 +1241,7 @@ WYMeditor.editor.prototype.dialog = function( dialogType ) {
1240
1241
  // set up handlers.
1241
1242
  imageGroup = null;
1242
1243
  ajax_loaded_callback = function(){this.dialog_ajax_callback(selected)}.bind(this, selected);
1243
-
1244
+
1244
1245
  var parent_node = null;
1245
1246
  if (this._selected_image) {
1246
1247
  parent_node = this._selected_image.parentNode;
@@ -1262,7 +1263,7 @@ WYMeditor.editor.prototype.dialog = function( dialogType ) {
1262
1263
  parent_node._id_before_replaceable = parent.id;
1263
1264
  parent_node.id = 'replace_me_with_' + this._current_unique_stamp;
1264
1265
  }
1265
-
1266
+
1266
1267
  path += (this._wym._options.dialogFeatures.length == 0) ? "?" : "&"
1267
1268
  port = (window.location.port.length > 0 ? (":" + window.location.port) : "")
1268
1269
  path += "current_link=" + parent_node.href.gsub(window.location.protocol + "//" + window.location.hostname + port, "");
@@ -1303,7 +1304,7 @@ WYMeditor.editor.prototype.dialog = function( dialogType ) {
1303
1304
  };
1304
1305
 
1305
1306
  WYMeditor.editor.prototype.dialog_ajax_callback = function(selected) {
1306
-
1307
+
1307
1308
  // look for iframes
1308
1309
  if ((iframes = $(this._options.dialogId).select('iframe')).length > 0 && (iframe = $(iframes[0])) != null)
1309
1310
  {
@@ -1334,7 +1335,7 @@ WYMeditor.editor.prototype.paste = function(sData) {
1334
1335
  console.log('pasting..');
1335
1336
  var sTmp;
1336
1337
  var container = this.selected();
1337
-
1338
+
1338
1339
  //split the data, using double newlines as the separator
1339
1340
  var aP = sData.split(this._newLine + this._newLine);
1340
1341
  var rExp = new RegExp(this._newLine, "g");
@@ -1354,7 +1355,7 @@ console.log('pasting..');
1354
1355
  sTmp = sTmp.replace(rExp, "<br />");
1355
1356
  jQuery(this._doc.body).append("<p>" + sTmp + "</p>");
1356
1357
  }
1357
-
1358
+
1358
1359
  }
1359
1360
  };
1360
1361
 
@@ -1452,7 +1453,7 @@ WYMeditor.editor.prototype.listen = function() {
1452
1453
  //don't use jQuery.find() on the iframe body
1453
1454
  //because of MSIE + jQuery + expando issue (#JQ1143)
1454
1455
  //jQuery(this._doc.body).find("*").bind("mouseup", this.mouseup);
1455
-
1456
+
1456
1457
  jQuery(this._doc.body).bind("mousedown", this.mousedown);
1457
1458
  var images = this._doc.body.getElementsByTagName("img");
1458
1459
  for(var i=0; i < images.length; i++) {
@@ -1461,7 +1462,7 @@ WYMeditor.editor.prototype.listen = function() {
1461
1462
  };
1462
1463
 
1463
1464
  WYMeditor.editor.prototype.mousedown = function(evt) {
1464
-
1465
+
1465
1466
  var wym = WYMeditor.INSTANCES[this.ownerDocument.title];
1466
1467
  wym._selected_image = (this.tagName.toLowerCase() == WYMeditor.IMG) ? this : null;
1467
1468
  evt.stopPropagation();
@@ -1477,7 +1478,7 @@ WYMeditor.editor.prototype.mousedown = function(evt) {
1477
1478
  * href - The CSS path.
1478
1479
  */
1479
1480
  WYMeditor.loadCss = function(href) {
1480
-
1481
+
1481
1482
  var link = document.createElement('link');
1482
1483
  link.rel = 'stylesheet';
1483
1484
  link.href = href;
@@ -1547,7 +1548,7 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1547
1548
  button.observe('click', function(e){this.close_dialog(e, true)}.bind(wym));
1548
1549
  });
1549
1550
  /*
1550
- switch(dialogType) {
1551
+ switch(dialogType) {
1551
1552
  case WYMeditor.DIALOG_LINK:
1552
1553
  //ensure that we select the link to populate the fields
1553
1554
  if (replaceable[0] != null && replaceable[0].tagName.toLowerCase() == WYMeditor.A)
@@ -1585,10 +1586,10 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1585
1586
  .val(jQuery(wym._selected_image).attr(WYMeditor.ALT));
1586
1587
  }
1587
1588
 
1588
- jQuery(wym._options.dialogLinkSelector + " " + wym._options.submitSelector).click(function()
1589
+ jQuery(wym._options.dialogLinkSelector + " " + wym._options.submitSelector).click(function()
1589
1590
  {
1590
1591
  var sUrl = jQuery(wym._options.hrefSelector).val();
1591
- if(sUrl.length > 0)
1592
+ if(sUrl.length > 0)
1592
1593
  {
1593
1594
  if (replaceable[0] != null) {
1594
1595
  link = wym._doc.createElement("a");
@@ -1625,7 +1626,7 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1625
1626
  jQuery("a[href=" + wym._current_unique_stamp + "]", wym._doc.body)
1626
1627
  .attr(WYMeditor.HREF, sUrl)
1627
1628
  .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val())
1628
- .attr(WYMeditor.TARGET, jQuery(wym._options.targetSelector).val());
1629
+ .attr(WYMeditor.TARGET, jQuery(wym._options.targetSelector).val());
1629
1630
  }
1630
1631
  }
1631
1632
  // fire a click event on the dialogs close button
@@ -1643,20 +1644,20 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1643
1644
  //var image = jQuery(wym._doc.body).find("img[@src=" + sStamp + "]");
1644
1645
  var image = null;
1645
1646
  var nodes = wym._doc.body.getElementsByTagName(WYMeditor.IMG);
1646
- for(var i=0; i < nodes.length; i++)
1647
+ for(var i=0; i < nodes.length; i++)
1647
1648
  {
1648
- if(jQuery(nodes[i]).attr(WYMeditor.SRC) == wym._current_unique_stamp)
1649
+ if(jQuery(nodes[i]).attr(WYMeditor.SRC) == wym._current_unique_stamp)
1649
1650
  {
1650
1651
  image = jQuery(nodes[i]);
1651
1652
  break;
1652
1653
  }
1653
1654
  }
1654
-
1655
+
1655
1656
  if(image) {
1656
1657
  image.attr(WYMeditor.SRC, sUrl);
1657
1658
  image.attr(WYMeditor.TITLE, sTitle);
1658
1659
  image.attr(WYMeditor.ALT, sAlt);
1659
-
1660
+
1660
1661
  if (!jQuery.browser.safari)
1661
1662
  {
1662
1663
  if (replaceable != null)
@@ -1669,7 +1670,7 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1669
1670
  }
1670
1671
  }
1671
1672
  }
1672
-
1673
+
1673
1674
  // fire a click event on the dialogs close button
1674
1675
  wym.close_dialog();
1675
1676
  }
@@ -1680,7 +1681,7 @@ WYMeditor.INIT_DIALOG = function(wym, selected, isIframe) {
1680
1681
  var iRows = jQuery(wym._options.rowsSelector).val();
1681
1682
  var iCols = jQuery(wym._options.colsSelector).val();
1682
1683
 
1683
- if(iRows > 0 && iCols > 0)
1684
+ if(iRows > 0 && iCols > 0)
1684
1685
  {
1685
1686
  var table = wym._doc.createElement(WYMeditor.TABLE);
1686
1687
  var newRow = null;
@@ -1738,7 +1739,7 @@ WYMeditor.editor.prototype.close_dialog = function(e, cancelled) {
1738
1739
  replaceable[0].id = replaceable[0]._id_before_replaceable;
1739
1740
  }
1740
1741
  }
1741
-
1742
+
1742
1743
  if (this._undo_on_cancel == true) {
1743
1744
  this._exec("undo");
1744
1745
  }
@@ -1746,19 +1747,19 @@ WYMeditor.editor.prototype.close_dialog = function(e, cancelled) {
1746
1747
  this._exec("redo");
1747
1748
  }
1748
1749
  }
1749
-
1750
+
1750
1751
  if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8)
1751
1752
  {
1752
1753
  this._iframe.contentWindow.focus();
1753
1754
  }
1754
-
1755
+
1755
1756
  if ((inline_dialog_container = $('inline_dialog_container')) != null)
1756
1757
  {
1757
1758
  inline_dialog_container.remove();
1758
1759
  }
1759
-
1760
+
1760
1761
  tb_remove();
1761
-
1762
+
1762
1763
  if (e) {
1763
1764
  e.stop();
1764
1765
  }
@@ -4048,6 +4049,14 @@ WYMeditor.Helper = {
4048
4049
  }
4049
4050
  };
4050
4051
 
4052
+ function titleize(words) {
4053
+ parts = [];
4054
+ words.gsub(/\./, '').gsub(/[-_]/, ' ').split(' ').each(function(part){
4055
+ parts.push(part[0].toUpperCase() + part.substring(1));
4056
+ });
4057
+
4058
+ return parts.join(" ");
4059
+ }
4051
4060
 
4052
4061
  /*
4053
4062
  * WYMeditor : what you see is What You Mean web-based editor
@@ -4082,10 +4091,10 @@ WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
4082
4091
  //This function is executed twice, though it is called once!
4083
4092
  //But MSIE needs that, otherwise designMode won't work.
4084
4093
  //Weird.
4085
-
4094
+
4086
4095
  this._iframe = iframe;
4087
4096
  this._doc = iframe.contentWindow.document;
4088
-
4097
+
4089
4098
  //add css rules from options
4090
4099
  var styles = this._doc.styleSheets[0];
4091
4100
  var aCss = eval(this._options.editorStyles);
@@ -4096,13 +4105,13 @@ WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
4096
4105
 
4097
4106
  //set the text direction
4098
4107
  jQuery('html', this._doc).attr('dir', this._options.direction);
4099
-
4108
+
4100
4109
  //init html value
4101
4110
  jQuery(this._doc.body).html(this._wym._html);
4102
-
4111
+
4103
4112
  //handle events
4104
4113
  var wym = this;
4105
-
4114
+
4106
4115
  this._doc.body.onfocus = function()
4107
4116
  {wym._doc.designMode = "on"; wym._doc = iframe.contentWindow.document;};
4108
4117
  this._doc.onbeforedeactivate = function() {wym.saveCaret();};
@@ -4111,49 +4120,49 @@ WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
4111
4120
  wym.keyup();
4112
4121
  };
4113
4122
  this._doc.onclick = function() {wym.saveCaret();};
4114
-
4123
+
4115
4124
  this._doc.body.onbeforepaste = function() {
4116
4125
  wym._iframe.contentWindow.event.returnValue = false;
4117
4126
  };
4118
-
4127
+
4119
4128
  this._doc.body.onpaste = function() {
4120
4129
  wym._iframe.contentWindow.event.returnValue = false;
4121
4130
  wym.paste(window.clipboardData.getData("Text"));
4122
4131
  };
4123
-
4132
+
4124
4133
  //callback can't be executed twice, so we check
4125
4134
  if(this._initialized) {
4126
-
4135
+
4127
4136
  //pre-bind functions
4128
4137
  if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
4129
-
4138
+
4130
4139
  //bind external events
4131
4140
  this._wym.bindEvents();
4132
-
4141
+
4133
4142
  //post-init functions
4134
4143
  if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
4135
-
4144
+
4136
4145
  //add event listeners to doc elements, e.g. images
4137
4146
  this.listen();
4138
4147
  }
4139
-
4148
+
4140
4149
  this._initialized = true;
4141
-
4150
+
4142
4151
  //init designMode
4143
4152
  this._doc.designMode="on";
4144
4153
  try{
4145
4154
  // (bermi's note) noticed when running unit tests on IE6
4146
4155
  // Is this really needed, it trigger an unexisting property on IE6
4147
- this._doc = iframe.contentWindow.document;
4156
+ this._doc = iframe.contentWindow.document;
4148
4157
  }catch(e){}
4149
4158
  };
4150
4159
 
4151
4160
  WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) {
4152
4161
 
4153
4162
  switch(cmd) {
4154
-
4163
+
4155
4164
  case WYMeditor.INDENT: case WYMeditor.OUTDENT:
4156
-
4165
+
4157
4166
  var container = this.findUp(this.container(), WYMeditor.LI);
4158
4167
  if(container)
4159
4168
  this._doc.execCommand(cmd);
@@ -4163,7 +4172,7 @@ WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) {
4163
4172
  else this._doc.execCommand(cmd);
4164
4173
  break;
4165
4174
  }
4166
-
4175
+
4167
4176
  this.listen();
4168
4177
  };
4169
4178
 
@@ -4282,43 +4291,46 @@ WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) {
4282
4291
 
4283
4292
  this._iframe = iframe;
4284
4293
  this._doc = iframe.contentDocument;
4285
-
4294
+
4286
4295
  //add css rules from options
4287
-
4288
- var styles = this._doc.styleSheets[0];
4296
+
4297
+ var styles = this._doc.styleSheets[0];
4289
4298
  var aCss = eval(this._options.editorStyles);
4290
-
4299
+
4291
4300
  this.addCssRules(this._doc, aCss);
4292
4301
 
4293
4302
  this._doc.title = this._wym._index;
4294
4303
 
4295
4304
  //set the text direction
4296
4305
  jQuery('html', this._doc).attr('dir', this._options.direction);
4297
-
4306
+
4298
4307
  //init html value
4299
4308
  this.html(this._wym._html);
4300
-
4309
+
4301
4310
  //init designMode
4302
4311
  this.enableDesignMode();
4303
-
4312
+
4304
4313
  //pre-bind functions
4305
4314
  if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
4306
-
4315
+
4307
4316
  //bind external events
4308
4317
  this._wym.bindEvents();
4309
-
4318
+
4310
4319
  //bind editor keydown events
4311
4320
  jQuery(this._doc).bind("keydown", this.keydown);
4312
-
4321
+
4313
4322
  //bind editor keyup events
4314
4323
  jQuery(this._doc).bind("keyup", this.keyup);
4315
-
4324
+
4325
+ //bind editor paste events
4326
+ jQuery(this._doc).bind("paste", this.paste);
4327
+
4316
4328
  //bind editor focus events (used to reset designmode - Gecko bug)
4317
4329
  jQuery(this._doc).bind("focus", this.enableDesignMode);
4318
-
4330
+
4319
4331
  //post-init functions
4320
4332
  if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
4321
-
4333
+
4322
4334
  //add event listeners to doc elements, e.g. images
4323
4335
  this.listen();
4324
4336
  };
@@ -4329,20 +4341,20 @@ WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) {
4329
4341
  WYMeditor.WymClassMozilla.prototype.html = function(html) {
4330
4342
 
4331
4343
  if(typeof html === 'string') {
4332
-
4344
+
4333
4345
  //disable designMode
4334
4346
  try { this._doc.designMode = "off"; } catch(e) { };
4335
-
4347
+
4336
4348
  //replace em by i and strong by bold
4337
4349
  //(designMode issue)
4338
4350
  html = html.replace(/<em(\b[^>]*)>/gi, "<i$1>")
4339
4351
  .replace(/<\/em>/gi, "</i>")
4340
4352
  .replace(/<strong(\b[^>]*)>/gi, "<b$1>")
4341
4353
  .replace(/<\/strong>/gi, "</b>");
4342
-
4354
+
4343
4355
  //update the html body
4344
4356
  jQuery(this._doc.body).html(html);
4345
-
4357
+
4346
4358
  //re-init designMode
4347
4359
  this.enableDesignMode();
4348
4360
  }
@@ -4354,9 +4366,9 @@ WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
4354
4366
  if(!this.selected()) return(false);
4355
4367
 
4356
4368
  switch(cmd) {
4357
-
4369
+
4358
4370
  case WYMeditor.INDENT: case WYMeditor.OUTDENT:
4359
- var focusNode = this.selected();
4371
+ var focusNode = this.selected();
4360
4372
  var sel = this._iframe.contentWindow.getSelection();
4361
4373
  var anchorNode = sel.anchorNode;
4362
4374
  if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
@@ -4373,17 +4385,17 @@ WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
4373
4385
  this._doc.execCommand(cmd,'',null);
4374
4386
  }
4375
4387
  break;
4376
-
4388
+
4377
4389
  default:
4378
4390
  if(param) this._doc.execCommand(cmd,'',param);
4379
4391
  else this._doc.execCommand(cmd,'',null);
4380
4392
  }
4381
-
4393
+
4382
4394
  //set to P if parent = BODY
4383
4395
  var container = this.selected();
4384
4396
  if(container.tagName.toLowerCase() == WYMeditor.BODY)
4385
4397
  this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
4386
-
4398
+
4387
4399
  //add event handlers on doc elements
4388
4400
 
4389
4401
  this.listen();
@@ -4395,7 +4407,7 @@ WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
4395
4407
  * @description Returns the selected container
4396
4408
  */
4397
4409
  WYMeditor.WymClassMozilla.prototype.selected = function(upgrade_text_nodes) {
4398
-
4410
+
4399
4411
  if (upgrade_text_nodes == null || upgrade_text_nodes.toString() != "true") { upgrade_text_nodes = false; }
4400
4412
  var sel = this._iframe.contentWindow.getSelection();
4401
4413
  var node = sel.focusNode;
@@ -4424,7 +4436,7 @@ WYMeditor.WymClassMozilla.prototype.selected = function(upgrade_text_nodes) {
4424
4436
  }
4425
4437
  }
4426
4438
  else return(node);
4427
- }
4439
+ }
4428
4440
  else return(null);
4429
4441
  };
4430
4442
 
@@ -4435,10 +4447,10 @@ WYMeditor.WymClassMozilla.prototype.addCssRule = function(styles, oCss) {
4435
4447
 
4436
4448
  //keydown handler, mainly used for keyboard shortcuts
4437
4449
  WYMeditor.WymClassMozilla.prototype.keydown = function(evt) {
4438
-
4450
+
4439
4451
  //'this' is the doc
4440
4452
  var wym = WYMeditor.INSTANCES[this.title];
4441
-
4453
+
4442
4454
  if(evt.ctrlKey){
4443
4455
  if(evt.keyCode == 66){
4444
4456
  //CTRL+b => STRONG
@@ -4458,22 +4470,22 @@ WYMeditor.WymClassMozilla.prototype.keyup = function(evt) {
4458
4470
 
4459
4471
  //'this' is the doc
4460
4472
  var wym = WYMeditor.INSTANCES[this.title];
4461
-
4473
+
4462
4474
  wym._selected_image = null;
4463
4475
  var container = null;
4464
4476
 
4465
4477
  if(evt.keyCode == 13 && !evt.shiftKey) {
4466
-
4478
+
4467
4479
  //RETURN key
4468
4480
  //cleanup <br><br> between paragraphs
4469
4481
  jQuery(wym._doc.body).children(WYMeditor.BR).remove();
4470
-
4482
+
4471
4483
  //fix PRE bug #73
4472
4484
  container = wym.selected();
4473
4485
  if(container && container.tagName.toLowerCase() == WYMeditor.PRE)
4474
4486
  wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //create P after PRE
4475
4487
  }
4476
-
4488
+
4477
4489
  else if(evt.keyCode != 8
4478
4490
  && evt.keyCode != 17
4479
4491
  && evt.keyCode != 46
@@ -4482,26 +4494,47 @@ WYMeditor.WymClassMozilla.prototype.keyup = function(evt) {
4482
4494
  && !evt.ctrlKey) {
4483
4495
  //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
4484
4496
  //text nodes replaced by P
4485
-
4486
- container = wym.selected();
4487
- var name = container.tagName.toLowerCase();
4488
4497
 
4489
- //fix forbidden main containers
4490
- if(
4491
- name == "strong" ||
4492
- name == "b" ||
4493
- name == "em" ||
4494
- name == "i" ||
4495
- name == "sub" ||
4496
- name == "sup" ||
4497
- name == "a"
4498
+ wym.format_block();
4499
+ }
4500
+ };
4498
4501
 
4499
- ) name = container.parentNode.tagName.toLowerCase();
4502
+ WYMeditor.WymClassMozilla.prototype.paste = function(evt) {
4503
+
4504
+ var wym = WYMeditor.INSTANCES[this.title];
4505
+
4506
+ wym.format_block();
4500
4507
 
4501
- if(name == WYMeditor.BODY) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
4502
- }
4503
4508
  };
4504
4509
 
4510
+ WYMeditor.WymClassMozilla.prototype.format_block = function(selected) {
4511
+
4512
+ //'this' should be the wymeditor instance.
4513
+ var wym = this;
4514
+
4515
+ selected = selected || wym.selected();
4516
+
4517
+ wym._selected_image = null;
4518
+ var container = null;
4519
+
4520
+ container = wym.selected();
4521
+ var name = container.tagName.toLowerCase();
4522
+
4523
+ //fix forbidden main containers
4524
+ if(
4525
+ name == "strong" ||
4526
+ name == "b" ||
4527
+ name == "em" ||
4528
+ name == "i" ||
4529
+ name == "sub" ||
4530
+ name == "sup" ||
4531
+ name == "a"
4532
+
4533
+ ) name = container.parentNode.tagName.toLowerCase();
4534
+
4535
+ if(name == WYMeditor.BODY) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
4536
+ }
4537
+
4505
4538
  WYMeditor.WymClassMozilla.prototype.enableDesignMode = function() {
4506
4539
  if(this.designMode == "off") {
4507
4540
  try {
@@ -4536,7 +4569,7 @@ WYMeditor.WymClassMozilla.prototype.openBlockTag = function(tag, attributes)
4536
4569
  return;
4537
4570
  }
4538
4571
  }
4539
-
4572
+
4540
4573
  this.output += this.helper.tag(tag, attributes, true);
4541
4574
  };
4542
4575
 
@@ -4578,9 +4611,9 @@ WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) {
4578
4611
 
4579
4612
  this._iframe = iframe;
4580
4613
  this._doc = iframe.contentWindow.document;
4581
-
4614
+
4582
4615
  //add css rules from options
4583
- var styles = this._doc.styleSheets[0];
4616
+ var styles = this._doc.styleSheets[0];
4584
4617
  var aCss = eval(this._options.editorStyles);
4585
4618
 
4586
4619
  this.addCssRules(this._doc, aCss);
@@ -4589,28 +4622,28 @@ WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) {
4589
4622
 
4590
4623
  //set the text direction
4591
4624
  jQuery('html', this._doc).attr('dir', this._options.direction);
4592
-
4625
+
4593
4626
  //init designMode
4594
4627
  this._doc.designMode = "on";
4595
4628
 
4596
4629
  //init html value
4597
4630
  this.html(this._wym._html);
4598
-
4631
+
4599
4632
  //pre-bind functions
4600
4633
  if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
4601
-
4634
+
4602
4635
  //bind external events
4603
4636
  this._wym.bindEvents();
4604
-
4637
+
4605
4638
  //bind editor keydown events
4606
4639
  jQuery(this._doc).bind("keydown", this.keydown);
4607
-
4640
+
4608
4641
  //bind editor events
4609
4642
  jQuery(this._doc).bind("keyup", this.keyup);
4610
-
4643
+
4611
4644
  //post-init functions
4612
4645
  if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
4613
-
4646
+
4614
4647
  //add event listeners to doc elements, e.g. images
4615
4648
  this.listen();
4616
4649
  };
@@ -4619,7 +4652,7 @@ WYMeditor.WymClassOpera.prototype._exec = function(cmd,param) {
4619
4652
 
4620
4653
  if(param) this._doc.execCommand(cmd,false,param);
4621
4654
  else this._doc.execCommand(cmd);
4622
-
4655
+
4623
4656
  this.listen();
4624
4657
  };
4625
4658
 
@@ -4641,7 +4674,7 @@ WYMeditor.WymClassOpera.prototype.addCssRule = function(styles, oCss) {
4641
4674
 
4642
4675
  //keydown handler
4643
4676
  WYMeditor.WymClassOpera.prototype.keydown = function(evt) {
4644
-
4677
+
4645
4678
  //'this' is the doc
4646
4679
  var wym = WYMeditor.INSTANCES[this.title];
4647
4680
  var sel = wym._iframe.contentWindow.getSelection();
@@ -4705,12 +4738,12 @@ WYMeditor.WymClassSafari.prototype.initIframe = function(iframe) {
4705
4738
 
4706
4739
  this._iframe = iframe;
4707
4740
  this._doc = iframe.contentDocument;
4708
-
4741
+
4709
4742
  //add css rules from options
4710
-
4711
- var styles = this._doc.styleSheets[0];
4743
+
4744
+ var styles = this._doc.styleSheets[0];
4712
4745
  var aCss = eval(this._options.editorStyles);
4713
-
4746
+
4714
4747
  this.addCssRules(this._doc, aCss);
4715
4748
 
4716
4749
  this._doc.title = this._wym._index;
@@ -4720,25 +4753,25 @@ WYMeditor.WymClassSafari.prototype.initIframe = function(iframe) {
4720
4753
 
4721
4754
  //init designMode
4722
4755
  this._doc.designMode = "on";
4723
-
4756
+
4724
4757
  //init html value
4725
4758
  this.html(this._wym._html);
4726
-
4759
+
4727
4760
  //pre-bind functions
4728
4761
  if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
4729
-
4762
+
4730
4763
  //bind external events
4731
4764
  this._wym.bindEvents();
4732
-
4765
+
4733
4766
  //bind editor keydown events
4734
4767
  jQuery(this._doc).bind("keydown", this.keydown);
4735
-
4768
+
4736
4769
  //bind editor keyup events
4737
4770
  jQuery(this._doc).bind("keyup", this.keyup);
4738
-
4771
+
4739
4772
  //post-init functions
4740
4773
  if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
4741
-
4774
+
4742
4775
  //add event listeners to doc elements, e.g. images
4743
4776
  this.listen();
4744
4777
  };
@@ -4748,17 +4781,17 @@ WYMeditor.WymClassSafari.prototype._exec = function(cmd,param) {
4748
4781
  if(!this.selected()) return(false);
4749
4782
 
4750
4783
  switch(cmd) {
4751
-
4784
+
4752
4785
  case WYMeditor.INDENT: case WYMeditor.OUTDENT:
4753
-
4754
- var focusNode = this.selected();
4786
+
4787
+ var focusNode = this.selected();
4755
4788
  var sel = this._iframe.contentWindow.getSelection();
4756
4789
  var anchorNode = sel.anchorNode;
4757
4790
  if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
4758
-
4791
+
4759
4792
  focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
4760
4793
  anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
4761
-
4794
+
4762
4795
  if(focusNode && focusNode == anchorNode
4763
4796
  && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
4764
4797
 
@@ -4783,13 +4816,13 @@ WYMeditor.WymClassSafari.prototype._exec = function(cmd,param) {
4783
4816
  if(container) jQuery(container).replaceWith(jQuery(container).html());
4784
4817
 
4785
4818
  break;
4786
-
4819
+
4787
4820
  default:
4788
4821
 
4789
4822
  if(param) this._doc.execCommand(cmd,'',param);
4790
4823
  else this._doc.execCommand(cmd,'',null);
4791
4824
  }
4792
-
4825
+
4793
4826
  //set to P if parent = BODY
4794
4827
  var container = this.selected();
4795
4828
  if(container && container.tagName.toLowerCase() == WYMeditor.BODY)
@@ -4833,7 +4866,7 @@ WYMeditor.WymClassSafari.prototype.selected = function(upgrade_text_nodes) {
4833
4866
  }
4834
4867
  }
4835
4868
  else return(node);
4836
- }
4869
+ }
4837
4870
  else return(null);
4838
4871
  };
4839
4872
 
@@ -4841,7 +4874,7 @@ WYMeditor.WymClassSafari.prototype.selected = function(upgrade_text_nodes) {
4841
4874
  * @description Toggles class on selected element, or one of its parents
4842
4875
  */
4843
4876
  WYMeditor.WymClassSafari.prototype.toggleClass = function(sClass, jqexpr) {
4844
-
4877
+
4845
4878
  var container = null;
4846
4879
  if (this._selected_image) {
4847
4880
  container = jQuery(this._selected_image);
@@ -4849,7 +4882,7 @@ WYMeditor.WymClassSafari.prototype.toggleClass = function(sClass, jqexpr) {
4849
4882
  else {
4850
4883
  container = jQuery(this.selected(true) || this._selected_item);
4851
4884
  }
4852
-
4885
+
4853
4886
  if (jqexpr != null) { container = jQuery(container.parentsOrSelf(jqexpr)); }
4854
4887
  container.toggleClass(sClass);
4855
4888
  if(!container.attr(WYMeditor.CLASS)) container.removeAttr(this._class);
@@ -4865,10 +4898,10 @@ WYMeditor.WymClassSafari.prototype.addCssRule = function(styles, oCss) {
4865
4898
 
4866
4899
  //keydown handler, mainly used for keyboard shortcuts
4867
4900
  WYMeditor.WymClassSafari.prototype.keydown = function(evt) {
4868
-
4901
+
4869
4902
  //'this' is the doc
4870
4903
  var wym = WYMeditor.INSTANCES[this.title];
4871
-
4904
+
4872
4905
  if(evt.ctrlKey){
4873
4906
  if(evt.keyCode == 66){
4874
4907
  //CTRL+b => STRONG
@@ -4888,16 +4921,16 @@ WYMeditor.WymClassSafari.prototype.keyup = function(evt) {
4888
4921
 
4889
4922
  //'this' is the doc
4890
4923
  var wym = WYMeditor.INSTANCES[this.title];
4891
-
4924
+
4892
4925
  wym._selected_image = null;
4893
4926
  var container = null;
4894
4927
 
4895
4928
  if(evt.keyCode == 13 && !evt.shiftKey) {
4896
-
4929
+
4897
4930
  //RETURN key
4898
4931
  //cleanup <br><br> between paragraphs
4899
4932
  jQuery(wym._doc.body).children(WYMeditor.BR).remove();
4900
-
4933
+
4901
4934
  //fix PRE bug #73
4902
4935
  container = wym.selected();
4903
4936
  if(container && container.tagName.toLowerCase() == WYMeditor.PRE)
@@ -4908,17 +4941,17 @@ WYMeditor.WymClassSafari.prototype.keyup = function(evt) {
4908
4941
  if(evt.keyCode == 13 && evt.shiftKey) {
4909
4942
  wym._exec('InsertLineBreak');
4910
4943
  }
4911
-
4944
+
4912
4945
  if(evt.keyCode != 8
4913
4946
  && evt.keyCode != 17
4914
4947
  && evt.keyCode != 46
4915
4948
  && evt.keyCode != 224
4916
4949
  && !evt.metaKey
4917
4950
  && !evt.ctrlKey) {
4918
-
4951
+
4919
4952
  //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
4920
4953
  //text nodes replaced by P
4921
-
4954
+
4922
4955
  container = wym.selected();
4923
4956
  var name = container.tagName.toLowerCase();
4924
4957
 
@@ -4961,16 +4994,16 @@ WYMeditor.WymClassSafari.prototype.openBlockTag = function(tag, attributes)
4961
4994
  var tag = new_tag;
4962
4995
  this._tag_stack.push(new_tag);
4963
4996
  attributes.style = '';
4964
-
4997
+
4965
4998
  //should fix #125 - also removed the xhtml() override
4966
4999
  if(typeof attributes['class'] == 'string')
4967
5000
  attributes['class'] = attributes['class'].replace(/apple-style-span/gi, '');
4968
-
5001
+
4969
5002
  } else {
4970
5003
  return;
4971
5004
  }
4972
5005
  }
4973
-
5006
+
4974
5007
  this.output += this.helper.tag(tag, attributes, true);
4975
5008
  };
4976
5009
 
@@ -4981,13 +5014,4 @@ WYMeditor.WymClassSafari.prototype.getTagForStyle = function(style) {
4981
5014
  if(/sub/.test(style)) return 'sub';
4982
5015
  if(/super/.test(style)) return 'sup';
4983
5016
  return false;
4984
- };
4985
-
4986
- function titleize(words) {
4987
- parts = [];
4988
- words.gsub(/\./, '').gsub(/[-_]/, ' ').split(' ').each(function(part){
4989
- parts.push(part[0].toUpperCase() + part.substring(1));
4990
- });
4991
-
4992
- return parts.join(" ");
4993
- }
5017
+ };