Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / xhtmlxtras / js / element_common.js
1 /**\r
2  * element_common.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 tinyMCEPopup.requireLangPack();\r
12 \r
13 function initCommonAttributes(elm) {\r
14         var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
15 \r
16         // Setup form data for common element attributes\r
17         setFormValue('title', dom.getAttrib(elm, 'title'));\r
18         setFormValue('id', dom.getAttrib(elm, 'id'));\r
19         selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true);\r
20         setFormValue('style', dom.getAttrib(elm, 'style'));\r
21         selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir'));\r
22         setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
23         setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
24         setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
25         setFormValue('onclick', dom.getAttrib(elm, 'onclick'));\r
26         setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
27         setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
28         setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
29         setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
30         setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
31         setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
32         setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
33         setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
34         setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
35 }\r
36 \r
37 function setFormValue(name, value) {\r
38         if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;\r
39 }\r
40 \r
41 function insertDateTime(id) {\r
42         document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");\r
43 }\r
44 \r
45 function getDateTime(d, fmt) {\r
46         fmt = fmt.replace("%D", "%m/%d/%y");\r
47         fmt = fmt.replace("%r", "%I:%M:%S %p");\r
48         fmt = fmt.replace("%Y", "" + d.getFullYear());\r
49         fmt = fmt.replace("%y", "" + d.getYear());\r
50         fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
51         fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
52         fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
53         fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
54         fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
55         fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
56         fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
57         fmt = fmt.replace("%%", "%");\r
58 \r
59         return fmt;\r
60 }\r
61 \r
62 function addZeros(value, len) {\r
63         var i;\r
64 \r
65         value = "" + value;\r
66 \r
67         if (value.length < len) {\r
68                 for (i=0; i<(len-value.length); i++)\r
69                         value = "0" + value;\r
70         }\r
71 \r
72         return value;\r
73 }\r
74 \r
75 function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
76         if (!form_obj || !form_obj.elements[field_name])\r
77                 return;\r
78 \r
79         var sel = form_obj.elements[field_name];\r
80 \r
81         var found = false;\r
82         for (var i=0; i<sel.options.length; i++) {\r
83                 var option = sel.options[i];\r
84 \r
85                 if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
86                         option.selected = true;\r
87                         found = true;\r
88                 } else\r
89                         option.selected = false;\r
90         }\r
91 \r
92         if (!found && add_custom && value != '') {\r
93                 var option = new Option('Value: ' + value, value);\r
94                 option.selected = true;\r
95                 sel.options[sel.options.length] = option;\r
96         }\r
97 \r
98         return found;\r
99 }\r
100 \r
101 function setAttrib(elm, attrib, value) {\r
102         var formObj = document.forms[0];\r
103         var valueElm = formObj.elements[attrib.toLowerCase()];\r
104         tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value);\r
105 }\r
106 \r
107 function setAllCommonAttribs(elm) {\r
108         setAttrib(elm, 'title');\r
109         setAttrib(elm, 'id');\r
110         setAttrib(elm, 'class');\r
111         setAttrib(elm, 'style');\r
112         setAttrib(elm, 'dir');\r
113         setAttrib(elm, 'lang');\r
114         /*setAttrib(elm, 'onfocus');\r
115         setAttrib(elm, 'onblur');\r
116         setAttrib(elm, 'onclick');\r
117         setAttrib(elm, 'ondblclick');\r
118         setAttrib(elm, 'onmousedown');\r
119         setAttrib(elm, 'onmouseup');\r
120         setAttrib(elm, 'onmouseover');\r
121         setAttrib(elm, 'onmousemove');\r
122         setAttrib(elm, 'onmouseout');\r
123         setAttrib(elm, 'onkeypress');\r
124         setAttrib(elm, 'onkeydown');\r
125         setAttrib(elm, 'onkeyup');*/\r
126 }\r
127 \r
128 SXE = {\r
129         currentAction : "insert",\r
130         inst : tinyMCEPopup.editor,\r
131         updateElement : null\r
132 }\r
133 \r
134 SXE.focusElement = SXE.inst.selection.getNode();\r
135 \r
136 SXE.initElementDialog = function(element_name) {\r
137         addClassesToList('class', 'xhtmlxtras_styles');\r
138         TinyMCE_EditableSelects.init();\r
139 \r
140         element_name = element_name.toLowerCase();\r
141         var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
142         if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) {\r
143                 SXE.currentAction = "update";\r
144         }\r
145 \r
146         if (SXE.currentAction == "update") {\r
147                 initCommonAttributes(elm);\r
148                 SXE.updateElement = elm;\r
149         }\r
150 \r
151         document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); \r
152 }\r
153 \r
154 SXE.insertElement = function(element_name) {\r
155         var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName;\r
156 \r
157         if (elm == null) {\r
158                 var s = SXE.inst.selection.getContent();\r
159                 if(s.length > 0) {\r
160                         tagName = element_name;\r
161 \r
162                         insertInlineElement(element_name);\r
163                         var elementArray = tinymce.grep(SXE.inst.dom.select(element_name));\r
164                         for (var i=0; i<elementArray.length; i++) {\r
165                                 var elm = elementArray[i];\r
166 \r
167                                 if (SXE.inst.dom.getAttrib(elm, 'data-mce-new')) {\r
168                                         elm.id = '';\r
169                                         elm.setAttribute('id', '');\r
170                                         elm.removeAttribute('id');\r
171                                         elm.removeAttribute('data-mce-new');\r
172 \r
173                                         setAllCommonAttribs(elm);\r
174                                 }\r
175                         }\r
176                 }\r
177         } else {\r
178                 setAllCommonAttribs(elm);\r
179         }\r
180         SXE.inst.nodeChanged();\r
181         tinyMCEPopup.execCommand('mceEndUndoLevel');\r
182 }\r
183 \r
184 SXE.removeElement = function(element_name){\r
185         element_name = element_name.toLowerCase();\r
186         elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
187         if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){\r
188                 tinyMCE.execCommand('mceRemoveNode', false, elm);\r
189                 SXE.inst.nodeChanged();\r
190                 tinyMCEPopup.execCommand('mceEndUndoLevel');\r
191         }\r
192 }\r
193 \r
194 SXE.showRemoveButton = function() {\r
195                 document.getElementById("remove").style.display = '';\r
196 }\r
197 \r
198 SXE.containsClass = function(elm,cl) {\r
199         return (elm.className.indexOf(cl) > -1) ? true : false;\r
200 }\r
201 \r
202 SXE.removeClass = function(elm,cl) {\r
203         if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {\r
204                 return true;\r
205         }\r
206         var classNames = elm.className.split(" ");\r
207         var newClassNames = "";\r
208         for (var x = 0, cnl = classNames.length; x < cnl; x++) {\r
209                 if (classNames[x] != cl) {\r
210                         newClassNames += (classNames[x] + " ");\r
211                 }\r
212         }\r
213         elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end\r
214 }\r
215 \r
216 SXE.addClass = function(elm,cl) {\r
217         if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;\r
218         return true;\r
219 }\r
220 \r
221 function insertInlineElement(en) {\r
222         var ed = tinyMCEPopup.editor, dom = ed.dom;\r
223 \r
224         ed.getDoc().execCommand('FontName', false, 'mceinline');\r
225         tinymce.each(dom.select('span,font'), function(n) {\r
226                 if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')\r
227                         dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1);\r
228         });\r
229 }\r