/* TESTING (alexander) */

$extend(String.prototype, {
  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  escapeHtml: function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
  },
  
  unescapeHtml: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0].nodeValue;
  }
});

var FeedFetcher = new Class({

  postsPerPage: 4,

  displayMode: null,
  shortFormatNumExtra: 3,
  shortFormatWords: 100,

  noPostsClass: 'feedNoPosts',
  noPostsContent: 'There are no posts.',

  itemClass: 'feedItem',
  channelClass: 'feedChannel',
  titleClass: 'feedTitle',
  descriptionClass: 'feedDescription',
  bylineClass: 'feedByline',
  byClass: 'feedBy',
  creatorClass: 'feedCreator',
  pubDateClass: 'feedPubDate',
  commentCountClass: 'feedCommentCount',
  commentLineClass: 'feedCommentLine',
  permalinkClass: 'feedPermalink',
  emailThisClass: 'feedEmailThis',
  shareLineClass: 'feedShareLine',
  diggClass: 'feedDigg',
  facebookClass: 'feedFacebook',
  newsvineClass: 'feedNewsvine',
  stumbleClass: 'feedStumble',
  deliciousClass: 'feedDelicious',
  footerClass: 'feedFooter',
  navigationClass: 'feedNavigation',
  prevClass: 'feedPrev',
  nextClass: 'feedNext',
  pagesClass: 'feedPages',
  pageLinkClass: 'feedPageLink',
  pageLinkCurrentClass: 'feedPageLinkCurrent',
  pageLinkFirstClass: 'feedPageLinkFirst',
  topNavClass: 'feedTopNav',

  prevText: 'Older posts...',
  nextText: 'Newer posts...',
  pagesText: 'Page: ',

  topTarget: '#top',

  emailThisHrefBase: 'http://my.barackobama.com/page/sendtofriend?referer=',

  initialize: function(feedUrl, feedBurnerId) {
    this.feedUrl = feedUrl;
    this.feedBurnerId = feedBurnerId;
  },

  fetch: function(containerId) {
    this.container = $(containerId);
    var self = this;
    new Ajax(this.feedUrl, {
			method: 'get',
      onSuccess: function(stringData, xmlData) {
        self.channel = xmlData.documentElement.getElementsByTagName('channel')[0];
        self.displayChannel();
      }
    }).request();
  },

  displayChannel: function() {
    var self = this;
    this.posts = this.channel.getElementsByTagName('item');
    this.numPosts = this.posts.length;
    this.numPages = Math.ceil(this.numPosts / this.postsPerPage);
    this.displayPage(1);
  },

  constructNavigation: function() {
    var self = this;
    var navigationEl = new Element('div', {'class': this.navigationClass});
    prevEl = new Element('a',
                         {'class': this.prevClass,
                          'href': this.topTarget,
                          'events': {
                            'click': function() {
                              self.displayPage(self.actualPage + 1, true);
                            }
                          }});
    prevEl.setText(this.prevText);
    nextEl = new Element('a', {'class': this.nextClass, 'href': this.topTarget,
                              'events': {
                                'click': function() {
                                  self.displayPage(self.actualPage - 1, true);
                                }
                              }});
    nextEl.setText(this.nextText);
    var pagesEl = new Element('div', {'class': this.pagesClass});
    pagesEl.setText(this.pagesText);
    for (var j = 1; j <= this.numPages; j++) {
      if (j == this.actualPage) {
        var pageLinkEl = new Element('span');
        pageLinkEl.addClass(this.pageLinkClass);
        pageLinkEl.addClass(this.pageLinkCurrentClass);
      }
      else {
        var pageLinkEl = new Element('a',
          {
            'class': this.pageLinkClass,
            'href': this.topTarget,
            'events': {
              'click': function(evt) {
                self.displayPage(parseInt(new Event(evt).target.getText()),
                                 true);
              }
            }
          });
      }
      if (j == 1) { pageLinkEl.addClass(this.pageLinkFirstClass); }
      pageLinkEl.setText('' + j);
      pageLinkEl.injectInside(pagesEl);
    }
    if (!this.atOldest) {
      prevEl.injectInside(navigationEl);
    }
    if (!this.atNewest) {
      nextEl.injectInside(navigationEl);
    }
    pagesEl.injectInside(navigationEl);
    new Element('div',
                {'styles': {'clear': 'both'}}).injectInside(navigationEl);
    return navigationEl;
  },

  shortFormat: function() {
    if (this.numPosts == 0) {
      var np = new Element('span', {'class': this.noPostsClass});
      np.setHTML(this.noPostsContent);
      return np;
    }
    var first = this.posts[0];
    return this.formatPost(first, 'short');
  },

  displayPage: function(num, includeTopNav) {
    var actualPage = num;
    var self = this;
    switch (this.displayMode) {
    case 'short':
      this.shortFormat().injectInside(this.container, this.displayMode);
      break;
    case 'single':
          var i = 0
          this.formatPost(this.posts[i]).injectInside(this.container);
    default:
      this.atOldest = false;
      this.atNewest = false;
      if (actualPage <= 1) {
        actualPage = 1;
        this.atNewest = true;
      }
      if (actualPage * this.postsPerPage > this.numPosts) {
        actualPage = this.numPages;
      }
      this.actualPage = actualPage;
      var startIndex = (actualPage - 1) * this.postsPerPage;
      var endIndex = (actualPage * this.postsPerPage) - 1;
      if (endIndex >= (this.numPosts - 1)) {
        endIndex = this.numPosts - 1;
        this.atOldest = true;
      }
      this.container.empty();
      if (!this.atNewest || includeTopNav) {
        var topNav = this.constructNavigation();
        topNav.addClass(this.topNavClass);
        topNav.injectTop(this.container)
      }
      for (var i = startIndex; i <= endIndex; i++) {
        this.formatPost(this.posts[i]).injectInside(this.container);
      }
      if(this.displayMode!='single') {
        this.constructNavigation().injectInside(this.container);
      }
      break;
    }
  },

  formatPost: function(item) {
	if (item.normalize) { item.normalize(); }
    var title = item.getElementsByTagName('title')[0].firstChild.data;
		var href = item.getElementsByTagName('guid')[0].firstChild.data;
		var origDate = item.getElementsByTagName('pubDate')[0].firstChild.data;
		var content = item.getElementsByTagName('description')[0].firstChild.data;
    var commentsHref = item.getElementsByTagName('comments')[0].firstChild.data;
		if (!document.all) {
			var commentCount = item.getElementsByTagNameNS('http://www.w3.org',
        'comment_count')[0].firstChild.data;
			var author = item.getElementsByTagNameNS('http://purl.org/dc/elements/1.1/',
        'creator')[0].firstChild.data;
		} else {
			var commentCount = item.getElementsByTagName('db:comment_count')[0].firstChild.data;
			var author = item.getElementsByTagName('dc:creator')[0].firstChild.data;
		}
    el = new Element('div', {'class': this.itemClass});
    titleEl = new Element('h4', {'class': this.titleClass});
    titleLinkEl = new Element('a', {'href': href});
    titleLinkEl.setText(title);
    titleLinkEl.injectInside(titleEl);
    titleEl.injectInside(el);
    bylineEl = new Element('div', {'class': this.bylineClass});
    byEl = new Element('span', {'class': this.byClass});
    byEl.setText('by ');
    creatorEl = new Element('span', {'class': this.creatorClass});
    pubDateEl = new Element('span', {'class': this.pubDateClass});
    commentCountEl = new Element('span', {'class': this.commentCountClass});
    creatorEl.setText(author);
    link = new Element('a', {'href': commentsHref})
    link.setText('' + commentCount + ' Comment(s)')
    link.injectInside(commentCountEl);
    date = new Date(Date.parse(origDate));
    datestr = date.format('%A, %B %d, %Y at %I:%M %p')
    pubDateEl.setText(datestr);
    creatorEl.injectInside(byEl);
    if (this.displayMode != 'short') {
      byEl.injectInside(bylineEl);
    }
    pubDateEl.injectInside(bylineEl);
    bylineEl.injectInside(el);
    descriptionEl = new Element('div', {'class': this.descriptionClass});
    if (this.displayMode == 'short') {
      var shortContent = '';
      var words = content.stripTags().split(' ');
      for (var i = 0; i < Math.min(words.length, this.shortFormatWords); i++) {
        shortContent += words[i] + ' ';
      }
      descriptionEl.setText(shortContent);
    } else {
      descriptionEl.setHTML(content);
    }
    descriptionEl.injectInside(el);
    
    if (this.displayMode == 'short') {
      var moreLinkEl = new Element('a', {'href': href});
      moreLinkEl.setText('Read more...');
      moreLinkEl.injectInside(descriptionEl);
    } else if (this.displayMode == 'single') {
          // nothing here
    } else {
      footerEl = new Element('div', {'class': this.footerClass});
      commentLineEl = new Element('div', {'class': this.commentLineClass});
      commentCountEl.injectInside(commentLineEl);
      permalinkEl = new Element('a', {'href': href, 'class': this.permalinkClass});
      permalinkEl.setText('Permalink');
      permalinkEl.injectInside(commentLineEl);
      emailThisHref = this.emailThisHrefBase + href
      emailThisEl = new Element('a', {'href': emailThisHref,
                                      'class': this.emailThisClass});
      emailThisEl.setText('Email to a friend');
      emailThisEl.injectInside(commentLineEl);
      shareLineEl = new Element('div', {'class': this.shareLineClass});
      shareHtml = 'Share: ';
      shareHtml += "<a href='http://digg.com/remote-submit?phase=2&url="
			  + href
			  + "&title="
			  + title
			  + "' class='" + this.diggClass + "' target='_blank'>Digg</a><a href='http://www.facebook.com/share.php?u="
			  + href
			  + "&t="
			  + encodeURIComponent(title)
			  + "' class='" + this.facebookClass + "' target='_blank'>Facebook</a><a href='http://www.newsvine.com/_tools/seed&save?u="
			  + href
			  + "&h="
			  + encodeURIComponent(title)
			  + "' class='" + this.newsvineClass + "' target='_blank'>Newsvine</a><a href='http://www.stumbleupon.com/submit?url="
			  + href
			  + "&title="
			  + title
			  + "' class='" + this.stumbleClass + "' target='_blank'>Stumble</a><a href='http://del.icio.us/post?v=4&noui&jump=close&url="
			  + href
			  + "&title="
			  + title
			  + "' class='" + this.deliciousClass + "' target='_blank'>del.icio.us</a>";
      shareLineEl.setHTML(shareHtml);
      commentLineEl.injectInside(footerEl);
      shareLineEl.injectInside(footerEl);
      footerEl.injectInside(el);
    }
    return el;
  }

});
