JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
dd0f9a0f9b57aa3ad96aeb9b087a17af36e5b0d2
[ckeditor.git] / _source / core / dom / document.js
1 /*\r
2 Copyright (c) 2003-2009, 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 Defines the {@link CKEDITOR.dom.document} class, which\r
8  *              represents a DOM document.\r
9  */\r
10 \r
11 /**\r
12  * Represents a DOM document.\r
13  * @constructor\r
14  * @augments CKEDITOR.dom.domObject\r
15  * @param {Object} domDocument A native DOM document.\r
16  * @example\r
17  * var document = new CKEDITOR.dom.document( document );\r
18  */\r
19 CKEDITOR.dom.document = function( domDocument )\r
20 {\r
21         CKEDITOR.dom.domObject.call( this, domDocument );\r
22 };\r
23 \r
24 // PACKAGER_RENAME( CKEDITOR.dom.document )\r
25 \r
26 CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject();\r
27 \r
28 CKEDITOR.tools.extend( CKEDITOR.dom.document.prototype,\r
29         /** @lends CKEDITOR.dom.document.prototype */\r
30         {\r
31                 /**\r
32                  * Appends a CSS file to the document.\r
33                  * @param {String} cssFileUrl The CSS file URL.\r
34                  * @example\r
35                  * <b>CKEDITOR.document.appendStyleSheet( '/mystyles.css' )</b>;\r
36                  */\r
37                 appendStyleSheet : function( cssFileUrl )\r
38                 {\r
39                         if ( this.$.createStyleSheet )\r
40                                 this.$.createStyleSheet( cssFileUrl );\r
41                         else\r
42                         {\r
43                                 var link = new CKEDITOR.dom.element( 'link' );\r
44                                 link.setAttributes(\r
45                                         {\r
46                                                 rel             :'stylesheet',\r
47                                                 type    : 'text/css',\r
48                                                 href    : cssFileUrl\r
49                                         });\r
50 \r
51                                 this.getHead().append( link );\r
52                         }\r
53                 },\r
54 \r
55                 createElement : function( name, attribsAndStyles )\r
56                 {\r
57                         var element = new CKEDITOR.dom.element( name, this );\r
58 \r
59                         if ( attribsAndStyles )\r
60                         {\r
61                                 if ( attribsAndStyles.attributes )\r
62                                         element.setAttributes( attribsAndStyles.attributes );\r
63 \r
64                                 if ( attribsAndStyles.styles )\r
65                                         element.setStyles( attribsAndStyles.styles );\r
66                         }\r
67 \r
68                         return element;\r
69                 },\r
70 \r
71                 createText : function( text )\r
72                 {\r
73                         return new CKEDITOR.dom.text( text, this );\r
74                 },\r
75 \r
76                 focus : function()\r
77                 {\r
78                         this.getWindow().focus();\r
79                 },\r
80 \r
81                 /**\r
82                  * Gets and element based on its id.\r
83                  * @param {String} elementId The element id.\r
84                  * @returns {CKEDITOR.dom.element} The element instance, or null if not found.\r
85                  * @example\r
86                  * var element = <b>CKEDITOR.document.getById( 'myElement' )</b>;\r
87                  * alert( element.getId() );  // "myElement"\r
88                  */\r
89                 getById : function( elementId )\r
90                 {\r
91                         var $ = this.$.getElementById( elementId );\r
92                         return $ ? new CKEDITOR.dom.element( $ ) : null;\r
93                 },\r
94 \r
95                 getByAddress : function( address, normalized )\r
96                 {\r
97                         var $ = this.$.documentElement;\r
98 \r
99                         for ( var i = 0 ; $ && i < address.length ; i++ )\r
100                         {\r
101                                 var target = address[ i ];\r
102 \r
103                                 if ( !normalized )\r
104                                 {\r
105                                         $ = $.childNodes[ target ];\r
106                                         continue;\r
107                                 }\r
108 \r
109                                 var currentIndex = -1;\r
110 \r
111                                 for (var j = 0 ; j < $.childNodes.length ; j++ )\r
112                                 {\r
113                                         var candidate = $.childNodes[ j ];\r
114 \r
115                                         if ( normalized === true &&\r
116                                                         candidate.nodeType == 3 &&\r
117                                                         candidate.previousSibling &&\r
118                                                         candidate.previousSibling.nodeType == 3 )\r
119                                         {\r
120                                                 continue;\r
121                                         }\r
122 \r
123                                         currentIndex++;\r
124 \r
125                                         if ( currentIndex == target )\r
126                                         {\r
127                                                 $ = candidate;\r
128                                                 break;\r
129                                         }\r
130                                 }\r
131                         }\r
132 \r
133                         return $ ? new CKEDITOR.dom.node( $ ) : null;\r
134                 },\r
135 \r
136                 getElementsByTag : function( tagName, namespace )\r
137                 {\r
138                         if ( !CKEDITOR.env.ie && namespace )\r
139                                 tagName = namespace + ':' + tagName;\r
140                         return new CKEDITOR.dom.nodeList( this.$.getElementsByTagName( tagName ) );\r
141                 },\r
142 \r
143                 /**\r
144                  * Gets the &lt;head&gt; element for this document.\r
145                  * @returns {CKEDITOR.dom.element} The &lt;head&gt; element.\r
146                  * @example\r
147                  * var element = <b>CKEDITOR.document.getHead()</b>;\r
148                  * alert( element.getName() );  // "head"\r
149                  */\r
150                 getHead : function()\r
151                 {\r
152                         var head = this.$.getElementsByTagName( 'head' )[0];\r
153                         head = new CKEDITOR.dom.element( head );\r
154 \r
155                         return (\r
156                         /** @ignore */\r
157                         this.getHead = function()\r
158                                 {\r
159                                         return head;\r
160                                 })();\r
161                 },\r
162 \r
163                 /**\r
164                  * Gets the &lt;body&gt; element for this document.\r
165                  * @returns {CKEDITOR.dom.element} The &lt;body&gt; element.\r
166                  * @example\r
167                  * var element = <b>CKEDITOR.document.getBody()</b>;\r
168                  * alert( element.getName() );  // "body"\r
169                  */\r
170                 getBody : function()\r
171                 {\r
172                         var body = new CKEDITOR.dom.element( this.$.body );\r
173 \r
174                         return (\r
175                         /** @ignore */\r
176                         this.getBody = function()\r
177                                 {\r
178                                         return body;\r
179                                 })();\r
180                 },\r
181 \r
182                 getDocumentElement : function()\r
183                 {\r
184                         var documentElement = new CKEDITOR.dom.element( this.$.documentElement );\r
185 \r
186                         return (\r
187                         /** @ignore */\r
188                         this.getDocumentElement = function()\r
189                                 {\r
190                                         return documentElement;\r
191                                 })();\r
192                 },\r
193 \r
194                 /**\r
195                  * Gets the window object that holds this document.\r
196                  * @returns {CKEDITOR.dom.window} The window object.\r
197                  * @example\r
198                  */\r
199                 getWindow : function()\r
200                 {\r
201                         var win = new CKEDITOR.dom.window( this.$.parentWindow || this.$.defaultView );\r
202 \r
203                         return (\r
204                         /** @ignore */\r
205                         this.getWindow = function()\r
206                                 {\r
207                                         return win;\r
208                                 })();\r
209                 }\r
210         });\r