// Upcoming Delegate
var upcomingDelegate = {
	shouldShowResults: function(self,results) {		
		var idsMatched = true,
			numberOfResults = results.value.items.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.value.items[i].id;
			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.value.items;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		// if result is already in view don't add it again
		var eventId = result.id,
			displayId = self.viewId+'_'+eventId,
			alreadyInView = self._view.down('#'+displayId);

		self.currentIds[index] = eventId;
				
		if (alreadyInView) return $(displayId);
		
		// create formatted result
		var eventDate = result.start_date.split('-'),
			eventYear = eventDate[0],
			eventMonth = eventDate[1]-1,
			eventDay = eventDate[2],
			eventTime = result.start_time,
			eventDateObj = new Date(eventYear,eventMonth,eventDay),
			eventDateFormatted = self.getFormattedDate(eventDateObj) + ' ' + eventTime,
			eventName = result.name,
			eventVenue = result.venue_name,
			eventUrl = 'http://upcoming.yahoo.com/event/'+eventId+'/',
			displayContent = new Element('div', { className:'vevent hevent' }),
			displayDate = new Element('abbr', {
					className:'dtstart '+self.viewId+'_date',
					title:result.start_date+'T'+result.start_time
				}).update(eventDateFormatted),
			displayName = new Element('a', {
					className:'url summary '+self.viewId+'_name',
					href:eventUrl,
					title:eventName
				}).update(eventName),
			displayVenue = new Element('span', {
					className:'location '+self.viewId+'_venue'
				}).update('@ '+eventVenue),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayDate);
		displayContent.appendChild(displayName);
		displayContent.appendChild(displayVenue);
		
		displayResult.appendChild(displayContent);

		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};

// Blog Delegate
var blogDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.query.results.item.guid.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var pageUrl = results.query.results.item.guid.content,
				resultId = pageUrl.split('=')[1];

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.query.results.item;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		var blogIdUrl = result.guid.content,
			blogId = blogIdUrl.split('=')[1],
			displayId = self.viewId+'_'+blogId,
			alreadyInView = self._view.down('#'+displayId);
		
		self.currentIds[index] = blogId;
		
		if (alreadyInView) return $(displayId);
		
		var blogTitle = result.title,
			blogDescription = result.description,
			blogUrl = result.link,
			blogCommentsUrl = result.comments,
			blogCategories = result.category,
			blogCategoriesFormatted = "",
			tagCount = 0;
			
		blogCategories.each(function(category,index) {
			if (category.toLowerCase() !== 'uncategorized') {
				if (tagCount !== 0) blogCategoriesFormatted += ', ';
				
				blogCategoriesFormatted += '<a href="http://blog.strimble.com/tag/' + category + '/" rel="tag" title="' + category + '">' + category + '</a>';
				tagCount++;
			}
		});
		
		var blogDate = new Date(result.pubDate),
			blogDateFormatted = self.getFormattedDate(blogDate) + ' ' + blogDate.toLocaleTimeString(),
			displayContent = new Element('div', { className:'hentry' }),
			displayTitle = new Element('a', {
					className:self.viewId+'_title entry-title',
					href:blogUrl,
					rel:'bookmark',
					title:blogTitle
				}).update(blogTitle),
			displayDescription = new Element('p', {
					className:self.viewId+'_content entry-content'
				}).update(blogDescription),
			displayCategories = new Element('div', {
					className:self.viewId+'_categories'
				}).update(blogCategoriesFormatted),
			displayDate = new Element('abbr', {
					className:self.viewId+'_date entry-date published',
					title:blogDate.getFullYear()+'-'+blogDate.getMonth()+'-'+blogDate.getDate()+'T'+blogDate.toLocaleTimeString()
				}).update(blogDateFormatted),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayTitle);
		displayContent.appendChild(displayDescription);
		displayContent.appendChild(displayCategories);
		displayContent.appendChild(displayDate);
		
		displayResult.appendChild(displayContent);

		$('blog_posts_comment').href = blogCommentsUrl;
		
		return displayResult;
	},
	
	willAnimateResult: function(self,result) {
		var ELLIPSE = /\s\[\.\.\.\]*/,
			html = result.innerHTML;
			
  		html = html.gsub(ELLIPSE, '&hellip;');
  		
  		result.update(html);
	}
};

// About Delegate
var aboutDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.query.results.p.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.query.results.p.id;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {
			self.result = self.results.query.results.p;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		var aboutId = result.id,
			displayId = self.viewId+'_'+aboutId,
			alreadyInView = self._view.down('#'+displayId);
				
		self.currentIds[index] = aboutId;
		
		if (alreadyInView) return $(displayId);
		
		
		var content = result.content,
			displayContent = new Element('div'),
			displayParagraph = new Element('p', {
					className:self.viewId+'_content'
				}).update(content),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayParagraph);
		displayResult.appendChild(displayContent);
		
		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};

// Tumblr Delegate
var tumblrDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.posts.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.posts[i].id;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.posts;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		var quoteId = result.id,
			displayId = self.viewId+'_'+quoteId,
			alreadyInView = self._view.down('#'+displayId);
		
		self.currentIds[index] = quoteId;
		
		if (alreadyInView) return $(displayId);
		
		
		var quoteText = result.quoteText,
			quoteUrl = result.url,
			quoteSource = result.quoteSource,
			displayContent = new Element('div'),
			displayLdquo = new Element('a', {
					className:self.viewId+'_ldquo',
					href:quoteUrl,
					title:'strimble.tumblr.com'
				}).update('&ldquo;'),
			displayQuote = new Element('span', {
					className:self.viewId+'_quote'
				}).update(quoteText),
			displaySource = new Element('span', {
					className:self.viewId+'_source'
				}).update('&mdash;'+quoteSource),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayLdquo);
		displayContent.appendChild(displayQuote);
		displayContent.appendChild(displaySource);
		
		displayResult.appendChild(displayContent);
		
		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};

// Delicious Delegate
var deliciousDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results[i].dt;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		var currentId = result.dt,
			displayId = self.viewId+'_'+currentId,
			alreadyInView = self._view.down('#'+displayId);
		
		self.currentIds[index] = currentId;
		
		if (alreadyInView) return $(displayId);

		
		var url = result.u,
			description = result.d,
			displayContent = new Element('div'),
			displayBookmark = new Element('a', {
					className:self.viewId+'_link',
					href:url,
					title:description
				}).update(description),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayBookmark);
		
		displayResult.appendChild(displayContent);
		
		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};

// Projects Delegate
var projectsDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.projects.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.projects[i].id;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.projects;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		var projectId = result.id,
			displayId = self.viewId+'_'+projectId,
			alreadyInView = self._view.down('#'+displayId);
		
		self.currentIds[index] = projectId;
		
		if (alreadyInView) return $(displayId);

		var projectTitle = result.title,
			projectUrl = result.link,
			displayContent = new Element('div'),
			displayTitle = new Element('a', {
					className:self.viewId+'_title',
					href:projectUrl,
					title:projectTitle
				}).update(projectTitle),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayTitle);
		
		displayResult.appendChild(displayContent);
		
		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};

// Amazon Delegate
var amazonDelegate = {
	shouldShowResults: function(self,results) {		
		var idsMatched = true,
			numberOfResults = results.value.items.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.value.items[i].Item.ASIN;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;
	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.value.items;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {	
		var giftId = result.Item.ASIN,
			displayId = self.viewId+'_'+giftId,
			alreadyInView = self._view.down('#'+displayId);
			
		self.currentIds[index] = giftId;
				
		if (alreadyInView) return $(displayId);
		
		
		var giftTitle = result.title,
			giftUrl = result.link,
			giftPrice = result.Item.OfferSummary.LowestNewPrice.FormattedPrice,
			giftCurrency = result.Item.OfferSummary.LowestNewPrice.CurrencyCode,	
			displayContent = new Element('div'),
			displayTitle = new Element('a', {
					className:self.viewId+'_title',
					href:giftUrl,
					title:giftTitle
				}).update(giftTitle),
			displayPrice = new Element('div', {
					className:self.viewId+'_price'
				}).update(giftPrice+' '+giftCurrency),
			displayResult = new Element('div', {
					id:displayId,
					className:self.viewId+'_result feed_result'
				});
		
		displayContent.appendChild(displayTitle);
		displayContent.appendChild(displayPrice);
		
		displayResult.appendChild(displayContent);
		
		return displayResult;
	},
	
	willAnimateResult: function(result) {}
};


// Flickr Delegate
var flickrDelegate = {
	shouldShowResults: function(self,results) {
		var idsMatched = true,
			numberOfResults = results.photos.photo.length;
		self.displayCount = (numberOfResults < self.displayCount) ? numberOfResults : self.displayCount;
		this.newIds = [];

		for (var i=0; i < self.displayCount; i++) {
			var resultId = results.photos.photo[i].id;

			if (resultId !== self.currentIds[i]) {
				idsMatched = false;
				this.newIds.push(resultId);
			}
		}
		
		return (idsMatched) ? false : true;

	},
	
	willShowResults: function(self,displayCount) {
		if (self.results && self.results !== null) {		
			self.result = self.results.photos.photo;
		} else {
			self.displayCount = displayCount;
			self.getJSON();
		}
		
	},
	
	getFormattedResult: function(self,result,index) {
		if (result.ispublic) {
			var id = result.id,
				displayId = self.viewId+'_'+id,
				alreadyInView = self._view.down('#'+displayId);
			
			self.currentIds[index] = id;
				
			if (alreadyInView) return $(displayId);

		
			var title = result.title,
				farm = result.farm,
				server = result.server,
				secret = result.secret,
				owner = result.owner,
				src = ('http://farm'+farm+'.static.flickr.com/'+server+'/'+id+'_'+secret+'_s.jpg'),
				url = 'http://flickr.com/photos/'+owner+'/'+id+'/',
				displayContent = new Element('div'),
				displayPhotoAnchor = new Element('a', {
						className:self.viewId+'_link',
						href:url,
						title:title
					}),
				displayPhoto = new Element('img', {
						className:self.viewId+'_photo',
						src:src,
						width:'75',
						height:'75',
						alt:title
					}),
				displayTitle = new Element('a', {
						className:self.viewId+'_title',
						href:url,
						title:title
					}).update(title),
				displayResult = new Element('div', {
						id:displayId,
						className:self.viewId+'_result feed_result'
					});
			
			displayPhotoAnchor.appendChild(displayPhoto);
			
			displayContent.appendChild(displayPhotoAnchor);
			displayContent.appendChild(displayTitle);
			
			displayResult.appendChild(displayContent);
			
			return displayResult;
		}

	},
	
	willAnimateResult: function(result) {}
};
