/**
 * ajaxFeeder.js
 * @use 'GoogleAjaxFeedAPI - http://code.google.com/intl/ja/apis/ajaxfeeds/documentation/' & 'jQuery - http://jquery.com/'
 * 
 * @version: 0.10
 * @author: Takuma Ando
 * @created: Oct 4th, 2010
 * @updated: Mar 1st, 2011
 * @license: Dual licensed under the MIT and GPL licenses:
 *           http://www.opensource.org/licenses/mit-license.php
 *           http://www.gnu.org/licenses/gpl.html
 */
(function($){
	$(function(){
		$('.ajaxFeeder').each(function(){
			var $feedWrapper = $(this);
			
			var denial = ($(this).children('.ajaxFeederDenial').length) ? $(this).children('.ajaxFeederDenial').eq(0).text() : '';
			var feedsLength = $(this).children('.ajaxFeederFeed').length;
			
			var entries = [];
			var loadedFeeds = 0;
			
			$(this).children('.ajaxFeederFeed').each(function(index){
				var entryLength = ($(this).get(0).className.match(/ajaxFeederEntryLength(\d+)/i)) ? RegExp.$1 - 0: 5;
				
				$.ajax({
					url: 'http://ajax.googleapis.com/ajax/services/feed/load?q=' + encodeURIComponent($(this).text()) + '&v=1.0&num=' + entryLength,
					dataType: 'jsonp',
					success: function(json, status){
						var feed = json.responseData.feed;
						
						for(var i = 0; i < feed.entries.length; i++){
							if ( denial && feed.entries[i].title.indexOf(denial) != -1 ){
								continue;
							}
							entries.push({
								feedIndex: index,
								feedTitle: feed.title,
								feedLink: feed.link,
								title: feed.entries[i].title,
								link: feed.entries[i].link,
								publishedDate: (new Date(feed.entries[i].publishedDate)) ? new Date(feed.entries[i].publishedDate) : new Date(),
								content: feed.entries[i].content,
								contentSnippet: feed.entries[i].contentSnippet
							});
						}
						
						loadedFeeds++;
						if ( feedsLength == loadedFeeds ){
							showFeeds($feedWrapper, entries);
						}
					}
				});
				$(this).remove();
			});
		});
	});
	
	function showFeeds($wrapper, entries){
		var $container = $wrapper.find('.ajaxFeederContainer');
		var $group = $container.find('.ajaxFeederGroup');
		
		var isGrouped = ( $group.length ) ? true : false;
		var isMixed = $wrapper.hasClass('ajaxFeederMixFeeds');
		var maxLength = ($container.get(0).className.match(/ajaxFeederMaxLength(\d+)/i)) ? RegExp.$1 - 0: entries.length;
		
		if ( isMixed ){
			entries.sort(function(a, b){
				return b.publishedDate.getTime() - a.publishedDate.getTime();
			});
			entries = entries.slice(0, maxLength);
			
			if ( isGrouped ) {
				var $clonedGroup = $group.clone();
				$group.remove();
				buildFeeds($container, $clonedGroup, entries);
			} else {
				var $clonedContainerChildren = $container.children().clone();
				$container.empty();
				buildFeeds($container, $clonedContainerChildren, entries);
			}
		} else {
			entries.sort(function(a, b){
				return b.feedIndex - a.feedIndex;
			});
			entries = entries.slice(0, maxLength);
			
			var index = entries[0].feedIndex;
			var setEntry = [];
			
			if ( isGrouped ) {
				var $clonedGroup = $group.clone();
				$group.remove();
				
				for(var i = 0; i < entries.length; i++){
					if (entries[i].feedIndex != index ){
						buildFeeds($container, $clonedGroup, setEntry);
						index = entries[i].feedIndex;
						setEntry = [];
					}
					setEntry.push(entries[i]);
				}
				buildFeeds($container, $clonedGroup, setEntry);
			} else {
				var $clonedContainerChildren = $container.children().clone();
				$container.empty();
				
				for(var i = 0; i < entries.length; i++){
					if (entries[i].feedIndex != index ){
						buildFeeds($container, $clonedContainerChildren, setEntry);
						index = entries[i].feedIndex;
						setEntry = [];
					}
					setEntry.push(entries[i]);
				}
				buildFeeds($container, $clonedContainerChildren, setEntry);
			}
		}
	}
	
	function buildFeeds($wrapper, $container, entries){
		$wrapper.find('.ajaxFeederFeedTitle').text(entries[0].feedTitle);
		$wrapper.find('.ajaxFeederFeedLink').attr('href', entries[0].feedLink);
		for(var i = 0; i < entries.length; i++){
			/*var en = '';
			for(var prop in entries[i]){
				en += prop + ': ' + entries[i][prop] + "\n";
			}*/
			
			var $clonedContainer = $container.clone();
			$clonedContainer.find('.ajaxFeederFeedLink').attr('href', entries[i].feedLink);
			$clonedContainer.find('.ajaxFeederFeedTitle').text(entries[i].feedTitle);
			$clonedContainer.find('.ajaxFeederEntryLink').attr('href', entries[i].link);
			$clonedContainer.find('.ajaxFeederEntryDate').text(dateFormat(entries[i].publishedDate));
			$clonedContainer.find('.ajaxFeederEntryTitle').text(entries[i].title);
			$clonedContainer.find('.ajaxFeederEntryContent').html(entries[i].content);
			$clonedContainer.find('.ajaxFeederEntryContentSnippet').html(entries[i].contentSnippet);
			var $snippet = $clonedContainer.find('.ajaxFeederEntryContentSnippet');
			if ( $snippet.length > 0 ){
				$snippet.get(0).className.match(/ajaxFeederSnippetSize(\d+)/i);
				var size = (RegExp.$1) ? RegExp.$1 - 0: null;
				var snippet = (size) ? entries[i].contentSnippet.substring(0, size) : entries[i].contentSnippet;
				$snippet.html(snippet);
			}
			//alert($clonedContainer.wrap('<div></div>').html());
			$wrapper.append($clonedContainer);
		}
		return $wrapper;
	}
	
	function dateFormat(dateText){
		var date = new Date(dateText);
		var yy = ( date.getYear() > 1900 ) ? date.getYear() : date.getYear() + 1900;
		var mm = ( date.getMonth() + 1 >= 10 ) ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
		var dd = ( date.getDate() >= 10 ) ? date.getDate() : '0' + date.getDate();
		return yy + '/' + mm + '/' + dd;
	}
})(jQuery);

