function toggleOptions(on, baseId) {
  var hider = [];
  var shower = [];
  if(on) {
    hider = offArray(baseId);
    shower = onArray(baseId);
  }
  else {
    shower = offArray(baseId);
    hider = onArray(baseId);
  }
  hideArray(hider);  
  showArray(shower);
}

function initializeToggleOptions(elementBases) {
  elementBases = stringToArray(elementBases)
  elementBases.each(function(elementBase) {
    var onId = elementBase + '_Yes';
    var offId = elementBase + '_No';
    if(!$(onId) || !$(offId)) { return; }
    var onElement = $(onId);
    var offElement = $(offId);
    onElement.onfocus = function(){ toggleOptions(true,baseId) };
    offElement.onfocus = function(){ toggleOptions(false,baseId) };
    var baseId = elementBase + '_ex';
    hideArray(offArray(baseId));
    hideArray(onArray(baseId));
    if(onElement.checked) {
      showArray(onArray(baseId));
    }
    if(offElement.checked) {
      showArray(offArray(baseId));
    }
  });
}

function showOptions(trigger, baseId) {
	var triggerElement = $(trigger);
  if(activeElement(triggerElement)) {
    showArray(onArray(baseId));
  }
  else {
    hideArray(onArray(baseId));
  }
}

function initializeShowOptions(baseIds) {
  baseIds = stringToArray(baseIds);
  baseIds.each(function(baseId) {
    if(!$(baseId)) { return; }
    var baseElement = $(baseId);
    baseElement.onclick = function(){ showOptions(this,baseId)};
    hideArray(onArray(baseId));
    if(activeElement(baseElement.checked)) {
      showArray(onArray(baseId));
    }
  });
}

function showOptionsByClass(elementHashes) {
	hideElementsByClass("hide");
	elementHashes.each(function(elementHash){
		var element = $(elementHash.get('triggerId'));
		var className = elementHash.get('className');
		if(activeElement(element)) {
			showArray(classArray(className));
		}
	});
}

function initializeShowOptionsByClass(elementHashes) {
	hideElementsByClass("hide");
	elementHashes.each(function(elementHash){
		var element_id = elementHash.get('triggerId');
		var element = $(element_id);
		var className = elementHash.get('className');
		element.onclick = function(){ showOptionsByClass(elementHashes) };
		if(activeElement(element)) {
			showArray(classArray(className));
		}
	});
}

function stringToArray(stringOrArray) {
	if(typeof stringOrArray == "string") {
    return [stringOrArray]
  }
	else {
		return stringOrArray
	}
}

function activeElement(element) {
	if(!$(element)){ return false; }
	var element = $(element);
	if(element.checked || element.selected) {
		return true;
	}
	else { return false; }
}

function offArray(baseId) {
  var offId = baseId + '_off';
  return [offId + '_label', offId + '_field'];
}

function onArray(baseId) {
  var onId = baseId + '_on';
  return [onId + '_label', onId + '_field'];
}

function classArray(classNames) {
	if(typeof classNames == "string") {
		classNames = [classNames]
	}
	var elements = [];
	classNames.each(function(className) {
		elements.push(document.getElementsByClassName(className));
	});
	return elements.flatten().uniq()	
}

function hideArray(hider) {
  hider.each(function(el){if($(el)){Element.hide(el)}});
}

function showArray(shower) {
  shower.each(function(el){if($(el)){Element.show(el)}})
}

function hideElementsByClass(className) {
	hideArray(classArray(className));
}

function showElementsByClass(className) {
	showArray(classArray(className));
}

Element.Methods.truelyVisible = function(element) {
		var visibleBoolean = element.visible();
		element.ancestors().each(function(el){ 
			if(!el.visible()) { visibleBoolean = false; }
		});
		return visibleBoolean;
};

Element.addMethods();