// fgtoc.js
// JavaScript code to add toc to HTML pages
//-------------------------------------------------------------------
// Copyright (c) 2006 Geoff Mclane <geoffmclane.com/a-mail.htm>
// fgtoc.js is part of the http://geoffmclane.com/fg website
// This library is free software; you may modify it and/or 
// distribute it under the same terms as Perl itself
//-------------------------------------------------------------------
var labelCount = 0;
var labelList  = new Object;
var pageDepth  = 0;
var path       = "";
var dbg        = 0;

// Set default values for TOC state
var leftTOCState  = true;

//-------------------------------------------------------------------

function setPath() {
  for (var c = 0; c < pageDepth; c++) {
    path = path + "../";
  }
}

//-------------------------------------------------------------------

function saveLabels() {
  var serialised = "";
  for (var labelID in labelList) {
    if (serialised != "") serialised += '&';
    serialised += labelList[labelID].text + "," + labelList[labelID].link;
  }
  var nextYear = new Date;
  nextYear.setFullYear(nextYear.getFullYear() + 1);
  serialised = escape(serialised);
  document.cookie = "labels="+serialised+"; path=/ ; expires="+nextYear.toGMTString();
}

//-------------------------------------------------------------------

function loadLabels() {
  var cookie = document.cookie;
  if(dbg) {
	  alert("loadLabels: extracted document.cookie = [" + cookie + "]");
  }
  var pos = cookie.indexOf("labels=");
  if (pos != -1) {
    var start = pos + 7;
    var end   = cookie.indexOf(";",start);
    if (end == -1) end = cookie.length;
    var value = cookie.substring(start,end);
    value = unescape(value);
    
    var labels = new Array;
    labels = value.split('&');
    for (var id = 0; id < labels.length; id++) {
      var data = new Array;
      data = labels[id].split(',');
      if (data[0] && data[1]) {
        addLabel(data[0],data[1]);
      }
    }
  }
}

//-------------------------------------------------------------------

function removeLabel(labelID) {
  var label = document.getElementById(labelID);
  label.parentNode.removeChild(label);
  delete labelList[labelID];
  saveLabels();
}

//-------------------------------------------------------------------

function addLabel(text,link) {
  labelCount++;
  var labelID = "label" + labelCount;
  
  var labelDetails     = new Object;
  labelDetails["text"] = text;
  labelDetails["link"] = link;
  labelList[labelID]   = labelDetails;
  
  if(dbg) {
	  alert("addLabel: given text=" + text + " link=" + link + " using p+l=[" + path + link + "]");
  }

  var labelDIV = document.createElement("DIV");
  labelDIV.className = "label";
  labelDIV.setAttribute("id",labelID);

  var labelLink = document.createElement("A");
  labelLink.setAttribute("href",path+link);
  var labelLinkText = document.createTextNode(text);
  labelLink.appendChild(labelLinkText);

  var removeDIV  = document.createElement("DIV");
  removeDIV.className = "labelactions";

  if (navigator.userAgent.indexOf("MSIE") >= 0) {
    var clickHandler = "removeLabel('"+labelID+"')";
    var removeLink = document.createElement('<a onClick="'+clickHandler+'">');
    removeLink.setAttribute("href","#");
    var removeLinkText = document.createTextNode("Remove");
    removeLink.appendChild(removeLinkText);    
    removeDIV.appendChild(removeLink);
  } else {
    var removeLink = document.createElement("A");
    removeLink.setAttribute("onClick","removeLabel('"+labelID+"')");
    removeLink.setAttribute("href","#");
    var removeLinkText = document.createTextNode("Remove");
    removeLink.appendChild(removeLinkText);    
    removeDIV.appendChild(removeLink);
  }
  
  labelDIV.appendChild(labelLink);
  labelDIV.appendChild(removeDIV);

  document.getElementById("labels").appendChild(labelDIV);
  saveLabels();
}

//-------------------------------------------------------------------

function closeTOC() {
  leftTOCState = false;
  document.getElementById("left").style.display = "none";
  document.getElementById("contentHeaderLeft").style.display = "block";
  document.getElementById("centerContent").style.marginLeft  = "0px";
  document.getElementById("centerContent").style.paddingLeft = "5px";
  saveTOCState();
}

function showTOC() {
  leftTOCState = true;
  document.getElementById("leftCloseIcon").src=path+'closeXb.jpg';
  document.getElementById("left").style.display = "block";
  document.getElementById("contentHeaderLeft").style.display = "none";
  document.getElementById("centerContent").style.marginLeft  = "140px";
  document.getElementById("centerContent").style.paddingLeft = "10px";
  saveTOCState();
}


function showToolbars() {
  preloadImg1     = new Image();
  preloadImg1.src = "closeXp.jpg";
  loadTOCState();
  (leftTOCState == true)  ? showTOC()  : closeTOC();
}

function saveTOCState() {
  // Serialise state variables
  var serialised = "left:"   + ((leftTOCState  == true) ? "true" : "false") 
  serialised = escape(serialised);  
  if(dbg) {
	  alert("saveTOCState: escaped serialised = [" + serialised + "]");
  }

  // Set cookie expiration date of 1 year
  var nextYear = new Date;
  nextYear.setFullYear(nextYear.getFullYear() + 1);

  // Store cookie in browser
  document.cookie = "toolbars="+serialised+"; path=/ ; expires="+nextYear.toGMTString();
}

function loadTOCState() {
  var cookie = document.cookie;
  var pos = cookie.indexOf("toolbars=");
  if (pos != -1) {
	  if(dbg) {
		  alert("loadTOCState: Found toolbar cookie [" + cookie + "]");
	  }
    var start = pos + 9;
    var end   = cookie.indexOf(";",start);
    if (end == -1) end = cookie.length;
    var value = cookie.substring(start,end);
    value = unescape(value);
	if(dbg) {
		alert("loadTOCState: unescaped toolbar cookie [" + value + "]");
	}
    var labels = new Array;
    labels = value.split(',');
    for (var id = 0; id < labels.length; id++) {
      var data = new Array;
      data = labels[id].split(':');
      if (data[0] == "left")  leftTOCState  = (data[1] == "true") ? true : false;
    }
  } 
}

//-------------------------------------------------------------------

function setFlag(param,value) {
  var flags = loadFlags();
  flags[param] = value;
  saveFlags(flags);
}

function getFlag(param) {
  var flags = loadFlags();
  return flags[param];
}

function clearFlag(param) {
  var flags = loadFlags();
  delete flags[param];
  saveFlags(flags);
}

function clearAllFlags() {
  var flags = new Object;
  saveFlags(flags);
}

function loadFlags() {
  var flags  = new Object;
  var cookie = document.cookie;
  var pos    = cookie.indexOf("flags=");
  if (pos != -1) {
    var start = pos + 6;
    var end   = cookie.indexOf(";",start);
    if (end == -1) end = cookie.length;
    var value = cookie.substring(start,end);
    
    var flagEntries = value.split(',');
    for (var id = 0; id < flagEntries.length; id++) {
      var data = new Array;
      flagData = flagEntries[id].split(':');
      if (flagData[0] && flagData[1]) {
        flags[unescape(flagData[0])] = unescape(flagData[1]);
      }
    }
  }
  return flags; 
}

function saveFlags(flags) {
  var serialised = "";
  for (param in flags) {
    if(serialised) serialised = serialised + ",";
    serialised = serialised + escape(param) + ":" + escape(flags[param]);
  }
  // Set cookie expiration date of 1 year
  var nextYear = new Date;
  nextYear.setFullYear(nextYear.getFullYear() + 1);

  // Store cookie in browser
  document.cookie = "flags="+serialised+"; path=/ ; expires="+nextYear.toGMTString();
}

// eof - fgtoc.js

