Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / advlist / editor_plugin_src.js
1 /**\r
2  * editor_plugin_src.js\r
3  *\r
4  * Copyright 2009, Moxiecode Systems AB\r
5  * Released under LGPL License.\r
6  *\r
7  * License: http://tinymce.moxiecode.com/license\r
8  * Contributing: http://tinymce.moxiecode.com/contributing\r
9  */\r
10 \r
11 (function() {\r
12         var each = tinymce.each;\r
13 \r
14         tinymce.create('tinymce.plugins.AdvListPlugin', {\r
15                 init : function(ed, url) {\r
16                         var t = this;\r
17 \r
18                         t.editor = ed;\r
19 \r
20                         function buildFormats(str) {\r
21                                 var formats = [];\r
22 \r
23                                 each(str.split(/,/), function(type) {\r
24                                         formats.push({\r
25                                                 title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')),\r
26                                                 styles : {\r
27                                                         listStyleType : type == 'default' ? '' : type\r
28                                                 }\r
29                                         });\r
30                                 });\r
31 \r
32                                 return formats;\r
33                         };\r
34 \r
35                         // Setup number formats from config or default\r
36                         t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");\r
37                         t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square");\r
38 \r
39                         if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent))\r
40                                 t.isIE7 = true;\r
41                 },\r
42 \r
43                 createControl: function(name, cm) {\r
44                         var t = this, btn, format, editor = t.editor;\r
45 \r
46                         if (name == 'numlist' || name == 'bullist') {\r
47                                 // Default to first item if it's a default item\r
48                                 if (t[name][0].title == 'advlist.def')\r
49                                         format = t[name][0];\r
50 \r
51                                 function hasFormat(node, format) {\r
52                                         var state = true;\r
53 \r
54                                         each(format.styles, function(value, name) {\r
55                                                 // Format doesn't match\r
56                                                 if (editor.dom.getStyle(node, name) != value) {\r
57                                                         state = false;\r
58                                                         return false;\r
59                                                 }\r
60                                         });\r
61 \r
62                                         return state;\r
63                                 };\r
64 \r
65                                 function applyListFormat() {\r
66                                         var list, dom = editor.dom, sel = editor.selection;\r
67 \r
68                                         // Check for existing list element\r
69                                         list = dom.getParent(sel.getNode(), 'ol,ul');\r
70 \r
71                                         // Switch/add list type if needed\r
72                                         if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format))\r
73                                                 editor.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList');\r
74 \r
75                                         // Append styles to new list element\r
76                                         if (format) {\r
77                                                 list = dom.getParent(sel.getNode(), 'ol,ul');\r
78                                                 if (list) {\r
79                                                         dom.setStyles(list, format.styles);\r
80                                                         list.removeAttribute('data-mce-style');\r
81                                                 }\r
82                                         }\r
83 \r
84                                         editor.focus();\r
85                                 };\r
86 \r
87                                 btn = cm.createSplitButton(name, {\r
88                                         title : 'advanced.' + name + '_desc',\r
89                                         'class' : 'mce_' + name,\r
90                                         onclick : function() {\r
91                                                 applyListFormat();\r
92                                         }\r
93                                 });\r
94 \r
95                                 btn.onRenderMenu.add(function(btn, menu) {\r
96                                         menu.onHideMenu.add(function() {\r
97                                                 if (t.bookmark) {\r
98                                                         editor.selection.moveToBookmark(t.bookmark);\r
99                                                         t.bookmark = 0;\r
100                                                 }\r
101                                         });\r
102 \r
103                                         menu.onShowMenu.add(function() {\r
104                                                 var dom = editor.dom, list = dom.getParent(editor.selection.getNode(), 'ol,ul'), fmtList;\r
105 \r
106                                                 if (list || format) {\r
107                                                         fmtList = t[name];\r
108 \r
109                                                         // Unselect existing items\r
110                                                         each(menu.items, function(item) {\r
111                                                                 var state = true;\r
112 \r
113                                                                 item.setSelected(0);\r
114 \r
115                                                                 if (list && !item.isDisabled()) {\r
116                                                                         each(fmtList, function(fmt) {\r
117                                                                                 if (fmt.id == item.id) {\r
118                                                                                         if (!hasFormat(list, fmt)) {\r
119                                                                                                 state = false;\r
120                                                                                                 return false;\r
121                                                                                         }\r
122                                                                                 }\r
123                                                                         });\r
124 \r
125                                                                         if (state)\r
126                                                                                 item.setSelected(1);\r
127                                                                 }\r
128                                                         });\r
129 \r
130                                                         // Select the current format\r
131                                                         if (!list)\r
132                                                                 menu.items[format.id].setSelected(1);\r
133                                                 }\r
134         \r
135                                                 editor.focus();\r
136 \r
137                                                 // IE looses it's selection so store it away and restore it later\r
138                                                 if (tinymce.isIE) {\r
139                                                         t.bookmark = editor.selection.getBookmark(1);\r
140                                                 }\r
141                                         });\r
142 \r
143                                         menu.add({id : editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1);\r
144 \r
145                                         each(t[name], function(item) {\r
146                                                 // IE<8 doesn't support lower-greek, skip it\r
147                                                 if (t.isIE7 && item.styles.listStyleType == 'lower-greek')\r
148                                                         return;\r
149 \r
150                                                 item.id = editor.dom.uniqueId();\r
151 \r
152                                                 menu.add({id : item.id, title : item.title, onclick : function() {\r
153                                                         format = item;\r
154                                                         applyListFormat();\r
155                                                 }});\r
156                                         });\r
157                                 });\r
158 \r
159                                 return btn;\r
160                         }\r
161                 },\r
162 \r
163                 getInfo : function() {\r
164                         return {\r
165                                 longname : 'Advanced lists',\r
166                                 author : 'Moxiecode Systems AB',\r
167                                 authorurl : 'http://tinymce.moxiecode.com',\r
168                                 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist',\r
169                                 version : tinymce.majorVersion + "." + tinymce.minorVersion\r
170                         };\r
171                 }\r
172         });\r
173 \r
174         // Register plugin\r
175         tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin);\r
176 })();