<!--

var dynamicTableFreshId = new Array();
var dynamicTableFreshStatusId = new Array();
var dynamicTableInsertPositionRowId = new Array();
var dynamicTableNextFreshIndex = new Array();
var dynamicTableFirstRowOfItems = new Array();

function dynamicTable_register(
    tableElemId,
    freshContainerId, freshStatusHiddenId, insertPositionRowId, itemNumber)
  {
  dynamicTableFreshId[tableElemId] = freshContainerId;
  dynamicTableFreshStatusId[tableElemId] = freshStatusHiddenId;
  dynamicTableInsertPositionRowId[tableElemId] = insertPositionRowId;
  dynamicTableNextFreshIndex[tableElemId] = 0;
  
  var firstRowOfItems = new Array(itemNumber);
  var tableElem = dynamicTable_getParentWithTag(
      document.getElementById(insertPositionRowId), "table");
  var itemRowNumber = document.getElementById(freshContainerId).rows.length;
  var firstRowIndex = document.getElementById(insertPositionRowId).rowIndex - itemRowNumber * itemNumber;
  for(var i = 0; i < itemNumber; ++i)
    firstRowOfItems[i] = tableElem.rows[firstRowIndex + itemRowNumber * i];
  dynamicTableFirstRowOfItems[tableElemId] = firstRowOfItems;
  }

function dynamicTable_deepChange(elem, srcElem, changeFn)
  {
  for(
      var elemChild = elem.firstChild, srcElemChild = srcElem.firstChild
      ; null != elemChild
      ; elemChild = elemChild.nextSibling,
        srcElemChild = (null != srcElemChild ? srcElemChild.nextSibling : null)
      )
    {
    dynamicTable_deepChange(elemChild, srcElemChild, changeFn);
    }
  
  changeFn(elem, srcElem);
  }

function dynamicTable_deepCopyWithChanges(src, dst, changeFn)
	{
	var srcAttributes = src.attributes;
	for(var i=0; i<srcAttributes.length; ++i)
		{
		var attrName = srcAttributes[i].name;
		var attrValue = src.getAttribute(attrName);
		if((null != attrValue) && (false != attrValue))
			{
			dst.setAttribute(attrName,attrValue);
			}
		}
		
	for(
			var srcChild=src.firstChild
			; null != srcChild
			; srcChild=srcChild.nextSibling)
		{
		dst.appendChild(srcChild.cloneNode(true));
		}
		
	dynamicTable_deepChange(dst, src, changeFn);
	}
	
function dynamicTable_getParentWithTag(elem, tag)
  {
  if(null == elem)
    return null;
  
  if(tag.toLowerCase() == elem.nodeName.toLowerCase())
    return elem;
  else
    return dynamicTable_getParentWithTag(elem.parentNode, tag);
  }

function dynamicTable_getItemNumber(id)
  {
  return dynamicTableFirstRowOfItems[id].length;
  }

function dynamicTable_getItemFirstRow(id, itemIndex)
  {
  return dynamicTableFirstRowOfItems[id][itemIndex];
  }

function dynamicTable_addItem(id)
	{
	var insertPositionRow = document.getElementById(
	    dynamicTableInsertPositionRowId[id]);
	var freshItemTable = document.getElementById(
	    dynamicTableFreshId[id]);
	var freshStatusHidden = document.getElementById(
	    dynamicTableFreshStatusId[id]);
	var freshIndex = dynamicTableNextFreshIndex[id];
	var firstRowOfItems = dynamicTableFirstRowOfItems[id];
	
	if((null == insertPositionRow) || (null == freshItemTable) 
	    || (null == freshStatusHidden) || (null == freshIndex))
	  {
	  error("Couldn't find a Dynamic Table");
	  return null;
	  }
	
	dynamicTableNextFreshIndex[id] = 1+freshIndex;
	
  var tableElem = dynamicTable_getParentWithTag(
      insertPositionRow, "table");

  var freshRows = freshItemTable.rows;
  
  function substituteFreshNumberInAttribute(elem, attrName)
    {
    if (null == elem.attributes)
      return;
    
    var attrValue = elem.getAttribute(attrName);
    if((null == attrValue) || (false == attrValue))
      return;
    
    if(-1 != attrValue.indexOf("fresh###"))
      {
      elem.setAttribute(
          attrName, 
          attrValue.replace("fresh###", "fresh"+freshIndex));
      }
    }
  
  function substituteFreshNumberInElement(elem, srcElem)
    {
    substituteFreshNumberInAttribute(elem, "name");
    substituteFreshNumberInAttribute(elem, "id");
    
    if(/^script$/i.test(elem.tagName) 
        && /jscript|javascript/i.test(elem.getAttribute("type")))
      {
      var newScript = 
          srcElem.text.replace(/fresh###/g, "fresh"+freshIndex);
      // For some reason, IE's 'cloneNode()' doesn't copy <script> contents,
      // so we can't just use 'elem.innerHTML'.
      
      elem.text = newScript;
      
      eval(newScript);
          // IE and Opera seem to execute the new (assigned) contents of 
          // <script>, whereas Firefox doesn't. So we do it explicitly.
      }
    }
  
  var isFirstRow = true;
	for(var i = 0; i < freshRows.length; ++i)
		{
		var newRow = tableElem.insertRow(insertPositionRow.rowIndex);
		dynamicTable_deepCopyWithChanges(
				freshRows[i],
				newRow,
				substituteFreshNumberInElement);
	  if (isFirstRow)
	    {
	    firstRowOfItems[firstRowOfItems.length] = newRow;
	    isFirstRow = false;
	    }
		}
  
  var newStatusHidden = freshStatusHidden.cloneNode(true);
  substituteFreshNumberInElement(newStatusHidden);
  freshStatusHidden.parentNode.insertBefore(
      newStatusHidden, freshStatusHidden);
	
	return "fresh"+freshIndex;
	}

//-->

