/******************************************************************************
    Copyright 2008 Matthew Holder. All rights reserved.    *********************************************************************************/
    var glassTo = null;
    //var tabbar_height = 0;
    var glassUp = null;
    var inFullscreen = false;
    var dwm = Components.classes["@sixxgate.com/DwmCalls/CDwmCalls;1"].createInstance();
    dwm = dwm.QueryInterface(Components.interfaces.IDwmCalls);

    function DWM_Glasser_OnFullscreen()
    {
       this.handleEvent = function(e)
       {
          if (!dwm.GlassEnabled || glassTo == null)
             // If no glass, we have nothing to do
             return;

          if (e.attrName == "inFullscreen" && e.newValue == "true")
          {
             try
             {
                dwm.ExtendFrameIntoWindow(0, 0, 0, 0);
             }
             catch (err)
             {   // Something failed
                window.alert(err);
             }
             inFullscreen = true;
          }
          else if (e.attrName == "inFullscreen")
          {
             try
             {
                var tabheight = gBrowser.mTabContainer.boxObject.height;
                var height = glassTo.boxObject.y + glassTo.boxObject.height;
                var bottom = glassUp.boxObject.height;
                dwm.ExtendFrameIntoWindow(height+tabheight, 0, bottom, 0);
             }
             catch (err)
             {   // Something failed
                window.alert(err);
             }
             inFullscreen = false;
          }
       }
    };
    var Glasser_OnFullscreen = new DWM_Glasser_OnFullscreen();

    function DWM_Glasser_Delayed_OnAttrChange()
    {
       this.handleEvent = function(e)
       {
          if (!dwm.GlassEnabled || glassTo == null || inFullscreen == true)
             // If no glass, we have nothing to do
             return;
             
          var height = glassTo.boxObject.y + glassTo.boxObject.height;
          var bottom = glassUp.boxObject.height;
          try
          {
             var tabheight = gBrowser.mTabContainer.boxObject.height;
             dwm.ExtendFrameIntoWindow(height+tabheight, 100000, bottom, -1);
          }
          catch (err)
          {   // Something failed
             window.alert(err);
          }

          e.currentTarget.removeEventListener("DOMAttrModified", this, false);
       };
    };
 var Glasser_Delayed_OnAttrChange = new DWM_Glasser_Delayed_OnAttrChange();

    function ChangeGlasserTheme()
    {
       if (dwm.GlassEnabled)
       {
          for (var i = 0; i != window.document.styleSheets.length; ++i)
          {
             if (window.document.styleSheets[i].href == "chrome://glasser/skin/overlay.css")
             {
                window.document.styleSheets[i].disabled = false;
                break;
             }
          }
          Glasser_Delayed_OnAttrChange.handleEvent(e);
       }
       else
       {
          for (var i = 0; i != window.document.styleSheets.length; ++i)
          {
             if (window.document.styleSheets[i].href == "chrome://glasser/skin/overlay.css")
             {
                window.document.styleSheets[i].disabled = true;
                break;
             }
          }
       }
    };

    function DWM_Glasser_OnAttrChange()
    {
       this.handleEvent = function(e)
       {
          e.currentTarget.addEventListener("DOMAttrModified", Glasser_Delayed_OnAttrChange, false);
       };
    };
    var Glasser_OnAttrChange = new DWM_Glasser_OnAttrChange();

    function DWM_Glasser_OnLoad()
    {
       this.handleEvent = function(e)
       {
          // Find the toolbar marked as glassToMe
          var toolbox = window.document.getElementById("navigator-toolbox")
          if (toolbox == null)
             return;
             
          toolbox.addEventListener("DOMAttrModified", Glasser_OnFullscreen, false);

          var ct = toolbox.firstChild;
          var breakNow = false;
          for (; ct != null; ct = ct.nextSibling)
          {
             /*if (ct.tagName != "toolbar")
                // Only toolbar are of any concern
                continue;*/

             ct.addEventListener("DOMAttrModified", Glasser_OnAttrChange, false);

             if (breakNow)
                // We have attatched to the last toolbar, we are done
                break;
             if (ct.nextSibling == null)
             {   // We have found the end of the glass, break on the next toolbar
                glassTo = ct;
                breakNow = true;
             }
          }
          
          
          // Find the last toolbar
          var browbox = window.document.getElementById("browser")
          if (browbox == null)
             return;
             
          //tabbar_height = 28;
          //ct.getAttribute("className") != null && (ct.getAttribute("className").equals("tabbrowser-tabs"))
          /*var statbar = window.document.getElementById("browser-bottombox");
          if (statbar == null)
             return;
             
          statbar.addEventListener("DOMAttrModified", Glasser_OnFullscreen, false);

          var ct2 = statbar.lastChild;
          var breakNow2 = false;
          for (; ct2 != null; ct2 = ct2.previousSibling)
          {

             ct2.addEventListener("DOMAttrModified", Glasser_OnAttrChange, false);

             if (breakNow2)
                // We have attatched to the last toolbar, we are done
                break;

             if (ct2.previousSibling == null)
             {   // We have found the end of the glass, break on the next toolbar
                glassUp = ct2;
                breakNow2 = true;
             }
          }*/
          glassUp = window.document.getElementById("browser-bottombox");
          
          ChangeGlasserTheme();
       };
    };
    var Glasser_OnLoad = new DWM_Glasser_OnLoad();

    function DWM_Glasser_OnGlassChange()
    {
       this.handleEvent = function(e)
       {
          ChangeGlasserTheme();
       };
    };
    var Glasser_OnGlassChange = new DWM_Glasser_OnGlassChange();

    window.addEventListener("load", Glasser_OnLoad, false);

    dwm.AttachToWindow(getBaseWindow(window));
    dwm.OnGlassChange = Glasser_OnGlassChange;

function getBaseWindow(win) {
    var rv;
    try {
        var requestor =
win.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
        var nav =
requestor.getInterface(Components.interfaces.nsIWebNavigation);
        var dsti =
nav.QueryInterface(Components.interfaces.nsIDocShellTreeItem);
        var owner = dsti.treeOwner;
        requestor =
owner.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
        rv = requestor.getInterface(Components.interfaces.nsIXULWindow);
        rv = rv.docShell;
        rv = rv.QueryInterface(Components.interfaces.nsIDocShell);
        rv = rv.QueryInterface(Components.interfaces.nsIBaseWindow);
    } catch (ex) {
        rv = null;
        setTimeout(function() { throw ex }, 0);
        /* ignore no-interface exception */
    }
    return rv;
}

