JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.1
[ckeditor.git] / _source / plugins / iframedialog / plugin.js
1 /*\r
2 Copyright (c) 2003-2010, 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                 CKEDITOR.dialog.addIframe = function( name, title, src, width, height, onContentLoad )\r
16                 {\r
17                         var element =\r
18                         {\r
19                                 type : 'iframe',\r
20                                 src : src,\r
21                                 width : '100%',\r
22                                 height : '100%'\r
23                         };\r
24 \r
25                         if ( typeof( onContentLoad ) == 'function' )\r
26                                 element.onContentLoad = onContentLoad;\r
27 \r
28                         var definition =\r
29                         {\r
30                                 title : title,\r
31                                 minWidth : width,\r
32                                 minHeight : height,\r
33                                 contents :\r
34                                 [\r
35                                         {\r
36                                                 id : 'iframe',\r
37                                                 label : title,\r
38                                                 expand : true,\r
39                                                 elements : [ element ]\r
40                                         }\r
41                                 ]\r
42                         };\r
43 \r
44                         return this.add( name, function(){ return definition; } );\r
45                 };\r
46 \r
47                 (function()\r
48                 {\r
49                         /**\r
50                          * An iframe element.\r
51                          * @extends CKEDITOR.ui.dialog.uiElement\r
52                          * @example\r
53                          * @constructor\r
54                          * @param {CKEDITOR.dialog} dialog\r
55                          * Parent dialog object.\r
56                          * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition\r
57                          * The element definition. Accepted fields:\r
58                          * <ul>\r
59                          *      <li><strong>src</strong> (Required) The src field of the iframe. </li>\r
60                          *      <li><strong>width</strong> (Required) The iframe's width.</li>\r
61                          *      <li><strong>height</strong> (Required) The iframe's height.</li>\r
62                          *      <li><strong>onContentLoad</strong> (Optional) A function to be executed\r
63                          *      after the iframe's contents has finished loading.</li>\r
64                          * </ul>\r
65                          * @param {Array} htmlList\r
66                          * List of HTML code to output to.\r
67                          */\r
68                         var iframeElement = function( dialog, elementDefinition, htmlList )\r
69                         {\r
70                                 if ( arguments.length < 3 )\r
71                                         return;\r
72 \r
73                                 var _ = ( this._ || ( this._ = {} ) ),\r
74                                         contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ),\r
75                                         cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),\r
76                                         cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );\r
77                                 _.frameId = CKEDITOR.tools.getNextNumber() + '_iframe';\r
78 \r
79                                 // IE BUG: Parent container does not resize to contain the iframe automatically.\r
80                                 dialog.on( 'load', function()\r
81                                         {\r
82                                                 var iframe = CKEDITOR.document.getById( _.frameId ),\r
83                                                         parentContainer = iframe.getParent();\r
84 \r
85                                                 parentContainer.setStyles(\r
86                                                         {\r
87                                                                 width : cssWidth,\r
88                                                                 height : cssHeight\r
89                                                         } );\r
90                                         } );\r
91 \r
92                                 var attributes =\r
93                                 {\r
94                                         src : '%2',\r
95                                         id : _.frameId,\r
96                                         frameborder : 0,\r
97                                         allowtransparency : true\r
98                                 };\r
99                                 var myHtml = [];\r
100 \r
101                                 if ( typeof( elementDefinition.onContentLoad ) == 'function' )\r
102                                         attributes.onload = 'CKEDITOR.tools.callFunction(%1);';\r
103 \r
104                                 CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe',\r
105                                                 {\r
106                                                         width : cssWidth,\r
107                                                         height : cssHeight\r
108                                                 }, attributes, '' );\r
109 \r
110                                 // Put a placeholder for the first time.\r
111                                 htmlList.push( '<div style="width:' + cssWidth + ';height:' + cssHeight + ';" id="' + this.domId + '"></div>' );\r
112 \r
113                                 // Iframe elements should be refreshed whenever it is shown.\r
114                                 myHtml = myHtml.join( '' );\r
115                                 dialog.on( 'show', function()\r
116                                         {\r
117                                                 var iframe = CKEDITOR.document.getById( _.frameId ),\r
118                                                         parentContainer = iframe.getParent(),\r
119                                                         callIndex = CKEDITOR.tools.addFunction( contentLoad ),\r
120                                                         html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) );\r
121                                                 parentContainer.setHtml( html );\r
122                                         } );\r
123                         };\r
124 \r
125                         iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement;\r
126 \r
127                         CKEDITOR.dialog.addUIElement( 'iframe',\r
128                                 {\r
129                                         build : function( dialog, elementDefinition, output )\r
130                                         {\r
131                                                 return new iframeElement( dialog, elementDefinition, output );\r
132                                         }\r
133                                 } );\r
134                 })();\r
135         }\r
136 } );\r