function Calendar(cM,cH,cDW,cD,brdr,efile){
	this.debug=false;
	this.monthclass=cM;
	this.headclass=cH;
	this.dowclass=cDW;
	this.dayclass=cD;
	this.border=brdr;
	if (efile!=""){
	this.eventfile=efile;
	//	this.events=this.getevents();
		this.getevents();
	}
}
Calendar.dim=[31,0,31,30,31,30,31,31,30,31,30,31];
Calendar.mn=['January','February','March','April','May','June','July','August','September','October','November','December'];
Calendar.prototype.init=function(evt){
		var cdate=new Date();
		this.month=cdate.getMonth()+1;
		this.year=cdate.getFullYear();
		if (!this.div){
			this.div=document.getElementById('cal_pos');
			if (!this.div) alert('cal_pos not found');
		}
			this.showmonth();
		var elem=document.getElementById('monthselect');
		elem.onchange=function(event){cal.switch_month(event)};
		elem.selectedIndex=this.month-1
}
Calendar.prototype.showmonth=function(){
	this.calstring=this.buildcal();
	this.div.innerHTML=this.calstring;
	}
Calendar.prototype.switch_month=function(evt){
		evt=(evt) ? evt :((event)?event:null);
		if (evt){
			var elem=(evt.target)?evt.target: ((evt.srcElement)?evt.srcElement:null);
			if (elem){
				elem=(elem.nodeType==1||elem.nodeType==9)?elem:
					elem.parentNode;
				}
			}
	this.month=elem.selectedIndex+1;
	this.calstring=this.buildcal();
	this.showmonth();
}
Calendar.prototype.buildcal=function(){
	var oD = new Date(this.year, this.month-1, 1); //DD replaced line to fix date bug when current day is 31st
	oD.od=oD.getDay()+1; //DD replaced line to fix date bug when current day is 31st
	Calendar.dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
	var t='<div class="'+this.monthclass+'"><table class="'+this.monthclass+'" cols="7" cellpadding="0" border="'+this.border+'" cellspacing="0"><tr align="center">';
	t+='<td colspan="7" align="center" class="'+this.headclass+'">'+Calendar.mn[this.month-1]+' - '+this.year+'</td></tr><tr align="center">';
	for(s=0;s<7;s++)t+='<td class="'+this.dowclass+'">'+"SMTWTFS".substr(s,1)+'</td>';
	t+='</tr><tr align="center">';
	var xt;
	for(i=1;i<=42;i++){
		var x=((i-oD.od>=0)&&(i-oD.od<Calendar.dim[this.month-1]))? i-oD.od+1 : '&nbsp;';
		xt=this.eventstoday(x);
		//xt='here';
		t+='<td class="'+this.dayclass+'">'+xt+'</td>';
		if(((i)%7==0)&&(i<36)){
			t+='</tr><tr align="center">';
		}
	}
	return t+='</tr></table></div>';

}
Calendar.prototype.getevents=function(){
	var xmlDoc=XML.load(this.eventfile);
	this.parseEvents(xmlDoc);
};
Calendar.prototype.parseEvents=function(xmlDoc){
	if(xmlDoc!=null){
		var y=xmlDoc.getElementsByTagName("calendar");
		var year=y[0].getAttribute("year");
		var x=xmlDoc.getElementsByTagName("event");
		var evnts=new Array(x.length);
		var months=y[0].getElementsByTagName("month");
		var nvnts=0;
		for (i=0;i<months.length;i++){
			// get data for event
			//get month first
			var month=months[i].getAttribute("month");
			var events=months[i].getElementsByTagName("event");
			for (j=0;j<events.length;j++){
				var strtday=new Date();
				var title=events[j].getElementsByTagName("title")[0].childNodes[0].nodeValue;
				var day=events[j].getElementsByTagName("day")[0].childNodes[0].nodeValue;
				strtday.setFullYear(year,month-1,day);
				strtday.setHours(0,0,0,0);
				var numdays=events[j].getElementsByTagName("numdays")[0].childNodes[0].nodeValue;
				endday=this.adddate(strtday,numdays-1);
				var time=events[j].getElementsByTagName("time")[0].childNodes[0].nodeValue;
				var dress=events[j].getElementsByTagName("dress")[0].childNodes[0].nodeValue;
				var link=events[j].getElementsByTagName("link")[0].childNodes[0].nodeValue;
				evnts[nvnts++]=new this.dta(title,strtday,endday,time,dress,link);
			}
		}
		this.events=evnts;
		return;
	}
		alert("file not opened");
		this.events=null;
		return;
};
Calendar.prototype.dta=function (title,strtday,endday,time,dress,link){
	this.title=title;
	this.startday=strtday;
	this.endday=endday;
	this.time=time;
	this.dress=dress;
	this.link=link;
//		alert("title:" + title + " startday:" + strtday + " endday:" + endday +
//			" time:" + time + " link:" + link);
}
Calendar.prototype.adddate=function(cdate,days){
	var fdate=new Date();
	fdate.setTime(cdate.getTime()+days*86400000);
	return (fdate);
}
Calendar.prototype.eventstoday=function(d){
	var today=new Date();
	var haveevents=false;
	var link;
	var time;
	var dress;
	var xt;
	var curdate=new Date(this.year,this.month-1,d);
	if(curdate.getFullYear()==today.getFullYear() && curdate.getMonth()==today.getMonth() 
		&& curdate.getDate()==today.getDate()){
				xt='<span class="caltoday">'+d;
			}
		else{
			xt='<span class="caldays">'+d +'<br>';
		}
	for(j=0;j<this.events.length;j++){
		if (curdate>=this.events[j].startday && curdate<=this.events[j].endday){
			if (this.events[j].time=="NA"){
				time="";
			}
			else {
				time=this.events[j].time;
			}
			if (this.events[j].dress=="NA"){
				dress="";
			}
			else {
				dress='('+this.events[j].dress+') ';
			}
			if (this.events[j].link=="NA"){
				xt+='<span class="caltext">'+this.events[j].title+dress+time+'<br>';
			}
			else {
				xt+='<br><a href="'+this.events[j].link+'">'+this.events[j].title+dress+time+'</a></span><br>';
			}

			haveevents=true;
		}
	}
	return(xt+'</span>');
}
Calendar.loadxml=function(xmlfile){
	var xmldoc;
	if(window.XMLHttpRequest){
		xmldoc = new window.XMLHttpRequest();
		xmldoc.open("GET",xmlfile,false)
		xmldoc.send("")
		return xmldoc.responseXML;
	}
	else if(window.ActiveXObject){
		xmldoc = new ActiveXObject("Microsoft.XMLDOM");
		xmldoc.async = false;
		xmldoc.load(xmlfile)
		return xmldoc
	} else{
		alert("XML loading not supported.");
		return null;
	}
};
var cal=new Calendar("calmain", "calmonth", "caldaysofweek", "caldays", 1,"data/2009_event_list.xml");
window.onload=function(event){cal.init(event)}