function nullval(val,msg,err) {        var at=val.indexOf("\"");       var amsg;
        if (trim(val)=='') { err=err+msg+".\n";      return(err);	}
        if (at>=0) {    amsg="Invalid character (character '\"' at #"+at+" in text).";  alert(amsg);    }
	return("");
}
function trim(str) {    return str.replace(/^\s*|\s*$/g,"");    }
function mcalc(form) {
	var err="", mode="";	var i, line, grp, grp1, grp2, phtm;	var ct=0, tot=0, big=0;
	var meas=trim(form['MEAS'].value);	var repeat=new Array();	var sgrp=new Array();
	err=nullval(meas,'Please enter some measurements',err);	meas=meas.replace(/\r/g,"");	//MSDOS carriage return
	var lines=meas.split("\n");
	phtm="<HTML><HEAD><TITLE>Measurement Calculator</TITLE>\n";
phtm=phtm+"<sCRiPt LANGUAGE='JavaScript' Type='text/javascript' Src='js/toggle.js'></sCRiPt>\n";
phtm=phtm+"<sCRIPt LANGUAGE='JavaScript' Type='text/javascript' Src='js/graph.js'></sCRIPt>\n";
phtm=phtm+"</HEAD><BODY onLoad=\"allhid('HiD');\" onKeypress=\"incvis('HiD');\">";
	var head="<TablE Align='righT' cellpadding=1 cellspacing=0 border=1><TR><th>#</th><th>height (cm)</th<th>5-cm interval</th><th>total</th</TR>\n";
	var nav="<TablE><tR><Td aLIGN=rIGHT>\n";
nav=nav+"<Img srC='images/class/skip-backward.gif' alT='' onClick=\"allhid('HiD');\">\n";
nav=nav+"<Img srC='images/class/back.gif' alT='' onClick=\"decvis('HiD');\">\n";
nav=nav+"<Img srC='images/class/play.gif' alT='' onClick=\"incvis('HiD');\">\n";
nav=nav+"<Img srC='images/class/skip-forward.gif' alT='' onClick=\"allvis('HiD');\">\n";
nav=nav+"<Img srC='images/class/refresh.gif' alT='' onClick=\"window.location.reload();\">\n</Td></tR></TablE>\n";
	nav="";
	phtm=phtm + head;
	for(i in lines){
		line=lines[i];	ct++;
		if (line.match(/[^\d.]/)) {
			err=err+"Invalid value in line "+ct+": "+line+".\n";
		} else {
		if (! (line.match(/\d/))) {
			err=err+"Incorrect value in line "+ct+": "+line+".\n";
		}
		}
	}
	if (err.length>0) {	alert(err);	return false;	}
	lines.sort();
	for(i in lines){
		line=lines[i];	tot+=parseInt(line);	hi = line;
		if(repeat[line]) {	repeat[line]++;
		} else {	repeat[line]=1;	}
//alert(line+"="+repeat[line]+"!");
		if(repeat[line] >= big) {
			if(repeat[line] > big) {
				mode="";
			}
			big=repeat[line];
			mode=mode+", "+line+"("+big+")";
		}
		grp=Math.floor(lines[i] / 5);	grp1=grp*5;	grp2=grp1+4;
		if(sgrp[grp1]) {	sgrp[grp1]++;
		} else {	sgrp[grp1]=1;	}
		j=parseInt(i)+1;
phtm=phtm + "\n<tr><td align=right>"+j+"</td><td align=center>"+lines[i]+"</td><td align=center>"+grp1+" - "+grp2+"</td><td align=right>"+sgrp[grp1]+"</td></tr>";
	}
	if(big == 1) {
		mode="None";
	} else {
		mode=mode.substr(2);
	}
	mean = Math.round(tot / ct);	lo = lines[0];	
	med = Math.round(ct / 2);	median = lines[med-1];
//	for(i in lines){	}
phtm=phtm + "\n</table>"  + nav + "<P ID='INV' naMe='INV'>Press space bar to continue.</P><table>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Range:</td><td align=right ID='HiD' naMe='HiD'>"+lo+" - "+hi+".</td></tr>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Sum:</td><td align=right ID='HiD' naMe='HiD'>"+tot+".</td></tr>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Number of students:</td><td align=right ID='HiD' naMe='HiD'>"+ct+".</td></tr>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Mean:</td><td align=right ID='HiD' naMe='HiD'>"+mean+".</td></tr>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Median (#"+med+"):</td><td align=right ID='HiD' naMe='HiD'>"+median+".</td></tr>";
phtm=phtm + "\n<tr><td ID='HiD' naMe='HiD'>Mode:</td><td align=right ID='HiD' naMe='HiD'>"+mode+".</td></tr>";
phtm=phtm + "\n</table><P><Div ID='HiD' naMe='HiD'>Graph:</Div><p>";
//alert("lo="+lo+" hi="+hi+"?");
	var win = window.open("","myWindow","resizable=yes,scrollbars=yes,menubar=yes,width=900,height=620");
	doc = win.document.open();	doc.writeln(phtm);
	var g = new Graph(460,200);	var gdat=new Array();	var gXat=new Array();
	for(i=lo; i<hi; i++) {
		grp=Math.floor(i / 5);	grp1=grp*5;
		if(sgrp[grp1]) {		//doc.writeln("Sgrp:"+i+"="+grp1+"="+sgrp[grp1]+"!");
		} else {	sgrp[grp1]=0;	//doc.writeln("0grp:"+i+"="+grp1+"="+sgrp[grp1]+"?");
		}
	}
	for(i=0; i<sgrp.length; i++){	grp2=i+4;
		if(sgrp[i] || sgrp[i]==0) {
		gdat.push(sgrp[i]);	gXat.push(i+"-"+grp2);	//doc.writeln("I:"+i+"="+sgrp[i]+"!");
		}
	}
//alert("Gdata:"+gdat+"="+gdat.length+"="+gXat+"!");
	g.addRow		(gdat[0],gdat[1],gdat[2],gdat[3],gdat[4],gdat[5],gdat[6],gdat[7],gdat[8],gdat[9]);
	g.setXScaleValues	(gXat[0],gXat[1],gXat[2],gXat[3],gXat[4],gXat[5],gXat[6],gXat[7],gXat[8],gXat[9]);
	g.title = "Student Height Distribution";
	g.xLabel = "Heights in 5-cm intervals";
	g.yLabel = "# of students";	g.scale = 1;
//alert("gdata:"+gdat+"="+gdat.length+"="+gXat+"!");
	g.build(doc);
	whoami("Microsoft Internet Explorer","Internet Explorer may hang; try another browser");
	doc.writeln("</BODY></HTML>");
	doc.close();
	return true;
}

