JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.3
[ckeditor.git] / _source / plugins / iframedialog / plugin.js
1 /*\r
2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @fileOverview Plugin for making iframe based dialogs.\r
8  */\r
9 \r
10 CKEDITOR.plugins.add( 'iframedialog',\r
11 {\r
12         requires : [ 'dialog' ],\r
13         onLoad : function()\r
14         {\r
15                 /**\r
16                  * An iframe base dialog.\r
17                  * @param {String} name Name of the dialog\r
18                  * @param {String} title Title of the dialog\r
19                  * @param {Number} minWidth Minimum width of the dialog\r
20                  * @param {Number} minHeight Minimum height of the dialog\r
21                  * @param {Function} [onContentLoad] Function called when the iframe has been loaded.\r
22                  * If it isn't specified, the inner frame is notified of the dialog events ('load',\r
23                  * 'resize', 'ok' and 'cancel') on a function called 'onDialogEvent'\r
24                  * @param {Object} [userDefinition] Additional properties for the dialog definition\r
25                  * @example\r
26                  */\r
27                 CKEDITOR.dialog.addIframe = function( name, title, src, minWidth, minHeight, onContentLoad, userDefinition )\r
28                 {\r
29                         var element =\r
30                         {\r
31                                 type : 'iframe',\r
32                                 src : src,\r
33                                 width : '100%',\r
34                                 height : '100%'\r
35                         };\r
36 \r
37                         if ( typeof( onContentLoad ) == 'function' )\r
38                                 element.onContentLoad = onContentLoad;\r
39                         else\r
40                                 element.onContentLoad = function()\r
41                                 {\r
42                                         var element = this.getElement(),\r
43                                                 childWindow = element.$.contentWindow;\r
44 \r
45                                         // If the inner frame has defined a "onDialogEvent" function, setup listeners\r
46                                         if ( childWindow.onDialogEvent )\r
47                                         {\r
48                                                 var dialog = this.getDialog(),\r
49                                                         notifyEvent = function(e)\r
50                                                         {\r
51                                                                 return childWindow.onDialogEvent(e);\r
52                                                         };\r
53 \r
54                                                 dialog.on( 'ok', notifyEvent );\r
55                                                 dialog.on( 'cancel', notifyEvent );\r
56                                                 dialog.on( 'resize', notifyEvent );\r
57 \r
58                                                 // Clear listeners\r
59                                                 dialog.on( 'hide', function(e)\r
60                                                         {\r
61                                                                 dialog.removeListener( 'ok', notifyEvent );\r
62                                                                 dialog.removeListener( 'cancel', notifyEvent );\r
63                                                                 dialog.removeListener( 'resize', notifyEvent );\r
64 \r
65                                                                 e.removeListener();\r
66                                                         } );\r
67 \r
68                                                 // Notify child iframe of load:\r
69                                                 childWindow.onDialogEvent( {\r
70                                                                 name : 'load',\r
71                                                                 sender : this,\r
72                                                                 editor : dialog._.editor\r
73                                                         } );\r
74                                         }\r
75                                 };\r
76 \r
77                         var definition =\r
78                         {\r
79                                 title : title,\r
80                                 minWidth : minWidth,\r
81                                 minHeight : minHeight,\r
82                                 contents :\r
83                                 [\r
84                                         {\r
85                                                 id : 'iframe',\r
86                                                 label : title,\r
87                                                 expand : true,\r
88                                                 elements : [ element ]\r
89                                         }\r
90                                 ]\r
91                         };\r
92 \r
93                         for ( var i in userDefinition )\r
94                                 definition[i] = userDefinition[i];\r
95 \r
96                         this.add( name, function(){ return definition; } );\r
97                 };\r
98 \r
99                 (function()\r
100                 {\r
101                         /**\r
102                          * An iframe element.\r
103                          * @extends CKEDITOR.ui.dialog.uiElement\r
104                          * @example\r
105                          * @constructor\r
106                          * @param {CKEDITOR.dialog} dialog\r
107                          * Parent dialog object.\r
108                          * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
109                          * The element definition. Accepted fields:\r
110                          * <ul>\r
111                          *      <li><strong>src</strong> (Required) The src field of the iframe. </li>\r
112                          *      <li><strong>width</strong> (Required) The iframe's width.</li>\r
113                          *      <li><strong>height</strong> (Required) The iframe's height.</li>\r
114                          *      <li><strong>onContentLoad</strong> (Optional) A function to be executed\r
115                          *      after the iframe's contents has finished loading.</li>\r
116                          * </ul>\r
117                          * @param {Array} htmlList\r
118                          * List of HTML code to output to.\r
119                          */\r
120                         var iframeElement = function( dialog, elementDefinition, htmlList )\r
121                         {\r
122                                 if ( arguments.length < 3 )\r
123                                         return;\r
124 \r
125                                 var _ = ( this._ || ( this._ = {} ) ),\r
126                                         contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ),\r
127                                         cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),\r
128                                         cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );\r
129                                 _.frameId = CKEDITOR.tools.getNextId() + '_iframe';\r
130 \r
131                                 // IE BUG: Parent container does not resize to contain the iframe automatically.\r
132                                 dialog.on( 'load', function()\r
133                                         {\r
134                                                 var iframe = CKEDITOR.document.getById( _.frameId ),\r
135                                                         parentContainer = iframe.getParent();\r
136 \r
137                                                 parentContainer.setStyles(\r
138                                                         {\r
139                                                                 width : cssWidth,\r
140                                                                 height : cssHeight\r
141                                                         } );\r
142                                         } );\r
143 \r
144                                 var attributes =\r
145                                 {\r
146                                         src : '%2',\r
147                                         id : _.frameId,\r
148                                         frameborder : 0,\r
149                                         allowtransparency : true\r
150                                 };\r
151                                 var myHtml = [];\r
152 \r
153                                 if ( typeof( elementDefinition.onContentLoad ) == 'function' )\r
154                                         attributes.onload = 'CKEDITOR.tools.callFunction(%1);';\r
155 \r
156                                 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe',\r
157                                                 {\r
158                                                         width : cssWidth,\r
159                                                         height : cssHeight\r
160                                                 }, attributes, '' );\r
161 \r
162                                 // Put a placeholder for the first time.\r
163                                 htmlList.push( '<div style="width:' + cssWidth + ';height:' + cssHeight + ';" id="' + this.domId + '"></div>' );\r
164 \r
165                                 // Iframe elements should be refreshed whenever it is shown.\r
166                                 myHtml = myHtml.join( '' );\r
167                                 dialog.on( 'show', function()\r
168                                         {\r
169                                                 var iframe = CKEDITOR.document.getById( _.frameId ),\r
170                                                         parentContainer = iframe.getParent(),\r
171                                                         callIndex = CKEDITOR.tools.addFunction( contentLoad ),\r
172                                                         html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) );\r
173                                                 parentContainer.setHtml( html );\r
174                                         } );\r
175                         };\r
176 \r
177                         iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement;\r
178 \r
179                         CKEDITOR.dialog.addUIElement( 'iframe',\r
180                                 {\r
181                                         build : function( dialog, elementDefinition, output )\r
182                                         {\r
183                                                 return new iframeElement( dialog, elementDefinition, output );\r
184                                         }\r
185                                 } );\r
186                 })();\r
187         }\r
188 } );\r