//------------+
//  Overview  |
//------------+

// <<< General >>>
//
//   Author: Sean Mlinscek <sean.mlinscek@stryker.com>
//   Date:   2004.05.04


// <<< Changelog >>>
//      2004.09.28 - Added emailCheck function. 


//----------------------------------------
// <void> emailCheck()
//----------------------------------------
// - Description:
//   Checks to see if an email address is filled
//      in correctly within a form. 
//
// - Returns: None
//
// - Parameters: 
//      1. formField - The form field the function is checking
//      2. formName - The name of the form the field above is 
//      associated with.
//
// - Details:
//     This script and many more are available free online at
//     The JavaScript Source!! http://javascript.internet.com
//     
//     V1.1.3: Sandeep V. Tamhankar (stamhankar@hotmail.com)
//     Original:  Sandeep V. Tamhankar (stamhankar@hotmail.com)
//
// - Changelog:
//     1.1.5 - (2004.09.28): Added formField and formName parameters so when
//     a user incorrectly enters an email address they will be 
//     redirected back to the Email Address form field.
//
//     1.1.4: Fixed a bug where upper ASCII characters (i.e. accented letters
//     international characters) were allowed.
//
//     1.1.3: Added the restriction to only accept addresses ending in two
//     letters (interpreted to be a country code) or one of the known
//     TLDs (com, net, org, edu, int, mil, gov, arpa), including the
//     new ones (biz, aero, name, coop, info, pro, museum).  One can
//     easily update the list (if ICANN adds even more TLDs in the
//     future) by updating the knownDomsPat variable near the
//     top of the function.  Also, I added a variable at the top
//     of the function that determines whether or not TLDs should be
//     checked at all.  This is good if you are using this function
//     internally (i.e. intranet site) where hostnames don't have to 
//     conform to W3C standards and thus internal organization e-mail
//     addresses don't have to either.
//     Changed some of the logic so that the function will work properly
//     with Netscape 6.
//        
//     1.1.2: Fixed a bug where trailing . in e-mail address was passing
//     (the bug is actually in the weak regexp engine of the browser; I
//     simplified the regexps to make it work).
//     
//     1.1.1: Removed restriction that countries must be preceded by a domain,
//     so abc@host.uk is now legal.  However, there's still the 
//     restriction that an address must end in a two or three letter
//     word.
//       
//     1.1: Rewrote most of the function to conform more closely to RFC 822.
//     
//     1.0: Original  
//
function emailCheck (formField,formName) {
   var emailStr = eval("window.document."+formName+"."+formField+".value");
   var showFocus = "window.document."+formName+"."+formField+".focus();";

   /* 
      The following variable tells the rest of the function whether or not
      to verify that the address ends in a two-letter country or well-known
      TLD.  1 means check it, 0 means don't. 
   */
   var checkTLD=1;

   // The following is the list of known TLDs that an e-mail address must end with.
   var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;

   /* 
      The following pattern is used to check if the entered e-mail address
      fits the user@domain format.  It also is used to separate the username
      from the domain. 
   */
   var emailPat=/^(.+)@(.+)$/;

   /* 
      The following string represents the pattern for matching all special
      characters.  We don't want to allow special characters in the address. 
      These characters include ( ) < > @ , ; : \ " . [ ] 
   */
   var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
  
   /* 
      The following string represents the range of characters allowed in a 
      username or domainname.  It really states which chars aren't allowed.
   */
   var validChars="\[^\\s" + specialChars + "\]";

   /* 
      The following pattern applies if the "user" is a quoted string (in
      which case, there are no rules about which characters are allowed
      and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
      is a legal e-mail address. 
   */
   var quotedUser="(\"[^\"]*\")";

   /* 
      The following pattern applies for domains that are IP addresses,
      rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
      e-mail address. NOTE: The square brackets are required. 
   */
   var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;

   // The following string represents an atom (basically a series of non-special characters.)
   var atom=validChars + '+';

   /* 
      The following string represents one word in the typical username.
      For example, in john.doe@somewhere.com, john and doe are words.
      Basically, a word is either an atom or quoted string. 
   */
   var word="(" + atom + "|" + quotedUser + ")";

   // The following pattern describes the structure of the user
   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");

   /* 
      The following pattern describes the structure of a normal symbolic
      domain, as opposed to ipDomainPat, shown above. 
   */
   var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

   /* Finally, let's start trying to figure out if the supplied address is valid. */
   /* 
      Begin with the coarse pattern to simply break up user@domain into
      different pieces that are easy to analyze. 
   */
   var matchArray=emailStr.match(emailPat);

   if (matchArray==null) {
      /* 
         Too many/few @'s or something; basically, this address doesn't
         even fit the general mould of a valid e-mail address. 
      */
      alert("Please enter a valid Email Address. (check @ and .)");
      eval(showFocus);
      return false;
   }
         
   var user=matchArray[1];
   var domain=matchArray[2];

   // Start by checking that only basic ASCII characters are in the strings (0-127).
   for (i=0; i<user.length; i++) {
      if (user.charCodeAt(i)>127) {
         alert("The Email Address\' username contains invalid characters.");
         eval(showFocus);
         return false;
      }
   }
   for (i=0; i<domain.length; i++) {
      if (domain.charCodeAt(i)>127) {
         alert("The Email Address\' domain name contains invalid characters.");
         eval(showFocus);
         return false;
      }
   }

   // See if "user" is valid 
   if (user.match(userPat)==null) {
      // user is not valid
      alert("The Email Address\' username is not valid.");
      eval(showFocus);
      return false;
   }
 
   /* 
      if the e-mail address is at an IP address (as opposed to a symbolic
      host name) make sure the IP address is valid. 
   */
   var IPArray=domain.match(ipDomainPat);
   if (IPArray!=null) {
      // this is an IP address
      for (var i=1;i<=4;i++) {
         if (IPArray[i]>255) {
            alert("The Email Address\' Destination IP address is invalid!");
            eval(showFocus);
            return false;
         }
      }
      return true;
   }
 
   // Domain is symbolic name.  Check if it's valid.
   var atomPat=new RegExp("^" + atom + "$");
   var domArr=domain.split(".");
   var len=domArr.length;
   for (i=0;i<len;i++) {
     if (domArr[i].search(atomPat)==-1) {
         alert("The Email Address\' domain name is not valid.");
         eval(showFocus);
         return false;
      }
   }
 
   /* 
      domain name seems valid, but now make sure that it ends in a
      known top-level domain (like com, edu, gov) or a two-letter word,
      representing country (uk, nl), and that there's a hostname preceding 
      the domain or country. 
   */
   if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
      alert("The Email Address must end in a well-known domain or two letter " + "country.");
      eval(showFocus);
      return false;
   }
 
   // Make sure there's a host name preceding the domain.
   if (len<2) {
      alert("The Email Address is missing a hostname.");
      eval(showFocus);
      return false;
   }

   // If we've gotten this far, everything's valid!
   return true;
}


//----------------------------------------
// <void> formValidation()
//----------------------------------------
// - Description:
//   Checks to see if a required form field is filled. 
//
// - Returns: None
//
// - Parameters:
//
// - Details:
//
// - Changelog:
//   Version 1.0 (2004.05.04)
//    - Initial function documentation (Sean Mlinscek - sean.mlinscek@stryker.com)
//
function formValidation(formType,formField,formAlert,formName,formCount,formValue){
   var ifStatement;
   var showFocus;
   var undefined; 

    if (formValue == undefined){
       formValue = "";
    }

   if(formType == "text"){
      ifStatement = "window.document."+formName+"."+formField+".value == ''";
      showFocus = "window.document."+formName+"."+formField+".focus();";
   }else if(formType == "select"){
      ifStatement = "document.forms['"+formName+"']."+formField+".options[document.forms['"+formName+"']."+formField+".selectedIndex].value == '"+formValue+"'"; 
      showFocus = "document.forms['"+formName+"']."+formField+".focus();";      
   }else if(formType == "radio"){
      ifStatement = "";
      for(var i = 0; i <= formCount; i++){
         if(i == formCount){
            ifStatement += "(window.document."+formName+"."+formField+"["+i+"].checked == false)"; 
         }else{
            ifStatement += "(window.document."+formName+"."+formField+"["+i+"].checked == false) &&"; 
         }
      }
      showFocus = "window.document."+formName+"."+formField+"[0].focus();";
   }

   if (eval(ifStatement)){
      alert(formAlert);
      eval(showFocus);
      return false;
   }else{
      return true;
   }
}

//----------------------------------------
// <void> showHiddenFields()
//----------------------------------------
// - Description:
//   Hides or Unhides form fields based on event 
//
// - Returns: None
//
// - Parameters:
//
// - Details:
//
// - Changelog:
//     1.1.5 - (2004.10.06): Fixed the if statement which handles the hiding/unhiding
//     of the content.
//
//   Version 1.0 (2004.05.04)
//    - Initial function documentation (Sean Mlinscek - sean.mlinscek@stryker.com)
//
function showHiddenFields(formName,formType,formField,divID,divIDAlt,formValue){
   var ifStatement;      

   if(formType == "radio"){
      ifStatement = "document."+formName+"."+formField+".checked == true";
   }else if(formType == "checkbox"){
      ifStatement = "document."+formName+"."+formField+".selected == true";
   }else{
      ifStatement = "document.forms['"+formName+"']."+formField+".options[document.forms['"+formName+"']."+formField+".selectedIndex].value == '"+formValue+"'"; 
   }

   browser = navigator.appName;
   browserNum = parseInt(navigator.appVersion);

   if ((browser == "Netscape") && (browserNum < 5)){
      layerRef = "document.layers['";
      endLayerRef = "']";
      styleRef = "";
      attribute = ".visibility";
      notVisible = "hide";
      visible = "show";
   }else if ((browser == "Netscape") && (browserNum >= 5)){
	  layerRef = "window.document.getElementById('";
      styleRef = ".style";
      attribute = ".display";
      endLayerRef = "')";
      notVisible = "none";
      visible = "inline";
   }else{
      layerRef = "document.all['";
      endLayerRef = "']";
      styleRef = ".style";
      attribute = ".display";
      notVisible = "none";
      visible = "inline";   
   }

   if (eval(ifStatement)){
      eval(layerRef + divID + endLayerRef + styleRef + attribute + " = '" + visible + "'");
      if(divIDAlt){
         eval(layerRef + divIDAlt + endLayerRef + styleRef + attribute + " = '" + notVisible + "'"); 
     }       
   }else{
      eval(layerRef + divID + endLayerRef + styleRef + attribute + " = '" + notVisible + "'");
      if(divIDAlt){
         eval(layerRef + divIDAlt + endLayerRef + styleRef + attribute + " = '" + visible + "'"); 
      }
   }
}

//----------------------------------------
// <void> displayFlash()
//----------------------------------------
// - Description:
//   Displays Macromedia Flash movie if Flash Player is installed.  Displays
//  alternatively specified content if Flash Player is not installed.
//
// - Returns: None
//
// - Parameters:
//
// - Details:
//
// - Changelog:
//
//   Version 1.0 (2004.08.12)
//    - Initial function documentation (Sean Mlinscek - sean.mlinscek@stryker.com)
//
function displayFlash(){
   var flashinstalled = 0;
   if (navigator.plugins && navigator.plugins.length){
      x = navigator.plugins["Shockwave Flash"];
      if(x){
         flashinstalled = 2;  //installed             
      }else{
         flashinstalled = 1; //not installed
      }
      if(navigator.plugins["Shockwave Flash 2.0"]){
         flashinstalled = 2; //installed
      }
   }else if(navigator.mimeTypes && navigator.mimeTypes.length){
      x = navigator.mimeTypes['application/x-shockwave-flash'];
      if (x && x.enabledPlugin){
         flashinstalled = 2; //installed
      }else{
         flashinstalled = 1; //not installed
      }
   }else{
      //Detect IE
      for(var i=7; i>0; i=i-1){
         try{
            var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
            flashinstalled = 2; //installed
            break;
         }catch(e){
         }
      }
   }      
            
   //not installed
   if (flashinstalled == 0 || flashinstalled ==1){
      return false;
   } else {
      return true; //installed
   }
}

var win= null;
function NewWindow(mypage,myname,w,h,scroll){
   var winl = (screen.width-w)/2;
   var wint = (screen.height-h)/2;
   var settings  ='height='+h+',';

   settings +='width='+w+',';
   settings +='top='+wint+',';
   settings +='left='+winl+',';
   settings +='scrollbars='+scroll+',';
   settings +='resizable=yes';

   win=window.open(mypage,myname,settings);
   if(parseInt(navigator.appVersion) >= 4){win.window.focus();}
}

//----------------------------------------
//  <object> getXmlHttpObject()
//----------------------------------------
// - Description:
//        Creates an XMLHTTP object depending on what browser you use.
//
// - Returns:
//        XMLHTTP object
//
// - Parameters:
//        N/A
//
// - Details:
//       Attempts to create an XMLHTTP object.  If your browser does not support
//       this, null will be returned.
//
// - Changelog:
//       Author: Sean Mlinscek <sean.mlinscek@stryker.com>
//       Date:   03/14/07 5:31 p.m.
//       Change: Initial documentation.
//
function getXmlHttpObject() {
   var xmlHttp = null;

   try {
      // Firefox, Opera 8.0+, Safari
      xmlHttp = new XMLHttpRequest();
   } catch (e) {
      // Internet Explorer
      try {
		 xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
     } catch (e) {
         xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
   }

   return xmlHttp;
}