function log(msg) {
  if (typeof console == 'object' && typeof console.log == 'function') {
    console.log(msg);
  }
}

var HeaderTab = new Class({
  
  initialize: function(el) {
    this.el = el;
    this.resize();
  },
  
  resize: function() {
    var content = this.el.getElement('.content');
    var relative = this.el.getElement('.relative');
    var middle = this.el.getElement('.middle');
    
    var contentHeight = content.getSize().y;
    this.el.setStyle('top', 89 - contentHeight);
    relative.setStyle('height', contentHeight + 1);
    middle.setStyle('height', contentHeight - 15);
  }
  
});

var SpriteReplacement = new Class({
  
  Implements: [Events, Options],
  
  options: {
    wordClass: 'word',
    letterClass: 'letter',
    kerning: {}
  },
  
  initialize: function(options) {
    this.setOptions(options);
    this.setupElements();
    this.setupPositions();
  },
  
  setupElements: function() {
    this.word = new Element('div', {
      styles: {
        'float': 'left',
        'visibility': 'hidden'
      },
      'class': this.options.wordClass
    });
    this.letter = new Element('span', {
      styles: {
        'float': 'left',
        'background-image': 'url(' + this.options.image + ')',
        'height': this.options.height,
        'visibility': 'hidden'
      },
      'class': this.options.letterClass
    });
    this.word.inject(document.body);
    this.letter.inject(document.body);
  },
  
  setupPositions: function() {
    this.positions = [];
    var width = 0, glyph;
    for (var i = 0; i < this.options.glyphs.length; i++) {
      glyph = this.options.glyphs.substr(i, 1);
      this.positions.push(width);
      width += this.options.widths[i];
    }
  },
  
  replace: function(el) {
    this.lastLetter = '';
    var text = el.get('text');
    el.set('html', '');
    var words = text.split(' ');
    words.each(function(wordText, index) {
      var wordEl = this.word.clone();
      var totalWidth = 0;
      wordText.split('').each(function(letterText) {
        totalWidth += this.addLetter(letterText, wordEl);
      }.bind(this));
      if (index != words.length - 1) {
        totalWidth += this.addLetter(' ', wordEl);
      }
      wordEl.setStyles({
        'width': totalWidth,
        'height': this.options.height,
        'visibility': 'visible'
      });
      wordEl.inject(el);
    }.bind(this));
  },
  
  addLetter: function(letterText, wordEl) {
    var width = this.getWidth(letterText);
    if (!width) {
      return;
    }
    var position = this.getPosition(letterText);
    var offset = this.getOffset(this.lastLetter, letterText);
    var letterEl = this.letter.clone();
    letterEl.setStyles({
      'background-position': '-' + position + 'px 0',
      'width': width,
      'visibility': 'visible',
      'margin-left': offset
    });
    letterEl.inject(wordEl);
    this.lastLetter = letterText;
    return width + offset;
  },
  
  center: function(el) {
    var firstY = -1, lineWidth = 0, firstWord, prevFirstWord, pos;
    el.getElements('.word').each(function(word) {
      pos = word.getPosition(el);
      if (pos.y != firstY) {
        firstY = pos.y;
        prevFirstWord = firstWord;
        firstWord = word;
        if (prevFirstWord) {
          prevFirstWord.setStyle('padding-left', (el.getSize().x - lineWidth) / 2);
          lineWidth = 0;
        }
      }
      lineWidth += word.getSize().x;
    });
    firstWord.setStyle('padding-left', Math.floor((el.getSize().x - lineWidth) / 2));
  },
  
  getWidth: function(glyph) {
    var index = this.options.glyphs.indexOf(glyph);
    if (index == -1) {
      return false;
    }
    return this.options.widths[index];
  },
  
  getPosition: function(glyph) {
    var index = this.options.glyphs.indexOf(glyph);
    if (index == -1) {
      return false;
    }
    return this.positions[index];
  },
  
  getOffset: function(glyph1, glyph2) {
    if (this.options.kerning[glyph1 + glyph2]) {
      return this.options.kerning[glyph1 + glyph2];
    }
    return 0;
  }
  
});

var Menus = new Class({
  
  initialize: function() {
    this.current = 0;
    this.setupLinks();
  },
  
  setupLinks: function() {
    var links = $('seasonal-menus').getElements('a');
    this.link = links[0];
    this.link.addClass('selected');
    $('menu-list0').addClass('selected');
    links.each(function(link) {
      this.setupTitle(link);
      link.addEvent('click', function() {
        this.link = link;
        this.current = parseInt(link.get('data-menu'), 10);
        this.update();
        return false;
      }.bind(this));
    }.bind(this));
    $('menu').getElement('.next').addEvent('click', this.next.bind(this));
    $('menu').getElement('.prev').addEvent('click', this.prev.bind(this));
  },
  
  setupTitle: function(link) {
    var title = new Element('h2', {
      'class': 'sprite-replace',
      'id': 'menu-title' + link.get('data-menu'),
      'text': link.getElement('.title').get('text').toUpperCase()
    });
    title.inject($('menu-titles'));
  },
  
  update: function() {
    $('seasonal-menus').getElement('.selected').removeClass('selected');
    $('menu').getElement('ul.selected').removeClass('selected');
    $('seasonal-menus').getElements('a')[this.current].addClass('selected');
    $('menu').getElement('h2.selected').removeClass('selected');
    $('menu-list' + this.current).addClass('selected');
    $('menu-title' + this.current).addClass('selected');
    var number = this.link.get('text').match(/(\d+)/);
    if (number) {
      var count = parseInt(number[1], 10);
      $('number').setStyle('display', 'inline');
      $('number').set('html', '&nbsp;&nbsp;&nbsp;for ' + count + '&nbsp;&nbsp;&nbsp;');
    } else {
      $('number').setStyle('display', 'none');
    }
  },
  
  next: function() {
    var links = $('seasonal-menus').getElements('a');
    this.current++;
    if (this.current == links.length) {
      this.current = 0;
    }
    this.link = links[this.current];
    this.update();
    return false;
  },
  
  prev: function() {
    var links = $('seasonal-menus').getElements('a');
    this.current--;
    if (this.current == -1) {
      this.current = links.length - 1;
    }
    this.link = links[this.current];
    this.update();
    return false;
  }
  
});

var TwitterViewer = new Class({
  
  initialize: function() {
    var account = $('twitter').get('data-account');
    var jsonp = new Request.JSONP({
      url: 'http://twitter.com/statuses/user_timeline/' + account + '.json',
      onComplete: this.build.bind(this)
    });
    try {
      jsonp.send();
    } catch(e) {
      $('tweets').getElement('.loading').set('html', 'Error connecting to twitter.com');
    }
  },
  
  build: function(data) {
    $('tweets').getElement('.loading').destroy();
    this.addTweet(data[0]);
    this.addTweet(data[1]);
  },
  
  addTweet: function(tweet) {
    var weirdDate = tweet.created_at.match(/(\w{3} \w{3} \d+)( \d\d:\d\d:\d\d \+\d{4})( \d{4})/);
    if (weirdDate) {
      tweet.created_at = weirdDate[1] + weirdDate[3] + weirdDate[2];
    }
    var created = new Date.parse(tweet.created_at);
    var date = created.format('%B') + ' ' +
               parseInt(created.format('%d'), 10) + ', ' +
               created.format('%Y');
    var link = new Element('a', {
      'href': 'http://twitter.com/' + tweet.user.screen_name + '/status/' + tweet.id,
      'class': 'tweet',
      'html': '<span class="date">' + date + '</span>' +
              '<span class="content">' + tweet.text.stripTags() + '</span>'
    });
    link.inject($('tweets'));
  }
  
});

var Photos = new Class({
  
  pauseDuration: 6000,
  fadeDuration: 1000,
  
  initialize: function() {
    var el = $('photos');
    this.images = el.getElements('img');
    this.images[0].setStyle('z-index', 1);
    this.images[0].addClass('visible');
    this.images.each(function(img) {
      img.set('tween', {
        duration: this.fadeDuration
      });
    }.bind(this));
    setInterval(this.showNext.bind(this), this.pauseDuration);
  },
  
  showNext: function() {
    var current = this.images.shift();
    var next = this.images[0];
    next.setStyle('z-index', parseInt(current.getStyle('z-index'), 10) + 1);
    next.setStyle('opacity', 0);
    next.addClass('visible');
    next.tween('opacity', 1);
    this.images.push(current);
  }
  
});

function replaceSprites() {
  var root = $('root-url').get('href');
  var gotham = new SpriteReplacement({
    image: root + 'images/gotham-outline.png',
    glyphs: "ABCDEFGHIJKLMNOPQRSTUVWXYZ'! ",
    height: 26,
    widths: [22, 21, 21, 23, 19, 19, 22, 22, 10, 17, 20, 18, 25, 22,
             24, 20, 24, 21, 18, 19, 21, 21, 31, 20, 20, 21, 9, 9, 9],
    kerning: {
      "TA": -2
    }
  });
  $$('.sprite-replace').each(function(el, index) {
    el.setStyle('visibility', 'hidden');
    el.addClass('selected');
    gotham.replace(el);
    gotham.center(el);
    el.setStyle('visibility', 'visible');
    if (index !== 0) {
      el.removeClass('selected');
    }
  });
}

// From hunlock.com
Array.prototype.shuffle = function () { 
  for (var rnd, tmp, i = this.length; i; rnd = parseInt(Math.random()*i, 10), tmp=this[--i], this[i]=this[rnd], this[rnd]=tmp) {
  }
};

var photos;

$(window).addEvent('domready', function() {
  if ($('header') && $('header').getElement('.tab')) {
    var el = $('header').getElement('.tab');
    var obj = new HeaderTab(el);
    el.store('object', obj);
  }
  if ($('menu')) {
    var menus = new Menus();
  }
  if ($('twitter')) {
    var twitter = new TwitterViewer();
  }
  $('title').addEvent('click', function(e) {
    if (e.shift) {
      e.preventDefault();
    }
  });
  if (typeof Meta != 'undefined') {
    $('title').addEvent('dblclick', function(e) {
      if (e.shift) {
        Meta.show();
        Cookie.write('meta', 1);
        return false;
      }
    });
    if (Cookie.read('meta')) {
      Meta.show();
    }
  }
  if ($$('.sprite-replace').length > 0) {
    replaceSprites();
  }
  if ($('email')) {
    var obfuscated = $('email').get('text');
    var address = obfuscated.replace(' AT ', '@');
    address = address.replace(' DOT ', '.');
    $('email').set('html', '<a href="mailto:' + address + '">' + address + '</a>');
  }
  if ($('photos')) {
    photos = new Photos();
  }
});


