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