var IE = (document.all) ? true : false;

function addRowToForm (instance, limit, byrow, addRowInBody, increment)   {
   var byrow = defaultSet(byrow, true);
   var addRowInBody = defaultSet(addRowInBody, false);
   var increment = parseInt(defaultSet(increment, 1));
   var tblBody = document.getElementById(instance);
   if (tblBody.nodeName.toLowerCase() == 'table')   {
      tblBody = tblBody.tBodies[0];
   }
   var length = tblBody.rows.length
   if (length > limit)   {
      return;
   }

   var cloneNode = (addRowInBody) ? tblBody.rows[length-2] :
                                    tblBody.rows[length-1];

   var newNode = cloneNode.cloneNode(true);
   cleanCopiedNodes(newNode.childNodes, byrow, increment);
   if (addRowInBody)    {
      tblBody.insertBefore(newNode, tblBody.rows[length-1]);
   }
   else   {
      tblBody.appendChild(newNode);
   }

}

function defaultSet (check, defaultValue)   {
   if (typeof check == "undefined")   {
      check = defaultValue;
   }
   return check;
}

function cleanCopiedNodes (node, byrow, increment)   {
   for (var i = 0; i < node.length; i++)   {
      var currentNode = node[i];
      // Change the name
      var nodeName = currentNode.nodeName.toLowerCase();

      if (nodeName == 'input' &&
          currentNode.getAttribute('type') == 'radio')    {
         nodeName = 'radio';
      }

      switch (nodeName)   {
      case 'input':
      case 'textarea':
      case 'select':
         var reg_exp =
            /^((?:[a-z1-9]+_?)+__)(\d{1,3})(?:__(\d{1,3}))?(?:__(\d{1,3}))?$/;
         var matches = currentNode.name.match(reg_exp);
         if (typeof matches[3] != 'undefined' &&
             matches[3].length > 0)   {
            if (typeof matches[4] != 'undefined' &&
                matches[4].length > 0)   {
               if (byrow)   {
                  var name = matches[1] + matches[2] + '__' + matches[3] +
                            '__' + (parseInt(matches[4]) + increment);
               }
               else   {
                  var name = matches[1] + (parseInt(matches[2]) + increment) + 
                             '__' + matches[3] + '__' + matches[4];
               }
            }
            else   {
               if (byrow)   {
                  var name = matches[1] + matches[2] + '__' +
                             (parseInt(matches[3]) + increment);
               }
               else   {
                  var name = matches[1] + (parseInt(matches[2]) + increment) + 
                             '__' + matches[3];
               }
            }
         }
         else   {
            var name = matches[1] + (parseInt(matches[2]) + increment);
         }
         currentNode.name = name;
         break;
      case 'radio':
         currentNode.setAttribute('value',
                     parseInt(currentNode.getAttribute('value')) + increment);
         break;
      case 'img':
         var reg_exp = /^([a-z1-9_]+_)(\d{1,3})$/;
         var id = currentNode.getAttribute('id');
         if (id != null)   {
            var matches = id.match(reg_exp);
            if (matches != null && matches.length > 1)   {
               var new_id = matches[1] + (parseInt(matches[2]) +increment);
               currentNode.setAttribute('id', new_id);
            }
         }

         break;
      }

      // Get any special changes
      switch (nodeName)  {
      case 'input':
         switch (currentNode.type)   {
         case 'text':
            currentNode.value = '';
            break;
         }
         case 'checkbox':
            currentNode.checked = false;
         break;
      case 'textarea':
         currentNode.value = '';
         break;
      case 'select':
         currentNode.selectedIndex = 0;
         break;
      case 'radio':
         if (currentNode.checked == true)   {
            currentNode.checked = false;
         }
         break;
      }

      cleanCopiedNodes(currentNode.childNodes, byrow, increment);
   }

}

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, offset)   {
   var offset = defaultSet(offset, 0);
   var tr = row.parentNode.parentNode;
   var tblBody = tr.parentNode;
   if (tblBody.rows.length - offset <= 1)   {
      return false;
   }

   tblBody.removeChild(tr);

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

function incrementImageID (imageNode, increment)   {
   var reg_exp = /^([a-z1-9_]+_)(\d{1,3})$/;
   var id = imageNode.getAttribute('id');
   if (id != null)   {
      var matches = id.match(reg_exp);
      if (matches != null && matches.length > 1)   {
         var new_id = matches[1] + (parseInt(matches[2]) +increment);
         imageNode.setAttribute('id', new_id);
      }
   }
}

/* based on http://www.quirksmode.org/js/blockinvi.html
   use permitted http://www.quirksmode.org/about/copyright.html */
function block(nr, current)
{
   if (IE)    {
      // 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, offset)   {
   var offset = defaultSet(offset, 0);
   var tr = row.parentNode.parentNode;
   var tblBody = tr.parentNode;
   if (tblBody.rows.length - offset <= 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';
   }
}

/* based on http://www.quirksmode.org/js/blockinvi.html
   use permitted http://www.quirksmode.org/about/copyright.html */
function block(nr, current)
{
   if (IE)    {
      // 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 swapImgDetectID (target, image)   {
   var imgNodes = target.getElementsByTagName("img");
   if (imgNodes.length > 0)   {
      // Only use the first one
      var imgNode = imgNodes.item(0);
      MM_swapImage (imgNode.id,'',image,1);
   }
}


