/**
 * jQuery-Plugin "tweetSearch"
 * 
 * @version: 1.0, 09.22.2009
 * 
 * @author: Stijn Van Minnebruggen
 *          stijn@donotfold.be
 *          http://www.donotfold.be
 * 
 * @example: $('selector').tweetSearch({ query: '#apple' });
 * @example: $('selector').tweetSearch({ query: '#apple+OR+#pie', number: 1, showLoader: true });
 * 
 */

(function($) {

$.fn.tweetSearch = function(settings) {
	
	/**
	 * Settings
	 * 
	 */
	
	var settings = $.extend({
		
		query: 'donotfold',					// search keyword
		number: 10,							// number of tweets to fetch
		
		showLoader: true,					// show loader while fetching tweets
		loaderHtml: 'Loading tweets...',	// loader html content
		loaderClass: 'tweetsLoading',		// className while loading
		
		linkTweets: true,					// link tweets
		showFromUser: true,					// show from which user the tweet is
		linkFromUser: true,					// show link to user from which the tweet is
		showDate: false,					// show date of every tweet
		dateClass: 'tweetsDate',			// className for the date span element
		
		fullWrapElement: 'ol',				// html tag that wraps the full html result
		itemWrapElement: 'li'				// html tag that wraps each tweet
		
	}, settings);
	
	
	/**
	 * Fetch elements
	 * 
	 */
	
	var el = $(this);
	if(el.size() == 0) return $;
	
	
	/**
	 * Show loader
	 * 
	 */
	
	if(settings.showLoader) {
		el.addClass(settings.loaderClass).html(settings.loaderHtml);
	}
	
	
	/**
	 * Fetch tweets
	 * 
	 */
	
	var query = settings.query.replace('#', '%23').replace('@', '%40');
	var apiUrl = 'http://search.twitter.com/search.json?q='+query+'&callback=?';
	
	$.getJSON(apiUrl, function(resp) {
		
		/**
		 * Templates
		 * 
		 */
		
		var tpl_fullHtml = (settings.fullWrapElement == '') ? '%ITEMS%' : '<'+settings.fullWrapElement+'>%ITEMS%</'+settings.fullWrapElement+'>';
		var tpl_itemHtml = (settings.itemWrapElement == '') ? '%LINK%%FROM%%DATE%' : '<'+settings.itemWrapElement+'>%LINK%%DATE%</'+settings.itemWrapElement+'>'+"\n";
		var tpl_linkHtml = (settings.linkTweets) ? '<a href="http://twitter.com/%FROM%/status/%STATUSID%">%TEXT%</a>' : '%TEXT%';
		var tpl_dateHtml = (settings.showDate) ? ' <span class="'+settings.dateClass+'">%DATE%</span>' : '';
		var tpl_fromHtml = (settings.linkFromUser) ? '<a href="http://twitter.com/%FROM%">%FROM%</a>' : '%FROM%';
		if(!settings.showFromUser) tpl_fromHtml = '';
		
		
		/**
		 * Fetch results
		 * 
		 */
		
		var itemsHtml = '';
		$(resp.results).each(function(i) {
			if(i < settings.number) {
				
				// get values
					var id = $(this).attr('id');
					var text = $(this).attr('text');
					var date = $(this).attr('created_at');
					var from = $(this).attr('from_user');
				
				// add to items html
					var dateHtml = tpl_dateHtml.replace('%DATE%', date);
					var fromHtml = tpl_fromHtml.replace('%FROM%', from);
					var linkHtml = tpl_linkHtml.replace('%STATUSID%', id).replace('%FROM%', from).replace('%TEXT%', text);
					var itemHtml = tpl_itemHtml.replace('%LINK%', linkHtml).replace('%FROM%', fromHtml).replace('%DATE%', dateHtml);
					itemsHtml += itemHtml;
				
			}
		});
		
		
		/**
		 * Hide loader
		 * 
		 */
		
		if(settings.showLoader) {
			el.removeClass(settings.loaderClass);
		}
		
		
		/**
		 * Add html content
		 * 
		 */
		
		var html = tpl_fullHtml.replace('%ITEMS%', itemsHtml);
		el.html(html);
		
		
	});
	
};

})(jQuery);
