function init(id,channel,item,maxitem,maxlen,targetid,xmlicon)
{
	if (!document.getElementById(targetid))
		return;
	var myReq = new Request();
	var display = {
		channel_title: channel.split('+')[0],	
		channel_descr: channel.split('+')[1],
		item_descr: item.split('+')[0],
		item_date: item.split('+')[1],
		ilimit: item.split('+').length==3?item.split('+')[2]:0,
		maxlen: maxlen,
		maxitem: maxitem,
		xmlicon: xmlicon
	};
	var myhdl = {
		onComplete: function(xml,q) {
			var target = document.getElementById(targetid);
			var html = '';
			if (id == '1203')
				html += calendar_events(xml,display);
			else
			{
				html += wa_style_channel(
					xml,display.channel_title,display.channel_descr
				);
				html += wa_style_items(
					xml,display.item_descr,display.item_date,
					display.maxlen,display.maxitem,id,xmlicon,
					display.ilimit
				);
			}
			target.innerHTML = html;
		}
	};
	/* new method of cached xml files on delphi */
    
    // because the homepage events are actually cal entries (but are used like 
    // regular announcements), we now have to point to the calendar xml feed
    if (id == '1203')
        myReq.init('/~dadt/webalerts/rss/webcal/'+id+'.xml');
    else
        myReq.init('/~dadt/webalerts/rss/'+id+'.xml');
	myReq.loadXMLDoc(myhdl,'?gid='+id+'&rand='+Math.random());
}

function wa_style_channel(xml,show_title,show_descr)
{
	var html = '';
	var channel = xml.getElementsByTagName('channel')[0];
	var image = xml.getElementsByTagName('image')[0];
	var descr = null;
	if (show_title != 'none' || show_descr != 'none')
		html = '<p>';
	if (show_title != 'none' && channel)
	{
		/* create a hash of all the tag values */
		var keys = new Array('title','link','description');
		var lookups = wa_general_xmllookup(channel,keys);
		var vlook = lookups[0];

		if (vlook.description instanceof Array)
			descr = vlook.description[0];
		else
			descr = vlook.description;

		if (vlook.title instanceof Array)
			vlook.title = vlook.title[0];
		if (vlook.link instanceof Array)
			vlook.link = vlook.link[0];

		html += '<span class="rss_channel_title">';
		html += '<a class="rss_channel_title" href="'+vlook.link+'"'+
				' target="_self">'+vlook.title+'</a>';
		html += '</span>';
		html += '<br />';
	}
	if (show_descr != 'none' && channel)
	{
		/* create a hash of all the tag values */
		var keys = new Array('url','link','title');
		var lookups = wa_general_xmllookup(image,keys);
		var vlook = lookups[0];

		if (vlook.title instanceof Array)
			vlook.title = vlook.title[0];
		if (vlook.url instanceof Array)
			vlook.url = vlook.url[0];
		if (vlook.link instanceof Array)
			vlook.link = vlook.link[0];

		html += '<a href="'+vlook.link+'">';
		html += '<img src="'+vlook.url+'" alt="'+vlook.title+'"'+
				' width="144" height="27" border="0" align="right" />';
		html += '</a>';
		html += '<span class="rss_channel_description">'+descr+'</span>';
		html += '</p>';
	}
	return html;
}

/**** BEGIN - main xml parsing functions ****/

function wa_general_xmllookup_create(element)
{
	var attrtmp = {};
	var elementval = '';
	/* return blank if no element */
	if (!element)
		return new Array(2);
	/* check for attributes */
	if (element.attributes)
	{
		var attr = element.attributes;
		for (var k=0; k < attr.length; k++)
		{
			attrtmp[attr[k].nodeName] = attr[k].nodeValue;
		}
	}
	/* check for node value */
	if (element.firstChild)
		elementval = element.firstChild.nodeValue;	
	return new Array(elementval,attrtmp);
}

function wa_general_xmllookup(item,keys)
{
	var vlookup = {};
	var alookup = {};
	for (var i=0; i < keys.length; i++)
	{
		var key = keys[i];
		var elements = item.getElementsByTagName(key);
		
		// EDIT: Andrew C. 
		// Anyway, "they" wanted full sized images, so rather than tack on an extra enclosure, I 
		// did it properly with a namespace. Of course Firefox won't get elements with namespaces 
		// so I have to do this to get it to add to this crazy hash thing
		//if(key == 'webalerts:fullimg') 
		//{
		//   elements = item.getElementsByTagNameNS('https://jedi.tcnj.edu/webteam/webalerts/info.html', 'fullimg');
		//}
		if (elements.length == 1)
		{
			var arreturn = wa_general_xmllookup_create(elements[0]);
			vlookup[key] = arreturn[0];
			alookup[key] = arreturn[1];
		}
		else if (elements.length > 1)
		{
			vlookup[key] = new Array();
			alookup[key] = new Array();
			for (var j=0; j < elements.length; j++)
			{
				var arreturn = wa_general_xmllookup_create(elements[j]);
				vlookup[key].push(arreturn[0]);	
				alookup[key].push(arreturn[1]);	
			}
		}
		else
		{
	    }
	}
	return new Array(vlookup,alookup);
}

function wa_general_set_enclosure(enclosures)
{
	var enclookup = {image:'',audio:''};
	var ireg = /^image/;
	var areg = /^audio/;
	var encs = '';
	if (enclosures instanceof Array)
		encs = enclosures;
	else
		encs = new Array(enclosures);
	/* set up the types */
	for (var i=0; i < encs.length; i++)
	{
		if (encs[i])
		{
			if (ireg.test(encs[i].type))
				enclookup.image = encs[i];
			else if (areg.test(encs[i].type))
				enclookup.audio = encs[i];
		}
	}
	return enclookup;
}

/**** END - main xml parsing functions ****/

/**** BEGIN - main format helper functions ****/

function wa_style_items_format_title_expand(title,link,slook)
{
	var html = '';
	if (slook.maxlen == 0 && !link)
	{
		html += '<a href="#" id="link-'+slook.gid+slook.i
		 + '" onclick="expand(\'hide-\',\'link-\',\'ellipsis-\',\''
		 + slook.gid+slook.i+'\');return false;" onmouseup="'
		 + 'if(this.blur) this.blur()">';
		html += title;
		html += ' (more)</a>';
	}
	else
		html += title;
	return html;
}

function wa_style_items_format_cat(cat)
{
	var html = '';
	if (cat == 'Urgent')
		html = ' style="color: red;"';
	return html;
}

function wa_style_items_format_fullimg(url)
{
	var html = '';
	if(url)
	    html += '<img src="'+url+'" /><br />';
	return html;
}

function wa_style_items_format_title(title,link,cat,descr,guid)
{
	var html = '';
	var style = wa_style_items_format_cat(cat);
	html += '<span class="rss_item_title"'+style+'>';
	if (link)
		html += '<a href="'+link+'">'+title+'</a>';
	//  else
	//	html += title;
    else {
        html += '<a href="javascript:show(\''+guid+'\')">'+title+'</a>';
        html += '<br /><span id="'+guid+'" style="display:none">'+descr;
        html += '<br /><a href="javascript:hide(\''+guid+'\')">hide</a></span>'
    }
	html += '</span>';
	return html;
}

function wa_style_items_format_date(date,pubdate)
{
	var html = '';
	if (date)
	{
		html += '<br /><span class="rss_item_date">';
		html += '<em>'+pubdate+'</em></span>';
	}
	return html;
}

function wa_style_items_format_descrlimit_spacer(descr,len)
{
	var max = descr.length;
	var i = len;
	var space = false;
	while (i < max)
	{
		if (descr.charAt(i) == ' ')
			return i;
		else
			i++;
	}
	return len;
}

/* not sure how to fix this problem 
 * basically if you have a string like
 * 'this is <strong>text text<strong>'
 * and the limit is 20, then it will turn into
 * 'this is <strong>text<span hidden>text<strong><span>'
 * which doesnt parse right as html 
 *
 * one solution might be to close all open tags
 * before the hidden span and then open all closed
 * tags inside the hidden span */
function wa_style_items_format_descrlimit_tag(hidden)
{
//	var re_open = /<[a-z\s=":-']+>/i;
//	var re_close = /<\/[a-z]+>/i;
//	alert(hidden.replace(re_close,''));
	var tmp = '';
	var re_open = /</;
	var re_close = />/;
	//tmp = hidden.replace(re_open,'&lt;');
	//tmp = tmp.replace(re_close,'&gt;');
	//alert(tmp);
	return hidden;
}

function wa_style_items_format_descrlimit(descr,slook)
{
	var html = '';
	if (descr && descr.length > slook.maxlen)
	{
		var mlentmp = slook.maxlen;
		var maxlen = wa_style_items_format_descrlimit_spacer(descr,mlentmp);
		html += descr.substring(0,maxlen);
		var hidden = descr.substring(maxlen,descr.length);
		//hidden = wa_style_items_format_descrlimit_tag(hidden);
		html += '<span id="hide-'+slook.gid+slook.i+'"'
		  + ' style="visibility:hidden;display:none">'
		  + hidden+'</span>';
		if (maxlen == 0)
			html += '<span id="ellipsis-'+slook.gid+slook.i+'"></span>';
		else
		{
			html += '<span id="ellipsis-'+slook.gid+slook.i+'">...</span>';
			html += '&nbsp;(<a href="#" id="link-'+slook.gid+slook.i+'"'
			  + ' onclick="expand(\'hide-\',\'link-\',\'ellipsis-\',\''
			  + slook.gid+slook.i+'\');return false;">more</a>)';
		}
	}
	else
		html += descr;
	return html;
}

function wa_style_items_format_descr(descr,cat,slook)
{
	var html = '';
	var style = wa_style_items_format_cat(cat);
	html += '<br /><span class="rss_item_description"'+style+'>';
	html += wa_style_items_format_descrlimit(descr,slook);
	html += '</span>';
	return html;
}

function wa_style_items_format_audio(encattr)
{
	var html = '';
	if (encattr.url)
		html += '&nbsp;[<a href="'+encattr.url+'">Play Audio</a>]';
	return html;
}

function wa_style_items_format_img(encattr,link,slook)
{
	var html = '';
	if (slook.maxlen != 0 && encattr.url)
	{
		var img = '<img src="'+encattr.url+'" class="imgLeft" />';
		if (link)
			html += '<a href="'+link+'">'+img+'</a>';
		else
			html += img;
	}
	return html;
}

function wa_style_items_format_icons_detectenc(xml)
{
	var encs = xml.getElementsByTagName('enclosure');
	var areg = /^audio/;
	for (var i = 0; i < encs.length; i++)
	{
		if (areg.test(encs[i].getAttribute('type')))
			return 1;
	}
	return 0;
}

function wa_style_items_format_icons(slook,xml)
{
	var html = '';
	if (!slook.xmlicon || slook.xmlicon == 'none')
		return '';
	var iconlink = 'http://www.tcnj.edu/~it/web/webalerts/media';
	var rsslink = 'http://www.tcnj.edu/~dadt/webalerts/rss';
	html += '<a href="'+rsslink+'/'+slook.gid+'.xml">';
	html += '<img src="'+iconlink+'/subscribe_rss.gif" alt="rss icon" '
	  + 'border="0" align="absmiddle" />';
	html += '</a>&nbsp;';
	/* query the xml to see if there are any
	 * enclosures with type="audio/*" */
	if (wa_style_items_format_icons_detectenc(xml))
	{
		html += '<a href="'+rsslink+'/pod/'+slook.gid+'.xml">';
		html += '<img src="'+iconlink+'/subscribe_pod.gif" alt="pod icon" '
		  + 'border="0" align="absmiddle" />';
		html += '</a>&nbsp;';
	}
	/* remove itunes link for now
	 *html += '<a href="'+rsslink+'/pod/'+slook.gid+'.xml">';
	 *html += '<img src="'+iconlink+'/itunes.gif" alt="itunes icon" '
	 *  + 'border="0" align="absmiddle" />';
	 *html += '</a>';
	 */
	return html;
}

/**** END - main format helper functions ****/

/**** BEGIN - main format functions ****/

function wa_style_items_format_list(vlook,alook,date)
{
	var html = '';
	var enclook = wa_general_set_enclosure(alook.enclosure);
	html += '<li class="rss_item_link">';
	html += wa_style_items_format_title(
		vlook.title,vlook.link,vlook.category,vlook.description,vlook.guid
	);
	html += wa_style_items_format_audio(enclook.audio);
	html += wa_style_items_format_date(date,vlook.pubDate);
	html += '</li>';
	return html;
}

function wa_style_items_format_para(vlook,alook,slook,date)
{
	var html = '';
	var enclook = wa_general_set_enclosure(alook.enclosure);
	
	html += wa_style_items_format_fullimg(vlook['webalerts:fullimg']);
	
	var title = wa_style_items_format_title(
		vlook.title,vlook.link,vlook.category,vlook.description,vlook.guid
	);
	if (slook.maxlen == 0)
		html += '<li class="rss_item_link">';
	else
	{
		html += '<div style="position:relative;">';
		html += '<p>';
	}
	html += wa_style_items_format_img(enclook.image,vlook.link,slook);
	
	html += wa_style_items_format_title_expand(
		title,vlook.link,slook
	);
	html += wa_style_items_format_descr(
		vlook.description,vlook.category,slook
	);
	html += wa_style_items_format_audio(enclook.audio);
	html += wa_style_items_format_date(date,vlook.pubDate);
	if (slook.maxlen == 0)
		html += '</li>';
	else
	{
		html += '</p>';
		html += '<div class="clear"></div>';
		html += '</div>';
	}
	return html;
}

function wa_style_items_format(vlook,alook,slook,descr,date)
{
	var html = '';
	if (date == 'none')
	{
		/* if: title in list, no descr, no date*/
		/* else if: title and descr in paragraphs, no date*/
		if (descr == 'none')
			html += wa_style_items_format_list(vlook,alook,0);
		else if (descr == 'descp')
			html += wa_style_items_format_para(vlook,alook,slook,0);
	}
	else if (date == 'date')
	{
		/* if: title in list, no descr, with date */
		/* else if: title and descr in paragraphs, with date */
		if (descr == 'none')
			html += wa_style_items_format_list(vlook,alook,1);
		else if (descr == 'descp')
			html += wa_style_items_format_para(vlook,alook,slook,1);
	}
	return html;
}

/**** END - main format functions ****/

function wa_style_items(xml,descr,date,maxlen,maxitem,gid,xmlicon,ilimit)
{
	var items = xml.getElementsByTagName('item');
	var len = 
		items.length > maxitem && maxitem != -1 ?
			maxitem 
		: 
			items.length;
	var ul = 
		descr == 'none' || descr == 'title' || maxlen == 0 ? 
			'<ul class="rss_items">' 
		: 
			'';	
	var state_lookup = {
		maxlen:maxlen, maxitem:maxitem, gid:gid, xmlicon:xmlicon, i:''
	};
	var html = '';
	/* stores the original view for items */
	var descr_orig = descr;
	/* go through the items of the xml */
	for (var i = 0; i < len; i++,ilimit--)
	{
		/* this allows a mixed view, so
		 * ilimit is how many images/descrs
		 * will be shown, followed the normal
		 * formatting specified to the init() */
		if (ilimit > 0)
			descr = 'descp';
		else
		{
			descr = descr_orig;
			html += ul;
			ul = '';
		}
		/* set the i on the state_lookup */
		state_lookup.i = i;
		/* tags to retrieve from item */
		var keys = new Array(
			'title','description','link','author','category',
			'guid','pubDate','enclosure','webalerts:fullimg'
		);
		/* create a hash of all the tag values */
		var lookups = wa_general_xmllookup(items[i],keys);
		var vlook = lookups[0];		// tag values
		var alook = lookups[1];		// attributes
		html += wa_style_items_format(vlook,alook,state_lookup,descr,date);
	}
	html += descr == 'none' || descr == 'title' || maxlen == 0 ? 
		'</ul>' 
	: 
		'';	
	html += wa_style_items_format_icons(state_lookup,xml);
	return html;
}

function d_general_xmltohash(xml,keylist)
{

	var xmltable = {};
	for (var i=0; i < keylist.length; i++)
	{
		var node = xml.getElementsByTagName(keylist[i]);
		if (node[0] && node[0].firstChild)
			xmltable[keylist[i]] = node[0].firstChild.nodeValue;
		else
			xmltable[keylist[i]] = '';
	}
	return xmltable;
}

function d_general_cdata(caldata,guid)
{
	var keys = new Array(
		'datebegin','dateend','timebegin','timeend',
		'contactname','contactphone','contactemail',
		'location','sponsor','repeat'
	);
	var xml = '';
	if (window.ActiveXObject)
	{
		xml = new ActiveXObject("Microsoft.XMLDOM") 
		xml.async="false"; 
		xml.loadXML(caldata); 
	}
	else
		xml = (new DOMParser()).parseFromString(caldata, "text/xml");
	var cdata = d_general_xmltohash(xml,keys);
	// set the id of the alert
	cdata.id = guid;
	// set the value to sort by
	var re = /(\d+):(\d+) (AM|PM)/i;
	var matches = re.exec(cdata.timebegin);
	if (matches && matches.length == 4)
		cdata.sorttime = d_general_mil(matches[1],matches[2],matches[3]);
	return cdata;
}

function d_general_mil(hour,min,ampm)
{
	var milhour = '';
	if (hour == 12 && ampm.toUpperCase() == "AM")
		milhour = 0;
	else if (hour != 12 && ampm.toUpperCase() == "PM")
		milhour = parseInt(hour)+12;
	else
		milhour = hour;
	return ''+milhour+min;	
}

function genonclick(xml,eid,target,vtarget,view,yearmon,day,back)
{
	var html = '';
	var year = yearmon.year;
	var month = yearmon.month;
	var day = day;
	html += 'init('
		+xml+',\''+eid+'\',\''+target+'\',\''+vtarget+'\',\''
		+view+'\','+year+','+month+','+day+',\''+(back?back:'')+'\''
	+')';
	return html;
}

function calendar_events(xml, display)
{
	var items = xml.getElementsByTagName('item');
	var html = "";
	var oldate = new Date();
		
		/* browser test */
		if (navigator.appName == "Microsoft Internet Explorer")
			year = oldate.getYear();
	    else
			year = oldate.getYear()+1900;

	var date = {year: year, month: oldate.getMonth(), day: oldate.getDate()};
	// filter events
	
	currguid = 0;
	for (var i=0,j=0; i < Math.min(items.length, 5); i++)
	{
		
		var xmltable = d_general_xmltohash(items[i],['guid','title','link']);
		var descr_node = items[i].getElementsByTagName('description');
		var descr = '';
		var cdata = '';

		if (descr_node && descr_node.length)
		{
			if (descr_node[0].childNodes.length == 2)
			{
				descr = descr_node[0].childNodes[0].nodeValue;
				cdata = descr_node[0].childNodes[1].nodeValue;
			}
			else
				cdata = descr_node[0].childNodes[0].nodeValue;
		}
			
		if (cdata)
		{
			var calendar_data = d_general_cdata(cdata,xmltable.guid);
				if (currguid != xmltable.guid)
				{
					currguid = xmltable.guid;
					//var onclick = genonclick(
					//'1203',calendar_data.id,'calendar','view','event',
					//{year:date.year,month:date.month},date.day,'week'
					//);
				
					var days = new Array ('Sun.', 'Mon.', 'Tues.', 'Wed.', 'Thurs.', 'Fri.', 'Sat.');
					var mybegin = calendar_data.datebegin.split(/-/);
					var bdate = new Date(mybegin[1]+' '+mybegin[0]+' '+mybegin[2]);
					var myend = calendar_data.dateend.split(/-/);
					var edate = new Date(myend[1]+' '+myend[0]+' '+myend[2]);
					
					if (!mybegin[0])
						html += '<p><span class="rss_item_title"><a href="'+xmltable.link+'">'+xmltable.title+'</a></span></p>';
					else if (mybegin[0] == myend[0] && mybegin[1]==myend[1])
						html += '<p><span class="rss_item_title"><a href="'+xmltable.link+'">'+xmltable.title+'</a></span><br /><span class="rss_item_description"><p><font face="Verdana,Geneva,Arial,sans-serif">'+days[bdate.getDay()]+', '+mybegin[1]+' '+mybegin[0]+'</font></p></span></p>';
					else
						html += '<p><span class="rss_item_title"><a href="'+xmltable.link+'">'+xmltable.title+'</a></span><br /><span class="rss_item_description"><p><font face="Verdana,Geneva,Arial,sans-serif">'+days[bdate.getDay()]+', '+mybegin[1]+' '+mybegin[0]+' - '+days[edate.getDay()]+', '+myend[1]+' '+myend[0]+'</font></p></span></p>';
					
				}

		}
	}
return html+'<br />';
}