/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.js.ast;

import com.google.gwt.dev.util.collect.Lists;

import java.io.Serializable;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * The root scope is the parent of every scope, it contains a list of browser
 * built-in identifiers that we should recognize and never obfuscate into.
 */
public final class JsRootScope extends JsScope {
  /*
   * NOTE: the startup sequence for this class is a bit tricky.
   */

  private static class SerializedForm implements Serializable {
    private Object readResolve() {
      return JsRootScope.INSTANCE;
    }
  }

  public static final JsRootScope INSTANCE;

  private static final String[] COMMON_BUILTINS = new String[]{
      // 15.1.1 Value Properties of the Global Object
      "NaN",
      "Infinity",
      "undefined",

      // 15.1.2 Function Properties of the Global Object
      "eval",
      "parseInt",
      "parseFloat",
      "isNan",
      "isFinite",

      // 15.1.3 URI Handling Function Properties
      "decodeURI",
      "decodeURIComponent",
      "encodeURI",
      "encodeURIComponent",

      // 15.1.4 Constructor Properties of the Global Object
      "Object",
      "Function",
      "Array",
      "String",
      "Boolean",
      "Number",
      "Date",
      "RegExp",
      "Error",
      "EvalError",
      "RangeError",
      "ReferenceError",
      "SyntaxError",
      "TypeError",
      "URIError",

      // 15.1.5 Other Properties of the Global Object
      "Math",

      // 10.1.6 Activation Object
      "arguments",

      // B.2 Additional Properties (non-normative)
      "escape",
      "unescape",

      // Window props (https://developer.mozilla.org/en/DOM/window)
      "applicationCache",
      "closed",
      "Components",
      "content",
      "controllers",
      "crypto",
      "defaultStatus",
      "dialogArguments",
      "directories",
      "document",
      "frameElement",
      "frames",
      "fullScreen",
      "globalStorage",
      "history",
      "innerHeight",
      "innerWidth",
      "length",
      "location",
      "locationbar",
      "localStorage",
      "menubar",
      "mozInnerScreenX",
      "mozInnerScreenY",
      "mozScreenPixelsPerCssPixel",
      "name",
      "navigator",
      "opener",
      "outerHeight",
      "outerWidth",
      "pageXOffset",
      "pageYOffset",
      "parent",
      "personalbar",
      "pkcs11",
      "returnValue",
      "screen",
      "scrollbars",
      "scrollMaxX",
      "scrollMaxY",
      "self",
      "sessionStorage",
      "sidebar",
      "status",
      "statusbar",
      "toolbar",
      "top",
      "window",

      // Window methods (https://developer.mozilla.org/en/DOM/window)
      "alert",
      "addEventListener",
      "atob",
      "back",
      "blur",
      "btoa",
      "captureEvents",
      "clearInterval",
      "clearTimeout",
      "close",
      "confirm",
      "disableExternalCapture",
      "dispatchEvent",
      "dump",
      "enableExternalCapture",
      "escape",
      "find",
      "focus",
      "forward",
      "GeckoActiveXObject",
      "getAttention",
      "getAttentionWithCycleCount",
      "getComputedStyle",
      "getSelection",
      "home",
      "maximize",
      "minimize",
      "moveBy",
      "moveTo",
      "open",
      "openDialog",
      "postMessage",
      "print",
      "prompt",
      "QueryInterface",
      "releaseEvents",
      "removeEventListener",
      "resizeBy",
      "resizeTo",
      "restore",
      "routeEvent",
      "scroll",
      "scrollBy",
      "scrollByLines",
      "scrollByPages",
      "scrollTo",
      "setInterval",
      "setResizeable",
      "setTimeout",
      "showModalDialog",
      "sizeToContent",
      "stop",
      "uuescape",
      "updateCommands",
      "XPCNativeWrapper",
      "XPCSafeJSOjbectWrapper",

      // Mozilla Window event handlers, same cite
      "onabort",
      "onbeforeunload",
      "onchange",
      "onclick",
      "onclose",
      "oncontextmenu",
      "ondragdrop",
      "onerror",
      "onfocus",
      "onhashchange",
      "onkeydown",
      "onkeypress",
      "onkeyup",
      "onload",
      "onmousedown",
      "onmousemove",
      "onmouseout",
      "onmouseover",
      "onmouseup",
      "onmozorientation",
      "onpaint",
      "onreset",
      "onresize",
      "onscroll",
      "onselect",
      "onsubmit",
      "onunload",

      // Safari Web Content Guide
      // http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/SafariWebContent.pdf
      // WebKit Window member data, from WebKit DOM Reference
      // (http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/WebKitDOMRef/DOMWindow_idl/Classes/DOMWindow/index.html)
      // TODO(fredsa) Many, many more functions and member data to add
      "ontouchcancel",
      "ontouchend",
      "ontouchmove",
      "ontouchstart",
      "ongesturestart",
      "ongesturechange",
      "ongestureend",

      // Media events
      "oncanplaythrough",
      "onended",
      "onprogress",
      
      // extra window methods
      "uneval",

      // keywords https://developer.mozilla.org/en/New_in_JavaScript_1.7,
      // https://developer.mozilla.org/en/New_in_JavaScript_1.8.1
      "getPrototypeOf",
      "let",

      // "future reserved words"
      "abstract",
      "int",
      "short",
      "boolean",
      "interface",
      "static",
      "byte",
      "long",
      "char",
      "final",
      "native",
      "synchronized",
      "float",
      "package",
      "throws",
      "goto",
      "private",
      "transient",
      "implements",
      "protected",
      "volatile",
      "double",
      "public",

      // IE methods
      // (http://msdn.microsoft.com/en-us/library/ms535873(VS.85).aspx#)
      "attachEvent",
      "clientInformation",
      "clipboardData",
      "createPopup",
      "dialogHeight",
      "dialogLeft",
      "dialogTop",
      "dialogWidth",
      "onafterprint",
      "onbeforedeactivate",
      "onbeforeprint",
      "oncontrolselect",
      "ondeactivate",
      "onhelp",
      "onresizeend",

      // Common browser-defined identifiers not defined in ECMAScript
      "event",
      "external",
      "Debug",
      "Enumerator",
      "Global",
      "Image",
      "ActiveXObject",
      "VBArray",
      "Components",

      // Functions commonly defined on Object
      "toString",
      "getClass",
      "constructor",
      "prototype",

      // Client-side JavaScript identifiers, which are needed for linkers
      // that don't ensure GWT's window != $wnd, document != $doc, etc.
      // Taken from the Rhino book, pg 715
      "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient", "CanvasPattern",
      "CanvasRenderingContext2D", "CDATASection", "CharacterData", "Comment",
      "CSS2Properties", "CSSRule", "CSSStyleSheet", "Document",
      "DocumentFragment", "DocumentType", "DOMException", "DOMImplementation",
      "DOMParser", "Element", "Event", "ExternalInterface", "FlashPlayer",
      "Form", "Frame", "History", "HTMLCollection", "HTMLDocument",
      "HTMLElement", "IFrame", "Image", "Input", "JSObject", "KeyEvent",
      "Link", "Location", "MimeType", "MouseEvent", "Navigator", "Node",
      "NodeList", "Option", "Plugin", "ProcessingInstruction", "Range",
      "RangeException", "Screen", "Select", "Table", "TableCell", "TableRow",
      "TableSelection", "Text", "TextArea", "UIEvent", "Window",
      "XMLHttpRequest", "XMLSerializer", "XPathException", "XPathResult",
      "XSLTProcessor",

      /*
       * These keywords trigger the loading of the java-plugin. For the
       * next-generation plugin, this results in starting a new Java process.
       */
      "java", "Packages", "netscape", "sun", "JavaObject", "JavaClass",
      "JavaArray", "JavaMember",

      // GWT-defined identifiers
      "$wnd", "$doc", "$moduleName", "$moduleBase", "$gwt_version",
      "$sessionId",

      // Identifiers used by JsStackEmulator; later set to obfuscatable
      "$stack", "$stackDepth", "$location",

      // TODO: prove why this is necessary or remove it
      "call",};

  static {
    INSTANCE = new JsRootScope();
  }

  private final Map<String, JsName> names = new LinkedHashMap<String, JsName>();

  private final JsName undefined;

  private JsRootScope() {
    super("Root");
    for (String ident : COMMON_BUILTINS) {
      names.put(ident, new JsRootName(this, ident));
    }
    undefined = names.get("undefined");
    assert undefined != null;
  }

  @Override
  public Iterator<JsName> getAllNames() {
    return Collections.unmodifiableCollection(names.values()).iterator();
  }

  @Override
  public List<JsScope> getChildren() {
    return Lists.create();
  }

  @Override
  public JsScope getParent() {
    return null;
  }

  public JsName getUndefined() {
    return undefined;
  }

  @Override
  protected void addChild(JsScope child) {
    // Don't record children.
  }

  @Override
  protected JsName doCreateName(String ident, String shortIdent) {
    throw new UnsupportedOperationException(
        "Cannot create new names in the root scope");
  }

  @Override
  protected JsName findExistingNameNoRecurse(String ident) {
    return names.get(ident);
  }

  private Object writeReplace() {
    return new SerializedForm();
  }
}
