function netDocument()
{
  var self = this;
  this.classType = "netDocument";
  
  var nodes = new netNodesCollection();
  var lines = new Array();
  var vertLines = new Array();
  var horzLines = new Array();
  var vertLinesC = new Array();
  var horzLinesC = new Array();
    
  var htmlDoc = document;
  var treeRoot = htmlDoc.getElementById("treeroot");

  this.create = function()
    {
      var i;
      var divs = htmlDoc.getElementsByTagName("div");

      for (i = 0; i < divs.length; i++) {
	    if (divs[i].className.substr(0,cBox.length) == cBox) {
          nodes.add(new netNode(divs[i],this));
	      }
        }
      nodes.sortByLId(); 

      for (i = 0; i < divs.length; i++) {
	    if (divs[i].className == "linecontainer") {
          var connector = new netConnector(divs[i],this,lines,horzLines,vertLines);
	      }
        }
      
      for (i=0; i < nodes.length; i++) {
        nodes.item(i).sortSpouses();
        }
    };

  this.item = function(i)
    {
      return nodes.item(i);
    };

  this.length = function()
    {
      return nodes.length;
    };

  this.getNodeByLId = function(lId)
    {
      var i = nodes.findIdxByLId(lId);
      if (i != -1) return nodes.item(i);

      return null;
    };

  this.lineObjFromId = function(id)
    {
      for (var i=0; i < nodes.length; i++) {
        var lineObj = nodes.item(i).lineObjFromId(id);
        if (lineObj != null) return lineObj;
        }
        
      return null;  
	};

  this.crossingIdHasLineId = function(objCrossing,objLine)
    {
      var cId = tagId(objCrossing);
      var cIds = cId.split("_");
      var lineId = objLine.fullSubId();
      var lineIds = lineId.split("_");
      
      if ((cIds[1] == lineIds[0]) && 
          (cIds[2] == lineIds[1]) && 
          (cIds[3] == lineIds[2]) && 
          (cIds[4] == lineIds[3])) {
        return this.lineObjFromId(cConn + "_"+cIds[5]+"_"+cIds[6]+"_"+cIds[7]+"_"+cIds[8]);
        }
      
      if ((cIds[5] == lineIds[0]) && 
          (cIds[6] == lineIds[1]) && 
          (cIds[7] == lineIds[2]) && 
          (cIds[8] == lineIds[3])) {
        return this.lineObjFromId(cConn + "_"+cIds[1]+"_"+cIds[2]+"_"+cIds[3]+"_"+cIds[4]);
        }
        
      return null;
    }
    
  this.clearLinesC = function()
    {
      vertLinesC.splice(0,vertLinesC.length);
      horzLinesC.splice(0,vertLinesC.length);
    }

  this.registerLineCExec = function(ls,l)
    {
      for (var i=0; i < ls.length; i++) {
        if (ls[i] == l) return;
        }
      ls.push(l);
    }

  this.registerLineC = function(horz,vert)
    {
      if (vert != null) this.registerLineCExec(vertLinesC,vert);
      if (horz != null) this.registerLineCExec(horzLinesC,horz);
    }

  this.registerConnectorC = function(connector)
    {
      connector.registerLines();
    }

  this.addCrossingsC = function()
    {
      this.addCrossings(horzLinesC,null);
      this.addCrossings(null,vertLinesC);
      
// test for crossing not longer valid !!      
      var divs = htmlDoc.getElementsByTagName("div");

      for (k = divs.length-1; k >= 0; k--) {
	    if (divs[k].className == "crossing") {
          for (var i=0; i < horzLinesC.length; i++) {
            var vLine = this.crossingIdHasLineId(divs[k],horzLinesC[i]);
            if (vLine != null) {
              var vRect = new netRect();
              var hRect = new netRect();
              vRect.copyC(vLine);
              hRect.copyC(horzLinesC[i]);
              if (!vRect.doCross(hRect)) {
                divs[k].parentNode.removeChild(divs[k]);
                }
              }
            }
          for (var i=0; i < vertLinesC.length; i++) {
            var hLine = this.crossingIdHasLineId(divs[k],vertLinesC[i]);
            if (hLine != null) {
              var hRect = new netRect();
              var vRect = new netRect();
              hRect.copyC(hLine);
              vRect.copyC(vertLinesC[i]);
              if (!hRect.doCross(vRect)) {
                divs[k].parentNode.removeChild(divs[k]);
                }
              }
            }
	      }
        }
      
    }
    
  this.addCrossings = function(horz,vert)
    {
      if (horz == null) horz = horzLines;
      if (vert == null) vert = vertLines;
      
      for (var i=0; i < horz.length; i++) {
        for (var j=0; j < vert.length; j++) {
          if ((horz[i].div.getLeftC() <= vert[j].div.getLeftC()) && (horz[i].div.getRightC() >= vert[j].div.getLeftC())) {
            if ((vert[j].div.getTopC() <= horz[i].div.getTopC()) && (vert[j].div.getBottomC() >= horz[i].div.getTopC())) {
              if (!vert[j].getConnector().isSameParentPair(horz[i].getConnector())) {
                vert[j].getConnector().processCrossingInternal (horz[i], vert[j], true);
                }
              }
            }
          }
        }
    };

  this.createHtmlElement = function(tagName) 
    {
      return htmlDoc.createElement(tagName);
    };
    
  this.appendHtmlChild = function(child) 
    {
      treeRoot.appendChild(child);
    };

}
  

