package org.opengroupware.jope.jsapp;

import java.util.Map;

import org.mozilla.javascript.Callable;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.Wrapper;

public class JSUtil {
  public static Object[] emptyArgs = new Object[0];

  public static Object callJSFuncWhenAvailable
    (Scriptable _wrappedObject, Map<String, Object> _slots,
     Context _jscx, String _name, Object[] _args)
  {
    if (_slots == null)
      return Scriptable.NOT_FOUND;

    Object func = _slots.get(_name);
    if (!(func instanceof Callable)) // the slot is there, but its not a func
      return Scriptable.NOT_FOUND; // TBD: log that?
    
    /* wrap arguments */
    
    if (_args != null && _args.length > 0) {
      Object[] wrappedArgs = new Object[_args.length];
      for (int i = 0; i < _args.length; i++) {
        Object arg = _args[i];
        
        if (arg == null)
          wrappedArgs[i] = null;
        else if (arg instanceof Scriptable)
          wrappedArgs[i] = arg;
        else
          wrappedArgs[i] = Context.javaToJS(arg, _wrappedObject);
      }
    }
    
    /* call function */
    Object result = ((Callable)func).call(_jscx,
        _wrappedObject /* scope */,
        _wrappedObject /* this  */,
        _args);
    
    if (result instanceof Wrapper)
      return ((Wrapper)result).unwrap();
    
    return result;
  }

}
