$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: 5,

		  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',

		  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);
		    tb_init('a.thickbox');
		  },

		  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);
		      break;
		    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;
		      }
		      for (var i = startIndex; i <= endIndex; i++) {
		        this.formatPost(this.posts[i], i).injectInside(this.container);
		      }
		      break;
		    }
		  },

		  formatPost: function(item, number, mode) {
			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;
				}
				var random = Math.floor(Math.random()*101);
				var linkurl = 'on'+number+random+'page';
		    el = new Element('li', {'class': this.itemClass});
		    titleEl = new Element('h4', {'class': this.titleClass});
		    titleLinkEl = new Element('a', {'href': '#TB_inline?height=400&width=600&inlineId='+linkurl, 'class':'thickbox'});
		    titleLinkEl.setText(title);
		    titleLinkEl.injectInside(titleEl);
		    titleEl.injectInside(el);
			
			tbel = new Element('div', {'class':'modalcontent hiddenportion', 'id': linkurl, 'style':'display:none;'});
		    puTitleEl = new Element('h4', {'class': this.titleClass});
		    puTitleEl.setHTML(title);
		    puTitleEl.injectInside(tbel);
		    pubDateEl = new Element('span', {'class': this.pubDateClass});
		    commentCountEl = new Element('span', {'class': this.commentCountClass});
		 	bylineEl = new Element('div', {'class': this.bylineClass});
		    byEl = new Element('span', {'class': this.byClass});
		    byEl.setText('by ');
		    link = new Element('a', {'href': commentsHref})
		    link.setText('' + commentCount + ' Comment(s)')
		    link.injectInside(byEl);
		    date = new Date(Date.parse(origDate));
		    // datestr = date.format('%A, %B %d, %Y at %I:%M %p')
		    pubDateEl.setText(date.toString().substring(0, 15));
		    pubDateEl.injectInside(bylineEl);
		    bylineEl.injectInside(tbel);
		    descriptionEl = new Element('div', {'class': this.descriptionClass});
		    descriptionEl.setHTML(content);

		    descriptionEl.injectInside(tbel);
		    tbel.injectInside(el);
		    return el;
		  }

		});