cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Common JavaScript functions
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Copyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * available from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * General Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * of the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * CDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * You may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * terms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Checks if the given value is a decimal integer value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns true if it is, false if it's isn't.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The value to inspect.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var intRegex = /^\d+$/;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Removes the element with the specified ID.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oElement = document.getElementById(sContainerId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Sets the value of the element with id @a sInputId to the keys of aoItems
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * (comma separated).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction setElementValueToKeyList(sInputId, aoItems)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Get the Window.devicePixelRatio in a safe way.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Floating point ratio. 1.0 means it's a 1:1 ratio.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tries to figure out the DPI of the device in the X direction.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns DPI on success, null on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (window.deviceXDPI && window.deviceXDPI > 48 && window.deviceXDPI < 2048)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if (window.devicePixelRatio && window.devicePixelRatio >= 0.5 && window.devicePixelRatio <= 10.0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cDotsPerInch = Math.round(96 * window.devicePixelRatio);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Gets the width of the given element (downscaled).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Useful when using the element to figure the size of a image
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * or similar.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Number of pixels. null if oElement is bad.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oElement The element (not ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of getElementWidth. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return getElementWidth(document.getElementById(sElementId));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Gets the real unscaled width of the given element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Useful when using the element to figure the size of a image
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * or similar.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Number of screen pixels. null if oElement is bad.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oElement The element (not ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return Math.round(oElement.offsetWidth * getDevicePixelRatio());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of getUnscaledElementWidth. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return getUnscaledElementWidth(document.getElementById(sElementId));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Sets the value of an input field element (give by ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Returns success indicator (true/false).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFieldId The field ID (required for updating).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The field value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oInputElement = document.getElementById(sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds a hidden input field to a form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns The new input field element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oFormElement The form to append it to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sName The field name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The field value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFieldId The field ID (optional).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addHiddenInputFieldToForm(oFormElement, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of addHiddenInputFieldToForm. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return addHiddenInputFieldToForm(document.getElementById(sFormId), sName, sValue, sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds or updates a hidden input field to/on a form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns The new input field element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFormId The ID of the form to amend.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sName The field name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The field value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFieldId The field ID (required for updating).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addUpdateHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement = addHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds a width and a dpi input to the given form element if possible to
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * determine the values.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This is normally employed in an onlick hook, but then you must specify IDs or
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * the browser may end up adding it several times.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFormId The ID of the form to amend.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sWidthSrcId The ID of the element to calculate the width
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * value from.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sWidthName The name of the width value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sDpiName The name of the dpi value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addDynamicGraphInputs(sFormId, sWidthSrcId, sWidthName, sDpiName)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync addUpdateHiddenInputFieldToFormById(sFormId, sWidthName, cx, sFormId + '-' + sWidthName + '-id');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync addUpdateHiddenInputFieldToFormById(sFormId, sDpiName, cDotsPerInch, sFormId + '-' + sDpiName + '-id');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @name Custom Tooltips
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Where we keep tooltip elements when not displayed. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel showing/replacing/repositing a tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel hiding of the current tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Really hide the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipReallyHide: ' + g_oCurrentTooltip);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Schedule the tooltip for hiding.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel any pending show and schedule hiding if necessary.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipHideTimer = setTimeout(tooltipDelayedHide, 700);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Function that is repositions the tooltip when it's shown.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Used directly, via onload, and hackish timers to catch all browsers and
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Will set several tooltip member variables related to position and space.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxNeeded = g_oCurrentTooltip.oElm.offsetWidth + 8;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyNeeded = g_oCurrentTooltip.oElm.offsetHeight + 8;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var yScroll = window.pageYOffset || document.documentElement.scrollTop;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var xScroll = window.pageXOffset || document.documentElement.scrollLeft;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyAbove = Math.max(oRelToRect.top - yScroll, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyBelow = Math.max(yScrollBottom - oRelToRect.bottom, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxLeft = Math.max(oRelToRect.left - xScroll, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxRight = Math.max(xScrollRight - oRelToRect.right, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Decide where to put the thing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Really show the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oTooltip The tooltip object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oRelTo What to put the tooltip adjecent to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('moving tooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('removing current tooltip and showing new');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('showing tooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This function does the repositioning at some point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.onload = function(){ tooltipRepositionOnLoad(); setTimeout(tooltipRepositionOnLoad, 0); };
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tooltip onmouseenter handler .
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipElementOnMouseEnter: arguments.length='+arguments.length+' [0]='+arguments[0]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('ENT: currentTarget='+arguments[0].currentTarget);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tooltip onmouseout handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @remarks We only use this and onmouseenter for one tooltip element (iframe
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * for svn, because chrome is sending onmouseout events after
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * onmouseneter for the next element, which would confuse this simple
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipElementOnMouseOut: arguments.length='+arguments.length+' [0]='+arguments[0]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('OUT: currentTarget='+arguments[0].currentTarget);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * iframe.onload hook that repositions and resizes the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This is a little hacky and we're calling it one or three times too many to
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * work around various browser differences too.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Resize the tooltip to better fit the content.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipRepositionOnLoad(); /* Sets cxMax and cyMax. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip && g_oCurrentTooltip.oIFrame.contentWindow)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxSpace = Math.max(oSubElement.offsetLeft * 2, 0); /* simplified */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cySpace = Math.max(oSubElement.offsetTop * 2, 0); /* simplified */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxNeeded = oSubElement.contentWindow.document.body.scrollWidth + cxSpace;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyNeeded = oSubElement.contentWindow.document.body.scrollHeight + cySpace;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cx = Math.min(cxNeeded, g_oCurrentTooltip.cxMax);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad: overflowX -> hidden');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cyNeeded > g_oCurrentTooltip.cyMax && g_oCurrentTooltip.cyMaxUp > 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyMove = Math.min(cyNeeded - g_oCurrentTooltip.cyMax, g_oCurrentTooltip.cyMaxUp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.style.top = g_oCurrentTooltip.yPos + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad: overflowY -> hidden');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('cyNeeded='+cyNeeded+' cyMax='+g_oCurrentTooltip.cyMax+' cySpace='+cySpace+' cy='+cy);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('oSubElement.offsetTop='+oSubElement.offsetTop);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad: cx='+cx+'cxMax='+g_oCurrentTooltip.cxMax+' cxNeeded='+cxNeeded+' cy='+cy+' cyMax='+g_oCurrentTooltip.cyMax);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Calculates the last revision to get when showing a tooltip for @a iRevision.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * A tooltip covers several change log entries, both to limit the number of
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * tooltips to load and to give context. The exact number is defined by
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * g_cTooltipSvnRevisions.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Last revision in a tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipCalcLastRevision(iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var iFirstRev = Math.floor(iRevision / g_cTooltipSvnRevisions) * g_cTooltipSvnRevisions;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Calculates a unique ID for the tooltip element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This is also used as dictionary index.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns tooltip ID value (string).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sRepository The repository name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipCalcId(sRepository, iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 'svnHistoryTooltip_' + sRepository + '_' + svnHistoryTooltipCalcLastRevision(iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The onmouseenter event handler for creating the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oEvt The event.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sRepository The repository name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @remarks onmouseout must be set to call tooltipHide.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipShow(oEvt, sRepository, iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sKey = svnHistoryTooltipCalcId(sRepository, iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipShow ' + sRepository);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipDelayedShow ' + sRepository + ' ' + oTooltip);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Create a new tooltip element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('creating ' + sKey);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.setAttribute('class', 'tmvcstooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.setAttribute('style', 'position: relative;"');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.onload = function() {svnHistoryTooltipOnLoad(); setTimeout(svnHistoryTooltipOnLoad,0);};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.onmouseenter = tooltipElementOnMouseEnter;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.setAttribute('src', 'index.py?Action=VcsHistoryTooltip&repo=' + sRepository
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync + '&rev=' + svnHistoryTooltipCalcLastRevision(iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /* Resize and repositioning hacks. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Delay the change.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipShowTimer = setTimeout(svnHistoryTooltipDelayedShow, 512);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @name Debugging and Introspection
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Python-like dir() implementation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Array of names associated with oObj.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oObj The object under inspection. If not specified we'll
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * look at the window object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (var oCur = oObj; oCur; oCur = Object.getPrototypeOf(oCur))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Python-like dir() implementation, shallow version.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Array of names associated with oObj.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oObj The object under inspection. If not specified we'll
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * look at the window object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (var i in oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Dumps the given object to the console.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oObj The object under inspection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sPrefix What to prefix the log output with.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The object itself.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log(sPrefix + sName + ' ' + dbgGetObjType(oObj));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The members.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjWorker(sType, sName, oObj, sPrefix)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'function':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'function ' + sName + '()' + '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'object':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(' + dbgGetObjType(oObj) + ') =';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'string':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(string, ' + oObj.length + ')';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'Oops!':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(' + sType + ')\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync while (i > 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjTreeWorker(oObj, sPrefix, aParentObjs, cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //var sName = i;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //sRet += '[' + i + '/' + aMembers.length + ']';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjWorker(sType, sName, oMember, sPrefix);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync && oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += sPrefix + '! potentially dangerous element name\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oMember, sPrefix + '| ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oMember, sPrefix.substring(0, sPrefix.length - 2) + ' | ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Dumps the given object and all it's subobjects to the console.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns String dump of the object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oObj The object under inspection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sName The object name (optional).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sPrefix What to prefix the log output with (optional).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param cMaxDepth The max depth, optional.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjTree(oObj, sName, sPrefix, cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The object itself.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = dbgDumpObjWorker(sType, sName, oObj, sPrefix);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aParentObjs = Array();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oObj, sPrefix + '| ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log('dbgLogString - end - ' + aStrings.length + '/' + sLongString.length);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgLogObjTree(oObj, sName, sPrefix, cMaxDepth)