	nowdate = new Date();
	
function timedpops(kary) {
	var lead = 8;
	var trail = 365;
	var j = 0;
	var notedate = new Date();
	for (var i=0;i<kary.length;i++) {
		if (timednote(kary[i])){
			//a timed note
			notedate = stringToDate(piece(0,kary[i]));
			var content = piece(1,kary[i]);
			var thislead = lead;
			if (!piece(2,kary[i])==''){thislead=eval(piece(2,kary[i]))}
			var thistrail = trail;
			if (!piece(3,kary[i])==''){thistrail=eval(piece(3,kary[i]))}
			if (relativeDate(notedate,0-thislead)<=nowdate && nowdate<=relativeDate(notedate,0+thistrail)){prekeys[j] = content;j++}
		} else {
			//an untimed note
			prekeys[j] = kary[i];
			j++;;
		}
	}
	return true;
}


function buildAugArray(givenArray) {
	var augarray = new Array(givenArray.length);
	for (var i=0;i<givenArray.length;i++) {
		if (i==0) {
			augarray[i] = '----';
		} else {
			augarray[i] = givenArray[i,0]+' ('+givenArray[i,1]+')';
		}
	}
	return augarray;
}

function splitArray(givenArray) {
	var sa = new Array(givenArray.length);
	for (var i=0;i<givenArray.length;i++) {
		var n = givenArray[i].split(',').length;
		sa[i] = new Array(n);
		sa[i] = givenArray[i].split(',');
	}
	return sa;
}

function addinitials(givenArray) {
	var sa = new Array(givenArray.length);
	sa = givenArray;
	for (var i=0;i<givenArray.length;i++) {
		var s = givenArray[i][0][0] + givenArray[i][1][0]
		sa[i].unshift(s);
	}
	return sa;
}

function the20name(n){
	return escape(ta[n][1]+" "+ta[n][2])
}

function capitalize(str){
	//returns string with first letter capitalized
	return str.charAt(0).toUpperCase() + str.substr(1)
}

function stringToDate(s){
	//expects string in format "m/d" or "m/d/y"
	var arr = s.split("/")
	if (arr.length == 2){
		arr[arr.length] = nowdate.getFullYear();
	}
	var nd = new Date(arr[2],arr[0]-1,arr[1]);
	return nd
}

function dateToString(dt){
	var m = 1+dt.getMonth();
	var d = dt.getDate();
	//var y = dt.getFullYear();
	return m+'/'+d;
}

function relativeDate(td,offset){
	var millisecOffset = offset * 24 * 60 * 60 *1000
	var nd = new Date(td.valueOf()+millisecOffset)	
	return nd
}

function piece(n,str){
	var rez = '';
	var arr = str.split('|') //we are splitting on the pipe character
	if (arr.length>n){rez = arr[n]}
	return rez
}

function timednote(str){
	return (!piece(1,str)=='')
}

function notescode(flag){
	//flag of 0 yields formatted notescode, flag of 1 yields array of in-range note contents.
	var rez = '';
	var notedate = new Date();
	var evarray = new Array();
	for (k=0;k<annc.length;k++) {
		if (annc[k]==[]) {
			//skip
		} else {
			var headerdone = false;
			var header = piece(0,annc[k][0])
			var lead = piece(1,annc[k][0])
			if (lead=='') {lead=defaultlead}
			var trail = piece(2,annc[k][0])
			if (trail==''){trail=defaulttrail}
			
			for (i=1;i<annc[k].length;i++) {
				if (!annc[k][i]==''){
					if (timednote(annc[k][i])){
						//a timed note
						notedate = stringToDate(piece(0,annc[k][i]));
						var content = piece(1,annc[k][i])
						
						var thislead = lead
						if (!piece(2,annc[k][i])==''){thislead=eval(piece(2,annc[k][i]))}
						var thistrail = trail
						if (!piece(3,annc[k][i])==''){thistrail=eval(piece(3,annc[k][i]))}
						if (relativeDate(notedate,0-thislead)<=nowdate && nowdate<=relativeDate(notedate,0+thistrail)){
							if (!headerdone){
								rez = rez +'<h3>'+header+':</h3><p style="color:maroon">'
								headerdone = true;
							}
							rez=rez+'•'+content+' <span style="color:lightgrey">('+piece(0,annc[k][i])+')</span><br>';
							evarray[evarray.length] = content;
						}
					} else {
						//an untimed note
						if (!headerdone) {
							rez = rez +'<h3>'+header+':</h3><p style="color:maroon">'
							headerdone = true;
						}
						rez=rez+'•'+piece(0,annc[k][i])+'<br>';
						evarray[evarray.length] = piece(0,annc[k][i])
					}

				}
			}
			if (headerdone) {rez = rez+'</p>'}
		}
	}
	//alert(rez)
	if (flag==0) {return rez} else {return evarray}
	
}

function splitArrayOn(givenArray,delim) {
	var sa = new Array(givenArray.length);
	for (var i=0;i<givenArray.length;i++) {
		var n = givenArray[i].split(delim).length;
		sa[i] = new Array(n);
		sa[i] = givenArray[i].split(delim);
	}
	return sa;
}

function eventspinner() {
	var ev = new Array();
	ev = splitArrayOn(notescode(1),myEVdelimiter);
	if (ev.length==1) {
		// expects the 'no events' line at index 0
		document.write(eventstring(ev,0));
	} else {
		for (var i=1; i<ev.length; i++) {
			document.write(eventstring(ev,i));
		}
	}
}
function eventstring(ev,i) {
	//suppose i is current event index
	//ev is array of events
	var s = '<p class="event">';
	var n = ev[i].length
	if (n>idate){if (!ev[i][idate]==""){
		s = s + '<span class="date">&bull; '+ev[i][idate]+'</span>'
	}}
	if(n>itime){if (!ev[i][itime]==""){
		s = s + ' - <span class="time">'+ev[i][itime]+'</span>'
	}}
	if(n>iinstitution){if (!ev[i][iinstitution]==""){
		var h="#";
		if(n>ilink){if (!ev[i][ilink]==""){
			h = ev[i][ilink];
		}}
		if (h=="#") {
			s = s + ', <span class="institution">'+ev[i][iinstitution]+'</span>'
		} else {
			s = s + ', <a class="ilink" href="'+h+'"><span class="institution">'+ev[i][iinstitution]+'</span></a>'
		}
	}}
	if(n>iplace){if (!ev[i][iplace]==""){
		s = s + ' - <span class="place">'+ev[i][iplace]+'</span>'
	}}
	s = s +"."
	if(n>inote){if (!ev[i][inote]==""){
		s = s + ' <span class="note">'+ev[i][inote]+'</span>'
	}}
	s = s + '</p>'
	return s
}

function checkparams() {
	if (location.search.length==0) {
		return false;
	} else {
		return loadparams(location.search);
	}
}

<!-- This is a white-space trimmer from http://www.xs4all.nl/~sbpoley/webmatters/formval.html -->
function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '');
}