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

DOM_Node createIndentNode(int indentation, DOM_Document doc)
{
  std::ostringstream s;
  s << '\n';

  for (int i = 0; i < indentation; ++i)
  {
    s << '\t';
  }

  DOM_Node node = doc.createTextNode(s.str().c_str());
  return node;
}

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

bool isIndentNode(DOM_Node node)
{
  if (node.getNodeType() != DOM_Node::TEXT_NODE)
  {
    return false;
  }
  // else

  //
  // isIgnorableWhitespace() doesn't work properly yet.
  // Therefore we have to check ourselves if the node is an indentnode.
  // an indentnode is an indentnode iff the first character is a '\n' and
  // all other chracters are 't'.
  //

  DOM_Text textNode = static_cast<const DOM_Text&>(node);
  char *s = textNode.getData().transcode();
  string indentText(s);

  bool result = true;

  if (indentText.length() > 0 && indentText[0] == '\n')
  {
    for (unsigned i=1; i < indentText.length(); ++i)
    {
      if (indentText[i] != '\t')
      {
        result = false;
        break;
      }
    }
  }
  else
  {
    result = false;
  }

  delete[] s;

  return result;
}

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

void indentDOM(DOM_Node node, unsigned depth)
{
  DOM_Document doc = node.getOwnerDocument();
  unsigned count = 0;

  for (DOM_Node child = node.getFirstChild();
       child != 0;
       child = child.getNextSibling())
  {
    if (child.getNodeType() == DOM_Node::ELEMENT_NODE)
    {
      node.insertBefore(createIndentNode(depth, doc), child);
      ++count;
    }

    indentDOM(child, depth + 1);
  }

  if (count > 0)
  {
    node.appendChild(createIndentNode(static_cast<int>(depth)-1, doc) );
  }
}
//---------------------------------------------------------------------------


