noodall-ui 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/lib/noodall/ui/version.rb +1 -1
  2. data/public/images/admin/youtube.gif +0 -0
  3. data/public/javascripts/admin/application.js +1 -1
  4. data/public/javascripts/admin/tiny_mce_config.js +14 -2
  5. data/public/javascripts/admin/tiny_mce_config.js.orig +147 -0
  6. data/public/javascripts/tiny_mce/plugins/addvideo/dialog.htm +19 -0
  7. data/public/javascripts/tiny_mce/plugins/addvideo/editor_plugin.js +1 -0
  8. data/public/javascripts/tiny_mce/plugins/addvideo/editor_plugin_src.js +84 -0
  9. data/public/javascripts/tiny_mce/plugins/addvideo/img/youtube.gif +0 -0
  10. data/public/javascripts/tiny_mce/plugins/addvideo/js/dialog.js +33 -0
  11. data/public/javascripts/tiny_mce/plugins/addvideo/langs/en.js +3 -0
  12. data/public/javascripts/tiny_mce/plugins/addvideo/langs/en_dlg.js +3 -0
  13. data/public/javascripts/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
  14. data/public/javascripts/tiny_mce/plugins/autolink/editor_plugin_src.js +169 -0
  15. data/public/javascripts/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  16. data/public/javascripts/tiny_mce/plugins/lists/editor_plugin_src.js +617 -0
  17. data/public/javascripts/tiny_mce/plugins/media/moxieplayer.swf +0 -0
  18. data/public/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
  19. data/public/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  20. data/public/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  21. data/public/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  22. data/public/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  23. data/public/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  24. data/public/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
  25. data/public/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
  26. data/public/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  27. data/public/javascripts/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  28. data/public/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +23 -0
  29. data/public/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  30. data/public/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +101 -0
  31. data/public/stylesheets/admin/ie.css +9 -0
  32. data/public/stylesheets/admin/ie8.css +10 -0
  33. data/public/stylesheets/admin/layout.css +4 -0
  34. metadata +51 -24
@@ -1,5 +1,5 @@
1
1
  module Noodall
2
2
  module UI
3
- VERSION = "0.3.5"
3
+ VERSION = "0.3.6"
4
4
  end
5
5
  end
Binary file
@@ -40,7 +40,7 @@ function setup_tooltips() {
40
40
  this.title = "";
41
41
  this.width = $(this).width();
42
42
  $(this).find('.tooltip-show').css({
43
- left: this.width - 22
43
+ left: this.width - 80
44
44
  });
45
45
  $('.tooltip-show').fadeIn(400);
46
46
  },
@@ -8,7 +8,7 @@ lite_tiny_mce_config = {
8
8
  editor_selector : "lite-editor",
9
9
  strict_loading_mode : 1,
10
10
  convert_urls : false,
11
- plugins : "safari,inlinepopups,xhtmlxtras,paste,media,advimage,table,media",
11
+ plugins : "safari,inlinepopups,xhtmlxtras,paste,media,advimage,table,media,addvideo",
12
12
  //"safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking",
13
13
  // Theme options
14
14
  theme_advanced_blockformats : "h2,h3,h4,p",
@@ -36,7 +36,7 @@ tiny_mce_config = {};
36
36
  $.extend(tiny_mce_config, lite_tiny_mce_config, {
37
37
  editor_selector : "editor",
38
38
  theme_advanced_buttons1 : "bold,italic,underline,|,formatselect,removeformat ,|,bullist,numlist,|,link,unlink,anchor,|,outdent,indent,blockquote,|,justifyleft,justifycenter,justifyright,justifyfull",
39
- theme_advanced_buttons2 : "table,delete_table,tablecontrols,col_before,col_after,row_before,row_after,delete_col,delete_row,|,code,attribs,image,media, assetbrowser,nodebrowser",
39
+ theme_advanced_buttons2 : "table,delete_table,tablecontrols,col_before,col_after,row_before,row_after,delete_col,delete_row,|,code,attribs,image,media, assetbrowser,nodebrowser,addvideo",
40
40
 
41
41
  setup : function(ed) {
42
42
  // Add a custom button
@@ -98,6 +98,18 @@ $.extend(tiny_mce_config, lite_tiny_mce_config, {
98
98
  'script');
99
99
  }
100
100
  });
101
+
102
+
103
+
104
+ // Adding Videos
105
+ ed.addButton('addvideo', {
106
+ title : 'Add a youtube Video',
107
+ image : '/images/admin/youtube.gif',
108
+ href: '#',
109
+ onclick : function() {
110
+ alert("hi");
111
+ }
112
+ });
101
113
 
102
114
  ed.onPostProcess.add(function(ed, o) {
103
115
  if(o.save){
@@ -0,0 +1,147 @@
1
+ lite_tiny_mce_config = {
2
+ script_url : '/javascripts/tiny_mce/tiny_mce.js',
3
+
4
+ content_css : "/stylesheets/admin/tinymce.css",
5
+
6
+ theme : "advanced",
7
+ mode : "specific_textareas",
8
+ editor_selector : "lite-editor",
9
+ strict_loading_mode : 1,
10
+ convert_urls : false,
11
+ plugins : "safari,inlinepopups,xhtmlxtras,paste,media,advimage,table,media,addvideo",
12
+ //"safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking",
13
+ // Theme options
14
+ theme_advanced_blockformats : "h2,h3,h4,p",
15
+ theme_advanced_buttons1 : "bold,italic,underline,|,bullist,numlist,|,link,unlink,|,table,delete_table,tablecontrols,col_before,col_after,row_before,row_after,delete_col,delete_row",
16
+ theme_advanced_buttons2 : "",
17
+ theme_advanced_buttons3 : "",
18
+ theme_advanced_buttons4 : "",
19
+ theme_advanced_path : false,
20
+ theme_advanced_toolbar_location : "top",
21
+ theme_advanced_toolbar_align : "left",
22
+ theme_advanced_statusbar_location : "bottom",
23
+ theme_advanced_resizing : true,
24
+ theme_advanced_styles : "Footnote=footnote",
25
+
26
+ paste_auto_cleanup_on_paste : true,
27
+ paste_strip_class_attributes : "all",
28
+ paste_remove_spans : true,
29
+ paste_remove_styles : true
30
+
31
+ };
32
+
33
+ tiny_mce_config = {};
34
+
35
+ // add in some bits for the advanced editor
36
+ $.extend(tiny_mce_config, lite_tiny_mce_config, {
37
+ editor_selector : "editor",
38
+ theme_advanced_buttons1 : "bold,italic,underline,|,formatselect,removeformat ,|,bullist,numlist,|,link,unlink,anchor,|,outdent,indent,blockquote,|,justifyleft,justifycenter,justifyright,justifyfull",
39
+ theme_advanced_buttons2 : "table,delete_table,tablecontrols,col_before,col_after,row_before,row_after,delete_col,delete_row,|,code,attribs,image,media, assetbrowser,nodebrowser,addvideo",
40
+
41
+ setup : function(ed) {
42
+ // Add a custom button
43
+ ed.addButton('assetbrowser', {
44
+ title : 'Insert Asset',
45
+ image : '/images/admin/image_small.png',
46
+ href: '#asset-browser',
47
+ onclick : function() {
48
+ <<<<<<< HEAD
49
+ tinyMCE.activeEditor.focus();
50
+ tinyMCE.activeEditor.windowManager.bookmark = tinyMCE.activeEditor.selection.getBookmark();
51
+ Browser.action = function(e) {
52
+ e.stopImmediatePropagation();
53
+ asset_id = Browser.assets_to_add[0]
54
+ =======
55
+ Browser.do_action_and_close = function() {
56
+ asset_id = Browser.assets_to_add[0];
57
+ >>>>>>> 2979ba1... added addvideo plugin, and makes link
58
+ if (asset_id) {
59
+ add_url = $('#asset-' + asset_id).siblings('a.show').attr('href').split('?')[0] + '/add';
60
+ $.get(add_url, { node_id: NoodallNode.id() }, function(data) {
61
+ $('#asset-browser').html(data);
62
+
63
+ choices = $('#asset-browser .choice');
64
+ if (choices.length > 0) {
65
+ $.each(choices, function(i, choice){
66
+ $(choice).click(function(e){
67
+ tinyMCE.activeEditor.selection.moveToBookmark(tinyMCE.activeEditor.windowManager.bookmark);
68
+ tinyMCE.activeEditor.selection.setContent($(this).html());
69
+ $.fancybox.close();
70
+ return false;
71
+ });
72
+ });
73
+ } else {
74
+ tinyMCE.activeEditor.selection.moveToBookmark(tinyMCE.activeEditor.windowManager.bookmark);
75
+ tinyMCE.activeEditor.selection.setContent(data);
76
+ $.fancybox.close();
77
+ return false;
78
+ }
79
+ }, 'html');
80
+ }
81
+ return false;
82
+ };
83
+ Browser.open();
84
+ }
85
+ });
86
+
87
+ ed.addButton('nodebrowser', {
88
+ title : 'Insert an internal link',
89
+ image : '/images/admin/top-level_small.png',
90
+ href: '#asset-browser',
91
+ onclick : function() {
92
+ tinyMCE.activeEditor.focus();
93
+ tinyMCE.activeEditor.windowManager.bookmark = tinyMCE.activeEditor.selection.getBookmark();
94
+ // open asset lightbox
95
+ $.get("/admin/nodes/tree", function() {
96
+ // reopen the opening form if you close this form
97
+ $.fancybox({
98
+ href: '#tree-browser',
99
+ title: "Link to content"
100
+ });
101
+ $('#tree-browser').attr('class', 'tinymce');
102
+ },
103
+ 'script');
104
+ }
105
+ });
106
+
107
+ ed.onPostProcess.add(function(ed, o) {
108
+ if(o.save){
109
+ // remove mce empty spans
110
+ o.content = o.content.replace(/<span id=._mce_start. .*?><\/span>/ig, '');
111
+ }
112
+ });
113
+
114
+ // wow what a hack: insert a containing span for the page name if nothing is selected,
115
+ // then insert the link, then remove containing span after all is good
116
+ $('#tree-browser.tinymce li a').live('click', function(event) {
117
+ add_url = $(this).attr('href').split('?')[0];
118
+ tinyMCE.activeEditor.selection.moveToBookmark(tinyMCE.activeEditor.windowManager.bookmark);
119
+
120
+ if(tinyMCE.activeEditor.selection.getContent().length === 0){
121
+ tinyMCE.execInstanceCommand(tinyMCE.activeEditor.id, 'mceInsertRawHTML', false, '<span class="tmp_tag">' + $(this).text() + '</span>');
122
+ spans = tinyMCE.activeEditor.dom.select('span');
123
+
124
+ $.each(spans, function(i, span){
125
+ if($(span).hasClass('tmp_tag')) {
126
+ tinyMCE.activeEditor.selection.select(span);
127
+ }
128
+ });
129
+ }
130
+
131
+ tinyMCE.execInstanceCommand(tinyMCE.activeEditor.id, 'mceInsertLink', false, add_url, true);
132
+ $.fancybox.close();
133
+
134
+ tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent().replace(/<span class="tmp_tag">(.*?)<\/span>/i, "$1"));
135
+
136
+ event.stopImmediatePropagation();
137
+ return false;
138
+ });
139
+
140
+ }
141
+ });
142
+
143
+
144
+
145
+ $(function() {
146
+ $('textarea.editor').tinymce(tiny_mce_config);
147
+ });
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title>{#addvideo_dlg.title}</title>
5
+ <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
6
+ <script type="text/javascript" src="js/dialog.js"></script>
7
+ </head>
8
+ <body>
9
+ <form onsubmit="AddvideoDialog.insert();return false;" action="#">
10
+ <p>Please enter the details of your video</p>
11
+ <p>Video Title: <input id="videotitle" name="videotitle" type="text" class="text" /></p>
12
+ <p>Video URL: <input id="videourl" name="videourl" type="text" class="text" /></p>
13
+ <div class="mceActionPanel">
14
+ <input type="button" id="insert" name="insert" value="{#insert}" onclick="AddvideoDialog.insert();" />
15
+ <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
16
+ </div>
17
+ </form>
18
+ </body>
19
+ </html>
@@ -0,0 +1 @@
1
+ (function(){tinymce.PluginManager.requireLangPack('addvideo');tinymce.create('tinymce.plugins.AddvideoPlugin',{init:function(ed,url){ed.addCommand('mceAddvideo',function(){ed.windowManager.open({file:url+'/dialog.htm',width:320+parseInt(ed.getLang('addvideo.delta_width',0)),height:120+parseInt(ed.getLang('addvideo.delta_height',0)),inline:1},{plugin_url:url,some_custom_arg:'custom arg'})});ed.addButton('addvideo',{title:'addvideo.desc',cmd:'mceAddvideo',image:url+'/img/youtube.gif'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('youtube',n.nodeName=='IMG')})},createControl:function(n,cm){return null},getInfo:function(){return{longname:'Addvideo plugin',author:'Some author',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/addvideo',version:"1.0"}}});tinymce.PluginManager.add('addvideo',tinymce.plugins.AddvideoPlugin)})();
@@ -0,0 +1,84 @@
1
+ /**
2
+ * editor_plugin_src.js
3
+ *
4
+ * Copyright 2009, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
9
+ */
10
+
11
+ (function() {
12
+ // Load plugin specific language pack
13
+ tinymce.PluginManager.requireLangPack('addvideo');
14
+
15
+ tinymce.create('tinymce.plugins.AddvideoPlugin', {
16
+ /**
17
+ * Initializes the plugin, this will be executed after the plugin has been created.
18
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
19
+ * of the editor instance to intercept that event.
20
+ *
21
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
22
+ * @param {string} url Absolute URL to where the plugin is located.
23
+ */
24
+ init : function(ed, url) {
25
+ // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
26
+ ed.addCommand('mceAddvideo', function() {
27
+ ed.windowManager.open({
28
+ file : url + '/dialog.htm',
29
+ width : 320 + parseInt(ed.getLang('addvideo.delta_width', 0)),
30
+ height : 120 + parseInt(ed.getLang('addvideo.delta_height', 0)),
31
+ inline : 1
32
+ }, {
33
+ plugin_url : url, // Plugin absolute URL
34
+ some_custom_arg : 'custom arg' // Custom argument
35
+ });
36
+ });
37
+
38
+ // Register addvideo button
39
+ ed.addButton('addvideo', {
40
+ title : 'addvideo.desc',
41
+ cmd : 'mceAddvideo',
42
+ image : url + '/img/youtube.gif'
43
+ });
44
+
45
+ // Add a node change handler, selects the button in the UI when a image is selected
46
+ ed.onNodeChange.add(function(ed, cm, n) {
47
+ cm.setActive('youtube', n.nodeName == 'IMG');
48
+ });
49
+ },
50
+
51
+ /**
52
+ * Creates control instances based in the incomming name. This method is normally not
53
+ * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons
54
+ * but you sometimes need to create more complex controls like listboxes, split buttons etc then this
55
+ * method can be used to create those.
56
+ *
57
+ * @param {String} n Name of the control to create.
58
+ * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.
59
+ * @return {tinymce.ui.Control} New control instance or null if no control was created.
60
+ */
61
+ createControl : function(n, cm) {
62
+ return null;
63
+ },
64
+
65
+ /**
66
+ * Returns information about the plugin as a name/value array.
67
+ * The current keys are longname, author, authorurl, infourl and version.
68
+ *
69
+ * @return {Object} Name/value array containing information about the plugin.
70
+ */
71
+ getInfo : function() {
72
+ return {
73
+ longname : 'Addvideo plugin',
74
+ author : 'Some author',
75
+ authorurl : 'http://tinymce.moxiecode.com',
76
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/addvideo',
77
+ version : "1.0"
78
+ };
79
+ }
80
+ });
81
+
82
+ // Register plugin
83
+ tinymce.PluginManager.add('addvideo', tinymce.plugins.AddvideoPlugin);
84
+ })();
@@ -0,0 +1,33 @@
1
+ tinyMCEPopup.requireLangPack();
2
+
3
+ var AddvideoDialog = {
4
+ init : function() {
5
+ var f = document.forms[0];
6
+
7
+ // Get the selected contents as text and place it in the input
8
+ f.videourl.value = tinyMCEPopup.editor.selection.getContent({format : 'text'});
9
+ f.videtitle.value = tinyMCEPopup.editor.selection.getContent({format : 'text'});
10
+ },
11
+
12
+ insert : function() {
13
+ // Insert the contents from the input into the document
14
+
15
+ // VIDEO URL
16
+ var url = document.forms[0].videourl.value;
17
+
18
+ // VIDEO Title
19
+ var title = document.forms[0].videotitle.value;
20
+
21
+ // REGEXP
22
+ var re=new RegExp(/http:\/\/([^\s\.]+).(youtube.com\/watch\?v=)([A-Za-z0-9\-]+)([^\s]*)/);
23
+
24
+ // VIDEO ID
25
+ var videoid = re.exec(url);
26
+
27
+ // Add Link and img to the body
28
+ tinyMCEPopup.editor.execCommand('mceInsertContent', false, "<a href='" + url + "' title='" + title + "'><img src='http://img.youtube.com/vi/" + videoid[3] + videoid[4] + "/1.jpg' alt='" + title + "' /></a>");
29
+ tinyMCEPopup.close();
30
+ }
31
+ };
32
+
33
+ tinyMCEPopup.onInit.add(AddvideoDialog.init, AddvideoDialog);
@@ -0,0 +1,3 @@
1
+ tinyMCE.addI18n('en.addvideo',{
2
+ desc : 'This is just a template button'
3
+ });
@@ -0,0 +1,3 @@
1
+ tinyMCE.addI18n('en.addvideo_dlg',{
2
+ title : 'This is just a example title'
3
+ });
@@ -0,0 +1 @@
1
+ (function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;if(tinyMCE.isIE){return}a.onKeyDown.add(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}if(f.shiftKey&&f.keyCode==48){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng().cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("mceInsertLink",false,h[1]+h[2]);i.selection.moveToBookmark(k);if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})();
@@ -0,0 +1,169 @@
1
+ /**
2
+ * editor_plugin_src.js
3
+ *
4
+ * Copyright 2011, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
9
+ */
10
+
11
+ (function() {
12
+ tinymce.create('tinymce.plugins.AutolinkPlugin', {
13
+ /**
14
+ * Initializes the plugin, this will be executed after the plugin has been created.
15
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
16
+ * of the editor instance to intercept that event.
17
+ *
18
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
19
+ * @param {string} url Absolute URL to where the plugin is located.
20
+ */
21
+
22
+ init : function(ed, url) {
23
+ var t = this;
24
+
25
+ // Internet Explorer has built-in automatic linking
26
+ if (tinyMCE.isIE)
27
+ return;
28
+
29
+ // Add a key down handler
30
+ ed.onKeyDown.add(function(ed, e) {
31
+ if (e.keyCode == 13)
32
+ return t.handleEnter(ed);
33
+ if (e.shiftKey && e.keyCode == 48)
34
+ return t.handleEclipse(ed);
35
+ });
36
+
37
+ // Add a key up handler
38
+ ed.onKeyUp.add(function(ed, e) {
39
+ if (e.keyCode == 32)
40
+ return t.handleSpacebar(ed);
41
+ });
42
+ },
43
+
44
+ handleEclipse : function(ed) {
45
+ this.parseCurrentLine(ed, -1, '(', true);
46
+ },
47
+
48
+ handleSpacebar : function(ed) {
49
+ this.parseCurrentLine(ed, 0, '', true);
50
+ },
51
+
52
+ handleEnter : function(ed) {
53
+ this.parseCurrentLine(ed, -1, '', false);
54
+ },
55
+
56
+ parseCurrentLine : function(ed, end_offset, delimiter, goback) {
57
+ var r, end, start, endContainer, bookmark, text, matches, prev, len;
58
+
59
+ // We need at least five characters to form a URL,
60
+ // hence, at minimum, five characters from the beginning of the line.
61
+ r = ed.selection.getRng().cloneRange();
62
+ if (r.startOffset < 5) {
63
+ // During testing, the caret is placed inbetween two text nodes.
64
+ // The previous text node contains the URL.
65
+ prev = r.endContainer.previousSibling;
66
+ if (prev == null) {
67
+ if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null)
68
+ return;
69
+
70
+ prev = r.endContainer.firstChild.nextSibling;
71
+ }
72
+ len = prev.length;
73
+ r.setStart(prev, len);
74
+ r.setEnd(prev, len);
75
+
76
+ if (r.endOffset < 5)
77
+ return;
78
+
79
+ end = r.endOffset;
80
+ endContainer = prev;
81
+ } else {
82
+ endContainer = r.endContainer;
83
+
84
+ // Get a text node
85
+ if (endContainer.nodeType != 3 && endContainer.firstChild) {
86
+ while (endContainer.nodeType != 3 && endContainer.firstChild)
87
+ endContainer = endContainer.firstChild;
88
+
89
+ r.setStart(endContainer, 0);
90
+ r.setEnd(endContainer, endContainer.nodeValue.length);
91
+ }
92
+
93
+ if (r.endOffset == 1)
94
+ end = 2;
95
+ else
96
+ end = r.endOffset - 1 - end_offset;
97
+ }
98
+
99
+ start = end;
100
+
101
+ do
102
+ {
103
+ // Move the selection one character backwards.
104
+ r.setStart(endContainer, end - 2);
105
+ r.setEnd(endContainer, end - 1);
106
+ end -= 1;
107
+
108
+ // Loop until one of the following is found: a blank space, &nbsp;, delimeter, (end-2) >= 0
109
+ } while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter);
110
+
111
+ if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) {
112
+ r.setStart(endContainer, end);
113
+ r.setEnd(endContainer, start);
114
+ end += 1;
115
+ } else if (r.startOffset == 0) {
116
+ r.setStart(endContainer, 0);
117
+ r.setEnd(endContainer, start);
118
+ }
119
+ else {
120
+ r.setStart(endContainer, end);
121
+ r.setEnd(endContainer, start);
122
+ }
123
+
124
+ text = r.toString();
125
+ matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);
126
+
127
+ if (matches) {
128
+ if (matches[1] == 'www.') {
129
+ matches[1] = 'http://www.';
130
+ }
131
+
132
+ bookmark = ed.selection.getBookmark();
133
+
134
+ ed.selection.setRng(r);
135
+ tinyMCE.execCommand('mceInsertLink',false, matches[1] + matches[2]);
136
+ ed.selection.moveToBookmark(bookmark);
137
+
138
+ // TODO: Determine if this is still needed.
139
+ if (tinyMCE.isWebKit) {
140
+ // move the caret to its original position
141
+ ed.selection.collapse(false);
142
+ var max = Math.min(endContainer.length, start + 1);
143
+ r.setStart(endContainer, max);
144
+ r.setEnd(endContainer, max);
145
+ ed.selection.setRng(r);
146
+ }
147
+ }
148
+ },
149
+
150
+ /**
151
+ * Returns information about the plugin as a name/value array.
152
+ * The current keys are longname, author, authorurl, infourl and version.
153
+ *
154
+ * @return {Object} Name/value array containing information about the plugin.
155
+ */
156
+ getInfo : function() {
157
+ return {
158
+ longname : 'Autolink',
159
+ author : 'Moxiecode Systems AB',
160
+ authorurl : 'http://tinymce.moxiecode.com',
161
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink',
162
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
163
+ };
164
+ }
165
+ });
166
+
167
+ // Register plugin
168
+ tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin);
169
+ })();
@@ -0,0 +1 @@
1
+ (function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{if(v&&u.tagName==="P"&&t.tagName==="P"){return true}else{return false}}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(u,v){var s=false;function x(y){return y.keyCode===9&&(u.queryCommandState("InsertUnorderedList")||u.queryCommandState("InsertOrderedList"))}function w(y,A){var z=y.selection,B;if(A.keyCode===13){B=z.getStart();s=z.isCollapsed()&&B&&B.tagName==="LI"&&B.childNodes.length===0;return s}}function t(y,z){if(x(z)||w(y,z)){return r.cancel(z)}}this.ed=u;u.addCommand("Indent",this.indent,this);u.addCommand("Outdent",this.outdent,this);u.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);u.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);u.onInit.add(function(){u.editorCommands.addCommands({outdent:function(){var z=u.selection,A=u.dom;function y(B){B=A.getParent(B,A.isBlock);return B&&(parseInt(u.dom.getStyle(B,"margin-left")||0,10)+parseInt(u.dom.getStyle(B,"padding-left")||0,10))>0}return y(z.getStart())||y(z.getEnd())||u.queryCommandState("InsertOrderedList")||u.queryCommandState("InsertUnorderedList")}},"state")});u.onKeyUp.add(function(z,A){var B,y;if(x(A)){z.execCommand(A.shiftKey?"Outdent":"Indent",true,null);return r.cancel(A)}else{if(s&&w(z,A)){if(z.queryCommandState("InsertOrderedList")){z.execCommand("InsertOrderedList")}else{z.execCommand("InsertUnorderedList")}B=z.selection.getStart();if(B&&B.tagName==="LI"){B=z.dom.getParent(B,"ol,ul").nextSibling;if(B&&B.tagName==="P"){if(!B.firstChild){B.appendChild(z.getDoc().createTextNode(""))}y=z.dom.createRng();y.setStart(B.firstChild,1);y.setEnd(B.firstChild,1);z.selection.setRng(y)}}return r.cancel(A)}}});u.onKeyPress.add(t);u.onKeyDown.add(t)},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O,Q){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(M.tagName==="P"||G.length>1){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true);return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(Q,L,O){var t,P=Q,N,M;while(!I.isBlock(Q.parentNode)&&Q.parentNode!==I.getRoot()){Q=I.split(Q.parentNode,Q.previousSibling);Q=Q.nextSibling;P=Q}if(O){t=O.cloneNode(true);Q.parentNode.insertBefore(t,Q);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");Q.parentNode.insertBefore(t,Q)}while(P&&P!=L){N=P.nextSibling;t.appendChild(P);P=N}if(t.childNodes.length===0){t.innerHTML='<br _mce_bogus="1" />'}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(V){var U;if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(P(N,V)){I.addClass(V,"_mce_tagged_br");N=S(V)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D}}else{B={defaultAction:x}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true)})},outdent:function(){var v=this,u=v.ed,w=u.dom,s=[];function x(t){var z,y,A;if(!d(u,t,s)){if(w.getStyle(t,"margin-left")!==""||w.getStyle(t,"padding-left")!==""){return v.adjustPaddingFunction(false)(t)}A=w.getStyle(t,"text-align",true);if(A==="center"||A==="right"){w.setStyle(t,"text-align","left");return}t=c(t,w);z=t.parentNode;y=t.parentNode.parentNode;if(y.tagName==="P"){w.split(y,t.parentNode)}else{w.split(z,t);if(y.tagName==="LI"){w.split(y,t)}else{if(!w.is(y,"ol,ul")){w.rename(t,"p")}}}s.push(t)}}this.process({LI:x,defaultAction:this.adjustPaddingFunction(false)});e(s,m)},process:function(x){var B=this,v=B.ed.selection,y=B.ed.dom,A,s;function w(t){y.removeClass(t,"_mce_act_on");if(!t||t.nodeType!==1){return}t=k(t,y);var C=x[t.tagName];if(!C){C=x.defaultAction}C(t)}function u(t){B.splitSafeEach(t.childNodes,w)}function z(t,C){return C>=0&&t.hasChildNodes()&&C<t.childNodes.length&&t.childNodes[C].tagName==="BR"}A=v.getSelectedBlocks();if(A.length===0){A=[y.getRoot()]}s=v.getRng(true);if(!s.collapsed){if(z(s.endContainer,s.endOffset-1)){s.setEnd(s.endContainer,s.endOffset-1);v.setRng(s)}if(z(s.startContainer,s.startOffset)){s.setStart(s.startContainer,s.startOffset+1);v.setRng(s)}}g=v.getBookmark();x.OL=x.UL=u;B.splitSafeEach(A,w);v.moveToBookmark(g);g=null;B.ed.execCommand("mceRepaint")},splitSafeEach:function(t,s){if(tinymce.isGecko&&(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent)||/Firefox\/3\.[0-4]/.test(navigator.userAgent))){this.classBasedEach(t,s)}else{e(t,s)}},classBasedEach:function(v,u){var w=this.ed.dom,s,t;e(v,function(x){w.addClass(x,"_mce_act_on")});s=w.select("._mce_act_on");while(s.length>0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());