/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.frameworks.jcr.web.fckeditor;
import javax.servlet.http.HttpServletRequest;
/**
* The main class of the class lib.<br>
* It's the container for all properties and the class that generate the output based on browser
* capabilities and configurations passed by the developer.
*
* @author Simone Chiaretta (simo@users.sourceforge.net)
*/
public class FCKeditor
{
private FCKeditorConfigurations oConfig;
private String instanceName;
private String userAgent;
private String value = "";
private String basePath;
private String toolbarSet = "Default";
private String width = "100%";
private String height = "200";
/**
* Get the unique name of the editor
*
* @return name
*/
public String getInstanceName()
{
return instanceName;
}
/**
* Set the unique name of the editor
*
* @param value
* name
*/
public void setInstanceName(String value)
{
instanceName = value;
}
/**
* Get the initial value to be edited.<br>
* In HTML code
*
* @return value
*/
public String getValue()
{
return value;
}
/**
* Set the initial value to be edited.<br>
* In HTML code
*
* @param value
* value
*/
public void setValue(String value)
{
this.value = value;
}
/**
* Get the dir where the FCKeditor files reside on the server
*
* @return path
*/
public String getBasePath()
{
return basePath;
}
/**
* Set the dir where the FCKeditor files reside on the server.<br>
*<b>Remarks</b>:<br>
*Avoid using relative paths. It is preferable to set the base path starting from the root (/).<br>
*Always finish the path with a slash (/).
*
* @param value
* path
*/
public void setBasePath(String value)
{
basePath = value;
}
/**
* Get the name of the toolbar to display
*
* @return toolbar name
*/
public String getToolbarSet()
{
return toolbarSet;
}
/**
* Set the name of the toolbar to display
*
* @param value
* toolbar name
*/
public void setToolbarSet(String value)
{
toolbarSet = value;
}
/**
* Get the width of the textarea
*
* @return width
*/
public String getWidth()
{
return width;
}
/**
* Set the width of the textarea
*
* @param value
* width
*/
public void setWidth(String value)
{
width = value;
}
/**
* Get the height of the textarea
*
* @return height
*/
public String getHeight()
{
return height;
}
/**
* Set the height of the textarea
*
* @param value
* height
*/
public void setHeight(String value)
{
height = value;
}
/**
* Get the advanced configuation set.<br>
* Adding element to this collection you can override the settings specified in the config.js
* file.
*
* @return configuration collection
*/
public FCKeditorConfigurations getConfig()
{
return oConfig;
}
/**
* Set the advanced configuation set.
*
* @param value
* configuration collection
*/
public void setConfig(FCKeditorConfigurations value)
{
oConfig = value;
}
/**
* Initialize the object setting all value to the default ones.
* <ul>
* <li>width: 100%</li>
* <li>height: 200</li>
* <li>toolbar name: Default</li>
* <li>basePath: context root + "/FCKeditor/"</li>
* </ul>
*
* @param req
* request object
*/
public FCKeditor(HttpServletRequest req)
{
// request=req;
userAgent = req.getHeader("user-agent");
basePath = req.getContextPath() + "/FCKeditor/";
oConfig = new FCKeditorConfigurations();
}
/**
* Initialize the object setting the unique name and then all value to the default ones.
* <ul>
* <li>width: 100%</li>
* <li>height: 200</li>
* <li>toolbar name: Default</li>
* <li>basePath: context root + "/FCKeditor/"</li>
* </ul>
*
* @param req
* request object
* @param parInstanceName
* unique name
*/
public FCKeditor(HttpServletRequest req, String parInstanceName)
{
// request=req;
userAgent = req.getHeader("user-agent");
basePath = req.getContextPath() + "/FCKeditor/";
instanceName = parInstanceName;
oConfig = new FCKeditorConfigurations();
}
/**
* Initialize the object setting all basic configurations.<br>
* The basePath is context root + "/FCKeditor/"
*
* @param req
* request object
* @param parInstanceName
* unique name
* @param parWidth
* width
* @param parHeight
* height
* @param parToolbarSet
* toolbarSet name
* @param parValue
* initial value
*/
public FCKeditor(HttpServletRequest req, String parInstanceName, String parWidth, String parHeight,
String parToolbarSet, String parValue)
{
// request=req;
userAgent = req.getHeader("user-agent");
basePath = req.getContextPath() + "/FCKeditor/";
instanceName = parInstanceName;
width = parWidth;
height = parHeight;
toolbarSet = parToolbarSet;
value = parValue;
oConfig = new FCKeditorConfigurations();
}
/**
* Initialize the object without param
*
*/
FCKeditor()
{
}
boolean isCompatible()
{
// [PN] 11.07.06 userAgent as global var, no request stored in editor
// String userAgent=request.getHeader("user-agent");
if (userAgent == null)
return false;
String userAgentString = userAgent.toLowerCase();
if ((userAgentString.indexOf("msie") != -1) && (userAgentString.indexOf("mac") == -1)
&& (userAgentString.indexOf("opera") == -1))
{
if (retrieveBrowserVersion(userAgentString) >= 5.5)
return true;
}
else if (userAgentString.indexOf("chrome") != -1)
{
if (retrieveBrowserVersion(userAgentString) >= 5)
return true;
}
else if (userAgentString.indexOf("gecko") != -1)
{
if (retrieveBrowserVersion(userAgentString) >= 20030210)
return true;
}
return false;
}
double retrieveBrowserVersion(String userAgentString)
{
try{
if (userAgentString.indexOf("msie") > -1)
{
String str = userAgentString.substring(userAgentString.indexOf("msie") + 5);
return Double.parseDouble(str.substring(0, str.indexOf(";")));
}
else if (userAgentString.indexOf("chrome")>-1)
{
String str = userAgentString.substring(userAgentString.indexOf("chrome") + 7,userAgentString.indexOf(" safari"));
if(str.length()==0)
return 0;
else
return Double.parseDouble(str.substring(0,str.indexOf(".")+2));
}
else
{
String str = userAgentString.substring(userAgentString.indexOf("gecko") + 6);
return Double.parseDouble(str.substring(0, 8));
}
}
catch (NumberFormatException e)
{
return -1;
}
}
private String HTMLEncode(String txt)
{
txt = txt.replaceAll("&", "&");
txt = txt.replaceAll("<", "<");
txt = txt.replaceAll(">", ">");
txt = txt.replaceAll("\"", """);
txt = txt.replaceAll("'", "");
return txt;
}
/**
* Generate the HTML Code for the editor. <br>
* Evalute the browser capabilities and generate the editor if IE 5.5 or Gecko 20030210 or
* greater, or a simple textarea otherwise.
*
* @return html code
*/
public String create()
{
StringBuffer strEditor = new StringBuffer();
strEditor.append("<div>");
String encodedValue = HTMLEncode(value);
if (isCompatible())
{
strEditor.append("<input type=\"hidden\" id=\"" + instanceName + "\" name=\"" + instanceName + "\" value=\""
+ encodedValue + "\">");
strEditor.append(createConfigHTML());
strEditor.append(createIFrameHTML());
}
else
{
strEditor.append("<TEXTAREA name=\"" + instanceName + "\" rows=\"4\" cols=\"40\" style=\"WIDTH: " + width
+ "; HEIGHT: " + height + "\" wrap=\"virtual\">" + encodedValue + "</TEXTAREA>");
}
strEditor.append("</div>");
return strEditor.toString();
}
private String createConfigHTML()
{
String configStr = oConfig.getUrlParams();
if (!configStr.equals(""))
configStr = configStr.substring(1);
return "<input type=\"hidden\" id=\"" + instanceName + "___Config\" value=\"" + configStr + "\">";
}
private String createIFrameHTML()
{
StringBuilder sLink =
new StringBuilder(basePath).append("editor/fckeditor.html?InstanceName=").append(instanceName);
if (!toolbarSet.equals(""))
{
sLink.append("&Toolbar=").append(toolbarSet);
}
return "<iframe id=\"" + instanceName + "___Frame\" src=\"" + sLink.toString() + "\" width=\"" + width
+ "\" height=\"" + height + "\" frameborder=\"no\" scrolling=\"no\"></iframe>";
}
/**
* @return the userAgent
*/
public String getUserAgent()
{
return userAgent;
}
/**
* @param userAgent
* the userAgent to set
*/
public void setUserAgent(String userAgent)
{
this.userAgent = userAgent;
}
}