/////// Lijst van Fold items ///////

var folds     = new Array();
var nrOfFolds = 0;

/////// Fold object ////////////////////////////////////////////////////////////////
//
// Een Fold-object bestaat uit een <div>-omgeving, waarvan de waarde wordt gevuld
// met behulp van de innerHTML methode. Iedere Fold is in een van de toestanden
// 'hidden' of 'deployed'. Afhankelijk van de toestand wordt een van de twee
// strings 'hiddenContent' of 'deployedContent' naar de <div> omgeving
// geschreven.
//
// Alle folds worden in een array opgeslagen. Folds hebben een mark (string),
// waarmee een groep van folds binnen het array kan worden geidentificeerd.
// Alle folds op een pagina hebben dezelfde mark.
//

// Constructor
//
function Fold(mark, hiddenContent, deployedContent, isDeployed)
{ this.mark = mark;
  this.hiddenContent = hiddenContent;
  this.deployedContent = deployedContent;
  this.isDeployed = isDeployed; 

  // methods:
  this.addHiddenContent = addHiddenContent;
  this.addDeployedContent = addDeployedContent;
}

function addHiddenContent(content)
{ this.hiddenContent += content;
}

function addDeployedContent(content)
{ this.deployedContent += content;
}

////////////////////////////////////////////////////////////////////////////////////
//
// foldOpen(mark, hiddenContent, deployedContent, isDeployed)
//  foldAdd(content_1)
//       :
//  foldAdd(content_N)
// foldClose(mark)
//
// Voegt een Fold toe aan de lijst van alle Folds.
// De identifier is gelijk aan "Fold<N>", met <N> het index in de 'folds'-lijst.
//
function foldOpen(mark, hiddenContent, deployedContent, isDeployed)
{ var id = "Fold" + nrOfFolds;
  folds[nrOfFolds++] = 
    new Fold(mark, hiddenContent, deployedContent, (isDeployed == null ? false : isDeployed));
  document.write('<div id="' + id + '">');
}

function foldAdd(content)
{ folds[nrOfFolds - 1].addDeployedContent(content);
}

function foldClose(mark)
{ document.write('</div>');
  var stateVector = getCookie(mark + "_foldState");
  var currFold = folds[nrOfFolds - 1];
  if (stateVector != null && nrOfFolds <= stateVector.length)
      currFold.isDeployed = (stateVector.charAt(nrOfFolds - 1) == "1");
    activate(nrOfFolds - 1, currFold.isDeployed);
}

function activate(index, state)
{ folds[index].isDeployed = state;
  document.getElementById("Fold" + index).innerHTML =
    (state ? folds[index].deployedContent : folds[index].hiddenContent);
}

function deploy(index)
{ activate(index, true);
}

function hide(index)
{ activate(index, false);
}

function activateAll(mark, state)
{ for (i = 0; i < nrOfFolds; i++)
    if (folds[i].mark == mark)
      activate(i, state);
}

function hideAll(mark)
{ activateAll(mark, false);
}

function deployAll(mark)
{ activateAll(mark, true);
}

function showFolds(mark)
{ document.write("<b><br>Fold/debug:<br>nrOfFolds = " + nrOfFolds + "<br>");
  for (i = 0; i < nrOfFolds; i++)
  { document.write('id: Fold' + i + ':<br>');
    document.write('&nbsp;&nbsp;mark = ' + folds[i].mark + '<br>');
    document.write('&nbsp;&nbsp;state = ' + (folds[i].isDeployed ? "deployed" : "hidden") + '<br>');
    document.write('&nbsp;&nbsp;deployed content= ' + folds[i].deployedContent + '<br>');
    document.write('&nbsp;&nbsp;hidden content= ' + folds[i].hiddenContent + '<br>');
  }
  document.write("</b><br>");
}

// Gebruik deze functie in de <body>-tag:
//
//  <body onUnload="saveFoldStates(mark)" ....>
//
function saveFoldStates(mark)
{ var stateVector = "";
  for (i = 0; i < nrOfFolds; i++)
    if (folds[i].mark == mark)
      stateVector += (folds[i].isDeployed ? "1" : "0");
  setCookie(mark + "_foldState", stateVector);
}

/////// Cookies ////////////////////////////////////////////////////////////////////
//
// Cookies worden bewaard in 'document.cookie', als serie
// cName1 = cVal1; .. ; cNameN = cValN.
//
// getCookie(cName)                    : geeft cValJ als er in cookie een comninatie
//                                       "cNameJ=cName", anders 'null'.
//
// setCookie(cName, value, expireDays) : voegt aan cookie "cName=cVal" toe.
//                                       expireDays is het aantal dagen dat het
//                                       cookie blijft bestaan (optioneel)
//
// delCookie(cName)                    : verwijdert key cName uit cookie.
//
function getCookie(cName)
{ if (document.cookie.length > 0) 
  { begin = document.cookie.indexOf(cName + "="); 
    if (begin != -1) 
    { begin += cName.length + 1; 
      end = document.cookie.indexOf(";", begin);
      if (end == -1)
        end = document.cookie.length;
      return unescape(document.cookie.substring(begin, end));
    } 
  }
  return null; 
}

function setCookie(cName, cVal, expireDays) 
{ var ExpireDate = new Date ();
  ExpireDate.setTime(ExpireDate.getTime() + (expireDays == null ? 8000 : expireDays) * 24 * 3600 * 1000);
  document.cookie = cName + "=" + escape(cVal) + "; expires=" + ExpireDate.toGMTString() + "; path=/";
}

function delCookie (cName) 
{ if (getCookie(cName))
    document.cookie = cName + "=" + ";expires=Thu, 01-Jan-70 00:00:01 GMT";
}

