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