/*
* ***** BEGIN LICENSE BLOCK *****
* Version: ZAPL 1.1
*
* The contents of this file are subject to the Zimbra AJAX Public
* License Version 1.1 ("License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.zimbra.com/license
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is: Zimbra AJAX Toolkit.
*
* The Initial Developer of the Original Code is Zimbra, Inc.
* Portions created by Zimbra are Copyright (C) 2005 Zimbra, Inc.
* All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK *****
*/
// Cannot be subclassed
/**
* @param confirmExitMethod method which is called when the user attempts to navigate away from the application
* or close the browser window. If this method return a string that is displayed as part of the
* alert that is presented to the user. If this method returns null, then no alert is popped up
* this parameter may be null
*/
function DwtShell(className, docBodyScrollable, confirmExitMethod, userShell, existingElementId, useCurtain) {
if (window._dwtShell != null)
throw new DwtException("DwtShell already exists for window", DwtException.INVALID_OP, "DwtShell");
className = className || "DwtShell";
DwtComposite.call(this, null, className);
// XXX: HACK! This is a hack to make sure that the control methods work
// with DwtShell since the parent of DwtShell is null.
this._ctrlInited = true;
window._dwtShell = AjxCore.assignId(this);
if ((confirmExitMethod != null) && (document.domain != "localhost"))
window.onbeforeunload = confirmExitMethod;
window.document.body.style.marginLeft = 0;
window.document.body.style.marginRight = 0;
window.document.body.style.marginTop = 0;
window.document.body.style.marginBottom = 0;
if (docBodyScrollable != null && !docBodyScrollable)
window.document.body.style.overflow = "hidden";
if (existingElementId == null) {
var htmlElement = window.document.createElement("div");
this._htmlElId = htmlElement.id = Dwt.getNextId();
htmlElement.className = className;
htmlElement.style.width = "100%";
htmlElement.style.height = "100%";
//htmlElement.style.overflow = "hidden";
if (htmlElement.style.overflow) htmlElement.style.overflow = null;
// if there is a user shell (body content), move it below this shell
// into a container that's absolutely positioned
if (userShell)
window.document.body.removeChild(userShell);
window.document.body.appendChild(htmlElement);
if (userShell) {
var userShellContainer = new DwtControl(this, null, Dwt.ABSOLUTE_STYLE);
userShellContainer.getHtmlElement().appendChild(userShell);
userShellContainer.setSize(Dwt.DEFAULT, "100%");
userShellContainer.zShow(true);
}
} else {
var htmlElement = window.document.getElementById(existingElementId);
this._htmlElId = existingElementId;
}
Dwt.associateElementWithObject(htmlElement, this);
this.shell = this;
// Busy overlay - used when we want to enforce a modal busy state
this._busyOverlay = window.document.createElement("div");
this._busyOverlayDefCName = (!AjxEnv.isLinux) ? DwtShell.BUSY_OVERLAY_CLASS : DwtShell.BUSY_OVERLAY_CLASS + "-linux";
this._busyOverlay.className = this._busyOverlayDefCName;
this._busyOverlay.style.position = "absolute";
Dwt.setBounds(this._busyOverlay, 0, 0, "100%", "100%")
Dwt.setZIndex(this._busyOverlay, Dwt.Z_HIDDEN);
this._busyOverlay.innerHTML = "
";
htmlElement.appendChild(this._busyOverlay);
// Veil overlay - used by DwtDialog to disable underlying app
this._veilOverlay = window.document.createElement("div");
this._veilOverlay.className = (!AjxEnv.isLinux) ? "VeilOverlay" : "VeilOverlay-linux";
this._veilOverlay.style.position = "absolute";
this._veilOverlay.style.cursor = AjxEnv.isIE6up ? "not-allowed" : "wait";
Dwt.setBounds(this._veilOverlay, 0, 0, "100%", "100%");
Dwt.setZIndex(this._veilOverlay, Dwt.Z_HIDDEN);
this._veilOverlay.veilZ = new Array();
this._veilOverlay.veilZ.push(Dwt.Z_HIDDEN);
this._veilOverlay.dialogZ = new Array();
this._veilOverlay.activeDialogs = new Array();
this._veilOverlay.innerHTML = "";
htmlElement.appendChild(this._veilOverlay);
// Curtain overlay - used between hidden and viewable elements using z-index
if (useCurtain) {
this._curtainOverlay = window.document.createElement("div");
this._curtainOverlay.className = "CurtainOverlay";
this._curtainOverlay.style.position = "absolute";
Dwt.setBounds(this._curtainOverlay, 0, 0, "100%", "100%")
Dwt.setZIndex(this._curtainOverlay, Dwt.Z_CURTAIN);
this._curtainOverlay.innerHTML = "";
htmlElement.appendChild(this._curtainOverlay);
}
window.document.body.onselect = DwtShell._preventDefaultSelectPrt;
window.document.body.onselectstart = DwtShell._preventDefaultSelectPrt;
window.document.body.oncontextmenu = DwtShell._preventDefaultPrt;
window.onresize = DwtShell._resizeHdlr;
this._uiEvent = new DwtUiEvent(true);
this._currWinSize = this.getWindowSize();
// tooltip singleton used by all control in shell
this._toolTip = new DwtToolTip(this);
this._hoverMgr = new DwtHoverMgr();
}
DwtShell.prototype = new DwtComposite;
DwtShell.prototype.constructor = DwtShell;
// Event objects used to populate events so we dont need to create
// them for each event
DwtShell.controlEvent = new DwtControlEvent();
DwtShell.keyEvent = new DwtKeyEvent();
DwtShell.mouseEvent = new DwtMouseEvent();
DwtShell.selectionEvent = new DwtSelectionEvent(true);
DwtShell.treeEvent = new DwtTreeEvent();
DwtShell.BUSY_OVERLAY_CLASS = "BusyOverlay";
DwtShell.prototype.toString =
function() {
return "DwtShell";
}
DwtShell.newWindow =
function() {
// TODO - Create new Top Level Window
}
DwtShell.prototype.getWindowSize =
function() {
var p = new DwtPoint(0, 0);
if (window.innerWidth) {
p.x = window.innerWidth;
p.y = window.innerHeight;
} else if (AjxEnv.isIE6CSS) {
p.x = window.document.body.parentElement.clientWidth;
p.y = window.document.body.parentElement.clientHeight;
} else if (window.document.body && window.document.body.clientWidth) {
p.x = window.document.body.clientWidth;
p.y = window.document.body.clientHeight;
}
return p;
}
DwtShell.prototype.setBusy =
function(busy, className) {
var cursor = busy ? "wait" : "default";
var zIndex = busy ? Dwt.Z_VEIL : Dwt.Z_HIDDEN;
this._busyOverlay.className = className ? className : this._busyOverlayDefCName;
Dwt.setCursor(this._busyOverlay, cursor);
Dwt.setZIndex(this._busyOverlay, zIndex);
}
DwtShell.prototype.setStatus =
function(statusStr) {
this.window.status = statusStr;
}
DwtShell.prototype.getHoverMgr = function() {
return this._hoverMgr;
}
DwtShell.prototype.getToolTip = function() {
return this._toolTip;
}
DwtShell._preventDefaultSelectPrt =
function(ev) {
var evt = AjxCore.objectWithId(window._dwtShell)._uiEvent;
evt.setFromDhtmlEvent(ev);
if (evt.dwtObj && evt.dwtObj instanceof DwtControl && !evt.dwtObj.preventSelection(evt.target)) {
evt._stopPropagation = false;
evt._returnValue = true;
} else {
evt._stopPropagation = true;
evt._returnValue = false;
}
evt.setToDhtmlEvent(ev);
return !evt._stopPropagation;
}
DwtShell._preventDefaultPrt =
function(ev) {
ev = DwtUiEvent.getEvent(ev);
var evt = AjxCore.objectWithId(window._dwtShell)._uiEvent;
evt.setFromDhtmlEvent(ev);
//default behavior
evt._stopPropagation = true;
evt._returnValue = false;
var target = ev.target ? ev.target : ev.srcElement;
if (evt.dwtObj && evt.dwtObj instanceof DwtControl && !evt.dwtObj.preventContextMenu(evt.target))
{
evt._stopPropagation = false;
evt._returnValue = true;
} else if (target != null && typeof(target) == 'object') {
if ((target.tagName == "A" || target.tagName == "a") && target.href) {
evt._stopPropagation = false;
evt._returnValue = true;
}
}
evt.setToDhtmlEvent(ev);
return evt._returnValue;
}
DwtShell._resizeHdlr =
function(ev) {
var shell = AjxCore.objectWithId(window._dwtShell);
if (shell.isListenerRegistered(DwtEvent.CONTROL)) {
var evt = DwtShell.controlEvent;
evt.reset();
evt.oldWidth = shell._currWinSize.x;
evt.oldHeight = shell._currWinSize.y;
shell._currWinSize = shell.getWindowSize();
evt.newWidth = shell._currWinSize.x;
evt.newHeight = shell._currWinSize.y;
shell.notifyListeners(DwtEvent.CONTROL, evt);
} else {
shell._currWinSize = shell.getWindowSize();
}
}
DwtShell.getShell =
function(win){
return AjxCore.objectWithId(win._dwtShell);
};