/*
 * Copyright 2009 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.appengine.demos.taskengine.client;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.EventListener;

/**
 * Simple utility class for registering and unregistering an EventListener.
 */
public class DomUtils {

  /**
   * A simple Overlay type that allows us to unhook an event listener.
   */
  public static class EventRemover extends JavaScriptObject {
    protected EventRemover() {
    }

    /**
     * Simply calls remove, which should correspond to a function that unhooks
     * the event listener.
     */
    public final native void remove();
  }

  /**
   * A simple Overlay type for the Window object.
   */
  public static class Window extends JavaScriptObject {
    protected Window() {
    }

    /**
     * Adds a resize listener.
     *
     * @param listener
     */
    public final void addResizeListener(EventListener listener) {
      DomUtils.addEventListener("resize", this, listener);
    }

    public final native void alert(String msg);

    public final native boolean confirm(String msg);

    /**
     * We subtract one to work around an issue on iphone where certain
     * dimensions seem to be special cased and break when set on resize.
     *
     * @return the inner width of the window
     */
    public final native int getWidth();;
  }

  /**
   * Adds an {@link EventListener} as the recipient of event dispatches for a
   * specific event type on a specific element.
   *
   * @param type
   * @param elem
   * @param listener
   * @return
   */
  public static EventRemover addEventListener(String type,
      JavaScriptObject elem, EventListener listener) {
    return addEventListenerImpl(type, elem, listener);
  }

  /**
   * Helper function for getting access to the Window object.
   *
   * @return the Window object
   */
  public static native Window getWindow();

  /**
   * private implementation of adding an {@link EventListener} as the recipient
   * of event dispatches for a specific event type on a specific element.
   *
   * @param type
   * @param sourceElem
   * @param listener
   * @return
   */
  private static native EventRemover addEventListenerImpl(String type,
      JavaScriptObject sourceElem, EventListener listener);
}
