/* To switch different bits of the form on and off */
function display(elementId){
  document.getElementById(elementId).style.display="block";
}
function hide(elementId){
  document.getElementById(elementId).style.display="none";
}
function toggle(elementId){
  if(document.getElementById(elementId).style.display=="block") {
    hide(elementId);
  } else {
    display(elementId);
  }
}
function isVisible(obj) {
  var returnable=true;
  // get parent node of input element
  currentParent= obj.parentNode;
  while (currentParent) {
    if ((currentParent.tagName == "BODY") || (currentParent.tagName == "HTML")) {
      returnable=true;
      break;
    }
    // The parent node is hiddden this so this element is no good.
    if ((currentParent.style.display == "none") || (currentParent.style.visibility == "hidden")) {
      returnable = false;
      break;
    }
    // climb up DOM tree
    currentParent = currentParent.parentNode;
   }
  // passed both valid input field and parent nodes aren't hidden, set focus.
  return returnable;
}
function getElementsByClass(val,container) {
  container = container||document;
  var allElements = container.all||container.getElementsByTagName('*');
  var arr = [];
  for(var k=0;k<allElements.length;k++) {
    if(allElements[k].className == val) {
      arr[arr.length] = allElements[k];
    }
  }
  return arr;
}
/* Add class="mandatory" to any text input to make it mandatory if visible */
function checkMandatory() {
  var returnable=true;
  var mandatoryFields=getElementsByClass('mandatory');
  for (var m=0;m<mandatoryFields.length;m++) {
    if(mandatoryFields[m].value==''&&isVisible(mandatoryFields[m])) {
      mandatoryFields[m].style.backgroundColor="#ffcccc";
      returnable=returnable&&false;
    } else {
      mandatoryFields[m].style.backgroundColor="white";
      returnable=returnable&&true;
    }
  }
  returnable=(checkRelationships()&&returnable);
  return returnable;
}

/* Add rel="uniqueidentifier" to any 2 or more text inputs to make matching them mandatory */
function checkRelationships() {
  var returnable=true;
  uniqueRelationships=getUniqueRelationships();
  for(var k in uniqueRelationships) {
    returnable=(returnable&&matchRelationships(k));
  }
  return returnable;
}
/* get an array of distinct unique relationship identifiers */
function getUniqueRelationships() {
  var allElements = document.getElementsByTagName('input');
  var uniqueRel = [];
  for(var k=0;k<allElements.length;k++) {
    if(allElements[k].getAttribute('rel')!=null) {
      if(uniqueRel[allElements[k].getAttribute('rel')]==undefined) {
        uniqueRel[allElements[k].getAttribute('rel')] = allElements[k].getAttribute('rel');
      }
    }
  }
  return uniqueRel;
}
function matchRelationships(relToMatch) {
  var returnable=true;
  var allElements = document.getElementsByTagName('input');
  var arr = [];
  for(var k=0;k<allElements.length;k++) {
    if(allElements[k].getAttribute('rel') == relToMatch) {
      arr[arr.length]=allElements[k];
    }
  }
  if (arr.length>1) {
    var lastValue=arr[0].value;
    for(var k=1;k<arr.length;k++) {
      returnable=(returnable&&(arr[k].value==lastValue));
      if(!returnable) {
        arr[k].style.backgroundColor="red";
      }
    }
    if(!returnable) {
      for(var k=0;k<arr.length;k++) {
          arr[k].style.backgroundColor="red";
      }
    }
    return returnable;
  } else {
    //Trivial case, single-element set
    return true;
  }
}


/* Datatype checking in case it's needed */
function isArray(a) {
    return isObject(a) && a.constructor == Array;
}
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}
