// Copyright Christian "Magnum" Betzel

window.addEvent( 'domready', function() { 
	
	var	button = $( 'eloGo' );
	if( button ) {
		button.addEvent( 'click', function() { 
			calc();
		} );
		var div = $( 'eloContainer' );
		div.getElements( 'input' ).each( function( input ) {
			input.addEvent( 'change', function() { 
				calc();
			} );
			input.addEvent( 'keyup', function() { 
				calc();
			} );
		} );
		
	}
	
} );

function calc() {
	var div = $( 'eloContainer' );
	var mapA = [ $( 'mapA1' ).get( 'value' ) ];
	var mapB = [ $( 'mapB1' ).get( 'value' ) ];
	div.getElements( 'input' ).each( function( input ) {
		if( input.get( 'id' ) ) return;
		if( input.get( 'class' ) == 'mapA' ) mapA.push( input.get( 'value' ) );
		if( input.get( 'class' ) == 'mapB' ) mapB.push( input.get( 'value' ) );
	} );
	
	$( 'eloErro' ).addClass( 'hide' );
	div.getElements( 'input' ).each( function( input ) {
		input.removeClass( 'error' );
	} );
	
	var values = elo( $( 'pointsA' ).get( 'value' ), $( 'pointsB' ).get( 'value' ), mapA, mapB );
	
	if( values !== false ) {
		$( 'diffA' ).set( 'value', values.diffA );
		$( 'diffB' ).set( 'value', values.diffB );
		$( 'pointsANew' ).set( 'value', values.pointsA );
		$( 'pointsBNew' ).set( 'value', values.pointsB );
	} else {
		div.getElements( 'input' ).each( function( input ) {
			if( input.get( 'value' ) != '' ) return;
			if( ! input.get( 'id' ) ) return;
			if( input.get( 'disabled' ) ) return;
			
			input.addClass( 'error' );
		} );
		$( 'eloErro' ).removeClass( 'hide' );
	}
}

function elo( pointsA, pointsB, mapsA, mapsB ) {
	var c1 = 50;
	var c2 = 400;
	
	if( ! pointsA || ! pointsB ) return false;
	pointsA = pointsA.toInt();
	pointsB = pointsB.toInt();
	
	var e = 1 / ( 1 + Math.pow( 10, ( -1 * ( pointsA - pointsB ) / c2 ) ) );
	
	var w = null;
	var divisor = 0;
	for( var i = 0; i < mapsA.length; i++ ) {
		if( mapsA[ i ] == '' || mapsB[ i ] == '' ) continue;
		divisor++;
		mapsA[ i ] = mapsA[ i ].toInt();
		mapsB[ i ] = mapsB[ i ].toInt();
		w += mapsA[ i ] / ( mapsA[ i ] + mapsB[ i ] );
	}
	if( w === null ) return false;
	
	w /= divisor;
	
	var diff = c1 * ( w - e );
	if( diff < 0 ) {
		diff *= -1;
		
		diff = Math.round( diff );
		var pointsANew = pointsA - diff; 
		var pointsBNew = pointsB + diff; 
	} else {
		diff = Math.round( diff );
		var pointsANew = pointsA + diff; 
		var pointsBNew = pointsB - diff; 
	}
	return { 'pointsA' : pointsANew, 'pointsB' : pointsBNew, 'diffA' : pointsANew - pointsA, 'diffB' : pointsBNew - pointsB };	
}
