var settings={
	version:"1.01",
	imgfolder:"dices",
	rollsleft:3, pluttar:0, playername:"???"
}
var dices=[ { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 } ];
function count(a){
	var o={1:0,2:0,3:0,4:0,5:0,6:0}; for(var i in a){ o[a[i].value]=(o[a[i].value])?o[a[i].value]+1:1; }
	return o;
}
var maxiYatzy={
	field:[
		{ pobj:"pointsEttor", name:"Ettor", max:6 },
		{ pobj:"pointsTvaor", name:"Tvåor", max:12 },
		{ pobj:"pointsTreor", name:"Treor", max:18 },
		{ pobj:"pointsFyror", name:"Fyror", max:24 },
		{ pobj:"pointsFemmor", name:"Femmor", max:30 },
		{ pobj:"pointsSexor", name:"Sexor", max:36 },
		{ pobj:"Delsumma", name:"Delsumma", style:"font-weight:bold;border-top:solid black 1px;border-bottom:solid black 2px;" },
		{ pobj:"Bonus", name:"Bonus", max:100 },
		{ pobj:"pointsPar", name:"Ett par", max:12 },
		{ pobj:"pointsTvaPar", name:"Två par", max:22 },
		{ pobj:"pointsTrePar", name:"Tre par", max:30 },
		{ pobj:"pointsTretal", name:"Tretal", max:18 },
		{ pobj:"pointsFyrtal", name:"Fyrtal", max:24 },
		{ pobj:"pointsFemtal", name:"Femtal", max:30 },
		{ pobj:"pointsLitenStraight", name:"Liten straight", max:15 },
		{ pobj:"pointsStorStraight", name:"Stor straight", max:20 },
		{ pobj:"pointsFullStraight", name:"Full straight", max:21 },
		{ pobj:"pointsKak", name:"Kåk (2+3)", max:28 },
		{ pobj:"pointsHus", name:"Hus (3+3)", max:33 },
		{ pobj:"pointsTorn", name:"Torn (2+4)", max:34 },
		{ pobj:"pointsChans", name:"Chans", max:36 },
		{ pobj:"pointsMaxiYatzy", name:"Maxi Yatzy", max:100 },
		{ pobj:"summa", name:"Summa", style:"font-weight:bold;border-top:solid black 1px;border-bottom:solid black 2px;" }
	],
	d:[6,5,4,3,2,1],
	pointsEttor:function(o){ return (o[1])?o[1]*1:0; },
	pointsTvaor:function(o){ return (o[2])?o[2]*2:0; },
	pointsTreor:function(o){ return (o[3])?o[3]*3:0; },
	pointsFyror:function(o){ return (o[4])?o[4]*4:0; },
	pointsFemmor:function(o){ return (o[5])?o[5]*5:0; },
	pointsSexor:function(o){ return (o[6])?o[6]*6:0; },
	pointsPar:function(o){ return (this.getPar(o)[0])?this.getPar(o)[0]*2:0; },
	pointsTvaPar:function(o){ return (this.getPar(o)[1])?this.getPar(o)[0]*2+this.getPar(o)[1]*2:0; },
	pointsTrePar:function(o){ return (this.getPar(o)[2])?this.getPar(o)[0]*2+this.getPar(o)[1]*2+this.getPar(o)[2]*2:0; },
	pointsTretal:function(o){ return (this.getTretal(o)[0])?this.getTretal(o)[0]*3:0; },
	pointsFyrtal:function(o){ return (this.getFyrtal(o)[0])?this.getTretal(o)[0]*4:0; },
	pointsFemtal:function(o){ return (this.getFemtal(o)[0])?this.getTretal(o)[0]*5:0; },
	pointsLitenStraight:function(o){ var s=1; for(var i=1;i<=5;i++){ if(o[i]<1) s=0; } return s*15; },
	pointsStorStraight:function(o){ var s=1; for(var i=2;i<=6;i++){ if(o[i]<1) s=0; } return s*20; },
	pointsFullStraight:function(o){ var s=1; for(var i=1;i<=6;i++){ if(o[i]<1) s=0; } return s*21; },
	pointsKak:function(o){
		var high=0; var aa=this.getTretal(o); ab=this.getPar(o);
		for(var i in aa){ for(var ii in ab){ if(aa[i]!=ab[ii]&&(3*aa[i]+2*ab[ii])>high){ high=3*aa[i]+2*ab[ii]; } } }
		return high;
	},
	pointsHus:function(o){
		var high=0; var aa=this.getTretal(o); ab=this.getTretal(o);
		for(var i in aa){ for(var ii in ab){ if(aa[i]!=ab[ii]&&(3*aa[i]+3*ab[ii])>high){ high=3*aa[i]+3*ab[ii]; } } }
		return high;
	},
	pointsTorn:function(o){
		var high=0; var aa=this.getFyrtal(o); ab=this.getPar(o);
		for(var i in aa){ for(var ii in ab){ if(aa[i]!=ab[ii]&&(4*aa[i]+2*ab[ii])>high){ high=4*aa[i]+2*ab[ii]; } } }
		return high;
	},
	pointsChans:function(o){ var n=0; for(var i in o){ n+=o[i]*i } return n; },
	pointsMaxiYatzy:function(o){ return (this.getSextal(o)[0])?100:0; },
	getSextal:function(o){ var a=[]; for(var i in this.d){ if(o[this.d[i]] >=6){ a[a.length]=this.d[i] } } return a; },
	getFemtal:function(o){ var a=[]; for(var i in this.d){ if(o[this.d[i]] >=5){ a[a.length]=this.d[i] } } return a; },
	getFyrtal:function(o){ var a=[]; for(var i in this.d){ if(o[this.d[i]] >=4){ a[a.length]=this.d[i] } } return a; },
	getTretal:function(o){ var a=[]; for(var i in this.d){ if(o[this.d[i]] >=3){ a[a.length]=this.d[i] } } return a; },
	getPar:function(o){ var a=[]; for(var i in this.d){ if(o[this.d[i]] >=2){ a[a.length]=this.d[i] } } return a; }
}
function updateTable(){
	var tbl=document.getElementById("rolledDices"); var saved=document.getElementById("savedDices"); var plutt=document.getElementById("pluttSpace");
	tbl.innerHTML=""; saved.innerHTML=""; plutt.innerHTML="";
	for(var i in diceSort(dices)){
		if(dices[i].locked){
			saved.innerHTML+="<img onclick=\"mclick("+i+")\" src=\""+settings.imgfolder+"/t"+dices[i].value+".gif\">";
		} else {
			tbl.innerHTML+="<img onclick=\"mclick("+i+")\" src=\""+settings.imgfolder+"/t"+dices[i].value+".gif\">";
		}
	}
	for(var i=0; i<settings.pluttar; i++){
		plutt.innerHTML+="<span style=\"position:absolute;top:"+(i%2*10)+"px;left:"+(i*10)+"px;\"><img src=\""+settings.imgfolder+"/plutt.gif\"></span>";
	}
	document.getElementById("rollsLeft").innerHTML=settings.rollsleft;
}
function mclick(n){
	dices[n].locked=!dices[n].locked;
	updateTable();
}
function result_over(po){
	if(maxiYatzy[po]&&gameField[po]==null){
		var p=maxiYatzy[po](count(dices));
		document.getElementById(po).innerHTML=p;
	}
}
function result_out(po){
	if(maxiYatzy[po]&&gameField[po]==null){
		document.getElementById(po).innerHTML="&nbsp;";
	}
}
function result_click(po){
	if(settings.rollsleft==3){ return }
	if(maxiYatzy[po] && document.getElementById(po).className=="yatzycell"){
		document.getElementById(po).className="yatzycell yatzycellset"
		gameField[po]=maxiYatzy[po](count(dices));
		var p=0; var b=true; for(var i=0;i<6;i++){ p+=(isNaN(parseInt(document.getElementById(maxiYatzy.field[i].pobj).innerHTML)))?0:parseInt(document.getElementById(maxiYatzy.field[i].pobj).innerHTML); b=(b&&!isNaN(document.getElementById(maxiYatzy.field[i].pobj).innerHTML)); }
		document.getElementById("Delsumma").innerHTML=p;
		if(b){
			document.getElementById("Delsumma").style.color="black";
			// document.getElementById("Bonus").innerHTML=(p>=75)?50:0; // Regeluppsättning 1
			document.getElementById("Bonus").innerHTML=(p>=84)?100:0; // Regeluppsättning 2
		} else {
			document.getElementById("Delsumma").style.color="";
		}
		var p=0; for(var i=6;i<22;i++){ p=(p>-1&&document.getElementById(maxiYatzy.field[i].pobj).innerHTML)?p+parseInt(document.getElementById(maxiYatzy.field[i].pobj).innerHTML):-1; }
		if(p>-1){
			document.getElementById("summa").innerHTML=p;
		}
		dices=[ { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 } ];
		settings.pluttar+=settings.rollsleft;
		settings.rollsleft=3;
		updateTable();
	}
}
function roll(){
	if(settings.rollsleft==0){
		if(settings.pluttar>0){ settings.pluttar--; settings.rollsleft=1 } else { alert("Inga slag kvar"); return false; }
	}
	settings.rollsleft--;
	for(var i in dices){ if(!dices[i].locked){ dices[i].value=Math.floor(Math.random()*6)+1; } }	
	updateTable();
}
function diceSort(d){
	return d.sort(function(a,b){ return a.value<b.value?-1:a.value==b.value?0:1; });
}
function cloneObject(obj) {
    for (var i in obj) { if (typeof obj[i] == 'object') { this[i] = new cloneObject(obj[i]); } else { this[i] = obj[i]; } }
	return this;
}
function newGame(){
	gameField={};
	for(var i in maxiYatzy.field){ gameField[maxiYatzy.field[i].pobj]=null; }
	dices=[ { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 }, { value:0 } ];
	for(var i=0;i<23;i++){
		document.getElementById(maxiYatzy.field[i].pobj).innerHTML="&nbsp;";
		document.getElementById(maxiYatzy.field[i].pobj).className="yatzycell";
	}
	settings.rollsleft=3;
	settings.pluttar=0
	updateTable();
}
function changePlayerName(){
	settings.playername=prompt("Skriv in dina initialer...",settings.playername);
	document.getElementById("playername").innerHTML=settings.playername;
}
window.onload=function(){
	var o=document.getElementById("yatzytable"); o.innerHTML=""; var html="";
	html+="<table cellspacing=\"0\" style=\"font-family:Verdana; font-size:10px; border: solid black 2px;\"><tr><td class=\"yatzyheading\">Spelare</td><td class=\"yatzyheading\" onclick=\"changePlayerName();\" id=\"playername\" style=\"text-align:center;\">???</td></tr>";
	for(var i in maxiYatzy.field){
		html+="<tr><td class=\"yatzycell yatzycellset\" style=\""+maxiYatzy.field[i].style+" width:80px;\">"+maxiYatzy.field[i].name+"</td><td class=\"yatzycell\" style=\"text-align:center; cursor:hand; "+maxiYatzy.field[i].style+" width:50px;\" id=\""+maxiYatzy.field[i].pobj+"\"onmouseover=\"result_over('"+maxiYatzy.field[i].pobj+"')\" onclick=\"result_click('"+maxiYatzy.field[i].pobj+"')\" onmouseout=\"result_out('"+maxiYatzy.field[i].pobj+"')\">&nbsp;</td></tr>";
	}
	html+="</table>";
	o.innerHTML=html;
	newGame();
}