You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by bu...@apache.org on 2017/05/17 15:33:04 UTC
svn commit: r1012387 [10/29] - in /websites/staging/ooo-site/trunk: cgi-bin/
content/ content/scripts/api.simile-widgets.org/
content/scripts/api.simile-widgets.org/ajax/
content/scripts/api.simile-widgets.org/ajax/2.2.1.fake/
content/scripts/api.simil...
Added: websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/graphics.js
==============================================================================
--- websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/graphics.js (added)
+++ websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/graphics.js Wed May 17 15:33:02 2017
@@ -0,0 +1,653 @@
+/**
+ * @fileOverview Graphics utility functions and constants
+ * @name SimileAjax.Graphics
+ */
+
+SimileAjax.Graphics = new Object();
+
+/**
+ * A boolean value indicating whether PNG translucency is supported on the
+ * user's browser or not.
+ *
+ * @type Boolean
+ */
+SimileAjax.Graphics.pngIsTranslucent = (!SimileAjax.Platform.browser.isIE) || (SimileAjax.Platform.browser.majorVersion > 6);
+if (!SimileAjax.Graphics.pngIsTranslucent) {
+ SimileAjax.includeCssFile(document, SimileAjax.urlPrefix + "styles/graphics-ie6.css");
+}
+
+/*==================================================
+ * Opacity, translucency
+ *==================================================
+ */
+SimileAjax.Graphics._createTranslucentImage1 = function(url, verticalAlign) {
+ var elmt = document.createElement("img");
+ elmt.setAttribute("src", url);
+ if (verticalAlign != null) {
+ elmt.style.verticalAlign = verticalAlign;
+ }
+ return elmt;
+};
+SimileAjax.Graphics._createTranslucentImage2 = function(url, verticalAlign) {
+ var elmt = document.createElement("img");
+ elmt.style.width = "1px"; // just so that IE will calculate the size property
+ elmt.style.height = "1px";
+ elmt.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url +"', sizingMethod='image')";
+ elmt.style.verticalAlign = (verticalAlign != null) ? verticalAlign : "middle";
+ return elmt;
+};
+
+/**
+ * Creates a DOM element for an <code>img</code> tag using the URL given. This
+ * is a convenience method that automatically includes the necessary CSS to
+ * allow for translucency, even on IE.
+ *
+ * @function
+ * @param {String} url the URL to the image
+ * @param {String} verticalAlign the CSS value for the image's vertical-align
+ * @return {Element} a DOM element containing the <code>img</code> tag
+ */
+SimileAjax.Graphics.createTranslucentImage = SimileAjax.Graphics.pngIsTranslucent ?
+ SimileAjax.Graphics._createTranslucentImage1 :
+ SimileAjax.Graphics._createTranslucentImage2;
+
+SimileAjax.Graphics._createTranslucentImageHTML1 = function(url, verticalAlign) {
+ return "<img src=\"" + url + "\"" +
+ (verticalAlign != null ? " style=\"vertical-align: " + verticalAlign + ";\"" : "") +
+ " />";
+};
+SimileAjax.Graphics._createTranslucentImageHTML2 = function(url, verticalAlign) {
+ var style =
+ "width: 1px; height: 1px; " +
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url +"', sizingMethod='image');" +
+ (verticalAlign != null ? " vertical-align: " + verticalAlign + ";" : "");
+
+ return "<img src='" + url + "' style=\"" + style + "\" />";
+};
+
+/**
+ * Creates an HTML string for an <code>img</code> tag using the URL given.
+ * This is a convenience method that automatically includes the necessary CSS
+ * to allow for translucency, even on IE.
+ *
+ * @function
+ * @param {String} url the URL to the image
+ * @param {String} verticalAlign the CSS value for the image's vertical-align
+ * @return {String} a string containing the <code>img</code> tag
+ */
+SimileAjax.Graphics.createTranslucentImageHTML = SimileAjax.Graphics.pngIsTranslucent ?
+ SimileAjax.Graphics._createTranslucentImageHTML1 :
+ SimileAjax.Graphics._createTranslucentImageHTML2;
+
+/**
+ * Sets the opacity on the given DOM element.
+ *
+ * @param {Element} elmt the DOM element to set the opacity on
+ * @param {Number} opacity an integer from 0 to 100 specifying the opacity
+ */
+SimileAjax.Graphics.setOpacity = function(elmt, opacity) {
+ if (SimileAjax.Platform.browser.isIE) {
+ elmt.style.filter = "progid:DXImageTransform.Microsoft.Alpha(Style=0,Opacity=" + opacity + ")";
+ } else {
+ var o = (opacity / 100).toString();
+ elmt.style.opacity = o;
+ elmt.style.MozOpacity = o;
+ }
+};
+
+/*==================================================
+ * Bubble
+ *==================================================
+ */
+
+SimileAjax.Graphics.bubbleConfig = {
+ containerCSSClass: "simileAjax-bubble-container",
+ innerContainerCSSClass: "simileAjax-bubble-innerContainer",
+ contentContainerCSSClass: "simileAjax-bubble-contentContainer",
+
+ borderGraphicSize: 50,
+ borderGraphicCSSClassPrefix: "simileAjax-bubble-border-",
+
+ arrowGraphicTargetOffset: 33, // from tip of arrow to the side of the graphic that touches the content of the bubble
+ arrowGraphicLength: 100, // dimension of arrow graphic along the direction that the arrow points
+ arrowGraphicWidth: 49, // dimension of arrow graphic perpendicular to the direction that the arrow points
+ arrowGraphicCSSClassPrefix: "simileAjax-bubble-arrow-",
+
+ closeGraphicCSSClass: "simileAjax-bubble-close",
+
+ extraPadding: 20
+};
+
+/**
+ * Creates a nice, rounded bubble popup with the given content in a div,
+ * page coordinates and a suggested width. The bubble will point to the
+ * location on the page as described by pageX and pageY. All measurements
+ * should be given in pixels.
+ *
+ * @param {Element} the content div
+ * @param {Number} pageX the x coordinate of the point to point to
+ * @param {Number} pageY the y coordinate of the point to point to
+ * @param {Number} contentWidth a suggested width of the content
+ * @param {String} orientation a string ("top", "bottom", "left", or "right")
+ * that describes the orientation of the arrow on the bubble
+ * @param {Number} maxHeight. Add a scrollbar div if bubble would be too tall.
+ * Default of 0 or null means no maximum
+ */
+SimileAjax.Graphics.createBubbleForContentAndPoint = function(
+ div, pageX, pageY, contentWidth, orientation, maxHeight) {
+ if (typeof contentWidth != "number") {
+ contentWidth = 300;
+ }
+ if (typeof maxHeight != "number") {
+ maxHeight = 0;
+ }
+
+ div.style.position = "absolute";
+ div.style.left = "-5000px";
+ div.style.top = "0px";
+ div.style.width = contentWidth + "px";
+ document.body.appendChild(div);
+
+ window.setTimeout(function() {
+ var width = div.scrollWidth + 10;
+ var height = div.scrollHeight + 10;
+ var scrollDivW = 0; // width of the possible inner container when we want vertical scrolling
+ if (maxHeight > 0 && height > maxHeight) {
+ height = maxHeight;
+ scrollDivW = width - 25;
+ }
+
+ var bubble = SimileAjax.Graphics.createBubbleForPoint(pageX, pageY, width, height, orientation);
+
+ document.body.removeChild(div);
+ div.style.position = "static";
+ div.style.left = "";
+ div.style.top = "";
+
+ // create a scroll div if needed
+ if (scrollDivW > 0) {
+ var scrollDiv = document.createElement("div");
+ div.style.width = "";
+ scrollDiv.style.width = scrollDivW + "px";
+ scrollDiv.appendChild(div);
+ bubble.content.appendChild(scrollDiv);
+ } else {
+ div.style.width = width + "px";
+ bubble.content.appendChild(div);
+ }
+ }, 200);
+};
+
+/**
+ * Creates a nice, rounded bubble popup with the given page coordinates and
+ * content dimensions. The bubble will point to the location on the page
+ * as described by pageX and pageY. All measurements should be given in
+ * pixels.
+ *
+ * @param {Number} pageX the x coordinate of the point to point to
+ * @param {Number} pageY the y coordinate of the point to point to
+ * @param {Number} contentWidth the width of the content box in the bubble
+ * @param {Number} contentHeight the height of the content box in the bubble
+ * @param {String} orientation a string ("top", "bottom", "left", or "right")
+ * that describes the orientation of the arrow on the bubble
+ * @return {Element} a DOM element for the newly created bubble
+ */
+SimileAjax.Graphics.createBubbleForPoint = function(pageX, pageY, contentWidth, contentHeight, orientation) {
+ contentWidth = parseInt(contentWidth, 10); // harden against bad input bugs
+ contentHeight = parseInt(contentHeight, 10); // getting numbers-as-strings
+
+ var bubbleConfig = SimileAjax.Graphics.bubbleConfig;
+ var pngTransparencyClassSuffix =
+ SimileAjax.Graphics.pngIsTranslucent ? "pngTranslucent" : "pngNotTranslucent";
+
+ var bubbleWidth = contentWidth + 2 * bubbleConfig.borderGraphicSize;
+ var bubbleHeight = contentHeight + 2 * bubbleConfig.borderGraphicSize;
+
+ var generatePngSensitiveClass = function(className) {
+ return className + " " + className + "-" + pngTransparencyClassSuffix;
+ };
+
+ /*
+ * Render container divs
+ */
+ var div = document.createElement("div");
+ div.className = generatePngSensitiveClass(bubbleConfig.containerCSSClass);
+ div.style.width = contentWidth + "px";
+ div.style.height = contentHeight + "px";
+
+ var divInnerContainer = document.createElement("div");
+ divInnerContainer.className = generatePngSensitiveClass(bubbleConfig.innerContainerCSSClass);
+ div.appendChild(divInnerContainer);
+
+ /*
+ * Create layer for bubble
+ */
+ var close = function() {
+ if (!bubble._closed) {
+ document.body.removeChild(bubble._div);
+ bubble._doc = null;
+ bubble._div = null;
+ bubble._content = null;
+ bubble._closed = true;
+ }
+ }
+ var bubble = { _closed: false };
+ var layer = SimileAjax.WindowManager.pushLayer(close, true, div);
+ bubble._div = div;
+ bubble.close = function() { SimileAjax.WindowManager.popLayer(layer); }
+
+ /*
+ * Render border graphics
+ */
+ var createBorder = function(classNameSuffix) {
+ var divBorderGraphic = document.createElement("div");
+ divBorderGraphic.className = generatePngSensitiveClass(bubbleConfig.borderGraphicCSSClassPrefix + classNameSuffix);
+ divInnerContainer.appendChild(divBorderGraphic);
+ };
+ createBorder("top-left");
+ createBorder("top-right");
+ createBorder("bottom-left");
+ createBorder("bottom-right");
+ createBorder("left");
+ createBorder("right");
+ createBorder("top");
+ createBorder("bottom");
+
+ /*
+ * Render content
+ */
+ var divContentContainer = document.createElement("div");
+ divContentContainer.className = generatePngSensitiveClass(bubbleConfig.contentContainerCSSClass);
+ divInnerContainer.appendChild(divContentContainer);
+ bubble.content = divContentContainer;
+
+ /*
+ * Render close button
+ */
+ var divClose = document.createElement("div");
+ divClose.className = generatePngSensitiveClass(bubbleConfig.closeGraphicCSSClass);
+ divInnerContainer.appendChild(divClose);
+ SimileAjax.WindowManager.registerEventWithObject(divClose, "click", bubble, "close");
+
+ (function() {
+ var dims = SimileAjax.Graphics.getWindowDimensions();
+ var docWidth = dims.w;
+ var docHeight = dims.h;
+
+ var halfArrowGraphicWidth = Math.ceil(bubbleConfig.arrowGraphicWidth / 2);
+
+ var createArrow = function(classNameSuffix) {
+ var divArrowGraphic = document.createElement("div");
+ divArrowGraphic.className = generatePngSensitiveClass(bubbleConfig.arrowGraphicCSSClassPrefix + "point-" + classNameSuffix);
+ divInnerContainer.appendChild(divArrowGraphic);
+ return divArrowGraphic;
+ };
+
+ if (pageX - halfArrowGraphicWidth - bubbleConfig.borderGraphicSize - bubbleConfig.extraPadding > 0 &&
+ pageX + halfArrowGraphicWidth + bubbleConfig.borderGraphicSize + bubbleConfig.extraPadding < docWidth) {
+
+ /*
+ * Bubble can be positioned above or below the target point.
+ */
+
+ var left = pageX - Math.round(contentWidth / 2);
+ left = pageX < (docWidth / 2) ?
+ Math.max(left, bubbleConfig.extraPadding + bubbleConfig.borderGraphicSize) :
+ Math.min(left, docWidth - bubbleConfig.extraPadding - bubbleConfig.borderGraphicSize - contentWidth);
+
+ if ((orientation && orientation == "top") ||
+ (!orientation &&
+ (pageY
+ - bubbleConfig.arrowGraphicTargetOffset
+ - contentHeight
+ - bubbleConfig.borderGraphicSize
+ - bubbleConfig.extraPadding > 0))) {
+
+ /*
+ * Position bubble above the target point.
+ */
+
+ var divArrow = createArrow("down");
+ divArrow.style.left = (pageX - halfArrowGraphicWidth - left) + "px";
+
+ div.style.left = left + "px";
+ div.style.top = (pageY - bubbleConfig.arrowGraphicTargetOffset - contentHeight) + "px";
+
+ return;
+ } else if ((orientation && orientation == "bottom") ||
+ (!orientation &&
+ (pageY
+ + bubbleConfig.arrowGraphicTargetOffset
+ + contentHeight
+ + bubbleConfig.borderGraphicSize
+ + bubbleConfig.extraPadding < docHeight))) {
+
+ /*
+ * Position bubble below the target point.
+ */
+
+ var divArrow = createArrow("up");
+ divArrow.style.left = (pageX - halfArrowGraphicWidth - left) + "px";
+
+ div.style.left = left + "px";
+ div.style.top = (pageY + bubbleConfig.arrowGraphicTargetOffset) + "px";
+
+ return;
+ }
+ }
+
+ var top = pageY - Math.round(contentHeight / 2);
+ top = pageY < (docHeight / 2) ?
+ Math.max(top, bubbleConfig.extraPadding + bubbleConfig.borderGraphicSize) :
+ Math.min(top, docHeight - bubbleConfig.extraPadding - bubbleConfig.borderGraphicSize - contentHeight);
+
+ if ((orientation && orientation == "left") ||
+ (!orientation &&
+ (pageX
+ - bubbleConfig.arrowGraphicTargetOffset
+ - contentWidth
+ - bubbleConfig.borderGraphicSize
+ - bubbleConfig.extraPadding > 0))) {
+
+ /*
+ * Position bubble left of the target point.
+ */
+
+ var divArrow = createArrow("right");
+ divArrow.style.top = (pageY - halfArrowGraphicWidth - top) + "px";
+
+ div.style.top = top + "px";
+ div.style.left = (pageX - bubbleConfig.arrowGraphicTargetOffset - contentWidth) + "px";
+ } else {
+
+ /*
+ * Position bubble right of the target point, as the last resort.
+ */
+
+ var divArrow = createArrow("left");
+ divArrow.style.top = (pageY - halfArrowGraphicWidth - top) + "px";
+
+ div.style.top = top + "px";
+ div.style.left = (pageX + bubbleConfig.arrowGraphicTargetOffset) + "px";
+ }
+ })();
+
+ document.body.appendChild(div);
+
+ return bubble;
+};
+
+SimileAjax.Graphics.getWindowDimensions = function() {
+ if (typeof window.innerHeight == 'number') {
+ return { w:window.innerWidth, h:window.innerHeight }; // Non-IE
+ } else if (document.documentElement && document.documentElement.clientHeight) {
+ return { // IE6+, in "standards compliant mode"
+ w:document.documentElement.clientWidth,
+ h:document.documentElement.clientHeight
+ };
+ } else if (document.body && document.body.clientHeight) {
+ return { // IE 4 compatible
+ w:document.body.clientWidth,
+ h:document.body.clientHeight
+ };
+ }
+};
+
+
+/**
+ * Creates a floating, rounded message bubble in the center of the window for
+ * displaying modal information, e.g. "Loading..."
+ *
+ * @param {Document} doc the root document for the page to render on
+ * @param {Object} an object with two properties, contentDiv and containerDiv,
+ * consisting of the newly created DOM elements
+ */
+SimileAjax.Graphics.createMessageBubble = function(doc) {
+ var containerDiv = doc.createElement("div");
+ if (SimileAjax.Graphics.pngIsTranslucent) {
+ var topDiv = doc.createElement("div");
+ topDiv.style.height = "33px";
+ topDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-top-left.png) top left no-repeat";
+ topDiv.style.paddingLeft = "44px";
+ containerDiv.appendChild(topDiv);
+
+ var topRightDiv = doc.createElement("div");
+ topRightDiv.style.height = "33px";
+ topRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-top-right.png) top right no-repeat";
+ topDiv.appendChild(topRightDiv);
+
+ var middleDiv = doc.createElement("div");
+ middleDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-left.png) top left repeat-y";
+ middleDiv.style.paddingLeft = "44px";
+ containerDiv.appendChild(middleDiv);
+
+ var middleRightDiv = doc.createElement("div");
+ middleRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-right.png) top right repeat-y";
+ middleRightDiv.style.paddingRight = "44px";
+ middleDiv.appendChild(middleRightDiv);
+
+ var contentDiv = doc.createElement("div");
+ middleRightDiv.appendChild(contentDiv);
+
+ var bottomDiv = doc.createElement("div");
+ bottomDiv.style.height = "55px";
+ bottomDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-bottom-left.png) bottom left no-repeat";
+ bottomDiv.style.paddingLeft = "44px";
+ containerDiv.appendChild(bottomDiv);
+
+ var bottomRightDiv = doc.createElement("div");
+ bottomRightDiv.style.height = "55px";
+ bottomRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-bottom-right.png) bottom right no-repeat";
+ bottomDiv.appendChild(bottomRightDiv);
+ } else {
+ containerDiv.style.border = "2px solid #7777AA";
+ containerDiv.style.padding = "20px";
+ containerDiv.style.background = "white";
+ SimileAjax.Graphics.setOpacity(containerDiv, 90);
+
+ var contentDiv = doc.createElement("div");
+ containerDiv.appendChild(contentDiv);
+ }
+
+ return {
+ containerDiv: containerDiv,
+ contentDiv: contentDiv
+ };
+};
+
+/*==================================================
+ * Animation
+ *==================================================
+ */
+
+/**
+ * Creates an animation for a function, and an interval of values. The word
+ * "animation" here is used in the sense of repeatedly calling a function with
+ * a current value from within an interval, and a delta value.
+ *
+ * @param {Function} f a function to be called every 50 milliseconds throughout
+ * the animation duration, of the form f(current, delta), where current is
+ * the current value within the range and delta is the current change.
+ * @param {Number} from a starting value
+ * @param {Number} to an ending value
+ * @param {Number} duration the duration of the animation in milliseconds
+ * @param {Function} [cont] an optional function that is called at the end of
+ * the animation, i.e. a continuation.
+ * @return {SimileAjax.Graphics._Animation} a new animation object
+ */
+SimileAjax.Graphics.createAnimation = function(f, from, to, duration, cont) {
+ return new SimileAjax.Graphics._Animation(f, from, to, duration, cont);
+};
+
+SimileAjax.Graphics._Animation = function(f, from, to, duration, cont) {
+ this.f = f;
+ this.cont = (typeof cont == "function") ? cont : function() {};
+
+ this.from = from;
+ this.to = to;
+ this.current = from;
+
+ this.duration = duration;
+ this.start = new Date().getTime();
+ this.timePassed = 0;
+};
+
+/**
+ * Runs this animation.
+ */
+SimileAjax.Graphics._Animation.prototype.run = function() {
+ var a = this;
+ window.setTimeout(function() { a.step(); }, 50);
+};
+
+/**
+ * Increments this animation by one step, and then continues the animation with
+ * <code>run()</code>.
+ */
+SimileAjax.Graphics._Animation.prototype.step = function() {
+ this.timePassed += 50;
+
+ var timePassedFraction = this.timePassed / this.duration;
+ var parameterFraction = -Math.cos(timePassedFraction * Math.PI) / 2 + 0.5;
+ var current = parameterFraction * (this.to - this.from) + this.from;
+
+ try {
+ this.f(current, current - this.current);
+ } catch (e) {
+ }
+ this.current = current;
+
+ if (this.timePassed < this.duration) {
+ this.run();
+ } else {
+ this.f(this.to, 0);
+ this["cont"]();
+ }
+};
+
+/*==================================================
+ * CopyPasteButton
+ *
+ * Adapted from http://spaces.live.com/editorial/rayozzie/demo/liveclip/liveclipsample/techPreview.html.
+ *==================================================
+ */
+
+/**
+ * Creates a button and textarea for displaying structured data and copying it
+ * to the clipboard. The data is dynamically generated by the given
+ * createDataFunction parameter.
+ *
+ * @param {String} image an image URL to use as the background for the
+ * generated box
+ * @param {Number} width the width in pixels of the generated box
+ * @param {Number} height the height in pixels of the generated box
+ * @param {Function} createDataFunction a function that is called with no
+ * arguments to generate the structured data
+ * @return a new DOM element
+ */
+SimileAjax.Graphics.createStructuredDataCopyButton = function(image, width, height, createDataFunction) {
+ var div = document.createElement("div");
+ div.style.position = "relative";
+ div.style.display = "inline";
+ div.style.width = width + "px";
+ div.style.height = height + "px";
+ div.style.overflow = "hidden";
+ div.style.margin = "2px";
+
+ if (SimileAjax.Graphics.pngIsTranslucent) {
+ div.style.background = "url(" + image + ") no-repeat";
+ } else {
+ div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + image +"', sizingMethod='image')";
+ }
+
+ var style;
+ if (SimileAjax.Platform.browser.isIE) {
+ style = "filter:alpha(opacity=0)";
+ } else {
+ style = "opacity: 0";
+ }
+ div.innerHTML = "<textarea rows='1' autocomplete='off' value='none' style='" + style + "' />";
+
+ var textarea = div.firstChild;
+ textarea.style.width = width + "px";
+ textarea.style.height = height + "px";
+ textarea.onmousedown = function(evt) {
+ evt = (evt) ? evt : ((event) ? event : null);
+ if (evt.button == 2) {
+ textarea.value = createDataFunction();
+ textarea.select();
+ }
+ };
+
+ return div;
+};
+
+/*==================================================
+ * getWidthHeight
+ *==================================================
+ */
+SimileAjax.Graphics.getWidthHeight = function(el) {
+ // RETURNS hash {width: w, height: h} in pixels
+
+ var w, h;
+ // offsetWidth rounds on FF, so doesn't work for us.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=458617
+ if (el.getBoundingClientRect == null) {
+ // use offsetWidth
+ w = el.offsetWidth;
+ h = el.offsetHeight;
+ } else {
+ // use getBoundingClientRect
+ var rect = el.getBoundingClientRect();
+ w = Math.ceil(rect.right - rect.left);
+ h = Math.ceil(rect.bottom - rect.top);
+ }
+ return {
+ width: w,
+ height: h
+ };
+};
+
+
+/*==================================================
+ * FontRenderingContext
+ *==================================================
+ */
+SimileAjax.Graphics.getFontRenderingContext = function(elmt, width) {
+ return new SimileAjax.Graphics._FontRenderingContext(elmt, width);
+};
+
+SimileAjax.Graphics._FontRenderingContext = function(elmt, width) {
+ this._elmt = elmt;
+ this._elmt.style.visibility = "hidden";
+ if (typeof width == "string") {
+ this._elmt.style.width = width;
+ } else if (typeof width == "number") {
+ this._elmt.style.width = width + "px";
+ }
+};
+
+SimileAjax.Graphics._FontRenderingContext.prototype.dispose = function() {
+ this._elmt = null;
+};
+
+SimileAjax.Graphics._FontRenderingContext.prototype.update = function() {
+ this._elmt.innerHTML = "A";
+ this._lineHeight = this._elmt.offsetHeight;
+};
+
+SimileAjax.Graphics._FontRenderingContext.prototype.computeSize = function(text, className) {
+ // className arg is optional
+ var el = this._elmt;
+ el.innerHTML = text;
+ el.className = className === undefined ? '' : className;
+ var wh = SimileAjax.Graphics.getWidthHeight(el);
+ el.className = ''; // reset for the next guy
+
+ return wh;
+};
+
+SimileAjax.Graphics._FontRenderingContext.prototype.getLineHeight = function() {
+ return this._lineHeight;
+};
+
Added: websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/history.js
==============================================================================
--- websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/history.js (added)
+++ websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/history.js Wed May 17 15:33:02 2017
@@ -0,0 +1,220 @@
+/*======================================================================
+ * History
+ *
+ * This is a singleton that keeps track of undoable user actions and
+ * performs undos and redos in response to the browser's Back and
+ * Forward buttons.
+ *
+ * Call addAction(action) to register an undoable user action. action
+ * must have 4 fields:
+ *
+ * perform: an argument-less function that carries out the action
+ * undo: an argument-less function that undos the action
+ * label: a short, user-friendly string describing the action
+ * uiLayer: the UI layer on which the action takes place
+ *
+ * By default, the history keeps track of upto 10 actions. You can
+ * configure this behavior by setting
+ * SimileAjax.History.maxHistoryLength
+ * to a different number.
+ *
+ * An iframe is inserted into the document's body element to track
+ * onload events.
+ *======================================================================
+ */
+
+SimileAjax.History = {
+ maxHistoryLength: 10,
+ historyFile: "__history__.html",
+ enabled: true,
+
+ _initialized: false,
+ _listeners: new SimileAjax.ListenerQueue(),
+
+ _actions: [],
+ _baseIndex: 0,
+ _currentIndex: 0,
+
+ _plainDocumentTitle: document.title
+};
+
+SimileAjax.History.formatHistoryEntryTitle = function(actionLabel) {
+ return SimileAjax.History._plainDocumentTitle + " {" + actionLabel + "}";
+};
+
+SimileAjax.History.initialize = function() {
+ if (SimileAjax.History._initialized) {
+ return;
+ }
+
+ if (SimileAjax.History.enabled) {
+ var iframe = document.createElement("iframe");
+ iframe.id = "simile-ajax-history";
+ iframe.style.position = "absolute";
+ iframe.style.width = "10px";
+ iframe.style.height = "10px";
+ iframe.style.top = "0px";
+ iframe.style.left = "0px";
+ iframe.style.visibility = "hidden";
+ iframe.src = SimileAjax.History.historyFile + "?0";
+
+ document.body.appendChild(iframe);
+ SimileAjax.DOM.registerEvent(iframe, "load", SimileAjax.History._handleIFrameOnLoad);
+
+ SimileAjax.History._iframe = iframe;
+ }
+ SimileAjax.History._initialized = true;
+};
+
+SimileAjax.History.addListener = function(listener) {
+ SimileAjax.History.initialize();
+
+ SimileAjax.History._listeners.add(listener);
+};
+
+SimileAjax.History.removeListener = function(listener) {
+ SimileAjax.History.initialize();
+
+ SimileAjax.History._listeners.remove(listener);
+};
+
+SimileAjax.History.addAction = function(action) {
+ SimileAjax.History.initialize();
+
+ SimileAjax.History._listeners.fire("onBeforePerform", [ action ]);
+ window.setTimeout(function() {
+ try {
+ action.perform();
+ SimileAjax.History._listeners.fire("onAfterPerform", [ action ]);
+
+ if (SimileAjax.History.enabled) {
+ SimileAjax.History._actions = SimileAjax.History._actions.slice(
+ 0, SimileAjax.History._currentIndex - SimileAjax.History._baseIndex);
+
+ SimileAjax.History._actions.push(action);
+ SimileAjax.History._currentIndex++;
+
+ var diff = SimileAjax.History._actions.length - SimileAjax.History.maxHistoryLength;
+ if (diff > 0) {
+ SimileAjax.History._actions = SimileAjax.History._actions.slice(diff);
+ SimileAjax.History._baseIndex += diff;
+ }
+
+ try {
+ SimileAjax.History._iframe.contentWindow.location.search =
+ "?" + SimileAjax.History._currentIndex;
+ } catch (e) {
+ /*
+ * We can't modify location.search most probably because it's a file:// url.
+ * We'll just going to modify the document's title.
+ */
+ var title = SimileAjax.History.formatHistoryEntryTitle(action.label);
+ document.title = title;
+ }
+ }
+ } catch (e) {
+ SimileAjax.Debug.exception(e, "Error adding action {" + action.label + "} to history");
+ }
+ }, 0);
+};
+
+SimileAjax.History.addLengthyAction = function(perform, undo, label) {
+ SimileAjax.History.addAction({
+ perform: perform,
+ undo: undo,
+ label: label,
+ uiLayer: SimileAjax.WindowManager.getBaseLayer(),
+ lengthy: true
+ });
+};
+
+SimileAjax.History._handleIFrameOnLoad = function() {
+ /*
+ * This function is invoked when the user herself
+ * navigates backward or forward. We need to adjust
+ * the application's state accordingly.
+ */
+
+ try {
+ var q = SimileAjax.History._iframe.contentWindow.location.search;
+ var c = (q.length == 0) ? 0 : Math.max(0, parseInt(q.substr(1)));
+
+ var finishUp = function() {
+ var diff = c - SimileAjax.History._currentIndex;
+ SimileAjax.History._currentIndex += diff;
+ SimileAjax.History._baseIndex += diff;
+
+ SimileAjax.History._iframe.contentWindow.location.search = "?" + c;
+ };
+
+ if (c < SimileAjax.History._currentIndex) { // need to undo
+ SimileAjax.History._listeners.fire("onBeforeUndoSeveral", []);
+ window.setTimeout(function() {
+ while (SimileAjax.History._currentIndex > c &&
+ SimileAjax.History._currentIndex > SimileAjax.History._baseIndex) {
+
+ SimileAjax.History._currentIndex--;
+
+ var action = SimileAjax.History._actions[SimileAjax.History._currentIndex - SimileAjax.History._baseIndex];
+
+ try {
+ action.undo();
+ } catch (e) {
+ SimileAjax.Debug.exception(e, "History: Failed to undo action {" + action.label + "}");
+ }
+ }
+
+ SimileAjax.History._listeners.fire("onAfterUndoSeveral", []);
+ finishUp();
+ }, 0);
+ } else if (c > SimileAjax.History._currentIndex) { // need to redo
+ SimileAjax.History._listeners.fire("onBeforeRedoSeveral", []);
+ window.setTimeout(function() {
+ while (SimileAjax.History._currentIndex < c &&
+ SimileAjax.History._currentIndex - SimileAjax.History._baseIndex < SimileAjax.History._actions.length) {
+
+ var action = SimileAjax.History._actions[SimileAjax.History._currentIndex - SimileAjax.History._baseIndex];
+
+ try {
+ action.perform();
+ } catch (e) {
+ SimileAjax.Debug.exception(e, "History: Failed to redo action {" + action.label + "}");
+ }
+
+ SimileAjax.History._currentIndex++;
+ }
+
+ SimileAjax.History._listeners.fire("onAfterRedoSeveral", []);
+ finishUp();
+ }, 0);
+ } else {
+ var index = SimileAjax.History._currentIndex - SimileAjax.History._baseIndex - 1;
+ var title = (index >= 0 && index < SimileAjax.History._actions.length) ?
+ SimileAjax.History.formatHistoryEntryTitle(SimileAjax.History._actions[index].label) :
+ SimileAjax.History._plainDocumentTitle;
+
+ SimileAjax.History._iframe.contentWindow.document.title = title;
+ document.title = title;
+ }
+ } catch (e) {
+ // silent
+ }
+};
+
+SimileAjax.History.getNextUndoAction = function() {
+ try {
+ var index = SimileAjax.History._currentIndex - SimileAjax.History._baseIndex - 1;
+ return SimileAjax.History._actions[index];
+ } catch (e) {
+ return null;
+ }
+};
+
+SimileAjax.History.getNextRedoAction = function() {
+ try {
+ var index = SimileAjax.History._currentIndex - SimileAjax.History._baseIndex;
+ return SimileAjax.History._actions[index];
+ } catch (e) {
+ return null;
+ }
+};
Added: websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/html.js
==============================================================================
--- websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/html.js (added)
+++ websites/staging/ooo-site/trunk/content/scripts/api.simile-widgets.org/ajax/2.2.2/scripts/html.js Wed May 17 15:33:02 2017
@@ -0,0 +1,274 @@
+/*==================================================
+ * HTML Utility Functions
+ *==================================================
+ */
+
+SimileAjax.HTML = new Object();
+
+SimileAjax.HTML._e2uHash = {};
+(function() {
+ var e2uHash = SimileAjax.HTML._e2uHash;
+ e2uHash['nbsp']= '\u00A0[space]';
+ e2uHash['iexcl']= '\u00A1';
+ e2uHash['cent']= '\u00A2';
+ e2uHash['pound']= '\u00A3';
+ e2uHash['curren']= '\u00A4';
+ e2uHash['yen']= '\u00A5';
+ e2uHash['brvbar']= '\u00A6';
+ e2uHash['sect']= '\u00A7';
+ e2uHash['uml']= '\u00A8';
+ e2uHash['copy']= '\u00A9';
+ e2uHash['ordf']= '\u00AA';
+ e2uHash['laquo']= '\u00AB';
+ e2uHash['not']= '\u00AC';
+ e2uHash['shy']= '\u00AD';
+ e2uHash['reg']= '\u00AE';
+ e2uHash['macr']= '\u00AF';
+ e2uHash['deg']= '\u00B0';
+ e2uHash['plusmn']= '\u00B1';
+ e2uHash['sup2']= '\u00B2';
+ e2uHash['sup3']= '\u00B3';
+ e2uHash['acute']= '\u00B4';
+ e2uHash['micro']= '\u00B5';
+ e2uHash['para']= '\u00B6';
+ e2uHash['middot']= '\u00B7';
+ e2uHash['cedil']= '\u00B8';
+ e2uHash['sup1']= '\u00B9';
+ e2uHash['ordm']= '\u00BA';
+ e2uHash['raquo']= '\u00BB';
+ e2uHash['frac14']= '\u00BC';
+ e2uHash['frac12']= '\u00BD';
+ e2uHash['frac34']= '\u00BE';
+ e2uHash['iquest']= '\u00BF';
+ e2uHash['Agrave']= '\u00C0';
+ e2uHash['Aacute']= '\u00C1';
+ e2uHash['Acirc']= '\u00C2';
+ e2uHash['Atilde']= '\u00C3';
+ e2uHash['Auml']= '\u00C4';
+ e2uHash['Aring']= '\u00C5';
+ e2uHash['AElig']= '\u00C6';
+ e2uHash['Ccedil']= '\u00C7';
+ e2uHash['Egrave']= '\u00C8';
+ e2uHash['Eacute']= '\u00C9';
+ e2uHash['Ecirc']= '\u00CA';
+ e2uHash['Euml']= '\u00CB';
+ e2uHash['Igrave']= '\u00CC';
+ e2uHash['Iacute']= '\u00CD';
+ e2uHash['Icirc']= '\u00CE';
+ e2uHash['Iuml']= '\u00CF';
+ e2uHash['ETH']= '\u00D0';
+ e2uHash['Ntilde']= '\u00D1';
+ e2uHash['Ograve']= '\u00D2';
+ e2uHash['Oacute']= '\u00D3';
+ e2uHash['Ocirc']= '\u00D4';
+ e2uHash['Otilde']= '\u00D5';
+ e2uHash['Ouml']= '\u00D6';
+ e2uHash['times']= '\u00D7';
+ e2uHash['Oslash']= '\u00D8';
+ e2uHash['Ugrave']= '\u00D9';
+ e2uHash['Uacute']= '\u00DA';
+ e2uHash['Ucirc']= '\u00DB';
+ e2uHash['Uuml']= '\u00DC';
+ e2uHash['Yacute']= '\u00DD';
+ e2uHash['THORN']= '\u00DE';
+ e2uHash['szlig']= '\u00DF';
+ e2uHash['agrave']= '\u00E0';
+ e2uHash['aacute']= '\u00E1';
+ e2uHash['acirc']= '\u00E2';
+ e2uHash['atilde']= '\u00E3';
+ e2uHash['auml']= '\u00E4';
+ e2uHash['aring']= '\u00E5';
+ e2uHash['aelig']= '\u00E6';
+ e2uHash['ccedil']= '\u00E7';
+ e2uHash['egrave']= '\u00E8';
+ e2uHash['eacute']= '\u00E9';
+ e2uHash['ecirc']= '\u00EA';
+ e2uHash['euml']= '\u00EB';
+ e2uHash['igrave']= '\u00EC';
+ e2uHash['iacute']= '\u00ED';
+ e2uHash['icirc']= '\u00EE';
+ e2uHash['iuml']= '\u00EF';
+ e2uHash['eth']= '\u00F0';
+ e2uHash['ntilde']= '\u00F1';
+ e2uHash['ograve']= '\u00F2';
+ e2uHash['oacute']= '\u00F3';
+ e2uHash['ocirc']= '\u00F4';
+ e2uHash['otilde']= '\u00F5';
+ e2uHash['ouml']= '\u00F6';
+ e2uHash['divide']= '\u00F7';
+ e2uHash['oslash']= '\u00F8';
+ e2uHash['ugrave']= '\u00F9';
+ e2uHash['uacute']= '\u00FA';
+ e2uHash['ucirc']= '\u00FB';
+ e2uHash['uuml']= '\u00FC';
+ e2uHash['yacute']= '\u00FD';
+ e2uHash['thorn']= '\u00FE';
+ e2uHash['yuml']= '\u00FF';
+ e2uHash['quot']= '\u0022';
+ e2uHash['amp']= '\u0026';
+ e2uHash['lt']= '\u003C';
+ e2uHash['gt']= '\u003E';
+ e2uHash['OElig']= '';
+ e2uHash['oelig']= '\u0153';
+ e2uHash['Scaron']= '\u0160';
+ e2uHash['scaron']= '\u0161';
+ e2uHash['Yuml']= '\u0178';
+ e2uHash['circ']= '\u02C6';
+ e2uHash['tilde']= '\u02DC';
+ e2uHash['ensp']= '\u2002';
+ e2uHash['emsp']= '\u2003';
+ e2uHash['thinsp']= '\u2009';
+ e2uHash['zwnj']= '\u200C';
+ e2uHash['zwj']= '\u200D';
+ e2uHash['lrm']= '\u200E';
+ e2uHash['rlm']= '\u200F';
+ e2uHash['ndash']= '\u2013';
+ e2uHash['mdash']= '\u2014';
+ e2uHash['lsquo']= '\u2018';
+ e2uHash['rsquo']= '\u2019';
+ e2uHash['sbquo']= '\u201A';
+ e2uHash['ldquo']= '\u201C';
+ e2uHash['rdquo']= '\u201D';
+ e2uHash['bdquo']= '\u201E';
+ e2uHash['dagger']= '\u2020';
+ e2uHash['Dagger']= '\u2021';
+ e2uHash['permil']= '\u2030';
+ e2uHash['lsaquo']= '\u2039';
+ e2uHash['rsaquo']= '\u203A';
+ e2uHash['euro']= '\u20AC';
+ e2uHash['fnof']= '\u0192';
+ e2uHash['Alpha']= '\u0391';
+ e2uHash['Beta']= '\u0392';
+ e2uHash['Gamma']= '\u0393';
+ e2uHash['Delta']= '\u0394';
+ e2uHash['Epsilon']= '\u0395';
+ e2uHash['Zeta']= '\u0396';
+ e2uHash['Eta']= '\u0397';
+ e2uHash['Theta']= '\u0398';
+ e2uHash['Iota']= '\u0399';
+ e2uHash['Kappa']= '\u039A';
+ e2uHash['Lambda']= '\u039B';
+ e2uHash['Mu']= '\u039C';
+ e2uHash['Nu']= '\u039D';
+ e2uHash['Xi']= '\u039E';
+ e2uHash['Omicron']= '\u039F';
+ e2uHash['Pi']= '\u03A0';
+ e2uHash['Rho']= '\u03A1';
+ e2uHash['Sigma']= '\u03A3';
+ e2uHash['Tau']= '\u03A4';
+ e2uHash['Upsilon']= '\u03A5';
+ e2uHash['Phi']= '\u03A6';
+ e2uHash['Chi']= '\u03A7';
+ e2uHash['Psi']= '\u03A8';
+ e2uHash['Omega']= '\u03A9';
+ e2uHash['alpha']= '\u03B1';
+ e2uHash['beta']= '\u03B2';
+ e2uHash['gamma']= '\u03B3';
+ e2uHash['delta']= '\u03B4';
+ e2uHash['epsilon']= '\u03B5';
+ e2uHash['zeta']= '\u03B6';
+ e2uHash['eta']= '\u03B7';
+ e2uHash['theta']= '\u03B8';
+ e2uHash['iota']= '\u03B9';
+ e2uHash['kappa']= '\u03BA';
+ e2uHash['lambda']= '\u03BB';
+ e2uHash['mu']= '\u03BC';
+ e2uHash['nu']= '\u03BD';
+ e2uHash['xi']= '\u03BE';
+ e2uHash['omicron']= '\u03BF';
+ e2uHash['pi']= '\u03C0';
+ e2uHash['rho']= '\u03C1';
+ e2uHash['sigmaf']= '\u03C2';
+ e2uHash['sigma']= '\u03C3';
+ e2uHash['tau']= '\u03C4';
+ e2uHash['upsilon']= '\u03C5';
+ e2uHash['phi']= '\u03C6';
+ e2uHash['chi']= '\u03C7';
+ e2uHash['psi']= '\u03C8';
+ e2uHash['omega']= '\u03C9';
+ e2uHash['thetasym']= '\u03D1';
+ e2uHash['upsih']= '\u03D2';
+ e2uHash['piv']= '\u03D6';
+ e2uHash['bull']= '\u2022';
+ e2uHash['hellip']= '\u2026';
+ e2uHash['prime']= '\u2032';
+ e2uHash['Prime']= '\u2033';
+ e2uHash['oline']= '\u203E';
+ e2uHash['frasl']= '\u2044';
+ e2uHash['weierp']= '\u2118';
+ e2uHash['image']= '\u2111';
+ e2uHash['real']= '\u211C';
+ e2uHash['trade']= '\u2122';
+ e2uHash['alefsym']= '\u2135';
+ e2uHash['larr']= '\u2190';
+ e2uHash['uarr']= '\u2191';
+ e2uHash['rarr']= '\u2192';
+ e2uHash['darr']= '\u2193';
+ e2uHash['harr']= '\u2194';
+ e2uHash['crarr']= '\u21B5';
+ e2uHash['lArr']= '\u21D0';
+ e2uHash['uArr']= '\u21D1';
+ e2uHash['rArr']= '\u21D2';
+ e2uHash['dArr']= '\u21D3';
+ e2uHash['hArr']= '\u21D4';
+ e2uHash['forall']= '\u2200';
+ e2uHash['part']= '\u2202';
+ e2uHash['exist']= '\u2203';
+ e2uHash['empty']= '\u2205';
+ e2uHash['nabla']= '\u2207';
+ e2uHash['isin']= '\u2208';
+ e2uHash['notin']= '\u2209';
+ e2uHash['ni']= '\u220B';
+ e2uHash['prod']= '\u220F';
+ e2uHash['sum']= '\u2211';
+ e2uHash['minus']= '\u2212';
+ e2uHash['lowast']= '\u2217';
+ e2uHash['radic']= '\u221A';
+ e2uHash['prop']= '\u221D';
+ e2uHash['infin']= '\u221E';
+ e2uHash['ang']= '\u2220';
+ e2uHash['and']= '\u2227';
+ e2uHash['or']= '\u2228';
+ e2uHash['cap']= '\u2229';
+ e2uHash['cup']= '\u222A';
+ e2uHash['int']= '\u222B';
+ e2uHash['there4']= '\u2234';
+ e2uHash['sim']= '\u223C';
+ e2uHash['cong']= '\u2245';
+ e2uHash['asymp']= '\u2248';
+ e2uHash['ne']= '\u2260';
+ e2uHash['equiv']= '\u2261';
+ e2uHash['le']= '\u2264';
+ e2uHash['ge']= '\u2265';
+ e2uHash['sub']= '\u2282';
+ e2uHash['sup']= '\u2283';
+ e2uHash['nsub']= '\u2284';
+ e2uHash['sube']= '\u2286';
+ e2uHash['supe']= '\u2287';
+ e2uHash['oplus']= '\u2295';
+ e2uHash['otimes']= '\u2297';
+ e2uHash['perp']= '\u22A5';
+ e2uHash['sdot']= '\u22C5';
+ e2uHash['lceil']= '\u2308';
+ e2uHash['rceil']= '\u2309';
+ e2uHash['lfloor']= '\u230A';
+ e2uHash['rfloor']= '\u230B';
+ e2uHash['lang']= '\u2329';
+ e2uHash['rang']= '\u232A';
+ e2uHash['loz']= '\u25CA';
+ e2uHash['spades']= '\u2660';
+ e2uHash['clubs']= '\u2663';
+ e2uHash['hearts']= '\u2665';
+ e2uHash['diams']= '\u2666';
+})();
+
+SimileAjax.HTML.deEntify = function(s) {
+ var e2uHash = SimileAjax.HTML._e2uHash;
+
+ var re = /&(\w+?);/;
+ while (re.test(s)) {
+ var m = s.match(re);
+ s = s.replace(re, e2uHash[m[1]]);
+ }
+ return s;
+};
\ No newline at end of file