/*
* $Id: Script.java,v 1.32 2008/12/11 08:03:30 laddi Exp $
* Created in 2000 by Tryggvi Larusson
*
* Copyright (C) 2000-2005 Idega Software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf. Use is subject to
* license terms.
*/
package com.idega.presentation;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import com.idega.idegaweb.IWConstants;
/**
* <p>
* This class renders out a script element.<br>
* An instance of this component can be used to define javascript functions and
* add to a component or a page.
* </p>
* Last modified: $Date: 2008/12/11 08:03:30 $ by $Author: laddi $
*
* @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a>
* @version $Revision: 1.32 $
*/
public class Script extends PresentationObject {
private String scriptType;
private Map<String, String> scriptCode;
private Hashtable<String, String> variables;
private Hashtable<String, String> methods;
private String scriptLines;
private static final String SCRIPT_TYPE_JAVACRIPT="javascript";
private static final String MIMETYPE_JAVACRIPT="text/javascript";
private static final String ATTRIBUTE_SOURCE="src";
private static final String ATTRIBUTE_TYPE="type";
public Script() {
this(SCRIPT_TYPE_JAVACRIPT);
}
public Script(String scriptLanguage) {
super();
setType();
setTransient(false);
}
public boolean isEmpty() {
return getScriptCode().isEmpty() && getMarkupAttribute(ATTRIBUTE_SOURCE) == null;
}
protected Map<String, String> getScriptCode() {
if (this.scriptCode == null) {
this.scriptCode = new LinkedHashMap<String, String>();
}
return this.scriptCode;
}
protected void setType() {
setType(MIMETYPE_JAVACRIPT);
}
protected void setType(String type) {
setMarkupAttribute(ATTRIBUTE_TYPE, type);
}
public void setScriptSource(String sourceURL) {
setMarkupAttribute(ATTRIBUTE_SOURCE, sourceURL);
}
public String getScriptCode(IWContext iwc) {
StringBuffer returnString = new StringBuffer();
for (Iterator<String> iter = getScriptCode().keySet().iterator(); iter.hasNext();) {
String function = iter.next();
String functionCode = getScriptCode().get(function);
returnString.append(functionCode + "\n");
}
return returnString.toString();
}
public boolean doesFunctionExist(String function) {
if (getScriptCode().get(function) == null) {
return false;
}
return true;
}
public void removeFunction(String functionName) {
getScriptCode().remove(functionName);
}
public void addToFunction(String functionName, String scriptString) {
if (getScriptCode() != null) {
String functionCode = getScriptCode().get(functionName);
if (functionCode != null) {
String beginString;
String endString;
String returnString;
int lastbracket;
lastbracket = functionCode.lastIndexOf("}");
beginString = functionCode.substring(0, lastbracket);
endString = "}";
returnString = beginString + "\n" + scriptString + "\n" + endString;
getScriptCode().put(functionName, returnString);
}
}
}
public void addToBeginningOfFunction(String functionName, String scriptString) {
if (getScriptCode() != null) {
String functionCode = getScriptCode().get(functionName);
if (functionCode != null) {
String beginString;
String endString;
String returnString;
int firstBracket;
firstBracket = functionCode.indexOf("{") + 1;
beginString = functionCode.substring(0, firstBracket);
endString = functionCode.substring(firstBracket + 1);
returnString = beginString + "\n" + scriptString + "\n" + endString;
getScriptCode().put(functionName, returnString);
}
}
}
public void addFunction(String functionName, String scriptString) {
getScriptCode().put(functionName, scriptString);
}
public void addVariable(String variableName, String variableValue) {
if (this.variables == null) {
this.variables = new Hashtable<String, String>();
}
this.variables.put(variableName, variableValue);
}
public void addVariable(String variableName) {
addVariable(variableName, null);
}
public String getVariable(String variableName) {
return this.variables.get(variableName);
}
public String getVariables() {
StringBuffer returnString = new StringBuffer();
if (this.variables != null) {
for (Enumeration<String> e = this.variables.keys(); e.hasMoreElements();) {
String variableName = e.nextElement();
String variableValue = getVariable(variableName);
if (variableValue != null) {
returnString.append("var " + variableName + " = " + variableValue + ";\n");
}
else {
returnString.append("var " + variableName + ";\n");
}
}
returnString.append("\n");
}
return returnString.toString();
}
public void addMethod(String methodName, String methodValue) {
if (this.methods == null) {
this.methods = new Hashtable<String, String>();
}
this.methods.put(methodName, methodValue);
}
public String getMethod(String methodName) {
return this.methods.get(methodName);
}
public String getMethods() {
StringBuffer returnString = new StringBuffer();
if (this.methods != null) {
for (Enumeration<String> e = this.methods.keys(); e.hasMoreElements();) {
String methodName = e.nextElement();
String methodValue = getMethod(methodName);
returnString.append("" + methodName + " = " + methodValue + ";\n");
}
returnString.append("\n");
}
return returnString.toString();
}
public void addScriptSource(String jsString) {
if (jsString != null) {
Script js = new Script();
js.setScriptSource(jsString);
//DOCUMENT.WRITE is illegal in XHTML you must use DOM writing instead
addFunction(jsString,
"var l=document.createElement('script'); "+
"l.setAttribute('src', '"+jsString+"'); "+
"l.setAttribute('type', 'text/javascript'); "+
"document.getElementsByTagName('head')[0].appendChild(l); \n");
// document.write("<scr"+"ipt
// src=/js/curtain_menu/menumaker.jsp><"+"/script>")
}
}
public String getFunction(String functionName) {
return getScriptCode().get(functionName);
}
@Override
public void print(IWContext iwc) throws Exception {
if (doPrint(iwc)) {
if (getMarkupLanguage().equals(IWConstants.MARKUP_LANGUAGE_HTML)) {
/*try {
com.idega.core.builder.data.ICDomain d = iwc.getDomain();
String serverUrl = d.getURL();
if (serverUrl != null) {
String src = getMarkupAttribute("src");
if (src != null && src.startsWith("/")) {
String newSrc = serverUrl + src;
setMarkupAttribute("src",newSrc);
}
}
}
catch (IDONoDatastoreError de) {
// de.printStackTrace();
}*/
// if (getInterfaceStyle().equals("something")){
// }
// else{
if (isMarkupAttributeSet(ATTRIBUTE_SOURCE)) {
println("<script " + getMarkupAttributesString() + " ></script>\n");
}
else {
println("<script " + getMarkupAttributesString() + " >");
println("<!--");
String lines = getScriptLines();
if(lines!=null){
print(lines);
}
print(getVariables());
print(getMethods());
print(getScriptCode(iwc));
println("//-->");
println("</script>\n");
}
// flush();
// }
}
else if (getMarkupLanguage().equals(IWConstants.MARKUP_LANGUAGE_WML)) {
println("");
}
}
}
public void setFunction(String functionName, String functionCode) {
addFunction(functionName, functionCode);
}
public void setVariable(String variableName, String variableValue) {
addVariable(variableName, variableValue);
}
@Override
public Object clone() {
Script obj = null;
try {
obj = (Script) super.clone();
obj.scriptType = this.scriptType;
if (this.scriptCode != null) {
obj.scriptCode = (Map<String, String>) ((LinkedHashMap<String, String>) this.scriptCode).clone();
}
}
catch (Exception ex) {
ex.printStackTrace(System.err);
}
return obj;
}
/*
* (non-Javadoc)
*
* @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext,
* java.lang.Object)
*/
@Override
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[]) state;
super.restoreState(context, values[0]);
this.scriptType = (String) values[1];
this.scriptCode = (Map<String, String>) values[2];
this.variables = (Hashtable<String, String>) values[3];
this.methods = (Hashtable<String, String>) values[4];
this.scriptLines = (String)values[5];
}
/*
* (non-Javadoc)
*
* @see javax.faces.component.StateHolder#saveState(javax.faces.context.FacesContext)
*/
@Override
public Object saveState(FacesContext context) {
Object values[] = new Object[6];
values[0] = super.saveState(context);
values[1] = this.scriptType;
values[2] = this.scriptCode;
values[3] = this.variables;
values[4] = this.methods;
values[5] = this.scriptLines;
return values;
}
@Override
public void println(String str) {
String convertedString = convertStringToUnicode(str);
super.println(convertedString);
}
@Override
public void print(String str) {
String convertedString = convertStringToUnicode(str);
super.print(convertedString);
}
private String convertStringToUnicode(String str) {
if (str == null) {
return null;
}
StringBuffer sb = new StringBuffer();
char c;
for (int i = 0; i < str.length(); ++i) {
c = str.charAt(i);
if (c >= 0x80) {
//encode all non basic latin characters
sb.append("\\u");
String hexCode = Integer.toHexString(c);
// be sure that the unicode is four digits long, that is
// add zero digits at the beginning if necessary
// the hexcode is already at least two digits long
// because c >= 128
int length = hexCode.length();
// keep it simple....
if (length == 2) {
sb.append("00");
}
else if (length == 3) {
sb.append('0');
}
sb.append(hexCode);
}
else
{
sb.append(c);
}
}
return sb.toString();
}
public String getScriptLines(){
return this.scriptLines;
}
/**
* <p>
* Adds a single script line to the source body of the script object, not within any function declaration.<br/>
* example: "document.myform.myinput.focus();".
* </p>
* @param singleScriptLine
*/
public void addScriptLine(String singleScriptLine) {
if(scriptLines==null){
scriptLines=singleScriptLine+"\n";
}
else{
scriptLines=scriptLines+singleScriptLine+"\n";
}
}
public boolean isEmpty(IWContext iwc) {
return getVariables().length() == 0 && getMethods().length() == 0 && getScriptCode(iwc).length() == 0 && getScriptLines() == null && getMarkupAttribute(ATTRIBUTE_SOURCE) == null;
}
}