docs: function write_date(type, fmt, val, ss0) {
  	var o="", ss=0, tt=0, y = val.y, out, outl = 0;
  	switch(type) {
  		case 98: /* 'b' buddhist year */
  			y = val.y + 543;
  			/* falls through */
  		case 121: /* 'y' year */
  		switch(fmt.length) {
  			case 1: case 2: out = y % 100; outl = 2; break;
  			default: out = y % 10000; outl = 4; break;
  		} break;
  		case 109: /* 'm' month */
  		switch(fmt.length) {
  			case 1: case 2: out = val.m; outl = fmt.length; break;
  			case 3: return months[val.m-1][1];
  			case 5: return months[val.m-1][0];
  			default: return months[val.m-1][2];
  		} break;
  		case 100: /* 'd' day */
  		switch(fmt.length) {
  			case 1: case 2: out = val.d; outl = fmt.length; break;
  			case 3: return days[val.q][0];
  			default: return days[val.q][1];
  		} break;
  		case 104: /* 'h' 12-hour */
  		switch(fmt.length) {
  			case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
  			default: throw 'bad hour format: ' + fmt;
  		} break;
  		case 72: /* 'H' 24-hour */
  		switch(fmt.length) {
  			case 1: case 2: out = val.H; outl = fmt.length; break;
  			default: throw 'bad hour format: ' + fmt;
  		} break;
  		case 77: /* 'M' minutes */
  		switch(fmt.length) {
  			case 1: case 2: out = val.M; outl = fmt.length; break;
  			default: throw 'bad minute format: ' + fmt;
  		} break;
  		case 115: /* 's' seconds */
  		if(val.u === 0) switch(fmt) {
  			case 's': case 'ss': return pad0(val.S, fmt.length);
  			case '.0': case '.00': case '.000':
  		}
  		switch(fmt) {
  			case 's': case 'ss': case '.0': case '.00': case '.000':
  if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
  				else tt = ss0 === 1 ? 10 : 1;
  				ss = Math.round((tt)*(val.S + val.u));
  				if(ss >= 60*tt) ss = 0;
  				if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
  				o = pad0(ss,2 + ss0);
  				if(fmt === 'ss') return o.substr(0,2);
  				return "." + o.substr(2,fmt.length-1);
  			default: throw 'bad second format: ' + fmt;
  		}
  		case 90: /* 'Z' absolute time */
  		switch(fmt) {
  			case '[h]': case '[hh]': out = val.D*24+val.H; break;
  			case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
  			case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
  			default: throw 'bad abstime format: ' + fmt;
  		} outl = fmt.length === 3 ? 1 : 2; break;
  		case 101: /* 'e' era */
  			out = y; outl = 1;
  	}
  	if(outl > 0) return pad0(out, outl); else return "";
  }