function Data()
{
  this.theme = null;
  this.exercises = null;
  this.exercisesById = null;
}

Data.prototype = {
  themeIsOk: function(themeIn)
  {
    for(var i=0; i<themeIn.exercises.length; i++)
      if(this.exerciseIsOK(themeIn.exercises[i]) == false)
        return false;
    return true;
  },
  exerciseIsOK: function(exercise)
  {
    for (var i=0; i<exercise.idxs.length; i++)
      if (exercise.scores[exercise.idxs[i]] != CORRECT)
        return false;

    return true;
  },
  getExerciseScore: function(exercise, idx)
  {
    return exercise.scores[exercise.idxs[idx]];
  },
  setExerciseScore: function(exercise, idx, score, progressbar)
  {
    exercise.scores[exercise.idxs[idx]] = score;

    if (progressbar)
      progressbar.setItemState(idx, (score?'correct':'incorrect'));
  },
  getExerciseStartIndex: function(exercise)
  {
    for (var i=0; i<exercise.idxs.length; i++)
      if (this.getExerciseScore(exercise, i) != CORRECT)
        return i;

    return null;
  },
  getExerciseNextIndex: function(exercise, idx)
  {
    idx++;
    while ((idx<exercise.idxs.length) && (exercise.scores[exercise.idxs[idx]] == CORRECT))
      idx++;

    if (idx >= top.exercise.idxs.length)
      return null;

    return idx;
  },
  getExerciseIndexedScores: function(exercise)
  {
    var scores = [];
    for (var i=0; i<exercise.idxs.length; i++)
      scores.push(exercise.scores[exercise.idxs[i]]);

    return scores;
  },
  resetExercise: function(exercise)
  {
    for (i=0; i<exercise.scores.length; i++)
      exercise.scores[i] = UNANSWERED;
  },
  getExerciseWordData: function(exercise, idx)
  {
    var wdx = exercise.idxs[idx];
    return this.getExerciseWordDataByWdx(exercise, wdx);
  },
  getExerciseWordDataByWdx: function(exercise, wdx)
  {
    if (typeof wdx == 'number') {
      return top.theme.data[exercise.data][wdx];
    } else {
      var th = top.userData.themes;
      for (var sTheme in th)
        for (var sData in th[sTheme].data)
          for (var sItem in th[sTheme].data[sData])
            if (th[sTheme].data[sData][sItem].id == wdx) 
              return th[sTheme].data[sData][sItem];
      // prevent errors
      return {};
    };
  },
  getExerciseWordDataById: function(exercise, id)
  {
    if (typeof exercise == 'string')
        var dat = top.theme.data[exercise];
    else
        var dat = top.theme.data[exercise.data];
    for (var wd in dat) if (dat[wd].id == id) return dat[wd];
    return null;
  },
  saveExerciseScore: function(exercise)
  {
    // geeft een access denied
    //var f = top.save.document.forms["save"];
    //f.theme.value = top.theme.id;
    //f.type.value = "exercise";
    //f.exercise.value = top.exerciseIdx;
    //f.idxs.value = "" + exercise.idxs;
    //f.scores.value = "" + this.getExerciseIndexedScores(exercise);
    //f.submit();
    
    var scores = "" + this.getExerciseIndexedScores(exercise);
    Saver.save(top.theme.id,"exercise",top.exerciseIdx,"" + exercise.idxs,scores, top.theme.idx);

    this.updateThemeScoreTable(top.theme,top.theme.idx,scores);
  },
  updateThemeScoreTable: function(theme,themeid,score)
  {
    if(score.indexOf('1') == -1 && score.indexOf('0') == -1) return;
    var url = "/code/lib/setscore.asp?themeidx="+theme.idx+"&score=";
    
    if(this.themeIsOk(theme) === true)
    {
      top.userData.themes[theme.id].score = 1;
      url += "1";  
    }
    else
    {
      top.userData.themes[theme.id].score = 0;
      url += "0";
    }

    var xmlhttp = getXMLHTTP();
    xmlhttp.open("GET",url,false);
    xmlhttp.send(null);    
  }  
};                       

var data = new Data();