import rt 3.8.7
[freeside.git] / rt / share / html / NoAuth / RichText / FCKeditor / editor / _source / internals / fcktools_ie.js
1 /*\r
2  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
3  * Copyright (C) 2003-2009 Frederico Caldeira Knabben\r
4  *\r
5  * == BEGIN LICENSE ==\r
6  *\r
7  * Licensed under the terms of any of the following licenses at your\r
8  * choice:\r
9  *\r
10  *  - GNU General Public License Version 2 or later (the "GPL")\r
11  *    http://www.gnu.org/licenses/gpl.html\r
12  *\r
13  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
14  *    http://www.gnu.org/licenses/lgpl.html\r
15  *\r
16  *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
17  *    http://www.mozilla.org/MPL/MPL-1.1.html\r
18  *\r
19  * == END LICENSE ==\r
20  *\r
21  * Utility functions. (IE version).\r
22  */\r
23 \r
24 FCKTools.CancelEvent = function( e )\r
25 {\r
26         return false ;\r
27 }\r
28 \r
29 // Appends one or more CSS files to a document.\r
30 FCKTools._AppendStyleSheet = function( documentElement, cssFileUrl )\r
31 {\r
32         return documentElement.createStyleSheet( cssFileUrl ).owningElement ;\r
33 }\r
34 \r
35 // Appends a CSS style string to a document.\r
36 FCKTools.AppendStyleString = function( documentElement, cssStyles )\r
37 {\r
38         if ( !cssStyles )\r
39                 return null ;\r
40 \r
41         var s = documentElement.createStyleSheet( "" ) ;\r
42         s.cssText = cssStyles ;\r
43         return s ;\r
44 }\r
45 \r
46 // Removes all attributes and values from the element.\r
47 FCKTools.ClearElementAttributes = function( element )\r
48 {\r
49         element.clearAttributes() ;\r
50 }\r
51 \r
52 FCKTools.GetAllChildrenIds = function( parentElement )\r
53 {\r
54         var aIds = new Array() ;\r
55         for ( var i = 0 ; i < parentElement.all.length ; i++ )\r
56         {\r
57                 var sId = parentElement.all[i].id ;\r
58                 if ( sId && sId.length > 0 )\r
59                         aIds[ aIds.length ] = sId ;\r
60         }\r
61         return aIds ;\r
62 }\r
63 \r
64 FCKTools.RemoveOuterTags = function( e )\r
65 {\r
66         e.insertAdjacentHTML( 'beforeBegin', e.innerHTML ) ;\r
67         e.parentNode.removeChild( e ) ;\r
68 }\r
69 \r
70 FCKTools.CreateXmlObject = function( object )\r
71 {\r
72         var aObjs ;\r
73 \r
74         switch ( object )\r
75         {\r
76                 case 'XmlHttp' :\r
77                         // Try the native XMLHttpRequest introduced with IE7.\r
78                         if ( document.location.protocol != 'file:' )\r
79                                 try { return new XMLHttpRequest() ; } catch (e) {}\r
80 \r
81                         aObjs = [ 'MSXML2.XmlHttp', 'Microsoft.XmlHttp' ] ;\r
82                         break ;\r
83 \r
84                 case 'DOMDocument' :\r
85                         aObjs = [ 'MSXML2.DOMDocument', 'Microsoft.XmlDom' ] ;\r
86                         break ;\r
87         }\r
88 \r
89         for ( var i = 0 ; i < 2 ; i++ )\r
90         {\r
91                 try { return new ActiveXObject( aObjs[i] ) ; }\r
92                 catch (e)\r
93                 {}\r
94         }\r
95 \r
96         if ( FCKLang.NoActiveX )\r
97         {\r
98                 alert( FCKLang.NoActiveX ) ;\r
99                 FCKLang.NoActiveX = null ;\r
100         }\r
101         return null ;\r
102 }\r
103 \r
104 FCKTools.DisableSelection = function( element )\r
105 {\r
106         element.unselectable = 'on' ;\r
107 \r
108         var e, i = 0 ;\r
109         // The extra () is to avoid a warning with strict error checking. This is ok.\r
110         while ( (e = element.all[ i++ ]) )\r
111         {\r
112                 switch ( e.tagName )\r
113                 {\r
114                         case 'IFRAME' :\r
115                         case 'TEXTAREA' :\r
116                         case 'INPUT' :\r
117                         case 'SELECT' :\r
118                                 /* Ignore the above tags */\r
119                                 break ;\r
120                         default :\r
121                                 e.unselectable = 'on' ;\r
122                 }\r
123         }\r
124 }\r
125 \r
126 FCKTools.GetScrollPosition = function( relativeWindow )\r
127 {\r
128         var oDoc = relativeWindow.document ;\r
129 \r
130         // Try with the doc element.\r
131         var oPos = { X : oDoc.documentElement.scrollLeft, Y : oDoc.documentElement.scrollTop } ;\r
132 \r
133         if ( oPos.X > 0 || oPos.Y > 0 )\r
134                 return oPos ;\r
135 \r
136         // If no scroll, try with the body.\r
137         return { X : oDoc.body.scrollLeft, Y : oDoc.body.scrollTop } ;\r
138 }\r
139 \r
140 FCKTools.AddEventListener = function( sourceObject, eventName, listener )\r
141 {\r
142         sourceObject.attachEvent( 'on' + eventName, listener ) ;\r
143 }\r
144 \r
145 FCKTools.RemoveEventListener = function( sourceObject, eventName, listener )\r
146 {\r
147         sourceObject.detachEvent( 'on' + eventName, listener ) ;\r
148 }\r
149 \r
150 // Listeners attached with this function cannot be detached.\r
151 FCKTools.AddEventListenerEx = function( sourceObject, eventName, listener, paramsArray )\r
152 {\r
153         // Ok... this is a closures party, but is the only way to make it clean of memory leaks.\r
154         var o = new Object() ;\r
155         o.Source = sourceObject ;\r
156         o.Params = paramsArray || [] ;  // Memory leak if we have DOM objects here.\r
157         o.Listener = function( ev )\r
158         {\r
159                 return listener.apply( o.Source, [ ev ].concat( o.Params ) ) ;\r
160         }\r
161 \r
162         if ( FCK.IECleanup )\r
163                 FCK.IECleanup.AddItem( null, function() { o.Source = null ; o.Params = null ; } ) ;\r
164 \r
165         sourceObject.attachEvent( 'on' + eventName, o.Listener ) ;\r
166 \r
167         sourceObject = null ;   // Memory leak cleaner (because of the above closure).\r
168         paramsArray = null ;    // Memory leak cleaner (because of the above closure).\r
169 }\r
170 \r
171 // Returns and object with the "Width" and "Height" properties.\r
172 FCKTools.GetViewPaneSize = function( win )\r
173 {\r
174         var oSizeSource ;\r
175 \r
176         var oDoc = win.document.documentElement ;\r
177         if ( oDoc && oDoc.clientWidth )                         // IE6 Strict Mode\r
178                 oSizeSource = oDoc ;\r
179         else\r
180                 oSizeSource = win.document.body ;               // Other IEs\r
181 \r
182         if ( oSizeSource )\r
183                 return { Width : oSizeSource.clientWidth, Height : oSizeSource.clientHeight } ;\r
184         else\r
185                 return { Width : 0, Height : 0 } ;\r
186 }\r
187 \r
188 FCKTools.SaveStyles = function( element )\r
189 {\r
190         var data = FCKTools.ProtectFormStyles( element ) ;\r
191 \r
192         var oSavedStyles = new Object() ;\r
193 \r
194         if ( element.className.length > 0 )\r
195         {\r
196                 oSavedStyles.Class = element.className ;\r
197                 element.className = '' ;\r
198         }\r
199 \r
200         var sInlineStyle = element.style.cssText ;\r
201 \r
202         if ( sInlineStyle.length > 0 )\r
203         {\r
204                 oSavedStyles.Inline = sInlineStyle ;\r
205                 element.style.cssText = '' ;\r
206         }\r
207 \r
208         FCKTools.RestoreFormStyles( element, data ) ;\r
209         return oSavedStyles ;\r
210 }\r
211 \r
212 FCKTools.RestoreStyles = function( element, savedStyles )\r
213 {\r
214         var data = FCKTools.ProtectFormStyles( element ) ;\r
215         element.className               = savedStyles.Class || '' ;\r
216         element.style.cssText   = savedStyles.Inline || '' ;\r
217         FCKTools.RestoreFormStyles( element, data ) ;\r
218 }\r
219 \r
220 FCKTools.RegisterDollarFunction = function( targetWindow )\r
221 {\r
222         targetWindow.$ = targetWindow.document.getElementById ;\r
223 }\r
224 \r
225 FCKTools.AppendElement = function( target, elementName )\r
226 {\r
227         return target.appendChild( this.GetElementDocument( target ).createElement( elementName ) ) ;\r
228 }\r
229 \r
230 // This function may be used by Regex replacements.\r
231 FCKTools.ToLowerCase = function( strValue )\r
232 {\r
233         return strValue.toLowerCase() ;\r
234 }\r