(function() {
  var body, backdrop;
  var menuXhr = new Request.HTML({
    onSuccess: function(tree, els) {
      var menu = $('menu');
      if (menu) {
        $(els.filter(function(item) {
          return item.get('class') === 'content';
        })[0]).replaces($('menu').getElement('.content'));
      } else {
        menu = $(els.filter(function(item) {
          return item.get('id') === 'menu';
        })[0]);
        menu.inject($('offerings'), 'after');
        domreadyMenu();
      }
      if (menu.getScrollHeight() > menu.getHeight()) {
        menu.addClass('scrolling');
      } else {
        menu.removeClass('scrolling');
      }
      menu.setStyle('opacity', 0).tween('opacity', 1);
      backdrop.addClass('shown').setStyle('opacity', 0).tween('opacity', 0.75);
    }
  });
  document.addEvent('domready', function() {
    body = $(document).getElement('body');
    backdrop = new Element('div', { id: 'backdrop' });
    backdrop.set('tween', {
      onStart: function() {
        if (!backdrop.hasClass('shown') && backdrop.getStyle('visibility') !== 'visible') {
          backdrop.addClass('shown');
        }
      },
      onComplete: function() {
        if (backdrop.hasClass('shown') && backdrop.getStyle('visibility') === 'hidden') {
          backdrop.removeClass('shown');
        }
      }
    });
    body.adopt(backdrop);
    if (Browser.Engine.trident && Browser.Engine.version < 6) {
      backdrop.addClass('hidden');
    }
    if ($('galleryList')) { (new Gallery('galleryList')); }
    if ($('offerings')) { domreadyOfferings(); }
    if ($('menu')) { domreadyMenu(); }
    $$('a[rel=external]').set('target', 'external');
  });
  var Gallery = new Class({
    active: 0,
    container: null, // #imageContainer
    hasThumbnails: false,
    items: null, // #galleryList li Elements
    slider: null, // Form.Slider
    initialize: function(el) {
      var galleryList = $(el).addClass('sliding'),
          galleryWrapper = new Element('div', { id: 'galleryWrapper' }),
          images = galleryList.getElements('li'),
          width = 1,
          ie = Browser.Engine.trident;
      galleryWrapper.wraps(galleryList);
      this.hasThumbnails = galleryList.hasClass('thumbnails');
      images.each(function(li, i) {
        if (ie) {
          width += (parseInt(li.getElement('img').get('width')) + 10);
        } else {
          width += li.getWidth();
        }
        if (this.hasThumbnails) { li.addEvent('click', this.itemClick.bindWithEvent(this, [li, i])); }
      }, this);
      galleryList.setStyle('width', width);
      this.slider = (new Form.Slider(galleryWrapper, { vertical: false, size: 945, showButtons: false }));
      galleryWrapper.setStyle('width', width);
      document.getElement('body').addClass('redraw');
      this.items = images;
      this.container = $('imageContainer');
      if (this.container) {
        this.container.getElement('.next').addEvent('click', this.nextClick.bind(this));
        this.container.getElement('.prev').addEvent('click', this.prevClick.bind(this));
        this.container.getElement('.close').addEvent('click', this.closeClick.bind(this));
        this.container.set('tween', { onComplete: this.tweenComplete.bind(this) });
        $('wrap').adopt(this.container);
      }
    },
    itemClick: function(e, li, idx) {
      var evt = new Event(e),
          src = li.getElement('a').get('href')
          tmp = new Image(),
          tween = null;
      evt.preventDefault();
      evt.stopPropagation();
      if (!this.container.hasClass('shown')) {
        tween = this.container.get('tween');
        tween.set('opacity', 0);
        this.container.addClass('shown');
        tween.start('opacity', 1);
        backdrop.addClass('shown').setStyle('opacity', 0).tween('opacity', 0.75);
      }  
      this.container.getElement('#callout').set({ style: '', src: '/img/loader.gif'});
      tmp.onload = this.imageLoaded.bindWithEvent(this, [tmp, src]);
      tmp.src = src;
      this.active = idx;
    },
    imageLoaded: function(e, img, src) {
      var callout = this.container.getElement('#callout').set('src',src);
      if (img.height > img.width) {
        callout.setStyles({ width: 'auto', height: '100%' });
      } else {
        callout.setStyles({ height: 'auto', width: '100%' });
      }
      callout.setStyles({ marginTop: -(callout.getHeight() / 2), marginLeft: -(callout.getWidth() / 2) });
    },
    nextClick: function(e) {
      var next = this.active + 1;
      if (next === this.items.length) { next = 0; }
      this.itemClick(e, $(this.items[next]), next);
    },
    prevClick: function(e) {
      var prev = this.active - 1;
      if (prev < 0) { prev = this.items.length - 1; }
      this.itemClick(e, $(this.items[prev]), prev);
    },
    closeClick: function(e) {
      var evt = new Event(e);
      evt.preventDefault();
      evt.stopPropagation();
      this.container.tween('opacity', 0);
      backdrop.tween('opacity', 0);
    },
    tweenComplete: function() {
      if (this.container.hasClass('shown') && this.container.getStyle('visibility') === 'hidden') {
        this.container.removeClass('shown');
      }
    }
  });
  function domreadyOfferings() {
    var offerings = $('offerings').getElements('li a');
    offerings.addEvent('click', offeringClick);
  }
  function offeringClick(e) {
    var evt = new Event(e),
        a = $(this),
        offering = a.getParent(),
        href = a.get('href');
    $('offerings').getElements('.active').removeClass('active');
    offering.addClass('active');
    evt.preventDefault();
    evt.stopPropagation();
    menuXhr.get(href);
  }
  function domreadyMenu() {
    var menu = $('menu');
    backdrop.addClass('shown');
    menu.getElement('p.header a').addEvent('click', function(e) {
      var evt = new Event(e);
      evt.preventDefault();
      evt.stopPropagation();
      $('offerings').getElements('.active').removeClass('active');
      menu.tween('opacity','0');
      if (backdrop) { backdrop.tween('opacity', '0'); }
    });
  }
})();
