(function() {
  function $empty() { }
  function stopEvent(e) {
    var evt;
    if (e && $type(e) === 'event') {
      evt = new Event(e);
      evt.stop();
    }
  }
  var NoMimes = new Class({
    checks: [],
    dropdowns: [],
    pager: null,
    slider: null,
    initialize: function() {
      document.addEvent('domready', this.domready.bind(this));
      window.addEvent('load', this.load.bind(this));
    },
    domready: function() {
      this.content = $('content');
      var scrollable = this.content.getElement('.scrollable'),
          userAgent = navigator.userAgent.toLowerCase(),
          isMobile = userAgent.search('(iphone|ipod|ipad|mobile)') !== -1,
          isIPad = userAgent.search('ipad') !== -1;
      if (isMobile) {
        $('wrap').addClass('mobile');
        if ((this.content.getStyle('paddingTop').match(/^0/) && this.content.getHeight() > 400)
            || (this.content.getStyle('paddingTop').match(/^5/) && this.content.getHeight() > 600)) {
          $('wrap').addClass('bgdance');
          setTimeout(function() {
            var height = $('wrap').getHeight() - $('wrap').getStyle('paddingTop').toInt() - $('wrap').getStyle('paddingBottom').toInt();
            $('wrap').setStyle('height', height + (90 - height % 90));
          }, 150);
        }
      }
      if (isMobile && !isIPad) {
        $('wrap').addClass('phone');
      }
      if (scrollable && !isMobile) {
        this.slider = new Form.Slider(scrollable, { showButtons: false });
      }
      var selectOptions = { onHighlight: this.dropdownHighlightOption.bind(this) };
      $$('select').each(function(el) {
        if (isMobile) { return; }
        var select = el.get('id') === 'countrycode' ? this.dropdownSelect : $empty;
        var dropdown = new Form.Dropdown(el, { onSelect: select, selectOptions: selectOptions }),
            ul = dropdown.element.getElement('ul');
        var slider;
        if (dropdown.dropdownOptions.length > 7) {
          dropdown.element.addClass('scroller');
          slider = new Form.Slider(ul, {
            size: 125,
            onCreate: function(slider) {
              slider.element.get('tween').set(slider.dimension, 0);
            }
          });
          slider.scrollbar.addEvent('click', stopEvent);
          dropdown.slider = slider;
        }
        this.dropdowns.push();
      }, this);
      $$('input[type=checkbox]').each(function(el) {
        var check = new Form.Check(el);
        this.checks.push(check);
      }, this);
      if (this.content.getElement('#showInfo')) { this.domreadyHasInfo(); }
      if (this.content.getElement('#stats')) { this.domreadyStatistics(); }
      if (this.content.getElement('ul.paginate')) { this.domreadyPaginate(); }
      if (this.content.getElement('form')) { this.domreadyForm(); }
      this.content.getElement('#partners') && this.domreadyPartners();
      if ($('newscontent')) { this.domreadyNews(); }
      $$('.signup input[title]').each(function(el) {
        PlaceholderInput.create(el);
      });
      if (typeof Shadowbox !== 'undefined') { Shadowbox.init(); }
    },
    domreadyForm: function() {
      var self = this, form = this.content.getElement('form');
      form.set('send', {
        onRequest: function() {
          // turn on spinner
          $('loader').addClass('shown');
          $$('.form .result').removeClass('shown');
          if (self.isProduction() && pageTracker) {
            pageTracker._trackPageview(form.get('action').replace(location.protocol + '//' + location.host,''));
          }
        },
        onComplete: function() {
          // turn off spinner
          $('loader').removeClass('shown');
        },
        onSuccess: function(text, xml) {
          var result = JSON.decode(text);
          if (result.success) {
            // show success/thank you message
            $('submit-success').addClass('shown');
            self.resetForm();
          } else {
            // show errors
            $('submit-error').addClass('shown');
          }
        },
        onFailure: function(xhr) {
          // show 'oops' message
        }
      });
      form.addEvent('submit', function(e) {
        stopEvent(e);
        form.send();
      });
      $$('.form .result').each(function(r) {
        r.getElement('.close').addEvent('click', function(e) {
          (new Event(e)).stop();
          r.removeClass('shown');
        });
      });
    },
    domreadyHasInfo: function() {
      var content = this.content,
          opener = content.getElement('#showInfo'),
          closer = content.getElement('#close');
      opener.addEvent('click', function(e) {
        var evt = new Event(e);
        evt.stop();
        content.addClass('overlayed');
      });
      closer.addEvent('click', function(e) {
        var evt = new Event(e);
        evt.stop();
        content.removeClass('overlayed');
      });
      window.addEvent('load', function() {
        var opener = $('showInfo'),
            count = 0,
            complete = function() {
              var color = opener.getStyle('color');
              if (count < 19) {
                switch (color) {
                  case '#ffffff': opener.tween('color', '#828282'); break;
                  case '#828282': opener.tween('color', '#fff'); break;
                }
              } else {
                opener.get('tween').removeEvent('complete', complete);
                opener.set('style', '');
              }
              count = count + 1;
            };
        opener.get('tween').addEvent('complete', complete);
        opener.tween('color', '#fff');
      })
    },
    domreadyNews: function() {
      $$('head').adopt(
        new Element('script', {
          src: 'http://pipes.yahoo.com/pipes/pipe.run?_id=e560d2ef95bc703228eb63d48e26117a&_render=json&_callback=_nomimesNewsCallback&t=' + (new Date()).getTime()
        }),
        new Element('script', {
          src: 'https://graph.facebook.com/260170970042/feed?limit=1&callback=_nomimesFacebookCallback'
        }),
        new Element('script', {
          src: 'http://twitter.com/statuses/user_timeline/19166041.json?count=1\&callback=_nomimesTwitterCallback'
        })
      );
    },
    domreadyPaginate: function() {
      this.pager = new Pagination(this.content.getElement('ul.paginate'));
    },
    domreadyPartners: function() {
      window.addEvent('load', function() {
        var opener = $('partners'),
            count = 0,
            complete = function() {
              var color = opener.getStyle('color');
              if (count < 19) {
                switch (color) {
                  case '#ffffff': opener.tween('color', '#828282'); break;
                  case '#828282': opener.tween('color', '#fff'); break;
                }
              } else {
                opener.get('tween').removeEvent('complete', complete);
                opener.set('style', '');
              }
              count = count + 1;
            };
        opener.get('tween').addEvent('complete', complete);
        opener.tween('color', '#fff');
      });
    },
    domreadyStatistics: function() {
      var content = this.content,
          opener = content.getElement('#stats');
      opener.addEvent('click', function(e) {
        var evt = new Event(e);
        evt.stop();
        content.toggleClass('statistics');
      });
    },
    load: function() { },
    dropdownHighlightOption: function(option,e) {
      var evt = e ? new Event(e) : null;
      if (evt && evt.type.match(/^key/)) { evt.stop(); }
      this.keyboardHighlight(option.element,option.owner.slider,evt);
    },
    dropdownSelect: function(dropdown, e) {
      dropdown.selection.set('text',dropdown.value);
    },
    facebookCallback: function(f) {
      $('newscontent').adopt(f.data.map(function(data) {
        var item = new Element('div', { 'class': 'item facebook' });
        var h2 = new Element('h2');
        h2.adopt(new Element('a', {
          href: 'http://facebook.com/NoMimesMedia',
          text: data.message,
          target: 'facebook'
        }));
        var d = data.created_time.match(/(\d{4})-(\d{1,2})-(\d{1,2}).*/);
        var date = new Element('p', {
          'class': 'date',
          text: d && d[1] && d[2] && d[3] ? d[3] + ' ' + this.getMonth(d[2]) + ' ' + d[1] : data.created_time
        });
        item.adopt(h2, date);
        return item;
      }, this));
      this.recalc();
    },
    getMonth: function(m) {
      switch (m) {
        case '01': return 'Jan';
        case '02': return 'Feb';
        case '03': return 'Mar';
        case '04': return 'Apr';
        case '05': return 'May';
        case '06': return 'Jun';
        case '07': return 'Jul';
        case '08': return 'Aug';
        case '09': return 'Sep';
        case '10': return 'Oct';
        case '11': return 'Nov';
        case '12': return 'Dec';
      }
    },
    isProduction: function() {
      return location.host.match(/nomimes.com$/);
    },
    keyboardHighlight: function(element,slider,evt) {
      if (!evt || !evt.type.match(/^key/) || !slider) { return; }
      var list = slider.element;
      slider.setScrubberPosition(slider.trackSize * ((element.getPosition(list).y - (element.getSize().y * 3)) / list.getSize().y));
    },
    newsCallback: function(feed) {
      var item, h2, d, date;
      $('newscontent').adopt(feed.value.items.map(function(it) {
        Cookie.write('NewsItemLink', it.link);
        Cookie.write('NewsItemTitle', it.title);
        Cookie.write('NewsItemPub', it.pubDate);
        var item = new Element('div', { 'class': 'item blog' });
        var h2 = new Element('h2');
        h2.adopt(new Element('a', {
          href: it.link,
          text: it.title,
          target: 'blog'
        }));
        var d = it.pubDate.match(/\w{3}, (.*) \+\d{4}/)[1];
        var date = new Element('p', {
          'class': 'date',
          text: d ? d : it.pubDate
        });
        item.adopt(h2, date);
        return item;
      }));  
      if (!feed.value.items.length && Cookie.read('NewsItemTitle')) {
        item = new Element('div', { 'class': 'item blog' });
        h2 = new Element('h2');
        h2.adopt(new Element('a', {
          href: Cookie.read('NewsItemLink'),
          text: Cookie.read('NewsItemTitle'),
          target: 'blog'
        }));
        d = Cookie.read('NewsItemPub').match(/\w{3}, (.*) \+\d{4}/)[1];
        date = new Element('p', {
          'class': 'date',
          text: d ? d : Cookie.read('NewsItemPub')
        });
        $('newscontent').adopt(item.adopt(h2, date));
      }
      this.recalc();
    },
    twitterCallback: function(tweets) {
      $('newscontent').adopt(tweets.map(function(tweet) {
        var item = new Element('div', { 'class': 'item twitter' });
        var h2 = new Element('h2');
        h2.adopt(new Element('a', {
          href: 'http://twitter.com/nomimesmedia/statuses/' + tweet.id,
          text: tweet.text,
          target: 'twitter'
        }));
        var d = tweet.created_at.match(/\w{3} (\w{3}) (\d{1,2}) .*\+\d{4} (\d{4})/);
        var date = new Element('p', {
          'class': 'date',
          text: d && d[1] && d[2] && d[3] ? d[2] + ' ' + d[1] + ' ' + d[3] : tweet.created_at
        });
        item.adopt(h2, date);
        return item;
      }));
      this.recalc();
    },
    recalc: function() {
      $$('.home #playnow').toggleClass('redraw');
      if (this.slider) {
        this.slider.recalibrate();
      }
    },
    resetForm: function() {
      var form = this.content.getElement('form')
      form.getElements('input').each(function(input) {
        var pi = input.retrieve('NoMimes::PlaceholderInput'),
            check = input.retrieve('Form.Check::data');
        if (pi) {
          input.addClass('placeholder').set('value', pi.def);
        } else if (input.get('type') === 'checkbox') {
          if (check) { check.uncheck(); }
          else { input.erase('checked'); }
        } else if (!input.getParent().hasClass('selection')) {
          input.set('value', '');
        }
      });
    }
  });
  var Pagination = new Class({
    index: 0,
    max: 2,
    min: 0,
    size: 493,
    wrapper: null,
    initialize: function(list) {
      var items = list.getElements('li'),
          first = items.filter(function(item, index) { return index < 4; }),
          second = items.filter(function(item, index) { return index >= 4 && index < 8; }),
          third = items.filter(function(item, index) { return index >= 8 && index < 12; }),
          wrapper = new Element('div', { 'class': 'paginationWrapper clearfix' }),
          mask = (new Element('div', { 'class': 'paginationMask' })).adopt(wrapper),
          template = new Element('ul', { 'class': 'clearfix' });
      wrapper.adopt(
        template.clone().adopt(first),
        template.clone().adopt(second),
        template.clone().adopt(third)
      );  
      mask.replaces(list);
      this.wrapper = wrapper;
      this.nav = $('pageNav').addClass('home');
      if (third.length > 0) {
        this.max = 2;
        this.nav.addClass('three');
      } else if (second.length > 0) {
        this.max = 1;
        this.nav.addClass('two');
      } else {
        this.max = 0;
        this.nav.addClass('one');
      }
      this.get(this.min);
      $('next').addEvent('click', this.next.bind(this));
      $('prev').addEvent('click', this.previous.bind(this));
    },
    get: function(index) {
      if (index > this.max) { index = this.max; }
      else if (index < this.min) { index = this.min; }
      this.wrapper.tween('marginLeft', -(this.size * index));
      this.index = index;
      this.nav.removeClass('first').removeClass('last');
      if (index === this.min) {
        this.nav.addClass('first');
      } else if (index === this.max) {
        this.nav.addClass('last');
      }
    },
    next: function(e) {
      stopEvent(e);
      this.get(this.index + 1);
    },
    previous: function(e) {
      stopEvent(e);
      this.get(this.index - 1);
    }
  });
  var PlaceholderInput = new Class({
    initialize: function(input) {
      this.def = input.get('title');
      this.input = $(input);
      input.addEvents({
        blur: this.blur.bind(this),
        focus: this.focus.bind(this)
      });
      var value = this.input.get('value');
      if (value === this.def || value === '') { this.input.addClass('placeholder').set('value', this.def); }
      input.store('NoMimes::PlaceholderInput', this);
    },
    blur: function() {
      if (this.input.get('value') === '') {
        this.input.addClass('placeholder').set('value', this.def);
      }
    },
    focus: function() {
      if (this.input.get('value') === this.def) {
        this.input.removeClass('placeholder').set('value', '');
      }
    }
  });
  PlaceholderInput.create = function(input) {
    return new PlaceholderInput(input);
  };
  var page = new NoMimes();
  // used in default template
  window._nomimesRecalc = page.recalc.bind(page);
  window._nomimesNewsCallback = page.newsCallback.bind(page);
  window._nomimesFacebookCallback = page.facebookCallback.bind(page);
  window._nomimesTwitterCallback = page.twitterCallback.bind(page);
})();
