irpocket.addComma = function(s) {
	var to = String(s);
	var tmp = "";
	while(to != (tmp = to.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))) {
		to = tmp;
	}
	return to;
};

irpocket.formatDate = function(date, format) {
	var ymd = (new String(date)).replace(/ .+$/, '').split(/[-\/ ]/);
	var f = format || "YYYY.MM.DD";
	return f.replace(/YYYY/, ymd[0]).replace(/MM/, ymd[1]).replace(/DD/, ymd[2])
			.replace(/YY/, ymd[0]%100).replace(/M/, 1*ymd[1]).replace(/D/, 1*ymd[2]);
}

irpocket.handlerTable = function(result) {
	// data.cols[]
	// data.units[]
	// data.times[year,term,data[]]
	
	// TR
	//  TH yn: year name
	// TR ft ot: First term, Other term
	//    q1 q2 q3 q4: quarter name
	//  TH qn: quarter name
	//  TH cn: data type name
	//  TD latest past: for value cell
	
	var target = (irpocket && irpocket.table_target) || document;
	
	var cols = [ ];
	var units = { };	// by cols
	var years = [ ];
	var values = { };	// by year, term, cols
	while(0 < result.length) {
		var data = result.shift();
		for(var ci=0 ; ci<data.cols.length ; ci++) {
			cols.push(data.cols[ci]);
			units[data.cols[ci]] = data.units[ci] || "";
		}
		for(var t=0 ; t<data.times.length ; t++) {
			var d = data.times[t];
			if(values[d.year] == undefined) {
				values[d.year] = [ ];
				years.push(d.year);
			}
			if(values[d.year][d.term] == undefined) {
				values[d.year][d.term] = { };
			}
			for(var di=0 ; di<d.data.length ; di++) {
				values[d.year][d.term][data.cols[di]] = d.data[di];
			}
		}
	}
	
	years.sort();	// old -> new
	var latest_year = years.length ? years[years.length-1] : undefined;
	var yi_size = irpocket.highlight.years || 5;
	while(0 < yi_size && yi_size < years.length) {
		years.shift();
	}
	
	var terms_base = [ ];
	var terms_status = { };
	for(var t=0 ; t<data.times.length ; t++) {
		if(!terms_status[data.times[t].term]) {
			terms_status[data.times[t].term] = 1;
			terms_base.push(data.times[t].term);
		}
	}
	terms_base.sort().reverse();	// 4 -> 1
	
	target.write('<table><tr><th colspan="2">&nbsp;</th>');
	for(var yi=0 ; yi < years.length ; yi++) {
		var ym = years[yi];
		if(irpocket.highlight.termFormat) {
			ym = irpocket.formatDate(ym+"/1", irpocket.highlight.termFormat);
		}
		target.write('<th class="yn">'+ym+'</th>');
	}
	target.write('</tr>');
	
	var title_conf = irpocket.highlight.title || { };
	var terms_conf = irpocket.highlight.term || { };
	var quarter = (irpocket.message && irpocket.message.quarter) || { };
	for(var ci=0 ; ci < cols.length ; ci++) {
		var hl_code = cols[ci];
		var title = title_conf[hl_code] || hl_code;
		var unit = irpocket.highlight.unit[units[hl_code]] || "";
		var terms = terms_conf[hl_code] || terms_base;
		for(var qi=0 ; qi < terms.length ; qi++) {
			var tr_class = (terms[qi]==4) ? 'ft' : 'ot';
			tr_class += ' q'+(qi+1);
			target.write('<tr class="'+tr_class+'">');
			if(qi == 0) {
				target.write('<th class="cn" rowspan="'+terms.length+'">'+title+'<br>'+unit+'</th>');
			}
			target.write('<th class="qn">'+quarter[terms[qi]-1]+'</th>');
			
			for(var yi=0 ; yi < years.length ; yi++) {
				var td_class = (years[yi]==latest_year) ? 'latest' : 'past';
				var value = '&nbsp;';
				if(values[years[yi]][terms[qi]] && values[years[yi]][terms[qi]][hl_code]) {
					value = irpocket.addComma(values[years[yi]][terms[qi]][hl_code]);
				}
				target.write('<td class="'+td_class+'">'+value+'</td>');
			}
			target.write('</tr>');
		}
	}
	target.write('</table>');
	
	target.finish && target.finish();
};

if(!window.ir20_handler) {
	window.ir20_handler = function(data) {
		if(data) {
			irpocket._table.result.push(data);
		}
		if(0 < irpocket._table.request.length) {
			var url = irpocket.base + irpocket.code + "/JS/" + irpocket._table.request.shift() + ".js";
			document.write('<script src="'+url+'" type="text/javascript" charset="UTF-8"></script>');
		} else {
			irpocket.handlerTable(irpocket._table.result);
		}
	}
}

if(!window.table_builder) {
	window.table_builder = window.ir20_handler;
}

(function() {
	var ss = document.getElementsByTagName('SCRIPT');
	var parent = ss[ss.length-1].parentNode;
	
	if(!irpocket
	|| typeof irpocket.code == 'undefined'
	|| parent.id.indexOf("irp-highlight-") != 0) {
		return;
	}
	
	irpocket._table = { request: parent.id.substr(14).split(/\+/), result: [ ] };
	window.ir20_handler(null);
})();

