// calendar.js
//	- handle download of data from google calendar
//	- split into short-term/long-term
//	- split into Camano / Whidbey / Greater Puget Sound
//	- clean up date display

var gCalList;

var calName = new Object();
var calIndx2Name = new Array();

function handleCalendarList(root)
{
	// this function determines the list of sub-calendars be be read
	// and triggers a new script to read each of them

	gCalList = root;	// to facilitate firebug debugging

	var htm= new Array();
	htm.push('<b>');


	var arr = root.feed.entry;
	for (var i=0; i<arr.length; i++){

		var name   = arr[i].gsx$name.$t;
		var color  = arr[i].gsx$color.$t;
		var xmlUrl = arr[i].gsx$xmlurl.$t;

		if (!name.match('Puget')){
		  var xname = name.replace(/ /g,'&nbsp;');
		  htm.push('<a href="javascript:mkHtml({\'',name,'\':1})">',
			'<span style="color:',color,'">',xname,
			'</span></a> &nbsp;::&nbsp; ');
		}

		var indx = calIndx2Name.length;
		calName[name] = new Object();;
		calName[name].indx = indx;
		calName[name].color = color;
		calName[name].xmlUrl = xmlUrl;
		calName[name].events = new Object();


		calIndx2Name.push(name);

		// create fn to accept the data
		var code = new Array();
		var fn = 'handleCalendarData_' + i;
		code.push(fn, '=function(root)',
		'{', 
			'handleCalendarData(root,',i,');', 
		'}');
		
//console.log(code.join(''));
		eval(code.join(''));

		var x = new Object();
		x.type = 'calendar';
		x.callback = fn;
		x.url = xmlUrl.replace('/basic','/full');
		getGoogleData(x);
	}

setTimeout('forceCalendarDisplay()','2000');  // 2000 ms ~ 2 seconds

	htm.push('<a href="javascript:mkHtml(calName)">',
			'<span style="color:',color,'">','All&nbsp;Calendars',
			'</span></a>');

	htm.push('</b>');

	var el = document.getElementById('colorLegend');
	if (el) el.innerHTML = htm.join('');
}

function forceCalendarDisplay()
{
	// sometimes one or more of the calendars do NOT
	//  get returned by google, need to show the rest of them
//console.log('in force', done, calIndx2Name);

	

	if (done.length <  calIndx2Name.length){
		mkHtml(calName);
	}

}


var days = 60;
//                 hours min sec  millisec
var future = days * 24 * 60 * 60 * 1000;
var longtermObj = new Date();  // today
longtermObj.setTime(longtermObj.valueOf() + future);


var y = longtermObj.getFullYear();
var m = 1 + longtermObj.getMonth(); if(m<10) m = '0'+m;
var d = longtermObj.getDate();      if(d<10) d = '0'+d;

var cutOffDate = y + '-' + m + '-' + d;
//console.log(longtermObj);
//console.log(cutOffDate);


var adj = new Object();
for (var i=0; i<31; i++){
	var j = i+1;
	if (i<=9) ti = '0'+i; else ti = '' + i;
	if (j<=9) tj = '0'+j; else tj = '' + j;
	adj[ti+tj] = true;
}
adj['2801'] = true; 	// handle month rollover
adj['2901'] = true; 
adj['3001'] = true; 
adj['3101'] = true; 


var cal; 
var delim = 'ZqZ';
var keep = new Object();
var skeep = new Object();
var sarr = new Array();

var gEventData = new Array();

var done = new Array();

function handleCalendarData(root,indx)
{
	gEventData[indx] = root;

	if (typeof root.feed.entry == UNDEF){ 
//console.log('ignoring empty calendar.',indx);
		done.push(-indx);
	}
	else {

		var arr = root.feed.entry;

		for (var i=0; i<arr.length; i++){
			captureEventDetail(arr[i],indx,i);
		}

//console.log('pushing ',indx, ' onto done.');
		done.push(indx);
	}

	if (done.length == calIndx2Name.length){
		mkHtml(calName);
	}
}

var monthName = new Array('00','Jan','Feb','March','April','May','June','July','Aug','Sept','Oct','Nov','Dec');

var now = new Date();
var thisYear = now.getFullYear();

function fixDate(ymd)
{

	var y = parseInt(ymd.substring(0,4));
	var m = ymd.substring(5,7);  m = m.replace(/^0/,'');
	var d = ymd.substring(8,10); d = d.replace(/^0/,'');

	var mname = monthName[parseInt(m)];

	var ans = mname + ' ' + d;
	if (y != thisYear) ans += ' ' + y;

//console.log('fixDate ', ymd, ' m=',m,' --> ',ans);

	return ans;
}

function fixTime(txt)
{
	if (!txt.match(':')) return txt;
	// convert from military to am/pm
	txt = txt.replace(/^0/,'');	// leading 0 => octal ??
	var arr = txt.split(':');
	var xm = 'am';
	
	var h = parseInt(arr[0]);
	if (h > 12) { h -= 12; xm = 'pm';}

	if (txt == '12:00') ans = '12:00 noon';
	else if (txt == '24:00') ans = '12:00 midnight';
	else ans = '' + h + ':' + arr[1] + '&nbsp;' + xm;
//console.log(txt, ' -> ', h, ' -> ', ans);
	return ans;
}

function captureEventDetail(gdata,indx,i0)
{

	// -- detect canceled (sic) events  (Apr 1 2008 events !!)
	if (gdata.gd$eventStatus.value.match(/event.cancel*ed$/)) return;

//console.log(gdata);
	var cname = calIndx2Name[indx];


	var title = gdata.title.$t;
	if (cname.match(/Sound Waters/i) && !title.match(/Sound Waters/i))
		title += ' (Sound Waters)';
	var desc =  gdata.content.$t;
	if (typeof desc == UNDEF) desc = '';
	var link = gdata.link[0].href;

	var when = gdata.gd$when;	// an array
	var where = gdata.gd$where[0].valueString || "where?"

//console.log(title);
//console.log(when);

	// this loop is to handle recurring events which
	//  comes packed together in one event.  Event
	//  single occurrence events use a when array.

	for (var i=0; i<when.length; i++){

		var obj = new Object();

		var t = when[i]

		var txt1 = t.startTime + 'T';
		var tmp = txt1.split('T');
		obj.day1 = tmp[0];
		obj.time1 = tmp[1] || '';

		var txt2 = t.endTime + 'T';
		var tmp = txt2.split('T');
		obj.day2 = tmp[0];
		obj.time2 = tmp[1] || '';

		// clean up day range for one day all day events
//console.log(txt1,' -- ',txt2, ' -- ', title);
		var ym1 = txt1.substr(0,7);     // yyyy-mm
		var ym2 = txt2.substr(0,7);	// yyyy-mm
//console.log(ym1,' ',ym2);

		if (obj.time1 == ''){
		  var dd1 = txt1.substring(8,10);	// dd
		  var dd2 = txt2.substring(8,10);	// dd
		  if (ym1 == ym2){
			if (adj[dd1+dd2]){
				obj.day2 = obj.day1;
			}
		  }
                  else {
			// need to ck for adjacent months
			var m1 = parseInt(txt1.substring(5,7));
			var m2 = parseInt(txt2.substring(5,7));
			if (m1+1 == m2 || m1-11 == m2){
			   if (adj[dd1+dd2]){
				obj.day2 = obj.day1;
			  }
                        }
		  }
	        }
		// simplify times to hh:mm
		//	TO TEST -- back to PST in Nov
		obj.time1 = fixTime(obj.time1.substring(0,5));
		obj.time2 = fixTime(obj.time2.substring(0,5));

		// make a friendlier date display
		obj.dayName1 = fixDate(obj.day1);
		obj.dayName2 = fixDate(obj.day2);
		

		obj.title  = title;
		obj.desc   = desc;
		obj.where  = where;
		obj.link = link;

		var key = txt1 + obj.title;
		obj.key   = key;
		obj.sortkey = txt1 + delim + key + delim + indx

		obj.origIndx = indx;
		obj.origi = i0;

		calName[calIndx2Name[indx]].events[key] = obj; 
	}

}

var whidbeyRx = /Whidbey|Coupeville|Oak Harbor|Clinton|Freeland/i;
var camanoRx = /Camano/i;

var clist;

function mkHtml(nameList)
{
	var sarr = new Array();		// temporary arr for sorting

	clist = new Array();
	for (var x in nameList){
		clist.push( x );
		var arr = calName[x].events;
		for (var key in arr){
			sarr.push(arr[key].sortkey);
		}
	}
	if (sarr.length == 0){
		
		alert('Sorry - no events for ' + clist.join(', '));
		return;
	}
	sarr.sort();


	// -- these MUST match div names in events/index.htm
	keep.whidbey_near = new Object();
	keep.whidbey_long = new Object();
	keep.camano_near = new Object();
	keep.camano_long = new Object();
	keep.gps_near = new Object();
	keep.gps_long = new Object();

	// sort by time - since have recurring events
	sarr.sort();
	for (var i=0; i<sarr.length; i++){
		var tmp = sarr[i].split(delim);
				// start-time :: key :: calIndx


		var key = tmp[1];
		var cname = calIndx2Name[tmp[2]];
		var obj = calName[cname].events[key];
		obj.color = calName[cname].color;

		var key = obj.key;
		var t = '_near'; if (obj.day1 > cutOffDate) t = '_long';
		
		var bool = false; 
		var w = obj.where + obj.desc + obj.title;
//console.log('where is ',w);
		if (w.match(whidbeyRx)) {keep['whidbey'+t][key] = obj; bool=true; } 
		if (w.match(camanoRx)) {keep['camano'+t][key] = obj; bool=true; } 

		if (cname.match(/Sound Waters/i)){ 
			keep['whidbey'+t][key] = obj;  bool = true;
		}

		if (!bool) keep['gps'+t][key] = obj;

	}

	document.getElementById('livedata').style.display = 'block';
	for (var x in keep){
		mkDivHtml(x); 
	}
	document.getElementById('loadingdata').style.visibility = 'hidden';
}




function mkDivHtml(key)
{
	var arr = keep[key];

	var htm = new Array(); 
	htm.push('<dl>');

	
	var cnt = 0;
	for (var x in arr){

		var obj = arr[x];
		++cnt;

		htm.push('\n\n<dt><span style="color:',obj.color,'">',obj.dayName1);

		// todo - detect full-day events vs 3 day events
		if (obj.day1 != obj.day2) htm.push(' to ',obj.dayName2);

		htm.push(' &nbsp; ');

		// until/unless we publish sub-calendars - this won't work
		//htm.push(' &nbsp; <a href="',obj.link,'">',obj.title,'</a>');

		htm.push(obj.title,'</span>');

		htm.push('\n<dd>',obj.time1);
		if (obj.time1 != obj.time2) htm.push(' to ',obj.time2);
		htm.push(' ', obj.where);


		var desc = obj.desc.replace(/\s+$/g,'');
		desc = desc.replace(/\n/g,'<br>');
		htm.push('\n<dd>',desc);
		//htm.push('\n<dd>orig.',obj.origIndx,'.',obj.origi);
	}
	htm.push('</dl>');

	if (key.match(/short/) && cnt==0) {
		htm.push('<i>','no events','</i>');
	}
	if (key.match(/long/)){ 
		var el = document.getElementById(key.replace(/long/,'button'));
		if (cnt == 0) el.style.display = 'none';
		else el.style.display = 'block';
	}

	var el = document.getElementById(key);
	if (el) el.innerHTML = htm.join('');


}

function toggleMode(key)
{
//console.log('toggleMode key=',key);

	var el = document.getElementById(key+'_long');
	var v = document.getElementById(key+'_verb');
	if (el){
//console.log('toggleMode display=',el.style.display);
		if (el.style.display != 'block'){ 
			el.style.display = 'block';
			if(v) v.innerHTML = 'hide';
		}
		else {
			el.style.display = 'none';
			if(v) v.innerHTML = 'show';
		}
	}
	else alert('no div for ' + key);
}

