/**
 * Plugin: jquery.zRSSFeed
 * 
 * Version: 1.1.3
 * (c) Copyright 2010-2011, Zazar Ltd
 * 
 * Description: jQuery plugin for display of RSS feeds via Google Feed API
 *              (Based on original plugin jGFeed by jQuery HowTo. Filesize function by Cary Dunn.)
 * 
 * History:
 * 1.1.3 - Check for valid published date
 * 1.1.2 - Added user callback function due to issue with ajaxStop after jQuery 1.4.2
 * 1.1.1 - Correction to null xml entries and support for media with jQuery < 1.5
 * 1.1.0 - Added support for media in enclosure tags
 * 1.0.3 - Added feed link target
 * 1.0.2 - Fixed issue with GET parameters (Seb Dangerfield) and SSL option
 * 1.0.1 - Corrected issue with multiple instances
 *
 **/

(function($){

	$.fn.rssfeed = function(url, options, fn) {	
	
		// Set pluign defaults
		var defaults = {
			limit: 10,
			header: true,
			titletag: 'h4',
			date: true,
			content: true,
			snippet: true,
			showerror: true,
			errormsg: '',
			key: null,
			ssl: false,
			linktarget: '_blank',
			type: 'facebook'
			
			
		};  
		var options = $.extend(defaults, options); 
		//alert(twitterHandle);
		// Functions
		return this.each(function(i, e) {
			var $e = $(e);
			var s = '';

			// Check for SSL protocol
			if (options.ssl) s = 's';
			
			// Add feed class to user div
			if (!$e.hasClass('rssFeed')) $e.addClass('rssFeed');
			
			// Check for valid url
			if(url == null) return false;
			
			// Create Google Feed API address
			var api = "http"+ s +"://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + encodeURIComponent(url);
			if (options.limit != null) api += "&num=" + options.limit;
			if (options.key != null) api += "&key=" + options.key;
			api += "&output=json_xml"

			// Send request
			$.getJSON(api, function(data){
				
				// Check for error
				if (data.responseStatus == 200) {
	
					// Process the feeds
					_process(e, data.responseData, options);

					// Optional user callback function
					if ($.isFunction(fn)) fn.call(this,$e);
					
				} else {

					// Handle error if required
					if (options.showerror)
						if (options.errormsg != '') {
							var msg = options.errormsg;
						} else {
							var msg = data.responseDetails;
						};
						$(e).html('<div class="rssError"><p>'+ msg +'</p></div>');
				};
			});				
		});
	};
	
	// Function to create HTML result
	var _process = function(e, data, options) {

		// Get JSON feed data
		var feeds = data.feed;
		if (!feeds) {
			return false;
		}
		var html = '';	
		var row = 'odd';
		
		// Get XML data for media (parseXML not used as requires 1.5+)
		var xml = getXMLDocument(data.xmlString);
		var xmlEntries = xml.getElementsByTagName('item');
		
		// Add header if required
		if (options.header)
			html +=	'<div class="rssHeader">' +
				'<a href="'+feeds.link+'" title="'+ feeds.description +'">'+ feeds.title +'</a>' +
				'</div>';
			
		// Add body
		html += '<div class="rssBody">' +
			'<ul>';
		
		// Add feeds
		for (var i=0; i<feeds.entries.length; i++) {
			
			// Get individual feed
			var entry = feeds.entries[i];
			var pubDate;
			var a_p = "";
			// Format published date
			if (entry.publishedDate) {
				var entryDate = new Date(entry.publishedDate);
				var curr_date = entryDate.getDate();
 			 	var curr_month = entryDate.getMonth() + 1; //months are zero based
  				var curr_year = entryDate.getFullYear();
				var curr_hour = entryDate.getHours();
				var curr_min = entryDate.getMinutes();
				var pubDate =  curr_month + "/" + curr_date + "/" + curr_year + ' ';
				//var pubDate = entryDate.toLocaleDateString() + ' ' + entryDate.toLocaleTimeString();
				
				if (curr_hour < 12)
				   {
				   a_p = "AM";
				   }
				else
				   {
				   a_p = "PM";
				   }
				if (curr_hour == 0)
				   {
				   curr_hour = 12;
				   }
				if (curr_hour > 12)
				   {
				   curr_hour = curr_hour - 12;
				   }
				
				curr_min = curr_min + "";

				if (curr_min.length == 1)
				   {
				   curr_min = "0" + curr_min;
				   }
				
				
				pubDate += curr_hour + ":" + curr_min + ' ' + a_p;
				
			}
			//alert(options.type);
			if(options.type == 'twitter'){
				
				// Add feed row
				html += '<li class="rssRow twitterRow '+row+'">'  +
					'<'+ options.titletag +'><a href="http://twitter.com/AegisWorldwide"" title="Aegis Worldwide Twitter" target="'+ options.linktarget +'">Aegis Worldwide</a></'+ options.titletag +'>'
				if (options.content) {
				
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					var regex = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/;
					var urlMatch = content.match(regex);
					
					if(urlMatch != null){
						var urlLink = '<a class="tweetLink" target="_blank" href="' + urlMatch[0] + '">' + urlMatch[0] + '</a>';
						urlMatchurl = urlMatch[0].toString();
						
						content = content.replace(urlMatchurl, urlLink);
						//alert(content);
					}
					var twitterwithcode = '<b>' + 'AegisWorldwide' + '</b>';
					content = content.replace('AegisWorldwide', twitterwithcode);
					
					html += '<p>'+ content +'</p>'
				}
				if (options.date && pubDate) html += '<div>'+ pubDate +'</div>'
					
			}else if(options.type == 'blog'){
				
				// Add feed row
				html += '<li class="rssRow blogRow '+row+'">' +  
					'<'+ options.titletag +'><a href="'+ entry.link +'" title="'+ entry.title +'" target="'+ options.linktarget +'">'+ entry.title +'</a></'+ options.titletag +'>'
				if (options.content) {
				
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					var regex = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/;
					var urlMatch = content.match(regex);
					
					if(urlMatch != null){
						var urlLink = '<a class="tweetLink" target="_blank" href="' + urlMatch[0] + '">' + urlMatch[0] + '</a>';
						urlMatchurl = urlMatch[0].toString();
						
						content = content.replace(urlMatchurl, urlLink);
						//alert(content);
					}
										
					html += '<p>'+ content +'<a href="'+ entry.link +'" title="Read More '+ feeds.title +'" target="'+ options.linktarget +'">read more</a></p>'
				}
				if (options.date && pubDate) html += '<div>'+ pubDate +'</div>'
					
			}else if(options.type == 'news'){
				
				// Add feed row
				html += '<li class="rssRow newsRow '+row+'">'+
					'<'+ options.titletag +'><a href="'+ entry.link +'" title="View Aegis News">What&rsquo;s up with Aegis? <span style="font-size:15px;">NEWS, EVENTS & MORE</span></a></'+ options.titletag +'>'
				if (options.content) {
				
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					var regex = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/;
					var urlMatch = content.match(regex);
					
					if(urlMatch != null){
						var urlLink = '<a class="news" href="' + urlMatch[0] + '">' + urlMatch[0] + '</a>';
						urlMatchurl = urlMatch[0].toString();
						
						content = content.replace(urlMatchurl, urlLink);
						//alert(content);
					}
										
					html += '<p>'+ content +'<a href="'+ entry.link +'" title="Read More '+ feeds.title + '">read more</a></p>'
				}
				//if (options.date && pubDate) html += '<div>'+ pubDate +'</div>'
					
			}else{
				
				// Add feed row
				html += '<li class="rssRow '+row+'">' +
					'<'+ options.titletag +'><a href="http://www.facebook.com/#%21/aegisworldwide" title="Aegis Worldwide Facebook" target="'+ options.linktarget +'"> Aegis Worldwide </a></'+ options.titletag +'>'
				if (options.content) {
				
					// Use feed snippet if available and optioned
					if (options.snippet && entry.contentSnippet != '') {
						var content = entry.contentSnippet;
					} else {
						var content = entry.content;
					}
					
					html += '<p>'+ content +'</p>'
				}
				if (options.date && pubDate) html += '<div>'+ pubDate +'</div>'
			
			}
			// Add any media
			if(xmlEntries.length > 0) {
				var xmlMedia = xmlEntries[i].getElementsByTagName('enclosure');
				if (xmlMedia.length > 0) {
					html += '<div class="rssMedia"><div>Media files</div><ul>'
					for (var m=0; m<xmlMedia.length; m++) {
						var xmlUrl = xmlMedia[m].getAttribute("url");
						var xmlType = xmlMedia[m].getAttribute("type");
						var xmlSize = xmlMedia[m].getAttribute("length");
						html += '<li><a href="'+ xmlUrl +'" title="Download this media">'+ xmlUrl.split('/').pop() +'</a> ('+ xmlType +', '+ formatFilesize(xmlSize) +')</li>';
					}
					html += '</ul></div>'
				}
				html += '</li>';
			}
			
			// Alternate row classes
			if (row == 'odd') {
				row = 'even';
			} else {
				row = 'odd';
			}			
		}
		
		html += '</ul>' +
			'</div>'
		
		$(e).html(html);
	};
	
	function formatFilesize(bytes) {
		var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
		var e = Math.floor(Math.log(bytes)/Math.log(1024));
		return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
	}

	function getXMLDocument(string) {
		var browser = navigator.appName;
		var xml;
		if (browser == 'Microsoft Internet Explorer') {
			xml = new ActiveXObject('Microsoft.XMLDOM');
			xml.async = 'false'
			xml.loadXML(string);
		} else {
			xml = (new DOMParser()).parseFromString(string, 'text/xml');
		}
		return xml;
	}

})(jQuery);

