// Oefeningen voor de vervoeging van werkwoorden, met hints, uitleg en theorie
// Copyright Tom de Neef, 2008
// Wil je delen gebruiken in een commerciele context? Neem dan contact op met tdeneef@qolor.nl  

  var versie = "1.01"

// 1.01   2009-02-23 aanpassing aan dropdown list voor Google Chrome
// 1.00   2009-02-08
// 0.97.5 Footnote bij details als voor vd zin wordt omgebouwd
// 0.97.4 Bug: deelwoord[n-2] -> deelwoord.charAt(n-2) bij uitleg bijv. naamwoord
// 0.97.3 Statistieken: inzicht in de zinnen
// 0.97.2 Auteur sectie toegevoegd
// 0.97.1 Meervoud bijzondere klemtoon: batik - batikken
// 0.97   Bug: maar 1 antw bij "schatte" niet leidend tot false return in VTvariations()
//        Bug: meervoud van punnik=punniken; alg: geen extra k bij kl..mdkl-ik
//        Bug: herinnerd zonder trema (die er komt door geinnerd)
//        Link colors
//	      Alleen spatiebalk i.p.v. iedere toets voor nieuwe opgave
// 0.96   Boxover color variations 
//        Geen fout bij verandering type of tijd
//        Spatiebalk voor nieuwe opgave (ipv dubbelklik)
// 0.95   Boxover fix in index.htm 
//        newVersion test opgegeven vanwege security (kan niet vanaf local)
// 0.94   Boxover tooltips 
//        Gemenge opgaven 
//        OpgType en tijden in dropdown list
//
var goedCnt = 0
var hulpCnt = 0
var foutCnt = 0
var beoordeeld = true
var hintGegeven = false
var secondWindow
var started = false
var titles = []
var homeURL = "http://www.qolor.nl/spelling/"


function StatusToString()
{
  return "versie = "+versie+nlcr+
         "type opgave = "+opgType[typeOpgave]+nlcr+
         "tijd = "+tijdType[tijdOpgave]+nlcr+
         "hint gegeven = "+hintGegeven+nlcr+
         "beoordeeld = "+beoordeeld+nlcr+
         nlcr+
         opgRecord.ToString()+nlcr+
         opgRecord.dataRecord.ToString()
}
  
function Link(targetFunc,txt,title)
{
  if (typeof title == "undefined") {title = ""} else {title = "title='"+title+"' "}
  return "<a "+title+"href='javascript:void "+targetFunc+"'>"+txt+"</a>"
}
  
function ShowText(ID,txt)
// Place TXT in document element with ID as innerHTML code
{
  var element = document.getElementById(ID)
  try { element.innerHTML = txt } catch(e) {}
}
  
function ShowIntro() { PopUpFile("wwIntro.htm") }
function ShowTheory(filename) { PopUpFile(filename) }
function ShowHelp() { PopUpFile("wwHelp.htm") }
function ReportError() { Mail(StatusToString(),1) }
function ShowStam() { PopUpFile("wwStam.htm") }
function ShowMeerUitleg() { ShowText("instr",opgRecord.theorie) }

function ShowAntwoord(index)
{
  var txt
  if (index > opgRecord.antwoorden.length) { txt = "" }
  else
  { txt = opgRecord.antwoorden[index]
    if (typeof(txt) == "undefined") { txt = "" }
  }

  var idx = "01234".charAt(index)
  ShowText("antwoord"+idx,txt)
  document.getElementById("regel"+idx).style.background = ""
}

function ShowHint()
// Als een hint is gegeven dan telt een goed antwoord maar half
{
  ShowText("instr",opgRecord.hint)
  hintGegeven = true
}

function StopIntro()
// Verwijder boxovers
{
  if (started) { return }
  TurnTooltipsOff()
  started = true
  DefineTooltips()
  RestoreTitles()
  // neem lege regels weg
  var div = document.getElementById("Dtemp")
  while (div.childNodes[0]) { div.removeChild(div.childNodes[0]) }
}

function NieuweOpgave()
{
  StopIntro()
  if (!beoordeeld) { foutCnt++; foutRecord.Onthoud(opgRecord,opgRecord.correctZin); UpdateScores() }
  ShowResult("")

  var tijd,test,m
  switch (tijdOpgave)
  {
    case 1 : tijd = "tt"; break
    case 2 : tijd = "vt"; break
    case 3 : tijd = "vd"; break
    default: tijd = "*"
  }

  switch (typeOpgave)
  {
    case 1 : test = opgRecord.MaakZinvolleOpgave(opgaven); break
    case 2 : test = opgRecord.StelWoordkeusOpgaveSamen(opgaven); break
    case 3 : test = opgRecord.StelNakijkOpgaveSamen(opgaven); break
    default: if (tijd == "*") { m = 5 } else { m = 4 }
             m = Random(m)
             switch (m)
             {
              case 0:
              case 1: test = opgRecord.MaakZinvolleOpgave(opgaven); break
              case 2:
              case 3: test = opgRecord.StelNakijkOpgaveSamen(opgaven); break
              case 4: test = opgRecord.StelWoordkeusOpgaveSamen(opgaven); break
             }
  }

  if (!test)
    { alert("Het programma kan geen opgaven vinden. Breek het maar af.")
      return
    }

  ShowText("ww","<font color='maroon'>"+opgRecord.key+"<\/font>")
  ShowText("opgave",nbsp4+"<font color='maroon'>"+opgRecord.zin+"<\/font>")
  ShowText("instr",opgRecord.instructie)

  ShowAntwoord(0)
  ShowAntwoord(1)
  ShowAntwoord(2)
  ShowAntwoord(3)
  ShowAntwoord(4)

  beoordeeld = false
  hintGegeven = false
  document.getElementById("Anext").title = "Opgave "+(opgaven.currentIndex+2)+" van "+opgaven.length
  return
}

function AcceptSpacebar(e)
// Als spacebar wordt ingedrukt: nieuwe opgave
{
  var keynum
  if(window.event) { keynum = e.keyCode } // IE
  else 
  if(e.which) { keynum = e.which } // Netscape/Firefox/Opera
  else { return }

  if (keynum==32) { NieuweOpgave() }
}

function UpdateScores()
{
  var score = goedCnt+hulpCnt+foutCnt
  if (score != 0) { score = Math.round(10*(goedCnt+hulpCnt*0.5)/score) }
  
  ShowText("goed","<small>Goed : <font color='maroon'>"+goedCnt+"</font></small>")
  ShowText("hulp","<small>Hulp : <font color='maroon'>"+hulpCnt+"</font></small>")
  ShowText("fout","<small>Fout : <font color='maroon'>"+foutCnt+"</font></small>")
  ShowText("score","<small>Score : <font color='maroon'><B>"+score+"</B></font></small>")
}

function ShowResult(txt)
{
  if (txt == "") { ShowText("result","") }
  else { ShowText("result","<font size=+2>"+txt+"</font>") }
}

function ResetScores()
{
  goedCnt = 0
  hulpCnt = 0
  foutCnt = 0
  UpdateScores()
  
  foutRecord.Clear()
}

function AnalyseErrors()
{
  PopUpText("Foutanalyse",foutRecord.Report())
}

function MarkCorrectAntwoord(index)
// kleur de regel met het juiste antwoord
{
  var element = document.getElementById("regel"+"01234".charAt(index))
  if (typeof element != "undefined")
    { element.style.background = "white"}
}
  
function Evaluate(index)
// Kijk of antwoord[index] het juiste is
// Als voor 2e keer op antwoord wordt geklikt dan geen aktie
{
  if (beoordeeld) { return } // antwoord is al beoordeeld
	 
  var correct = opgRecord.CheckAntwoord(index)
  var commentaar,ref,onthoudZin
  
  if ( correct == index ) 
    { if  (hintGegeven) { hulpCnt++; onthoudZin = opgRecord.correctZin }
      else { goedCnt++; onthoudZin = "" }
      ShowResult("<font color='green'>GOED antwoord</font>")
      commentaar = "<font color = '#336633'>"+opgRecord.uitleg+"</font>"
    }
  else
    { foutCnt++
      onthoudZin = opgRecord.correctZin
      ShowResult("<font color='red'>FOUT antwoord</font>")
      commentaar = "<font color = maroon>"+opgRecord.theorie+"</font>"
    }
	   
  foutRecord.Onthoud(opgRecord,onthoudZin)
  ShowText("opgave",nbsp4+"<font color='maroon'>"+opgRecord.uitlegZin+"<\/font>")
  MarkCorrectAntwoord(correct)
  UpdateScores()
  beoordeeld = true
  ref = 'javascript:void ShowTheory("'+opgRecord.achtergrond+'")'
  ShowText("instr",commentaar+"<br><a href='"+ref+"'>Theorie</a>")
  return
}

function SetTableDimensions(ID,top,left,height,width)
{
  var element = document.getElementById(ID)
  element.style.left = left
  element.style.top = top
  element.setAttribute("width",width)
  element.setAttribute("height",height)
}

function ResizePage()
// margin - columnWidth - gap - centerWidth - gap - columnWidth - margin
// Als de margin < 20 dan moeten de pag & centerWidth geschaald
{
  var winWidth, winHeight, d=document
  if (typeof window.innerWidth!="undefined") 
    {
      winWidth = window.innerWidth
      winHeight = window.innerHeight
    }
  else 
    { if (d.documentElement &&
          typeof d.documentElement.clientWidth!="undefined" &&
          d.documentElement.clientWidth!==0)
        {
          winWidth = d.documentElement.clientWidth
          winHeight = d.documentElement.clientHeight
        }
      else
      if (d.body && typeof d.body.clientWidth!="undefined")
        {
          winWidth = d.body.clientWidth
          winHeight = d.body.clientHeight
        }
      else { winWidth = 0; winHeight = 0; return }
    }

  var columnWidth = 120
  var centerWidth = 600
  var gap = 30
  var margin = ((winWidth-centerWidth)>>1)-columnWidth-gap
  var scale

  if (margin<20)
    { scale = (winWidth-2*columnWidth-40)/(centerWidth+2*gap)
      if (scale < 0.5) { scale = 0.5 }
      margin = 20
      gap = Math.floor(scale*gap)
      centerWidth = Math.floor(scale*centerWidth)
    }

  SetTableDimensions("Tww",100,margin,40,columnWidth)
  SetTableDimensions("Tansw",140+gap,margin,180,columnWidth)
  SetTableDimensions("Tzin",100,margin+columnWidth+gap,40,centerWidth+gap+columnWidth)
  SetTableDimensions("Tcntr",140+gap,margin+columnWidth+gap*2,180+gap+40,centerWidth-gap*2)
  SetTableDimensions("Ttype",140+gap,margin+columnWidth+gap*2+centerWidth,(180-gap)/2,columnWidth)
  SetTableDimensions("Ttijden",140+gap+(180+gap)/2,margin+columnWidth+gap*2+centerWidth,(180-gap)/2,columnWidth)
  SetTableDimensions("Tnext",140+gap*2+180,margin,40,columnWidth)
  SetTableDimensions("Thelp",140+gap*2+180,margin+columnWidth+gap*2+centerWidth,40,columnWidth)
  SetTableDimensions("Terror",140+gap*3+220,margin+columnWidth+gap*2+centerWidth,40,columnWidth)
  SetTableDimensions("Tstatus",2,margin,20,(columnWidth+gap)*2+centerWidth)
}

function MarkCell(prefix,index,mark)
{
  var element = document.getElementById(prefix+"0123".charAt(index))
  if (typeof element == "undefined") { return }
  if (index == mark) { element.style.background = "#FEEAAB" }
  else { element.style.background = "" }
}
  
function SelectType(index)
// type opgave, zie opgType
{
  typeOpgave = index

  if (typeOpgave == 2) { SelectTijd(0) }
  document.getElementById("Stype").selectedIndex = index
}

function ReactSelectType(index)
{
  SelectType(index)
  beoordeeld = true
  NieuweOpgave()
}

function SelectTijd(index)
// tijd van de opgave
{
  if (typeOpgave == 2) { tijdOpgave = 0 } else { tijdOpgave = index }
  document.getElementById("Stijden").selectedIndex = index
  
  opgaven.FillArray(basisOpgaven,tijdType[tijdOpgave])
}

function ReactSelectTijd(index)
{
  SelectTijd(index)
  beoordeeld = true
  NieuweOpgave()
}

function CreatePopUp()
// Maak secondWindow tenzij het al bestaat
{
  if ((typeof secondWindow == "undefined") || secondWindow.closed || !secondWindow.location) 
     { secondWindow = window.open("","","width=600,height=400,scrollbars=yes") }
}

function PopUpText(title,txt)
{
  CreatePopUp()  
  var head = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w3.org/TR/html4/loose.dtd">'+
             "<html><head>"+
             "<title>"+title+"<\/title>"+
             "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"+
             "<LINK  href='data/wwStyles.css' type='text/css' rel=stylesheet>"+
             "<\/head>"
				
  secondWindow.document.write(head+"<body>"+txt+"<\/body><\/html>")
  secondWindow.document.close()
  secondWindow.focus()
}

function PopUpFile(url)
{
  CreatePopUp()  
  secondWindow.location.href = "data/"+url
  secondWindow.focus()
}

function ClosePopup()
{
  if ((typeof secondWindow != "undefined") && !secondWindow.closed && secondWindow.location) 
    { secondWindow.close() }
}
  
function DefineTooltip(ID,header,body)
{
  if (started) { document.getElementById(ID).title="" }
  else { document.getElementById(ID).title="header=["+header+"] body=["+body+"]" }
}

function StoreTitles()
// Sla alle titles van <A> tags op en maak ze blank
{
  var k,links = document.links
  for (k=0;k<links.length;k++) { titles[k] = links[k].title; links[k].title = "" }
}

function RestoreTitles()
// Zet alle titles van <A> tags terug
{
  var k,links = document.links
  for (k=0;k<links.length;k++) { links[k].title = titles[k] }
  titles = []
  
  // Help title voorzien van versie nr
  var element = document.getElementById("Ahelp")
  element.title = element.title+" (V"+versie+")"
}

function DefineTooltips()
{
  DefineTooltip("Tzin","De opgave",
                "In dit paneel komt de oefenzin. "+
                "Je kunt om een nieuwe opgave vragen door op de spatiebalk te drukken. "+
                "Of klik op de link 'Volgende opg.'.")
  DefineTooltip("Tansw","De antwoorden",
                "In dit paneel komen de antwoorden waaruit je kunt kiezen. "+
                "Je kiest er &eacute;&eacute;n door erop te klikken. "+
                "Daarna krijgt het goede antwoord een witte achtergrond en "+
                "wordt uitleg over de opgave gegeven in het centrale gedeelte "+
                "van het venster. Bij de meeste opgaven kun je om een hint vragen "+
                "als je het antwoord niet weet. We denken dat je van een hint "+
                "meer leert dan van gokken.")
  DefineTooltip("Tww","Het werkwoord",
                "Bij de meeste opgaven komt in dit vlakje het werkwoord dat "+
                "vervoegd moet worden.")
  DefineTooltip("Tcntr","Instructie &amp; uitleg",
                "Het centrale gedeelte van het venster is voor uitleg. "+
                "Bij het begin van een opgave is dat de instructie. Als je om een "+
                "hint vraagt dan komt die er te staan en na beantwoording komt er "+
                "uitleg over de opgave.")
  DefineTooltip("Ttype","Type opgaven",
                "In de lijst kies je wat voor opgaven je wilt oefenen: "+
                "vervoegingen, bepalen wat voor soort woord het is, nakijken "+
                "of er spelfouten in een zinnetje zitten of een mix ervan "+
                "(zie Help - Opgaven voor meer uitleg).")
  DefineTooltip("Ttijden","Tijden",
                "In de lijst kies je of je "+
                "de oefeningen wilt beperken tot &eacute;&eacute;n 'tijd' of dat "+
                "je een mix van alle tijden wilt. In dat laatste geval worden er "+
                "ook zelfstandig naamwoorden en bijwoorden / bijvoeglijk naamwoorden "+
                "gebruikt die zijn afgeleid van werkwoorden.")
  DefineTooltip("Tnext","Volgende",
                "Klik hier om een nieuwe opgave te genereren. (Je kunt ook "+
                "de spatiebalk indrukken.) Als je om "+
                "een nieuwe opgave vraagt voor je een antwoord hebt gegeven "+
                "voor de huidige opgave, dan wordt die fout gerekend.")
  DefineTooltip("Thelp","Help (V"+versie+")",
                "De Help link opent een tweede venster, waarin je kunt kiezen "+
                "uit help-onderwerpen. Daarbij zit vooral theorie en ondersteuning "+
                "voor off-line werken, contact met ons, vervoegingen testen, e.d.")
  DefineTooltip("Terror","Bug report",
                "Gebruik deze link om een "+
                "email aan ons te sturen met een foutmelding. De email zal "+
                "relevante gegevens over de huidige opgave bevatten. Het is "+
                "daarom zinvol om een fout onmiddellijk te melden, d.w.z. "+
                "als de opgave waarin je iets slordigs ontdekte nog op het "+
                "scherm staat. (NB: dit zal niet werken als je geen email "+
                "programma ge&iuml;nstalleerd hebt.)")
  DefineTooltip("Tstatus","Aantallen en score",
                "De scores. Met de labels kun je de telling herstarten dan wel een analyse "+
                "vragen van de fouten die je hebt gemaakt. Dat laatste werkt alleen "+
                "als je 'voldoende' fouten hebt gemaakt. Anders valt er niets te "+
                "analyseren.")
}

function Initialize()
// to be called as onload for <BODY>
{
  ResizePage()
  basisOpgaven.LoadFromFile("data/ww.opg")
  SelectType(0)
  SelectTijd(0)
  ResetScores()
  StoreTitles()
  DefineTooltips()
// checking for newer version: kan niet vanaf local file vanwege security restrictions
}
  

