1 | /* |
---|
2 | * FCKeditor - The text editor for Internet - http://www.fckeditor.net |
---|
3 | * Copyright (C) 2003-2007 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 | * Create the FCKeditorAPI object that is available as a global object in |
---|
22 | * the page where the editor is placed in. |
---|
23 | */ |
---|
24 | |
---|
25 | var FCKeditorAPI ; |
---|
26 | |
---|
27 | function InitializeAPI() |
---|
28 | { |
---|
29 | var oParentWindow = window.parent ; |
---|
30 | |
---|
31 | if ( !( FCKeditorAPI = oParentWindow.FCKeditorAPI ) ) |
---|
32 | { |
---|
33 | // Make the FCKeditorAPI object available in the parent window. Use |
---|
34 | // eval so this core runs in the parent's scope and so it will still be |
---|
35 | // available if the editor instance is removed ("Can't execute code |
---|
36 | // from a freed script" error). |
---|
37 | |
---|
38 | // Note: we check the existence of oEditor.GetParentForm because some external |
---|
39 | // code (like JSON) can extend the Object protype and we get then extra oEditor |
---|
40 | // objects that aren't really FCKeditor instances. |
---|
41 | var sScript = |
---|
42 | 'var FCKeditorAPI = {' + |
---|
43 | 'Version : "2.4.2",' + |
---|
44 | 'VersionBuild : "14978",' + |
---|
45 | '__Instances : new Object(),' + |
---|
46 | |
---|
47 | 'GetInstance : function( name )' + |
---|
48 | '{' + |
---|
49 | 'return this.__Instances[ name ];' + |
---|
50 | '},' + |
---|
51 | |
---|
52 | '_FormSubmit : function()' + |
---|
53 | '{' + |
---|
54 | 'for ( var name in FCKeditorAPI.__Instances )' + |
---|
55 | '{' + |
---|
56 | 'var oEditor = FCKeditorAPI.__Instances[ name ] ;' + |
---|
57 | 'if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )' + |
---|
58 | 'oEditor.UpdateLinkedField() ;' + |
---|
59 | '}' + |
---|
60 | 'this._FCKOriginalSubmit() ;' + |
---|
61 | '},' + |
---|
62 | |
---|
63 | '_FunctionQueue : {' + |
---|
64 | 'Functions : new Array(),' + |
---|
65 | 'IsRunning : false,' + |
---|
66 | |
---|
67 | 'Add : function( f )' + |
---|
68 | '{' + |
---|
69 | 'this.Functions.push( f );' + |
---|
70 | 'if ( !this.IsRunning )' + |
---|
71 | 'this.StartNext();' + |
---|
72 | '},' + |
---|
73 | |
---|
74 | 'StartNext : function()' + |
---|
75 | '{' + |
---|
76 | 'var aQueue = this.Functions ;' + |
---|
77 | 'if ( aQueue.length > 0 )' + |
---|
78 | '{' + |
---|
79 | 'this.IsRunning = true;' + |
---|
80 | 'aQueue[0].call();' + |
---|
81 | '}' + |
---|
82 | 'else ' + |
---|
83 | 'this.IsRunning = false;' + |
---|
84 | '},' + |
---|
85 | |
---|
86 | 'Remove : function( f )' + |
---|
87 | '{' + |
---|
88 | 'var aQueue = this.Functions;' + |
---|
89 | 'var i = 0, fFunc;' + |
---|
90 | 'while( (fFunc = aQueue[ i ]) )' + |
---|
91 | '{' + |
---|
92 | 'if ( fFunc == f )' + |
---|
93 | 'aQueue.splice( i,1 );' + |
---|
94 | 'i++ ;' + |
---|
95 | '}' + |
---|
96 | 'this.StartNext();' + |
---|
97 | '}' + |
---|
98 | '}' + |
---|
99 | '}' ; |
---|
100 | |
---|
101 | // In IE, the "eval" function is not always available (it works with |
---|
102 | // the JavaScript samples, but not with the ASP ones, for example). |
---|
103 | // So, let's use the execScript instead. |
---|
104 | if ( oParentWindow.execScript ) |
---|
105 | oParentWindow.execScript( sScript, 'JavaScript' ) ; |
---|
106 | else |
---|
107 | { |
---|
108 | if ( FCKBrowserInfo.IsGecko10 ) |
---|
109 | { |
---|
110 | // FF 1.0.4 gives an error with the request bellow. The |
---|
111 | // following seams to work well. |
---|
112 | eval.call( oParentWindow, sScript ) ; |
---|
113 | } |
---|
114 | else if ( FCKBrowserInfo.IsSafari ) |
---|
115 | { |
---|
116 | // oParentWindow.eval in Safari executes in the calling window |
---|
117 | // environment, instead of the parent one. The following should make it work. |
---|
118 | var oParentDocument = oParentWindow.document ; |
---|
119 | var eScript = oParentDocument.createElement('script') ; |
---|
120 | eScript.appendChild( oParentDocument.createTextNode( sScript ) ) ; |
---|
121 | oParentDocument.documentElement.appendChild( eScript ) ; |
---|
122 | } |
---|
123 | else |
---|
124 | oParentWindow.eval( sScript ) ; |
---|
125 | } |
---|
126 | |
---|
127 | FCKeditorAPI = oParentWindow.FCKeditorAPI ; |
---|
128 | } |
---|
129 | |
---|
130 | // Add the current instance to the FCKeditorAPI's instances collection. |
---|
131 | FCKeditorAPI.__Instances[ FCK.Name ] = FCK ; |
---|
132 | } |
---|
133 | |
---|
134 | // Attach to the form onsubmit event and to the form.submit(). |
---|
135 | function _AttachFormSubmitToAPI() |
---|
136 | { |
---|
137 | // Get the linked field form. |
---|
138 | var oForm = FCK.GetParentForm() ; |
---|
139 | |
---|
140 | if ( oForm ) |
---|
141 | { |
---|
142 | // Attach to the onsubmit event. |
---|
143 | FCKTools.AddEventListener( oForm, 'submit', FCK.UpdateLinkedField ) ; |
---|
144 | |
---|
145 | // IE sees oForm.submit function as an 'object'. |
---|
146 | if ( !oForm._FCKOriginalSubmit && ( typeof( oForm.submit ) == 'function' || ( !oForm.submit.tagName && !oForm.submit.length ) ) ) |
---|
147 | { |
---|
148 | // Save the original submit. |
---|
149 | oForm._FCKOriginalSubmit = oForm.submit ; |
---|
150 | |
---|
151 | // Create our replacement for the submit. |
---|
152 | oForm.submit = FCKeditorAPI._FormSubmit ; |
---|
153 | } |
---|
154 | } |
---|
155 | } |
---|
156 | |
---|
157 | function FCKeditorAPI_Cleanup() |
---|
158 | { |
---|
159 | delete FCKeditorAPI.__Instances[ FCK.Name ] ; |
---|
160 | } |
---|
161 | FCKTools.AddEventListener( window, 'unload', FCKeditorAPI_Cleanup ) ; |
---|