<public:component>
<public:attach event="onpropertychange" onevent="propertyChanged()" />
<public:attach event="onbeforeprint" for="window" onevent="beforePrint()" />
<public:attach event="onafterprint" for="window" onevent="afterPrint()" />
<script>

/*
 * PNG Behavior
 *
 * This script was created by Erik Arvidsson (erik(at)eae.net)
 * for WebFX (http://webfx.eae.net)
 * Copyright 2002
 * 
 * For usage see license at http://webfx.eae.net/license.html	
 *
 * Version: 1.01a
 * Created: 2001-??-??	First working version
 * Updated: 2002-03-28	Fixed issue when starting with a non png image and
 *                      switching between non png images
 *          2003-01-06	Fixed RegExp to correctly work with IE 5.0x
 *          2004-04-25  Fixed PNG image printing, eliminated need for external
 *                      GIF file, fixed intermittent uninitialised variable
 *                      error [by AG, <http://www.scss.com.au/family/andrew/> ]
 *          2004-09-30  Reverted inline javascript image to transparent GIF. The
 *                      new XP SP2 'security' measures prevented the JS image
 *                      from working. [by AG]
 *          2004-10-22  Rewrote fixImage() to try and work around some reported
 *                      problems with PNGs vanishing! [by AG]
 *          2004-12-12  Fixed problem with PNGs not being restored after
 *                      printing. I have no idea how I missed this one! [by AG]
 *          2005-03-26  Fixed supported RE mis-identifying IE 5.0/Win98 as
 *                      'supported'.
 *
 */
 
var IS_PNG = /\.png$/i;
var supported = /MSIE (5\.[5-9]|[6]\.[0-9]*)/.test(navigator.userAgent) && navigator.platform == 'Win32';
var realSrc;
var blankSrc = '/images/blank.png';
if (supported) fixImage();
function propertyChanged() {
  if (supported && event.propertyName == 'src') {
    var i = element.src.lastIndexOf(blankSrc);
    if (i == -1 || i != element.src.length - blankSrc.length) {
      fixImage();
    }
  }
}
function fixImage() {
  if (realSrc && element.src == realSrc) {
    // this is an attempt to set the image to itself!
    // pointless - leave the filter as-is, restore the blank image
    element.src = blankSrc;
  } else {
    // set the image to something different
    if (IS_PNG.test(element.src)) {
      // fixable PNG
      realSrc = element.src;
      element.src = blankSrc;
      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + realSrc + "',sizingMethod='scale')";
    } else {
      // ordinary image - make sure the fix is removed
      if (realSrc) {
        realSrc = null;
        element.runtimeStyle.filter = '';
      }
    }
  }
}
function beforePrint() {
  if (realSrc) {
    supported = false;
    element.src = realSrc;
    element.runtimeStyle.filter = '';
    supported = true;
  }
}
function afterPrint() {
  if (realSrc) {
    var rs = realSrc;
    realSrc = null;
    element.src = rs;
  }
}
</script>
</public:component>
