// *********************************************
// Denne fil indeholder funktioner som bruges af
//	index.php
// *********************************************

var bedstaf_vises=false // angiver om listen hvor man kan vælge bedst af er vist

var spilleplade_bredde_800x600=732
var spilleplade_bredde_1024x768=956
var brikbredde_800x600=20
var brikbredde_1024x768=30
var brik_umarkeret_800x600="b"
var brik_markeret_800x600="b2"
var brik_umarkeret_1024x768="b3"
var brik_markeret_1024x786="b4"

var spilleplade_bredde=spilleplade_bredde_1024x768
var brikbredde=brikbredde_1024x768
var brik_umarkeret=brik_umarkeret_1024x768
var brik_markeret=brik_markeret_1024x786

// Tilpas udseendet til den aktuelle skærmstørrelse
if (screen.width <= 800) {
	spilleplade_bredde=spilleplade_bredde_800x600
	brikbredde=brikbredde_800x600
	brik_umarkeret=brik_umarkeret_800x600
	brik_markeret=brik_markeret_800x600
} else {
	spilleplade_bredde=spilleplade_bredde_1024x768
	brikbredde=brikbredde_1024x768
	brik_umarkeret=brik_umarkeret_1024x768
	brik_markeret=brik_markeret_1024x786
}

// Start: Testvariabler og funktioner
udskrivHTMLkilde = false // Hvis sand udskrives den generede HTML-kode i nyt vindue

function udskrivKilde () {
	// Udskriver den HTML-kode, som generes af scripts i nyt vindue
	resultatvindue = window.open('','_blank');

	var origkilde = document.documentElement.innerHTML;
	var match = "<";

	var re = new RegExp("<", "g");

	var nykilde = origkilde.replace(re, "&lt;");

	resultatvindue.document.write(nykilde);
}
// Slut: Testvariabler og funktioner

function s (tekst) {
	document.write(tekst)
}

// Briktype
function brik (tom,bogstav,laast,sidste_traek) {
	this.tom = tom // Angiver om feltet er tomt
	this.laast = laast // Hvis brikken er sat i et tidligere træk (eget eller modstanders) 
	this.bogstav = bogstav // Det bogstav, der står på feltet (" " hvis tom)
	this.sidste_traek = sidste_traek // True hvis brik sat i sidste træk
}

// Spilleplade: 2-dimensionelt array
var raekke=12
var soejle=21
var spilleplade = new Array(raekke) 
for (var i=0; i < raekke ; i++) {
	spilleplade[i] = new Array(soejle)
   
	for (var j=0; j < soejle; j++) {
		spilleplade[i][j] = new brik();
		spilleplade[i][j].tom = true;
		spilleplade[i][j].laast = false;
		spilleplade[i][j].bogstav = " ";
		spilleplade[i][j].sidste_traek = false;
	}
}

// Spillebrikker: 1-dimensionalt array ** De brikker, som spilleren har på sin brikhylde
var antal_brikker=30
var brikker = new Array(antal_brikker)
for (var j=0; j < antal_brikker; j++) {
	brikker[j] = new brik()
}

function lav_spilleplade () {
	// Laver spilleplade som form

	s("<table bgcolor='lightsteelblue' width='"+spilleplade_bredde+"'>")
	if (spiller) {
	 	s("<tr><td valign='top' class='vejledning' align='center'>(2) Klik dern&aelig;st p&aring; den plads, hvor bogstavet skal st&aring;:</td></tr>")
	}

	s("<tr>")
	s("<td>")
		s("<form name='spilleplade' onSubmit='return false;'>")

		s("<table cellpadding='0' cellspacing='1'>")
		for (var i=0; i < raekke ; i++) {

			s("<tr>")
			for (var j=0; j < soejle; j++) {
				if (spilleplade[i][j].sidste_traek) {
					
					// Marker at denne brik er sat af modspiller i dennes sidste træk
					s("<td align='center' width='"+brikbredde+"'><input type='button' onClick='ks(this,"+i+","+j+")' value=' ' class='"+brik_markeret+"'></td>")
				} else {
					s("<td align='center' width='"+brikbredde+"'><input type='button' onClick='ks(this,"+i+","+j+")' value=' ' class='"+brik_umarkeret+"'></td>")
				}
			}
			s("</tr>")
		}
		s("</table>")
		s("</form>")

	s("</td>")

	s("<td width='4'></td>")

	s("<td width='260' valign='top'>")
	s("<table width='100%' cellpadding='0' cellspacing='0'>")
	s("<tr><td valign='top' colspan='2' align='left'><img src='ordspil.gif' alt='Ordspil.dk - spil online krydsord (kryds og tværs) mod andre ordelskere'></td></tr>")
	s("</table>")
	

	s("<table width='100%'>")
	// Valg af maksimalt antal træk	
	if ((traek==1) && spiller) {
		s("<tr><td colspan='2' height='6'></td></tr>")

		s("<tr><td valign='top' colspan='2' align='left'><form name='bedstaf'><select name='valg' size=1 class='bedstaf'><option value='16'>16 tr&aelig;k</option><option value='12'>12 tr&aelig;k</option><option value='8'>8 tr&aelig;k</option><option value='4'>4 tr&aelig;k</option></select></form></td></tr>")

		bedstaf_vises=true;
	}

	if (spiller) {
		s("<tr><td colspan='2' height='8'></td></tr>")
		// http://www.retskrivningsordbogen.dk/ro/dataservlet?p1=ordbog&p2=true&p3=0&p4=10
		s("<tr><td valign='top' colspan='2' class='point' align='center'><form action='http://www.retskrivningsordbogen.dk/ro/dataservlet' method='get' name='retskrivningsordbog' onSubmit='this.p1.value=tilUTF8(kontroller_stavning()); if (this.p1.value.length>0) {return true;} else {return false;}' target='_blank'><table cellspacing='0' cellpadding='1' bgcolor='#FFFFFF'><tr><td><table bgcolor='lightsteelblue'><tr><td class='point' align='center'>Kontroller ord i Retskrivningsordbogen fra Dansk Sprogn&aelig;vn (www.dsn.dk):</td></tr><tr><td align='center'><input type='hidden' name='p1' value=''><input type='hidden' name='p2' value='false'><input type='hidden' name='p3' value='0'><input type='hidden' name='p4' value='10'><input type='submit' value='Check ord!'></td></tr><tr><td align='center' class='point'>Ordbogen &aring;bner i sit eget vindue</td></tr></table></td></tr></table></form></td></tr>")
		s("<tr><td colspan='2' height='2'></td></tr>")
		s("<tr><td valign='top' colspan='2' class='point' align='center'><form action='http://www.google.dk/search' method='get' name='google' onSubmit='this.q.value=kontroller_stavning(); if (this.q.value.length>0) {return true;} else {return false;}' target='_blank'><table cellspacing='0' cellpadding='1' bgcolor='#FFFFFF'><tr><td><table bgcolor='lightsteelblue'><tr><td class='point' align='center'>Kontroller ord i Google (www.google.dk):</td></tr><tr><td align='center'><input type='hidden' name='hl' value='da'><input type='hidden' name='q' value=''><input type='hidden' name='btnG' value='Søg'><input type='hidden' name='meta' value='lr=lang_da'><input type='submit' value='Check ord!'></td></tr><tr><td align='center' class='point'>Google &aring;bner i sit eget vindue</td></tr></table></td></tr></table></form></td></tr>")
	} else {
		s("<tr><td colspan='2' height='6'></td></tr>")
		
		if (point <= gl_max_point) {
			if (point > 1) {endelse="er"} else {endelse=""}
		 	s("<tr><td valign='top' class='point'><b>Bogstaver i ord:</b></td><td class='point' align='right'>"+point +"&nbsp;bogstav"+endelse+"</td></tr>")
		 	if (max_point > 1) {endelse="er"} else {endelse=""}
			s("<tr><td valign='top' class='point'>Hidtil l&aelig;ngste ord:</td><td class='point' align='right'>"+max_point +"&nbsp;bogstav"+endelse+"</td></tr>")
		} else {
			if (point > 1) {endelse="er"} else {endelse=""}
		 	s("<tr><td valign='top' class='point'><b>Gav hidtil l&aelig;ngste ord:</b></td><td class='point' align='right'>"+point +"&nbsp;bogstav"+endelse+"</td></tr>")
		}

		// *** 25/3-08
		if (privat_spil) {
		 	s("<tr><td colspan='2'><hr size='1' noshade></td></tr>")

			if ((point_spiller > 1) || (point_spiller == 0)) {endelse="er"} else {endelse=""}
		 	s("<tr><td valign='top' class='point'>"+spillers_navn.substr(0,25)+":</td><td class='point' align='right'>"+point_spiller +"&nbsp;bogstav"+endelse+"</td></tr>")
			if ((point_modspiller > 1) || (point_modspiller == 0)) {endelse="er"} else {endelse=""}
		 	s("<tr><td valign='top' class='point'>"+modspillers_navn.substr(0,25)+":</td><td class='point' align='right'>"+point_modspiller +"&nbsp;bogstav"+endelse+"</td></tr>")
		}
		// slut *** 25/3-08
	}

	/* 23/9-2011: Fjernet !

	if (!privat_spil) {
		s("<tr><td colspan='2' height='6'></td></tr>")
	 	s("<tr><td colspan='2' valign='top' class='point' align='center'><b>NYT!</b>&nbsp;<a href='nyt_spil.php'>Spil mod en bekendt</a></td></tr>")
	}

	*/

	s("</table>")
	s("</td>")

	s("<td width='6'></td>")

	s("</tr>")
	s("</table>")
}

function kod_mellemrum (antal) {
	var mellemrum=" "

	if (antal==0) {
		return ""
	} else {
		if (antal==1) {
			return mellemrum
		} else {
			if (antal==2) {
				return mellemrum+mellemrum
			} else {
				return "_"+antal+"_"
			}
		}
	}
}

function kod(str) {
	// Funktionen koder strengen str, så den fylder mindre
	// Det antages, at der er overvejende mellemrum
	var gammel_str = new String(str)
	var ny_str = new String("")
	var antal_mellemrum = 0
	var tegn

	for (var i=0; i<gammel_str.length; i++) {
		tegn = gammel_str.charAt(i)
		if (tegn==" ") {
			antal_mellemrum++
		} else {
			ny_str += kod_mellemrum(antal_mellemrum)+tegn
			antal_mellemrum=0
		}
	}

	// Eventuelle mellemrum i slutningen af str gemmes
	ny_str += kod_mellemrum(antal_mellemrum)
	return ny_str
}


var gammel_str = new String() // Bruges af dekod() og dekod2()
var ny_str = new String() // Bruges af dekod() og dekod2()
function dekod2(start,slut) {
	var tegn
	var talstreng
	var tal_slut_position
	var tal
	var mellemrum

	if (start <= slut) {
		tegn = gammel_str.charAt(start)

		if (tegn=="_") {
			tal_slut_position=gammel_str.indexOf("_",start+1)

			talstreng=gammel_str.substring(start+1,tal_slut_position)
			tal = new Number(talstreng)

			mellemrum=""
			for (var i=0; i<tal; i++) {
				mellemrum += " "
			}

			ny_str += mellemrum

			dekod2(tal_slut_position+1,slut)
		} else {
			ny_str += tegn
			dekod2(start+1,slut)
		}
	}
}

function dekod(str) {
	// Funktionen udpakker strengen str, som er kodet med kod
	
	gammel_str = str
	ny_str = ""

	dekod2(0,gammel_str.length-1)

	return ny_str
}

function tilUTF8 (str) {
	var gammel_str = new String(str);
	var ny_str = new String("");

	for (var i=0; i<gammel_str.length; i++) {
		tegn = gammel_str.charAt(i);

		switch (tegn) {
			case 'æ': ny_str += "Ã¦"; break; // 0xC3,0xA6
			case 'ø': ny_str += "Ã¸"; break; // 0xC3,0xB8
			case 'å': ny_str += "Ã¥"; break; // 0xC3,0xA5
			case 'Æ': ny_str += "Ã†"; break; // 0xC3,0x86
			case 'Ø': ny_str += "Ã˜"; break; // 0xC3,0x98
			case 'Å': ny_str += "Ã…"; break; // 0xC3,0x85
			default	: ny_str += tegn;
		}
	}
	return ny_str;
}

// Funktioner som laver spilleplade, brikhylde og submit-felt mv.

function init_spilleplade () {
	// Udfylder arrayet spilleplade
	var tegn = new String()
	if ((traek==1) && spiller) { // ** Ændring 16/10-06
		plade==""
		// traek, point, max_point og gl_max_point sat i index.php
	} else {
		// Fylder spillepladen op med bogstaver sat i tidligere træk
		// Bogstaver sat i sidste træk (små bogstaver) markeres

		plade=dekod(plade)

		for (var i=0; i < raekke ; i++) {
 
			for (var j=0; j < soejle; j++) {
				tegn = plade.charAt(i*soejle+j)
				if (tegn != " ") {
					// Der er tale om modspillers brikker eller egne fra tidligere træk
					spilleplade[i][j].laast = true
					spilleplade[i][j].tom = false

					if (member(tegn,"abcdefghijklmnopqrstuvwxyzæøå")) {
						spilleplade[i][j].sidste_traek = true
					} else {
						spilleplade[i][j].sidste_traek = false
					}
				} else {
					// Tom plads (er initialiseret ved dannelse af array)
				}
				spilleplade[i][j].bogstav = tegn.toUpperCase()
			}
		}
	}
}

function udfyld_spilleplade () {
	// Udfylder den form som er dannet af lav_spilleplade med bogstaver
	for (var i=0; i < raekke ; i++) {
 		for (var j=0; j < soejle; j++) {
			document.spilleplade.elements[i*soejle+j].value = spilleplade[i][j].bogstav
		}
	}
}

function lav_brikhylde () {
	// Laver brikhylde som form

	s("<form name='brikker'>")
	s("<table cellpadding='0' cellspacing='1' bgcolor='gray'>")

	if (spiller) {
		s("<tr><td class='vejledning' align='center'>(1) Klik f&oslash;rst p&aring; et bogstav, du vil flytte op p&aring; spillepladen:</td></tr>")
	} else {
		s("<tr><td class='vejledning'>Her er de bogstaver, n&aelig;ste spiller kan bruge:</td></tr>")
	}

	s("<tr>")
	s("<td>")

	s("<table cellpadding='0' cellspacing='1' bgcolor='gray'>")
	s("<tr><td height='2'></td></tr>")

	s("<tr>")

	for (var i=0; i < antal_brikker ; i++) {
		s("<td align='center' width='"+brikbredde+"'><input type='button' onClick='kb(this,"+i+")' value=' ' class='"+brik_umarkeret+"'></td>")
	}
	s("</tr>")
	s("</table>")

	s("</td>")
	s("</tr>")
	s("</table>")
	s("</form>")
}

function udfyld_brikhylde () {
	// Fylder den brikhylde op som er lavet i lav_brikhylde op med brikker
	// fra data.php (her er alle bogstaver små)
	var tegn
	for (var i=0; i < antal_brikker ; i++) {
			tegn = startbrikker.charAt(i)
			brikker[i].bogstav = tegn
			brikker[i].tom = false
			document.brikker.elements[i].value = brikker[i].bogstav
	}
}

function besked_faerdig() {
	s("<form action='./' method='post' name='skema' onSubmit='return afslut_traek(this)'>")
	s("<table width='"+spilleplade_bredde+"' cellpadding='0' cellspacing='0'>")
	s("<tr>")
	if (spiller) {
		// Denne spiller skal trække
		s("<td>")

		s("<table cellpadding='0' cellspacing='1' width='100%'>")
		s("<tr><td><input type='hidden' name='p' value=''><input type='hidden' name='traek' value=''><input type='hidden' name='max_traek' value=''><input type='hidden' name='spilleplade' value=''><input type='hidden' name='spil_slut' value=''><input type='hidden' name='point' value=''><input type='hidden' name='gl_max_point' value=''><input type='hidden' name='max_point' value=''><input type='hidden' name='point_spiller' value=''><input type='hidden' name='point_modspiller' value=''></td></tr>") // *** 25/3-08

		if (traek==1) {
			s("<tr><td><b>Tr&aelig;k "+traek+"</b></td><td align='right'><table cellpadding='0' cellspacing='0'><tr><td class='vejledning2'>(3) Klik endelig her, n&aring;r du har skrevet dit ord:</td><td width='4'></td><td><input type='submit' value='Færdig!'></td></tr></table></td></tr>")
		} else {
			s("<tr><td><b>Tr&aelig;k "+traek+" af "+max_traek+"</b></td><td align='right'><table cellpadding='0' cellspacing='0'><tr><td class='vejledning2'>(3) Klik endelig her, n&aring;r du har skrevet dit ord:</td><td width='4'></td><td><input type='submit' value='Færdig!'></td></tr></table></td></tr>")
		}
		s("</table>")
		s("</td>")
	
	} else {
		if (privat_spil) {
			s("<td><b>Tak for ordet! Vent p&aring; at du f&aring;r en email fra din modspiller.</b></td><td width='4'></td><td align='right'>&nbsp;</td>")
		} else {
			s("<td><b>Tak for ordet!</b></td><td width='4'></td><td align='right'>&nbsp;</td>")
		}
	}

	s("</tr>")
	s("</table>")
	s("</form>")
}

function privat_spil_slut() {
	s("<form>")
	s("<table width='"+spilleplade_bredde+"' cellpadding='0' cellspacing='0'>")
	s("<tr>")
	s("<td><b>Tak for spillet!</b></td><td width='4'></td><td align='right'><input type='button' value='Ok!' onClick='top.location=\"./\"'></td>")
	s("</tr>")
	s("</table>")
	s("</form>")
}

// Funktioner som anvendes, når spillet er igang
function nabo(i,j) {
	// Undersøger om der er en nabo til brikken (i,j), som er sat i et tidligere træk

	if (i>0) {
		if (spilleplade[i-1][j].laast) {return true}
	}

	if (i<raekke-1) {
		if (spilleplade[i+1][j].laast) {return true}
	}

	if (j>0) {
		if (spilleplade[i][j-1].laast) {return true}
	}

	if (j<soejle-1) {
		if (spilleplade[i][j+1].laast) {return true}
	}
	
	return false	
}

function brik_tom(i,j) {
	// Undersøger om brikken (i,j) er tom (dvs. om der er sat noget i nuværende eller tidligere træk)
	// Hvis (i,j) er uden for spillepladen returneres true

	if ((i<0)||(i>=raekke)||(j<0)||(j>=soejle)) {
		// Uden for spilleplade
		return true
	} else {
		return spilleplade[i][j].tom
	}
}

function valider_traek (form) {
	// Hvis træk er i orden returneres true ellers false

	// hvis 1 brik: brik må stå som den vil
	// hvis flere brikker brikker skal enten stå horisontalt eller vertikalt
	// hvis flere brikker må der ikke være mellemrum = flere ord
	// hvis spilleplade tom fra start: ikke krav om nabo til eksisterende bogstav
	// hvis spilleplade ikke tom: krav om nabo til eksisterende bogstav

	var antal_brikker_tidligere_traek = 0 // antal brikker sat i tidligere traek
	var antal_brikker_dette_traek = 0 // antal brikker sat i dette træk
	var naboskab = false // angiver om mindst én brik sat i dette træk står ved siden af en tidligere sat
	var min_i = raekke // minimum i-værdi for brikker sat i dette træk
	var max_i = -1 // maximum i-værdi for brikker sat i dette træk
	var min_j = soejle // minimum j-værdi for brikker sat i dette træk
	var max_j = -1 // maximum j-værdi for brikker sat i dette træk
		
	for (var i=0; i < raekke ; i++) {
 
		for (var j=0; j < soejle; j++) {
			if (spilleplade[i][j].laast) {
				// (i,j) indeholder en brik fra et tidligere træk
				antal_brikker_tidligere_traek++
			} else {
				if (!spilleplade[i][j].tom) {
					// (i,j) indeholder en brik fra dette træk
					antal_brikker_dette_traek++
					if (!naboskab) {naboskab=nabo(i,j)}

					min_i=Math.min(min_i,i)
					min_j=Math.min(min_j,j)
					max_i=Math.max(max_i,i)
					max_j=Math.max(max_j,j)
				}
			}
		}
	}

	if (antal_brikker_dette_traek>0) {
		// Kontroller naboskab til tidligere satte brikker
		if ((antal_brikker_tidligere_traek>0) && !naboskab) {

			alert("Mindst ét bogstav skal støde op til et tidligere placeret bogstav!")
			return false
		}

		// Kontroller horisontal/diagonal placering
		if (!((min_i == max_i) || (min_j == max_j))) {
			alert("Bogstaverne skal placeres lodret eller vandret!")
			return false
		}

		// Kontroller at der kun er skrevet ét ord
		var tom_plads=false
		if (min_i==max_i) {
			i=min_i
			j=min_j
			while ((j<max_j) && !tom_plads) {
				j++
				tom_plads=spilleplade[i][j].tom
			}
		} else {
			i=min_i
			j=min_j
			while ((i<max_i) && !tom_plads) {
				i++
				tom_plads=spilleplade[i][j].tom
			}
		}

		if (tom_plads) {
			alert("Du må kun skrive ét ord!")
			return false
		}

		// Spiller har kunnet placere nogle brikker
		traek++

	} else {
		// Spiller har ikke kunnet placere nogle brikker
		alert("Du har ikke placeret nogen bogstaver på spillepladen!")
		return false
	}

	return true
}

function kontroller_stavning () {
	// Retur: 	fundet ord, "" hvis intet

	// hvis 1 brik: brik må stå som den vil
	// hvis flere brikker brikker skal enten stå horisontalt eller vertikalt
	// hvis flere brikker må der ikke være mellemrum = flere ord
	// hvis spilleplade tom fra start: ikke krav om nabo til eksisterende bogstav
	// hvis spilleplade ikke tom: krav om nabo til eksisterende bogstav

	var antal_brikker_tidligere_traek = 0 // antal brikker sat i tidligere traek
	var antal_brikker_dette_traek = 0 // antal brikker sat i dette træk
	var naboskab = false // angiver om mindst én brik sat i dette træk står ved siden af en tidligere sat
	var min_i = raekke // minimum i-værdi for brikker sat i dette træk
	var max_i = -1 // maximum i-værdi for brikker sat i dette træk
	var min_j = soejle // minimum j-værdi for brikker sat i dette træk
	var max_j = -1 // maximum j-værdi for brikker sat i dette træk
	
	var ord_kan_findes // Angiver om det er muligt at finde et ord

	for (var i=0; i < raekke ; i++) {
 
		for (var j=0; j < soejle; j++) {
			if (spilleplade[i][j].laast) {
				// (i,j) indeholder en brik fra et tidligere træk
				antal_brikker_tidligere_traek++
			} else {
				if (!spilleplade[i][j].tom) {
					// (i,j) indeholder en brik fra dette træk
					antal_brikker_dette_traek++
					if (!naboskab) {naboskab=nabo(i,j)}

					min_i=Math.min(min_i,i)
					min_j=Math.min(min_j,j)
					max_i=Math.max(max_i,i)
					max_j=Math.max(max_j,j)
				}
			}
		}
	}

	if (antal_brikker_dette_traek>0) {
		ord_kan_findes=true;

		// Kontroller naboskab til tidligere satte brikker
		if ((antal_brikker_tidligere_traek>0) && !naboskab) {

			// Mindst ét bogstav skal støde op til et tidligere placeret bogstav!
			ord_kan_findes=false;
		} else {
			// Kontroller horisontal/diagonal placering
			if (!((min_i == max_i) || (min_j == max_j))) {
				// Bogstaverne skal placeres lodret eller vandret!
				ord_kan_findes=false;
			} else {

				// Kontroller at der kun er skrevet ét ord
				var tom_plads=false
				if (min_i==max_i) {
					vandret_ord=true; if (antal_brikker_dette_traek>1) {lodret_ord=false} else {lodret_ord=true};

					i=min_i
					j=min_j
					while ((j<max_j) && !tom_plads) {
						j++
						tom_plads=spilleplade[i][j].tom
					}
				} else {
					lodret_ord=true; if (antal_brikker_dette_traek>1) {vandret_ord=false} else {vandret_ord=true}

					i=min_i
					j=min_j
					while ((i<max_i) && !tom_plads) {
						i++
						tom_plads=spilleplade[i][j].tom
					}
				}

				if (tom_plads) {
					// Du må kun skrive ét ord!
					ord_kan_findes=false;
				} else {

					// Spiller har kunnet placere nogle brikker på rigtig vis. Find ordet!
					// Hvis der kun er placeret 1 bogstav, findes det længst dannede ord, ligegyldigt om det er vandret eller lodret

					ord_kan_findes=true;

					skrevet_ord=new String("");

					vandret_skrevet_ord=new String("");
					lodret_skrevet_ord=new String("");

					if (vandret_ord) {
						// 1) Find ud af, hvad der dannes inden for de placerede brikkers grænse
						i=min_i
						j=min_j
						while (j<=max_j) {
							vandret_skrevet_ord+=spilleplade[i][j].bogstav
							j++
						}

						// 2) Find ud af, hvad der dannes, når venstre side tages med
						i=min_i
						j=min_j
						tom_plads=false

						while ((j>0) && !tom_plads) {
							j--
							tom_plads=spilleplade[i][j].tom

							if (!tom_plads) {
								vandret_skrevet_ord=spilleplade[i][j].bogstav+vandret_skrevet_ord
							}
						}

						// 3) Find ud af, hvad der dannes, når højre side tages med
						i=min_i
						j=max_j
						tom_plads=false

						while ((j<soejle-1) && !tom_plads) {
							j++
							tom_plads=spilleplade[i][j].tom

							if (!tom_plads) {
								vandret_skrevet_ord+=spilleplade[i][j].bogstav
							}
						}
					}

					if (lodret_ord) {
						// lodret ord

						// 1) Find ud af, hvad der dannes inden for de placerede brikkers grænse
						i=min_i
						j=min_j
						while (i<=max_i) {
							lodret_skrevet_ord+=spilleplade[i][j].bogstav
							i++
						}

						// 2) Find ud af, hvad der dannes, når top tages med
						i=min_i
						j=min_j
						tom_plads=false

						while ((i>0) && !tom_plads) {
							i--
							tom_plads=spilleplade[i][j].tom

							if (!tom_plads) {
								lodret_skrevet_ord=spilleplade[i][j].bogstav+lodret_skrevet_ord
							}
						}

						// 3) Find ud af, hvad der dannes, når bund tages med
						i=max_i
						j=min_j
						tom_plads=false
					
						while ((i<raekke-1) && !tom_plads) {
							i++
							tom_plads=spilleplade[i][j].tom

							if (!tom_plads) {
								lodret_skrevet_ord+=spilleplade[i][j].bogstav
							}
						}
					}

					if (vandret_ord && lodret_ord) {
						// Der er kun skrevet 1 bogstav: returner det længste ord
						if (vandret_skrevet_ord.length>=lodret_skrevet_ord.length) {
							skrevet_ord=vandret_skrevet_ord;
						} else {
							skrevet_ord=lodret_skrevet_ord;
						}
				
					} else {
						if (vandret_ord) {
							skrevet_ord=vandret_skrevet_ord;
						} else {
							// lodret ord
							skrevet_ord=lodret_skrevet_ord;
						}
					}
				}
			}
		}
	} else {
		// Spiller har ikke placeret nogle brikker
		ord_kan_findes=false;
	}

	if (ord_kan_findes) {
		return skrevet_ord.toLowerCase();
	} else {
		return "";
	}
}

function optael_point (form) {
	var point=0
	
	point = kontroller_stavning().length;

	// Sørg for at point kan overføres til index.php
	form.point.value = point

	// Optæl point til brug for private spil
	if ((traek/2)==Math.round(traek/2)) { 
		point_spiller+=point;
	} else {
		point_modspiller+=point;
	} 

	form.point_spiller.value=point_spiller;
	form.point_modspiller.value=point_modspiller;

	// Ajourfør maksimalt pointtal
	form.gl_max_point.value = max_point
	if (point > max_point) {
		form.max_point.value = point
	} else {
		form.max_point.value = max_point
	}
}

function member(tegn,maengde) {
	mgd = new String(maengde)
	
	if (mgd.indexOf(tegn)!=-1) {
		return true
	} else {
		return false
	}
}

function afslut_traek (form) {
	// Hvis fejl returneres false ellers true

	if (valider_traek(form)) {
		optael_point(form)

		gem_spilleplade(form)

		// Spiller skal igang med næste træk. Overfør max_traek.
		form.p.value=p
		form.traek.value=traek // traek tælles op i valider_traek

		if (bedstaf_vises) {
			// Gem det valgte maksimale antal træk
			i = document.bedstaf.valg.options.selectedIndex
			max_traek=document.bedstaf.valg.options[i].value
		}
		form.max_traek.value=max_traek

		// Lad modspiller tage over
		return true
	} else {
		// Lad ikke modspiller tage over
		return false
	}
}

function gem_spilleplade (form) {
	// Gemmer indholdet af spillepladen i form.spilleplade.value
	// så den kan overføres til index.php

	var gemt_spilleplade=String("")
	for (var i=0; i < raekke ; i++) {
 
		for (var j=0; j < soejle; j++) {
			if (spilleplade[i][j].tom) {
				gemt_spilleplade += " "
			} else {
				gemt_spilleplade += spilleplade[i][j].bogstav
			}
		}
	}

	// Man ved nu, at brikker med små bogstaver hidrører fra dette træk
	form.spilleplade.value=kod(gemt_spilleplade)
}


// Funktionen kb (hed tidligere klik_brik) sørger for,
// (1) At man kan flytter rundt på de bogstaver man har på brikhylden eller
// (2) At tage et bogstav, som senere kan placeres på spillepladen eller
// (3) At man kan placere et bogstav på brikhylden, som er taget fra spillepladen

var gemtBogstav=" " // Indeholder det bogstav, der er fjernet og som skal placeres igen
var fraSpilleplade=false // Angiver om bogstavet kommer fra spillepladen
var pladsGemtBogstav // Indeholder nummeret på pladsen, hvor gemtBogstav stod (hvis fraSpilleplade=false)

function kb (obj,nr) {
	if (spiller) {
		// Sæt ny langsommere refresh-rate
		if (!privat_spil) {
			// Kun mulighed for et nyt træk i offentlige spil
			clearTimeout(refresh_spiller)
			set_refresh_spiller(refresh_rate_spiller,refresh_rate_spiller)
		}

		if (gemtBogstav==" ") {
			if (!brikker[nr].tom) {
				gemtBogstav=obj.form.elements[nr].value
				fraSpilleplade=false
				pladsGemtBogstav=nr
				brikker[nr].tom=true
				obj.form.elements[nr].value = " "
			}
		} else {
			if (fraSpilleplade) {
				if (brikker[nr].tom) {
					// Placer gemt bogstav på den ledige plads
					obj.form.elements[nr].value = gemtBogstav
					brikker[nr].tom=false
					gemtBogstav = " "
				} else {
					// Placer gemt bogstav på første ledige plads
					var j=0
					while (!brikker[j].tom) {
						j++
					}
					obj.form.elements[j].value = gemtBogstav
					brikker[j].tom=false
					gemtBogstav = " "
				}
			} else {
				// Placer gemt bogstav på ny plads og ryk andre
				if (nr==pladsGemtBogstav) {
					brikker[nr].tom=false
					obj.form.elements[nr].value = gemtBogstav
					gemtBogstav = " "		
				} else {
					if (nr<pladsGemtBogstav) {
						for (var i=pladsGemtBogstav; i>nr; i--) {
							obj.form.elements[i].value = obj.form.elements[i-1].value
							brikker[i].tom=brikker[i-1].tom
						}
						obj.form.elements[nr].value = gemtBogstav
						brikker[nr].tom=false
	
						gemtBogstav = " "
					} else {
						if (nr>pladsGemtBogstav) {
							for (var i=pladsGemtBogstav; i<nr; i++) {
								obj.form.elements[i].value = obj.form.elements[i+1].value
								brikker[i].tom=brikker[i+1].tom
							}
							obj.form.elements[nr].value = gemtBogstav
							brikker[nr].tom=false
	
							gemtBogstav = " "
						}
					}
				}
			}
		}
	}
}

function ks (obj,r,s) {
	// Funktionen (hed tidligere klik_spilleplade)
	// (1) Placerer en brik på spillepladen eller
	// (2) Fjerner en brik fra spillepladen
	if (spiller) {
		if (gemtBogstav != " ") {
			if (spilleplade[r][s].tom) {
					// Indsæt bogstav på spillepladen
					spilleplade[r][s].tom=false
					spilleplade[r][s].bogstav=gemtBogstav
					obj.form.elements[r*soejle+s].value=gemtBogstav
					gemtBogstav=" "
			}
		} else {
			if (!spilleplade[r][s].laast) {
				// Fjern nuværende bogstav fra spillepladen og lad felt være tomt
				spilleplade[r][s].tom=true
				gemtBogstav=spilleplade[r][s].bogstav
				fraSpilleplade=true
				spilleplade[r][s].bogstav=" "
				obj.form.elements[r*soejle+s].value=" "

			}
		}
	}
}

// Funktioner af relevans for refresh
function skriv_besked(i,tekst) {
	// Skriver tekst centreret på spilleplade startende i linie i
	tekst=new String(tekst);

	offset_soejle=Math.round((soejle-tekst.length)/2);
	praefix="";
	for (var k=0; k<offset_soejle; k++) {
		praefix+=" ";
	}

	tekst=praefix+tekst;
	for (var j=0; j < soejle; j++) {
		document.spilleplade.elements[i*soejle+j].value=tekst.charAt(j);
	}
}

function vis_ventetid() {
	// Tøm spilleplade
	for (var i=0; i < raekke ; i++) {
 		for (var j=0; j < soejle; j++) {
			document.spilleplade.elements[i*soejle+j].value = " "
		}
	}
	
	// Udregn, hvornår der kan prøves igen, og foretag reload, hvis ventetid gået
	aktueltid += Math.round(refresh_rate_ikke_spiller/1000)
	ventetid_sekunder=(starttid+ventetid)-aktueltid 

	if (ventetid_sekunder < Math.round(refresh_rate_ikke_spiller/1000)) {
		// reload
		location.replace("./");
	} else {
	
		if (ventetid_sekunder < 60) {
			if ((ventetid_sekunder==0) || (ventetid_sekunder==1)) {
				ventetid_tekst = "1 sekund"
			} else {
				ventetid_tekst = ventetid_sekunder+" sekunder"
			}
		} else {
			ventetid_minutter = Math.round(ventetid_sekunder/60)

			if (ventetid_minutter==1) {
				ventetid_tekst = "1 minut"
			} else {
				ventetid_tekst = ventetid_minutter+" minutter"
			}
		}

		// Skriv besked på spilleplade
		offset_raekke=Math.round((raekke-4)/2);

		skriv_besked(0+offset_raekke,"Vent "+ventetid_tekst);
		skriv_besked(1+offset_raekke,"og bidrag med");
		skriv_besked(2+offset_raekke,"endnu et ord!");

		// Lad beskeden stå et stykke tid, og genskriv herefter spillepladen
		setTimeout("udfyld_spilleplade()",Math.round(refresh_rate_ikke_spiller/2)) // Ventetiden skal være mindre end refresh_rate_ikke_spiller
		set_refresh_ikke_spiller(refresh_rate_ikke_spiller,refresh_rate_ikke_spiller)
	}
}

var refresh_rate_ikke_spiller; // Global variabel, som sættes i set_refresh_ikke_spiller() og bruges af vis_ventetid() 
function set_refresh_ikke_spiller(initiel_refresh_rate_ikke_spiller,standard_refresh_rate_ikke_spiller) {
	// Anvendes hvor spiller="nej"
	refresh_rate_ikke_spiller=standard_refresh_rate_ikke_spiller;
	setTimeout("vis_ventetid()",initiel_refresh_rate_ikke_spiller);
}

var refresh_spiller // Global variabel, der anvendes til at nulstille refresh, når der er klikket på et bogstav på brikhylden
var refresh_rate_spiller // Global variabel, som sættes i set_refresh_spiller og anvendes i kb()
function set_refresh_spiller(refresh_rate_foer_klik,refresh_rate_efter_klik) {
	// Anvendes hvor spiller="ja"
	refresh_rate_spiller=refresh_rate_efter_klik
	refresh_spiller=setTimeout("location.replace('./')",refresh_rate_foer_klik);
}


