if (typeof(jQuery) != "undefined") {

function makeClickableLinks(text) {
	text = text.replace(/(([^href="|href='|>])((f|ht){1}t(p|ps){1}:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/\/=;]+)/g,
	 '<a href="$1">$1</a>');
	text = text.replace(/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=;]+)/g,
	 '$1<a href="http://$2" rel="external">$2</a>');
	text = text.replace(/([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/g,
	 '<a href="mailto:$1">$1</a>');
	return text;
}

function cropString(string,chars) {
	if (!chars) chars = 250;
	// Remove tags from the string
	var untagged_str = string.replace(/<.*?>/gi,'');
	var str_len = untagged_str.length;
	if (chars < str_len) {
		// If the untagged string is too long, set the target length to the closest word and leave room for an ellipsis
		var target_len = chars-3;
		while (untagged_str.charAt(target_len) != " ") target_len--;
		// Parse it into text and tags
		var strings = new Array();
		var start = 0;
		var end = 0;
		while (end < string.length) {
			if (string.charAt(end) == "<") {
				strings[strings.length] = string.substring(start,end);
				start = end;
				end++;
			} else if (string.charAt(end) == ">") {
				strings[strings.length] = string.substring(start,end+1);
				end++;
				start = end;
			} else end++;
		}
		strings[strings.length] = string.substring(start);
		// Trim backwards from the last segment
		var depth = 0;
		while (str_len > target_len && strings) {
			// Check whether the last segment is text or tag
			if (strings[strings.length-1].charAt(0) == '<' && strings[strings.length-1].charAt(strings[strings.length-1].length-1) == '>') {
				// Tag
				if (strings[strings.length-1].charAt(1) == '/') {
					// Closing tag - delete it and increase depth
					strings.splice(strings.length-1,1);
					depth++;
				} else {
					// Opening tag - delete it and decrease depth
					strings.splice(strings.length-1,1);
					depth--;
				}
			} else {
				// Text
				var last_len = strings[strings.length-1].length;
				if (last_len <= str_len - target_len) {
					// Delete the last segment if all characters need to be removed
					strings.splice(strings.length-1,1);
					str_len -= last_len;
				} else {
					// Otherwise, trim part of the segment
					strings[strings.length-1] = strings[strings.length-1].substr(0,strings[strings.length-1].length-str_len+target_len);
					str_len += target_len - str_len;
				}
			}
		}
		// Delete any orphaned tags
		var i = strings.length-1;
		while (depth > 0 && i >= 0) {
			if (strings[i].charAt(0) == '<' && strings[i].charAt(1) != '/' && strings[i].charAt(strings[i].length-1) == '>') {
				strings.splice(i,1);
				depth--;
			}
			i--;
		}
		// Reassemble the string and add an ellipsis
		string = strings.join('')+"...";
	}
	return string;
}

function formatDate(string) {
	var date = new Date(string); // parse the date into a unix timestamp
	var m = date.getMonth();
	var months = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	var d = date.getDate();
	var y = date.getFullYear();
	var mer = "AM";
	var hr = date.getHours();
	if (hr == 0) {
		hr = 12;
	} else if (hr == 12) {
		mer = "PM";
	} else if (hr > 12) {
		hr -= 12;
		mer = "PM";
	}
	var min = date.getMinutes();
	if (min < 10) min = "0" + min;
	return months[m]+" "+d+", "+y+", "+hr+":"+min+" "+mer; // return formatted string: Mon dd, yyyy, hh:mm AM
}

function getFeed (el, url, format, articles, chars) {
	if (!articles) articles = -1;
	if (!chars) chars = 250;
	$.ajax({
      type: "GET",
		url: url,
		dataType: "xml",
		cache: false,
		success: function(xml) {
			var content = $('<div>');
			content.hide().insertBefore('#'+el+">p.loading");
			$('#'+el+">p.loading").fadeOut('fast',function(){ $(this).remove(); });
			switch (format) {
				case 'rss':
					$(xml).find('item').each(function(){
						if (articles != 0) {
							var title = $(this).find('title').text();
							var link = $(this).find('link').text();
							var desc = $(this).find('description').text();
							var date = $(this).find('pubDate').text();
							date = formatDate(date);
				 			var article = $('<article>').append('<h2><a href="'+link+'" rel="external">'+title+'</a></h2><time pubdate>'+date+'</time><p>'+makeClickableLinks(cropString(desc,chars))+'</p>');
				 			article.find('a').click(function(e){
				 				e.preventDefault();
								window.open(this.href);
							});
							article.appendTo(content);
				 			articles--;
				 		}
					});
					break;
				case 'twitter':
					$(xml).find('item').each(function(){
						if (articles != 0) {
							var link = $(this).find('link').text();
							var desc = $(this).find('description').text().substr(13);
							var date = $(this).find('pubDate').text().substr(0,22);
				 			date = formatDate(date);
				 			var article = $('<article>').append('<h2><a href="'+link+'" rel="external"><time pubdate="pubdate">'+date+'</time></a></h2><p>'+makeClickableLinks(cropString(desc,chars))+'</p>');
				 			article.find('a').click(function(e){
				 				e.preventDefault();
								window.open(this.href);
							});
							article.appendTo(content);
				 			articles--;
				 		}
					});
					break;
				case 'blog':
					$(xml).find('item').each(function(){
						if (articles != 0) {
							var title = $(this).find('title').text();
							var link = $(this).find('link').text();
							var desc = $(this).find('description').text();
							var date = $(this).find('pubDate').text().substr(0,22);;
				 			date = formatDate(date);
				 			var article = $('<article>').append('<h2><a href="'+link+'" rel="external">'+title+'</a></h2><time pubdate="pubdate">'+date+'</time><p>'+makeClickableLinks(cropString(desc,chars))+'</p>');
				 			article.find('a').click(function(e){
				 				e.preventDefault();
								window.open(this.href);
							});
							article.appendTo(content);
				 			articles--;
				 		}
					});
					break;
				default:
					break;
			}
			if (content.is(':empty')) content.append("<p>No articles are available at this time. Please try again later.</p>")
			content.fadeIn();
		},
		error: function(e,status,eObj) { $('#'+el+">p.loading").text("This feed is currently unavailable. Please try again later."); }
	});
}

$(document).ready(function(){
	$(".feed").each(function(){
		var url = $(this).data('url');
		if (url.substr(0,4) == "http") url = "/scripts/proxy.php?url="+url;
		if ($(this).attr('id') == 'twitter_feed') getFeed($(this).attr('id'), url, $(this).data('format'), 3, 200); // don't trim Twitter feeds
		else getFeed($(this).attr('id'), url, $(this).data('format'), 3, 100); // trim other feeds to match Twitter
	});
});

}
