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.env} object, which constains
  8  *		environment and browser information.
  9  */
 10
 11 if ( !CKEDITOR.env )
 12 {
 13 	/**
 14 	 * Environment and browser information.
 15 	 * @namespace
 16 	 * @example
 17 	 */
 18 	CKEDITOR.env = (function()
 19 	{
 20 		var agent = navigator.userAgent.toLowerCase();
 21 		var opera = window.opera;
 22
 23 		var env =
 24 		/** @lends CKEDITOR.env */
 25 		{
 26 			/**
 27 			 * Indicates that CKEditor is running on Internet Explorer.
 28 			 * @type Boolean
 29 			 * @example
 30 			 * if ( CKEDITOR.env.ie )
 31 			 *     alert( "I'm on IE!" );
 32 			 */
 33 			ie		: /*@cc_on!@*/false,
 34
 35 			/**
 36 			 * Indicates that CKEditor is running on Opera.
 37 			 * @type Boolean
 38 			 * @example
 39 			 * if ( CKEDITOR.env.opera )
 40 			 *     alert( "I'm on Opera!" );
 41 			 */
 42 			opera	: ( !!opera && opera.version ),
 43
 44 			/**
 45 			 * Indicates that CKEditor is running on a WebKit based browser, like
 46 			 * Safari.
 47 			 * @type Boolean
 48 			 * @example
 49 			 * if ( CKEDITOR.env.webkit )
 50 			 *     alert( "I'm on WebKit!" );
 51 			 */
 52 			webkit	: ( agent.indexOf( ' applewebkit/' ) > -1 ),
 53
 54 			/**
 55 			 * Indicates that CKEditor is running on Adobe AIR.
 56 			 * @type Boolean
 57 			 * @example
 58 			 * if ( CKEDITOR.env.air )
 59 			 *     alert( "I'm on AIR!" );
 60 			 */
 61 			air		: ( agent.indexOf( ' adobeair/' ) > -1 ),
 62
 63 			/**
 64 			 * Indicates that CKEditor is running on Macintosh.
 65 			 * @type Boolean
 66 			 * @example
 67 			 * if ( CKEDITOR.env.mac )
 68 			 *     alert( "I love apples!" );
 69 			 */
 70 			mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
 71
 72 			quirks : ( document.compatMode == 'BackCompat' ),
 73
 74 			isCustomDomain : function()
 75 			{
 76 				return this.ie && document.domain != window.location.hostname;
 77 			}
 78 		};
 79
 80 		/**
 81 		 * Indicates that CKEditor is running on a Gecko based browser, like
 82 		 * Firefox.
 83 		 * @name CKEDITOR.env.gecko
 84 		 * @type Boolean
 85 		 * @example
 86 		 * if ( CKEDITOR.env.gecko )
 87 		 *     alert( "I'm riding a gecko!" );
 88 		 */
 89 		env.gecko = ( navigator.product == 'Gecko' && !env.webkit && !env.opera );
 90
 91 		var version = 0;
 92
 93 		// Internet Explorer 6.0+
 94 		if ( env.ie )
 95 		{
 96 			version = parseFloat( agent.match( /msie (\d+)/ )[1] );
 97
 98 			/**
 99 			 *  Indicate IE8 browser.
100 			 */
101 			env.ie8 = !!document.documentMode;
102
103 			/**
104 			 * Indicte IE8 document mode.
105 			 */
106 			env.ie8Compat = document.documentMode == 8;
107
108 			/**
109 			 * Indicates that CKEditor is running on an IE7-like environment, which
110 			 * includes IE7 itself and IE8's IE7 document mode.
111 			 * @type Boolean
112 			 */
113 			env.ie7Compat = ( ( version == 7 && !document.documentMode )
114 					|| document.documentMode == 7 );
115
116 			/**
117 			 * Indicates that CKEditor is running on an IE6-like environment, which
118 			 * includes IE6 itself and IE7 and IE8 quirks mode.
119 			 * @type Boolean
120 			 * @example
121 			 * if ( CKEDITOR.env.ie6Compat )
122 			 *     alert( "I'm on IE6 or quirks mode!" );
123 			 */
124 			env.ie6Compat = ( version < 7 || env.quirks );
125
126 		}
127
128 		// Gecko.
129 		if ( env.gecko )
130 		{
131 			var geckoRelease = agent.match( /rv:([\d\.]+)/ );
132 			if ( geckoRelease )
133 			{
134 				geckoRelease = geckoRelease[1].split( '.' );
135 				version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
136 			}
137 		}
138
139 		// Opera 9.50+
140 		if ( env.opera )
141 			version = parseFloat( opera.version() );
142
143 		// Adobe AIR 1.0+
144 		// Checked before Safari because AIR have the WebKit rich text editor
145 		// features from Safari 3.0.4, but the version reported is 420.
146 		if ( env.air )
147 			version = parseFloat( agent.match( / adobeair\/(\d+)/ )[1] );
148
149 		// WebKit 522+ (Safari 3+)
150 		if ( env.webkit )
151 			version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
152
153 		/**
154 		 * Contains the browser version.
155 		 *
156 		 * For gecko based browsers (like Firefox) it contains the revision
157 		 * number with first three parts concatenated with a padding zero
158 		 * (e.g. for revision 1.9.0.2 we have 10900).
159 		 *
160 		 * For webkit based browser (like Safari and Chrome) it contains the
161 		 * WebKit build version (e.g. 522).
162 		 * @name CKEDITOR.env.version
163 		 * @type Boolean
164 		 * @example
165 		 * if ( CKEDITOR.env.ie && <b>CKEDITOR.env.version</b> <= 6 )
166 		 *     alert( "Ouch!" );
167 		 */
168 		env.version = version;
169
170 		/**
171 		 * Indicates that CKEditor is running on a compatible browser.
172 		 * @name CKEDITOR.env.isCompatible
173 		 * @type Boolean
174 		 * @example
175 		 * if ( CKEDITOR.env.isCompatible )
176 		 *     alert( "Your browser is pretty cool!" );
177 		 */
178 		env.isCompatible =
179 			( env.ie && version >= 6 ) ||
180 			( env.gecko && version >= 10801 ) ||
181 			( env.opera && version >= 9.5 ) ||
182 			( env.air && version >= 1 ) ||
183 			( env.webkit && version >= 522 ) ||
184 			false;
185
186 		// The CSS class to be appended on the main UI containers, making it
187 		// easy to apply browser specific styles to it.
188 		env.cssClass =
189 			'cke_browser_' + (
190 				env.ie ? 'ie' :
191 				env.gecko ? 'gecko' :
192 				env.opera ? 'opera' :
193 				env.air ? 'air' :
194 				env.webkit ? 'webkit' :
195 				'unknown' );
196
197 		if ( env.quirks )
198 			env.cssClass += ' cke_browser_quirks';
199
200 		if ( env.ie )
201 		{
202 			env.cssClass += ' cke_browser_ie' + (
203 				env.version < 7 ? '6' :
204 				env.version >= 8 ? '8' :
205 				'7' );
206
207 			if ( env.quirks )
208 				env.cssClass += ' cke_browser_iequirks';
209 		}
210
211 		if ( env.gecko && version < 10900 )
212 			env.cssClass += ' cke_browser_gecko18';
213
214 		return env;
215 	})();
216 }
217
218 // PACKAGER_RENAME( CKEDITOR.env )
219 // PACKAGER_RENAME( CKEDITOR.env.ie )
220