/*
 * ideals-utils.js
 *
 */

/*
 * Utility Javascript methods for IDEALS
 */



/***************
 * Disable/enable of fields in Submission Access Restriction page
 ***************/
//Enables all form fields of a given name
function enableFields(name)
{
  var fields=document.getElementsByName(name);
  for(var i=0; i<fields.length; i++)
  {
  	fields[i].disabled=false;
  }
  return true;
}

//Disables all form fields of a given name
function disableFields(name)
{
  var fields=document.getElementsByName(name);
  for(var i=0; i<fields.length; i++)
  {
  	fields[i].disabled=true;
  }
  return true;
}

// Adds the 'disabled' class to elements with the given IDs
function disableIDs()
{
  for (var i = 0 ; i < arguments.length ; i++) {
    var element = document.getElementById(arguments[i]);
    if (!element)
      continue;
    element.className += ' disabled';
  }
}

// Removes the 'disabled' class from elements with the given IDs
function enableIDs()
{
  for (var i = 0 ; i < arguments.length ; i++) {
    var element = document.getElementById(arguments[i]);
    if (!element)
      continue;
    element.className = element.className.replace(' disabled', '', 'g');
  }
}

//Checks the value of a given field.  Returns
// true if the value passed in matches
function isSelectedValue(fieldName, fieldValue)
{
  var fields=document.getElementsByName(fieldName);
  for(var i=0; i<fields.length; i++)
  { 
    if(fields[i].value==fieldValue && fields[i].checked==true)
    {
    	return true;
    }
  }
 
  return false; 
}

//Selects (i.e. checks) the field of a given ID
function selectField(id)
{
  var element=document.getElementById(id);
  element.checked=true;
  return true;
}

//Hides the field of a given ID 
function hideField(id)
{
  var field=document.getElementById(id);
  field.style.display="none";
  return true;
}

//Displays (i.e. un-hide) the field of a given ID 
function displayField(id)
{
  var field=document.getElementById(id);
  field.style.display="block";
  return true;
}

//Data entry helper for admin/ip-ignore
function mirrorIpRange()
{
  var end = document.getElementsByName('range_start')[0].value.replace(
      /^((?:\d{1,3}\.?){1,3}).*$/, '$1');
  var start = '\u2013 ';
  while (start.length + end.length < 14)
    start = start + ' ';
  document.getElementsByName('range_mask')[0].value = start + end;
}

//Implementation of getElementsByClassName for some browsers (e.g. IE) -
//based upon <http://www.dustindiaz.com/getelementsbyclass/>
function getElementsByClass(node,searchClass)
{
  if (node.getElementsByClassName)
    return node.getElementsByClassName(searchClass);
  var classElements = new Array();
  var els = node.getElementsByTagName('*');
  var elsLen = els.length;
  var pattern = new RegExp('(^|\\s)' + searchClass + '(\\s|$)');
  for (i = 0, j = 0 ; i < elsLen ; i++)
    if (pattern.test(els[i].className))
    {
      classElements[j] = els[i];
      j++;
    }
  return classElements;
}

//Replace a HTML input element with one of a different type. 
//(You can only set an input's type once in IE.)
function replaceInputWithType(input, type)
{
  var newInput = document.createElement('input');
  newInput.type = type;
  newInput.name = input.name;
  newInput.className = input.className;
  newInput.value = input.value;
  input.parentNode.replaceChild(newInput, input);
  return newInput;
}

//Makes a previous value in submission describe step available for editing
function editPreviousValue(editButton)
{
  var parentNode = editButton.parentNode;
  var previousValue = getElementsByClass(parentNode, 'ds-interpreted-field')[0];
  var editField = getElementsByClass(parentNode, 'ds-text-field')[0];
  var deleteButton = getElementsByClass(parentNode, 'ds-delete-button')[0];

  // .hide() doesn't work in IE
  editButton.style.display = 'none';
  deleteButton.style.display = 'none';
  previousValue.style.display = 'none';

  editField = replaceInputWithType(editField, 'text');

  //Create a Save button
  var saveButton = document.createElement('input');
  saveButton.type = 'submit';
  saveButton.value = '';
  saveButton.title = 'Save Changes'
  saveButton.className = 'ds-button-field ds-save-button';
  
  //Create a Cancel/Undo button
  var cancelButton = document.createElement('input');
  cancelButton.type = 'button';
  cancelButton.value = '';
  cancelButton.title = 'Undo Change'
  cancelButton.className = 'ds-button-field ds-cancel-button';
  cancelButton.onclick = function() {
    cancelEditingPreviousValue(editButton, deleteButton, previousValue,
                               editField, cancelButton, saveButton);
  };

  // Add Cancel button, then Save button
  editButton.parentNode.appendChild(cancelButton);
  editButton.parentNode.appendChild(saveButton);
}

// Restores a previous value in submission describe step
function cancelEditingPreviousValue(editButton, deleteButton, previousValue, editField,
                                    cancelButton, saveButton)
{
  // IE has innerText, not textContent
  editField.value = previousValue.textContent == undefined ?
                      previousValue.innerText : previousValue.textContent;
  replaceInputWithType(editField, 'hidden');

  // .show() doesn't work in IE
  editButton.style.display = 'inline';
  deleteButton.style.display = 'inline';
  previousValue.style.display  = 'inline';
  
  // .remove(0) doesn't work in IE
  cancelButton.parentNode.removeChild(cancelButton);
  saveButton.parentNode.removeChild(saveButton);
}

// Add CSS rule to page - from <http://yuiblog.com/blog/2007/06/07/style/>
function addCSS(cssCode) {
  var styleElement = document.createElement('style');
  styleElement.type = 'text/css';
  if (styleElement.styleSheet)
    styleElement.styleSheet.cssText = cssCode;
  else
    styleElement.appendChild(document.createTextNode(cssCode));
  document.getElementsByTagName('head')[0].appendChild(styleElement);
}

// Editing a previous value in submission describe step requires JavaScript.
// Only show Edit/Undo buttons if JavaScript execution is enabled.
addCSS('#aspect_submission_StepTransformer_div_submit-describe input.ds-edit-button { visibility: visible !important; }' );
addCSS('#aspect_submission_StepTransformer_div_submit-describe input.ds-cancel-button { visibility: visible !important; }' );
addCSS('#aspect_submission_StepTransformer_div_submit-describe input.ds-save-button { visibility: visible !important; }' );