source: sandbox/filemanager/tp/fckeditor/fckeditor.js @ 1575

Revision 1575, 9.4 KB checked in by amuller, 14 years ago (diff)

Ticket #597 - Implentação, melhorias do modulo gerenciador de arquivos

  • Property svn:executable set to *
Line 
1/*
2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
4 *
5 * == BEGIN LICENSE ==
6 *
7 * Licensed under the terms of any of the following licenses at your
8 * choice:
9 *
10 *  - GNU General Public License Version 2 or later (the "GPL")
11 *    http://www.gnu.org/licenses/gpl.html
12 *
13 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14 *    http://www.gnu.org/licenses/lgpl.html
15 *
16 *  - Mozilla Public License Version 1.1 or later (the "MPL")
17 *    http://www.mozilla.org/MPL/MPL-1.1.html
18 *
19 * == END LICENSE ==
20 *
21 * This is the integration file for JavaScript.
22 *
23 * It defines the FCKeditor class that can be used to create editor
24 * instances in a HTML page in the client side. For server side
25 * operations, use the specific integration system.
26 */
27
28// FCKeditor Class
29var FCKeditor = function( instanceName, width, height, toolbarSet, value )
30{
31        // Properties
32        this.InstanceName       = instanceName ;
33        this.Width                      = width                 || '100%' ;
34        this.Height                     = height                || '200' ;
35        this.ToolbarSet         = toolbarSet    || 'Default' ;
36        this.Value                      = value                 || '' ;
37        this.BasePath           = FCKeditor.BasePath ;
38        this.CheckBrowser       = true ;
39        this.DisplayErrors      = true ;
40
41        this.Config                     = new Object() ;
42
43        // Events
44        this.OnError            = null ;        // function( source, errorNumber, errorDescription )
45}
46
47/**
48 * This is the default BasePath used by all editor instances.
49 */
50FCKeditor.BasePath = '/fckeditor/' ;
51
52/**
53 * The minimum height used when replacing textareas.
54 */
55FCKeditor.MinHeight = 200 ;
56
57/**
58 * The minimum width used when replacing textareas.
59 */
60FCKeditor.MinWidth = 750 ;
61
62FCKeditor.prototype.Version                     = '2.6.5' ;
63FCKeditor.prototype.VersionBuild        = '23959' ;
64
65FCKeditor.prototype.Create = function()
66{
67        document.write( this.CreateHtml() ) ;
68}
69
70FCKeditor.prototype.CreateHtml = function()
71{
72        // Check for errors
73        if ( !this.InstanceName || this.InstanceName.length == 0 )
74        {
75                this._ThrowError( 701, 'You must specify an instance name.' ) ;
76                return '' ;
77        }
78
79        var sHtml = '' ;
80
81        if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
82        {
83                sHtml += '<input type="hidden" id="' + this.InstanceName + '" name="' + this.InstanceName + '" value="' + this._HTMLEncode( this.Value ) + '" style="display:none" />' ;
84                sHtml += this._GetConfigHtml() ;
85                sHtml += this._GetIFrameHtml() ;
86        }
87        else
88        {
89                var sWidth  = this.Width.toString().indexOf('%')  > 0 ? this.Width  : this.Width  + 'px' ;
90                var sHeight = this.Height.toString().indexOf('%') > 0 ? this.Height : this.Height + 'px' ;
91
92                sHtml += '<textarea name="' + this.InstanceName +
93                        '" rows="4" cols="40" style="width:' + sWidth +
94                        ';height:' + sHeight ;
95
96                if ( this.TabIndex )
97                        sHtml += '" tabindex="' + this.TabIndex ;
98
99                sHtml += '">' +
100                        this._HTMLEncode( this.Value ) +
101                        '<\/textarea>' ;
102        }
103
104        return sHtml ;
105}
106
107FCKeditor.prototype.ReplaceTextarea = function()
108{
109        if ( document.getElementById( this.InstanceName + '___Frame' ) )
110                return ;
111        if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
112        {
113                // We must check the elements firstly using the Id and then the name.
114                var oTextarea = document.getElementById( this.InstanceName ) ;
115                var colElementsByName = document.getElementsByName( this.InstanceName ) ;
116                var i = 0;
117                while ( oTextarea || i == 0 )
118                {
119                        if ( oTextarea && oTextarea.tagName.toLowerCase() == 'textarea' )
120                                break ;
121                        oTextarea = colElementsByName[i++] ;
122                }
123
124                if ( !oTextarea )
125                {
126                        alert( 'Error: The TEXTAREA with id or name set to "' + this.InstanceName + '" was not found' ) ;
127                        return ;
128                }
129
130                oTextarea.style.display = 'none' ;
131
132                if ( oTextarea.tabIndex )
133                        this.TabIndex = oTextarea.tabIndex ;
134
135                this._InsertHtmlBefore( this._GetConfigHtml(), oTextarea ) ;
136                this._InsertHtmlBefore( this._GetIFrameHtml(), oTextarea ) ;
137        }
138}
139
140FCKeditor.prototype._InsertHtmlBefore = function( html, element )
141{
142        if ( element.insertAdjacentHTML )       // IE
143                element.insertAdjacentHTML( 'beforeBegin', html ) ;
144        else                                                            // Gecko
145        {
146                var oRange = document.createRange() ;
147                oRange.setStartBefore( element ) ;
148                var oFragment = oRange.createContextualFragment( html );
149                element.parentNode.insertBefore( oFragment, element ) ;
150        }
151}
152
153FCKeditor.prototype._GetConfigHtml = function()
154{
155        var sConfig = '' ;
156        for ( var o in this.Config )
157        {
158                if ( sConfig.length > 0 ) sConfig += '&amp;' ;
159                sConfig += encodeURIComponent( o ) + '=' + encodeURIComponent( this.Config[o] ) ;
160        }
161
162        return '<input type="hidden" id="' + this.InstanceName + '___Config" value="' + sConfig + '" style="display:none" />' ;
163}
164
165FCKeditor.prototype._GetIFrameHtml = function()
166{
167        var sFile = 'fckeditor.html' ;
168
169        try
170        {
171                if ( (/fcksource=true/i).test( window.top.location.search ) )
172                        sFile = 'fckeditor.original.html' ;
173        }
174        catch (e) { /* Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error). */ }
175
176        var sLink = this.BasePath + 'editor/' + sFile + '?InstanceName=' + encodeURIComponent( this.InstanceName ) ;
177        if (this.ToolbarSet)
178                sLink += '&amp;Toolbar=' + this.ToolbarSet ;
179
180        var html = '<iframe id="' + this.InstanceName +
181                '___Frame" src="' + sLink +
182                '" width="' + this.Width +
183                '" height="' + this.Height ;
184
185        if ( this.TabIndex )
186                html += '" tabindex="' + this.TabIndex ;
187
188        html += '" frameborder="0" scrolling="no"></iframe>' ;
189
190        return html ;
191}
192
193FCKeditor.prototype._IsCompatibleBrowser = function()
194{
195        return FCKeditor_IsCompatibleBrowser() ;
196}
197
198FCKeditor.prototype._ThrowError = function( errorNumber, errorDescription )
199{
200        this.ErrorNumber                = errorNumber ;
201        this.ErrorDescription   = errorDescription ;
202
203        if ( this.DisplayErrors )
204        {
205                document.write( '<div style="COLOR: #ff0000">' ) ;
206                document.write( '[ FCKeditor Error ' + this.ErrorNumber + ': ' + this.ErrorDescription + ' ]' ) ;
207                document.write( '</div>' ) ;
208        }
209
210        if ( typeof( this.OnError ) == 'function' )
211                this.OnError( this, errorNumber, errorDescription ) ;
212}
213
214FCKeditor.prototype._HTMLEncode = function( text )
215{
216        if ( typeof( text ) != "string" )
217                text = text.toString() ;
218
219        text = text.replace(
220                /&/g, "&amp;").replace(
221                /"/g, "&quot;").replace(
222                /</g, "&lt;").replace(
223                />/g, "&gt;") ;
224
225        return text ;
226}
227
228;(function()
229{
230        var textareaToEditor = function( textarea )
231        {
232                var editor = new FCKeditor( textarea.name ) ;
233
234                editor.Width = Math.max( textarea.offsetWidth, FCKeditor.MinWidth ) ;
235                editor.Height = Math.max( textarea.offsetHeight, FCKeditor.MinHeight ) ;
236
237                return editor ;
238        }
239
240        /**
241         * Replace all <textarea> elements available in the document with FCKeditor
242         * instances.
243         *
244         *      // Replace all <textarea> elements in the page.
245         *      FCKeditor.ReplaceAllTextareas() ;
246         *
247         *      // Replace all <textarea class="myClassName"> elements in the page.
248         *      FCKeditor.ReplaceAllTextareas( 'myClassName' ) ;
249         *
250         *      // Selectively replace <textarea> elements, based on custom assertions.
251         *      FCKeditor.ReplaceAllTextareas( function( textarea, editor )
252         *              {
253         *                      // Custom code to evaluate the replace, returning false if it
254         *                      // must not be done.
255         *                      // It also passes the "editor" parameter, so the developer can
256         *                      // customize the instance.
257         *              } ) ;
258         */
259        FCKeditor.ReplaceAllTextareas = function()
260        {
261                var textareas = document.getElementsByTagName( 'textarea' ) ;
262
263                for ( var i = 0 ; i < textareas.length ; i++ )
264                {
265                        var editor = null ;
266                        var textarea = textareas[i] ;
267                        var name = textarea.name ;
268
269                        // The "name" attribute must exist.
270                        if ( !name || name.length == 0 )
271                                continue ;
272
273                        if ( typeof arguments[0] == 'string' )
274                        {
275                                // The textarea class name could be passed as the function
276                                // parameter.
277
278                                var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' ) ;
279
280                                if ( !classRegex.test( textarea.className ) )
281                                        continue ;
282                        }
283                        else if ( typeof arguments[0] == 'function' )
284                        {
285                                // An assertion function could be passed as the function parameter.
286                                // It must explicitly return "false" to ignore a specific <textarea>.
287                                editor = textareaToEditor( textarea ) ;
288                                if ( arguments[0]( textarea, editor ) === false )
289                                        continue ;
290                        }
291
292                        if ( !editor )
293                                editor = textareaToEditor( textarea ) ;
294
295                        editor.ReplaceTextarea() ;
296                }
297        }
298})() ;
299
300function FCKeditor_IsCompatibleBrowser()
301{
302        var sAgent = navigator.userAgent.toLowerCase() ;
303
304        // Internet Explorer 5.5+
305        if ( /*@cc_on!@*/false && sAgent.indexOf("mac") == -1 )
306        {
307                var sBrowserVersion = navigator.appVersion.match(/MSIE (.\..)/)[1] ;
308                return ( sBrowserVersion >= 5.5 ) ;
309        }
310
311        // Gecko (Opera 9 tries to behave like Gecko at this point).
312        if ( navigator.product == "Gecko" && navigator.productSub >= 20030210 && !( typeof(opera) == 'object' && opera.postError ) )
313                return true ;
314
315        // Opera 9.50+
316        if ( window.opera && window.opera.version && parseFloat( window.opera.version() ) >= 9.5 )
317                return true ;
318
319        // Adobe AIR
320        // Checked before Safari because AIR have the WebKit rich text editor
321        // features from Safari 3.0.4, but the version reported is 420.
322        if ( sAgent.indexOf( ' adobeair/' ) != -1 )
323                return ( sAgent.match( / adobeair\/(\d+)/ )[1] >= 1 ) ; // Build must be at least v1
324
325        // Safari 3+
326        if ( sAgent.indexOf( ' applewebkit/' ) != -1 )
327                return ( sAgent.match( / applewebkit\/(\d+)/ )[1] >= 522 ) ;    // Build must be at least 522 (v3)
328
329        return false ;
330}
Note: See TracBrowser for help on using the repository browser.