jQuery.fn.minimeFeed = function(feedurl, options, callbackFunc) {
	feedOpt = jQuery.extend ({
		/**
		*
		*		 minime RSS and Atom Feed Reader
		*					ver 1.2
		*
		**/
		// Default options
		phpRepeater: "getfeed.php",		// XML - PHP repeater file for cross-domain errors against (Leave blank if extensions)
		timeout: 50000,					// Timeout
		limit: 10,						// Feed item limit
		getFeedTitle: true,				// Feed title visibility
		getItemTitle: true,				// Item title visibility
		getItemDate: true,				// 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
		summaryLengthLimit: false,		// Summary length limit
		getItemDescription: false,		// Item description visibility (only Atom feed)
		descLengthLimit: false,			// Item description length limit
		getItemLink: true,				// Item link visibility
		getAtomId: false,				// Item id visibility (only Atom feed)
		getContent: true,				// Get content in Atom
		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
		loadingMsg: "<img src='preloader.gif' />"			// Loading text or <img />
	}, options);
		
		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;
		
		function getFeedAjax(selected, feedurl, feedOpt, callbackFunc) {
			$(selected).html(feedOpt.loadingMsg);
			return $.ajax({
				type: "GET",
				url: feedurl,
				dataType: "xml",
	 			timeout: feedOpt.timeout,
				success: function(xml) {
					setHtml = '';
					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();
									if(feedOpt.summaryLengthLimit) {
										itemDescription = itemDescription.substr(0, feedOpt.summaryLengthLimit) + "...";
									}
									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();
									if(feedOpt.summaryLengthLimit) {
										itemSummary = itemSummary.substr(0, feedOpt.summaryLengthLimit) + "...";
									}
									setHtml += '<div class="minimeFeedText">'+itemSummary+'</div>';
								}
								if($(this).children('description').length>0&&feedOpt.getItemDescription) {
									var itemDescription = $(this).children('description').text();
									if(feedOpt.descLengthLimit) {
										itemDescription = itemDescription.substr(0, feedOpt.descLengthLimit) + "...";
									}
									setHtml += '<div class="minimeFeedText">'+itemDescription+'</div>';
								}
								if($(this).children('content').length>0&&feedOpt.getContent) {
									var itemContent = $(this).children('content').text();
									setHtml += '<div class="minimeFeedText">'+itemContent+'</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).empty();
					$(selected).append(setHtml);
					if(typeof callbackFunc == 'function'){
						callbackFunc.call(this, xml);
					}
					return true;
				},
				// Error Handling
				error: function (xhr, status, error) {
					setHtml = '';
					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).empty();
					$(selected).append(setHtml);
					return false;
			    }
			});
		}
		
		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;
		}
		
		
		return getFeedAjax(selected, feedurl, feedOpt, callbackFunc);
		
	}
	
jQuery.fn.miniFeed = function (feedurl, options, callbackFunc) {
	$(this).minimeFeed(feedurl,options,callbackFunc);
}
