blob: 0b9df40605c24e55408cff573866ff17d95c5821 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/**
* Note that the only function in this file that is supported is the openWindow
* function.
* All other functions may change without notice.
*/
var ADFDialogReturn = new Array();
function _launchDialog(
srcURL,
windowName,
features,
formName,
postbackId,
partial)
{
// Make sure we're calling submitForm() on the correct document
var myself = self;
var returnFromDialog;
if (partial)
{
returnFromDialog = function()
{
myself._submitPartialChange(formName, 0, {rtrn:postbackId});
};
}
else
{
returnFromDialog = function()
{
myself.submitForm(formName, 0, {rtrn:postbackId});
};
}
var index = ADFDialogReturn.length;
ADFDialogReturn[index] = returnFromDialog;
srcURL = srcURL + "&_rtrnId=" + index;
openWindow(window, srcURL, windowName, features, 1);
}
/**
* Opens a new window, makes it active, and returns the Window
* object.
* <p>
* @param parentWindow The window opening this window. For modal
* windows, this is the window that the
* new window will be modal to. REQUIRED.
* @param srcURL URL for the contents of the new window.
* REQUIRED.
* @param windowName Name that identifies the new window for
* URLS. Required if a closeCallback is to be used.
* @param features Javascript object containing name/value pairs
* of features to apply to the new window,
* @param isModal True if the window should be modal.
* @param kind Either 'document' or 'dialog'. The default is
* dependent on the value of isModal--'document'
* for modeless, 'dialog' for modal.
* @param closeCallback Callback method called when the window is closed.
* Note: Under certain adverse conditions (for example,
* if the parentWindow navigates to a new page), it is
* possible that the closeCallback may not be called.
*/
function openWindow(
parentWindow,
srcURL,
windowName,
features,
isModal,
kind,
closeCallback
)
{
if (parentWindow)
{
// default modality if none specified
if (isModal == (void 0))
isModal = false;
// if the kind isn't specified, default the kind off of the modality
if (!kind)
{
kind = (isModal) ? "dialog" : "document";
}
// default the window name to "_blank" if no
// name is specified, in order to guarantee that a new window is
// opened
if (!windowName)
windowName = "_blank";
//
// pick the correct defaults and overrides
//
var defaults = _featureDefaults[kind];
if (defaults == (void 0))
{
kind = "document";
defaults = _featureDefaults[kind];
}
var overrides = (isModal)
? _modalFeatureOverrides
: _modelessFeatureOverrides;
// determine the avialable features
var agentFeatures = (_agent.isIE)
? _ieFeatures
: _nnFeatures;
// we'll be hammering the features object, so make a copy
var featuresCopy = null;
if (features)
{
featuresCopy = new Object();
for (var f in features)
{
featuresCopy[f] = features[f];
}
}
//
// build up the feature string
//
var featureString = "";
// loop through the available features for this platform
for (var featureName in agentFeatures)
{
// get the overridden value of the feature
var featureValue = overrides[featureName];
if (featureValue == (void 0))
{
// get the value of the feature if it isn't overridden
if (featuresCopy)
{
featureValue = featuresCopy[featureName];
delete featuresCopy[featureName];
}
// if no value, get the default value, if any
if (featureValue == (void 0))
featureValue = defaults[featureName];
}
if (featureValue != (void 0))
{
// check if this is a boolean value
var isBoolean = _booleanFeatures[featureName] != (void 0);
// output the value
if (featureValue || !isBoolean)
{
// add the feature name
featureString += featureName;
// add the value for nonboolean features
if (!isBoolean)
{
featureString += "=" + featureValue;
}
// add separator between this and the next
featureString += ",";
}
}
}
// Now tack on all the extra features that the user has requested.
// These may or may not have meaning to the browser's implementation of
// window.open().
for (var f in featuresCopy)
{
featureString += f;
if (featuresCopy[f])
featureString += "=" + featuresCopy[f];
featureString += ",";
}
// trim off last separator
if (featureString.length != 0)
{
featureString = featureString.substring(0, featureString.length - 1);
}
// register the closing callback
if (closeCallback)
{
_setDependent(parentWindow, windowName, closeCallback);
}
// open an empty window
var newWindow = parentWindow.open(srcURL, windowName, featureString);
// Check for popup blockers.
// This will certainly all change, but now (early 2005) the popup blockers
// work thusly:
//
// Google: The return value from window.open is null.
// Safari: The return value from window.open is null.
// FireFox: The return value from window.open is a valid object
// with no properties.
// Yahoo!: The return value from window.open is a valid object which
// throws an exception when you try to do anything with it.
var usableWindow = false;
if (newWindow != null)
{
var propCount = 0;
try
{
for (p in newWindow)
{
propCount++;
break;
}
// if (propCount == 0) this is Firefox popup blocker
if (propCount > 0)
usableWindow = true;
}
catch (e)
{
// Yahoo! toolbar throws an exception when you try to access any of the
// new window's properties.
}
}
// else this is the Safari or Google Toolbar popup blocker
if (!usableWindow)
{
_setDependent(parentWindow, windowName, (void 0));
if (_AdfWindowOpenError != null)
alert(_AdfWindowOpenError);
return;
}
// detect the bogus ie4 and turn off modal windows
var atMostIE4 = _agent.atMost("ie", 4.99);
var alphaFilter = false;
// document of the parent window
var parentDoc = parentWindow.document;
// body of the parent window
var parentBody = parentDoc.body;
if (isModal && !atMostIE4)
{
if (_agent.atLeast("ie", 4) || _agent.isSafari)
{
var dimmer = parentDoc.getElementById("_trDialogDimmer");
if (dimmer == null)
{
// Display a div over the browser viewport that will give the entire page the appearance
// of being disabled:
dimmer = parentDoc.createElement("div");
dimmer.id = "_trDialogDimmer";
var dimmerStyle = dimmer.style;
dimmerStyle.position = "absolute";
dimmerStyle.zIndex = "32000";
dimmerStyle.backgroundColor = "#FFFFFF";
// prefer opacity usage
if (dimmerStyle.opacity != 'undefined') {
dimmerStyle.opacity = "0.5";
} else if (dimmerStyle.filter != 'undefined') {
dimmerStyle.filter = "alpha(opacity=50)";
}
// Position the dimmer element, account for scrolling:
var docElement = parentDoc.documentElement;
var width = Math.max(docElement.offsetWidth, docElement.scrollWidth);
var height = Math.max(docElement.offsetHeight, docElement.scrollHeight);
dimmerStyle.width = width + "px";
dimmerStyle.height = height + "px";
dimmerStyle.top = "0px";
dimmerStyle.left = "0px";
// Add the dimmer element to the body:
parentBody.appendChild(dimmer);
alphaFilter = true;
}
}
// Capture mouse events. Note: we special-case IE/Windows,
// and only apply the capture after window.open() has been
// called. See below for details.
// XXXSafari: What to do for Safari?
if (_agent.isGecko)
{
// this should work, but doesn't appear to
if (parentBody != (void 0))
_addModalCaptureGecko(parentBody);
}
parentWindow.onfocus = _onModalFocus;
}
// Apply mouse capture for IE/Windows. Starting in IE 6.0.2800,
// if we apply the capture before calling window.open(), the capture
// is lost immediately when the secondary window receives the
// focus. To make matters worse, the _onModalFocus handler that
// we register on the parent window is no longer invoked (not
// sure why?!). The end result is that the user can interact
// with the parent window even when a modal child is displayed.
// Delaying our setCapture() call until after window.open()
// seems to work around the problem.
if (isModal && (_agent.atLeast("ie", 5) && _agent.isWindows))
{
_addModalCaptureIE(parentBody);
// Set up an onlosecapture handler so that we can
// restore the capture if we unexpectedly lose it.
// this code has been removed as it caused IE to "lock up" when
// IE7 is set to force new windows to open in tabs instead of new
// windows.
//parentBody.onlosecapture = _onModalLoseCapture;
// Popup blockers!
// BUG 4428033 - ECM: MENUS BECOM DISABLED AFTER RAISING A DIALOG
// FROM A COMMANDMENUITEM
// When a popup blocker is installed, the onunload event is often
// not delivered to listeners attached in the scope of the opened
// modal window. However, onunload events _are_ delivered to
// listeners attached in the opener context.
//
// However, this onunload event listing is only permitted within the
// same scripting domain. We should really verify if the domains match
// or not, but relative URLs are always in the same domain, so just
// test for absolute URLs instead.
//
// A quick check for absolute URL is to test the presence of an
// unescaped colon.
//
var isAbsolute = (srcURL != null && srcURL.indexOf(':') != -1);
if (!isAbsolute)
{
var removeCapture = new Function("e", "_removeModalCaptureIE(window.document.body)");
// IE 11 bug
if(newWindow.attachEvent) {
newWindow.attachEvent("onunload", removeCapture);
} else {
newWindow.addEventListener("onunload", removeCapture);
}
}
}
/*
// create the content for the window. We use a frameset so that
// the content can change without firing the window close event.
var realSrcURL = "<html>";
//realSrcURL += "<head><scr";
//realSrcURL += 'ipt src="/images/jsLibs/Window.js"></head>';
realSrcURL += '<frameset rows="100%,*" border="0" onunload="_checkUnload(event)"><frame src="' +
srcURL +
'"></frameset></html>';
newWindow.document.write(realSrcURL);
newWindow.document.close();
*/
if (isModal && !atMostIE4)
{
_setDependent(parentWindow, "modalWindow", newWindow);
}
// If there are any poll commands registered, they should be deactivated when the
// modal window gets launched. They need to be reactivated upon closing the
// modal dependent using _pollWhenModalDependentCloses().
// Cleaner alternative to _pollWhenModalDependentCloses() could have been to use a
// registered callback like _checkUnload(), _onModalFocus(), _onModalLoseCapture().
// But none of these were reliable for either of...
// 1. One of them is to workaround IE grabbing focus on parent
// while dialog launch in progress.
// 2. Does not get called when dialog is dismissed using the close
// button on the window, particularly for case of dialogs
// launched using openWindow().
if (isModal && self._pollManager)
{
_pollManager.deactivateAll();
_pollWhenModalDependentCloses();
}
// make the active window
newWindow.focus();
// Set up a timer to make sure that we reset the alpha filter.
if (alphaFilter)
{
parentWindow.setTimeout("_clearBodyModalEffects('alpha')", 1000);
}
return newWindow;
}
else
{
return null;
}
}
// Keeps checking for absence of a modal dependent, when found
// reactivates all poll, and stops checking any further
function _pollWhenModalDependentCloses()
{
if (!_getValidModalDependent(self))
{
_pollManager.reactivateAll();
}
else
{
// pu: Call thyself to check again after a second
// If more accuracy required, set it to a millisecond
self.setTimeout("_pollWhenModalDependentCloses()", 1000);
}
}
/**
* onFocus override when modal windows are up.
* Handles moving the focus to the top and suppressing IE mouse clicks.
*/
function _onModalFocus()
{
var theBody = self.document.body;
// =-=ags Note: This used to call _getValidModalDependent(),
// but now instead we call _getModalDependent() and
// explicitly check the value of the closed property.
// The reason for this is that on Gecko, _onModalFocus
// is called before _checkUnload(). This means that by
// the time _checkUnload() is called, _getValidModalDependent()
// will have already removed the modal window from the
// dependents list. As a result, the capture event handlers
// added on Gecko are never removed.
var modalDependent = _getModalDependent(self);
var hasCapture = _agent.atLeast("ie", 5) && _agent.isWindows;
if (modalDependent && !modalDependent.closed)
{
modalDependent.focus();
// reset the capture on IE since it is released whenever
// the focus moves to another window
if (hasCapture)
{
theBody.setCapture();
}
}
else
{
if (hasCapture)
{
theBody.onlosecapture = null;
_removeModalCaptureIE(theBody);
}
}
}
// A self-rescheduling function which clears out capture or alpha filtering
// when modal windows are closed. These effects are normally removed in
// the modal window's onunload() handler. However, the onunload handler
// may not be called if the modal window is closed by the user before
// loading completes. This function is used in conjunction with
// Window.setTimeout() to make sure that the effects are cleared
// in this case.
function _clearBodyModalEffects(effect)
{
if (_getValidModalDependent(self) != null)
{
// If the modal window is still shown, re-schedule ourselves
self.setTimeout("_clearBodyModalEffects('" + effect + "')", 1000);
}
else
{
if (effect == 'alpha')
{
// No modal dependent - clear out the alpha filter and don't bother rescheduling.
// Locate the dialog dimmer element:
var dimmerDoc = self.document;
var dimmer = dimmerDoc.getElementById("_trDialogDimmer");
if (dimmer != null)
{
// Remove the dimmer div that covers the browser viewport:
dimmerDoc.body.removeChild(dimmer);
}
}
}
}
/**
* Returns the dependent which is modal and is still open.
*/
function _getValidModalDependent(
parentWindow
)
{
var modalDependent = _getModalDependent(parentWindow);
if (modalDependent)
{
if (modalDependent.closed)
{
_setDependent(parentWindow, "modalWindow", (void 0));
modalDependent = (void 0);
}
}
return modalDependent;
}
/**
* Sizes the window to its preferred size.
*/
function _sizeWin(
theWindow,
extraWidth,
extraHeight,
params
)
{
var isGecko = _agent.isGecko;
var isIE = _agent.isIE;
var isSafari = _agent.isSafari;
var isStandard = (isGecko || isSafari);
if (!(isStandard || (isIE && _agent.isWindows)))
return;
/*
// =-= bts theoretically, this would be all we need to do for Mozilla,
// but the implementation appears to be sub-optimal for our case
if (isGecko)
{
theWindow.sizeToContent();
return;
}
*/
var body = theWindow.document.body;
if (body)
{
// width of the inside
var newWidth = (!isIE && (body.scrollWidth > body.clientWidth))
? body.scrollWidth
: _getBodyWidth(body, body.offsetWidth, body.offsetLeft);
var newHeight = 0;
var hasWidthParam = params && (params['W'] && params['W'] > 0);
var hasHeightParam = params && (params['H'] && params['H'] > 0);
//if the width and height of the window is provided as parameter, use it directly.
if (hasWidthParam && hasHeightParam)
return;
var hasParams = (hasHeightParam || hasWidthParam);
// if the height was not explicitly set, change to auto forcing
// recalculation of the offsetHeight. FireFox doesn't always detect
// that a PPR has changed the content size.
var bodyStyle = body.style;
if (!hasParams && (!bodyStyle.height || bodyStyle.height.length == 0))
{
bodyStyle.height = "auto";
}
if (isStandard)
{
newHeight = body.offsetHeight + (window.outerHeight - window.innerHeight);
// random extra space added in to make this work
newHeight += 30;
// add in the window frame plus padding
// =-=AEW For some bizarre reason, I'm seeing cases
// where the window's outerWidth is much, much smaller than
// the body's offsetWidth, which results in the Gecko
// window shrinking. Block this, though it'd be nice
// to know what's really going on!
if (window.outerWidth > body.offsetWidth)
newWidth += (window.outerWidth - body.offsetWidth);
}
else
{
newHeight = body.scrollHeight + (body.offsetHeight - body.clientHeight);
// if this method supported windows with toolbars, we would need to
// add another 67 here, rather than the aribitrary 8 pixels
newHeight += 21;
// add in the padding plus bogus extra size
newWidth += body.offsetWidth - body.clientWidth + 16;
// add in the margins (MS bogusly uses Strings for these)
if(body.tagName=='BODY')
{
newHeight += parseInt(body.topMargin) + parseInt(body.bottomMargin);
newWidth += parseInt(body.leftMargin) + parseInt(body.rightMargin);
}
}
//
// allow the size to be a little bigger than currently necessary.
// This is useful when we will be paging through multiple items and
// later pages might need a slightly larger window than the initial
// page.
if (extraWidth)
newWidth += extraWidth;
if (extraHeight)
newHeight += extraHeight;
// Make sure that width and height are at least as big as minimum requested
if (params != (void 0))
{
if (params['W'])
{
var minWidth = 0 + params['W'];
if (newWidth < minWidth)
newWidth = minWidth;
}
if (params['H'])
{
var minHeight = 0 + params['H'];
if (newHeight < minHeight)
newHeight = minHeight;
}
}
var newWin = _getTop(theWindow);
// keep a bottom/right pad of at least 5% of the available screen
var avLeft = isIE ? 0 : newWin.screen.availLeft;
var avTop = isIE ? 0 : newWin.screen.availTop;
var maxSHeight = newWin.screen.availHeight * 0.95;
var maxSWidth = newWin.screen.availWidth * 0.95;
// adjust if necessary
if (newHeight > maxSHeight)
newHeight = maxSHeight;
if (newWidth > maxSWidth)
newWidth = maxSWidth;
// Finally, we can resize the window.
// theWindow.parent.resizeTo(newWidth, newHeight);
try
{
newWin.resizeTo(newWidth, newHeight);
}
catch (e)
{
// ignore errors. An error will be throw if the new window opened in a tab
// instead of a new browser window as resizing the main window is prohibited by security
;
}
// Check to make sure that our resize hasn't put the
// window partially off screen.
var wLeft = isIE ? newWin.screenLeft: newWin.screenX;
var wTop = isIE ? newWin.screenTop: newWin.screenY;
var moveit = false;
// If we are off screen horizontal or vertical, center in that direction
if ((wLeft + newWidth) > (avLeft + maxSWidth))
{
wLeft = (newWin.screen.availWidth - newWidth)/2;
moveit = true;
}
if ((wTop + newHeight) > (avTop + maxSHeight))
{
wTop = (newWin.screen.availHeight - newHeight)/2;
moveit = true;
}
if (moveit)
{
newWin.moveTo(wLeft, wTop);
}
}
}