/****************************************************************************   
*	Klasse til beregning a ratingtal og forventet score
*	Copyright (C) 2003 Karsten Nymann Pedersen 2003
*   	klassen må bruges frit så længe dennne meddelelse er intakt.
*   	Made by Karsten Nymann Pedersen 2003 
*	ver. 2.00
*	Indsat parseFloat der sikrer at indsatte ratingtal bliver konverteret
*     til 'number' hvis de er 'string'
***************************************************************************/
var rating_beregning = function(){
	this.spiller="";
	this.modstanderRating="";
  this.rating_dif="";
  this.forventet="";
	this.alleModstanderRating = new Array();
  this.spillerRating="";
  this.score = new Array();
}

rating_beregning.prototype.beregnforventet=function(spiller, modstander)
{
	this.spiller=spiller;
	this.modstanderRating=modstander;
	this.rating_dif = this.spiller-this.modstanderRating;
	this.forventet=0;

	if (this.rating_dif<=0) this.rating_dif *= -1;
	if (this.rating_dif<=999) this.forventet= 0.00;
	if (this.rating_dif<=735) this.forventet= 0.01;
	if (this.rating_dif<=619) this.forventet= 0.02;
	if (this.rating_dif<=559) this.forventet= 0.03;
	if (this.rating_dif<=517) this.forventet= 0.04;
	if (this.rating_dif<=484) this.forventet= 0.05;
	if (this.rating_dif<=456) this.forventet= 0.06;
	if (this.rating_dif<=432) this.forventet= 0.07;
	if (this.rating_dif<=411) this.forventet= 0.08;
	if (this.rating_dif<=391) this.forventet= 0.09;
	if (this.rating_dif<=374) this.forventet= 0.10;
	if (this.rating_dif<=357) this.forventet= 0.11;
	if (this.rating_dif<=342) this.forventet= 0.12;
	if (this.rating_dif<=328) this.forventet= 0.13;
	if (this.rating_dif<=315) this.forventet= 0.14;
	if (this.rating_dif<=302) this.forventet= 0.15;
	if (this.rating_dif<=290) this.forventet= 0.16;
	if (this.rating_dif<=278) this.forventet= 0.17;
	if (this.rating_dif<=267) this.forventet= 0.18;
	if (this.rating_dif<=256) this.forventet= 0.19;
	if (this.rating_dif<=245) this.forventet= 0.20;
	if (this.rating_dif<=235) this.forventet= 0.21;
	if (this.rating_dif<=225) this.forventet= 0.22;
	if (this.rating_dif<=215) this.forventet= 0.23;
	if (this.rating_dif<=206) this.forventet= 0.24;
	if (this.rating_dif<=197) this.forventet= 0.25;
	if (this.rating_dif<=188) this.forventet= 0.26;
	if (this.rating_dif<=179) this.forventet= 0.27;
	if (this.rating_dif<=170) this.forventet= 0.28;
	if (this.rating_dif<=162) this.forventet= 0.29;
	if (this.rating_dif<=153) this.forventet= 0.30;
	if (this.rating_dif<=145) this.forventet= 0.31;
	if (this.rating_dif<=137) this.forventet= 0.32;
	if (this.rating_dif<=129) this.forventet= 0.33;
	if (this.rating_dif<=121) this.forventet= 0.34;
	if (this.rating_dif<=113) this.forventet= 0.35;
	if (this.rating_dif<=106) this.forventet= 0.36;
	if (this.rating_dif<=98) this.forventet= 0.37;
	if (this.rating_dif<=91) this.forventet= 0.38;
	if (this.rating_dif<=83) this.forventet= 0.39;
	if (this.rating_dif<=76) this.forventet= 0.40;
	if (this.rating_dif<=68) this.forventet= 0.41;
	if (this.rating_dif<=61) this.forventet= 0.42;
	if (this.rating_dif<=53) this.forventet= 0.43;
	if (this.rating_dif<=46) this.forventet= 0.44;
	if (this.rating_dif<=39) this.forventet= 0.45;
	if (this.rating_dif<=32) this.forventet= 0.46;
	if (this.rating_dif<=25) this.forventet= 0.47;
	if (this.rating_dif<=17) this.forventet= 0.48;
	if (this.rating_dif<=10) this.forventet= 0.49;
	if (this.rating_dif<=3) this.forventet= 0.50;

	if (this.modstanderRating<=this.spiller) this.forventet = 1.00 - this.forventet;
	return Math.round(this.forventet*100)/100;
}

// udregner udviklingskoefficienten skakhåndbogen 4.5.2.3
rating_beregning.prototype.beregnkonstant=function()
{ 
	if (this.spillerRating>=2400) k=10;
	if ((this.spillerRating>=2000) && (this.spillerRating<=2399)) k=20;
	if ((this.spillerRating>=1600) && (this.spillerRating<=1999)) k=30;
	if (this.spillerRating<=1599) k=45;
	return k;
}

// udregner bonus skakhåndbogen 4.5.2.2
rating_beregning.prototype.beregnBonus=function()
{
	x=(Math.round((this.antalPartier-5)/2))*.5 + 1.5;
	this.bonus=this.antalPoint-this.forventetScore-x;
	if (this.bonus<=0) this.bonus=0;
	return this.bonus;
}

// er det er en vinder af gruppen. Skakhåndbogen 4.5.2.5
rating_beregning.prototype.vinder=function(xxx)
{
  this.vind=xxx;
	if (this.vind && this.nyRating<this.gammelRating) this.nyRating=this.gammelRating;
}


rating_beregning.prototype.ny_rating=function()
{

// henter og udregner antal point + antal partier
  this.antalPartier=0;
	for(i=0; i<this.score.length; i++)
	{ 
		this.score[i]=arguments[i];
		if (this.score[i]=='½') this.antalPoint+=.5;
		if (this.score[i]=='1') this.antalPoint+=1;
		this.antalPartier++;
	} 

// udregner udviklingskoefficienten skakhåndbogen 4.5.3
	this.beregnkonstant();

// modstanderrating og beregner forventet score skakhåndbogen 4.5.2.1
  this.forventetScore=0;
	for(i=0; i<this.alleModstanderRating.length; i++)
	{ 
		this.forventetScore+=this.beregnforventet(this.spillerRating, parseFloat(this.alleModstanderRating[i]));
	} 

	this.forventetScore=Math.round(this.forventetScore*20)/20;
	
	
// udregner bonus skakhåndbogen 4.5.2.2
	this.beregnBonus();
	this.bonus=Math.round(this.bonus*100)/100;
	
// udregner det nye ratingtal 
//Rn=Ro + K x (W-We+B) fra skakhåndbogen 4.5.2
	this.nyRating=parseInt(this.spillerRating) + this.konstant*(this.antalPoint - this.forventetScore + this.bonus);

// korrektion ved passage af en koefficientgrænse skakhåndbogen 4.5.2.4

	Rn=this.nyRating;

	if (this.gammelRating<2400 && this.nyRating>2400) 
	{
		Rgr=2400;
		this.nyRating=2400+0.5*(Rn-Rgr);
	}
	if (this.gammelRating>2400 && this.nyRating<2400) 
	{
		Rgr=2400;
		this.nyRating=2400-2*(Rgr-Rn);
	}
	if (this.gammelRating<2000 && this.nyRating>2000) 
	{
		Rgr=2000;
		this.nyRating=2000+ (2/3)*(Rn-Rgr);
	}
	if (this.gammelRating>2000 && this.nyRating<2000) 
	{
		Rgr=2000;
		this.nyRating=2000-1.5*(Rgr-Rn);
	}
	if (this.gammelRating<1600 && this.nyRating>1600) 
	{
		Rgr=1600;
		this.nyRating=1600+ (2/3)*(Rn-Rgr);
	}
	if (this.gammelRating>1600 && this.nyRating<1600) 
	{
		Rgr=1600;
		this.nyRating=1600-1.5*(Rgr-Rn);
	}

	this.nyRating=Math.ceil(this.nyRating);
	
// er rating tallet mindre end 1000. Skakhåndbogen 4.5.2.6
	if (this.nyRating<1000) this.nyRating=1000; 		
}


