--- /dev/null
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+(function()\r
+{\r
+ // Elements that may be considered the "Block boundary" in an element path.\r
+ var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1, legend:1 };\r
+\r
+ // Elements that may be considered the "Block limit" in an element path.\r
+ var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1,fieldset:1 };\r
+\r
+ // Check if an element contains any block element.\r
+ var checkHasBlock = function( element )\r
+ {\r
+ var childNodes = element.getChildren();\r
+\r
+ for ( var i = 0, count = childNodes.count() ; i < count ; i++ )\r
+ {\r
+ var child = childNodes.getItem( i );\r
+\r
+ if ( child.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$block[ child.getName() ] )\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ };\r
+\r
+ /**\r
+ * @class\r
+ */\r
+ CKEDITOR.dom.elementPath = function( lastNode )\r
+ {\r
+ var block = null;\r
+ var blockLimit = null;\r
+ var elements = [];\r
+\r
+ var e = lastNode;\r
+\r
+ while ( e )\r
+ {\r
+ if ( e.type == CKEDITOR.NODE_ELEMENT )\r
+ {\r
+ if ( !this.lastElement )\r
+ this.lastElement = e;\r
+\r
+ var elementName = e.getName();\r
+ if ( CKEDITOR.env.ie && e.$.scopeName != 'HTML' )\r
+ elementName = e.$.scopeName.toLowerCase() + ':' + elementName;\r
+\r
+ if ( !blockLimit )\r
+ {\r
+ if ( !block && pathBlockElements[ elementName ] )\r
+ block = e;\r
+\r
+ if ( pathBlockLimitElements[ elementName ] )\r
+ {\r
+ // DIV is considered the Block, if no block is available (#525)\r
+ // and if it doesn't contain other blocks.\r
+ if ( !block && elementName == 'div' && !checkHasBlock( e ) )\r
+ block = e;\r
+ else\r
+ blockLimit = e;\r
+ }\r
+ }\r
+\r
+ elements.push( e );\r
+\r
+ if ( elementName == 'body' )\r
+ break;\r
+ }\r
+ e = e.getParent();\r
+ }\r
+\r
+ this.block = block;\r
+ this.blockLimit = blockLimit;\r
+ this.elements = elements;\r
+ };\r
+})();\r
+\r
+CKEDITOR.dom.elementPath.prototype =\r
+{\r
+ /**\r
+ * Compares this element path with another one.\r
+ * @param {CKEDITOR.dom.elementPath} otherPath The elementPath object to be\r
+ * compared with this one.\r
+ * @returns {Boolean} "true" if the paths are equal, containing the same\r
+ * number of elements and the same elements in the same order.\r
+ */\r
+ compare : function( otherPath )\r
+ {\r
+ var thisElements = this.elements;\r
+ var otherElements = otherPath && otherPath.elements;\r
+\r
+ if ( !otherElements || thisElements.length != otherElements.length )\r
+ return false;\r
+\r
+ for ( var i = 0 ; i < thisElements.length ; i++ )\r
+ {\r
+ if ( !thisElements[ i ].equals( otherElements[ i ] ) )\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ },\r
+\r
+ contains : function( tagNames )\r
+ {\r
+ var elements = this.elements;\r
+ for ( var i = 0 ; i < elements.length ; i++ )\r
+ {\r
+ if ( elements[ i ].getName() in tagNames )\r
+ return elements[ i ];\r
+ }\r
+\r
+ return null;\r
+ }\r
+};\r