function netNode(objDiv, parentDoc)
{
  var self = this;
  this.classType = "netNode";
    
  this.parentDoc = parentDoc;

  var connectors = new netCollection;
  var Spouses = new netNodesCollection;
  var sps = null;

  var lId = lIdFromBoxId(tagId(objDiv));

  this.div = new netDivObject(objDiv, parentDoc);

  this.getLId = function()
    {
      return lId;
    };

  this.getDivId = function() 
    {
      return cBox + lId;
    };

  this.caption = function()
    {
      return this.div.getHrefText();
      return this.div.getInnerHTML();
    };
    
  this.addSpouse = function(node, reverse)
    {
      if (reverse == null) reverse = true;
      
      if (Spouses.isMember(node)) return;

      Spouses.add(node);

      if (reverse) {
        node.addSpouse(this, false);
        }
    };

  this.collectSpouses = function(nodes)
    {
      if (nodes == null) {
        nodes = new netNodesCollection();
        }
        
      if (!(nodes.isMember(this))) {
        nodes.add(this);
        
        for (var i=0; i < Spouses.length; i++) {
          Spouses.item(i).collectSpouses(nodes);
          }
        }
        
      return nodes;
    };
  
  this.sortSpouses = function()
    {
      sps = this.collectSpouses();
      sps.sortByLeft();
    } 
     
  this.moveTo = function(newLeft, newTop, prevNodes)
    {
	  var moved = false;
	  
	  if (newLeft != null) {
	    if (newLeft != this.div.getLeft()) {
	      this.div.setLeft(newLeft);
	      moved = true;
	      }
	    }

	  if (newTop != null) {
	    if (newTop != this.div.getTop()) {
	      this.div.setTop(newTop);
	      moved = true;
	      }
	    }
	  
      if (moved) {
	    moved |= fireRelativeMoved(prevNodes);
	    }
	  
	  return moved;
	};

  this.calcMeAsSpouse = function(node, whichCrit)
    {
      switch (whichCrit) {
        case movSpouseX:
          var disp = Math.abs(sps.getSpsNodesDisplacement(this,node));
// not adapted for more spouses yet !!!!!!
          if (this.div.getLeft() < node.div.getLeft()) {
            if ((this.div.getLeft() + disp*(this.div.getWidth() + spouseSpace)) > node.div.getLeft()) {
              return node.div.getLeft() - disp*(this.div.getWidth() + spouseSpace);
              }
            }
          else {
            if ((node.div.getLeft() + disp*(node.div.getWidth() + spouseSpace)) > this.div.getLeft()) {
              return node.div.getLeft() + disp*(node.div.getWidth() + spouseSpace);
              }
            }
          break;
        case movSpouseY: // suggestedVal ist für mich
          return node.div.getTop();
        default:
          break;
        }
      return -1;
    };

  this.onSpouseMoved = function(spouse, prevNodes)
    {
	  var moveHorz, moveVert;
	  var moved = false;
	  
	  moveHorz = this.calcMeAsSpouse(spouse, movSpouseX);
	  moveVert = this.calcMeAsSpouse(spouse, movSpouseY);
	  if (moveHorz != -1) {
	    if (moveVert != -1) {
	      moved |= this.moveTo(moveHorz, moveVert, prevNodes);
	      }
	    else {
	      moved |= this.moveTo(moveHorz, null, prevNodes);
	      }
	    }
	  else {
	    if (moveVert != -1) {
	      moved |= this.moveTo(null, moveVert, prevNodes);
	      }
	    }

      return moved;
	};

  function fireRelativeMoved(prevNodes)
    {
      var moved = false;
	  var i;

      prevNodes.add(self);

      for (i = 0; i < sps.length; i++) {
        if (!prevNodes.isMember(sps.item(i))) {
          moved |= sps.item(i).onSpouseMoved(self, prevNodes);
          }
        }

      for (i = 0; i < connectors.length; i++) {
        connectors.item(i).boxMoved(self);
        }
        
      return moved;  
	};
	
  this.movObj = function(newLeft,newTop)
    {
//newBodyPara("entering movObj for "+this.getLId()+": "+newLeft+"/"+newTop);    
      this.div.setLeft(newLeft);
      this.div.setTop(newTop);
      
      var previousNodes = new netNodesCollection;
      fireRelativeMoved(previousNodes);
      delete previousNodes;
//newBodyPara("exiting movObj for "+this.getLId());    
    };
      
  this.getNumSpouses = function()
    {
      return Spouses.length;
    };

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

  this.getConnectors = function() 
    {
      return connectors;
    };
    
  this.isEqual = function(other)
    {
      return (this.getLId() == other.getLId());
    };  

  this.compare = function(other)
    {
      return (this.getLId() - other.getLId());
    };  

  this.highlight = function(switchOn, processConnectors)
    {
      this.div.highlight(switchOn);
      if (processConnectors) {
        for (i = 0; i < connectors.length; i++) {
          connectors.item(i).highlight(switchOn);
          }
        }
    };
}


