1 /*
  2  * CKEditor - The text editor for Internet - http://ckeditor.com
  3  * Copyright (C) 2003-2008 Frederico Caldeira Knabben
  4  *
  5  * == BEGIN LICENSE ==
  6  *
  7  * Licensed under the terms of any of the following licenses at your
  8  * choice:
  9  *
 10  *  - GNU General Public License Version 2 or later (the "GPL")
 11  *    http://www.gnu.org/licenses/gpl.html
 12  *
 13  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 14  *    http://www.gnu.org/licenses/lgpl.html
 15  *
 16  *  - Mozilla Public License Version 1.1 or later (the "MPL")
 17  *    http://www.mozilla.org/MPL/MPL-1.1.html
 18  *
 19  * == END LICENSE ==
 20  */
 21
 22 /**
 23  * @fileOverview Defines the {@link CKEDITOR.dom.node} class, which is the base
 24  *		class for classes that represent DOM nodes.
 25  */
 26
 27 /**
 28  * Base class for classes representing DOM nodes. This constructor may return
 29  * and instance of classes that inherits this class, like
 30  * {@link CKEDITOR.dom.element} or {@link CKEDITOR.dom.text}.
 31  * @augments CKEDITOR.dom.domObject
 32  * @param {Object} domNode A native DOM node.
 33  * @constructor
 34  * @see CKEDITOR.dom.element
 35  * @see CKEDITOR.dom.text
 36  * @example
 37  */
 38 CKEDITOR.dom.node = function( domNode )
 39 {
 40 	if ( domNode )
 41 	{
 42 		switch ( domNode.nodeType )
 43 		{
 44 			case 1 :	// ELEMENT_NODE
 45 				return new CKEDITOR.dom.element( domNode );
 46
 47 			case 3 :	// TEXT_NODE
 48 				return new CKEDITOR.dom.text( domNode );
 49 		}
 50
 51 		/**
 52 		 * The native DOM node represented by this class instance.
 53 		 * @type Object
 54 		 * @example
 55 		 * var element = new CKEDITOR.dom.node( document.body );
 56 		 * alert( element.$.nodeType );  // "1"
 57 		 */
 58 		this.$ = domNode;
 59 	}
 60
 61 	return this;
 62 };
 63
 64 CKEDITOR.dom.node.prototype = new CKEDITOR.dom.domObject();
 65
 66 CKEDITOR.tools.extend( CKEDITOR.dom.node.prototype,
 67 	/** @lends CKEDITOR.dom.node.prototype */
 68 	{
 69 		/**
 70 		 * Makes this node child of another element.
 71 		 * @param {CKEDITOR.dom.element} element The target element to which append
 72 		 *		this node.
 73 		 * @returns {CKEDITOR.dom.element} The target element.
 74 		 * @example
 75 		 * var p = new CKEDITOR.dom.element( 'p' );
 76 		 * var strong = new CKEDITOR.dom.element( 'strong' );
 77 		 * strong.appendTo( p );
 78 		 *
 79 		 * // result: "<p><strong></strong></p>"
 80 		 */
 81 		appendTo : function( element )
 82 		{
 83 			element.append( this );
 84 			return element;
 85 		},
 86 		
 87 		/**
 88 		 * Gets the parent element for this node.
 89 		 * @returns {CKEDITOR.dom.element} The parent element.
 90 		 * @example
 91 		 * var node = editor.document.getBody().getFirst();
 92 		 * var parent = node.<b>getParent()</b>;
 93 		 * alert( node.getName() );  // "body"
 94 		 */
 95 		getParent : function()
 96 		{
 97 			var parent = this.$.parentNode;
 98 			return parent ? new CKEDITOR.dom.element( this.$.parentNode ) : null;
 99 		},
100
101 		/**
102 		 * Inserts this element after a node.
103 		 * @param {CKEDITOR.dom.node} node The that will preceed this element.
104 		 * @returns {CKEDITOR.dom.node} The node preceeding this one after
105 		 *		insertion.
106 		 * @example
107 		 * var em = new CKEDITOR.dom.element( 'em' );
108 		 * var strong = new CKEDITOR.dom.element( 'strong' );
109 		 * strong.insertAfter( em );
110 		 *
111 		 * // result: "<em></em><strong></strong>"
112 		 */
113 		insertAfter : function( node )
114 		{
115 			node.$.parentNode.insertBefore( this.$, node.$.nextSibling );
116 			return node;
117 		},
118
119 		/**
120 		 * Inserts this element before a node.
121 		 * @param {CKEDITOR.dom.node} node The that will be after this element.
122 		 * @returns {CKEDITOR.dom.node} The node after this one after insertion.
123 		 * @example
124 		 * var em = new CKEDITOR.dom.element( 'em' );
125 		 * var strong = new CKEDITOR.dom.element( 'strong' );
126 		 * strong.insertBefore( em );
127 		 *
128 		 * // result: "<strong></strong><em></em>"
129 		 */
130 		insertBefore : function( node )
131 		{
132 			node.$.parentNode.insertBefore( this.$, node.$ );
133 		}
134 	}
135 );
136