text: /**
   * Wrapper for VML element.
   * @constructor
   * @extends jvm.AbstractElement
   * @param {String} name Tag name of the element
   * @param {Object} config Set of parameters to initialize element with
   */
  
  jvm.VMLElement = function (name, config) {
      if (!jvm.VMLElement.VMLInitialized) {
          jvm.VMLElement.initializeVML();
      }
  
      jvm.VMLElement.parentClass.apply(this, arguments);
  };
  
  jvm.inherits(jvm.VMLElement, jvm.AbstractElement);
  
  /**
   * Shows if VML was already initialized for the current document or not.
   * @static
   * @private
   * @type {Boolean}
   */
  jvm.VMLElement.VMLInitialized = false;
  
  /**
   * Initializes VML handling before creating the first element
   * (adds CSS class and creates namespace). Adds one of two forms
   * of createElement method depending of support by browser.
   * @static
   * @private
   */
  
  // The following method of VML handling is borrowed from the
  // Raphael library by Dmitry Baranovsky.
  
  jvm.VMLElement.initializeVML = function () {
      try {
          if (!document.namespaces.rvml) {
              document.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
          }
          /**
           * Creates DOM element.
           * @param {String} tagName Name of element
           * @private
           * @returns DOMElement
           */
          jvm.VMLElement.prototype.createElement = function (tagName) {
              return document.createElement('<rvml:' + tagName + ' class="rvml">');
          };
      } catch (e) {
          /**
           * @private
           */
          jvm.VMLElement.prototype.createElement = function (tagName) {
              return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
          };
      }
      document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
      jvm.VMLElement.VMLInitialized = true;
  };
  
  /**
   * Returns constructor for element by name prefixed with 'VML'.
   * @param {String} ctr Name of basic constructor to return
   * proper implementation for.
   * @returns Function
   * @private
   */
  jvm.VMLElement.prototype.getElementCtr = function (ctr) {
      return jvm['VML' + ctr];
  };
  
  /**
   * Adds CSS class for underlying DOM element.
   * @param {String} className Name of CSS class name
   */
  jvm.VMLElement.prototype.addClass = function (className) {
      jvm.$(this.node).addClass(className);
  };
  
  /**
   * Applies attribute value to the underlying DOM element.
   * @param {String} name Name of attribute
   * @param {Number|String} config Value of attribute to apply
   * @private
   */
  jvm.VMLElement.prototype.applyAttr = function (attr, value) {
      this.node[attr] = value;
  };
  
  /**
   * Returns boundary box for the element.
   * @returns {Object} Boundary box with numeric fields: x, y, width, height
   * @override
   */
  jvm.VMLElement.prototype.getBBox = function () {
      var node = jvm.$(this.node);
  
      return {
          x: node.position().left / this.canvas.scale,
          y: node.position().top / this.canvas.scale,
          width: node.width() / this.canvas.scale,
          height: node.height() / this.canvas.scale
      };
  };