// ----------------------------------------------------------------------

// Javascript form validation routines.

// Author: Stephen Poley

//

// File 2: checkboxes

// Uses the msg routine from formval.js

// ----------------------------------------------------------------------





// -----------------------------------------

//            commonCheck2

// Common code for checkbox validation routines to

// check for older / less-equipped browsers

// Returns true (validation passed) or

//         proceed (don't know yet)

// -----------------------------------------



var proceed = 2;  



function commonCheck2   (vfld,   // element to be validated

                         ifld)   // id of element to receive info/error msg

{

  if (!document.getElementById) 

    return true;  // not available on this browser - leave validation to the server

  var elem = document.getElementById(ifld);

  if (!elem.firstChild)

    return true;  // not available on this browser 

  if (elem.firstChild.nodeType != node_text)

    return true;  // ifld is wrong type of node  



  msg (ifld, "warn", "");  // clear any previous error message

  return proceed;

}







// -----------------------------------------

//            validateCheckbox

// Validate that the correct number of checkboxes has been checked.

// Returns true if valid (and also if could not be executed because 

// of old browser)

// -----------------------------------------



function validateCheckbox  (vfld,   // checkboxes to be validated

                            ifld,   // id of element to receive info/error msg

                            nr,     // number of checkboxes to be checked. >=2

                            cond)   // condition: -1 = less than or equal to nr

                                    //             0 = equal to nr (default)

                                    //             1 = greater than or equal to nr

{

  if (!nr || nr<1) {

    alert('Programming error in validateCheckbox: nr<1'); 

       // for nr=1 use radio buttons or validateConfirm

    return true;

  }

  if (!cond) cond = 0;



  var stat = commonCheck2(vfld, ifld);

  if (stat != proceed) return stat;



  // count how many boxes have been checked by the reader

  var count = 0;

  for (var j=0; j<vfld.length; j++)

     if (vfld[j].checked) count++;



  if (count==nr || count>nr) return true;

//  if (count<nr && cond==-1) return true;

//  if (count>nr && cond==1)  return true;



  // if we get here then the validation has failed



  var suffix='';

  if (count>1) suffix='es';



  var errorMsg;



  if (count<nr) errorMsg = 'Only ' + count + ' box' + suffix + ' checked: ' + nr + ' required';

  if (count>nr) errorMsg = '' + count + ' boxes checked: maximum ' + nr + ' allowed';

  if (count==0) errorMsg = 'No boxes checked: ' + nr + ' required';



  msg (ifld, "error", errorMsg);

  return false;

}





// -----------------------------------------

//            validateConfirm 

// Usually one doesn't want to validate if 1 checkbox of a set has been

// checked, because in this case one would use radio buttons instead.

// But sometimes one wants a reader to check a single box to confirm that 

// he or she agrees to something. That is covered by this routine.

//

// Returns true if valid (and also if could not be executed because 

// of old browser)

// -----------------------------------------



function validateConfirm   (vfld,   // checkbox to be validated

                            ifld)   // id of element to receive info/error msg

{

  var stat = commonCheck2(vfld, ifld);

  if (stat != proceed) return stat;



  if (vfld.checked) return true;



  // if we get here then the validation has failed



  var errorMsg = 'Please read the above message and confirm you agree to it';



  msg (ifld, "error", errorMsg);

  return false;

}

