// eventmap.js
//
// Requirements:  eventArr - indexed by eventId, preceded by 'e'

// Idea
//	- set of filters, so each event has a visBool
//	- can filter on time, or on nearness to an address
//		(someday, in a polygon - e.g. Whidbey)
//		(OR - provide canned polygons)

//	- run filter, which sets visBool, or creates an array
//		of pointers to the selected events

//	- loop thru selected events, creating

//		- scrolling list of events, ordered by date
//		- equivalent map of events



var dpyMap;
var dpyCal;
var mapBounds;
var dpyTimeBounds = false;
var dpyLocBounds = false;

dhx_globalImgPath="../code/js/dhtmlxCal/imgs";

function adjustDates()
{
	var el = document.getElementById('datesdiv');
	el.style.display = 'block';
}

function adjustWhere()
{
	var el = document.getElementById('wherediv');
	el.style.display = 'block';
}

function updtTimeSel(val)
{
	var el = document.getElementById('datesdiv');
	if (val == 'all') showAllDates();
	else showDateRange();
	el.style.display = 'none';
}

function updtLocSel(val)
{
	var el = document.getElementById('wherediv');
	if (val == 'all') showAllLoc();
	else showVisible();
	el.style.display = 'none';
}



function showAllDates()
{
	dpyTimeBounds = false;
	var f = mkFilter();
	doFilter(f);
}


function showDateRange()
{
	dpyTimeBounds = true;
	var f = mkFilter();
	doFilter(f);
}

function showVisible()
{
	dpyLocBounds = true;
	var f = mkFilter();
	f.updtMap = false;	// already visible on the map
	doFilter(f);
}

function showAllLoc()
{
	dpyLocBounds = false;
	var f = mkFilter();
	doFilter(f);
}


function mkFilter()
{
	var f = new Object();

	// filters
	f.bounds = dpyLocBounds;
	f.time = dpyTimeBounds;

	f.ymd1 = dpyCal.leftCalendar.getFormatedDate(calFmt);
	f.ymd2 = dpyCal.rightCalendar.getFormatedDate(calFmt);

	f.updtMap = true;
	f.updtList = true;

	return f;
}


function doSearch()
{
	var f = mkFilter();
	doFilter(f);
}

var mapPolygon = null;
function doFilter(f)
{
console.log('doFilter',f);
if (f.bounds){ 
	mapBounds = dpyMap.getBounds();
	var ne = mapBounds.getNorthEast();
	var sw = mapBounds.getSouthWest();
	console.log('NE',ne);
	console.log('SW',sw);

	var parr = new Array();
	parr.push(new GLatLng(sw.lat(),sw.lng()));
	parr.push(new GLatLng(ne.lat(),sw.lng()));
	parr.push(new GLatLng(ne.lat(),ne.lng()));
	parr.push(new GLatLng(sw.lat(),ne.lng()));
	parr.push(new GLatLng(sw.lat(),sw.lng()));

	if (mapPolygon) dpyMap.removeOverlay(mapPolygon);

	var p = new GPolygon(parr,'#00ff00',2,1,'#aaaaaa',0.2);
	dpyMap.addOverlay(p);
	mapPolygon = p;
}

	var visArr = new Array();
	for (var x in eventArr){
		var obj = eventArr[x];

		if (noLatLng(obj)) continue;

//if (f.bounds){ 
//	console.log(x, obj.latlng);
//	console.log(mapBounds.containsLatLng(obj.latlng));
//}

		if (f.bounds && !mapBounds.containsLatLng(obj.latlng)) continue;

		if (f.time){
console.log(obj.ymd2, ' vs ', f.ymd1); 
console.log(obj.ymd1, ' vs ', f.ymd2); 

			if (obj.ymd2 < f.ymd1) continue;

			if (obj.ymd1 > f.ymd2) continue;
		}

		// TODO -- apply filters
		visArr.push(eventArr[x]);
	}

	showEventMap(visArr,f);
}

function noLatLng(obj)
{

	if (obj.eventLat == 0 && obj.eventLng == 0 ) return true;
	return false;
}
	


var dpyMarkerArr = new Array();

function showEventMap(varr,f)
{
console.log('showEvents',varr);

	var htm = new Array();

	var cnt = varr.length;
	if (cnt == 0) cnt = '<b>NO</b>';

	htm.push('<table width=100% cellpadding=0 cellspacing=0><tr><td>',
		'Found - ',cnt, ' events among ...',
		'<td align=right>',
		'<a target=_blank href=legend.htm>Event Map - Legend / Help</a>',

		'<tr><td colspan=2>',
		'');

	if (f.time) htm.push(mkDateRange(f));
	else htm.push(' - all upcoming events ');
	htm.push(' &nbsp; <a href=javascript:adjustDates()>adjust dates</a>');


	if (f.bounds) htm.push('<br> - in green square',
			'&nbsp;&nbsp;&nbsp;OR&nbsp;',
			" [<a href=javascript:updtLocSel('all')>show events anywhere</a>]",
			'&nbsp;&nbsp;&nbsp;OR&nbsp;',
			" [<a href=javascript:updtLocSel('cv')>show just events in current map-view</a>]"

			);
	else          htm.push('<br> - anywhere',
			'&nbsp;&nbsp;&nbsp;OR&nbsp;',
			" [<a href=javascript:updtLocSel('cv')>show just events in current view</a>]"
			);

	htm.push('</table>');

	var el = document.getElementById('echodiv');
	el.innerHTML = htm.join('');

	if (f.updtMap){
		dpyMap.clearOverlays(); 
		mapBounds = new GLatLngBounds();
		initMapCluster();
	}

	if (f.updtList){
		var htm = new Array();
		htm.push('<ul>');
	}

	for (var i=0; i<varr.length; i++){
		var obj = varr[i];

		if (f.updtMap){
		// -- add to map
		var point = new GLatLng(obj.eventLat,obj.eventLng);

		var marker = new GMarker(point);
		obj.marker = marker;
		

		setupMarkerListeners(obj.marker,obj.eventId);

		//dpyMap.addOverlay(marker);

		dpyMarkerArr.push(marker);
		
		mapCluster.AddMarker(marker,obj.href2);
		mapBounds.extend(point);

		}

		
		if (f.updtList) htm.push('<li>', obj.href1);


	}
	if (f.updtList){ 
		htm.push('</ul>');
		var el = document.getElementById('events');
		el.innerHTML = htm.join('');
	}

	// zoom to map so all markers visible
	if (f.updtMap) {
		dpyMap.setZoom(dpyMap.getBoundsZoomLevel(mapBounds));
		dpyMap.setCenter(mapBounds.getCenter());
	}
}

function setupMarkerListeners(marker,eventId)
{
	GEvent.addListener(marker,'click',function() {
		showEventInfo(eventId); }
	);
}


function isEmpty(txt)
{
	if (!txt) return true;
	if (txt.match(/^\s*$/)) return true;
	if (txt == null) return true;
	return false;
}


function showEventInfo(eventId)
{
console.log('showEvent',eventId);
	var obj = eventArr['e'+eventId];
	var htm = new Array();

	var d = '<br> - ';

	htm.push('<span class=event_daterange_mini>',mkDateRange(obj),'</span>',
		'<br>',obj.eventName,d);


	if (!isEmpty(obj.eventPlace)) htm.push(obj.eventPlace,', ');
	htm.push(obj.eventAddr);

	if (obj.eventPhone != '') htm.push(d,obj.eventPhone);
	if (obj.eventEmail != '') htm.push(d,obj.eventEmail);
	if (obj.eventURL != ''){ 
		var href = obj.eventURL;
		if (!href.match(/^http:/)) href = 'http://' + href;
		htm.push(d,'<a target=_blank href="',href,'">', 
				obj.eventURL,'</a>');
	}

	htm.push(d,
		' . . . ','<a href=# onClick=showEventDetails(',obj.eventId,')>more</a> ... ');


	var pref = new Object();
	pref.maxWidth = 200;
	obj.marker.openInfoWindowHtml(htm.join(''),pref);
}

function showEventDetails(eventId)
{
	var url = '?q=event.info&eventId=' + eventId;
	var wpref = 'width=500,height=400,menubar=0,status=0,titlebar=0,resizable=1,scrollbars=1';
	var win = window.open(url,'eventmapdetail',wpref);
	win.focus();
}
		

function initPage()
{
	initData();
	initMap();
	initCal();
	doSearch();
}


	
function initData()
{
	for (var x in eventArr){
		var  obj = eventArr[x];
		obj.eventLat = parseFloat(obj.eventLat);
		obj.eventLng = parseFloat(obj.eventLng);
		obj.latlng = new GLatLng(obj.eventLat,obj.eventLng);



		// used in vertical listing at right-side
		obj.href1 = '<a href=javascript:showEventInfo('
				+ obj.eventId + ')>'
			+ '<span class=event_daterange_mini>'
			+ mkDateRange(obj) + '</span><br>'

				+ obj.eventName + '</a>';

		obj.href2 = ''
		+ '<a href=javascript:showEventDetails('
			+ obj.eventId + ')>' 
		+ '<span class=event_daterange_mini>'
		+ mkDateRange(obj) + '</span><br>'
		+ obj.eventName + '</a>';
	}

}

var calFmt = '%Y-%m-%d';
var mapCluster;

function initCal() 
{
	dpyCal = new dhtmlxDblCalendarObject('caldiv',true);
	dpyCal.setDateFormat(calFmt);
        dpyCal.leftCalendar.attachEvent('onClick',handleCal1);
        dpyCal.rightCalendar.attachEvent('onClick',handleCal2);
	// by default - show the next two months
	var now = new Date();
	now.setMonth(2 + now.getMonth());
	var dt = fixDate(now);
console.log('setting dt=',dt);
	dpyCal.rightCalendar.setFormatedDate(calFmt,dt);
console.log('done');
}

function fixDate(obj)
{
	var ans = new Array();
	var y = obj.getFullYear(); 
	var m = 1+obj.getMonth(); if (m<10) m = '0' + m;
	var d = obj.getDate(); if (d<10) d = '0' + d;
	ans.push(y,m,d);
	return ans.join('-');
}

var dz;
function initMap()
{
        window.onunload = GUnload;
        var el = document.getElementById('dpymap');
	if (!el){ alert('missing dpyMap'); return; }

        dpyMap = new GMap2(el);
        dpyMap.setCenter(new GLatLng(60,-120),5);


	//dpyMap.addControl(new GSmallZoomControl3D());
	//dpyMap.addControl(new GSmallMapControl());
	dpyMap.addControl(new GLargeMapControl3D(),
			// try to hide the pan controls
	 	new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(-20,-60))
	);

	dpyMap.addControl(new GMenuMapTypeControl());

	dz = new DragZoomControl({},{ backButtonEnabled:true },{});
	dpyMap.addControl(dz, 
	 new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(100,5)));

	
console.log('done initMap');

}

function initMapCluster()
{
	mapCluster = new Clusterer(dpyMap);
	mapCluster.SetMaxVisibleMarkers(1);
	mapCluster.SetMinMarkersPerCluster(2);
}




var monthNames='xxx Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec'.split(' ');

function mkDateRange(obj)
{
	var mdy1 = mkMonDayYear(obj,1);
	var mdy2 = mkMonDayYear(obj,2);

	var htm = new Array();
	htm.push(mdy1);
	if (mdy1 != mdy2) htm.push(' - ', mdy2);
	return htm.join('');
}


function mkMonDayYear(obj,i)
{
        // produces Jan 12 2009
	var arr = obj['ymd'+i].split('-');
console.log(arr);
        var y = arr[0];
        var m = parseInt(arr[1].replace(/^0/,''));
        var d = parseInt(arr[2].replace(/^0/,''));

        var ans =  monthNames[m] + ' ' + d+ ' ' + y;
console.log(ans);
	return ans;
	
}


function handleCal1(dtstring) { console.log('cal1 - ',dtstring); }
function handleCal2(dtstring) { console.log('cal2 - ',dtstring); }


function zoomCluster(lat,lng)
{
	//saveBackContext();
	var pt = new GLatLng(lat,lng);
	var z = dpyMap.getBoundsZoomLevel(cecCluster.bounds);
	//dpyMap.setCenter(pt, 2 + dpyMap.getZoom());
console.log('zoomCluster',cecCluster.bounds,z);
	dpyMap.setCenter(pt, z);
}

function XXsaveBackContext()
{
console.log('saving .. ');
	dz.saveBackContext_('<span class=dz>back</span>',false);
	dz.globals.backButtonDiv.style.display = 'block';
}
	


/* Miles/Lat/Lng references

http://www.worldatlas.com/aatlas/imageg.htm
 - 1 degree latitude => 69.1 72 miles
 - 1 degree lng
	=> 71 miles at equator
	=> 49 miles at 45 degrees


http://www.ncgia.ucsb.edu/giscc/units/u014/u014.html

The distance between meridians of longitude on a sphere 
is a function of latitude:

    * Mathematical expression: Length of a degree of longitude = cos (latitude) * 69.172 miles


SO ...
 - take person's address -> lat/lng
 - latmiles = 70 
 - lngmiles = cos(lat) * 70

 - dmiles = 5
 - dlng = 0 - go N/S on same lng line
 - dlat = dmiles / lngmiles

 - clearOverlays
 - go thru and filter the events
 - create 

*/



/*


Use these as buttons:

 show all upcoming events

 show all mdy - mdy events

 event listing:
   - checkbox - restrict to currently visible events

**************
?? are the green-square modes - just options on the list 
	- seems like yes because the map still has all the markers 
**************

Use this for echo:

 showing events:
   - when:  anytime  or mdy1 - mdy2
   - where: anywhere or in green-square  


This page will show a listing of upcoming events,
and also a map of their location.



LIST		MAP



*/

	

