$(document).ready(
				  
  function() { // Wait until the DOM is loaded, then go nuts

    // Hover table rows

    var hoverMeRows = $('table.hoverMe tr:not(:first-child(th))');

        hoverMeRows.mouseover( function() { $(this).addClass('highlightRow'); } );
        hoverMeRows.mouseout( function()  { $(this).removeClass('highlightRow'); } );

    // Zebra Striping

    $('table.zebraMe tr:nth-child(even)').addClass('altRow');

    // Add back button

    if (window.history.length > 1) {

       $('td.dynamicBackButton').addClass('txtAlignRight');

       $('.dynamicBackButton').append('<button type="button" onclick="window.history.back()">Back</button>');

    }

    // Set up forms for validation

    $('form.validateMe').submit(

      function validateForm (eventRef) 
	  {

        eventRef.preventDefault();

        var requiredFields    = $('.required', this);
        var totRequiredFields = requiredFields.length;

        for (var counter = 0; counter < totRequiredFields; counter++) {

          var field = requiredFields[counter];
          if (!validateFields(field)) { return false; }

        }
		
        this.submit();		  

      }

    );

    // Denote required fields

    var requiredFields    = $('.required');
    var totRequiredFields = requiredFields.length;

    for (var counter = 0; counter < totRequiredFields; counter++) {

      var field = requiredFields[counter];

      // assuming standards compliant <label for="[id_of_corresponding_field]">Labels</label>,
      // get label field by using field.id and jQuery's element[@attribute=] selector magic

      var fieldLabel = $('label[for=' + field.id + ']');

      var labelText = fieldLabel.text(); // get text inside field's label parent

          labelText = labelText.replace(/:/,' ').replace(/\(required\)/ig,'').replace(/\s+$/,''); // filter existing text
          // rebuild label text
          if ( $("#required_asterisk").length > 0 ) { fieldLabel.empty().html(labelText + '&nbsp;<span class="alert">*</span>:') }
          else                                      { fieldLabel.empty().html(labelText + '&nbsp;<span class="alert">(required)</span>:') }

    }



    // Add showHideHelp icon/trigger

    $('.showHideHelp').each(

      function () {

        $(this).after('<a href="javascript:void showHide(\'' + this.id + 'TalkBubble\')"><img class="SHHicon" src="/img/icons/help/open.gif" alt="Question mark icon" /></a>');

        $('#' + this.id + 'TalkBubble .txt').prepend('<p><a class="SHHhideLink" href="javascript:void showHide(\'' + this.id + 'TalkBubble' + '\')"><img src="/img/icons/help/close.gif" alt="Close icon" title="Close This Help Section" /></a></p>');

      }

    );

    // Add icon to end of external links

    $("a[rel='external']").after("<img class=\"external\" src=\"/global/img/icons/external.png\" alt=\"external site\" />").css({ margin : "0 2px -1px 2px" });


  }

);


function validateFields (field) {

  var result       = true;
  var fieldType    = field.type;
  var fieldTagName = field.tagName;
  var fieldClasses = field.className;
  var labelText    = $('label[for=' + field.name + ']').text();


  if ( (fieldType === 'checkbox') && (field.checked === false) ) { // checkboxes

    alert('Please tick the "' + labelText + '" field.');

    field.focus();

    result = false;

  } else if ( (fieldTagName === 'SELECT') && (field.value === '') ) { // select boxes

    if ( $(field).is('.sss') ) { // Catering for SSS technique

      var correspondingTextFieldId = $('input[class*=' + field.id + ']')[0].id;
          labelText                = $('label[for=' + correspondingTextFieldId  + ']').text();

      alert('The text in the "' + labelText + '" field must match an item in the dynamic drop down list.\nPlease type more letters until a match appears, then select the match if necessary.');

      $(correspondingTextFieldId).focus();

    } else {

      alert('Please select an option from the "' + labelText + '" field.');

      field.focus();

    }

    result = false;

  } else if (fieldType === 'text' || fieldType === 'password' || fieldType === 'hidden' || fieldType === 'file' || fieldType === 'textarea' ) {

    if (field.value === '') {

      alert('Please enter a value for the "' + labelText + '" field.'); field.focus(); result = false;

    } else {

      if ( $(field).is('.alphanum') ) {

        if ( field.value.match(/\W/gi) ) {

          alert('The "' + labelText + '" field can only contain words or numbers'); field.focus(); result = false;

        }

      } else if ( $(field).is('.email') ) {

        if ( !field.value.match(/[@]/g) || field.value.match(/\s/g) ) {

          alert('The "' + labelText + '" field must be a valid email address'); field.focus(); result = false;

        }
		
      } else if ( $(field).is('.number') ) {

        if (isNaN(field.value)) {

          alert('The "' + labelText + '" field must be a number'); field.focus(); result = false;

        }

      } else if ( $(field).is('.url') ) {

        if (!field.value.match(/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i)) {

  		  	   alert('The "' + labelText + '" field must be a URL'); field.focus(); result = false;

        }

      } else if ( $(field).is('.digits') ) {

  		  	 if ( !/[^\d]/.test(field.value) ) {

  		  	   alert('Please use digits for the "' + labelText + '" field');

  		  	 }

      } else if ( $(field).is('.date') ) { // Required format is DD/MM/YYYY

      	 var slashyDDMMYYYY = /^(\d{2})\/(\d{2})\/(\d{4})$/;

      	 if (!slashyDDMMYYYY.test(field.value)) {

      	   alert('The date should be DD/MM/YYYY');

      	   field.focus();
      	   result = false;

      	 } else if ( (RegExp.$1 > 31) || (RegExp.$2 > 12) ) {

      	   alert('The date is not valid, there is a maximum of 31 days in a month and 12 months in a year');

          field.select();
      	   result = false;

      	 }

      }

    }

  } else if (fieldType == 'radio') { // radio buttons

    var atLeastOneChecked = false;
    //var labelElement      = $('label[@class=' + field.name + ']').text(); Edited out by TR 2009/03/10
    var labelElement      = $('label[for=' + field.name + ']').text();

    $.each( $('input[name=' + field.name + ']') ,

      function(count, fields) {

        if (fields.checked === true) { atLeastOneChecked = true; }

      }

    );

    if (atLeastOneChecked === false) {

      alert('Please choose one of "' + labelElement + '" options.');

      field.focus();

      result = false;

    }

  }

  return result;

}


function showHide (elementId) {

  var viewStatus = $("#" + elementId)[0].style.display;

       if (viewStatus === '' || viewStatus === 'none') { $('#' + elementId).show(); }
  else if (viewStatus === 'block')                     { $('#' + elementId).hide(); }

}


function sanitiseStringForURL (inputField,outputField) {

  // Requires two fields: first for input text; second readonly for sanitised, non-editable output

  // Converts string to lowercase alpha, hyphens replace spaces, starts/ends alpha

  var inFld  = document.getElementById(inputField);  // jQuery $() useless for defined/exists check, use DOM
  var outFld = document.getElementById(outputField);

  if (inFld && outFld) {

    $('#' + inputField).keyup( // requires jQuery now

      function () {

        var inValue = inFld.value;

        var sanitisedOut = inValue.replace(/[^A-Za-z0-9\s+]/g,'').replace(/\s+/g,'-'); // lowercase, letters, no spaces

            sanitisedOut = sanitisedOut.replace(/^[\W]/,'').replace(/[\W]$/,''); // start and finish with letters

            sanitisedOut = sanitisedOut.toLowerCase();

        $('#' + outputField).val(sanitisedOut);

      }

    );

  }

}

