// application.js
/*	This is the JavaScript for the senate application form developed in
 *  2003 (?)
 */


//  Set up list of departments by division if user has a decent
//  browser.  Otherwise, make it alphabetic.
//  And turn off the "Need JavaScript" note.
//  -------------------------------------------------------------------
  function setUpDeptList()
  {
    if ( document.all )
    {
      //  Internet Explorer
      document.all["departmentsByDivision"].style.visibility
                                                            = "hidden";
      document.all["departmentsAlphabetically"].style.visibility 
                                                           = "visible";
      document.all[ "needJS" ].style.display = "none";
    }
    else
    {
      //  Mozilla, etc.
      document.getElementById( "departmentsByDivision" )
                                         .style.visibility = "visible";
      document.getElementById( "departmentsAlphabetically" )
                                          .style.visibility = "hidden";
      document.getElementById( "needJS" ).style.display = "none";
    }
  }


//  Modify form based on student/faculty status
//  -------------------------------------------------------------------

  //  Faculty Status
  //  --------------
  function itsaFac(form)
  {
    if ( document.all )
    {
      document.all["addrLabel"].innerHTML = "Campus Address:";
      document.all["citystate"].disabled = true;
      document.all["citystate"].value = "Faculty - ignore";
      document.all["zipcode"].disabled = true;
      document.all["zipcode"].value = "ignore";
      document.all["deptLabel"].innerHTML = "Department:";
      document.all["ssNo"].disabled = true;
      document.all["ssNo"].value = "Faculty - ignore";
      document.all["gradDate"].disabled = true;
      document.all["gradDate"].value = "Faculty - ignore";
    }
    else
    {
      //  Mozilla (grays out disabled fields)
      document.getElementById("addrLabel").innerHTML = "Campus Address:";
      document.getElementById("citystate").disabled = true;
      document.getElementById("citystate").value = "";
      document.getElementById("zipcode").disabled = true;
      document.getElementById("zipcode").value = "";
      document.getElementById("deptLabel").innerHTML = "Department:";
      document.getElementById("ssNo").disabled = true;
      document.getElementById("ssNo").value = "";
      document.getElementById("gradDate").disabled = true;
      document.getElementById("gradDate").value = "";
    }
  }

  //  Student Status
  //  --------------
  function itsaStud(form)
  {
    if ( document.all )
    {
      document.all["addrLabel"].innerHTML = "Mailing Address:";
      document.all["citystate"].disabled = false;
      document.all["citystate"].value = "";
      document.all["zipcode"].disabled = false;
      document.all["zipcode"].value = "";
      document.all["deptLabel"].innerHTML = "Major:";
      document.all["ssNo"].disabled = false;
      document.all["gradDate"].disabled = false;
      document.all["ssNo"].value = "";
      document.all["gradDate"].value = "";
    }
    else
    {
      document.getElementById("addrLabel").innerHTML =
                                                    "Mailing Address:";
      document.getElementById("citystate").disabled = false;
      document.getElementById("citystate").value = "";
      document.getElementById("zipcode").disabled = false;
      document.getElementById("zipcode").value = "";
      document.getElementById("deptLabel").innerHTML        = "Major:";
      document.getElementById("ssNo").disabled = false;
      document.getElementById("gradDate").disabled = false;
    }
  }


//  validate()
//  -----------------------------------------------------------------
/*
 *  Checks all required fields have values and that emails agree.
 */
  function validate( form )
  {
    var isOK = true;

    if ( form.applicant.value == "" )
    {
      alert( "You didn't enter your name!" );
      return false;
    }

    if (  (form.category.item(0).checked) ||
          (form.category.item(1).checked) )
    {
      //  It's a student
      form.ssNo.value = fixDashes( form.ssNo.value );
      if ( form.ssNo.value == "" )
      {
        alert( "You must supply your student ID number." );
        return false;
      }
      if ( form.gradDate.value == "" )
      {
        alert( "Please enter your expected graduation date." );
        return false;
      }
      if (  (form.address.value == "") || 
            (form.address.value.length < 7) )
      {
        alert( "Please supply a valid street address." );
        return false;
      }

      if (  (form.citystate.value == "") ||
            (form.citystate.value.length < 5) ) // NY NY is valid
      {
        alert( "Please supply your city and state." );
        return false;
      }
      form.zipcode.value = fixZip( form.zipcode.value );
      if ( form.zipcode.value == "" )
      {
        alert( "Please enter a valid Zip code." );
        return false;
      }
    }
    else
    {
      //  Faculty
    if ( form.address.value == "" )
    {
      alert( "Please supply your campus office address." );
      return false;
    }

      form.ssNo.value = "";
      form.gradDate.value = "";
      form.citystate = "";
      form.zip = "";
    }

    if ( (form.departmentByDiv.value == "") &&
         (form.departmentAlpha.value == "") )
    {
      alert( "You need to select your department or major." );
      return false;
    }

    if ( form.phone.value == "" )
    {
      alert( "You need to supply one or more phone numbers." );
      return false;
    }
    else if ( form.phone.value.length < 4 )
    {
      alert( "\"" + form.phone.value + 
                                   "\" is not a valid phone number." );
      return false;
    }

    //  Email address checks.  QC email is required and must be valid.
		//	Second email is optional, but must be entered twice.
		
    if (  (0 == form.email_1.value.length) && 
          (0 == form.email_2.value.length) )
    {
      var msg = "You did not provide an email address.\n";
      msg += "  * Press OK to submit your application without ";
      msg += "providing your email address.\n"
      msg += "  * Press Cancel to go back to the form and enter your ";
      msg += "address (recommended)."
      if ( confirm(msg) )
      {
        //  User will submit without email.
        ;
      }
      else
      {
        return false;
      }
    }
    else
    {
      if ( form.email_1.value != form.email_2.value )
      {
        alert( "The two email addresses are not the same." );
        return false;
      }
      else if ( form.email_1.value.search(/\w+@\w+/i) == -1 )
      {
        alert( "\"" + form.email_1.value + "\" is not a valid email " +
                                                          "address." );
        return false;
      }
    }

    if (  (form.firstStanding.value  == "none") &&
          (form.secondStanding.value == "none") &&
          (form.thirdStanding.value  == "none") &&
          (form.firstOther.value   == "none") &&
          (form.secondOther.value  == "none") &&
          (form.thirdOther.value   == "none") )
    {
      alert( "You didn't select any committees!" );
      return false;
    }

    if ( form.statement.value.length < 20 )
    {
      alert( "Please provide a meaningful statement of your " +
                  "qualifications and reasons for wishing to serve." );
      return false;
    }

    if (( (form.firstOther.value  == "A Search or Review Committee")
       || (form.secondOther.value == "A Search or Review Committee")
       || (form.thirdOther.value  == "A Search or Review Committee"))
           && (form.additional.value.length < 10) )
    {
      alert( "Use the Additional Comments to name the search or " +
      "review committee for which you are applying." );
      return false;
    }

    return true;
  }


  //  fixDashes()
  //  -----------------------------------------------------------------
  /*
   *  Puts social-secutity number into canonical form.
   *
   *  Strips all non-digits; checks there are 9 digits remaining, and
   *  inserts dashes in the proper places.
   *
   *  This version also accepts 4-digit numbers.
   *
   *  12/11/03: This version forces 4-digit numbers.
   */
    function fixDashes( v )
    {
      if ( v.length == 0 )
      {
        return v;
      }
      before = v;
      after="";
      for (var i=0; i< before.length; i++)
      {
        if ( before.charAt(i) >= '0' && before.charAt(i) <= '9' )
          after = after + before.charAt(i);
      }

      if ( after.length == 4 )
      {
        //  Allow 4-digit student ID
        return after;
      }

      //  Check for 9-digit version
      if ( after.length != 9 )
      {
        alert ( "\"" + before + "\" is not a valid ID number" );
        return "";
      }

      //  Insert dashes into the 9-digit version
      fixed="";
      /*  Discard the first 5 digits
       *  --------------------------
       *  for (var i=0; i<=2; i++) fixed = fixed + after.charAt(i);
       *  fixed = fixed + '-';
       *  for (var i=3; i<=4; i++) fixed = fixed + after.charAt(i);
       *  fixed = fixed + '-';
       */
          for (var i=5; i<=8; i++) fixed = fixed + after.charAt(i);

      return fixed;
    }

  //  fixZip()
  //  -----------------------------------------------------------------
  /*
   *  Puts zip code into canonical form.
   *
   *  Strips all non-digits; checks there are 5 or 9 digits remaining,
   *  and inserts a dash in the proper place if 9.
   *
   */
    function fixZip( v )
    {
      before = v;
      after="";
      for (var i=0; i< before.length; i++)
      {
        if ( before.charAt(i) >= '0' && before.charAt(i) <= '9' )
          after = after + before.charAt(i);
      }

      if ( after.length == 5 )
      {
        //  Allow 5-digit Zip
        return after;
      }

      //  Check for 9-digit version
      if ( after.length != 9 )
      {
        return "";
      }

      //  Insert dash into the 9-digit version
      fixed="";
      for (var i = 0; i <= 4; i++) fixed = fixed + after.charAt(i);
      fixed = fixed + '-';
      for (var i = 5; i <= 8; i++) fixed = fixed + after.charAt(i);

      return fixed;
    }
  
  window.onload = setUpDeptList;
