/* 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,
	shortFormatWholePost: false,
	shortFormatWords: 100,

	noPostsClass: 'feedNoPosts',
	noPostsContent: 'There are no posts.',
	tinyHeadingText: 'More blog posts',

	shortContainerClass: 'feedShortContainer',
	tinyContainerClass: 'feedTinyContainer',
	tinyHeadingClass: 'feedTinyHeading',

	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];
		var shortContainer = new Element('div', {'class': this.shortContainerClass});
		this.formatPost(first, 'short').injectInside(shortContainer);
		var tinyContainer = new Element('div', {'class': this.tinyContainerClass});
		for (var i = 1; i < Math.min(this.numPosts, this.shortFormatNumExtra+1); i++) {
			this.formatPost(this.posts[i], 'tiny').injectInside(tinyContainer);
		}
		var tinyHeading = new Element('h3', {'class': this.tinyHeadingClass});
		tinyHeading.setText(this.tinyHeadingText);
		tinyHeading.injectInside(shortContainer);
		tinyContainer.injectInside(shortContainer);
		return shortContainer;
	},

	displayPage: function(num, includeTopNav) {
		var actualPage = num;
		var self = this;
		switch (this.displayMode) {
			case 'short':
			this.container.empty();
			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;
			}
			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);
			}
			this.constructNavigation().injectInside(this.container);
			break;
		}
	},

	formatPost: function(item, mode) {
		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 itemClass = this.itemClass;
		if (mode) { itemClass += ' ' + mode; }
		el = new Element('div', {'class': 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);
		if (mode == 'tiny') {
			pubDateEl.injectInside(titleEl);
			var arrow = new Element('span');
			arrow.setHTML('&rsaquo; ');
			arrow.injectTop(titleEl);
			return el;
		}
		creatorEl.injectInside(byEl);
		byEl.injectInside(bylineEl);
		pubDateEl.injectInside(bylineEl);
		bylineEl.injectInside(el);
		descriptionEl = new Element('div', {'class': this.descriptionClass});
		if (mode == 'short' && !this.shortFormatWholePost) {
			var shortContent = '';
			var words = content.stripTags().split(' ');
			for (var i = 0; i < Math.min(words.length, this.shortFormatWords); i++) {
				shortContent += words[i] + ' ';
			}
			shortContent += '... '
			descriptionEl.setHTML(shortContent);
		} else {
			descriptionEl.setHTML(content);
		}
		descriptionEl.injectInside(el);
		if (mode == 'short' && !this.shortFormatWholePost) {
			var moreLinkEl = new Element('a', {'href': href});
			moreLinkEl.setText('Read more');
			moreLinkEl.injectInside(descriptionEl);
		} 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;
	}

});
