<!-- Begin
/* JavaScript: valString
   validating & correcting form input string 

   Created by Rob Kalkman 
   inspiration provided by JavaScript.com templates:
    * 'changeCase' by William Humphreys (billy@technical-solutions.co.uk)
    * 'right' by Martin Webb (martin@irt.org)

   Version 0.9 - 03/12/2003 - initial version (basic validation)
   Version 1.0 - 03/16/2003 - released version (minor corrections)
   Version 1.1 - 03/19/2003 - added approved abbreviations, usable fields
   Version 1.2 - 03/20/2003 - streamlined the structure for easier maintenance
   Version 1.3 - 03/20/2003 - added email handling function
   Version 1.4 - 03/23/2003 - increased efficiency, email field handling
   Version 1.5 - 04/08/2003 - added country correction and c/o
   Version 1.6 - 04/08/2003 - refined country correction
   Version 1.7 - 04/18/2003 - restructured to handle Scottish 'Mac' names
   Version 1.8 - 04/26/2003 - added state name correction (2 char. only)

   Feature wishlist for next version(s):
    * parameter-driven selective correction (e.g. for Street_Address)
    * country selection upfront and form adjustment (incl. help & req.)
    * country dependent handling ZIP codes / Postal Codes
    * country dependent handling phone numbers (incl. country codes)
*/

// Hide JavaScript errors, due to browser incompatibility, etc.
// check correct syntax & effect before activating
//window.onerror() = revChange(frmObj,saveStr);

// set global variables
var saveString
//var inFldErr = "  *INCORRECT*" ;
var inFldErr = "*PLEASE RE-ENTER*  " ;

var ifeLen = inFldErr.length ;

var index;
var tmpStr;

// translate into US Postal Service abbreviations (see: http://www.usps.gov)
// BE CAREFUL: adding some translations might cause undesired effects
// e.g. translating 'La' into 'Ln' is undesired in 'La Sienega', etc.
var postalAbbr = new Array
  ("Avenue	Ave"
  ,"Av	Ave"
  ,"Boulevard	Blvd"
  ,"Bl	Blvd"
  ,"Circle	Cir"
  ,"Court	Ct"
  ,"Drive	Dr"
  ,"Expressway	Expy"
  ,"Expr Way	Expy"
  ,"Highway	Hwy"
  ,"Junction	Jct"
  ,"Lane	Ln"
  ,"Parkway	Pky"
  ,"Pkwy	Pky"
  ,"Place	Pl"
  ,"Road	Rd"
  ,"Station	Sta"
  ,"Square	Sq"
  ,"Sqr	Sq"
  ,"Sqre	Sq"
  ,"Street	St"
  ,"Terrace	Ter"
  ,"Terr	Ter"
  ,"Turnpike	Tpke"
  ,"North	N"
  ,"Northeast	NE"
  ,"East	E"
  ,"Southeast	SE"
  ,"South	S"
  ,"Southwest	SW"
  ,"West	W"
  ,"Northwest	NW"
  ,"Country Road	CR"
  ,"Farm Road	FM"
  ,"FR	FM"
  ,"Rural Road	RR"
  ,"Rural Route	RR"
  ,"Apartment	Apt"
  ,"Building	Bldg"
  ,"Department	Dept"
  ,"Suite	Ste"
  ,"Pob	PO Box"
  ,"C/o	c/o"
  );
var paArrCnt = 0;
var paArrLen = postalAbbr.length;
var paSplit;

// translate commonly used city abbreviations
var cityAbbr = new Array
  ("Okc	Oklahoma City"
  ,"Mwc	Midwest City"
  ,"Nyc	New York City"
  ,"Ny	New York City"
  ,"Kc	Kansas City"
  ,"La	Los Angeles"
  );
var caArrCnt = 0;
var caArrLen = cityAbbr.length;
var caSplit;

// translate commonly used country names
var countryAbbr = new Array
  ("United States	USA"
  ,"Us	USA"
  ,"Puerto Rico	USA [PR]"
  ,"United Kingdom	UK"
  ,"England	UK"
  ,"Scotland	UK"
  ,"Scottland	UK"
  ,"Wales	UK"
  ,"The Netherlands	Netherlands"
  ,"Netherland	Netherlands"
  ,"Nederland	Netherlands"
  ,"Holland	Netherlands"
  ,"Brasil	Brazil"
  );
var ccArrCnt = 0;
var ccArrLen = countryAbbr.length;
var ccSplit;

// set what entire words (abbreviations) should be capitalized
var addressCapAbbr = new Array
  ("NW","NE","SE","SW","PO","CR","FM","HC","RR","AFB","PMB");
var countryCapAbbr = new Array
  ("USA","UK","UAE");
var mrgCapAbbr = new Array;
mrgCapAbbr = addressCapAbbr.concat(countryCapAbbr);
var acArrLen = mrgCapAbbr.length;
var allCapAbbr = new Array;
// generate InitCapped and spaced version of known abbreviations
// make an array to save processing time later (saves time in bulk processing)
for (var acArrCnt = 0; acArrCnt < acArrLen; acArrCnt++) {
  var mrgCapStr = mrgCapAbbr[acArrCnt];
  var mrgCapLen = mrgCapStr.length;

  // generate spaced version of known abbreviations to concatinate
  var regCapStr = "";
  var spcCapStr = "";
  for (var mrgCapCnt = 0; mrgCapCnt < mrgCapLen; mrgCapCnt++) {
    var spcCapStr = ( spcCapStr + mrgCapStr.substr(mrgCapCnt,1) + " ");
  }
  regCapStr = mrgCapStr.substr(0,1).toUpperCase() + mrgCapStr.substr(1,mrgCapStr.length-1).toLowerCase() ;
  spcCapStr = spcCapStr.substr(0,spcCapStr.length-1) ;
  allCapAbbr = allCapAbbr.concat(mrgCapStr + "	" + regCapStr + "	" + spcCapStr);
}
var acArrLen = allCapAbbr.length;

// Function to correct input
function valString(frmObj) {

  saveString = frmObj.value;  // set as global variable

  var frmObjName = frmObj.name;

  var tmpChar;
  var preString;
  var postString;
  //var tmpStr = frmObj.value.toLowerCase() + " ";
  var tmpStr = " " + frmObj.value + " ";
  var strLen = tmpStr.length;

  if (strLen > 0)  {
    for (index = 0; index < strLen; index++)  {

      // Pre-InitCap Corrections
      // replace commas with an extra space
      if (tmpStr.substr(index,1) == ",") { tmpStr = tmpStr.substr(0,index) + " " + tmpStr.substr(index+1,strLen); }
      // remove periods
      if (tmpStr.substr(index,2) == ". ") { tmpStr = tmpStr.substr(0,index) + tmpStr.substr(index+1,strLen); }
      else if (tmpStr.substr(index,1) == ".") { tmpStr = tmpStr.substr(0,index) + " " + tmpStr.substr(index+1,strLen); }
      // remove space after number sign (#)
      if (tmpStr.substr(index,2) == "# ") { tmpStr = tmpStr.substr(0,index+1) + tmpStr.substr(index+2,strLen); }

      // Perform the InitCap ("changeCase")
      tmpChar = tmpStr.substr(index,1);
      preString = tmpStr.substr(0, index);
      postString = tmpStr.substr(index+1,strLen);

      if ((tmpStr.substr(index-1,1) == " "
        || tmpStr.substr(index-1,1) == "-") && index < (strLen-1))  {
        tmpChar = tmpChar.toUpperCase();
      }
      else if (tmpStr.substring(index-4,index) == " Mac") {
	// the name could be regular (e.g. Mack) or Scottish (e.g. MacArthur)
        // keep original case of the 4th character to prevent accidental change
      }
      else {
        tmpChar = tmpChar.toLowerCase();
      }
      tmpStr = preString + tmpChar + postString;
    }

    var newLen = tmpStr.length;
    for (index = 0; index < newLen; index++)  {
      preString = tmpStr.substring(0, index+1);

      // Post-InitCap Corrections
      // next test covers fldStreetAddress1, fldStreet_Address2, etc.
      if ( (frmObjName.substr(0,14) == "Street_Address")
        || (frmObjName.substr(0,16) == "fldStreetAddress") ) {
        // postal abbreviations
        for (paArrCnt = 0; paArrCnt < paArrLen; paArrCnt++) {
          paSplit=postalAbbr[paArrCnt].split("	");
          if (tmpStr.substr(index,paSplit[0].length+1) == paSplit[0] + " ") { tmpStr = tmpStr.substr(0,index) + paSplit[1] + tmpStr.substr(index+paSplit[0].length,newLen); }
        } // end of postal abbreviation correction loop
      } // end of Street_AddressX check

      if ( (frmObjName.substr(0,14) == "Street_Address")
        || (frmObjName.substr(0,16) == "fldStreetAddress")
        || (frmObjName == "Country") || (frmObjName == "Country_other")
        || (frmObjName == "fldCountry") ) {
        // All-Cap Abbreviation Correction
        for (var acArrCnt = 0; acArrCnt < acArrLen; acArrCnt++) {
          var allCapStr = allCapAbbr[acArrCnt];
          var allCapLen = allCapStr.length;

          // separate the components of the earlier generated array
	  var allCapSplit = allCapStr.split("	");
          var regCapStr = allCapSplit[1];
          var regCapLen = regCapStr.length;
          var spcCapStr = allCapSplit[2];
          var spcCapLen = spcCapStr.length;

          // do the actual check and correction
          if (tmpStr.substr(index,regCapLen+1) == regCapStr + " ") {
	    tmpStr = preString.substr(0,preString.length-1) + regCapStr.toUpperCase() + " " + tmpStr.substr(index+regCapLen+1,newLen);
	  }
          else if (tmpStr.substr(index,spcCapLen+1).toUpperCase() == spcCapStr.toUpperCase() + " ") {
	    tmpStr = preString.substr(0,preString.length-1) + regCapStr.toUpperCase() + " " + tmpStr.substr(index+spcCapLen+1,newLen);
	  }
	} // end of all-cap abbreviation correction loop
      } // end of Street_AddressX & Country check

      // next test covers fldCityName specific corrections
      if ( (frmObjName == "City")
        || (frmObjName == "fldCityName") ) {
        // expand names like OKC, MWC, etc.
        for (caArrCnt = 0; caArrCnt < caArrLen; caArrCnt++) {
          caSplit=cityAbbr[caArrCnt].split("	");
          if (tmpStr.substr(index,caSplit[0].length+1) == caSplit[0] + " ") { tmpStr = tmpStr.substr(0,index) + caSplit[1] + tmpStr.substr(index+caSplit[0].length,newLen); }
        } // end of city name expansion loop
      } // end of City check

      // next test covers fldCountry specific corrections
      if ( (frmObjName == "Country") || (frmObjName == "Country_other")
        || (frmObjName == "fldCountry") ) {
        // corrects country names
        for (ccArrCnt = 0; ccArrCnt < ccArrLen; ccArrCnt++) {
          ccSplit=countryAbbr[ccArrCnt].split("	");
          if (tmpStr.substr(index,ccSplit[0].length+1) == ccSplit[0] + " ") { tmpStr = tmpStr.substr(0,index) + ccSplit[1] + tmpStr.substr(index+ccSplit[0].length,newLen); }
        } // end of country name expansion loop
      } // end of Country check

      // capitalize 3rd character in Scottish & Irish names
      if (tmpStr.substr(index,2) == "Mc") { tmpStr = preString + tmpStr.substr(index+1,1) + tmpStr.substr(index+2,1).toUpperCase() + tmpStr.substr(index+3,newLen); }
      if (tmpStr.substr(index,2) == "O'") { tmpStr = preString + tmpStr.substr(index+1,1) + tmpStr.substr(index+2,1).toUpperCase() + tmpStr.substr(index+3,newLen); }

    } // end of main for-loop

  } // end of non-empty string check

  // next test covers fldState specific corrections
  if ( (frmObjName == "State") || (frmObjName == "State_other")
    || (frmObjName == "fldState") ) {
    // corrects state names: limited correction
    // capitalize only when 2 character or less, most likely an abbreviation
    // (check for length of 4 characters, because of embedding spaces)
    if (tmpStr.length <= 4) { tmpStr = tmpStr.toUpperCase() } ;
  } // end of State check

  frmObj.value = tmpStr.substring(1,tmpStr.length-1);
}

// Function to check the validity of email addresses
function valEmail(frmObj) {
  var emailStr = frmObj.value ;
  var emailLen = emailStr.length ;
  // double-check that this is the right field and is not empty
  if ( (frmObj.name == "fldEmail"
     || frmObj.name == "email") && (emailStr.length > 0) ) {

    // correct email address to lower case if entered in all caps.
    if (emailStr == emailStr.toUpperCase() ) { emailStr = emailStr.toLowerCase(); }

    // correct email address to lower case if entered in all caps.
    if ( (emailStr.toLowerCase() == "none")
      || (emailStr.toLowerCase() == "n/a")
      || (emailStr.toLowerCase() == "n.a.")
      || (emailStr.toLowerCase() == "n a ")
      || (emailStr.toLowerCase() == "n a")
      || (emailStr.toLowerCase() == "na.")
      || (emailStr.toLowerCase() == "na") ) { emailStr = ""; }

    // correct the most common incomplete email addresses
    var domErr = new Array
      ("aol.com","msn.com","hotmail.com","yahoo.com","juno.com","netzero.net","netzero.com","sbcglobal.net","mmcable.com");
    for (var domCnt=0; domCnt<domErr.length; domCnt++) {
      var domSplit = domErr[domCnt].split(".");
      var domLen = domSplit[0].length;
      var tldLen = domSplit[1].length;
      // correct missing TLD name & missing dot in domain
      if (emailStr.substr(emailLen-domLen-1,domLen+1).toLowerCase() == "@" + domSplit[0] ) { emailStr = emailStr + "." + domSplit[1]; }
      else if (emailStr.substr(emailLen-domLen-tldLen-1,domLen+tldLen+1).toLowerCase() == "@" + domSplit[0] + domSplit[1] ) { emailStr = emailStr.substr(0,emailLen-tldLen) + "." + domSplit[1]; }
    }

    if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(emailStr)){
      frmObj.value = emailStr ;
      //return (true);
    }
    else if (emailStr == "") {
      frmObj.value = emailStr ;
    }
    else {
      //alert("Invalid E-mail Address! Please re-enter.");
      //frmObj.value =  emailStr + inFldErr ;
      frmObj.value =  inFldErr + emailStr;
      //frmObj.value = "" ;
      //return (false);
    }
  }
}

// Function to remove in-field error message from field onFocus
function remErrMsg(frmObj) {
  var fldStr = frmObj.value ;
  var fldLen = fldStr.length ;
  // if ( fldStr.substr(fldLen-ifeLen,fldLen) == inFldErr ) {
  //  frmObj.value = fldStr.substr(0,fldLen-ifeLen) ;
  // } // end of error message on the back of the wrong input
  if ( fldStr.substr(0,ifeLen) == inFldErr ) {
   frmObj.value = fldStr.substr(ifeLen,fldLen-ifeLen) ;
  } // end of error message in front of the wrong input
}

// Function to reverse changes in case of an error (onError)
function revChange(frmObj,saveString) {
  frmObj.value = saveString;
  return true;
}

// trap right click to limit access to source code
function right(e) {
if (navigator.appName == 'Netscape' && 
(e.which > 1))
return false;
else if (navigator.appName == 'Microsoft Internet Explorer' && 
(event.button > 1)) {
//alert("No menu available for this page.");  // trap disabled
return false;
}
return true;
}

document.onmousedown=right;
document.onmouseup=right;
if (document.layers) window.captureEvents(Event.MOUSEDOWN);
if (document.layers) window.captureEvents(Event.MOUSEUP);
window.onmousedown=right;
window.onmouseup=right;


//  End -->
