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;
};

$(function() {
	var db = document.getElementById('database');
	var db_progress = document.getElementById('progress_footer');
	var db_progress_header = document.getElementById('progress_header');
	var rows = [ ];
	var condition = {
		area: false,
		type: false,
		address: false,
		subject: 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, false, 0, 0, 0 ],
					 [ false, false, false, false, 0, 0, 0 ] ];
		for(var i=0 ; i<rows.length ; i++) {
			var cols = rows[i].getElementsByTagName('TD');
			if(condition.type !== false && cols[0].className != condition.type) {
				continue;
			}
			var area = getElements(rows[i], 'SPAN', 'area');
		//	if(condition.area !== false && area.length == 1 && area[0].innerHTML.substr(0,1) != condition.area.substr(0,1)) {
			if(condition.area !== false && area.length == 1 && area[0].innerHTML != condition.area) {
				continue;
			}
			var address = getElements(rows[i], 'SPAN', 'address');
			if(condition.address !== false && address.length == 1 && address[0].innerHTML.toLowerCase().indexOf(condition.address) == -1) {
				continue;
			}
			var subject = getElements(rows[i], 'SPAN', 'subject');
			if(condition.subject !== false && subject.length == 1 && subject[0].innerHTML.toLowerCase().indexOf(condition.subject) == -1) {
				continue;
			}
			var p = 0;
			if(rows[i].className.indexOf("progress") == -1) {
				// normal
				p = 0;
			} else {
				// progress
				p = 1;
			}
			total[p][4] += cols[4].title.replace(/,/g, '') * 1;
			total[p][5] += cols[5].innerHTML.replace(/,/g, '') * 1;
			total[p][6] += cols[6].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) {
				db_progress_header.style.display = '';
				db_progress.style.display = '';
			}
		}
		
		if(count[1] == 0) {
			db_progress_header.style.display = 'none';
			db_progress.style.display = 'none';
		}
		
		var info = {
			normal_count: count[0],
			normal_total_4: addComma(Math.floor(total[0][4]/1000000)),
			normal_total_5: addComma(formatFloat(total[0][5], 2)),
			normal_total_6: addComma(total[0][6]),
			progress_count: count[1],
			progress_total_4: addComma(Math.floor(total[1][4]/1000000)),
			progress_total_5: addComma(formatFloat(total[1][5], 2)),
			progress_total_6: addComma(total[1][6]),
			grand_count: count[0]+count[1],
			grand_total_4: addComma(Math.floor((total[0][4]+total[1][4])/1000000)),
			grand_total_5: addComma(formatFloat(total[0][5]+total[1][5], 2)),
			grand_total_6: addComma(total[0][6]+total[1][6])
		};
		for(var id in info) {
			document.getElementById(id).innerHTML = info[id];
		}
	};
	
	// setup grouping tab
	var tabs = document.getElementById('db_group_tabs').getElementsByTagName('TD');
	for(var i=0 ; i<tabs.length ; i++) {
		tabs[i].onclick = function() {
			for(var j=0 ; j<tabs.length ; j++) {
				if(tabs[j] == this) {
					tabs[j].className = 'now';
				} else {
					tabs[j].className = '';
				}
			}
			if(tabs[0] == this) {
				condition.area = false;
			} else {
				var a = this.getElementsByTagName('A').item(0);
				condition.area = a.hash.substr(1) || a.innerHTML;
			}
			filter(false);
			return false;
		};
	}
	
	// set form handler
	var form = document.getElementById('db_filter');
	form.onsubmit = function() {
		condition.type = form.type.options[form.type.selectedIndex].value || false;
		condition.address = form.addr.value.toLowerCase();
		condition.subject = form.name.value.toLowerCase();
		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 cell = rows[i].getElementsByTagName('TD').item(col);
			var vs;
			if(col == 0) {
				var types = { 'S': 1, 'C': 2, 'F': 3, 'L' :4, 'SE': 5 };
				vs = cell.innerHTML.split(/-/);
				vs[0] = types[vs[0]];
			} else if(col == 4) {
				vs = cell.title.replace(/,/g, '').split(/[^0-9\.]/);
			} else {
				vs = cell.innerHTML.replace(/,/g, '').split(/[^0-9\.]/);
			}
			var v = 0;
			for(var j=0 ; j<vs.length ; j++) {
				v = v * 100 + vs[j] * 1;
			}
			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<=8 ; 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);
});
