/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2008 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 ==
 *
 * This is the integration file for JavaScript.
 *
 * It defines the FCKeditor class that can be used to create editor
 * instances in a HTML page in the client side. For server side
 * operations, use the specific integration system.
 */

// FCKeditor Class
var FCKeditor = function( instanceName, width, height, toolbarSet, value )
{
	// Properties
	this.InstanceName	= instanceName ;
	this.Width			= width			|| '100%' ;
	this.Height			= height		|| '200' ;
	this.ToolbarSet		= toolbarSet	|| 'Default' ;
	this.Value			= value			|| '' ;
	this.BasePath		= FCKeditor.BasePath ;
	this.CheckBrowser	= true ;
	this.DisplayErrors	= true ;

	this.Config			= new Object() ;

	// Events
	this.OnError		= null ;	// function( source, errorNumber, errorDescription )
};

/**
 * This is the default BasePath used by all editor instances.
 */
FCKeditor.BasePath = '/fckeditor/' ;

/**
 * The minimum height used when replacing textareas.
 */
FCKeditor.MinHeight = 200 ;

/**
 * The minimum width used when replacing textareas.
 */
FCKeditor.MinWidth = 750 ;

FCKeditor.prototype.Version			= '2.6.3' ;
FCKeditor.prototype.VersionBuild	= '19836' ;

FCKeditor.prototype.Create = function()
{
	document.write( this.CreateHtml() ) ;
};

FCKeditor.prototype.CreateHtml = function()
{
	// Check for errors
	if ( !this.InstanceName || this.InstanceName.length == 0 )
	{
		this._ThrowError( 701, 'You must specify an instance name.' ) ;
		return '' ;
	}

	var sHtml = '' ;

	if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
	{
		sHtml += '<input type="hidden" id="' + this.InstanceName + '" name="' + this.InstanceName + '" value="' + this._HTMLEncode( this.Value ) + '" style="display:none" />' ;
		sHtml += this._GetConfigHtml() ;
		sHtml += this._GetIFrameHtml() ;
	}
	else
	{
		var sWidth  = this.Width.toString().indexOf('%')  > 0 ? this.Width  : this.Width  + 'px' ;
		var sHeight = this.Height.toString().indexOf('%') > 0 ? this.Height : this.Height + 'px' ;

		sHtml += '<textarea name="' + this.InstanceName +
			'" rows="4" cols="40" style="width:' + sWidth +
			';height:' + sHeight ;

		if ( this.TabIndex )
			sHtml += '" tabindex="' + this.TabIndex ;

		sHtml += '">' +
			this._HTMLEncode( this.Value ) +
			'<\/textarea>' ;
	}

	return sHtml ;
};

FCKeditor.prototype.ReplaceTextarea = function()
{
	if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
	{
		// We must check the elements firstly using the Id and then the name.
		var oTextarea = document.getElementById( this.InstanceName ) ;
		var colElementsByName = document.getElementsByName( this.InstanceName ) ;
		var i = 0;
		while ( oTextarea || i == 0 )
		{
			if ( oTextarea && oTextarea.tagName.toLowerCase() == 'textarea' )
				break ;
			oTextarea = colElementsByName[i++] ;
		}

		if ( !oTextarea )
		{
			alert( 'Error: The TEXTAREA with id or name set to "' + this.InstanceName + '" was not found' ) ;
			return ;
		}

		oTextarea.style.display = 'none' ;

		if ( oTextarea.tabIndex )
			this.TabIndex = oTextarea.tabIndex ;

		this._InsertHtmlBefore( this._GetConfigHtml(), oTextarea ) ;
		this._InsertHtmlBefore( this._GetIFrameHtml(), oTextarea ) ;
	}
};

FCKeditor.prototype._InsertHtmlBefore = function( html, element )
{
	if ( element.insertAdjacentHTML )	// IE
		element.insertAdjacentHTML( 'beforeBegin', html ) ;
	else								// Gecko
	{
		var oRange = document.createRange() ;
		oRange.setStartBefore( element ) ;
		var oFragment = oRange.createContextualFragment( html );
		element.parentNode.insertBefore( oFragment, element ) ;
	}
};

FCKeditor.prototype._GetConfigHtml = function()
{
	var sConfig = '' ;
	for ( var o in this.Config )
	{
		if ( sConfig.length > 0 ) sConfig += '&amp;' ;
		sConfig += encodeURIComponent( o ) + '=' + encodeURIComponent( this.Config[o] ) ;
	}

	return '<input type="hidden" id="' + this.InstanceName + '___Config" value="' + sConfig + '" style="display:none" />' ;
};

FCKeditor.prototype._GetIFrameHtml = function()
{
	var sFile = 'fckeditor.html' ;

	try
	{
		if ( (/fcksource=true/i).test( window.top.location.search ) )
			sFile = 'fckeditor.original.html' ;
	}
	catch (e) { /* Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error). */ }

	var sLink = this.BasePath + 'editor/' + sFile + '?InstanceName=' + encodeURIComponent( this.InstanceName ) ;
	if (this.ToolbarSet)
		sLink += '&amp;Toolbar=' + this.ToolbarSet ;

	html = '<iframe id="' + this.InstanceName +
		'___Frame" src="' + sLink +
		'" width="' + this.Width +
		'" height="' + this.Height ;

	if ( this.TabIndex )
		html += '" tabindex="' + this.TabIndex ;

	html += '" frameborder="0" scrolling="no"></iframe>' ;

	return html ;
};

FCKeditor.prototype._IsCompatibleBrowser = function()
{
	return FCKeditor_IsCompatibleBrowser() ;
};

FCKeditor.prototype._ThrowError = function( errorNumber, errorDescription )
{
	this.ErrorNumber		= errorNumber ;
	this.ErrorDescription	= errorDescription ;

	if ( this.DisplayErrors )
	{
		document.write( '<div style="COLOR: #ff0000">' ) ;
		document.write( '[ FCKeditor Error ' + this.ErrorNumber + ': ' + this.ErrorDescription + ' ]' ) ;
		document.write( '</div>' ) ;
	}

	if ( typeof( this.OnError ) == 'function' )
		this.OnError( this, errorNumber, errorDescription ) ;
};

FCKeditor.prototype._HTMLEncode = function( text )
{
	if ( typeof( text ) != "string" )
		text = text.toString() ;

	text = text.replace(
		/&/g, "&amp;").replace(
		/"/g, "&quot;").replace(
		/</g, "&lt;").replace(
		/>/g, "&gt;") ;

	return text ;
};

;(function()
{
	var textareaToEditor = function( textarea )
	{
		var editor = new FCKeditor( textarea.name ) ;

		editor.Width = Math.max( textarea.offsetWidth, FCKeditor.MinWidth ) ;
		editor.Height = Math.max( textarea.offsetHeight, FCKeditor.MinHeight ) ;

		return editor ;
	}

	/**
	 * Replace all <textarea> elements available in the document with FCKeditor
	 * instances.
	 *
	 *	// Replace all <textarea> elements in the page.
	 *	FCKeditor.ReplaceAllTextareas() ;
	 *
	 *	// Replace all <textarea class="myClassName"> elements in the page.
	 *	FCKeditor.ReplaceAllTextareas( 'myClassName' ) ;
	 *
	 *	// Selectively replace <textarea> elements, based on custom assertions.
	 *	FCKeditor.ReplaceAllTextareas( function( textarea, editor )
	 *		{
	 *			// Custom code to evaluate the replace, returning false if it
	 *			// must not be done.
	 *			// It also passes the "editor" parameter, so the developer can
	 *			// customize the instance.
	 *		} ) ;
	 */
	FCKeditor.ReplaceAllTextareas = function()
	{
		var textareas = document.getElementsByTagName( 'textarea' ) ;

		for ( var i = 0 ; i < textareas.length ; i++ )
		{
			var editor = null ;
			var textarea = textareas[i] ;
			var name = textarea.name ;

			// The "name" attribute must exist.
			if ( !name || name.length == 0 )
				continue ;

			if ( typeof arguments[0] == 'string' )
			{
				// The textarea class name could be passed as the function
				// parameter.

				var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' ) ;

				if ( !classRegex.test( textarea.className ) )
					continue ;
			}
			else if ( typeof arguments[0] == 'function' )
			{
				// An assertion function could be passed as the function parameter.
				// It must explicitly return "false" to ignore a specific <textarea>.
				editor = textareaToEditor( textarea ) ;
				if ( arguments[0]( textarea, editor ) === false )
					continue ;
			}

			if ( !editor )
				editor = textareaToEditor( textarea ) ;

			editor.ReplaceTextarea() ;
		}
	};
})() ;

function FCKeditor_IsCompatibleBrowser()
{
	var sAgent = navigator.userAgent.toLowerCase() ;

	// Internet Explorer 5.5+
	if ( /*@cc_on!@*/false && sAgent.indexOf("mac") == -1 )
	{
		var sBrowserVersion = navigator.appVersion.match(/MSIE (.\..)/)[1] ;
		return ( sBrowserVersion >= 5.5 ) ;
	}

	// Gecko (Opera 9 tries to behave like Gecko at this point).
	if ( navigator.product == "Gecko" && navigator.productSub >= 20030210 && !( typeof(opera) == 'object' && opera.postError ) )
		return true ;

	// Opera 9.50+
	if ( window.opera && window.opera.version && parseFloat( window.opera.version() ) >= 9.5 )
		return true ;

	// Adobe AIR
	// Checked before Safari because AIR have the WebKit rich text editor
	// features from Safari 3.0.4, but the version reported is 420.
	if ( sAgent.indexOf( ' adobeair/' ) != -1 )
		return ( sAgent.match( / adobeair\/(\d+)/ )[1] >= 1 ) ;	// Build must be at least v1

	// Safari 3+
	if ( sAgent.indexOf( ' applewebkit/' ) != -1 )
		return ( sAgent.match( / applewebkit\/(\d+)/ )[1] >= 522 ) ;	// Build must be at least 522 (v3)

	return false ;
}
















/**************** I2RD Additions. ***********************/
var FCKeditorHelper = new Object();

 /** Modifies the prototype.js serializer to get the content from an FCKeditor if present. */
FCKeditorHelper.fckSetupRetryCount = 0;
FCKeditorHelper.serializerReplaced = false;
FCKeditorHelper.replaceSerializer = function() { 
	if(FCKeditorHelper.serializerReplaced || !Form || !Form.Element || !Form.Element.Serializers) return;
	try {
		if(typeof FCKeditorAPI != 'undefined') {
			 var beforeFCKSerializer = Form.Element.Serializers['textarea']; // keep the previous serializer for delegation
			 Form.Element.Serializers['textarea'] = function(element) {
		 		if(element.nodeName.toLowerCase() == "textarea") {
				 	try {
					 	var FCK = FCKeditorAPI.GetInstance(element.name);
						if (FCK != null) {
							// 1.5.1 changed the return API on us
							var match = /(\d+).(\d+).(\d+).*/.exec(Prototype.Version);
							if (match 
								&& (match[1] > 1 
									|| (match[1] == 1 && match[2] > 5) 
									|| (match[1] == 1 && match[2] == 5 && match[3] > 0)))
							{
						 		return FCK.GetXHTML();
							}
							else
							{
								return [element.name, FCK.GetXHTML()];
							}
						}
					} catch(e) { log4js.logger.error("Unable to call FCKeditorAPI.getInstance(..)", e); }
				}
				// no FCK editor, use the prototype.js defined serializer
			    return beforeFCKSerializer(element);
			 }
			 FCKeditorHelper.serializerReplaced = true;
		 }
	 } catch(e) { 
	 	if(FCKeditorHelper.fckSetupRetryCount > 16) {
			log4js.logger.error("FCKeditorAPI is undefined", e);
			FCKeditorHelper.fckSetupRetryCount = 0;
			if(!confirm("Timeout loading rich text editor. Press OK to keep waiting. Press Cancel to reload the page.")) {
				var w = window;
				if(window.top) w = window.top;
				w.location.reload();
			}
 		}	
 	}
 	if(!FCKeditorHelper.serializerReplaced && FCKeditorHelper.fckSetupRetryCount <= 16) {
 		FCKeditorHelper.fckSetupRetryCount++;
 		if(FCKeditorHelper.fckSetupRetryCount > 4)
	 		log4js.logger.warn("Can't find fck api. Will look again. #" + FCKeditorHelper.fckSetupRetryCount);
 		window.setTimeout(FCKeditorHelper.replaceSerializer, 500);
	} else {
		FCKeditorHelper.fckSetupRetryCount = 0;
	}
 }
 if(!log4js.logger || !log4js.logger.debug) alert("Logger missing.");
 
 /**
  * Creates an FCKeditor for a textarea that has the 'fckeditor' class name.
  * If a class name of "fckeditor_config_X" is present then a custom configuration
  * of "../FCKconfig/X.js" relative to the FCKeditor base directory is used. A
  * toolbar named "X" is also set.
  * @param area the textarea object.
  */
 FCKeditorHelper.fckactivate = function(area) {
	//log4js.logger.debug("Setting up FCKeditor "+area.id);
	if(area.style.visibility=='hidden')
		area.style.visibility='visible';
	var oFCKeditor = new FCKeditor(area.id, null, area.offsetHeight);
	oFCKeditor.BasePath="/resources/all/docroot/FCKeditor/";
	oFCKeditor.EnableSafari = true;
	oFCKeditor.EnableOpera = true;
	oFCKeditor.EnableKonqueror = false;

	// check for custom configuration
	var configMatch = area.className.match(/fckeditor_config_(\w+)/);
	if (configMatch)
	{
		oFCKeditor.Config["CustomConfigurationsPath"] = oFCKeditor.BasePath+"../FCKconfig/"+configMatch[1]+".js";
		oFCKeditor.ToolbarSet = configMatch[1];
	}
	oFCKeditor.ReplaceTextarea();
	window.setTimeout(FCKeditorHelper.replaceSerializer, 250);
 }
// Does an exclusion test. Hides commands.
FCKeditorHelper.checkPermission=function(tset){
    if(!tset){return;}
    var h,i,j,k,bar,nb,tbi,el,list = window.top.document.getElementsByTagName("dfn");
    for(h = 0; h < list.length; h++){
        el = list[h];
        if(!(el.className && el.className.match(/richtexteditorpermissionhelper/))){continue;}
        el = el.firstChild ? el.firstChild.nodeValue.split(",") : [];
        for(i=0; i < el.length; i++){
            tbi=el[i];
            for(j=0; j < tset.length; j++){
                bar = tset[j];
                if(bar == "/" || typeof bar.push == 'undefined'){continue;}
                nb=[];
                for(k=0; k < bar.length; k++){
                    if(tbi != bar[k]){
                        nb.push(bar[k]);
                    }
                }
                tset[j] = nb;
            }
        }
    }
    bar=null;
    for(h = 0; h < tset.length; h++){
        el = bar;
        bar = tset[h];
        if(bar == "/" || (bar && bar.length == 0)){
            if(el == "/" || el.length == 0){delete tset[h];bar=tset[h-1];}
        }else if(el == "/" && (bar && bar.length < 4) && h > 2) {
            nb = tset[h-3];
            nb = nb.concat(bar);
            tset[h-3]=nb;
            bar=nb;
            delete tset[h];
        }
    }
};

/**
 * Finds all text areas with the fckeditor class and configures for FCKeditor.
 */
FCKeditorHelper.findFCKTextAreas = function() {
	try {
		var elements = new Array();
		for(var i = 0; i < document.forms.length; i++) {
			var f = document.forms[i];
			for(var h = 0; h < f.elements.length; h++) {
				var el = f.elements[h];
				    if(el.className && el.className.match(/fckeditor/) 
				    	&& el.nodeName.toLowerCase() == "textarea") {
		                elements.push(el);
		            }
			}
		}
		for(var h = 0; h < elements.length; h++) {
			var fe = elements[h];
			if(typeof fe.fckactivated == 'undefined') {
				fe.fckactivated = true;
				FCKeditorHelper.fckactivate(elements[h]);
			} 
		}
	} catch (e) {
		log4js.logger.error("Setup FCK text areas", e); 
	}
};
