//Last Modified: Jun 22/2009

//public calendar field contants
var fcalcalendarid=0; var fcalcacontactid=1; var fcalsourceid=2; var fcalclientid=3; var fcalrectype=4; var fcalname=5; var fcalorg=6; var fcalcat1=7; var fcalcat2=8; var fcalcat3=9; var fcalwww=10; var fcaldescr=11; var fcalstartdate=12; var fcalenddate=13; var fcaltimes=14; var fcalisrecurring=15; var fcalincxcalendar=16; var fcaldeletedmark=17; var fcalapprovedmark=18; var fcalcreatedate=19; var fcalupdatedate=20; var fcalupdateby=21; var fcalvcontact=22; var fcalvenue=23; var fcaladdress=24; var fcalcity=25; var fcalprov=26; var fcalphone=27;  var fcallistinglink=28

//caContact field constants
var fcaccacontactid=0; var fcacclientid=1; var fcacfname=2; var fcaclname=3; var fcacphone=4; var fcacemail=5; var fcaccreatedate=6; var fcacupdatedate=7;

//var calendarNames = ["calendarid", "cacontactid", "clientid", "rootid", "rectype", "name", "org", "cat1", "cat2", "cat3", "www", "descr", "startdate", "enddate", "times", "deletedmark", "approvedmark", "createdate", "updatedate", "updateby", "vcontact", "venue", "address", "city", "prov", "phone"];
var calendarNames = ["calendarid", "cacontactid", "sourceid", "clientid",  "rectype", "name", "org", "cat1", "cat2", "cat3", "www", "descr", "startdate", "enddate", "times","isRecurring","inCxCalendar","deletedmark", "approvedmark", "createdate", "updatedate", "updateby", "vcontact", "venue", "address", "city", "prov", "phone", "listinglink"];
var caContactNames = ["cacontactid", "clientid", "fname", "lname", "phone", "email", "createdate", "updatedate"];
//
var WriteCalled = false;
var SortFieldIdx = 0;
var FilterMonthLast = 1;
var FilterYearLast = 0;	//2006;
var RecurringYearLast = 0;
var CurrentMonth=-1;
var CurrentYear=-1;


//Load an array into a Select object
function LoadOptions( ASelectID, AOptionArray)
{
	var idx = 0;
	var obj = document.getElementById(ASelectID);
	
	obj.options.length = 0;
	
	for( idx = 0; idx < AOptionArray.length; idx++) {
		obj.options[idx] = new Option( AOptionArray[idx], AOptionArray[idx], false, false);
	}
}
function SetOption( ASelectID, AValue)
{
	var idx = 0;
	var obj = document.getElementById(ASelectID);

	if(trim(AValue)=='') {
			obj.selectedIndex = -1;
			return;
	}	
	for( idx = 0; idx < obj.options.length; idx++) {
		if(obj.options[idx].value == AValue) {
			obj.selectedIndex = idx;
			break;
		}
	}
}

function trim(str)
{
  return str.replace(/^\s*|\s*$/g,"");
}
function AddIfNotNull(strVar, strVal, delim)
{
	if(trim(strVal) == '') 
		return '';
	else {
		if(strVar != '')
			return delim +strVal;
		else
			return strVal;
	}
}
function AddToArray(AArray, AValue)
{
	var itmp = 0;
	for( itmp = 0; itmp < AArray.length; itmp++)
		if(AValue==AArray[itmp]) break;
	//if(itmp==AArray.length) AArray.push(AValue);	<<< array.push() not implemented in IE version before 5.5
	if(itmp==AArray.length) AArray[AArray.length] = AValue;
}

function HandleError(obj)
{
	if(typeof(obj)=='string') 
		alert(obj);
	else
	if(typeof(obj)=='number') 
		alert('Error #'+obj+' has occurred.');
	else
	if(!obj)
		alert('An unknown error has occurred.');
	else {
		//SetStatus(obj.toString());	
		//SetStatus(obj.name+': '+obj.message);
	   var result = "Error: " +obj.name ;
	   for (var i in obj) {
	      result += i + " = " + obj[i] + "\n"
	   }
		alert(result);	
	}
}
// use % operator instead
//function Mod(a, b) {
//    return a - Math.floor(a / b) * b;
//}

function SwapImage(AImageControl, AImageFileName)
{
 	AImageControl.src = AImageFileName;
	return true;
}

function MakeCalListLongInfo(arCalendar, ARowID)
{
 	//var stmp = trim(arCalendar[ARowID][fcaldescr]);
 	var stmp = arCalendar[ARowID][fcaldescr];
 	if(stmp!='')
 	 stmp+='<br><br>';

 	if(arCalendar[ARowID][fcalstartdate] != '') 
 		stmp += 'Date: &nbsp;'+MakeDate(arCalendar[ARowID][fcalstartdate]);
 	if(arCalendar[ARowID][fcalenddate] != '') 
 		stmp += ' to '+MakeDate(arCalendar[ARowID][fcalenddate]);
 	
 	if(arCalendar[ARowID][fcaltimes] != '') 
 		stmp += '<br>Time: &nbsp;'+arCalendar[ARowID][fcaltimes];
 	if(arCalendar[ARowID][fcalvenue] != '') 
 		stmp += '<br>Venue: &nbsp;'+arCalendar[ARowID][fcalvenue];
 		
 	var stmp2 = '';
 	stmp2 += AddIfNotNull(stmp2, arCalendar[ARowID][fcaladdress], '');
 	stmp2 += AddIfNotNull(stmp2, arCalendar[ARowID][fcalcity], ', ');
 	stmp2 += AddIfNotNull(stmp2, arCalendar[ARowID][fcalprov], ', ');
 	stmp += AddIfNotNull(stmp, stmp2, '<br>Location: &nbsp;');

 	if(arCalendar[ARowID][fcalwww] != '') {
	 	if(arCalendar[ARowID][fcalwww].substring(0,7)== 'http://') 
	 		stmp += "<br>Website: &nbsp;<a title='Click to visit this website' href='"+arCalendar[ARowID][fcalwww]+"'>"+arCalendar[ARowID][fcalwww]+"</a>";
		else
	 		stmp += "<br>Website: &nbsp;<a title='Click to visit this website' href='http://"+arCalendar[ARowID][fcalwww]+"'>http://"+arCalendar[ARowID][fcalwww]+"</a>";
 	}
 	if(arCalendar[ARowID][fcalvcontact] != '') 
 		stmp += '<br>For information contact: &nbsp;'+arCalendar[ARowID][fcalvcontact];
 	if(arCalendar[ARowID][fcalphone] != '') 
 		stmp += '<br>Phone: &nbsp;'+arCalendar[ARowID][fcalphone];
 	stmp += '<br>';
 	
 	return stmp;
}


//allowable formats: 
//%ns - where n is the index of a parameter; only two digit indexes are allowed 
//    - see below for other other specifiers
//	var copyfromto = AString.substring;
//	var pos = AString.indexof;
function sprintf(AString)
{
	var arglen = arguments.length;
	var strlen = AString.length;
	
	var idx = 0;
	var lastidx = 0;
	var paramOffset = 0;
	var result = '';
	
  while(idx < strlen) {
  	lastidx = idx;
  	idx = AString.indexOf('%', lastidx);
  	
  	if(idx == -1) {
  		result += AString.substring(lastidx, strlen);
  		break;
  	}
  	
 		result += AString.substring(lastidx, idx);

		if (AString.charAt(idx+1) == '%')
				result += '%';
		else {
			if (parseInt(AString.charAt(idx+2)) >= 0) {
			//if (AString.charAt(idx+2) == false) {
				paramOffset = parseInt(AString.substring(idx+1, idx+3), 10);
				idx+=4;
			} 
			else {
				paramOffset = parseInt(AString.substring(idx+1), 10);
				idx+=3;
			}
			if (paramOffset >= arglen)
				alert('Error! Not enough function arguments (' + (arglen - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + paramOffset + ' so far).');
			result += arguments[paramOffset];
		}
	}
	return result;
}
function EventSortFunction(ARecord1, ARecord2)
{
	var result = DoSort(ARecord1, ARecord2, SortFieldIdx);

	if(result != 0)
		return result;

	//break tie 
	if(SortFieldIdx != fcalstartdate)  
		return DoSort(ARecord1, ARecord2, fcalstartdate);		//compare start dates	
	else															
		return DoSort(ARecord1, ARecord2, fcalname);		//compare event names
}
function DoSort(ARecord1, ARecord2, ASortFieldIdx)
{
	if(ASortFieldIdx==fcalstartdate){			//date sort
		if(ARecord1.startdate > ARecord2.startdate)
			return 1;
		else
		if(ARecord1.startdate < ARecord2.startdate)
			return -1;
		else {
			
			if(ARecord1.enddate > ARecord2.enddate)
				return 1;
			else
			if(ARecord1.enddate < ARecord2.enddate)
				return -1;
			else
				return 0;
		}
	} 
	
	//string sort
	if(ARecord1[ASortFieldIdx] > ARecord2[ASortFieldIdx])
		return 1;
	else
	if(ARecord1[ASortFieldIdx] < ARecord2[ASortFieldIdx])
		return -1;
	else
		return 0;
}
	
function DateSortFunc(ADate1, ADate2)
{
	dt = new Date(ADate1);
	dt1 = dt.getTime();
	dt = new Date(ADate2);
	dt2 = dt.getTime();
	
	if(dt1 > dt2) {
		return 1;
	} else
	if(dt1 < dt2)
		return -1;
	else
		return 0;
}

function MakeDate( AMySQLDateStr )
{
	var yy = parseInt(AMySQLDateStr.substring(0,4),10);
	var mm = parseInt(AMySQLDateStr.substring(5,7),10);
	var dd = parseInt(AMySQLDateStr.substring(8,10),10);
	
	if(yy == 0 || mm == 0 || dd == 0)
		return '';
	
	var stmp = ToMonthAbbrev(mm) +' ' +dd +'/' +yy;	
	
	return stmp;
}

function MakeDateFromObj( ADateObj )
{
	var stmp = ToMonthAbbrev(ADateObj.getMonth()+1) +' ' +ADateObj.getDate() +'/' +ADateObj.getFullYear();	
	return stmp;
}
function MakeDateFromObjFull( ADateObj )
{
	var stmp = ToMonthStr(ADateObj.getMonth()+1) +' ' +ADateObj.getDate() +'/' +ADateObj.getFullYear();	
	return stmp;
}


function ToMonthStr(AMonthNum)
{
	switch(AMonthNum) {
		case 1: return 'January'; break;
		case 2: return 'February'; break;
		case 3: return 'March'; break;
		case 4: return 'April'; break;
		case 5: return 'May'; break;
		case 6: return 'June'; break;
		case 7: return 'July'; break;
		case 8: return 'August'; break;
		case 9: return 'September'; break;
		case 10: return 'October'; break;
		case 11: return 'November'; break;
		case 12: return 'December'; break;
	}
}
function ToMonthAbbrev(AMonthNum)
{
	switch(AMonthNum) {
		case 1: return 'Jan'; break;
		case 2: return 'Feb'; break;
		case 3: return 'Mar'; break;
		case 4: return 'Apr'; break;
		case 5: return 'May'; break;
		case 6: return 'Jun'; break;
		case 7: return 'Jul'; break;
		case 8: return 'Aug'; break;
		case 9: return 'Sep'; break;
		case 10: return 'Oct'; break;
		case 11: return 'Nov'; break;
		case 12: return 'Dec'; break;
	}
}

function DaysInMonth(AMonthNum)
{
	switch(AMonthNum) {
		case 1: return 31;
		case 2: return 28;
		case 3: return 31;
		case 4: return 30;
		case 5: return 31;
		case 6: return 30;
		case 7: return 31;
		case 8: return 31;
		case 9: return 30;
		case 10: return 31;
		case 11: return 30;
		case 12: return 31;
	}
}

function mouseoverMonth( obj )
{
	if(obj) obj.className = 'styleControlPnlHiLite';
		return true;
}
function mouseoutMonth( obj, num )
{
	if(obj) obj.className = 'styleControlPnl';
	return true;
}
function mouseoverDay( obj )
{
	if(obj) obj.className = 'styleControlPnlDayHiLite';
		return true;
}
function mouseoutDay( obj, num )
{
	if(obj) obj.className = 'styleControlPnlDay';
	return true;
}
function mouseoverrow( obj )
{
	if(obj) {
		 if( obj.className != 'styleCalendarTDSelected')
			obj.className = 'styleCalendarTDMouseOver';
	}
	return true;
}
function mouseoutrow( obj, num )
{
	if(obj) {
		 if( obj.className != 'styleCalendarTDSelected')
		 	obj.className = 'styleCalendarTD'+num;
	}
	return true;
}
function mouseoverbutton( obj )
{
	if(obj) obj.className = 'styleCalendarButtonMouseOver';
	return true;
}
function mouseoutbutton( obj, num )
{
	if(obj) obj.className = 'styleCalendarButton';
	return true;
}
/*
function mouseoversort( obj )
{
	if(obj) obj.className = 'styleSortMouseOver';
	return true;
}
function mouseoutsort( obj, num )
{
	if(obj) obj.className = 'styleSort';
	return true;
}
*/
function mouseoverinstructions( obj )
{
	if(!obj) return false;
	
	if(getObj('divMonth').style.display!='none') return;
	
	 obj.className = 'styleInstructionsMouseOver';
	return true;
}
function mouseoutinstructions( obj, num )
{
	if(!obj) return false;
	
	if(obj.className != 'styleInstructions')
		obj.className = 'styleInstructions';
	return true;
}


//modified from util2.js
function getObj( AControlID )
{
	if( typeof(AControlID) != 'string') {
		return AControlID;
	}

	var obj;
	
	if (document.getElementById) {
		obj = document.getElementById(AControlID);
 	} 
 	else 
 	if (document.all)	{
		obj = eval('document.all.'+AControlID);
	}
 	else 
 	if (document.layers)	{
		obj = document.layers[AControlID];
	}
	else {
		alert('calendar2.getObj() error: An unsupported browser is in use.');
		obj = null;
	}

	return obj;
}

function getHtml(AControlID) 
{
	var str;
	var obj;
	
	if(document.getElementById) {
	  return document.getElementById(AControlID).innerHTML;
 	} 
 	else 
 	if (document.all)	{
		str = 'document.all.'+AControlID;
		obj = eval( str );
	  return obj.innerHTML;
	}
 	else 
		alert('calendar2.getHtml() error: Browser not supported by this function');
}

function setHtml(AControlID, AHtml) 
{
	var str;
	var obj;

	if(document.getElementById) {
	  obj = document.getElementById(AControlID);
	  obj.innerHTML= AHtml;
 	} 
 	else 
 	if (document.all)	{
		str = 'document.all.'+AControlID;
		obj = eval( str );
	  obj.innerHTML= AHtml;
	}
	else
		alert('calendar2.setHTML() error: An unsupported browser is in use.');
}

function ClearFilter() 
{
	frType = 0; 
//	getObj('selDate').selectedIndex = 0;
	getObj('selLoc').selectedIndex = 0;
	FilterCat = '';
	FilterLoc = '';
	FilterStatus = '';
}
function DayClick(ADayNum)
{
 	//alert(FilterYearLast+'/'+FilterMonthLast+'/'+ADayNum);
	ClearFilter();
	frType = 3;

 	var stmp = FilterYearLast+'/'+FilterMonthLast+'/'+ADayNum;
	var dt = new Date(stmp);

	FilterStartDate = dt.getTime();
	FilterEndDate = FilterStartDate;
	//FilterStatus = ' for '+MakeDateFromObj(dt);
	FilterStatusDate = MakeDateFromObjFull(dt);
	FilterStatus = ' on this day';
 
	CallLoadTable();
	return true;
}

function MonthClick(AMonthNum)
{
	var mm = CurrentMonth +AMonthNum -1;
	if(mm>12)
		mm = mm -12;

	var yy = 0;
	if(mm<CurrentMonth)  //set to next year
		yy = parseInt(CurrentYear,10)+1;	
	else
		yy = CurrentYear;	
		
	ClearFilter();

	frType = 2;
	FilterYearLast = yy;
	SetMonthFilter(mm);

	CallLoadTable();
	return true;
}
function SetMonthFilter(AMonthNum)
{
	if(AMonthNum==0) {
		//SetYearFilter(FilterYearLast);
		alert('calling SetYearFilter disabled.')
		return;
	}
	FilterMonthLast = AMonthNum;
	
	var dt = new Date(FilterYearLast, AMonthNum -1, 1);
	FilterStartDate = dt.getTime();
	
	dt.setDate(DaysInMonth(AMonthNum));
	FilterEndDate = dt.getTime();

	//FilterStatus = ' for '+ToMonthStr(AMonthNum)+' '+FilterYearLast;
	//FilterStatusDate = ToMonthStr(AMonthNum)+' '+FilterYearLast;
	FilterStatus = ' in this month';
	FilterStatusDate = ToMonthStr(AMonthNum)+' '+FilterYearLast;
	
	//show/hide unused days
	var lastday = DaysInMonth(AMonthNum);
	for(var idx=28; idx < 32; idx++) {
		if(idx <= lastday)
			getObj('tdDay'+idx).style.visibility = 'visible';
		else
			getObj('tdDay'+idx).style.visibility = 'hidden';
	}
}
function SetFilter(AObj, AExtra)
{
	var itmp = -1;
	if( AObj.selectedIndex )
		itmp = AObj.selectedIndex;
	
	if(AObj.id=='tdShowAll')  {
		ClearFilter();

		if(AExtra==1) {
			frType = 0;
		}
		else {
			frType = 3;
	
			var dt = new Date();
			SetCurrentYear(dt.getFullYear());
			dt.setMonth(CurrentMonth-1, 1);
	
			FilterStartDate = dt.getTime();
			FilterStatusDate = 'All Events';
			FilterStatus = ' from '+MakeDateFromObjFull(dt);
	
			dt = new Date('12/31/2015');
			FilterEndDate = dt.getTime();
		}
	}
	else
	if(itmp==-1 ) {

		ClearFilter();
		frType = 2;
		SetMonthFilter(FilterMonthLast);	//set date filter for month
	}
	else {
	
		FilterLoc	= '';
		FilterCat	= '';
	
		if(AObj.id=='selLoc') {
			SetMonthFilter(FilterMonthLast);	//set date filter for month
			frType = 4;
			getObj('selCat').selectedIndex = 0;
			if(itmp > 0) {
				FilterLoc = AObj.options[itmp].value;
				//FilterStatus = ' for ' +AObj.options[itmp].text+' in '+FilterStatusDate;
				FilterStatus = ' in ' +AObj.options[itmp].text;
			}
		}
		else
		if(AObj.id=='selCat') {
			SetMonthFilter(FilterMonthLast);	//set date filter for month
			frType = 5;
			getObj('selLoc').selectedIndex = 0;
			if (itmp > 0) {
				FilterCat = AObj.options[itmp].value;
				//FilterStatus = ' for "' +AObj.options[itmp].text+'" category in '+FilterStatusDate;
				FilterStatus = ' in "' +AObj.options[itmp].text+'" category';
			}
		}
	}
	
	CallLoadTable();
	return true;
}


function SetCurrentYear(AYear)
{
	CurrentYear = AYear;
/*
	var obj = getObj('selYear');
	if(obj.value != AYear)
		obj.value = AYear;
*/
	if(FilterYearLast < CurrentYear)
		FilterYearLast = CurrentYear;
	
	if(RecurringYearLast != CurrentYear) {		//fix recurring dates
		
		var idx=0; 
		var arraylen=arCalendar.length;
		var dt=0;
		
		while(idx<arraylen) {
	
			if(arCalendar[idx][fcalisrecurring]=='1') {
				
				if(!WriteCalled) {		//make Recurring Date Stubs
					arCalendar[idx].startdateStub= arCalendar[idx][fcalstartdate].substring(5,10);
					if(	 arCalendar[idx][fcalenddate] == '' 	//should never occur
						|| arCalendar[idx][fcalstartdate]==arCalendar[idx][fcalenddate]) {
	
						arCalendar[idx].enddateStub	 = 0;		
						arCalendar[idx].RecurringOffset = 0;
					}
					else	{
						arCalendar[idx].enddateStub	 = arCalendar[idx][fcalenddate].substring(5,10);
						
						//allow for recurring dates that span years
						var yyStart = parseInt(arCalendar[idx][fcalstartdate].substring(0,4),10);
						var yyEnd = parseInt(arCalendar[idx][fcalenddate].substring(0,4),10);
						arCalendar[idx].RecurringOffset = yyEnd -yyStart;
					}					
				}
				
				if(CurrentYear != RecurringYearLast) {		//start and end date properties are dynamic, based on FilterYearLast
				
					dt = new Date(CurrentYear+'/'+arCalendar[idx].startdateStub);
					if( dt.getMonth()+1 < CurrentMonth)
						dt = new Date((CurrentYear+1)+'/'+arCalendar[idx].startdateStub);		//move date to next year; it will not show in calendar without this
						
					arCalendar[idx].startdate = dt.getTime();
					arCalendar[idx].startdateStr = MakeDateFromObj(dt);	//MakeDate(CurrentYear+'/'+arCalendar[idx].startdateStub);
	
					if(arCalendar[idx].enddateStub == 0) {
						arCalendar[idx].enddate = arCalendar[idx].startdate;
						arCalendar[idx].enddateStr = 0;
					} 
					else {
						var yy = dt.getFullYear() + arCalendar[idx].RecurringOffset;	//parseInt(CurrentYear,10) + arCalendar[idx].RecurringOffset;
	
						arCalendar[idx].enddate = new Date(yy+'/'+arCalendar[idx].enddateStub).getTime();
						arCalendar[idx].enddateStr = MakeDate(yy+'/'+arCalendar[idx].enddateStub);
					}				
	//alert( '"'+arCalendar[idx][fcalstartdate]+'"   "'+arCalendar[idx][fcalenddate]+'"\n'+'"'+arCalendar[idx].startdateStr+'"   "'+arCalendar[idx].enddateStr+'"\n')				
				}
			} 
			else {
				if(!WriteCalled) {
					//make date vars for standard dates once, when function first called			
					arCalendar[idx].RecurringOffset = -1;
					arCalendar[idx].startdate = new Date(arCalendar[idx][fcalstartdate]).getTime();
					arCalendar[idx].startdateStr = MakeDate(arCalendar[idx][fcalstartdate]);
	
					if(arCalendar[idx][fcalenddate] == arCalendar[idx][fcalstartdate]) {
						arCalendar[idx].enddate = arCalendar[idx].startdate;
						arCalendar[idx].enddateStr = 0;
					}
					else {
						arCalendar[idx].enddate = new Date(arCalendar[idx][fcalenddate]).getTime();
						arCalendar[idx].enddateStr = MakeDate(arCalendar[idx][fcalenddate]);
					}
				}
			}
	
			idx++;
		} //while	
	
		WriteCalled = true;
		RecurringYearLast	= CurrentYear;

		//sort records
		arCalendar.sort(EventSortFunction);
	}
}

function ShowPastEvents(obj)
{
	document.location = 'http://HotLink.ca/Links/ssocalexpired_2008.htm'
}