
/* Merged Plone Javascript file
 * This file is dynamically assembled from separate parts.
 * Some of these parts have 3rd party licenses or copyright information attached
 * Such information is valid for that section,
 * not for the entire composite file
 * originating files are separated by - filename.js -
 */

/* - fckeditor.js - */
/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2010 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.6' ;
FCKeditor.prototype.VersionBuild	= '25427' ;

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 ( document.getElementById( this.InstanceName + '___Frame' ) )
		return ;
	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 ;

	var 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 ;
}


/* - fck_plone.js - */
var FCKBaseHref = {};


// adapted from $Id: kupuploneeditor.js 9879 2005-03-18 12:04:00Z yuppie $
makeLinksRelative = function(basehref, contents) {
    var base=basehref.replace('http://www.ncipip.org','');
    var href = base.replace(/\/[^\/]*$/, '/');
    var hrefparts = href.split('/');
    return contents.replace(/(<[^>]* (?:src|href)=")([^"]*)"/g,
        function(str, tag, url, offset, contents) {
            url=url.replace('http://www.ncipip.org','');
            // gruikkk patch for old gecko content inner anchors fck bug
            if (url.substring(0,1)== '#') {
                str = tag + url +'"';
            }
            else {
                var urlparts = url.split('#');
                var anchor = urlparts[1] || '';
                url = urlparts[0];
                var urlparts = url.split('/');
                var common = 0;
                while (common < urlparts.length &&
                       common < hrefparts.length &&
                       urlparts[common]==hrefparts[common])
                    common++;
                var last = urlparts[common];
                if (common+1 == urlparts.length && last=='emptypage') {
                    urlparts[common] = '';
                }
                // The base and the url have 'common' parts in common.
                if (common > 0) {
                    var path = new Array();
                    var i = 0;
                    for (; i+common < hrefparts.length-1; i++) {
                        path[i] = '..';
                    };
                    while (common < urlparts.length) {
                        path[i++] = urlparts[common++];
                    };
                    if (i==0) {
                        path[i++] = '.';
                    }
                    str = path.join('/');
                    if (anchor) {
                        str = [str,anchor].join('#');
                    }
                    str = tag + str+'"';
                }
            }    
            return str;
        });
};

finalizePublication = function ( editorInstance ) {
   var oField = editorInstance.LinkedField;
   var fieldName = oField.name;
   var baseHref = FCKBaseHref[fieldName];
   if (baseHref) {
       relativeLinksHtml = makeLinksRelative(FCKBaseHref[fieldName], editorInstance.GetXHTML());
       oField.value = relativeLinksHtml;
   }  
   else oField.value = editorInstance.GetXHTML();
   // for control only
   // alert(oField.value);
}


getParamValue = function (id) {
    value = document.getElementById(id).value;
    if (value=='true') return true;
    if (value=='false') return false;
    return value;
}


FCKeditor_Plone_start_instance = function (fckContainer, inputname) {
        var inputContainer = document.getElementById (inputname + '_' + 'cleaninput');
        if (inputContainer) {        
            var fckParams = [
                             'path_user', 'base_path', 'fck_basehref', 'links_basehref',
                             'input_url', 'allow_server_browsing', 'browser_root', 
                             'allow_file_upload', 'allow_image_upload', 'allow_flash_upload', 
                             'fck_skin_path', 'lang', 'fck_default_r2l', 'force_paste_as_text',  
                             'allow_latin_entities', 'spellchecker', 'keyboard_entermode', 
                             'keyboard_shiftentermode', 'fck_toolbar', 'editor_width', 'editor_height'
                             ];
            var fckValues = {};
            
            for (var i=0; i<fckParams.length; i++)  {
               var id = inputname + '_' + fckParams [i];
               fckValues [fckParams [i]] = getParamValue(id);
            }
            
            var oFck = new FCKeditor(inputname); 
            var pathUser = fckValues ['path_user'] + '/';          
            oFck.BasePath = fckValues ['base_path'] + '/';  
            oFck.Config['CustomConfigurationsPath'] = fckValues ['input_url'] + '/fckconfigPlone.js?field_name='+ inputname;
            oFck.BaseHref = fckValues ['fck_basehref'];
            FCKBaseHref[inputname] = fckValues ['links_basehref'];
            if (inputContainer.innerText != undefined) oFck.Value = inputContainer.innerText;
            else oFck.Value = inputContainer.textContent;
            oFck.Config['LinkBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['LinkBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['LinkUpload'] = fckValues ['allow_file_upload'] ;
            oFck.Config['LinkUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['ImageBrowser'] = fckValues ['allow_server_browsing'];      
            oFck.Config['ImageBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Image&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['ImageUpload'] = fckValues ['allow_image_upload'] ; 
            oFck.Config['ImageUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['FlashBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['FlashBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Flash&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['FlashUpload'] = fckValues ['allow_flash_upload'] ; 
            oFck.Config['FlashUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['MediaBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['MediaBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Media&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;        
            oFck.Config['SkinPath'] = fckValues ['base_path'] + '/editor/' + fckValues ['fck_skin_path'];
            oFck.Config['AutoDetectLanguage'] = false;
            oFck.Config['DefaultLanguage'] = fckValues ['lang'];
            oFck.Config['ForcePasteAsPlainText'] = fckValues ['force_paste_as_text'];
            oFck.Config['IncludeLatinEntities'] = fckValues ['allow_latin_entities'];
            oFck.Config['SpellChecker'] = fckValues ['spellchecker'];
            oFck.Config['EnterMode'] = fckValues ['keyboard_entermode'];
            oFck.Config['ShiftEnterMode'] = fckValues ['keyboard_shiftentermode'];
            oFck.ToolbarSet = fckValues ['fck_toolbar']; 
            oFck.Width = fckValues ['editor_width']; 
            oFck.Height = fckValues ['editor_height'];
            try {
               fckContainer.innerHTML = oFck.CreateHtml();
               document.getElementById(inputname + '_fckLoading').style.display = 'none';
            }
            catch(e) {
               document.getElementById(inputname + '_fckLoading').style.display = 'none';
               document.getElementById(inputname + '_fckError').style.display = 'block';
            }
        }  

}

Save_inline = function ( fieldname, form, editorInstance ) {  
    if (editorInstance.Commands.GetCommand('FitWindow').GetState()){
        kukit.log('Full screen mode must be disabled before saving inline');
        editorInstance.Commands.GetCommand('FitWindow').Execute();
    } ;
    saveField = document.getElementById(fieldname + '_fckSaveField');
    if (saveField) {
        kukit.log('Fire the savekupu server event = save inline without submitting');
        saveField.style.visibility='visible';
        if ( saveField.fireEvent ) {
            saveField.fireEvent('onChange');
        }
        else {
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent("change",true,true);
            saveField.dispatchEvent( evt );        
        }
        comp = (setTimeout("saveField.style.visibility='hidden'",2000));
        return false;
    }
    else {
        kukit.log('Try to submit the form in portal_factory');
        window.onbeforeunload = null;
        form.submit();
    }
}        



