var addComma = function(s) {
	var to = String(s);
	var tmp = "";
	while(to != (tmp = to.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))) {
		to = tmp;
	}
	return to;
};

var formatFloat = function(n, r) {
	var b = 1;
	while(0 < r--) {
		b *= 10;
	}
	n = new String(Math.round(n*b));
	r = (new String(b)).length - 1;
	return n.substr(0, n.length-r) + "." + n.substr(n.length-r);
}

var getElements = function(obj, tag, cname) {
	var results = [ ];
	var elements = obj.getElementsByTagName(tag);
	for(var i=0 ; i<elements.length ; i++) {
		var classes = (elements[i].className || '').split(' ');
		while(0 < classes.length) {
			if(classes.shift() == cname) {
				results.push(elements[i]);
			}
		}
	}
	return results;
};

var setHTML = function(obj, html) {
	if(obj && typeof obj.innerHTML != 'undefined') {
		obj.innerHTML = html;
	}
};

var setStyle = function(obj, name, value) {
	if(obj && obj.style) {
		obj.style[name] = value;
	}
};

if(typeof $ == 'undefined') {
	alert('jQuery is not loaded.');
}
(typeof $ == 'function') && $(function() {
	var db = document.getElementById('database');
	var db_table_area = document.getElementById('table_area');
	var db_table_area2 = document.getElementById('table_area2');
	var db_progress = document.getElementById('progress_footer');
	var db_progress_header = document.getElementById('progress_header');
	var rows = [ ];
	var condition = {
		purpose: false,
		area: false
	};
	var filter = function(init) {
		// first, remove everything
		if(!init) {
			for(var i=rows.length-1 ; 0<=i ; i--) {
				if(!rows[i].parentNode) {
					continue;
				}
				rows[i].parentNode.removeChild(rows[i]);
			}
		}
		
		var count = [ 0, 0 ];
		var total = [[ false, false, false, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
 					 [ false, false, false, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ];
		for(var i=0 ; i<rows.length ; i++) {
			var cols = rows[i].getElementsByTagName('TD');
			var purpose = getElements(rows[i], 'SPAN', 'purpose');
			if(condition.purpose !== false && purpose.length == 1 && purpose[0].innerHTML != condition.purpose) {
				continue;
			}
			var area = getElements(rows[i], 'SPAN', 'area');
			if(condition.area !== false && area.length == 1 && area[0].innerHTML != condition.area) {
				continue;
			}
			var p = 0;
			for(var j=0 ; j<=7 ; j++) {
				total[p][j] += cols[j].innerHTML.replace(/,/g, '') * 1;
			}
			count[p]++;
			if(!init) {
		//		if(p == 0) {
					db.appendChild(rows[i]);
		//		} else {
		//			db_progress.parentNode.insertBefore(rows[i], db_progress);
		//		}
			}
		//	if(count[1] == 1) {
		//		setStyle(db_progress_header, 'display', '');
		//		setStyle(db_progress, 'display', '');
		//	}
		}
		
		var info = {
			normal_total_5: addComma(formatFloat(total[0][5], 2)),
			normal_total_8: addComma(Math.round(total[0][8], 1)),
			normal_total_9: addComma(formatFloat(total[0][9], 1))
		};
		if(count[0] == 0) {
			setStyle(db_table_area, 'display', 'none');
			setStyle(db_table_area2, 'display', '');
			info['normal_total_10'] = '-';
		}else{
			setStyle(db_table_area, 'display', '');
			setStyle(db_table_area2, 'display', 'none');
			info['normal_total_10'] = addComma(formatFloat(total[0][10]/count[0], 1));
		}
		if(count[0] == rows.length){
			info['normal_total_9'] = '100.0';
			info['normal_total_11'] = addComma(total[0][11]);
		}else{
			info['normal_total_11'] = '-';
		}
		for(var id in info) {
			setHTML(document.getElementById(id), info[id]);
		}
	};
	
	// setup grouping tab
	var tabs = document.getElementById('db_group_tabs');
	if(tabs) {
		var tab_list = tabs.getElementsByTagName('TD');
		for(var i=0 ; i<tab_list.length ; i++) {
			tab_list[i].onclick = function() {
				for(var j=0 ; j<tab_list.length ; j++) {
					if(tab_list[j] == this) {
						tab_list[j].className = 'now';
					} else {
						tab_list[j].className = '';
					}
				}
				var area = this.getElementsByTagName('A').item(0).innerHTML;
				if(tab_list[0] == this) {
					area = false;
				}
				condition.area = area;
				filter(false);
				return false;
			};
		}
	}
	
	// set form handler
	var form = document.getElementById('db_filter');
	form.onsubmit = function() {
		condition.purpose = form.purpose.options[form.purpose.selectedIndex].value || false;
		condition.area = form.area.options[form.area.selectedIndex].value || false;
		filter(false);
		return false;
	};
	
	// setup sorter
	var order = [ 'a', 'd' ];
	var sorter = [ ];
	var cmp_builder = function(col, order) {
		var values = { };
		for(var i=0 ; i<rows.length ; i++) {
			var v = getElements(rows[i], 'SPAN', 'sort_key'+col);
			if(v.length == 1) {
				v = v[0].innerHTML;
			} else {
				v = rows[i].getElementsByTagName('TD').item(col).innerHTML;
			}
			var vs = v.replace(/,/g, '').split(/[^0-9\.]/);
			v = 0;
			for(var j=0 ; j<vs.length ; j++) {
				if(typeof vs[j] == 'string' && vs[j] == '') {
					continue;
				}
				v = v * 100 + vs[j] * 1;
			}
			if(typeof rows[i].id == 'undefined'
			|| rows[i].id == '') {
				alert('Row id is not found.');
				return;
			}
			values[rows[i].id] = v;
		}
		return function(a, b) {
			if(values[a.id] < values[b.id]) {
				return +1 * order;
			} else if(values[b.id] < values[a.id]) {
				return -1 * order;
			} else {
				return 0;
			}
		};
	};
	var sorter_handler = function(col, order) {
		return function() {
			for(var i=0 ; i<sorter.length ; i++) {
				sorter[i].className = (sorter[i]==this) ? 'now' : '';
			}
			rows.sort(cmp_builder(col, order));
			filter(false);
			return false;
		};
	};
	for(var i=0 ; i<=11 ; i++) {
		for(var j=0 ; j<2 ; j++) {
			var anc = document.getElementById('sort_by_'+i+'_'+order[j]);
			if(anc) {
				anc.onclick = sorter_handler(i, j==0?1:-1);
				sorter.push(anc);
			}
		}
	}
	
	// prepare database
	var collection = db.getElementsByTagName('TR');
	for(var i=0 ; i<collection.length ; i++) {
		rows.push(collection[i]);
	}
	
	// use init=false to move progress item to another area
	filter(false);
});
