 /*$RCSfile: validateFloatRange.js,v $ $Revision: 1.9 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are in a valid float range.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateFloatRange(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 

      oRange = eval('new ' + formName.value + '_floatRange()');
      for (x in oRange) {
          var field = form[oRange[x][0]];
          
          if ((field.type == 'hidden' ||
              field.type == 'text' || field.type == 'textarea') &&
              (field.value.length > 0)  &&
               field.disabled == false) {
      
              var fMin = parseFloat(oRange[x][2]("min"));
              var fMax = parseFloat(oRange[x][2]("max"));
              var fValue = parseFloat(field.value);
              if (!(fValue >= fMin && fValue <= fMax)) {
                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oRange[x][1];
                  isValid = false;
              }
          }
      }
      if (fields.length > 0) {
          focusField.focus();
          alert(fields.join('\n'));
      }
      return isValid;
  }

  /*$RCSfile: validateUtilities.js,v $ $Revision: 1.2 $ $Date: 2004/03/28 16:53:21 $ */

/**
* This is a place holder for common utilities used across the javascript validation
*
**/


  /*$RCSfile: validateByte.js,v $ $Revision: 1.9 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid byte.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateByte(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 
      oByte = eval('new ' + formName.value + '_ByteValidations()');

      for (x in oByte) {
          var field = form[oByte[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea' ||
              field.type == 'select-one' ||
              field.type == 'radio')  &&
              field.disabled == false) {

              var value = '';
              // get field's value
              if (field.type == "select-one") {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              } else {
                  value = field.value;
              }

              if (value.length > 0) {
                  if (!isAllDigits(value)) {
                      bValid = false;
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oByte[x][1];

                  } else {

                      var iValue = parseInt(value);
                      if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
                          if (i == 0) {
                              focusField = field;
                          }
                          fields[i++] = oByte[x][1];
                          bValid = false;
                      }
                  }
              }

          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return bValid;
  }


  /*$RCSfile: validateMaxLength.js,v $ $Revision: 1.10 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * A field is considered valid if less than the specified maximum.
  * Fields are not checked if they are disabled.
  * <p>
  * <strong>Caution:</strong> Using <code>validateMaxLength</code> on a password field in a 
  *  login page gives unnecessary information away to hackers. While it only slightly
  *  weakens security, we suggest using it only when modifying a password.</p>
  * @param form The form validation is taking place on.
  */
  function validateMaxLength(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 

      oMaxLength = eval('new ' + formName.value + '_maxlength()');        
      for (x in oMaxLength) {
          var field = form[oMaxLength[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'password' ||
              field.type == 'textarea') &&
              field.disabled == false) {

              var iMax = parseInt(oMaxLength[x][2]("maxlength"));
              if (field.value.length > iMax) {
                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oMaxLength[x][1];
                  isValid = false;
              }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return isValid;
  }


  /*$RCSfile: validateRequired.js,v $ $Revision: 1.13 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  *  Check to see if fields must contain a value.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */

  function validateRequired(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name");

      oRequired = eval('new ' + formName.value + '_required()');

      for (x in oRequired) {
          var field = form[oRequired[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea' ||
              field.type == 'file' ||
              field.type == 'checkbox' ||
              field.type == 'select-one' ||
              field.type == 'password') &&
              field.disabled == false) {

              var value = '';
              // get field's value
              if (field.type == "select-one") {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              } else if (field.type == 'checkbox') {
                  if (field.checked) {
                      value = field.value;
                  }
              } else {
                  value = field.value;
              }

              if (trim(value).length == 0) {

                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oRequired[x][1];
                  isValid = false;
              }
          } else if (field.type == "select-multiple") { 
              var numOptions = field.options.length;
              lastSelected=-1;
              for(loop=numOptions-1;loop>=0;loop--) {
                  if(field.options[loop].selected) {
                      lastSelected = loop;
                      value = field.options[loop].value;
                      break;
                  }
              }
              if(lastSelected < 0 || trim(value).length == 0) {
                  if(i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oRequired[x][1];
                  isValid=false;
              }
          } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
              isChecked=-1;
              for (loop=0;loop < field.length;loop++) {
                  if (field[loop].checked) {
                      isChecked=loop;
                      break; // only one needs to be checked
                  }
              }
              if (isChecked < 0) {
                  if (i == 0) {
                      focusField = field[0];
                  }
                  fields[i++] = oRequired[x][1];
                  isValid=false;
              }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return isValid;
  }
  
  // Trim whitespace from left and right sides of s.
  function trim(s) {
      return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
  }


  /*$RCSfile: validateInteger.js,v $ $Revision: 1.9 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid integer.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateInteger(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 

      oInteger = eval('new ' + formName.value + '_IntegerValidations()');
      for (x in oInteger) {
          var field = form[oInteger[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea' ||
              field.type == 'select-one' ||
              field.type == 'radio') &&
              field.disabled == false) {

              var value = '';
              // get field's value
              if (field.type == "select-one") {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              } else {
                  value = field.value;
              }

              if (value.length > 0) {

                  if (!isAllDigits(value)) {
                      bValid = false;
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oInteger[x][1];

                  } else {
                      var iValue = parseInt(value);
                      if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                          if (i == 0) {
                              focusField = field;
                          }
                          fields[i++] = oInteger[x][1];
                          bValid = false;
                     }
                 }
             }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return bValid;
  }

  function isAllDigits(argvalue) {
      argvalue = argvalue.toString();
      var validChars = "0123456789";
      var startFrom = 0;
      if (argvalue.substring(0, 2) == "0x") {
         validChars = "0123456789abcdefABCDEF";
         startFrom = 2;
      } else if (argvalue.charAt(0) == "0") {
         validChars = "01234567";
         startFrom = 1;
      } else if (argvalue.charAt(0) == "-") {
          startFrom = 1;
      }

      for (var n = startFrom; n < argvalue.length; n++) {
          if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
      }
      return true;
  }


  /*$RCSfile: validateCreditCard.js,v $ $Revision: 1.8 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid creditcard number based on Luhn checksum.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateCreditCard(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name");

      oCreditCard = eval('new ' + formName.value + '_creditCard()');

      for (x in oCreditCard) {
          if ((form[oCreditCard[x][0]].type == 'text' ||
               form[oCreditCard[x][0]].type == 'textarea') &&
              (form[oCreditCard[x][0]].value.length > 0)  &&
               form[oCreditCard[x][0]].disabled == false) {
              if (!luhnCheck(form[oCreditCard[x][0]].value)) {
                  if (i == 0) {
                      focusField = form[oCreditCard[x][0]];
                  }
                  fields[i++] = oCreditCard[x][1];
                  bValid = false;
              }
          }
      }
      if (fields.length > 0) {
          focusField.focus();
          alert(fields.join('\n'));
      }
      return bValid;
  }

  /**
   * Checks whether a given credit card number has a valid Luhn checksum.
   * This allows you to spot most randomly made-up or garbled credit card numbers immediately.
   * Reference: http://www.speech.cs.cmu.edu/~sburke/pub/luhn_lib.html
   */
  function luhnCheck(cardNumber) {
      if (isLuhnNum(cardNumber)) {
          var no_digit = cardNumber.length;
          var oddoeven = no_digit & 1;
          var sum = 0;
          for (var count = 0; count < no_digit; count++) {
              var digit = parseInt(cardNumber.charAt(count));
              if (!((count & 1) ^ oddoeven)) {
                  digit *= 2;
                  if (digit > 9) digit -= 9;
              };
              sum += digit;
          };
          if (sum == 0) return false;
          if (sum % 10 == 0) return true;
      };
      return false;
  }

  function isLuhnNum(argvalue) {
      argvalue = argvalue.toString();
      if (argvalue.length == 0) {
          return false;
      }
      for (var n = 0; n < argvalue.length; n++) {
          if ((argvalue.substring(n, n+1) < "0") ||
              (argvalue.substring(n,n+1) > "9")) {
              return false;
          }
      }
      return true;
  }


 /*$RCSfile: validateDate.js,v $ $Revision: 1.10 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid date.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateDate(form) {
     var bValid = true;
     var focusField = null;
     var i = 0;
     var fields = new Array();
     var formName = form.getAttributeNode("name"); 

     oDate = eval('new ' + formName.value + '_DateValidations()');

     for (x in oDate) {
         var field = form[oDate[x][0]];
         var value = field.value;
         var datePattern = oDate[x][2]("datePatternStrict");
         // try loose pattern
         if (datePattern == null)
             datePattern = oDate[x][2]("datePattern");
         if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea') &&
             (value.length > 0) && (datePattern.length > 0) &&
              field.disabled == false) {
               var MONTH = "MM";
               var DAY = "dd";
               var YEAR = "yyyy";
               var orderMonth = datePattern.indexOf(MONTH);
               var orderDay = datePattern.indexOf(DAY);
               var orderYear = datePattern.indexOf(YEAR);
               if ((orderDay < orderYear && orderDay > orderMonth)) {
                   var iDelim1 = orderMonth + MONTH.length;
                   var iDelim2 = orderDay + DAY.length;
                   var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                   var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                   if (iDelim1 == orderDay && iDelim2 == orderYear) {
                      dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                   } else if (iDelim1 == orderDay) {
                      dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                   } else if (iDelim2 == orderYear) {
                      dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                   } else {
                      dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                   }
                   var matched = dateRegexp.exec(value);
                   if(matched != null) {
                      if (!isValidDate(matched[2], matched[1], matched[3])) {
                         if (i == 0) {
                             focusField = field;
                         }
                         fields[i++] = oDate[x][1];
                         bValid =  false;
                      }
                   } else {
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oDate[x][1];
                      bValid =  false;
                   }
               } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                   var iDelim1 = orderDay + DAY.length;
                   var iDelim2 = orderMonth + MONTH.length;
                   var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                   var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                   if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                       dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                   } else if (iDelim1 == orderMonth) {
                       dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                   } else if (iDelim2 == orderYear) {
                       dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                   } else {
                       dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                   }
                   var matched = dateRegexp.exec(value);
                   if(matched != null) {
                       if (!isValidDate(matched[1], matched[2], matched[3])) {
                           if (i == 0) {
                       focusField = field;
                           }
                           fields[i++] = oDate[x][1];
                           bValid =  false;
                        }
                   } else {
                       if (i == 0) {
                           focusField = field;
                       }
                       fields[i++] = oDate[x][1];
                       bValid =  false;
                   }
               } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                   var iDelim1 = orderYear + YEAR.length;
                   var iDelim2 = orderMonth + MONTH.length;
                   var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                   var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                   if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                       dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                   } else if (iDelim1 == orderMonth) {
                       dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                   } else if (iDelim2 == orderDay) {
                       dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                   } else {
                       dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                   }
                   var matched = dateRegexp.exec(value);
                   if(matched != null) {
                       if (!isValidDate(matched[3], matched[2], matched[1])) {
                           if (i == 0) {
                               focusField = field;
                           }
                           fields[i++] = oDate[x][1];
                           bValid =  false;
                       }
                   } else {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oDate[x][1];
                        bValid =  false;
                   }
               } else {
                   if (i == 0) {
                       focusField = field;
                   }
                   fields[i++] = oDate[x][1];
                   bValid =  false;
               }
        }
     }
     if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
     }
     return bValid;
  }
  
  function isValidDate(day, month, year) {
   if (month < 1 || month > 12) {
          return false;
      }
      if (day < 1 || day > 31) {
          return false;
      }
      if ((month == 4 || month == 6 || month == 9 || month == 11) &&
          (day == 31)) {
          return false;
      }
      if (month == 2) {
          var leap = (year % 4 == 0 &&
             (year % 100 != 0 || year % 400 == 0));
          if (day>29 || (day == 29 && !leap)) {
              return false;
          }
      }
      return true;
  }


  /*$RCSfile: validateIntRange.js,v $ $Revision: 1.10 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields is in a valid integer range.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateIntRange(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 

      oRange = eval('new ' + formName.value + '_intRange()');        
      for (x in oRange) {
          var field = form[oRange[x][0]];
          if (field.disabled == false)  {
              var value = '';
              if (field.type == 'hidden' ||
                  field.type == 'text' || field.type == 'textarea' ||
                  field.type == 'radio' ) {
                  value = field.value;
              }
              if (field.type == 'select-one') {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              }
              if (value.length > 0) {
                  var iMin = parseInt(oRange[x][2]("min"));
                  var iMax = parseInt(oRange[x][2]("max"));
                  var iValue = parseInt(value);
                  if (!(iValue >= iMin && iValue <= iMax)) {
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oRange[x][1];
                      isValid = false;
                  }
              }
          }
      }
      if (fields.length > 0) {
          focusField.focus();
          alert(fields.join('\n'));
      }
      return isValid;
  }


  /*$RCSfile: validateShort.js,v $ $Revision: 1.9 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  *  Check to see if fields are a valid short.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateShort(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name");

      oShort = eval('new ' + formName.value + '_ShortValidations()');

      for (x in oShort) {
          var field = form[oShort[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea' ||
              field.type == 'select-one' ||
              field.type == 'radio')  &&
              field.disabled == false) {

              var value = '';
              // get field's value
              if (field.type == "select-one") {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              } else {
                  value = field.value;
              }

              if (value.length > 0) {
                  if (!isAllDigits(value)) {
                      bValid = false;
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oShort[x][1];

                  } else {

                      var iValue = parseInt(value);
                      if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
                          if (i == 0) {
                              focusField = field;
                          }
                          fields[i++] = oShort[x][1];
                          bValid = false;
                      }
                 }
             }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return bValid;
  }


  /*$RCSfile: validateFloat.js,v $ $Revision: 1.11 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid float.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateFloat(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
       var formName = form.getAttributeNode("name");

      oFloat = eval('new ' + formName.value + '_FloatValidations()');
      for (x in oFloat) {
      	var field = form[oFloat[x][0]];
      	
          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'textarea' ||
              field.type == 'select-one' ||
              field.type == 'radio') &&
              field.disabled == false) {
      
          	var value = '';
              // get field's value
              if (field.type == "select-one") {
                  var si = field.selectedIndex;
                  if (si >= 0) {
                      value = field.options[si].value;
                  }
              } else {
                  value = field.value;
              }
      
              if (value.length > 0) {
                  // remove '.' before checking digits
                  var tempArray = value.split('.');
                  //Strip off leading '0'
                  var zeroIndex = 0;
                  var joinedString= tempArray.join('');
                  while (joinedString.charAt(zeroIndex) == '0') {
                      zeroIndex++;
                  }
                  var noZeroString = joinedString.substring(zeroIndex,joinedString.length);

                  if (!isAllDigits(noZeroString)) {
                      bValid = false;
                      if (i == 0) {
                          focusField = field;
                      }
                      fields[i++] = oFloat[x][1];

                  } else {
               var iValue = parseFloat(value);
               if (isNaN(iValue)) {
                   if (i == 0) {
                       focusField = field;
                   }
                   fields[i++] = oFloat[x][1];
                   bValid = false;
               }
                  }
              }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return bValid;
  }


 /*$RCSfile: validateEmail.js,v $ $Revision: 1.9 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid email address.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateEmail(form) {
      var bValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name");


      oEmail = eval('new ' + formName.value + '_email()');

      for (x in oEmail) {
          var field = form[oEmail[x][0]];
          if ((field.type == 'hidden' || 
               field.type == 'text' ||
               field.type == 'textarea') &&
              (field.value.length > 0) &&
              field.disabled == false) {
              if (!checkEmail(field.value)) {
                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oEmail[x][1];
                  bValid = false;
              }
          }
      }
      if (fields.length > 0) {
          focusField.focus();
          alert(fields.join('\n'));
      }
      return bValid;
  }

  /**
   * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
   * http://javascript.internet.com
   */
  function checkEmail(emailStr) {
     if (emailStr.length == 0) {
         return true;
     }
     var emailPat=/^(.+)@(.+)$/;
     var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
     var validChars="\[^\\s" + specialChars + "\]";
     var quotedUser="(\"[^\"]*\")";
     var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
     var atom=validChars + '+';
     var word="(" + atom + "|" + quotedUser + ")";
     var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
     var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
     var matchArray=emailStr.match(emailPat);
     if (matchArray == null) {
         return false;
     }
     var user=matchArray[1];
     var domain=matchArray[2];
     if (user.match(userPat) == null) {
         return false;
     }
     var IPArray = domain.match(ipDomainPat);
     if (IPArray != null) {
         for (var i = 1; i <= 4; i++) {
            if (IPArray[i] > 255) {
               return false;
            }
         }
         return true;
     }
     var domainArray=domain.match(domainPat);
     if (domainArray == null) {
         return false;
     }
     var atomPat=new RegExp(atom,"g");
     var domArr=domain.match(atomPat);
     var len=domArr.length;
     if ((domArr[domArr.length-1].length < 2) ||
         (domArr[domArr.length-1].length > 3)) {
         return false;
     }
     if (len < 2) {
         return false;
     }
     return true;
  }




  /*$RCSfile: validateMask.js,v $ $Revision: 1.10 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * Check to see if fields are a valid using a regular expression.
  * Fields are not checked if they are disabled.
  * <p>
  * @param form The form validation is taking place on.
  */
  function validateMask(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name"); 

      oMasked = eval('new ' + formName.value + '_mask()');      
      for (x in oMasked) {
          var field = form[oMasked[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
               field.type == 'textarea' ||
		 field.type == 'file') &&
               (field.value.length > 0) &&
               field.disabled == false) {

              if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oMasked[x][1];
                  isValid = false;
              }
          }
      }

      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return isValid;
  }

  function matchPattern(value, mask) {
     return mask.exec(value);
  }


  /*$RCSfile: validateMinLength.js,v $ $Revision: 1.11 $ $Date: 2004/03/28 16:53:21 $ */
  /**
  * A field is considered valid if greater than the specified minimum.
  * Fields are not checked if they are disabled.
  * <p>
  * <strong>Caution:</strong> Using <code>validateMinLength</code> on a password field in a 
  *  login page gives unnecessary information away to hackers. While it only slightly
  *  weakens security, we suggest using it only when modifying a password.</p>
  * @param form The form validation is taking place on.
  */
  function validateMinLength(form) {
      var isValid = true;
      var focusField = null;
      var i = 0;
      var fields = new Array();
      var formName = form.getAttributeNode("name");


      oMinLength = eval('new ' + formName.value + '_minlength()');

      for (x in oMinLength) {
          var field = form[oMinLength[x][0]];

          if ((field.type == 'hidden' ||
              field.type == 'text' ||
              field.type == 'password' ||
              field.type == 'textarea') &&
              field.disabled == false) {

              var iMin = parseInt(oMinLength[x][2]("minlength"));
              if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                  if (i == 0) {
                      focusField = field;
                  }
                  fields[i++] = oMinLength[x][1];
                  isValid = false;
              }
          }
      }
      if (fields.length > 0) {
         focusField.focus();
         alert(fields.join('\n'));
      }
      return isValid;
  }
function mycalendar(elementId,dtDivId,ancId) {
	var dpDate = new DatePicker();			// create a new DatePicker object
   	dpDate.id = elementId;				// value control id in the html page
   	dpDate.overlayControls = null;	// comma seperated html elemet ids.
   	dpDate.month = currMonth;		// start month of the calendar
   	dpDate.year = currYear;				// start year of the calendar
   	dpDate.canvas = dtDivId;			// HTML div id which will be used to render the calendar
   	dpDate.format = "yyyy-mm-dd";			// date format
   	dpDate.anchor = ancId;			// HTML anchor id which invokes the popup.
   	//only fromDate and toDate can be selected
	//dpDate.fromDate = new Date("2004/Feb/12");	// Date a javascript date which month is in text format (yyyy/mmm/dd)
	//dpDate.toDate = new Date("2010/Feb/13");		// Date a javascript date which month is in text format (yyyy/mmm/dd)
	dpDate.initialize();
	return dpDate;				// finally call the initalize method of the created object
}						    	
// ---------- Start Customizable data for Calendar ( for internationalization/ Current Date ) ----------
var months = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];
var daysOfWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var todayCaption = "Today";
var currYear = (new Date()).getFullYear();
var currMonth = ((new Date()).getMonth())+1;
var currDate = (new Date()).getDate();// Assign client date. To use server date, set the server date here using server script.
// ---------- Newly Added -------------- 
var weekStartDay = 1;          // To start Calendar from Sunday : 0, Monday : 1 etc 
var nonWorkingDays = "6,0";    // To mark non-working days Saturdays : 6, Sundays : 0

//static code begin here
var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var leapMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var activeDp = null;
var mousePressed = false;
var calenderBuilding = false;

// capture the mouse leave event to hide the popup
document.onmouseup = documentMouseup;
//
function documentMouseup(){ if (mousePressed || calenderBuilding) { mousePressed = false; return false;}; tryBlur();}
function DatePicker(){this.initialize = initialize_object;this.canBlur = true;function initialize_object(){if (this.canvas != null){this.canvasElement = getElement(this.canvas);}if (this.anchor != null){this.anchorElement = getElement(this.anchor);this.anchorElement.onclick = DatePicker_AnchorEvents;this.anchorElement.onclick = DatePicker_AnchorEvents;this.anchorElement.parent = this;}}function DatePicker_AnchorEvents(){if (activeDp != this.parent)doShow(this.parent);}}
function getElement(id){var result = document.getElementById(id);return result == null ? document.all[id] : result;}
function setDate(dp, day){var date = dp.format;if (day == 0){dp.year = currYear;dp.month = currMonth;day = currDate;} if (date.indexOf('yyyy') >= 0) date = date.replace('yyyy',dp.year.toString());else date = date.replace('yy',dp.year.toString().substring(2,4));if (date.indexOf('mmm') >= 0) date = date.replace('mmm', months[dp.month-1].substring(0,3));else if (date.indexOf('mm') >= 0){ var monthString =  dp.month.toString();monthString = monthString.length == 1 ? '0' + monthString : monthString; date = date.replace('mm', monthString);}else date = date.replace('m', dp.month.toString());	if (date.indexOf('dd') >= 0){var dateString = day.toString();dateString = dateString.length == 1 ? '0' + dateString : dateString;date = date.replace('dd',dateString); }else date = date.replace('d',day);getElement(dp.id).value = date;dp.canBlur = true;doHide(dp);}
function tryFocus(dp){ dp.canBlur = false; }
function tryBlur(){if (activeDp != null) activeDp.canBlur = true;setTimeout("doHide();",50);}
function movePrev(isMonth){var dp = activeDp;dp.canBlur = false;if (isMonth){if (dp.month > 1){dp.month --;}else{dp.month = 12;dp.year --;}}else dp.year--;buildCalendar(dp);}
function moveNext(isMonth){var dp = activeDp;dp.canBlur = false;if (isMonth){if (dp.month < 12){dp.month ++;}else{dp.month = 1;dp.year ++;}}else dp.year++;buildCalendar(dp);}
function doShow(dp){if (activeDp == dp){activeDp.canBlur = true;doHide();}else{if (activeDp != null){activeDp.canBlur = true;doHide();}if (dp.overlayControls != null){var cons = dp.overlayControls.split(",");for(i=0; i < cons.length; i++)getElement(cons[i]).style.visibility = "hidden";}dp.canBlur = false;dp.canvasElement.style.visibility = "visible";dp.canvasElement.style.zIndex = 1;activeDp = dp;buildCalendar(dp)}}
function doHide(){if (activeDp != null && activeDp.canBlur) {activeDp.canvasElement.style.visibility = "hidden";activeDp.canvasElement.style.zIndex = -1;if (activeDp.overlayControls != null){var cons = activeDp.overlayControls.split(",");for(i=0; i < cons.length; i++)getElement(cons[i]).style.visibility = "visible";}activeDp = null;}}
function isDateInRange(from, to, current){ var result = false; if (from == null && to == null) result = true; else if ((from != null && current < from) || (to != null && current > to)) result = false; else result = true; return result;}
function getDayNameCell(dayIndex){var dayClass = "dayNames"; if (!isWorkingDay(dayIndex)) dayClass = "nwDayNames"; return "<td align='center' class='" + dayClass + "' width=21>" + daysOfWeek[dayIndex].substring(0,2) + "</td>";}
function isWorkingDay(dayIndex){return nonWorkingDays.indexOf(dayIndex) < 0;}
function getDayClass(currentClass, dayIndex){var dateClass = currentClass; if (!isWorkingDay(dayIndex)) dateClass = "nwday";  return dateClass;}
function moveAuto(direction){var delay = 50; switch(direction){ case 'yearPrev': movePrev(false); break; case 'yearNext': moveNext(false); break; case 'monthPrev': delay = 300; movePrev(true); break; case 'monthNext': delay = 300; moveNext(true); break;} if (mousePressed) setTimeout('moveAuto("' + direction + '")',delay);}
function startAuto(direction){ mousePressed = true; setTimeout('moveAuto("' + direction + '")',300);}
function stopAuto(){mousePressed = false;}
function buildCalendar(dp){
  calenderBuilding = true;
  var m = dp.month - 1;var isLeap = true; if (dp.year % 4 != 0) isLeap = false; else if (dp.year % 400 == 0) isLeap = true; else if (dp.year % 100 == 0) isLeap = false;
  var days = monthDays[m];
  if (isLeap) days = leapMonthDays[m];
  var dDate = new Date();
  dDate.setDate(1);
  dDate.setMonth(m);
  dDate.setFullYear(dp.year);
  var firstDay = dDate.getDay();
  var calCode = "<table border='0' cellspacing='0' cellpadding='2' width='100%' height='100%' class='calbg' onclick='tryFocus(dp" + dp.id + ");' onfocus='tryFocus(dp" + dp.id + ");'>";
  calCode += "<tr><td align='center'><a href='##' class='linknormal' onmousedown='startAuto(\"yearPrev\");' onfocus='tryFocus(dp" + dp.id + ");'>&lt;</a></td><td colspan=5 align='center' class='year'><b>"+ dp.year +"</b></td><td align='center'><a href='##' class='linknormal' onmousedown='startAuto(\"yearNext\");' onfocus='tryFocus(dp" + dp.id + ");'>&gt;</a></td></tr>";
  calCode += "<tr><td align='center'><a href='##' class='linknormal' onmousedown='startAuto(\"monthPrev\");' onfocus='tryFocus(dp" + dp.id + ");'>&lt;</a></td><td colspan=5 align='center' class='month'>"+ months[m] +"</td><td align='center'><a href='##' class='linknormal' onfocus='tryFocus(dp" + dp.id + ");' onmousedown='startAuto(\"monthNext\");'>&gt;</a></td></tr>";
  calCode += "<tr>";
  for (i = 0; i < 7; i++) // we have only 7 days to print
    if (i + weekStartDay < 7) // print first day names
    	calCode += getDayNameCell(i + weekStartDay);
    else
	calCode += getDayNameCell(i + weekStartDay-7); // print last day names

  calCode += "</tr>";
  colIndex = 0;

  var dayIndex = 0;
  var loopDate = 0;
  var displayDate = new Date();
  displayDate.setMonth(m);
  displayDate.setFullYear(dp.year);
  displayDate.setDate(1);

  firstDay -= weekStartDay;
  if (firstDay < 0) 
    firstDay = 7 - weekStartDay;
  for (i = -firstDay + 1; i < 36 - firstDay ; i++)
  {
    loopDate = 0;	

    if (colIndex >6)
    {
      colIndex = 0;
      calCode += "</tr><tr>";
    }
    dayIndex = colIndex + weekStartDay;
    if (colIndex + weekStartDay > 6)
	dayIndex = 7 - dayIndex;
    colIndex++;
    

    if (days - i >= 35 && i < 0){
      calCode += "<td align='right' class='" + getDayClass("day",dayIndex) + "'>";
      loopDate  = 35 + i;
    }
    else if (i < 1 || i > days){
      calCode += "<td>";
      loopDate = 0;	
    }
    else if (i == currDate && dp.month == currMonth && dp.year == currYear){ 
      calCode += "<td align='right' class='" + getDayClass("cday",dayIndex) + "'>";
      loopDate  = i;	

    }
    else if (i > 0) {
      calCode += "<td align='right' class='" + getDayClass("day",dayIndex) + "'>";
      loopDate  = i;
    }

    if (loopDate > 0)
      displayDate.setDate(loopDate);

    if (loopDate <= 0)
	calCode += "&nbsp;";
    else if (isDateInRange(dp.fromDate, dp.toDate, displayDate))
	//calCode += "<a href='##' class='linkbold' onfocus='tryFocus(dp" + dp.id + ");' onclick='setDate(dp" + dp.id + "," + loopDate.toString() + ");'>"+ loopDate.toString() +"</a>";
	calCode += "<p class='linkbold' onfocus='tryFocus(dp" + dp.id + ");' onclick='setDate(dp" + dp.id + "," + loopDate.toString() + ");'>"+ loopDate.toString() +"</p>";
    else
	calCode += loopDate.toString();

    calCode += "</td>";
  }
  calCode += "</tr>";
  calCode += "<tr ><td align='center' colspan=7 class='today'>";
  var currentDate = new Date(currYear.toString() + "/" + months[currMonth-1] + "/" + currDate.toString());
  if (isDateInRange(dp.fromDate, dp.toDate, currentDate))
  	calCode += "<a href='##' onfocus='tryFocus(dp" + dp.id + ");' onclick='setDate(dp" + dp.id + ",0);'>" + todayCaption + ": " + months[currMonth-1] + " " + currDate.toString() + ", " + currYear.toString() + "</a>";
  else
  	calCode += todayCaption + ": " + months[currMonth-1] + " " + currDate.toString() + ", " + currYear.toString();

  calCode += "</td></tr>";
  dp.canvasElement.innerHTML = calCode;
  calenderBuilding = false;
}
function getMyElementById(id) {
	if(document.getElementById) {//modern browsers
		return document.getElementById(id);
	}
	else if(document.all) {//IE 4
		return document.all[id];
	}
	else if(document.layers) { //Netscape 4
		return document.layers[id];
	}
	else return null;
}
function myOnLoad(){
	var bodyElement=getMyElementById("bodyId");				
	if(bodyElement!=null) {
		bodyElement.style.visibility="visible";
		var focusField=getMyElementById("focusField");
		if(focusField!=null) focusField.focus();		
	}
}
function validateChallenge(formElem) {
	if(bCancel) return true;
	var challenge=formElem.challenge.value.trim();
	var regex=/^\d{5}$/;
	if(!challenge.match(regex)) {
		alert("'What is the characters in right image' must be 5 digits");
		return false;
	}
	else return true;
}
function getHttpGetReqObj() {
	var xmlHttpGetReq=null;
	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
		try{			
			xmlHttpGetReq=new XMLHttpRequest();
		}catch(e) {			
			xmlHttpGetReq=null;
		}
	}		
	else if(window.ActiveXObject) {
		try{			
			xmlHttpGetReq=new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{				
				xmlHttpGetReq=new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e) {			
				xmlHttpGetReq=null;
			}
		}
	}	
	return xmlHttpGetReq;
}
function modifyCountries(url,formElem) {
	var demoValue=formElem.demoType.options[formElem.demoType.selectedIndex].value;
	var elem=getMyElementById("countries");	
	var xmlHttpGetReq=getHttpGetReqObj();
	if(xmlHttpGetReq!=null){ 
		xmlHttpGetReq.open('GET',url+'?demoType='+demoValue,true);
		xmlHttpGetReq.onreadystatechange=function() {			
			if(xmlHttpGetReq==null) return;						
			if(xmlHttpGetReq.readyState==4) {								
				if(xmlHttpGetReq.status==200) {
					var response=xmlHttpGetReq.responseText;//only text format				
					if(response==null||response.trim()=="") return;																				
					elem.innerHTML=response.trim();		
					return;	
				}
				else {}	//ignore any error
			}									
		}					
		xmlHttpGetReq.send(null);					
		return true;		
	}
	return false;
}	
function validateTime(labelValue,field) {
	if(bCancel) return true;
	var value=field.value;
	if(value==null || value.trim()=="") {		
		return true;
	}
	var result=value.split(":");	
	if(result.length==1 || result[0]<0 ||result[0]>24 || result[1]<0 || result[1]>60) {
		alert(value+" is not a valid value in field "+labelValue);
		return false;
	}
	else return true;
}
function showMenu(context,names,links,images,elem1,popupmenu) {
	var i=popupmenu.substring(popupmenu.length-1);
	eval('clearHideMenu'+i+'()');	
	var names=names.split(",");	
	var links=links.split(",");
	var images=images.split(",");
	if(names==null||names.length==0) return null;	
	var length=names.length;
	if(links==null||links.length<length) return null;
	var image="";
	var output='<table cellpadding="0" cellspacing="0" margin="0" border="1">';
	for(i=0;i<length;i++) {
		if(images[i]!=null&&images[i]!="")image='<img align="top" src="'+context+'/images/'+images[i]+'" vspace="0" hspace="0" border="0">&nbsp;';
		else image="";
		output+='<tr style="padding:0px;"><td nowrap style="padding:0.5px;"><a class="headerhref3" href='+context+links[i]+'><div>&nbsp;'+
		image+names[i]+'&nbsp;</div></a></td></tr>';
	}
	output+='</table>';	
	var elem=getMyElementById(popupmenu);
	elem.innerHTML=output;	
	elem.style.Zindex=100;		
	elem.style.left=getElLeft(elem1)-6;
	if(ie) elem.style.top=getElTop(elem1)+elem1.offsetHeight;
	else elem.style.top=getElTop(elem1)+elem1.offsetHeight+6;
	elem.style.visibility='visible';
	//elem.style.width=elem1.offsetWidth;	
}
function contains(elem,a){
	if(a==elem) return true;
	while (a.parentNode) {if ((a = a.parentNode) == elem) return true;}
	return false;
}
function hideMenu(popupmenu) {
	var elem2=getMyElementById(popupmenu);
	if(elem2==null) elem2=popupmenu;
 	elem2.innerHTML="";
 	elem2.style.visibility='hidden';	
	elem2.style.Zindex=-1;	
}
function dynamicHideMenu(e,popupmenu){
	var elem=getMyElementById(popupmenu);
	if(ie && !contains(elem,e.toElement)) hideMenu(popupmenu);
	else if(!ie&&!contains(e.currentTarget, e.relatedTarget)) hideMenu(popupmenu);
	//	relatedTarget==>fromElement;currentTarget==event assigned to
}
function delayHideMenu1(popupmenu) {delayHide1=setTimeout("hideMenu('"+popupmenu+"')",250);}
function clearHideMenu1() {if(window.delayHide1) clearTimeout(delayHide1);}
function delayHideMenu2(popupmenu) {delayHide2=setTimeout("hideMenu('"+popupmenu+"')",250);}
function clearHideMenu2() {if(window.delayHide2) clearTimeout(delayHide2);}
function delayHideMenu3(popupmenu) {delayHide3=setTimeout("hideMenu('"+popupmenu+"')",250);}
function clearHideMenu3() {if(window.delayHide3) clearTimeout(delayHide3);}
function delayHideMenu4(popupmenu) {delayHide4=setTimeout("hideMenu('"+popupmenu+"')",250);}
function clearHideMenu4() {if(window.delayHide4) clearTimeout(delayHide4);}
function delayHideMenu5(popupmenu) {delayHide5=setTimeout("hideMenu('"+popupmenu+"')",250);}
function clearHideMenu5() {if(window.delayHide5) clearTimeout(delayHide5);}

/* input others*/
var ns4 = (navigator.appName.indexOf("Netscape")>=0 
          && parseFloat(navigator.appVersion) >= 4 
          && parseFloat(navigator.appVersion) < 5)? true : false;
var ns6 = (parseFloat(navigator.appVersion) >= 5 
          && navigator.appName.indexOf("Netscape")>=0 )? true: false;
var ns = (document.layers)? true:false;
var ie = (document.all)? true:false;

function getElLeft(el) {
    if (ns4) {return el.pageX;} 
    else {
        xPos = el.offsetLeft;
        tempEl = el.offsetParent;
        while (tempEl != null) {
            xPos += tempEl.offsetLeft;
              tempEl = tempEl.offsetParent;
        }
        return xPos;
    }
}
function getElTop(el) {
    if (ns4) {return el.pageY;} 
    else {
        yPos = el.offsetTop;
        tempEl = el.offsetParent;
        while (tempEl != null) {
            yPos += tempEl.offsetTop;
              tempEl = tempEl.offsetParent;
        }
        return yPos;
    }
}	

// Flash Player Version Detection - Rev 1.6
// Detect Client Browser type
// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	var httpGetReq=getHttpGetReqObj();
	if(httpGetReq==null)  {m=getMyElementById("desc");	
		var isIE=(navigator.appVersion.indexOf("MSIE")!=-1)?true:false;if(isIE)m.innerHTML="The 'Script ActiveX controls marked safe for scripting' of your browser may be disabled. <p>Please enable it by clicking Tools->Internet Options->Security->Custom Level->ActiveX controls and plug-ins->Enable ";else m.innerHTML="Please enable Script ActiveX controls"; return "disabled";}
	httpGetReq=null;
	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {}
	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");					
			// default to the first public version
			version = "WIN 6,0,21,0";
			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";
			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}
	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			} else if (versionRevision[0] == "b") {
				versionRevision = versionRevision.substring(1);
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();if(versionStr=="disabled") return "disabled";
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function AC_AddExtension(src, ext)
{
  var qIndex = src.indexOf('?');
  if ( qIndex != -1)
  {
    // Add the extention (if needed) before the query params
    var path = src.substring(0, qIndex);
    if (path.length >= ext.length && path.lastIndexOf(ext) == (path.length - ext.length))
      return src;
    else
      return src.replace(/\?/, ext+'?'); 
  }
  else
  {
    // Add the extension (if needed) to the end of the URL
    if (src.length >= ext.length && src.lastIndexOf(ext) == (src.length - ext.length))
      return src;  // Already have extension
    else
      return src + ext;
  }
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
    var str = '';
    if (isIE && isWin && !isOpera)
    {
  		str += '<object ';
  		for (var i in objAttrs)
  			str += i + '="' + objAttrs[i] + '" ';
  		str += '>';
  		for (var i in params)
  			str += '<param name="' + i + '" value="' + params[i] + '" /> ';
  		str += '</object>';
    } else {
  		str += '<embed ';
  		for (var i in embedAttrs)
  			str += i + '="' + embedAttrs[i] + '" ';
  		str += '> </embed>';
    }
    document.write(str);
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "id":
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}
																
//always in last one
String.prototype.trim=function() {
	return this.replace(/^\s+|\s+$/g,"");
}
