jQuery.fn.minimeFeed = function (feedurl, options, callbackFunc) {
	feedOpt = jQuery.extend ({
		/**
		*
		*		 minime RSS and Atom Feed Reader
		*					ver 1.1
		*
		**/
		// Default options
		phpRepeater: "getfeed.php",		// XML - PHP repeater file for cross-domain errors against (Leave blank if extensions)
		timeout: 5000,					// Timeout
		limit: 1,						// Feed item limit
		getFeedTitle: false,				// Feed title visibility
		getItemTitle: false,				// Item title visibility
		getItemDate: false,				// Item date and time visibility
		dateMode: 'Y F j, l H:i',		// Date display mode ('default' or format string)
		dayList: 'Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday',	// Day name list
		monthList: 'January|February|March|April|May|June|July|August|September|October|November|December',	// Month name list
		getItemSummary: true,			// Item summary visibility
		getItemDescription: false,		// Item description visibility (only Atom feed)
		getItemLink: true,				// Item link visibility
		getAtomId: false,				// Item id visibility (only Atom feed)
		nextLinkText: "next &raquo;",	// Item hyperlink text 
		wrongXmlText: "Feeds are not given",									// Wrong RSS and Atom xml message
		timeoutText: "No responses were received within the specified time",	// Timeout message
		errorText: "The file is not found or network failure",					// HTTP and other error message
		notModifiedText: "The source has not changed since the last request",	// Not modified message
		parserErrorText: "Analytical error"										// XML Parser error message
	}, options);
		
		$(this).empty();
		// feedurl is empty
		if(!feedurl||feedurl.length==0) {
			$(this).append(feedOpt.errorText);
			return false;
		}
		if(feedurl.substr(0,7)=='http://'&&(feedOpt.phpRepeater!=''||feedOpt.phpRepeater!=null)) {
			feedurl = feedOpt.phpRepeater+'?url='+feedurl.substr(7);
		}
		selected = this;
		setHtml = '';
		$.ajax({
			type: "GET",
			url: feedurl,
			dataType: "xml",
 			timeout: feedOpt.timeout,
			success: function(xml) {
				if($(xml).children('rss').length>0) {
					// RSS feeds
					if(feedOpt.getFeedTitle) {
						var rssFeedTitle = $(xml).children('rss').children('channel').children('title').text();	
						setHtml += '<h4>'+rssFeedTitle+'</h4>';
					}
					setHtml += '<ul class="minimeFeed">';
						rsscounter = 0;
						$(xml).children('rss').children('channel').find('item').each(function() {
							// items to html
							rsscounter++;
							setHtml += '<li>';
							if($(this).children('title').length>0&&feedOpt.getItemTitle) {
								var itemTitle = $(this).children('title').text();
								setHtml += '<b>'+itemTitle+'</b>';
							}
							setHtml += '<div class="minimeFeedContent">';
							if($(this).children('pubDate').length>0&&feedOpt.getItemDate) {
								var itemDate = $(this).children('pubDate').text();
								if(feedOpt.dateMode!='default') {
									itemDateForm = convertDate(itemDate);
									setHtml += '<div class="minimeFeedDate">'+itemDateForm+'</div>';
								} else {
									setHtml += '<div class="minimeFeedDate">'+itemDate+'</div>';
								}
							}
							if($(this).children('description').length>0&&feedOpt.getItemSummary) {
								var itemDescription = $(this).children('description').text();
								setHtml += '<div class="minimeFeedText">'+itemDescription+'</div>';
							}
							if($(this).children('link').length>0&&feedOpt.getItemLink) {
								var itemLinks = $(this).children('link').text();
								setHtml += '<a href="'+itemLinks+'" target="_blank">'+feedOpt.nextLinkText+'</a>';
							}
							setHtml += '</div>';
					  		setHtml += '</li>';
					  		// stopped
					  		if(rsscounter==feedOpt.limit) {
					  			return false;
					  		}
						});
						setHtml += '</ul>';
				}
								
				if($(xml).children('feed').length>0) {
					// ATOM feeds
					if(feedOpt.getFeedTitle) {
						var atomFeedTitle = $(xml).children('feed').children('title').text();
						setHtml += '<h4>'+atomFeedTitle+'</h4>';
					}
					setHtml += '<ul class="minimeFeed">';
						atomcounter = 0;
						$(xml).children('feed').children('entry').each(function() {
							// items to html
							atomcounter++;
							setHtml += '<li>';
							if($(this).children('title').length>0&&feedOpt.getItemTitle) {
								var itemTitle = $(this).children('title').text();
								setHtml += '<b>'+itemTitle+'</b>';
							}
							setHtml += '<div class="minimeFeedContent">';
							if($(this).children('updated').length>0&&feedOpt.getItemDate) {
								var itemDate = $(this).children('updated').text();
								if(feedOpt.dateMode!='default') {
									itemDateForm = convertDate(itemDate);
									setHtml += '<div class="minimeFeedDate">'+itemDateForm+'</div>';
								} else {
									setHtml += '<div class="minimeFeedDate">'+itemDate+'</div>';
								}
							}
							if($(this).children('summary').length>0&&feedOpt.getItemSummary) {
								var itemSummary = $(this).children('summary').text();
								setHtml += '<div class="minimeFeedText">'+itemSummary+'</div>';
							}
							if($(this).children('description').length>0&&feedOpt.getItemDescription) {
								var itemDescription = $(this).children('description').text();
								setHtml += '<div class="minimeFeedText">'+itemDescription+'</div>';
							}
							if($(this).children('id').length>0&&feedOpt.getAtomId) {
								var atomItemId = $(this).children('id').text();
								setHtml += '<div class="minimeFeedAtomId">'+atomItemId+'</div>';
							}
							if($(this).children('link').length>0&&feedOpt.getItemLink) {
								var itemLink = $(this).children('link:first').attr('href');
								setHtml += '<a href="'+itemLink+'" target="_blank">'+feedOpt.nextLinkText+'</a>';
							}
							setHtml += '</div>';
					  		setHtml += '</li>';
					  		// stopped
					  		if(atomcounter==feedOpt.limit) {
					  			return false;
					  		}
						});
						setHtml += '</ul>';
				}
				// wrong xml
				if($(xml).children('rss').length==0&&$(xml).children('feed').length==0) {
					setHtml +=  feedOpt.wrongXmlText;	
				}
				$(selected).append(setHtml);
				if(typeof callbackFunc == 'function'){
					callbackFunc.call(this, xml);
				}
			},
			// Error Handling
			error: function (xhr, status, error) {
				if(xhr.statusText=='timeout') {
					setHtml +=  feedOpt.timeoutText;
				}
				if(xhr.statusText=='error') {
					setHtml +=  feedOpt.errorText;
				}
				if(xhr.statusText=='notmodified') {
					setHtml +=  feedOpt.notModifiedText;
				}
				if(xhr.statusText=='parsererror') {
					setHtml +=  feedOpt.parserErrorText;
				}
				$(selected).append(setHtml);
		    }
		});
		
		function convertDate(date) {
			var getdate = new Date(date);
			var year = getdate.getFullYear(); // 2001
			var jmonth = getdate.getMonth(); // 0-11
			var month = Number(jmonth) + 1; // 1-12
			var day = getdate.getDate(); // 1-31
			
			var zmonth = ''+month;
			if(zmonth.length==1) {
				var zmonth = '0'+zmonth;
			} // 01-12
			
			var zday = ''+day;
			if(zday.length==1) {
				var zday = '0'+zday;
			} // 01-31
						
			var wday = getdate.getDay(); // 0-6
			
			var hour = getdate.getHours(); // 0-23
			var min = getdate.getMinutes(); // 0-59
			var sec = getdate.getMilliseconds(); // 0-59
			
			var zhour = ''+hour;
			if(zhour.length==1) {
				var zhour = '0'+zhour;
			} // 01-23
			
			var zmin = ''+min;
			if(zmin.length==1) {
				var zmin = '0'+zmin;
			} // 01-59
			
			var zsec = ''+sec;
			if(zsec.length==1) {
				var zsec = '0'+zsec;
			} // 01-59
			
			var dlist = feedOpt.dayList.split('|');
			var mlist = feedOpt.monthList.split('|');
			
			var dayname = dlist[wday]; // Monday
			var monthname = mlist[jmonth]; // May
			/*
			var monthend = new Date(year, month+1, 0);
			var lastday = monthend.getDate(); // 28-31 */
			
			var retdate = feedOpt.dateMode;
			retdate = retdate.replace('Y', year);
			retdate = retdate.replace('m', zmonth);
			retdate = retdate.replace('d', zday);
			retdate = retdate.replace('H', zhour);
			retdate = retdate.replace('i', zmin);
			retdate = retdate.replace('s', zsec);
			
			retdate = retdate.replace('n', month);
			retdate = retdate.replace('j', day);
			retdate = retdate.replace('G', hour);
			
			retdate = retdate.replace('F', '[MN]');
			retdate = retdate.replace('l', '[DN]');
			
			retdate = retdate.replace('[MN]', monthname);
			retdate = retdate.replace('[DN]', dayname);
			return retdate;
		}
	}
	
jQuery.fn.miniFeed = function (feedurl, options, callbackFunc) {
	$(this).minimeFeed(feedurl,options,callbackFunc);
}
