//////////////////////////////////////////////////////////////////////////////
// Handle different input types. /////////////////////////////////////////////

function setElementValue(element, value)
{
   if(element == null)
      return;
	if(typeof value == "undefined")
		return;
   if(element.type == "hidden")
      return;
      
	if(element.type == "checkbox" || element.type == "radio")
	{
      for(var i = 0; i < document.forms.length; i++)
      {
         var elements = document.forms[i].getElementsByTagName("input");
         for(var j = 0; j < elements.length; j++)
         {
            if(elements[j].name == element.name)
            {
               if(elements[j].value == value)
         	    	elements[j].checked = true;
               else 
         	    	elements[j].checked = false;
            }
         }
	   }
	} 
	else if(element.type == "select" || element.type == "select-one")
	{
		for(var i = 0; i < element.length; ++i)
		    if(element[i].text == value || element[i].value == value)
            element.selectedIndex = i;
	}
   else if(element.type == "textarea")
	{
      element.innerHTML = value;
	}
   else 
	{
	    element.value = value;
	}
}

//////////////////////////////////////////////////////////////////////////////
// Make sure all of our form elements contain an 'id'. ///////////////////////

// TODO: Broken.
var contributeURL = '/vital/access/manager/ContributeElements/FormName/PageName';

function populateForms()
{
   for(var i = 0; i < document.forms.length; i++)
   {
      populateId(document.forms[i].getElementsByTagName("input"));
      populateId(document.forms[i].getElementsByTagName("select"));
      populateId(document.forms[i].getElementsByTagName("textarea"));
   }
   
   populateFormData();
}

function populateId(_elements)
{
   for(var i = 0; i < _elements.length; i++)
   {
      if(_elements[i].id == '')
         _elements[i].id = _elements[i].name;
      }
}

function populateFormData()
{
   var ajax = new Ajax.Request(contributeURL, {method: 'get', onSuccess: handleFormResponse});
}

function handleFormResponse(response)
{
	handleReplicatedElements(response.responseXML);
	handleFormXML(response.responseXML);
}

function handleReplicatedElements(_xml)
{
   if(_xml.childNodes.length == 1)
   {
      if(_xml.nodeName.substr(0,2) == "A_")
      {
         var node_name = _xml.nodeName.replace(/A_/, "cloneElement('");
         node_name = node_name.replace(/_B_/, "', '");
         node_name = node_name.replace(/_C_/, "');");
         for(var j=0; j < _xml.firstChild.nodeValue; j++)
            eval(node_name);
      }
   }

   for(var i=0; i < _xml.childNodes.length; i++)
   {
      if(_xml.childNodes[i].nodeType != 1)
        continue;
      handleReplicatedElements(_xml.childNodes[i]);
   }
}

function handleFormXML(_xml)
{
   if(_xml.childNodes.length == 1)
   {
      setElementValue($(_xml.id), _xml.firstChild.nodeValue);
   }

   for(var i=0; i < _xml.childNodes.length; i++)
   {
      if(_xml.childNodes[i].nodeType != 1)
        continue;
      handleFormXML(_xml.childNodes[i]);
   }
}

function cloneElement(source_elem_id, target_div_id)
{
	// Get source element by id
	var source_node = document.getElementById(source_elem_id);

	// Clone the source element
	var cloned_node = source_node.cloneNode(true);

	// Remove the source element's id (that's our "multiple" key)
	cloned_node.setAttribute('id','');

	// Get the target div node for the cloned source node
	var target_node = document.getElementById(target_div_id);

   var clone_count = 1;
   // We can get away with this in a world with lowercase ids.
   var replication_id = '_A_' + source_elem_id + "_B_" + target_div_id + '_C_';
   if($(replication_id))
   {
      $(replication_id).value++;
      clone_count = $(replication_id).value;
   }
   else
   {
   	var hidden_input = document.createElement('input');
   	hidden_input.setAttribute('type', 'hidden');
   	hidden_input.setAttribute('id', replication_id);
   	hidden_input.setAttribute('name', replication_id);
   	hidden_input.setAttribute('value', '1');
   	var parent_form = findParentForm(source_node);
   	parent_form.appendChild(hidden_input);
   }

	// Create a new target div inside the target div "wrapper" node
	// This is really just a precaution in case we need to manipulate it
	// at a later time.
	var new_target_div = document.createElement('div');
	var new_target_div_id = source_elem_id + '_' + clone_count;
	new_target_div.setAttribute('id', new_target_div_id);
	target_node.appendChild(new_target_div);

	// Update the 'name' attributes in the cloned node to reflect count
	updateAttributes(cloned_node, clone_count);
	
	// DEBUG
	// alert(cloned_node.innerHTML);

	// Add cloned node to the target div node
	target_node.appendChild(cloned_node);
}

function updateAttributes(node, count)
{
	// Hide all actionable elements.
	if(node.onclick)
		Element.hide(node);

   // Create a unique form entry.
	if(node.name)
	{
		node.name += '_' + count;
		node.id += '_' + count;
	}

	// Clear all values from input nodes.
	if(node.type == 'text' && node.nodeName == 'INPUT')
		node.value = '';

	var children = node.childNodes;
	for(var i=0; i < children.length; i++)
		updateAttributes(children[i],count);
}

function findParentForm(_node)
{
    while(_node.parentNode && _node.tagName.toUpperCase() != "FORM")
      _node = _node.parentNode;
   return _node;
}