docs: function(node, xOffset, yOffset, style) {
          var style = style || node._style;
          var rotation = style.rotation || 0;
          
          var aspectRatio, size;
          if (!(style.graphicWidth && style.graphicHeight)) {
              // load the image to determine its size
              var img = new Image();
              img.onreadystatechange = OpenLayers.Function.bind(function() {
                  if(img.readyState == "complete" ||
                          img.readyState == "interactive") {
                      aspectRatio = img.width / img.height;
                      size = Math.max(style.pointRadius * 2, 
                          style.graphicWidth || 0,
                          style.graphicHeight || 0);
                      xOffset = xOffset * aspectRatio;
                      style.graphicWidth = size * aspectRatio;
                      style.graphicHeight = size;
                      this.graphicRotate(node, xOffset, yOffset, style);
                  }
              }, this);
              img.src = style.externalGraphic;
              
              // will be called again by the onreadystate handler
              return;
          } else {
              size = Math.max(style.graphicWidth, style.graphicHeight);
              aspectRatio = style.graphicWidth / style.graphicHeight;
          }
          
          var width = Math.round(style.graphicWidth || size * aspectRatio);
          var height = Math.round(style.graphicHeight || size);
          node.style.width = width + "px";
          node.style.height = height + "px";
          
          // Three steps are required to remove artefacts for images with
          // transparent backgrounds (resulting from using DXImageTransform
          // filters on svg objects), while preserving awareness for browser
          // events on images:
          // - Use the fill as usual (like for unrotated images) to handle
          //   events
          // - specify an imagedata element with the same src as the fill
          // - style the imagedata element with an AlphaImageLoader filter
          //   with empty src
          var image = document.getElementById(node.id + "_image");
          if (!image) {
              image = this.createNode("olv:imagedata", node.id + "_image");
              node.appendChild(image);
          }
          image.style.width = width + "px";
          image.style.height = height + "px";
          image.src = style.externalGraphic;
          image.style.filter =
              "progid:DXImageTransform.Microsoft.AlphaImageLoader(" + 
              "src='', sizingMethod='scale')";
  
          var rot = rotation * Math.PI / 180;
          var sintheta = Math.sin(rot);
          var costheta = Math.cos(rot);
  
          // do the rotation on the image
          var filter =
              "progid:DXImageTransform.Microsoft.Matrix(M11=" + costheta +
              ",M12=" + (-sintheta) + ",M21=" + sintheta + ",M22=" + costheta +
              ",SizingMethod='auto expand')\n";
  
          // set the opacity (needed for the imagedata)
          var opacity = style.graphicOpacity || style.fillOpacity;
          if (opacity && opacity != 1) {
              filter += 
                  "progid:DXImageTransform.Microsoft.BasicImage(opacity=" + 
                  opacity+")\n";
          }
          node.style.filter = filter;
  
          // do the rotation again on a box, so we know the insertion point
          var centerPoint = new OpenLayers.Geometry.Point(-xOffset, -yOffset);
          var imgBox = new OpenLayers.Bounds(0, 0, width, height).toGeometry();
          imgBox.rotate(style.rotation, centerPoint);
          var imgBounds = imgBox.getBounds();
  
          node.style.left = Math.round(
              parseInt(node.style.left) + imgBounds.left) + "px";
          node.style.top = Math.round(
              parseInt(node.style.top) - imgBounds.bottom) + "px";
      }