JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.0
[ckeditor.git] / _source / plugins / iframedialog / plugin.js
diff --git a/_source/plugins/iframedialog/plugin.js b/_source/plugins/iframedialog/plugin.js
new file mode 100644 (file)
index 0000000..fbd2d90
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/**\r
+ * @fileOverview Plugin for making iframe based dialogs.\r
+ */\r
+\r
+CKEDITOR.plugins.add( 'iframedialog',\r
+{\r
+       requires : [ 'dialog' ],\r
+       onLoad : function()\r
+       {\r
+               CKEDITOR.dialog.addIframe = function( name, title, src, width, height, onContentLoad )\r
+               {\r
+                       var element =\r
+                       {\r
+                               type : 'iframe',\r
+                               src : src,\r
+                               width : '100%',\r
+                               height : '100%'\r
+                       };\r
+\r
+                       if ( typeof( onContentLoad ) == 'function' )\r
+                               element.onContentLoad = onContentLoad;\r
+\r
+                       var definition =\r
+                       {\r
+                               title : title,\r
+                               minWidth : width,\r
+                               minHeight : height,\r
+                               contents :\r
+                               [\r
+                                       {\r
+                                               id : 'iframe',\r
+                                               label : title,\r
+                                               expand : true,\r
+                                               elements : [ element ]\r
+                                       }\r
+                               ]\r
+                       };\r
+\r
+                       return this.add( name, function(){ return definition; } );\r
+               };\r
+\r
+               (function()\r
+               {\r
+                       /**\r
+                        * An iframe element.\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @example\r
+                        * @constructor\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>src</strong> (Required) The src field of the iframe. </li>\r
+                        *      <li><strong>width</strong> (Required) The iframe's width.</li>\r
+                        *      <li><strong>height</strong> (Required) The iframe's height.</li>\r
+                        *      <li><strong>onContentLoad</strong> (Optional) A function to be executed\r
+                        *      after the iframe's contents has finished loading.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       var iframeElement = function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               var _ = ( this._ || ( this._ = {} ) ),\r
+                                       contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ),\r
+                                       cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),\r
+                                       cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );\r
+                               _.frameId = CKEDITOR.tools.getNextNumber() + '_iframe';\r
+\r
+                               // IE BUG: Parent container does not resize to contain the iframe automatically.\r
+                               dialog.on( 'load', function()\r
+                                       {\r
+                                               var iframe = CKEDITOR.document.getById( _.frameId ),\r
+                                                       parentContainer = iframe.getParent();\r
+\r
+                                               parentContainer.setStyles(\r
+                                                       {\r
+                                                               width : cssWidth,\r
+                                                               height : cssHeight\r
+                                                       } );\r
+                                       } );\r
+\r
+                               var attributes =\r
+                               {\r
+                                       src : '%2',\r
+                                       id : _.frameId,\r
+                                       frameborder : 0,\r
+                                       allowtransparency : true\r
+                               };\r
+                               var myHtml = [];\r
+\r
+                               if ( typeof( elementDefinition.onContentLoad ) == 'function' )\r
+                                       attributes.onload = 'CKEDITOR.tools.callFunction(%1);';\r
+\r
+                               CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe',\r
+                                               {\r
+                                                       width : cssWidth,\r
+                                                       height : cssHeight\r
+                                               }, attributes, '' );\r
+\r
+                               // Put a placeholder for the first time.\r
+                               htmlList.push( '<div style="width:' + cssWidth + ';height:' + cssHeight + ';" id="' + this.domId + '"></div>' );\r
+\r
+                               // Iframe elements should be refreshed whenever it is shown.\r
+                               myHtml = myHtml.join( '' );\r
+                               dialog.on( 'show', function()\r
+                                       {\r
+                                               var iframe = CKEDITOR.document.getById( _.frameId ),\r
+                                                       parentContainer = iframe.getParent(),\r
+                                                       callIndex = CKEDITOR.tools.addFunction( contentLoad ),\r
+                                                       html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) );\r
+                                               parentContainer.setHtml( html );\r
+                                       } );\r
+                       };\r
+\r
+                       iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement;\r
+\r
+                       CKEDITOR.dialog.addUIElement( 'iframe',\r
+                               {\r
+                                       build : function( dialog, elementDefinition, output )\r
+                                       {\r
+                                               return new iframeElement( dialog, elementDefinition, output );\r
+                                       }\r
+                               } );\r
+               })();\r
+       }\r
+} );\r