function rewrite2() {
// rewrite2 updates table1 date/time info
	tbl.local_date.value = datestring(observer);
	var jdstr = fixnum(jdnoDelta(observer),11,3);
}		// end rewrite2()


function reset1() {
// reset1 restores the input table to its default settings
	// initialize date from system clock
	setNow();			
	tbl.Place.selectedIndex = 0;
	updateplace(true);
}		// end reset1()


function setDateTime(rel) {
	// handles changes to the time and date fields in table1. Also handles time step buttons.
	// 'rel' is relative adjustment in minutes. If rel = 0 evaluate date and time fields.
	if (rel != 0) {
		adjustTime(observer,rel);
		rewrite2();
		return;
	}
	var vald = tbl.local_date.value;
	// date field
	var col1 = vald.indexOf("/");
	var col2 = vald.lastIndexOf("/");
	var col3 = vald.length;
	var day = 1;
	var month = 1;
	if (col1>0) day = parseInt(vald.substring(0,col1),10);
	if (col2>0) month = parseInt(vald.substring(col1+1,col2),10);
	var year = parseInt(vald.substring(col2+1,col3),10);
	month_length[1] = leapyear(year)?29:28;
	if ((month>12) || (month<0)) month = 1;

	if ((day > month_length[month-1]) || (day<0)) {
		day = 1;
		month = 1;
	}
	
	observer.day=day;
	observer.month = month;
	observer.year = year;
	// time field
	observer.hours = 0;
	observer.minutes = 0;
	observer.seconds = 0;
	rewrite2();
}	// setDateTime()


function setNow(settimezone,changeDST) {
	// Handles 'Now' button
	var now = new Date();
	observer.year = now.getFullYear();
	month_length[1] = leapyear(observer.year)?29:28;
	observer.month = now.getMonth()+1;
	observer.day = now.getDate();
	observer.hours = now.getHours();
	observer.minutes = now.getMinutes();
	observer.seconds = 0;
	rewrite2();
}		// setNow()


function set12(noon) {
// set to noon or midnight
	if (noon) {
		observer.hours = 12;
		observer.minutes = 0;
	}
	else {
		observer.hours = 0;
		observer.minutes = 0;
	}
	rewrite2();
}	// set12()


function jd2dt() {
	// handle julian day input
	var zdt=jdtocd(parseFloat(tbl.julian.value));
	tbl.local_date.value = zdt[0]+"/"+zdt[1]+"/"+zdt[2];
	setDateTime(0);
}		// end jd2dt()

function updateplace(fromtable) {
	// updateplace handles the place selection in table1
	// if 'fromtable' is true get data from 'selected' table entry, else just read Placename field
	var ndx = tbl.Place.selectedIndex;
	if (fromtable) {
		if ((ndx >= 0) && (ndx <= atlas.length)) {
			observer.name = atlas[ndx].name;
			observer.latitude = parsecol(atlas[ndx].latitude);
			observer.longitude = -parsecol(atlas[ndx].longitude);
			rewritePlace();
			rewrite2();
		} 
	}
	else {
		observer.name = tbl.Placename.value;
	}
}	// end updateplace()


function rewritePlace() {
	tbl.Placename.value = observer.name;
	tbl.Latitude.value = dmsstring(observer.latitude);
	tbl.Longitude.value = dmsstring(observer.longitude);
	tbl.North.selectedIndex = observer.latitude>0?0:1;
	tbl.West.selectedIndex = observer.longitude>0?0:1;
}	// rewritePlace()


function updatell() {
	// updatell handles the latitude/longitude changes in table1
	var lat = parsecol(tbl.Latitude.value);
	observer.latitude = tbl.North.selectedIndex==0?lat:-lat;
	var lon = parsecol(tbl.Longitude.value);
	observer.longitude = tbl.West.selectedIndex==0?lon:-lon;
	if (Math.abs(observer.latitude)>90) observer.latitude=0;
	if (Math.abs(observer.longitude)>180) observer.longitude=0;
	observer.name = "";
	rewritePlace();
	rewrite2();
}		// end updatell()

function switchboard(funct) {
	// find out what has been requested and call corresponding page maker
	var starttime = new Date();	// if timer_on: Measure execution time
	var dspan = datecount[tbl.Times.selectedIndex]; //>0 giorni, <0 mesi
	var dstep = 1; //1 giorno
	// check if an excessive number of lines would be generated, limit dspan if necessary
	if (dstep < 1 && dstep > 0 && dspan < -2) dspan = -2;
	if (dstep < 7 && dstep > 0 && dspan < -12) dspan = -12;
	var chart=false;
//	var deepsky = (tbl.Starordso.selectedIndex == 1);
	var p = objlist[tbl.object.selectedIndex];
	if (p==USER) {	
		bodies[USER].ra = 15.0*parsecol(tbl.ra.value);
		bodies[USER].dec = parsecol(tbl.dec.value);
		bodies[USER].name = tbl.objname.value;
	}

	if (chart && !(funct==L_EV || funct==P_EV)) {
		if (funct==VIS) {
			if (p==100) doPlanetVisibility(observer,true);	// all planets
			else doVisibility(observer, p, dspan, dstep, true);
		} 
		else if (funct==A_A)	doAltitude(observer,p,aastep[tbl.Altaz_step.selectedIndex]);
		else if (funct==TWI && p!=SUN) doTwilightVisibility(observer,p, dspan, dstep,twl_alt[tbl.Twil_alt.selectedIndex]);
		else if (funct==DAT && p<USER) doDataGrph(observer,p, dspan, dstep);
		else if (funct==POS && tbl.postool[1].checked && p!=USER) doAngles(observer,p, dspan, dstep,LON);
		else if (funct==POS && tbl.postool[2].checked && p!=SUN) doAngles(observer,p, dspan, dstep,ELON);
		else if (funct==POS && p!=USER) doAngles(observer,p, dspan, dstep,DEC);
	}
	else {
		if ((funct==VIS || funct==DAT || funct==POS) && p==100) doAllPlanets(observer);
		else if (funct==VIS && p <= USER)	doDailyEvents(observer, p, dspan, dstep);
		else if (funct==DAT && p < USER) doObjectData(observer,p,dspan, dstep);
		else if (funct==POS && p < USER) doPositions(observer,p,dspan, dstep);
		else if (funct==A_A && p <= USER) doAltAz(observer,p,aastep[tbl.Altaz_step.selectedIndex]);
		else if (funct==SEP && p <= USER) 
			doSeparation(observer,p,obj2[tbl.Object2.selectedIndex],aastep[tbl.Altaz_step.selectedIndex]);
		else if (funct==TWI && p <= USER && p!=SUN)
			doTwilightAltAz(observer,p,dspan,dstep,twl_alt[tbl.Twil_alt.selectedIndex]);
		else if (funct==L_EV) doPlanetEvents(observer, dspan, true, false);
		else if (funct==P_EV) doPlanetEvents(observer, dspan, tbl.lun_ev.checked, true);
	}
	var endtime = new Date();
	if (timer_on) alert("Function executed in " + ((endtime.getTime() - starttime.getTime())/1000) + "seconds");
}



