<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <binding id="maximize" display="html:div">
    <content>
      <anonymous/>
      <children/>
    </content>

    <implementation>
      <method name="isMaximized">
        <body>return this.isMaximized();</body>
      </method>
      
      <method name="maximize">
        <body>this.maximize();</body>
      </method>
      
      <method name="restoreSize">
        <body>this.restoreSize();</body>
      </method>
      
      <constructor><![CDATA[
var element = document.getAnonymousNodes(this)[0].parentNode;

this.isMaximized = isMaximized;
this.maximize = maximize;
this.restoreSize = restoreSize;

var data = {};
var elementMaximized = false;
var elementsHidden = null;
var elementsOriDisplay = null;

function isMaximized()
{
  return elementMaximized;
}
 
function maximize()
{
  if (elementMaximized)
    return;

  if (elementsHidden)
  {
    for (var i=0; i<elementsHidden.length; i++)
      elementsHidden[i].style.display = elementsOriDisplay[i];
    elementsHidden = null;
  }

  elementsHidden     = [];
  elementsOriDisplay = [];

  var el = element;
  while (el && (el != window.document.body))
  {
    var e = el.previousSibling;
    while (e)
    {
      if (e.style)
      {
        elementsHidden[elementsHidden.length] = e;
        if (e.currentStyle)
          elementsOriDisplay[elementsOriDisplay.length] = e.currentStyle.display;
        else
          elementsOriDisplay[elementsOriDisplay.length] = window.document.defaultView.getComputedStyle(e, "").getPropertyValue("display");
        e.style.display = 'none';
      }
      e = e.previousSibling;
    }
    var e = el.nextSibling;
    while (e)
    {
      if (e.style)
      {
        elementsHidden[elementsHidden.length] = e;
        if (e.currentStyle)
          elementsOriDisplay[elementsOriDisplay.length] = e.currentStyle.display;
        else
          elementsOriDisplay[elementsOriDisplay.length] = window.document.defaultView.getComputedStyle(e, "").getPropertyValue("display");
        e.style.display = 'none';
      }
      e = e.nextSibling;
    }

    el = el.parentNode;  
  }

  

  data.cssText = element.style.cssText;
  data.frameBorder = element.frameBorder;
  element.setAttribute('frameborder', 'no');
  element.style.position = 'absolute';
  element.style.top = '0px';
  element.style.left = '0px';
  element.style.width = '100%';
  element.style.height = '100%';
  element.style.border = 'none';
  element.border = '0';

  data.bodyCSSText = window.document.body.style.cssText;
  window.document.body.style.margin  = '0px';
  window.document.body.style.padding = '0px';
  window.document.body.style.overflow = 'hidden';

  elementMaximized = true;
}
function restoreSize()
{
  if (!elementMaximized)
    return;

  if (elementsHidden)
  {
    for (var i=0; i<elementsHidden.length; i++)
      elementsHidden[i].style.display = elementsOriDisplay[i];
    elementsHidden = null;
  }

  element.style.cssText = data.cssText;
  element.setAttribute('frameborder', data.frameBorder);
  window.document.body.style.cssText = data.bodyCSSText;

  elementMaximized = false;
}
    ]]></constructor> 
      
    </implementation>
  </binding>
</bindings>