// Calendar utility scripts
// Modified 2004-02-20, by M.Kanzaki
// hacked about 2004-12-30 by Libby Miller
/* --------------------------------------------------------------
  This set of scripts is copyright (c) 2003-2004 by Masahide Kanzaki.
  You can redistribute it and/or modify it under the terms of 
  the GPL (GNU General Public License) .
  See <http://www.gnu.org/licenses/gpl.html> for detail of license.
  Japanese taranslation <http://www.opensource.jp/gpl/gpl.ja.html>
  ---------------------------------------------------------------- */

var gD = new Date();
var gMmax = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
var gMstr = new Array("","January","February","March","April","May","June","July","August","September","October","November","December");
var gY = gD.getFullYear();
var gM = gD.getMonth()+1;
var gDm = gD.getDate();
var gTr,gFirstYM="0000-00", gLastYM="9999-99";
gMmax[2] = febMax(gY);
var gCaldispMax, gCalLocMax;
var gNextCal, gPrevCal;

function newcal(lng){
	//document.getElementById('mcal').innerHTML = gencal();
	document.getElementById('allevents').style.display = 'none';
	gCaldispMax = (lng == 'ja' ? 20 : 36);
	gCalLocMax = (lng == 'ja' ? 4 : 7);
//////fixprev??
	gNextCal = (x = document.getElementById('refnext')) ? x.getAttribute('href') : "";
	gPrevCal = (x = document.getElementById('refprev')) ? x.getAttribute('href') : "";
	initcal();
}

function gencal(y,m){
	if(!y){y=gY;m=gM;}
	m = m * 1;
	//alert("y:" + y + ",m:" + m );
	var stdate = gMstr[m] + " 1, " + y;
	var pos = 1-(new Date(stdate)).getDay();
	var max = (m==2 ? febMax(y) : gMmax[m]);
	var isThisMonth = (y==gY && m==gM) ? true: false;
	var py = y, ny = y;
	var pm = m-1, nm = m+1;
	if(pm == 0) { pm = 12; py--;}
	else if(nm > 12){nm = 1; ny++;}
	var pym = py + "-" + dig2(pm);
	var nym = ny + "-" + dig2(nm);
	var nomsg = '"No schedule"';

//fix firstym to this year
	if(m==1){gFirstYM=gY+"-"+gM;}
	if(m==12){gLastYM=y+"-"+m;}

	var pv = (pym>=gFirstYM) ? "<button onclick='update(" + py + "," + pm + ");'> &lt;&lt; Prev </button> " : 
		(gPrevCal ? "<a href='"+gPrevCal+"'>Previous Calendar</a> " : "<span class='misc'> (none for prev) </span> ");
	var nx = (nym<=gLastYM) ? " <button onclick='update(" + ny + "," + nm + ");'> Next &gt;&gt; </button> " : 
		(gNextCal ? " <a href='"+gNextCal+"'>Next Calendar</a>" : " <span class='misc'> (none for next) </span>");
	var cap =  pv + "&nbsp;&nbsp;&nbsp;<span class='tcap'>" + gMstr[m] + " " + y + "</span>&nbsp;&nbsp;&nbsp;" + nx;
	cal="<table class='cal' border='1' cellspacing='0' cellpadding='4'><caption>" + cap + "</caption><thead><tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr></thead><tbody>";
	for(i=0;i<42;i++,pos++){
		if(i % 7 == 0) cal += "<tr>";
		cal += "<td ";
		//cal += "<td onclick='alert(this.getAttribute(" + "¥"id¥"" + "))' ";
		if(pos > 0 && pos <= max){
			if(pos==gDm && isThisMonth) cal += "class='today' ";
			cal += "id='d"+dig2(pos)+"'><em>"+pos+"</em>"
		}else cal += "class='ncm'>&nbsp;";
		cal += "</td>";
		if(i % 7 == 6){cal += "</tr>"; if(pos >= max) break;}
	}

	cal += "</tbody></table><p class='misc' style='margin-top:0.3em'>*This calendar does not reflect recurrence rules and timezone (except UTC). See each componet for <span onclick='showAEtbl()'>detail</span>.</p><div id='moreevt'> </div>";
	return cal;
}
function dig2(v){
	if(String(v).length == 1) return "0" + v
	else return v;
}

function febMax(y){
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) return 29
	else return 28;
}


function showAEtbl(){
	document.getElementById('allevents').style.display="block";
}

function initcal(){
	//var myMex = y + "-" + dig2(m+1);
	var lastDtend;
	gTr = document.getElementById("slist").getElementsByTagName("tr");
	gFirstYM = gTr.item(0).className.substr(0,7);
	var lastTr = gTr.item(gTr.length-1);
	if(lastDtend = lastTr.getElementsByTagName("td").item(1).firstChild)
		gLastYM = lastDtend.data.substr(0,7)
	else gLastYM = lastTr.className.substr(0,7);
	var myM = gY + "-" + dig2(gM);
	if(myM >= gFirstYM && myM <= gLastYM) update(gY, dig2(gM))//showSched(gY, dig2(gM))
	else if(myM > gLastYM) update(gLastYM.substr(0,4),gLastYM.substr(5,2))
	else update(gFirstYM.substr(0,4),gFirstYM.substr(5,2));
}

function showSched(y,m){
	var x,d,t,td,rrule,summary;
	var edt,et,d0,tgym;
	var contevt ="";
	var ym = y + "-" + m;
	var ld = new Array(2);
	for(i=0;i<gTr.length;i++){
		x = gTr.item(i);
		tgym = x.className.substr(0,7); //target y-m
		//show sched if this month or pervious month
		if(tgym <= ym){
			td = x.getElementsByTagName("td");
			summary = td.item(3).firstChild ? td.item(3).firstChild.data : "(no summary)";
			if(summary.length > gCaldispMax + 2) summary = summary.substr(0,gCaldispMax) + " ...";
			//2004-01-19
			loc = td.item(4).firstChild ? td.item(4).firstChild.data : "";

/*
			if(loc){
				loc = (loc.length > gCalLocMax) ? " @" + loc.substr(0,gCalLocMax) + "..." : " @" + loc;
			}
*/
			if(loc){

				loc="<br /><img src=\""+loc+"\" height=\"60\"/>";
			}
			//already started in previous month, list under the table
			if(tgym < ym){ 
				if(edt = td.item(1).firstChild){
					if(edt.data.substr(0,7) >= ym){ //if continues in this mo
						contevt += "<li>"+x.className.substr(0,10) + " -" + endDate(edt.data.substr(0,10),x.className.substr(0,4)) + ":<a href='"+x.getElementsByTagName("a").item(0).getAttribute("href") + "'>" + summary + "</a>" + loc + "</li>";
					}
				}
			//event of this month
			}else if(tgym == ym){ 
				d0 = d = x.className.substr(8,2); //date
				t = x.className.substr(11,5); //time
				//test if UTC
				if(x.className.substr(19,1) == 'Z'){
					if(!(ld=utc2local(y,m,d,t))) continue;
					d = dig2(ld[0]);
					t = dig2(ld[1]) + t.substr(2);
				}
				t += '-';
				//check dtend -- if exists <dtend>
				if(edt = td.item(1).firstChild){
					//ends on the same date -- get time
					if((et = edt.data.substr(11,5)) && edt.data.substr(8,2) == d0){
						if(edt.data.substr(19,1) == 'Z'){
							if(ld=utc2local(y,m,d0,et)) et = dig2(ld[1]) + et.substr(2)
							else et='';
						}
						t += et; //end time
					//more than 2 days
					}else if(edt.data.length == 10){
						t += endDate(edt.data,y,m,d0);
					}else t += edt.data; //date and time, hmm..
				}
				rrule = td.item(2).firstChild ? "*" + td.item(2).firstChild.firstChild.data.toLowerCase() : "";
				//get target cell on monthly calendar and set value
				target = document.getElementById("d" + d);
				target.innerHTML += "<br /><span class='tm'>" + t + "</span> <a href='"+x.getElementsByTagName("a").item(0).getAttribute("href") + "'>" + summary + "</a>" + loc + rrule;
			}
		}
	}
	if(contevt) document.getElementById("moreevt").innerHTML = "<strong>Continuing event(s)</strong>:<ul>"+contevt+"</ul>";
}

function utc2local(y,m,d,t){
	m = m*1;
	var dt = new Date(gMstr[m] + " " + d +  ", " + y + " " + t + " UTC");
	if(dt.getMonth() + 1 != m) return false;
	var l = new Array();
	l[0] = dt.getDate();
	l[1] = dt.getHours();
	return l;
}

//calc the day before dtend
function endDate(dte,y0,m0,d0){
	var y = dte.substr(0,4);
	var m = dte.substr(5,2)*1;
	var d = dte.substr(8,2)*1;
	if(d == 1){
		if(m == 1){
			y--; m=12; d=31;
		}else if(m == 3){
			m=2; d=febMax(y);
		}else{
			d = gMmax[--m];
		}
	}else d--;
	
	if(y==y0 && m==m0*1 && d<=d0*1) return ""; // 1 day (or 0)evt
	dte = dig2(m) + "-" + dig2(d);
	if(y > y0) dte = y + "-" + dte;
	return "&gt; " + dte;
}


function update(y,m){
	document.getElementById('mcal').innerHTML = gencal(y,m);
	showSched(y, dig2(m));
}


//requires geo.js
function showmap(lat,lon,tzid,type){
	var loc;
	if(tzid.match(/(Tokyo|Japan)/) || (lon > 129.6 && lon < 146.5 && lat > 31 && lat < 44.5)){
		var xlat,xlon,nl,el,nm,em,ns,es, grp,scl;
		if(type == 'park'){grp = 'tpark2'; scl=10000;}
		else{grp = 'pda'; scl=20000;}
		loc = "http://www.mapion.co.jp/c/f?";
		tokyo = TransDatum(lat+"",lon+"",true);
		loc += 'nl=' + deg2dms(tokyo[0]) + '&el=' + deg2dms(tokyo[1]) + '&uc=1&grp=' + grp + '&scl=' + scl + '&size=600,500';
	}else{
		loc = "http://www.mapquest.com/maps/map.adp?latlongtype=decimal&zoom=6&latitude=" + lat + "8&longitude=" + lon;
	}
	location.href = loc;
}


