| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | /** * 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  };};
 |