/*
 * Copyright 2008 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.user.client.impl;


/**
 * Native implementation associated with
 * {@link com.google.gwt.user.client.Window}.
 */
public class WindowImpl {

  public native String getHash() /*-{
    return $wnd.location.hash;
  }-*/;

  public native String getQueryString() /*-{
    return $wnd.location.search;
  }-*/;

  @Deprecated
  public void initWindowCloseHandler() {
    initWindowUnloadHandler();
    initWindowBeforeUnloadHandler();
  }

  @Deprecated
  public native void initWindowUnloadHandler() /*-{
    var oldOnUnload = $wnd.onunload;

    $wnd.onunload = $entry(function(evt) {
      try {
        @com.google.gwt.user.client.Window::onClosed()();
      } finally {
        oldOnUnload && oldOnUnload(evt);
        $wnd.onunload = null;
      }
    });
  }-*/;

  public native void initWindowBeforeUnloadHandler() /*-{
    var oldOnBeforeUnload = $wnd.onbeforeunload;

    // Old mozilla doesn't like $entry's explicit return statement and
    // will always pop up a confirmation dialog.  This is worked around by
    // just wrapping the call to onClosing(), which still has the semantics
    // that we want.
    $wnd.onbeforeunload = function(evt) {
      var ret, oldRet;
      try {
        ret = $entry(@com.google.gwt.user.client.Window::onClosing())();
      } finally {
        oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);
      }
      // Avoid returning null as IE6 will coerce it into a string.
      // Ensure that "" gets returned properly.
      if (ret != null) {
        return ret;
      }
      if (oldRet != null) {
        return oldRet;
      }
      // returns undefined.
    };
  }-*/;

  public native void initWindowResizeHandler() /*-{
    var oldOnResize = $wnd.onresize;
    $wnd.onresize = $entry(function(evt) {
      try {
        @com.google.gwt.user.client.Window::onResize()();
      } finally {
        oldOnResize && oldOnResize(evt);
      }
    });
  }-*/;

  public native void initWindowScrollHandler() /*-{
    var oldOnScroll = $wnd.onscroll;
    $wnd.onscroll = $entry(function(evt) {
      try {
        @com.google.gwt.user.client.Window::onScroll()();
      } finally {
        oldOnScroll && oldOnScroll(evt);
      }
    });
  }-*/;
}
