This Javascript code grabs content from mailman pages fetched using an AJAX request. You will need to include prototype.js.
The code in its current form fetches emails from the mailman archives of the Cambridge University Surfing Association.
Code samples on this website come without any guarantees – use them at your own risk! I am grateful for comments or patches sent to my email address: first name.last name@cl.cam.ac.uk.
var search_back_months_limit = 3;
var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var archive_entry_regex = /\<LI\>\<A HREF\=\"\d*\.html\"\>/gm;
var pattern_id_start = 13;
var pattern_id_length = 6;
var messages_to_display = 10;
var message_regex = /\<H1\>\s*\[CUSA\]\s*(.*?)\s*\<\/H1\>[\s\S]*\<B\>(.*?)\<\/B\>[\s\S]*\<I\>(.*?)\<\/I\>[\s\S]*\<PRE\>\s*([\s\S]*)\s*\<\/PRE\>/m;
function get_archive_url_pattern(year, month)
{
return 'http://www.srcf.ucam.org/pipermail/cusa-main/' + year + '-' + months[month] + '/date.html';
}
function archive_request_success(status_list, url, index, content)
{
var m = content.match(archive_entry_regex);
var url_list = []
if (m != null)
{
var id_list = [];
for (var i = 0; i < m.length; i++)
id_list.push(m[i].substring(pattern_id_start, pattern_id_length + pattern_id_start));
id_list.sort().reverse();
for (var i = 0; i < id_list.length; i++)
url_list.push(url.replace('date.html', id_list[i] + '.html'));
}
status_list[index] = url_list;
test_all_archive_requests_complete(status_list);
}
function archive_request_failure(status_list, url, index)
{
status_list[index] = [];
test_all_archive_requests_complete(status_list);
}
function message_to_html(message_info)
{
return '<h5>' + message_info['title'] + '</h5><p><i>From ' + message_info['author'] + ' on ' + message_info['date_string'] + '</i></p><pre>' + message_info['message'] + '</pre>';
}
function message_display_success(message_display_status, index, content)
{
m = message_regex.exec(content);
message_info = {title : m[1], author : m[2], date_string : m[3], message : m[4]};
message_display_status[index] = message_to_html(message_info);
test_all_message_display(message_display_status);
}
function message_display_failure(message_display_status, index)
{
message_display_status[index] = '';
test_all_message_display(message_display_status);
}
function test_all_archive_requests_complete(status_list)
{
for (var i = 0; i < status_list.length; i++)
if (status_list[i] == undefined)
return;
var message_count = 0;
for (var i = 0; i < status_list.length; i++)
for (var j = 0; j < status_list[i].length; j++)
message_count++;
var displayed_messages = 0;
var message_display_status = [];
message_display_status.length = (message_count < messages_to_display ? message_count : messages_to_display);
for (var i = 0; i < status_list.length; i++)
{
for (var j = 0; j < status_list[i].length; j++)
{
new Ajax.Request(status_list[i][j],
{
method : 'get',
onSuccess : (function(message_display_status, index, transport) {message_display_success(message_display_status, index, transport.responseText); return true;}).bind(this, message_display_status, displayed_messages),
onFailure : (function(message_display_status, index, transport) {message_display_failure(message_display_status, index); return true;}).bind(this, message_display_status, displayed_messages)
});
displayed_messages++;
if (displayed_messages == messages_to_display)
return;
}
}
}
function test_all_message_display(message_display_status)
{
for (var i = 0; i < message_display_status.length; i++)
if (message_display_status[i] == undefined)
return;
for (var i = 0; i < message_display_status.length; i++)
$('news-container').insert({bottom : message_display_status[i]});
}
Event.observe(window, 'load',
function()
{
var d = new Date();
var latest_month = d.getMonth();
var latest_year = d.getFullYear();
var index = 0;
var status_list = [];
status_list.length = search_back_months_limit;
while (index < search_back_months_limit)
{
var url = get_archive_url_pattern(latest_year, latest_month);
if (latest_month-- == 0)
{
latest_month = 11;
latest_year--;
}
new Ajax.Request(url,
{
method : 'get',
onSuccess : (function(status_list, url, index, transport) {archive_request_success(status_list, url, index, transport.responseText); return true;}).bind(this, status_list, url, index),
onFailure : (function(status_list, url, index, transport) {archive_request_failure(status_list, url, index); return true;}).bind(this, status_list, url, index)
});
index++;
}
}
);