function addRowToForm (instance, limit)   {
   var tblBody = document.getElementById(instance).tBodies[0];
   var length = tblBody.rows.length
   if (length > limit)   {
      return;
   }
   var newNode = tblBody.rows[length-1].cloneNode(true);
   // Clear the copied values
   for (var i = 0; i < newNode.childNodes.length; i++)   {
      for (var j = 0; j < newNode.childNodes[i].childNodes.length; j++)   {
          var currentNode = newNode.childNodes[i].childNodes[j];
          // Change the name
          switch (currentNode.nodeName.toLowerCase())  {
          case 'input':
          case 'textarea':
          case 'select':
             var reg_exp = /^(.*)(\d{1,3})$/;
             var matches = currentNode.name.match(reg_exp);
             currentNode.name = matches[1] + (parseInt(matches[2]) + 1);
          }

          // Get any special changes
          switch (currentNode.nodeName.toLowerCase())  {
          case 'input':
             switch (currentNode.type)   {
             case 'text':
                currentNode.value = '';
                break;
             }
             break;
          case 'textarea':
             currentNode.value = '';
             break;
          case 'select':
             currentNode.selectedIndex = 0;
             break;
          }
      }
   }
   tblBody.appendChild(newNode);
}

function removeRowFromForm (instance, minRows)   {
   var tblBody = document.getElementById(instance).tBodies[0];
   var length = tblBody.rows.length
   if (length <= minRows)   {
      return;
   }

   tblBody.deleteRow(length - 1);
}

/* based on http://www.quirksmode.org/js/blockinvi.html
   use permitted http://www.quirksmode.org/about/copyright.html */
function block(nr, current)
{
   if (document.all)    {
      // Hello IE
      if (current == 'table-row-group')   {
         current = 'block';
      }
   }
   document.getElementById(nr).style.display = current;
}
function toggleBlock(nr)
{
   var element = document.getElementById(nr);
   if (element.style.display == 'none')   {
      element.style.display = 'block';
   }   
   else   {
      element.style.display = 'none';
   }
}

function toggleHideBlock(group, target)
{
   var groupElement = document.getElementById(group);
   // Hide them all first
   for (var i = 0; i < groupElement.childNodes.length; i++)   {
      var current = groupElement.childNodes[i];
      if (current.nodeName.toLowerCase() == 'div')   {
         current.style.display = 'none';
      }
   }
   var element = document.getElementById(target);
   element.style.display = 'block';
}

function removeRowFromForm (instance, minRows)   {
   var tblBody = document.getElementById(instance).tBodies[0];
   var length = tblBody.rows.length;
   if (length <= minRows)   {
      return;
   }

   tblBody.deleteRow(length - 1);
}

function removeTargetRowFromForm (row)   {
   var tr = row.parentNode.parentNode;
   var tblBody = tr.parentNode;
   if (tblBody.rows.length <= 1)   {
      return false;
   }

   tblBody.removeChild(tr);

   if (tblBody.rows.length == 1)   {
      toggleDelete(tblBody, true);
   }
}

/**
 * Sorta simulates document.getElementByID, but without having to recurse
 * the entire document tree each time. Uses breadth first traversal
 *
 * Note that nodeType == 1 is Node.ELEMENT_NODE check. Thanks IE. 
 */
function getElementById (target, id)   {
   if (target != null && target.hasChildNodes())   {
      // Check this level
      for (var i = 0; i < target.childNodes.length; i++)   {
         if (target.childNodes[i].nodeType == 1)   {
            if (target.childNodes[i].getAttribute('id') == id)   {
               return target.childNodes[i];
            }
         }
      }

      // Head down into children
      for (var i = 0; i < target.childNodes.length; i++)   {
         if (target.childNodes[i].nodeType == 1)   {
            var result = getElementById(target.childNodes[i], id);
            if (result != null)   {
               return result;
            }
         }
      }
   }

   return null;
}
function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_findObj(n, d) { //v3.0
var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); 
  if (!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_swapImage() { //v3.0

  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function toggleBlock(nr)
{
   var element = document.getElementById(nr);
   if (element.style.display == 'none')   {
      element.style.display = 'block';
   }
   else   {
      element.style.display = 'none';
   }
}

