text: ﻿/*
   * FCKeditor - The text editor for Internet - http://www.fckeditor.net
   * Copyright (C) 2003-2009 Frederico Caldeira Knabben
   *
   * == BEGIN LICENSE ==
   *
   * Licensed under the terms of any of the following licenses at your
   * choice:
   *
   *  - GNU General Public License Version 2 or later (the "GPL")
   *    http://www.gnu.org/licenses/gpl.html
   *
   *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
   *    http://www.gnu.org/licenses/lgpl.html
   *
   *  - Mozilla Public License Version 1.1 or later (the "MPL")
   *    http://www.mozilla.org/MPL/MPL-1.1.html
   *
   * == END LICENSE ==
   *
   * Compatibility code for Adobe AIR.
   */
  
  if ( FCKBrowserInfo.IsAIR )
  {
  	var FCKAdobeAIR = (function()
  	{
  		/*
  		 * ### Private functions.
  		 */
  
  		var getDocumentHead = function( doc )
  		{
  			var head ;
  			var heads = doc.getElementsByTagName( 'head' ) ;
  
  			if( heads && heads[0] )
  				head = heads[0] ;
  			else
  			{
  				head = doc.createElement( 'head' ) ;
  				doc.documentElement.insertBefore( head, doc.documentElement.firstChild ) ;
  			}
  
  			return head ;
  		} ;
  
  		/*
  		 * ### Public interface.
  		 */
  		return {
  			FCKeditorAPI_Evaluate : function( parentWindow, script )
  			{
  				// TODO : This one doesn't work always. The parent window will
  				// point to an anonymous function in this window. If this
  				// window is destroyied the parent window will be pointing to
  				// an invalid reference.
  
  				// Evaluate the script in this window.
  				eval( script ) ;
  
  				// Point the FCKeditorAPI property of the parent window to the
  				// local reference.
  				parentWindow.FCKeditorAPI = window.FCKeditorAPI ;
  			},
  
  			EditingArea_Start : function( doc, html )
  			{
  				// Get the HTML for the <head>.
  				var headInnerHtml = html.match( /<head>([\s\S]*)<\/head>/i )[1] ;
  
  				if ( headInnerHtml && headInnerHtml.length > 0 )
  				{
  					// Inject the <head> HTML inside a <div>.
  					// Do that before getDocumentHead because WebKit moves
  					// <link css> elements to the <head> at this point.
  					var div = doc.createElement( 'div' ) ;
  					div.innerHTML = headInnerHtml ;
  
  					// Move the <div> nodes to <head>.
  					FCKDomTools.MoveChildren( div, getDocumentHead( doc ) ) ;
  				}
  
  				doc.body.innerHTML = html.match( /<body>([\s\S]*)<\/body>/i )[1] ;
  
  				//prevent clicking on hyperlinks and navigating away
  				doc.addEventListener('click', function( ev )
  					{
  						ev.preventDefault() ;
  						ev.stopPropagation() ;
  					}, true ) ;
  			},
  
  			Panel_Contructor : function( doc, baseLocation )
  			{
  				var head = getDocumentHead( doc ) ;
  
  				// Set the <base> href.
  				head.appendChild( doc.createElement('base') ).href = baseLocation ;
  
  				doc.body.style.margin	= '0px' ;
  				doc.body.style.padding	= '0px' ;
  			},
  
  			ToolbarSet_GetOutElement : function( win, outMatch )
  			{
  				var toolbarTarget = win.parent ;
  
  				var targetWindowParts = outMatch[1].split( '.' ) ;
  				while ( targetWindowParts.length > 0 )
  				{
  					var part = targetWindowParts.shift() ;
  					if ( part.length > 0 )
  						toolbarTarget = toolbarTarget[ part ] ;
  				}
  
  				toolbarTarget = toolbarTarget.document.getElementById( outMatch[2] ) ;
  			},
  
  			ToolbarSet_InitOutFrame : function( doc )
  			{
  				var head = getDocumentHead( doc ) ;
  
  				head.appendChild( doc.createElement('base') ).href = window.document.location ;
  
  				var targetWindow = doc.defaultView;
  
  				targetWindow.adjust = function()
  				{
  					targetWindow.frameElement.height = doc.body.scrollHeight;
  				} ;
  
  				targetWindow.onresize = targetWindow.adjust ;
  				targetWindow.setTimeout( targetWindow.adjust, 0 ) ;
  
  				doc.body.style.overflow = 'hidden';
  				doc.body.innerHTML = document.getElementById( 'xToolbarSpace' ).innerHTML ;
  			}
  		} ;
  	})();
  
  	/*
  	 * ### Overrides
  	 */
  	( function()
  	{
  		// Save references for override reuse.
  		var _Original_FCKPanel_Window_OnFocus	= FCKPanel_Window_OnFocus ;
  		var _Original_FCKPanel_Window_OnBlur	= FCKPanel_Window_OnBlur ;
  		var _Original_FCK_StartEditor			= FCK.StartEditor ;
  
  		FCKPanel_Window_OnFocus = function( e, panel )
  		{
  			// Call the original implementation.
  			_Original_FCKPanel_Window_OnFocus.call( this, e, panel ) ;
  
  			if ( panel._focusTimer )
  				clearTimeout( panel._focusTimer ) ;
  		}
  
  		FCKPanel_Window_OnBlur = function( e, panel )
  		{
  			// Delay the execution of the original function.
  			panel._focusTimer = FCKTools.SetTimeout( _Original_FCKPanel_Window_OnBlur, 100, this, [ e, panel ] ) ;
  		}
  
  		FCK.StartEditor = function()
  		{
  			// Force pointing to the CSS files instead of using the inline CSS cached styles.
  			window.FCK_InternalCSS			= FCKConfig.BasePath + 'css/fck_internal.css' ;
  			window.FCK_ShowTableBordersCSS	= FCKConfig.BasePath + 'css/fck_showtableborders_gecko.css' ;
  
  			_Original_FCK_StartEditor.apply( this, arguments ) ;
  		}
  	})();
  }
  