cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/* $Id$ */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Common JavaScript functions
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Copyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 *
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 *
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 */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Checks if the given value is a decimal integer value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns true if it is, false if it's isn't.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The value to inspect.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction isInteger(sValue)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (typeof sValue != 'undefined')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var intRegex = /^\d+$/;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (intRegex.test(sValue))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Removes the element with the specified ID.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction removeHtmlNode(sContainerId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oElement = document.getElementById(sContainerId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oElement)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oElement.parentNode.removeChild(oElement);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Sets the value of the element with id @a sInputId to the keys of aoItems
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * (comma separated).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction setElementValueToKeyList(sInputId, aoItems)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sKey;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oElement = document.getElementById(sInputId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oElement.value = '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (sKey in aoItems)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oElement.value.length > 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oElement.value += ',';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oElement.value += sKey;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Get the Window.devicePixelRatio in a safe way.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Floating point ratio. 1.0 means it's a 1:1 ratio.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getDevicePixelRatio()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var fpRatio = 1.0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (window.devicePixelRatio)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fpRatio = window.devicePixelRatio;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (fpRatio < 0.5 || fpRatio > 10.0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fpRatio = 1.0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fpRatio;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tries to figure out the DPI of the device in the X direction.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns DPI on success, null on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getDeviceXDotsPerInch()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (window.deviceXDPI && window.deviceXDPI > 48 && window.deviceXDPI < 2048)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return window.deviceXDPI;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if (window.devicePixelRatio && window.devicePixelRatio >= 0.5 && window.devicePixelRatio <= 10.0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cDotsPerInch = Math.round(96 * window.devicePixelRatio);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cDotsPerInch = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return cDotsPerInch;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Gets the width of the given element (downscaled).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Useful when using the element to figure the size of a image
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * or similar.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Number of pixels. null if oElement is bad.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oElement The element (not ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getElementWidth(oElement)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oElement && oElement.offsetWidth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return oElement.offsetWidth;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of getElementWidth. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getElementWidthById(sElementId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return getElementWidth(document.getElementById(sElementId));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Gets the real unscaled width of the given element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Useful when using the element to figure the size of a image
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * or similar.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Number of screen pixels. null if oElement is bad.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oElement The element (not ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getUnscaledElementWidth(oElement)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oElement && oElement.offsetWidth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return Math.round(oElement.offsetWidth * getDevicePixelRatio());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of getUnscaledElementWidth. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction getUnscaledElementWidthById(sElementId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return getUnscaledElementWidth(document.getElementById(sElementId));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Sets the value of an input field element (give by ID).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Returns success indicator (true/false).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sFieldId The field ID (required for updating).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sValue The field value.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction setInputFieldValue(sFieldId, sValue)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oInputElement = document.getElementById(sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oInputElement)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement.value = sValue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds a hidden input field to a form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addHiddenInputFieldToForm(oFormElement, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oNew = document.createElement('input');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oNew.type = 'hidden';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oNew.name = sName;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oNew.value = sValue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oNew.id = sFieldId;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFormElement.appendChild(oNew);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return oNew;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** By element ID version of addHiddenInputFieldToForm. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return addHiddenInputFieldToForm(document.getElementById(sFormId), sName, sValue, sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds or updates a hidden input field to/on a form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addUpdateHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oInputElement = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sFieldId)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement = document.getElementById(sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oInputElement)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement.name = sName;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement.value = sValue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInputElement = addHiddenInputFieldToFormById(sFormId, sName, sValue, sFieldId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return oInputElement;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Adds a width and a dpi input to the given form element if possible to
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * determine the values.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 *
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction addDynamicGraphInputs(sFormId, sWidthSrcId, sWidthName, sDpiName)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cx = getUnscaledElementWidthById(sWidthSrcId);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cDotsPerInch = getDeviceXDotsPerInch();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cx)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync addUpdateHiddenInputFieldToFormById(sFormId, sWidthName, cx, sFormId + '-' + sWidthName + '-id');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cDotsPerInch)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync addUpdateHiddenInputFieldToFormById(sFormId, sDpiName, cDotsPerInch, sFormId + '-' + sDpiName + '-id');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @name Custom Tooltips
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Where we keep tooltip elements when not displayed. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncvar g_dTooltips = {};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncvar g_oCurrentTooltip = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncvar g_idTooltipShowTimer = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncvar g_idTooltipHideTimer = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncvar g_cTooltipSvnRevisions = 12;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel showing/replacing/repositing a tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipResetShowTimer()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_idTooltipShowTimer)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync clearTimeout(g_idTooltipShowTimer);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipShowTimer = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel hiding of the current tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipResetHideTimer()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_idTooltipHideTimer)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync clearTimeout(g_idTooltipHideTimer);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipHideTimer = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Really hide the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipReallyHide()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipReallyHide: ' + g_oCurrentTooltip);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.style.display = 'none';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Schedule the tooltip for hiding.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipHide()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync function tooltipDelayedHide()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetHideTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipReallyHide();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Cancel any pending show and schedule hiding if necessary.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetShowTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip && !g_idTooltipHideTimer)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipHideTimer = setTimeout(tooltipDelayedHide, 700);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Function that is repositions the tooltip when it's shown.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Used directly, via onload, and hackish timers to catch all browsers and
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * whatnot.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Will set several tooltip member variables related to position and space.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipRepositionOnLoad()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oRelToRect = g_oCurrentTooltip.oRelToRect;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cxNeeded = g_oCurrentTooltip.oElm.offsetWidth + 8;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyNeeded = g_oCurrentTooltip.oElm.offsetHeight + 8;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var yScroll = window.pageYOffset || document.documentElement.scrollTop;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var yScrollBottom = yScroll + window.innerHeight;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var xScroll = window.pageXOffset || document.documentElement.scrollLeft;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var xScrollRight = xScroll + window.innerWidth;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var xPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var yPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Decide where to put the thing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cyNeeded < cyBelow)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yPos = oRelToRect.bottom;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMax = cyBelow;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if (cyBelow >= cyAbove)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yPos = yScrollBottom - cyNeeded;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMax = yScrollBottom - yPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yPos = oRelToRect.top - cyNeeded;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMax = yScrollBottom - yPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (yPos < yScroll)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yPos = yScroll;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMax = yScrollBottom - yPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.yPos = yPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.yScroll = yScroll;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMaxUp = yPos - yScroll;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cxNeeded < cxRight || cxNeeded > cxRight)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xPos = oRelToRect.right;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cxMax = cxRight;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync xPos = oRelToRect.left - cxNeeded;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cxMax = cxNeeded;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.xPos = xPos;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.xScroll = xScroll;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.style.top = yPos + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.style.left = xPos + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Really show the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oTooltip The tooltip object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oRelTo What to put the tooltip adjecent to.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipReallyShow(oTooltip, oRelTo)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oRect;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetShowTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetHideTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip == oTooltip)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('moving tooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if (g_oCurrentTooltip)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('removing current tooltip and showing new');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipReallyHide();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('showing tooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.display = 'block';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.position = 'absolute';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oRect = oRelTo.getBoundingClientRect();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oRelToRect = oRect;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.left = oRect.right + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.top = oRect.bottom + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip = oTooltip;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This function does the repositioning at some point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipRepositionOnLoad();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oTooltip.oElm.onload === null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.onload = function(){ tooltipRepositionOnLoad(); setTimeout(tooltipRepositionOnLoad, 0); };
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tooltip onmouseenter handler .
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipElementOnMouseEnter()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipElementOnMouseEnter: arguments.length='+arguments.length+' [0]='+arguments[0]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('ENT: currentTarget='+arguments[0].currentTarget);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetShowTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetHideTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Tooltip onmouseout handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 * code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction tooltipElementOnMouseOut()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('tooltipElementOnMouseOut: arguments.length='+arguments.length+' [0]='+arguments[0]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('OUT: currentTarget='+arguments[0].currentTarget);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipHide();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * iframe.onload hook that repositions and resizes the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipOnLoad()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Resize the tooltip to better fit the content.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipRepositionOnLoad(); /* Sets cxMax and cyMax. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_oCurrentTooltip && g_oCurrentTooltip.oIFrame.contentWindow)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oSubElement = g_oCurrentTooltip.oIFrame;
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 var cy;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.width = cx + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.width = (cx - cxSpace) + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cx >= cxNeeded)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad: overflowX -> hidden');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.style.overflowX = 'hidden';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.style.overflowX = 'scroll';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cy = Math.min(cyNeeded, g_oCurrentTooltip.cyMax);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cyNeeded > g_oCurrentTooltip.cyMax && g_oCurrentTooltip.cyMaxUp > 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var cyMove = Math.min(cyNeeded - g_oCurrentTooltip.cyMax, g_oCurrentTooltip.cyMaxUp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.cyMax += cyMove;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.yPos -= cyMove;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.style.top = g_oCurrentTooltip.yPos + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cy = Math.min(cyNeeded, g_oCurrentTooltip.cyMax);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_oCurrentTooltip.oElm.height = cy + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.height = (cy - cySpace) + 'px';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (cy >= cyNeeded)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipOnLoad: overflowY -> hidden');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.style.overflowY = 'hidden';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.style.overflowY = 'scroll';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipRepositionOnLoad();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Calculates the last revision to get when showing a tooltip for @a iRevision.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns Last revision in a tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipCalcLastRevision(iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var iFirstRev = Math.floor(iRevision / g_cTooltipSvnRevisions) * g_cTooltipSvnRevisions;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return iFirstRev + g_cTooltipSvnRevisions - 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Calculates a unique ID for the tooltip element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This is also used as dictionary index.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @returns tooltip ID value (string).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sRepository The repository name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipCalcId(sRepository, iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 'svnHistoryTooltip_' + sRepository + '_' + svnHistoryTooltipCalcLastRevision(iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The onmouseenter event handler for creating the tooltip.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oEvt The event.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sRepository The repository name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param iRevision The revision number.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @remarks onmouseout must be set to call tooltipHide.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction svnHistoryTooltipShow(oEvt, sRepository, iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sKey = svnHistoryTooltipCalcId(sRepository, iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oTooltip = g_dTooltips[sKey];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oParent = oEvt.currentTarget;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipShow ' + sRepository);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync function svnHistoryTooltipDelayedShow()
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oSubElement;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sSrc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip = g_dTooltips[sKey];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('svnHistoryTooltipDelayedShow ' + sRepository + ' ' + oTooltip);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!oTooltip)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Create a new tooltip element.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //console.log('creating ' + sKey);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip = {};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm = document.createElement('div');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.setAttribute('id', sKey);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.setAttribute('class', 'tmvcstooltip');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.position = 'absolute';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.style.zIndex = 6001;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.xPos = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.yPos = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.cxMax = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.cyMax = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.cyMaxUp = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.xScroll = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.yScroll = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement = document.createElement('iframe');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.setAttribute('id', sKey + '_iframe');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.setAttribute('style', 'position: relative;"');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.onload = function() {svnHistoryTooltipOnLoad(); setTimeout(svnHistoryTooltipOnLoad,0);};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.onmouseenter = tooltipElementOnMouseEnter;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.onmouseout = tooltipElementOnMouseOut;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oElm.appendChild(oSubElement);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTooltip.oIFrame = oSubElement;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_dTooltips[sKey] = oTooltip;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync document.body.appendChild(oTooltip.oElm);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement = oTooltip.oIFrame;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubElement.setAttribute('src', 'index.py?Action=VcsHistoryTooltip&repo=' + sRepository
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync + '&rev=' + svnHistoryTooltipCalcLastRevision(iRevision)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync + '&cEntries=' + g_cTooltipSvnRevisions
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync + '#r' + iRevision);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipReallyShow(oTooltip, oParent);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /* Resize and repositioning hacks. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync svnHistoryTooltipOnLoad();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync setTimeout(svnHistoryTooltipOnLoad, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Delay the change.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tooltipResetShowTimer();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_idTooltipShowTimer = setTimeout(svnHistoryTooltipDelayedShow, 512);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @} */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @name Debugging and Introspection
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Python-like dir() implementation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction pythonlikeDir(oObj, fDeep)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aRet = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var dTmp = {};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oObj = window;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (var oCur = oObj; oCur; oCur = Object.getPrototypeOf(oCur))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aThis = Object.getOwnPropertyNames(oCur);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (var i = 0; i < aThis.length; i++)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!(aThis[i] in dTmp))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dTmp[aThis[i]] = 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aRet.push(aThis[i]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Python-like dir() implementation, shallow version.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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 */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction pythonlikeShallowDir(oObj, fDeep)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aRet = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var dTmp = {};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (var i in oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aRet.push(i);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return aRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgGetObjType(oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sType = typeof oObj;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sType == "object" && oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oObj.constructor && oObj.constructor.name)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = oObj.constructor.name;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var fnToString = Object.prototype.toString;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sTmp = fnToString.call(oObj);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sTmp.indexOf('[object ') === 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = sTmp.substring(8, sTmp.length);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sType;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Dumps the given object to the console.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param oObj The object under inspection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * @param sPrefix What to prefix the log output with.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObj(oObj, sName, sPrefix)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aMembers;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sType;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Defaults
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oObj = window;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!sPrefix)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sName)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = sName + ':';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = 'dbgDumpObj:';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!sName)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sName = '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The object itself.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = sPrefix + ' ';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log(sPrefix + sName + ' ' + dbgGetObjType(oObj));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The members.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = sPrefix + ' ';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aMembers = pythonlikeDir(oObj);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (i = 0; i < aMembers.length; i++)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log(sPrefix + aMembers[i]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjWorker(sType, sName, oObj, sPrefix)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync switch (sType)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'function':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'function ' + sName + '()' + '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'object':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(' + dbgGetObjType(oObj) + ') =';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += ' null\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'string':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(string, ' + oObj.length + ')';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (oObj.length < 80)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += ' = "' + oObj + '"\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'Oops!':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + sName + '(??)\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync default:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sPrefix + 'var ' + sName + '(' + sType + ')\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgObjInArray(aoObjs, oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var i = aoObjs.length;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync while (i > 0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync i--;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (aoObjs[i] === oObj)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjTreeWorker(oObj, sPrefix, aParentObjs, cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sRet = '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aMembers = pythonlikeShallowDir(oObj);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var i;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (i = 0; i < aMembers.length; i++)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //var sName = i;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sName = aMembers[i];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oMember;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sType;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oEx;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = oObj[sName];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = typeof oObj[sName];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync catch (oEx)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = null;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = 'Oops!';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync //sRet += '[' + i + '/' + aMembers.length + ']';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjWorker(sType, sName, oMember, sPrefix);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if ( sType == 'object'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync && oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (dbgObjInArray(aParentObjs, oMember))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += sPrefix + '! parent recursion\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if ( sName == 'previousSibling'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'previousElement'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'lastChild'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'firstElementChild'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'lastElementChild'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'nextElementSibling'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'prevElementSibling'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'parentElement'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || sName == 'ownerDocument')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += sPrefix + '! potentially dangerous element name\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if (aParentObjs.length >= cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = sRet.substring(0, sRet.length - 1);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += ' <too deep>!\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aParentObjs.push(oMember);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (i + 1 < aMembers.length)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oMember, sPrefix + '| ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oMember, sPrefix.substring(0, sPrefix.length - 2) + ' | ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aParentObjs.pop();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Dumps the given object and all it's subobjects to the console.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgDumpObjTree(oObj, sName, sPrefix, cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sType;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var sRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var oEx;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Defaults
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!sPrefix)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!sName)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sName = '??';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cMaxDepth = 2;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The object itself.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = typeof oObj;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync catch (oEx)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sType = 'Oops!';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet = dbgDumpObjWorker(sType, sName, oObj, sPrefix);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (sType == 'object' && oObj !== null)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aParentObjs = Array();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aParentObjs.push(oObj);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRet += dbgDumpObjTreeWorker(oObj, sPrefix + '| ', aParentObjs, cMaxDepth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sRet;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgLogString(sLongString)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var aStrings = sLongString.split("\n");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync var i;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for (i = 0; i < aStrings.length; i++)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log(aStrings[i]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync console.log('dbgLogString - end - ' + aStrings.length + '/' + sLongString.length);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfunction dbgLogObjTree(oObj, sName, sPrefix, cMaxDepth)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return dbgLogString(dbgDumpObjTree(oObj, sName, sPrefix, cMaxDepth));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @} */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync