(function () {
	var head = document.getElementsByTagName("head")[0];
	if (head) {
		var scriptStyles = document.createElement("link");
		scriptStyles.rel = "stylesheet";
		scriptStyles.type = "text/css";
		scriptStyles.href = "crc_register.css";
		head.appendChild(scriptStyles);
	}
}());



function unitSelector(unitType){
    var metric = new Array('height_metric', 'weight_metric');
	var imperial = new Array('height_imperial', 'weight_imperial');
	var bothUnits = metric.concat(imperial);
	for(var i=0; i<bothUnits.length; i++){
	  var theElement = document.getElementById(bothUnits[i]);
	  if(bothUnits[i].indexOf(unitType) > 0){
	    theElement.style.display = 'block';
		}
	  else{
	    theElement.style.display = 'none';
		}
	  }
	document.getElementById('bmi_calculate_button').style.display = 'block';
	}

function calculateBMI(){
    var theForm = document.getElementById('volunteer_form')
    var metric = theForm.preferred_units[0].checked;
	var kg = 0;
	var cm = 0;
	var poundsToKg = 0.45359;
	var inchesToCm = 2.540;
	
	if(metric){
	  kg = parseInt(theForm.kg.options[theForm.kg.selectedIndex].value);
	  cm = parseInt(theForm.metres.value)*100+parseInt(theForm.cm.value);
	  }
	
	else{
	  kg = (parseInt(theForm.stones.value)*14+parseInt(theForm.pounds.value))*poundsToKg;
	  cm = (parseInt(theForm.feet.value)*12+parseInt(theForm.inches.value))*inchesToCm;
	  }
	
	var bmi = (kg / Math.pow( cm / 100, 2 ))
	bmi = Math.round(bmi*100)/100;
	
	
	if(isNaN(bmi)){
	  alert('Please ensure you have entered your height and weight correctly.');
 	  }	
	else{
	  theForm.bmi.value = bmi;
	  document.getElementById('bmi_display').style.display = 'block';
	  }
	}

  function smoker(smokingStatus){
    switch(smokingStatus){
	  case 'smoker':
	    document.getElementById('smoker').style.display = 'block';
		document.getElementById('ex_smoker').style.display = 'none';
		break;		
	  case 'ex_smoker':
	    document.getElementById('smoker').style.display = 'none';
		document.getElementById('ex_smoker').style.display = 'block';
		break;
	  default:
	    break;
	  }
	}
	
	
	
	
function register_init(){

  // This function initialises the form - sets up event listeners etc	
	
  var theForm = document.getElementById('volunteer_form');
  

  // Set the title for required field markers
  var requiredFieldMarkers = document.getElementsByTagName('strong');
  for(var fld in requiredFieldMarkers){
    if(requiredFieldMarkers[fld].className == 'required'){
	  requiredFieldMarkers[fld].title = 'This field is required and cannot be left blank.';
	  }
    }
  
  theForm.onsubmit = function(){return validate()};
  if(theForm.captureEvents) theForm.captureEvents(Event.SUBMIT);
  
  document.getElementById('calc_bmi').disabled = true;
  
  var submitter = document.getElementById('submitter')
  submitter.disabled = true;
  
  var declaration = document.getElementById('declaration');
  declaration.onclick = checkDeclaration;
  if(declaration.captureEvents) declaration.captureEvents(Event.CLICK);
  
  var resetter = document.getElementById('resetter');
  resetter.onclick = function(){return checkReset()};
  if(resetter.captureEvents) resetter.captureEvents(Event.CLICK);
  
  
  var checkBoxes = theForm.getElementsByTagName('input');
  for(var i=0; i<checkBoxes.length; i++){
    if((checkBoxes[i].type == 'checkbox' && checkBoxes[i].className == 'reveal_details') || (checkBoxes[i].type == 'radio' && checkBoxes[i].className == 'reveal_details')){
	  checkBoxes[i].onclick = revealDetails;
      if (checkBoxes[i].captureEvents) checkBoxes[i].captureEvents(Event.CLICK);
      }
	if(checkBoxes[i].className == 'unit_selector'){
	  checkBoxes[i].onclick = selectUnits;
      if (checkBoxes[i].captureEvents) checkBoxes[i].captureEvents(Event.CLICK);
	  }
    }
	
	
  var dobDay = document.getElementById('dob_day');
  var dobMonth = document.getElementById('dob_month');
  var dobYear = document.getElementById('dob_year');
  
  dobDay.onchange = setDateOfBirth;
  if(dobDay.captureEvents) dobDay.captureEvents(Event.CHANGE);
  
  dobMonth.onchange = setDateOfBirth;
  if(dobMonth.captureEvents) dobMonth.captureEvents(Event.CHANGE);
  
  dobYear.onchange = setDateOfBirth;
  if(dobYear.captureEvents) dobYear.captureEvents(Event.CHANGE);
  
  
  // Hide the source detail boxes and add event handlers
  hideSources();
  document.getElementById('source').onchange = checkSource;
  if(document.getElementById('source').captureEvents) document.getElementById('source').captureEvents(Event.CHANGE);
  }

function hideSources(){
  var sourceDetails = new Array('source_searchengine', 'source_localpaper', 'source_localradio', 'source_website', 'source_other');
  for(var i=0; i<sourceDetails.length; i++){
	var theElement = document.getElementById(sourceDetails[i]);
	theElement.value = '';
	theElement = document.getElementById(sourceDetails[i]+'_container');
    theElement.style.display = 'none';
    }
  }


function formatFieldName(fieldName){
  fieldName = fieldName.replace(/_/g, ' ');
  return fieldName.substring(0,1).toUpperCase() + fieldName.substring(1,fieldName.length);
  }

function validate(){
  // Set the realName field (for use with formmail.pl
  var theForm = document.getElementById('volunteer_form');
  var realName = document.getElementById('realname');
  var forename = document.getElementById('forename');
  var surname = document.getElementById('surname');
  realName.value = forename.value + ' ' + surname.value;
  
  var error = false;
  var errMsg = 'Sorry, we could not process your application because of the following errors:\n\n';
  var htmlErrMsg = '<p>'+errMsg+'</p><ul>';
  
  // Check the required fields
  
  var additionalRequiredFields = '';
  
  // These are conditional required fields - mainly for medical history. If someone has indicated that they have a medical problem etc, they must provide details
  var conditionalRequiredFields = new Array('taking_medication', 'alergic_medication', 'medical_condition', 'contraceptives', 'asthma', 'sleep');
  for(var fld in conditionalRequiredFields){
    if(document.getElementById(conditionalRequiredFields[fld]).checked){
	  additionalRequiredFields += ','+conditionalRequiredFields[fld]+'_details';
	  }
	
    }
  
  
  var requiredFields = document.getElementById('required').value + additionalRequiredFields;  
  if(requiredFields != ''){
    requiredFields = requiredFields.split(',');	
	for(var fld in requiredFields){
	  if(theForm[requiredFields[fld]].value == ''){	    
		htmlErrMsg += '<li class="error_link" id="error_link_'+ requiredFields[fld] + '"><a href="#' +  requiredFields[fld] + '">' + formatFieldName(requiredFields[fld])+ '</a> cannot be left blank</li>';
		document.getElementById(requiredFields[fld]).style.borderColor = 'red';
		if(document.getElementById(requiredFields[fld]+'_error')){
		  document.getElementById(requiredFields[fld]+'_error').innerHTML = '<p>This field cannot be left blank</p>';
		  }
	    error = true;
		}
	  else if(document.getElementById(requiredFields[fld]+'_error')){
	    document.getElementById(requiredFields[fld]+'_error').innerHTML = '';
		document.getElementById(requiredFields[fld]).style.borderColor = 'inherit';
		}	
	  }
    }
	
  // Check that DOB is completed  
  var dobParts = new Array('day', 'month', 'year');
  var dobComplete = true;
  for(var i=0; i<dobParts.length; i++){
	var theElement = document.getElementById('dob_'+ dobParts[i]);
	  if(theElement.value == ''){	
	  dobComplete = false;
	  }
    }
  if(!dobComplete){
    htmlErrMsg += '<li class="error_link" id="error_link_dob_day">Please ensure you have completed your <a href="#dob_day">date of birth</a> correctly';
	error = true;
	document.getElementById('dob_error').innerHTML = '<p>Please ensure you have completed your date of birth.</p>';
    }
  else{
	document.getElementById('dob_error').innerHTML = '';
    }
	
	
  // Check that gender has been specified
  var female = document.getElementById('gender1').checked;
  var male = document.getElementById('gender2').checked;
  if(!female && !male){
    htmlErrMsg += '<li class="error_link" id="error_link_gender1">Please select your <a href="#gender1">gender</a>';
	error = true;
	document.getElementById('gender_error').innerHTML = '<p>Please select your gender.</p>';
    }
  else{
	document.getElementById('gender_error').innerHTML = '';
    }
  
  // Ensure that either phone or email address is provided
  var emailPhone = document.getElementById('email').value + document.getElementById('phone').value;
  if(emailPhone == ''){
	htmlErrMsg += '<li>Please complete either your:</li>';
    htmlErrMsg += '<li class="error_link" id="error_link_phone" style="margin-left: 1.5em;"><a href="#phone">phone number</a></li>';
	htmlErrMsg += '<li class="error_link" id="error_link_email" style="margin-left: 1.5em;">or your <a href="#email#">email address</a>.</li>';
	error = true;
    }
	
  // Check that they have entered their height and weight
  if(document.getElementById('bmi').value == ''){
    htmlErrMsg += '<li>Please enter your height and weight and click the Calculate BMI button</li>';
	error = true;
    }

  // Check if any errors have ocurred
  if(error){
    htmlErrMsg += '</ul>';  
	document.getElementById('error_message').style.display = 'block';
	document.getElementById('error_message').innerHTML = '<h3>Problem submitting your application</h3><p>'+htmlErrMsg;	  
	document.location.hash = 'error_message';
	
	var errorLinks = document.getElementsByTagName('li');
	//for(var fld in errorLinks){
	for(var fld=0; fld<errorLinks.length; fld++){
	  if(errorLinks[fld].className == 'error_link'){
		//alert(errorLinks[fld].id);
        errorLinks[fld].onclick = focusField;
		if(errorLinks[fld].captureEvents) errorLinks[fld].captureEvents(Event.CLICK);
	    }
	  }
	
	return false;
	}
  else {
	  
	// OK to submit
	// Clean up some unwanted fields
	document.getElementById('dob_day').value = '';
	document.getElementById('dob_month').value = '';
	document.getElementById('dob_year').value = '';
	document.getElementById('units1').checked = false;
	document.getElementById('units2').checked = false;
	  
	  
	document.getElementById('submitter').disabled = true;
	document.getElementById('submitter').value = 'Submitting data';
	return true;
	}
  }


function focusField(e){
  var fieldName = this.id.substring(11,this.id.length);
  document.getElementById(fieldName).focus();
  return false;
  }


function checkDeclaration(e){
  var submitter = document.getElementById('submitter');
  if(this.checked) submitter.disabled = false;
  else submitter.disabled = true;
  }
    
function checkReset(e){
  if(confirm('Are you sure you want to reset the form?')){
    register_init();
    return true;
    }
  else return false;
  }

function selectUnits(e){
  var units = this.value;
  var unitArray = new Array('metric', 'imperial');  
  
  for(var i=0; i<unitArray.length; i++){
    if(unitArray[i] == units) document.getElementById(unitArray[i]).style.display = 'block';
	else document.getElementById(unitArray[i]).style.display = 'none';
    }
	
  if(units == 'metric'){
	var metricSelectors = new Array('metric_kg', 'metric_metres', 'metric_cm');  
	for(var i=0; i<metricSelectors.length; i++){  
	  var theSelector = document.getElementById(metricSelectors[i]);
	  theSelector.onchange = checkHeightWeight;
	  if(theSelector.captureEvents) theSelector.captureEvents(Event.CHANGE);
	  }  
    }
	
  if(units == 'imperial'){
	var imperialSelectors = new Array('imperial_stones', 'imperial_pounds', 'imperial_feet', 'imperial_inches');  
	for(var i=0; i<imperialSelectors.length; i++){  
	  var theSelector = document.getElementById(imperialSelectors[i]);
	  theSelector.onchange = checkHeightWeight;
	  if(theSelector.captureEvents) theSelector.captureEvents(Event.CHANGE);
	  }  
    }	  
	
  document.getElementById('bmi_calculate_button').style.display = 'block';
  document.getElementById('bmi_display').style.display = 'block';

  }
  
function checkHeightWeight(e){
  var units = this.id.split('_')[0];
  
  if(units == 'metric'){
    if(document.getElementById('metric_kg').selectedIndex != 0 && document.getElementById('metric_metres').selectedIndex != 0 && document.getElementById('metric_cm').selectedIndex != 0){
	  document.getElementById('calc_bmi').disabled = false;
	  }
	else{
	  document.getElementById('calc_bmi').disabled = true;
	  }
    }

  if(units == 'imperial'){
    if(document.getElementById('imperial_stones').selectedIndex != 0 && document.getElementById('imperial_pounds').selectedIndex != 0 && document.getElementById('imperial_feet').selectedIndex != 0 && document.getElementById('imperial_inches').selectedIndex != 0){
	  document.getElementById('calc_bmi').disabled = false;
	  }
	else{
	  document.getElementById('calc_bmi').disabled = true;
	  }
    }
	
	
  }
  
function setDateOfBirth(){
  var dobDay = document.getElementById('dob_day');
  var dobMonth = document.getElementById('dob_month');
  var dobYear = document.getElementById('dob_year');
  var dob = document.getElementById('date_of_birth');
  
  if(dobDay.value != '' && dobMonth.value != '' && dobYear.value != ''){
	dob.value = dobDay.value + ' ' + dobMonth.options[dobMonth.selectedIndex].text + ' ' + dobYear.value;
	//alert(dob.value);
    }
  
  }


function checkSource(e){
  var theSource = this.options[this.selectedIndex].value;
  var toShow = '';
  hideSources();
  switch(theSource){
    case 'Internet Search Engine':
	  toShow = 'source_searchengine_container';
	  break;
	case 'Local Paper':
	  toShow = 'source_localpaper_container';
	  break;
	case 'Local Radio':
	  toShow = 'source_localradio_container';
	  break;
	case 'Website':
	  toShow = 'source_website_container';
	  break;
	case 'Other':
	  toShow = 'source_other_container';
	  break;
    }
  if(toShow != ''){	
    document.getElementById(toShow).style.display = 'block';
    }
  }


function revealDetails(e){
  var elementID;
  if(this.type == 'checkbox') elementID = this.id;
  if(this.type == 'radio') elementID = this.value;
  var elementDetails = elementID+'_details_container';  
  
  // Special case for the smoking options - hide the others
  if(this.name == 'smoking'){
    document.getElementById('smoker_details_container').style.display = 'none';
	document.getElementById('ex_smoker_details_container').style.display = 'none';
    }
  
  var toShow = this.checked;
  if(document.getElementById(elementDetails)){
    if(toShow)document.getElementById(elementDetails).style.display = 'block';
    else document.getElementById(elementDetails).style.display = 'none';   
    }
  }
