pageZoom = 
{
  'cookieName' : 'noFitWidth',
  'oldCookieName' : 'fitWidth',
  'bFitWidth' : false,
  'nPreviousTotalWidth' : 0,
  'nCurrentTotalWidth' : 0,
  'bGatheringWidths' : false,
  'fitToWidth' : function()
  {
    
    if (this.bGatheringWidths)
    {
      return;
    }
    
    var nTotalWidth = document.viewport.getWidth() - 20;
    
    if ((nTotalWidth == this.nPreviousTotalWidth)
    	&& (this.nCurrentTotalWidth < nTotalWidth))
    {
    	// ignore IE8's scrollbar on/off loop, stopping at the layout without scrollbars
    	return;
    }
    
    var pageBox = this.findPageBox();
    
    this.setWidth(pageBox,
                  nTotalWidth);
    
    var pages = this.findPages();
    
    if (pages.length > 0)
    {
      
      var noZooms = this.findNoZooms();
  
      var nReserved = 15;
      
      for (var i = 0;
           i < noZooms.length;
           i++)
      {
        nReserved = nReserved + this.getWidth(noZooms[i]);
      }
            
      var nTargetWidth = (nTotalWidth - nReserved) / pages.length;
      
      for (var i = 0;
           i < pages.length;
           i++)
      {
        this.setWidth($(pages[i]),
                      nTargetWidth);
    	}
      
    }
        
    this.nPreviousTotalWidth = this.nCurrentTotalWidth;
    this.nCurrentTotalWidth = nTotalWidth;
    
    aI.regenerate();

  },

  'resetWidths' : function()
  {

    var pageBox = this.findPageBox();
    
    this.resetWidth(pageBox);
    
    var pages = this.findPages();

    for (var i = 0;
         i < pages.length;
         i++)
    {
        this.resetWidth($(pages[i]));
    }

    this.nPreviousTotalWidth = 0;
    this.nCurrentTotalWidth = 0;
    
    aI.regenerate();
    
  },
  
  'init' : function()
  {
  
    if ($$('a.fitWidth').size() == 0)
    {
      return;
    }
    
    if (Cookie.get(this.oldCookieName))
    {
        Cookie.erase(this.oldCookieName);
    }
    
    this.bFitWidth = (Cookie.get(this.cookieName) == null);
    
    this.setFitWidth(this.bFitWidth);

    this.nPreviousTotalWidth = 0;
    this.nCurrentTotalWidth = 0;

    Event.observe(window, 'resize', function()
    {

      if (pageZoom.bFitWidth)
      {
        pageZoom.fitToWidth();
      }

    });
    
    $$('div.zoomPanel').each(function(div) {div.style.display = 'inline'});
    $$('div.dummyZoomPanel').each(function(div) {div.style.display = 'none'});

  },
  
  'initWidths' : function()
  {
    
	this.bGatheringWidths = true;
	
    var pages = this.findPages();
    
    if (pages.length > 0)
    {
      var page = pages[0];
      var currentWidth = page.style.width;
      page.style.width = "auto";
      var origDefault = this.getWidth(page);
      page.style.width = currentWidth;

      pages.each(function(page)
      {
      
        var orig = page.origWidth;
  
        if (!orig)
        {
          page.origWidth = origDefault;
        }
      });
    }
            
	this.bGatheringWidths = false;

	aI.regenerate();

  },

  'findPages' : function()
  {
    return $$('img.zoomable');
  },
  
  'findNoZooms' : function()
  {
    return $$('div.noZoom');
  },
  
  'findPageBox' : function()
  {
    return $('pageBox');
  },
  
  'setWidth' : function(element,
                        newWidth)
  {
    
    var orig = element.origWidth;
    
    if (!orig)
    {
      orig = this.getWidth(element);
      
      if (orig > 500)
      {
        element.origWidth = orig;
      }
    }
                
    var diff = newWidth - orig;
    
    if ((diff > 0) && (diff < 50))
    {
      newWidth = orig;
    }
        
    element.style.width = newWidth + 'px';
    
  },
  
  'getWidth' : function(element)
  {
    return element.offsetWidth;
  },
  
  'resetWidth' : function(element)
  {
    
    var orig = element.origWidth;
    
    if (orig)
    {
      element.style.width = orig + 'px';
    }
    
  },
  
  'invertState' : function()
  {
    this.setFitWidth(!(this.bFitWidth));
  },
  
  'setFitWidth' : function(bYesNo)
  {
    
    this.bFitWidth = bYesNo;
    this.updateToolbars(this.bFitWidth);

    if (this.bFitWidth)
    {
      
      Cookie.erase(this.cookieName);
      this.fitToWidth();

    }
    else
    {
      Cookie.set(this.cookieName,
                 '1',
                 365);
                
      this.resetWidths();
    }
    
  },
  
  'updateToolbars' : function(bFit)
  {
    $$('img.fitWidthButton').each(function(e) {e.style.display = bFit ? 'none' : 'inline'});
    $$('img.noFitWidthButton').each(function(e) {e.style.display = bFit ? 'inline' : 'none'});
  }

}

Event.observe(window, 'load', function()
{

 pageZoom.initWidths();

});

pageZoom.init();
