<!-- //

// define the hide style
if (document.getElementById)
{
  document.write("<style type=\"text/css\"> .posthidden { display:none; } </style>");
}

// add an indexOf function to the Array class (inefficient linear search)
if (!Array.prototype.indexOf)
{
  function Array_indexOf(x)
  {
    for (var i = 0; i < this.length; i++)
    {
      if (this[i] == x)
      {
        return i;
      }
    }
    return -1;
  }
  Array.prototype.indexOf = Array_indexOf;
}

// generate the html code that enables user to switch show / hide mode
function writeToggleStr(postid, bExpand)
{
  var postURL = "#" + postid.substr(4);
  var prefStr = "<a href=\"" + postURL + "\" onclick=javascript:toggleVisible('" + postid + "',";
  var sufStr = " Post</a>";
  var expandStr = prefStr + "true);>[+] Expand" + sufStr;
  var collapseStr = prefStr + "false);>[-] Collapse" + sufStr;

  whichpost = document.getElementById(postid); 
  children = whichpost.childNodes;
  for (var i = 0; i < children.length; i++)
  {
    if (children[i].tagName == "DIV" && children[i].className == "expand")
    {
      children[i].innerHTML = bExpand ? collapseStr : expandStr;
      break;
    }
  }
}

// generate the div containing the post text
function getPostBody(postid)
{
  var postBody = null;
  whichpost = document.getElementById(postid);
  children = whichpost.childNodes;
  for (var i = 0; i < children.length; i++)
  {
    if (children[i].tagName == "DIV" && children[i].className == "post-text")
    {
      postBody = children[i];
      break;
    }
  }
  return postBody;
}

// concat a string several times
function addStrRepeat(str, count)
{
  var src = "";
  for (var i = 0; i < count; i++)
  {
    src += str;
  }
  return src;
}

// useful data
var minLen = 2000;
var minHide = 800;

// display the code to enable toggling show/hide in a post
function displayToggle(postid)
{
  if (document.getElementById)
  {
    if (limitDisplay(postid))
    {
      writeToggleStr(postid, false);
    }
  }
}

// add the ellipsis and if specified, the hide tag
function addHideStr(postBody, breakPos)
{
  //alert("breakPos[0] " + breakPos[0]);
  if (breakPos[0] != -1)
  {
    var postStr = postBody.innerHTML;

    var dispStr = postStr.substr(0, breakPos[0]);
    //alert("dispStr: '" + dispStr + "'");
    var hideStr = postStr.substr(breakPos[0]);
    //alert("hideStr: '" + hideStr + "'");

    var newStr = dispStr;
    newStr += "<div class=\"postshown\">...</div>";

    //newStr += addStrRepeat("</br>", breakPos[2]);
    //newStr += addStrRepeat("</p>", breakPos[1]);

    if (breakPos[3])
    {
      newStr += "<div class=\"posthidden\">";
      //newStr += addStrRepeat("<p>", breakPos[1]);
      //newStr += addStrRepeat("<br>", breakPos[2]);
      newStr += hideStr + "</div>";
    }
    else
    {
      newStr += hideStr;
    }

    postBody.innerHTML = newStr;
    return true;
  }
  return false;
}

function findBreakPos(postBody)
{
  var breakPos = new Array(-1, 0, 0, false); // break, #p, #br, bAddHideStr

  var postStr = postBody.innerHTML;
  var lowPostStr = postStr.toLowerCase();
  var posHidden = lowPostStr.indexOf("posthidden");
  if (posHidden != -1)
  {
    posHidden = lowPostStr.substr(0, posHidden).lastIndexOf("<div");
  }
  //alert("posHidden " + posHidden);
  if (posHidden != -1)
  {
    breakPos[0] = posHidden;
    return breakPos;
  }

  var totLen = lowPostStr.length;
  //alert("totLen " + totLen);
  if (totLen < minLen + minHide)
  {
    return breakPos;
  }

  breakPos[3] = true; // add the hide tag
  breakPos[0] = 0;

  var tagsList = new Array();
  while (breakPos[0] < minLen || tagsList.length != 0)
  {
    var curStr = lowPostStr.substr(breakPos[0]);
    //alert("breakPos[0] " + breakPos[0] + " curStr " + curStr);
    var tagPos = curStr.indexOf("<");
    if (tagPos == -1)
    {
      break;
    }

    var remStr = curStr.substr(tagPos + 1);
    var endTagPos = remStr.indexOf(">");
    var closeTagPos = remStr.indexOf("/>");
    var spacePos = remStr.indexOf(" ");
    //alert("tagPos " + tagPos + " endTagPos " + endTagPos + " closeTagPos " + closeTagPos)
    //alert("remStr " + remStr);

    var namePos = spacePos != -1 && spacePos < endTagPos ? spacePos : endTagPos;
    if (closeTagPos == endTagPos - 1 && namePos == endTagPos)
    {
      namePos--;
    }
    var tagName = remStr.substr(0, namePos);
    var bTagEnd = tagName.indexOf("/") == 0;
    if (bTagEnd)
    {
      tagName = tagName.substr(1);
    }
    //alert("tagName " + tagName + " bTagEnd " + bTagEnd);

    if (breakPos[0] + tagPos > minLen && tagsList.length == 0 && 
        (tagName == "p" || tagName == "br"))
    {
      breakPos[0] += tagPos;
      break;
    }

    breakPos[0] += tagPos + endTagPos + 2;

    if (closeTagPos == endTagPos - 1)
    {
      continue;
    }

    if (tagName == "p")
    {
      breakPos[1] += bTagEnd ? -1 : 1;
    }
    else if (tagName == "br")
    {
      breakPos[2] += bTagEnd ? -1 : 1;
    }
    else if (bTagEnd)
    {
      ind = tagsList.indexOf(tagName);
      if (ind != -1)
      {
        tagsList.splice(ind, 1);
      }
    }
    else
    {
      tagsList.push(tagName);
    }
    //alert("tagsList " + tagsList);
  }

  if (breakPos[0] < minLen || totLen - breakPos[0] < minHide)
  {
    breakPos[0] = -1;
  }
  //alert("breakPos " + breakPos + " tagsList " + tagsList);

  return breakPos;
}

// hide text starting at the appropriate place
function limitDisplay(postid)
{
  var postBody = getPostBody(postid);
  if (postBody)
  {
    return addHideStr(postBody, findBreakPos(postBody));
  }
  return false;
}

// switch between show and hide mode
function swapStyles(divBody)
{  
  var children = divBody.childNodes;
  for (var i = 0; i < children.length; i++)
  {
    if (children[i].tagName == "DIV")
    {
      if (children[i].className == "posthidden")
      {
        children[i].className = "postshown";
      }
      else if (children[i].className == "postshown")
      {
        children[i].className = "posthidden";
      }
    }
  }
}

// main function to change show/hide mode
function toggleVisible(postid, bExpand)
{
  var postBody = getPostBody(postid);
  if (postBody)
  {
    swapStyles(postBody);
    writeToggleStr(postid, bExpand);
  }
}
// -->