function get( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function timeReadable (d)
{
	if (d != undefined) 
	{
		var hrs = d.getHours()%12;
		var hrs = (hrs==0 ? 12 : hrs);
		var mins = d.getMinutes();
		var mins = (mins<10 ? "0" : "")+mins;
		var secs = d.getSeconds();
		var secs = (secs<10 ? "0" : "")+secs;
		var ampm = (d.getHours()<12 ? "am" : "pm");
		return hrs+':'+mins+''+ampm;
	}
}

function dateReadable (d)
{
	if (d != undefined) 
	{
		var weekdays = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
		var months = new Array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec");
		return weekdays[d.getDay()]+', '+d.getDate()+' '+months[d.getMonth()];
	}
}

function getObj(objID)
{
    if (document.getElementById) {return document.getElementById(objID);}
    else if (document.all) {return document.all[objID];}
    else if (document.layers) {return document.layers[objID];}
}

function checkClick(e) {
	e?evt=e:evt=event;
	CSE=evt.target?evt.target:evt.srcElement;
	//if (getObj('fc'))
	//	if (!isChild(CSE,getObj('fc')))
	//		getObj('fc').style.display='none';
	//window.alert();
}

function isChild(s,d) {
	while(s) {
		if (s==d) 
			return true;
		s=s.parentNode;
	}
	return false;
}

function Left(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function Top(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function getEventsForMonth (cal)
{
	var eventsHTML	=	"";
	if (cal.eventCollection != undefined )
	{
		for ( cE in cal.eventCollection )
		{	
			var calEvent = cal.eventCollection[cE];
			if (calEvent.eventId && calEvent.eventDate.getMonth() == cal.month && calEvent.eventStyle != 'internal')
			{
				eventsHTML += getEventHTML (calEvent, 'pageEvent');
			}
		}
		return eventsHTML;
	}
	
}

function getEventsForDay (eventCollection, day) 
{
	var returnEvents	 	= new Array();
	for ( cE in eventCollection )
	{	
		var calEvent = eventCollection[cE];
		if (calEvent.eventId && calEvent.eventDay == day)
		{
			returnEvents.push (calEvent);
		}
	}
	return returnEvents;
}

function dayClick(e) {
	e?evt=e:evt=event;
	//window.alert(e.target.id);
}

function getCalData(month,year)
{
	// for when the calender is dispaying events in a different year to the current
	var calHREF 		 = String(window.location.href).replace(/\?(.+)$/,'');
	window.location.href = calHREF+'?calMonth='+month+'&calYear='+year+'';
}

function getEventHTML (calEvents, calType, calHTML) 
{
	var calEventHTML = '';
	if (!calHTML) calHTML = '';
	
	// detemine if multiple events were passed
	if (calEvents.length && calEvents.length > 1 && calType == 'mainCal')
	{
		// mutliple events
		calType = 'mainCalMultiEvent';
	} else if ( calEvents.length && calEvents.length == 1 ) 
	{
		// single event - array passed
		calEvent = calEvents[0];
	} else 
	{
		// single event - object passed
		calEvent = calEvents;
	}
	try {
		switch (calType)
		{
			case 'mainCal':
				var href;
				var detailBoxWidth = '';
				var styleMessage;
				var startDate	= dateReadable(calEvent.eventDate)+' - '+timeReadable(calEvent.eventDate);
				var endDate		= timeReadable(calEvent.eventEndDate);
				// dont link to internal events
				if (calEvent.eventStyle != 'internal')
				{
					href = '';
					styleMessage = '';
				} else {
					href = 'href="#event_'+calEvent.eventId+'"';
					styleMessage = '';
				}
				// determine width
				if (calEvent.eventName.length > 40)
				{
					detailBoxWidth = 'width:100px;white-space:normal;overflow:hidden;';
				}
				
				calEventHTML += '<div style="display:none">%calEvents%</div>';
				calEventHTML += ''+calHTML+'';
				calEventHTML += '<div id="click_'+calEvent.eventId+'" class="dayContent" style="position:relative;width:10px;height:10px;top:0px;left:-7px;">';
				// Display	
				calEventHTML += '<div class="itemDetails" >';	
				calEventHTML += '<div class="eventStyle_'+calEvent.eventStyle+'" style="'+detailBoxWidth+'">';
				calEventHTML += '<a '+href+'>'+calEvent.eventName+'</a>';
				calEventHTML += '<img src="cal/img/foot.png" style="z-index:100;position:absolute;top:-24px;left:-22px;">';
				calEventHTML += '</div>';
				calEventHTML += '</div>';
				// mouseOver
				calEventHTML += '<div class="itemOver" id="itemOver_id">';
				calEventHTML += '<div class="dateText" style="font-size:16px;">'+startDate+' - '+endDate+'</div>';
				calEventHTML += '<strong>'+calEvent.eventName+'</strong><br>'; 
				calEventHTML += '<div style="margin-left:0px;width:300px;">'+calEvent.eventDesc+'</div>';		
				calEventHTML += '<img src="cal/img/footLarge.png" style="z-index:100;position:absolute;top:3px;right:3px;">';	
				calEventHTML += '</div>';
				// end dayContent
				calEventHTML += '</div>';
			break;
			
			case 'mainCalMultiEvent':
				if (calEvents.length)
				{
					// Display	
					calEventHTML += '<div style="display:none">%calEvents%</div>';
					calEventHTML += '<div>'+calHTML+'<div>';
					calEventHTML += '<div id="click_'+calEvent.eventId+'" class="dayContent" style="position:relative;overflow:visible;"><div style="position:absolute;"><img src="cal/img/foot.png" style="z-index:100;position:absolute;top:-10px;left:-22px;">';
					for (var i in calEvents)
					{
						var cE = calEvents[i];
						calEventHTML += '<div class="itemDetails" style="position:relative;">';
						calEventHTML += '<span class="eventStyle_'+cE.eventStyle+'" style="padding:3px;padding-left:15px;background:#fff;border:1px solid #bbb;">';
						calEventHTML += '<a href="#event_'+cE.eventId+'">'+cE.eventName+'</a></span>';
						calEventHTML += '</div>';
					}	
					calEventHTML += '</div>';
					// mouseOver
					calEventHTML += '<div class="itemOver" id="itemOver_id">';
					for (var i in calEvents)
					{	
						var cE = calEvents[i];
						var startDate	= dateReadable(cE.eventDate)+' - '+timeReadable(cE.eventDate);
						var endDate		= timeReadable(cE.eventEndDate);
						calEventHTML += '<div class="dateText" style="font-size:13px;">'+startDate+' - '+endDate+'</div>';
						calEventHTML += '<strong>'+cE.eventName+'</strong><br>';
						calEventHTML += '<div style="margin-left:0px;width:300px;"><a href="#event_'+cE.eventId+'">'+cE.eventDesc+'</a></div><br>';			
					}
					calEventHTML += '<img src="cal/img/footLarge.png" style="position:absolute;top:3px;right:3px;">';
					calEventHTML += '</div></div>';
				}
			break;
			
			case 'calSmall':
				// calSmall uses calMonth and calYear GET variables as when events are clicked
				var calMonth = calEvent.eventDate.getMonth();
				var calYear  = calEvent.eventDate.getFullYear();
				// ignore internal events
				if (calEvent.eventStyle != 'internal')
				{
					calEventHTML += '<div class="dayContent"><a style="background:#eaffc0" href="calEvents.php#event_'+calEvent.eventId+'?calMonth='+calMonth+'&calYear='+calYear+'">'+calHTML+'</a>';
					calEventHTML += '<div style="float:right;position:relative;width:0px;height:0px;"><img src="cal/imgSmall/foot.png" style="position:absolute;right:-7px;top:-4px;"></div>';
					// mouseOver
					calEventHTML += '<div class="itemOver" id="itemOver_id">';
					calEventHTML += ''+calEvent.eventName+'<br>'; 
					//calEventHTML += '<div class="dateText">'+calEvent.startDate+' - '+calEvent.endDate+'</div>';		
					//calEventHTML += '<img src="cal/img/foot.png" style="z-index:100;position:absolute;top:5px;left:-5px;">';
					calEventHTML += '</div>';
					//
					calEventHTML += '</div></div>';
				} else {
					calEventHTML += calHTML;
				}
			break;
			
			case 'pageEvent':
				var startDate	= dateReadable(calEvent.eventDate)+'&nbsp;&nbsp;'+timeReadable(calEvent.eventDate);
				var endDate		= timeReadable(calEvent.eventEndDate);
				calEventHTML += '<div style="margin-top:15px;">';
				calEventHTML += '<a name="event_'+calEvent.eventId+'"></a>';
				calEventHTML += '<span style="float:left" class="itemHeading">'+calEvent.eventName+'</span>';
				calEventHTML += '<span style="float:right;line-height:16pt;font-size:8pt;" class="subtext">';
				calEventHTML += ''+startDate+' - '+endDate+'';
				calEventHTML += '</span>';
				calEventHTML += '</div>';
				calEventHTML += '<hr class="itemDivider">';
				calEventHTML += '<div style="margin-bottom:15px;">';
				calEventHTML += '	'+calEvent.eventDesc+'<br>';
				if (calEvent.eventLink != '')	
				{
					calEventHTML += '    <br><img src="img/paperclip.jpg"><a target="_blank" href="content/'+calEvent.eventLink+'">'+calEvent.eventLink+'</a><br>';
				}
				calEventHTML += '	';
				calEventHTML += '	<br>';
				calEventHTML += '</div>';
			break;
		}
	} catch (e)
	{
		// no action	
	}
	return calEventHTML;
}

function Cal ()
{
	// PUBLIC MEMBERS
	this.identifier			= '';
	this.calObjectContainer = '';
	this.calType 			= '';
	this.eventCollection 	= new Array();
	this.loaded 			= false;
	this.imgPath			= '';
	this.eventsDiv			= '';
	
	// PRIVATE MEMBERS
	var now 	=new Date;
	var sccm	=now.getMonth();
	var sccy	=now.getFullYear();
	var ccd		=now.getDate();
	var ccm		=now.getMonth();
	var ccy		=now.getFullYear();
	var marr    ='';
	var mn		=new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');
	var mnn		=new Array('31','28','31','30','31','30','31','31','30','31','30','31');
	var mnl		=new Array('31','29','31','30','31','30','31','31','30','31','30','31');
	var calvalarr=new Array(42);
	
	this.month	= now.getMonth();
	
	// PUBLIC FUNCTIONS
    this.setType = function(val)
	{
        this.calType 	= val;
		this.identifier = val;
    };
	
	this.populateEvents	= function () 
	{
		for ( cE in this.eventCollection )
		{	
			var calEvent = this.eventCollection[cE];
			if (calEvent.eventId && calEvent.eventDate.getMonth() == ccm && calEvent.eventDate.getFullYear() == ccy)
			{
				var calEventsGrouped 	= getEventsForDay(this.eventCollection, calEvent.eventDay);
				// find the correct day
				for (var i=1; i<42; i++)
				{
					var dayCell 		= document.getElementById(this.identifier+'_d'+i);
					var rString			= '%day'+calEvent.eventDay;
					var re = new RegExp(rString);
					//window.alert(dayCell.innerHTML);
					if ( String(dayCell.innerHTML).match(re) )
					{
						
						break;
					}
				}
				// determine if this day is already populated with cal events
				if ( dayCell && ! String(dayCell.innerHTML).match(/%calEvents%/) )
				{
					dayCell.innerHTML 	= getEventHTML(calEventsGrouped, this.calType, dayCell.innerHTML);
				}
			}
		}
	}
	
	this.showCal = function () 
	{
		var calHTML = '';
		calHTML += '<div id="'+this.identifier+'" class="'+this.calType+'" style="position:relative">';
		calHTML += '<table id="fc" class="calHeading" style="border-collapse:collapse;border:0px;">\n';
		calHTML += '<tr><td id="csubm" style="cursor:pointer" onclick="'+this.identifier+'.csubm()"><img src="'+this.imgPath+'arrowleft.gif"></td><td colspan=5 id="mns" align="center" style="font:bold 13px Arial"></td>';
		calHTML += '<td id="caddm" align="right" style="cursor:pointer" onclick="'+this.identifier+'.caddm()"><img src="'+this.imgPath+'arrowright.gif"></td></tr>\n';
		calHTML += '<tr><td align=center class="calDayHeading">S</td><td align=center class="calDayHeading">M</td>';
		calHTML += '<td align=center class="calDayHeading">T</td><td align=center class="calDayHeading">W</td>';
		calHTML += '<td align=center class="calDayHeading">T</td><td align=center class="calDayHeading">F</td>';
		calHTML += '<td align=center class="calDayHeading">S</td></tr>\n';
		for (var kk=1;kk<=6;kk++) 
		{
			calHTML += '<tr>\n';
			for (var tt=1;tt<=7;tt++) 
			{
				num=7 * (kk-1) - (-tt);
				calHTML += '<td id="'+this.identifier+'_d' + num + '" class="calDay">&nbsp;</td>\n';
			}
			calHTML += '</tr>\n';
		}
		calHTML += '</table>\n';	
		calHTML += '</div>';
		this.calObjectContainer.innerHTML = calHTML;
	}	
	
	this.init = function ()
	{
		// check if we're displaying a different year
		if (this.loaded == false)
		{
			var calYear = get('calYear');
			if (calYear!=''&&!isNaN(calYear)) {
				ccy	=Number(calYear);
				//sccy =calYear;
			}
			// check if we're displaying a different month
			var calMonth= get('calMonth');
			if (calMonth!=''&&!isNaN(calMonth)) {
				ccm	=Number(calMonth);
				//sccm	=calMonth;
				this.month = ccm;
			}
			this.loaded = true;
		}
		var hd	=ccd;
		var cm	=ccm;
		var cy	=ccy;
		var dayElmnt = String (this.identifier+'_d');
		now=new Date();
		sd=now.getDate();
		td=new Date();
		td.setDate(1);
		td.setFullYear(cy);
		td.setMonth(cm);
		cd=td.getDay();
		//window.alert(td.getMonth()+' '+td.getFullYear());
		getObj('mns').innerHTML=mn[cm]+ ' ' + cy;
		marr=((cy%4)==0)?mnl:mnn;
		for(var d=1;d<=42;d++) 
		{
			f_rst(getObj(dayElmnt+parseInt(d)),this.calType);
			//f_cps(getObj('d'+parseInt(d)));   	// COLOR
			if ((d >= (cd -(-1))) && (d<=cd-(-marr[cm]))) 
			{
				dip=((d-cd < sd)&&(cm==sccm)&&(cy==sccy));
				htd=((hd!='')&&(d-cd==hd)&&(cm==now.getMonth())&&(cy==now.getFullYear()));
				if (dip)
					f_cpps(getObj(dayElmnt+parseInt(d)),this.calType);
				else if (htd)
					f_hds(getObj(dayElmnt+parseInt(d)),this.calType);
				else
					f_cps(getObj(dayElmnt+parseInt(d)),this.calType);
	
				//getObj('d'+parseInt(d)).onmouseover=(dip)?null:cs_over;
				//getObj('d'+parseInt(d)).onmouseout=(dip)?null:cs_out;
				//getObj(dayElmnt+parseInt(d)).onclick=(dip)?null:cs_click;
				
				getObj(dayElmnt+parseInt(d)).innerHTML=(d-cd)+'<div style="display:none">%day'+(d-cd)+'</div>';	
				calvalarr[d]=''+(d-cd)+'/'+(cm-(-1))+'/'+cy;
			} else 
			{
				getObj(dayElmnt+parseInt(d)).innerHTML='&nbsp;';
				//getObj(dayElmnt+parseInt(d)).onmouseover=null;
				//getObj(dayElmnt+parseInt(d)).onmouseout=null;
				//getObj(dayElmnt+parseInt(d)).style.cursor='default';
			}
		}	
	}
	// go forward one month
	this.caddm = function () 
	{
		marr=((ccy%4)==0)?mnl:mnn;
		ccm+=1;
		this.month = ccm;
		if (ccm>=12) {
			ccm=0;
			ccy++;
			// get calData for the next year
			getObj('caddm').style.visibility='hidden';
			this.loaded = false;
			getCalData(ccm,ccy);
		} else {
			//cdayf();
			this.init();
			this.populateEvents();
			this.eventsDiv.innerHTML = getEventsForMonth(this);
		}
	}
	
	// go back one month
	this.csubm = function () 
	{
		marr=((ccy%4)==0)?mnl:mnn;
		ccm-=1;
		this.month = ccm;
		if (ccm<0) {
			ccm=11;
			ccy--;
			// get calData for the prev year
			getObj('csubm').style.visibility='hidden';
			this.loaded = false;
			getCalData(ccm,ccy);
		} else {
			//cdayf();
			//window.alert(ccm);
			this.init();
			this.populateEvents();
			this.eventsDiv.innerHTML = getEventsForMonth(this);
		}
	}
	
	// PRIVATE FUNCTIONS
	// days future
	function f_cps(obj,type) {
		obj.style.backgroundImage='none';
		//obj.style.background='#cae7b9';
		obj.style.color='#8fbf88';
		//obj.style.background='#C4D3EA';
		//obj.style.font='11px Arial';
		//obj.style.color='#333333';
		obj.style.textAlign='left';
		obj.style.textDecoration='none';
		//obj.style.border='1px solid #81b58a';
		obj.className='calDay';
		switch (type)
		{
			case 'mainCal':
			obj.style.border='2px solid #fff';
			obj.style.backgroundColor='#ceeebd';
			break;
			default:
			obj.style.backgroundColor='#defecd';
			obj.style.border='1px solid #8dbd86';
			obj.style.color='#000';
			break;
		}
	}	
	// days past
	function f_cpps(obj,type) {
		obj.style.backgroundImage='none';
		//obj.style.background='#ffffff';
		//obj.style.font='10px Arial';
		obj.style.backgroundColor='#defecd';
		obj.style.color='#b7d3a8';
		//obj.style.color='#81b58a';
		obj.style.textAlign='left';
		obj.style.textDecoration='none';
		//obj.style.border='1px solid #81b58a';
		switch (type)
		{
			case 'mainCal':
			obj.style.border='2px solid #fff';
			obj.style.width='60px';
			break;
			default:
			obj.style.backgroundColor='#fff';
			obj.style.border='1px solid #8fbf88';
			break;
		}
	}	
	// today
	function f_hds(obj,type) {
		obj.style.backgroundImage='none';
		obj.style.background='#81b58a';
		obj.style.backgroundColor='#81b58a';
		//obj.style.font='bold 10px Arial';
		obj.style.color='#ceeebd';
		obj.style.textAlign='left';
		//obj.style.border='1px solid #61956a';
		obj.className='calDay';
		switch (type)
		{
			case 'mainCal':
			obj.style.border='2px solid #fff';
			break;
			default:
			obj.style.border='2px solid #3b7964';
			break;
		}
	}
	
	// reset
	function f_rst(obj,type) {
		obj.style.color='#b7d3a8';
		obj.style.textAlign='left';
		obj.className='calToday';
		switch (type)
		{
			case 'mainCal':
			obj.style.border='2px solid #fff';
			obj.style.backgroundColor='#fff';
			break;
			default:
			obj.style.border='1px solid #8fbf88';
			obj.style.backgroundColor='#fff';
			break;
		}
	}
	
	function cdayf() {
	if ((ccy>sccy)|((ccy==sccy)&&(ccm>=sccm)))
		return;
	else {
		ccy=sccy;
		ccm=sccm;
		//cfd=scfd;
		}
	}
	function evtTgt(e)
	{
		var el;
		if(e.target)el=e.target;
		else if(e.srcElement)el=e.srcElement;
		if(el.nodeType==3)el=el.parentNode; // defeat Safari bug
		return el;
	}
	function EvtObj(e){if(!e)e=window.event;return e;}
	function cs_over(e) {
		evtTgt(EvtObj(e)).style.background='#81b58a';
	}
	function cs_out(e) {
		evtTgt(EvtObj(e)).style.background='#cae7b9';
	}
	function cs_click(e) {
		//updobj.value=calvalarr[evtTgt(EvtObj(e)).id.substring(1,evtTgt(EvtObj(e)).id.length)];
		//displayEvents ( getCalEventsForDay ( this.eventCollection, parseInt (e.target.id.replace ('d',''))-1 ) );
		//displayEvents ( this.eventCollection, parseInt (e.target.id.replace ('d',''))-1 ) ;
	}
}


