/*******************************************************
*
*	file: calc.js
*	author: Zwacky
*	date: 10.09.2008
*	description: calculates the arena points
*
********************************************************/

var rating;
var points;

function calcinit() {
	
	rating = new Array($('2v2_rating'), $('3v3_rating'), $('5v5_rating'));
	points = new Array($('2v2_points'), $('3v3_points'), $('5v5_points'));
	
	rating.each(function(item, index){
		item.addEvent('keyup', function(event){ observeInput(item, 'rating');});
	});
	points.each(function(item, index){
		item.addEvent('keyup', function(event){ observeInput(item, 'points');});
	});
	$('calc_reset').addEvent('click', function(event){ resetcalculationinputs(); });
}

function observeInput(obj, param) {
	switch (param) {
		case 'rating':
			rating.each(function(item, index){
				item.value = obj.value;
			});
			calculatepoints(rating, points, 'rating');
			break;
		case 'points':
			points.each(function(item, index){
					item.value = obj.value;
				});
			calculatepoints(points, rating, 'points');
			break;
	}
}

function calculatepoints(list, target, val) {
	var i = 0;
	for (i; i < list.length; i++) {
		
		if (calculatecheck(list[i])) {
			var factor = 0;
			switch (i) {
				case 0:
					factor = 0.76;
				break;
				case 1:
					factor = 0.88;
				break;
				case 2:
					factor = 1;
				break;
			}
			if (val == 'points') {
				var rating = calculaterating(list[i].value / factor, val);
				target[i].value = calculateround(rating, 2);
			} else {
				var rating = calculaterating(list[i].value, val);
				target[i].value = calculateround(rating * factor, 2);
			}
			
			
			
		}
	}	
}

function calculateround(x, n) {
	if (n < 1 || n > 14) {
		return false;
	}
	var e = Math.pow(10, n);
	var k = (Math.round(x * e) / e).toString();
	if (k.indexOf('.') == -1) {
		k += '.';
	}
	k += e.toString().substring(1);
	
	return k.substring(0, k.indexOf('.') + n+1);
}

function calculatecheck(obj) {
	
	var anum = /(^\d+$)/;
	
	if (anum.test(obj.value)) {
		if (obj.value >= 0 && obj.value <= 4000) {
			return true;
		}
	} 
	return false;
}

function calculaterating(rating, val) {
	
	var points = 0;
	
	switch (val) {
		case 'rating':
			if (rating <= 1500) {
				points = 0.22 * rating + 14;
			} else {
				points = 1511.26 / (1 + 1639.28 * Math.pow(2.71828, -0.00412 * rating) );
			}
		break;
		case 'points':
			points = Math.log(((1511.28/rating) -1)/1639.28)/(Math.log(2.71828)*-0.00412);
		break;
	}
	return points;	
}

function resetcalculationinputs() {
	
	rating.each(function(item, index){
		item.value = '';
	});
	points.each(function(item, index){
		item.value = '';
	});
	
}