
var evdb_winprops = "width=400,height=200,scrollbars=1,resizable=1,toolbar=1,menubar=1,location=1";
var evdb_poppedwin;

function evdb_popwin1() {
	evdb_poppedwin.focus();
}

function evdb_popwin(i)
{
      var url ="http://evdb.com/events/"+events[i].event_id;
	 evdb_poppedwin = window.open(url,"evdb_poppedwin");//,evdb_winprops);
     setTimeout('evdb_popwin1()',100);
}


function pop_win(url)
{
	 evdb_poppedwin = window.open(url,"evdb_poppedwin");//,evdb_winprops);
     setTimeout('evdb_popwin1()',100);
}




var nV = "null_Value";

var veryAlert = 0;

var eventsPerPage = 50;

function alertc(x)
{
   if (veryAlert) alert(x);
}

function mapclick(i)
	{
	selectPnt(i);
	var evg = evgroups[i];
	alertc(evg);
	alertc(typeof evg);
	if ((typeof evg)=="number") selectEvent(evg);
	else selectEvents(evg);
	setEventOption("atLocation");
//	alertc(evgroups[i]);
	}


function Vevent(idnt,ttl,dsc,month,dt,tm,edt,etm,vnu,loc,region,icd)
{
  this.event_id = idnt;
  this.title = ttl;
  this.description=dsc;
  this.month = month;
  this.date = dt;
  this.time = tm;
  this.endDate = edt;
  this.endTime = etm;
  this.venue = vnu;
  this.locality = loc;
  this.region = region;
  this.icalDate = icd;
}

// see javascript/iframe in www.quirksmode.org
var latitudes;
var longitudes;
var events;
var monthHtml;
var monthNames;
var dateNames = new Array();
var dateMonths = new Array();
var firstMap = 1;

function clearjs()
{
}



function isBlank(s)
{
  var ln,i;
  ln = s.length;
  if (ln == 0) return true;
  for (i=0;i<ln;i++)
      {
	  if (s.charCodeAt(i) != 32) return false;
	  }
   return true;
}


function loadjs(qry,qrylc,pg,pgsize)
{
   var qrs,hrs;
 //  alert("loadjs");
 //  var fre = document.getElementById('js');
 //  alert("fre "+fre);

  var fr = frames['js'];
 //  alert("fr "+fr);
   var lc = fr.location;
 //  alert("lc "+lc);
   qrs = "";
   if (!isBlank(qry)) qrs = "keywords="+URLEncode(qry)+"&";
   if (!isBlank(qrylc)) qrs += "location="+URLEncode(qrylc)+"&";
   hrs =  "/lib2/evdb/1.0/events.6.fs2?"+qrs+"page_number="+pg+"&page_size="+pgsize;
 //  alert(hrs);
   	lc .href = hrs;
	}

var selectedMonth = -1;
var selectedDate = nV;
var selectedEndDate = nV;
var selectedPoint = -1;
var selMarker = nV;
var noPosIndex = -1;
var dateIndex = -1;
var lastDateIndex = 0;
function computeDateIndex(dt)
{
   var ln,i;
   ln = allDates.length;
   for (i=lastDateIndex;i<ln;i++)
       {
	   if (allDates[i] == dt) 
	      {
		  lastDateIndex = i;
		  return i;
		  }
	   }
   for (i =0;i<lastDateIndex;i++)
      {
	   if (allDates[i] == dt) 
	      {
		  lastDateIndex = i;
		  return i;
		  }
	   }
   lastDateIndex = 0;
   return -1;
}
  

function toZoomLevel(dg) // degrees of extent
{
//   alert("dg = "+dg); //remove
   if (dg == 0) return 8;
   if (dg == 1) return 9;
 //  if (dg == 2) return 10;
   if (dg < 5) return 10;
   if (dg < 10) return 11;
   if (dg < 20) return 12;
   if (dg < 40) return 13;
   if (dg < 80) return 14;
   return 16;
}
function initmap(clong,clat,ext)
{
  var zml;
//  alert("initmap "+clong+" "+clat+" "+ext);
//   alertc("INITMAP ");
  selectedMonth = -1;
  selectedPoint = -1;
  selectedDate = nV;
  selectedEndDate = nV;
  selMarker = nV;
  noPosIndex = -1;
  dateIndex = -1;
  lastDateIndex = 0;


 clearjs();
   if (!firstMap) 
	  removeMarkers();

  // mkgpoints();
   showpnts();
   selectMonth(0);
   allTitles = allEvTitles();
   computeEventsByDate();
   computeGroupsOfEvents();
   var cn =   document.getElementById('content');
   cn . innerHTML = allTitles;
   setEventOption("allEvents");
   zml = toZoomLevel(ext);
   map.centerAndZoom(new GPoint(clong,clat),zml);

   firstMap = 0;
}


function noEvents()
{
   clearjs();
   if (!firstMap) removeMarkers();
   clearCalendar();
   hidePrevEvents();
  hideNextEvents();
  setEventMsg("<b>No Events</b>");

 //  var cn =   document.getElementById('content');
//   cn . innerHTML = "<html><body><b>No Events</b></body></html>";
}


var icon = new GIcon();
//icon.image = "event45.png";
icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
icon.iconSize = new GSize(12, 20);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 20);
icon.infoWindowAnchor = new GPoint(5, 1);

var markers = new Array();
// length(gpnts) is the number in use
 function createMarker(pnt,i)
	{
	var marker;
	if ((pnt.y) > 100) 
	   {
	   noPosIndex = i;
	   markers[i] = nV;
	   }
	else
	   {
	   marker = new GMarker(pnt,icon);
       markers[i] = marker;
       map.addOverlay(marker);
       GEvent.addListener(marker,'click',function () {mapclick(i)});
	   }
}

var selectedPoint = -1;
var selMarker;

 function selectPnt(i)
	{
	var pnt = gpnts[i];
	if (selectedPoint == i) return;

//	alertc(typeof selMarker != 'undefined');
	if (typeof selMarker != 'string') map.removeOverlay(selMarker);
	if (i == noPosIndex)
	   selMarker = nV;
	else
	   {
	   if ((selectedPoint >= 0) && (selectedPoint != noPosIndex))
	      map.addOverlay(markers[selectedPoint]);
	   selMarker = new GMarker(pnt);
	   GEvent.addListener(selMarker,'click',function () {mapclick(i)});
	   map.removeOverlay(markers[i]);
	   map.addOverlay(selMarker);
	   map.recenterOrPanToLatLng(pnt);
	   }
	selectedPoint = i;
	 }


 function unselectPnts()
	{
	if ((selectedPoint >= 0)&& (selectedPoint != noPosIndex))
	   {
	   map.removeOverlay(selMarker);
	   map.addOverlay(markers[selectedPoint]);
	   selectedPoint = -1;
	   }
}




function showpnts()
	{
	var ln = latitudes.length;
	gpnts = new Array();
	var i,pnt;
	for (i=0;i<ln;i++) 
       {
        pnt = new GPoint(longitudes[i],latitudes[i]);
	    gpnts.push(pnt);
		createMarker(pnt,i);
		}
    }


function removeMarkers()
{
    map.clearOverlays();
	markers = new Array();
/*
    var i;
	var ln = gpnts.length;
	for (i=0;i<ln;i++)
	    {
		if (i == selectedPoint)
		   map.removeOverlay(selMarker);
	    else
		   map.removeOverlay(markers[i]);
		}
*/
}




var gpnts = new Array();

function mkgpoints()
{
	var ln = latitudes.length;
    var i;
	gpnts = new Array();
	for (i=0;i<ln;i++) gpnts.push(new GPoint(longitudes[i],latitudes[i]));
}



    var map = new GMap(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
	var astoria = new GPoint(-123.8167, 46.1833);
	var uscenter = new GPoint(-100,40);
	var worldCenter = new GPoint(0,0);
    map.centerAndZoom(worldCenter,16);
//	showpnts(gpnts);
 // map.openInfoWindow(map.getCenterLatLng(),
 //                  document.createTextNode("Hello world"));  
 // map.openInfoWindow(map.getCenterLatLng(),
 //                  document.createTextNode("Hello world"));  


 function selectMonth(i)
 {
   if (i == selectedMonth) return;
   var mnm = monthNames[i];
//   alertc("selecting month "+mnm);
   var mncd = monthHtml[mnm];
   var cl =   document.getElementById('calendar');
   cl . innerHTML = mncd;
   selectedMonth = i;
}

function clearCalendar()
{
   var cl =   document.getElementById('calendar');
   cl . innerHTML = "<html></html>";
}



function calendarNextMonth()
{
   var ln = monthNames.length;
   if (selectedMonth < (ln-1))
      {
 	  unhighlightDates(selectedDate,selectedEndDate);
     selectMonth(selectedMonth+1);
 	  highlightDates(selectedDate,selectedEndDate);
	  }
}


function calendarPreviousMonth()
{
   if (selectedMonth > 0) 
      {
	  	  unhighlightDates(selectedDate,selectedEndDate);
	  selectMonth(selectedMonth-1);
 	  highlightDates(selectedDate,selectedEndDate);
     }
}


function evDescription(i)
{
   var rs;
   rs = "";
   rs += "<b>Title:</b>";
   rs += URLDecode(events[i].title);
   rs += "<br/><b>Links:</b>";
    rs += "<a  href=\"javascript:evdb_popwin("+i+")\">EVDB</a> <a href=\"javascript:rdf_popwin("+i+")\">RDF</a>";
  rs += "<br/><b>Description:</b>";
   rs += URLDecode(events[i].description);
   rs += "<br/><b>Date:</b>";
   rs += dateNames[events[i].date];
   rs += "<br/><b>Time:</b>";
   rs += events[i].time;
   rs += "<br/><b>Venue:</b>";
   rs += URLDecode(events[i].venue);
   rs += "<br/>"
   rs += events[i].locality;
   rs += ", ";
   rs += events[i].region;
   return rs;

}


function evTitles(evs)
{
   var ln,i,ev,evi;
   var rs = "";
   ln = evs.length;
   for (i=0;i<ln;i++)
       {
	   evi = evs[i];
	   
	   rs += '<a href="javascript:selectAnEvent(';
	   rs += evi;
	   rs += ');">'
	   ev = events[evi];
	   rs += URLDecode(ev.title);
	   rs += " ";
	   rs += dateNames[ev.date];
	   rs += '</a>';
	   rs += "<hr size=\"1\" noshade />\n";
	   }
   return rs;
}

// if evs are all in the same group, its index is returned
// ow -1
function inGroup(evs)
{
  var ln,cg,i,ng;
  inge = evs;//debug
  ln = evs.length;
  if (ln == 0) return -1;
  cg = events[evs[0]].group;
  for (i = 1;i<ln;i++)
      {
	  ng = events[evs[i]].group;
	  if (ng != cg) return -1;
	  }
  return cg;
}


// if evs are start on the same date, this date is returned
// ow nV
function eventsOnDate(evs)
{
  var ln,cd,i,nd;
  onde = evs;//debug
  ln = evs.length;
  if (ln == 0) return nV;
  cd = events[evs[0]].date;
  for (i = 1;i<ln;i++)
      {
	  nd = events[evs[i]].date;
	  if (nd != cd) return nV;
	  }
  return cd;
}

function eventsOnEndDate(evs)
{
  var ln,cd,i,nd;
  onde = evs;//debug
  ln = evs.length;
  if (ln == 0) return nV;
  cd = events[evs[0]].endDate;
  for (i = 1;i<ln;i++)
      {
	  nd = events[evs[i]].endDate;
	  if (nd != cd) return nV;
	  }
  return cd;
}


function identityArray(n)
{
  var rs = new Array(0);
  var i;
  for (i=0;i<n;i++)
	  rs.push(i);
  return rs;
}

  


function highlightDates(d0,d1)
{
   alertc("highlightDates "+d0+ "," + d1);
   var dtm,itm,i;
   if ((typeof d0) != "number") return;
   for (i=d0;i<=d1;i++)
       {
	   if (dateMonths[i] == selectedMonth)
	      {
          dnm = 'd'+i;
	      itm = document.getElementById(dnm);
          itm . className = 'calendarHighlightedEvent';
		  }
	   }
}



function unhighlightDates(d0,d1)
{
   var dtm,itm,i;
   if ((typeof d0) != "number") return;
   for (i=d0;i<=d1;i++)
       {
 	   if (dateMonths[i] == selectedMonth)
	      {
		  dnm = 'd'+i;
		  itm = document.getElementById(dnm);
		  itm . className = 'calendarEvent';
		  }
	   }
 //  selectedDate = nV;
 //  selectedEndDate = nV;
}

function unselectDates()
{
	  if ((typeof selectedDate)=="number") unhighlightDates(selectedDate,selectedEndDate);
	  selectedDate = nV;
	  selectedEndDate = nV;
}



function selectDates(d,ed)
{
      alertc("selectDates "+d+" "+ed);
	  if ((d == nV) || (ed == nV)) {unselectDates();return}
	  if ((d == selectedDate) && (ed == selectedEndDate)) return;
	  var mn = dateMonths[d];
	  if ((typeof selectedDate)=="number") unhighlightDates(selectedDate,selectedEndDate);
	  selectMonth(mn);
	  alertc("SELECTEDTHEMONTH");
	  highlightDates(d,ed);
      selectedDate = d;
      selectedEndDate = ed;
}


var lastEv;


function selectEvent(i)
{
      alertc("Select event "+i);
      var cn =   document.getElementById('content');
	  cn . innerHTML = evDescription(i);
	  var ev = events[i];
	  lastEv = ev;//debug
	  selectPnt(ev.group);
	  selectDates(ev.date,ev.endDate);

}


   
function selectEvents(evs)
{
  var cd,ed;
  alertc("selectEvents "+evs);
  var cn =   document.getElementById('content');
	  cn . innerHTML = evTitles(evs);
  var g = inGroup(evs);
  alertc("g = "+g);
  if (g >= 0) selectPnt(g); else
	  unselectPnts();
  cd = eventsOnDate(evs);
  ed = eventsOnEndDate(evs);
  selectDates(cd,ed);

}

// this is the variant called only links in  the event list in the contents div
function selectAnEvent(i)
{
      alertc("Select an event "+i);
      clearEventOptions();
	  selectEvent(i);

}


var eventsByDate = new Array();

function computeEventsByDate()
{
   var ebd,ln,i,ev,std,edt,j,evs;
   ln = events.length;
   eventsByDate = new Array();
   for (i=0;i<ln;i++)
       {
	   ev = events[i];
	   sdt = ev.date;
	   edt = ev.endDate;
	   for (j = sdt;j<=edt;j++)
	       {
		   evs= eventsByDate[j];
		   if ((typeof evs) == "undefined")
		      {
			  evs = new Array();
			  eventsByDate[j] = evs;
			  }
		   evs.push(i);
		   }
	   }
}

function computeGroupsOfEvents()
{
   var ln,i,evg,ev,gln,j;
   ln = evgroups.length;
   for (i=0;i<ln;i++)
       {
	   evg= evgroups[i];
	   if ((typeof evg)=="number")
	      {
		  ev = events[evg];
		  ev.group = i;
		  }
	   else
	      {
		  gln = evg.length;
		  for (j=0;j<gln;j++)
		      {
			  ev = events[evg[j]];
			  ev.group = i;
			  }
		  }
	}
}


function selectDate(dt)
{
  
  var evs = eventsByDate[dt];
  if ((evs . length) == 1) selectEvent(evs[0]);
  else selectEvents(evs);
  setEventOption("onDate");
}



function bumpDate(bmp)
{
  var dti,ln,dt;
   ln = allDates.length;
   if (ln == 0) {alert("no events");return}
   if (selectedDate == nV) {alert("No date selected");return;}
  dti = computeDateIndex(selectedDate);
  if ((bmp == 1) && (dti == (ln-1))) 
     {
	 alert("Last date is selected");
	 return;
	 }
  if ((bmp == -1) && (dti == 0)) 
     {
	 alert("First date is selected");
	 return;
	 }
  dt = allDates[dti+bmp];
    selectDates(dt,dt);
	selectDate(dt);
  
}
	 
function nextDate()
{
  bumpDate(1);
}

function prevDate()
{
  bumpDate(-1);
}

function firstDate()
{
  var dti,ln,dt;
   ln = allDates.length;
   if (ln == 0) {alert("no events");return}
  dti = 0;
  dt = allDates[dti];
    selectDates(dt,dt);
	selectDate(dt); 
}


function lastDate()
{
  var dti,ln,dt;
   ln = allDates.length;
   if (ln == 0) {alert("no events");return}
  dti = ln-1;
  dt = allDates[dti];
    selectDates(dt,dt);
	selectDate(dt); 
}
	 
	 

function setClassName(op,vl)
{
 var 	 itm = document.getElementById(op);
 itm . className = vl;
 }



   
function allEvTitles()
{
   return evTitles(identityArray(events.length));
}

var allTitles;

function allEvents()
{
     var cn =   document.getElementById('content');
   cn . innerHTML = allTitles;
   setEventOption("allEvents");
   unselectDates()
   unselectPnts();
}


function atLocation()
{
  if (selectedPoint < 0) {alert("No location selected");setEventOption(cEventOption);return;}
  setEventOption("atLocation");
  selectEvents(evgroups[selectedPoint]);
}


function onDate()
{
  if (selectedDate == nV) {alert("No date selected");return;}
   if (selectedDate != selectedEndDate) {alert("More than one date selected");return;}
   selectDate(selectedDate);
}





function hideNextEvents()
{
  var evb = document.getElementById("nextevents");
  evb.style.display = "none";
}


function hidePrevEvents()
{
  var evb = document.getElementById("prevevents");
  evb.style.display = "none";
}


function setPageSize()
{
  var qi = document.getElementById("pagesize");
  var qv = qi.value;
  var qvn = parseInt(qv);
//  alert("qvn = "+qvn);
  if (isNaN(qvn))
    {
	alert("Page size must be an int from 10 to 500");
	qi.value = eventsPerPage;
	return;
	}
  if ((qvn < 10)||(qvn > 500))
    {
	alert("Page size must be an int from 10 to 500");
	qi.value = eventsPerPage;
	return;
	}
  eventsPerPage = qvn;     



}


var cPage = 1;
var locSpecified = 0;
function executeQuery(pg)
{
  var ihtml;
  cPage = pg;
  var qi = document.getElementById("query");
  var qv = qi.value;
   var qli = document.getElementById("queryloc");
  var qlv = qli.value;
  if (isBlank(qv) && isBlank(qlv)) {alert("Blank query");return;}
  loadjs(qv,qlv,pg,eventsPerPage);
  setEventMsg("Searching ...");
  var urla = document.getElementById("urlargs");
  ihtml = "";
  if (!isBlank(qv)) ihtml += "keywords="+URLEncode(qv);
  if (!isBlank(qlv)) 
     {
	 if (!isBlank(qv)) ihtml += "&";
     ihtml += "location="+URLEncode(qlv);
	 }
  urla.innerHTML = ihtml;
  locSpecified = !isBlank(qlv);
}

var totalEvents;


function setNextEvents(vl)
{
  var evb = document.getElementById("nextevents");
  evb.style.display = "";
  evb.value = vl;
}




function setPrevEvents(vl)
{
  var evb = document.getElementById("prevevents");
  evb.style.display = "";
  evb.value = vl;
}


function eventRange(pg)
{
  var fev = (pg-1) * eventsPerPage + 1;
  var lev = pg * eventsPerPage;
  if (totalEvents < lev) lev = totalEvents;
  return fev+"-"+lev;
}


function setEventMsg(v)
{
  var evc = document.getElementById("eventcount");
  evc.innerHTML = v;
}


function setEventCount(v)
{
  totalEvents = v;
  setEventMsg("Events "+eventRange(cPage)+" of "+v);
  if (cPage > 1)
     setPrevEvents("Prev: "+eventRange(cPage-1));
  else
     hidePrevEvents();
  if (((cPage * eventsPerPage) -  1) < totalEvents) 
     setNextEvents("Next: "+eventRange(cPage+1));
  else   hideNextEvents();

  
}



function setPageCount(v)
{
//  alert("PAGE COUNT "+v);
}

function nextPage()
{
   cPage++;
   executeQuery(cPage);

}


function prevPage()
{
   if (cPage == 1) alert("Already at first page");
   cPage--;
   executeQuery(cPage);

}



function clearEventOptions()
{
   var rdv = document.getElementById("allevs");
   rdv.checked = false;
   rdv = document.getElementById("locevs");
   rdv.checked = false;

}
 
var cEventOption = "allEvents";

function setEventOption(vl)
{
  var rdv;
//  alert("setEventOption "+vl);
  if (vl == "allEvents") 
     {
     rdv = document.getElementById("allevs");
     rdv.checked = true;
	 }
 else
 if (vl == "atLocation") 
     {
     rdv = document.getElementById("locevs");
     rdv.checked = true;
	 }
 else clearEventOptions();
 cEventOption = vl;
}

/*
function selectWhichEvents()
{
    var rdv = document.getElementsByName("whichevs");
  var ln = rdv.length;
  var i = 0;
  var v = -1;
  for (i=0;i<ln;i++)
     {
	 if (rdv[i].checked) v = i;
	 }

   alert(v);
}
*/

  
function noop()
{}
