+ // Check ancestors that overflows.\r
+ var overflowed =\r
+ parent.$.clientWidth && parent.$.clientWidth < parent.$.scrollWidth\r
+ || parent.$.clientHeight && parent.$.clientHeight < parent.$.scrollHeight;\r
+\r
+ if ( overflowed )\r
+ this.scrollIntoParent( parent, alignToTop, 1 );\r
+\r
+ // Walk across the frame.\r
+ if ( parent.is( 'html' ) )\r
+ {\r
+ var win = parent.getWindow();\r
+\r
+ // Avoid security error.\r
+ try\r
+ {\r
+ var iframe = win.$.frameElement;\r
+ iframe && ( parent = new CKEDITOR.dom.element( iframe ) );\r
+ }\r
+ catch(er){}\r
+ }\r
+ }\r
+ while ( ( parent = parent.getParent() ) );\r
+ },\r
+\r
+ /**\r
+ * Make any page element visible inside one of the ancestors by scrolling the parent.\r
+ * @param {CKEDITOR.dom.element|CKEDITOR.dom.window} parent The container to scroll into.\r
+ * @param {Boolean} [alignToTop] Align the element's top side with the container's\r
+ * when <code>true</code> is specified; align the bottom with viewport bottom when\r
+ * <code>false</code> is specified. Otherwise scroll on either side with the minimum\r
+ * amount to show the element.\r
+ * @param {Boolean} [hscroll] Whether horizontal overflow should be considered.\r
+ */\r
+ scrollIntoParent : function( parent, alignToTop, hscroll )\r
+ {\r
+ !parent && ( parent = this.getWindow() );\r
+\r
+ var doc = parent.getDocument();\r
+ var isQuirks = doc.$.compatMode == 'BackCompat';\r
+\r
+ // On window <html> is scrolled while quirks scrolls <body>.\r
+ if ( parent instanceof CKEDITOR.dom.window )\r
+ parent = isQuirks ? doc.getBody() : doc.getDocumentElement();\r
+\r
+ // Scroll the parent by the specified amount.\r
+ function scrollBy( x, y )\r
+ {\r
+ // Webkit doesn't support "scrollTop/scrollLeft"\r
+ // on documentElement/body element.\r
+ if ( /body|html/.test( parent.getName() ) )\r
+ parent.getWindow().$.scrollBy( x, y );\r
+ else\r
+ {\r
+ parent.$[ 'scrollLeft' ] += x;\r
+ parent.$[ 'scrollTop' ] += y;\r
+ }\r
+ }\r
+\r
+ // Figure out the element position relative to the specified window.\r
+ function screenPos( element, refWin )\r
+ {\r
+ var pos = { x: 0, y: 0 };\r
+\r
+ if ( !( element.is( isQuirks ? 'body' : 'html' ) ) )\r
+ {\r
+ var box = element.$.getBoundingClientRect();\r
+ pos.x = box.left, pos.y = box.top;\r
+ }\r
+\r
+ var win = element.getWindow();\r
+ if ( !win.equals( refWin ) )\r
+ {\r
+ var outerPos = screenPos( CKEDITOR.dom.element.get( win.$.frameElement ), refWin );\r
+ pos.x += outerPos.x, pos.y += outerPos.y;\r
+ }\r
+\r
+ return pos;\r
+ }\r