

function validateNumericField(isMoney, allowNegative, wholeNumber, formElement)
{
   var enterNumber = 'Please enter a valid number.';
   var enterPositiveNumber = 'Please enter a positive number.';
   var enterWholeNumber = 'Please enter a whole number.';
   var enterPositiveWholeNumbe = 'Please enter a positive whole number.';
   var msg;
   if (allowNegative) {
      if (wholeNumber)   msg = enterWholeNumber;
      else msg = enterNumber;
   } else {//only positive is acceptible
      if (wholeNumber) msg = enterPositiveWholeNumbe;
      else msg = enterPositiveNumber;
   }

   //var fieldName = formElement.friendlyName || "" ;

   val = formElement.value.stringTrim() ;
   if (val.length == 0) return true ;

   //  money validation was removed for internationalization

   var stringContainsNonNumbers = val.search(new RegExp("[^0-9.,-]", "g")) >= 0 ;

   val = parseFloat(val) ;
   if (isNaN(val) || stringContainsNonNumbers) {
      if (isMoney) {
         var tmpMsg = 'Please enter a valid number.';
         tmpMsg += ' ' + 'Do not include a currency symbol or thousandths delimiter.';
         alert(tmpMsg) ;
      } else {
         alert('Please enter a valid number.') ;
      }

      formElement.focus() ;
      return false ;
   }

   if ((!allowNegative && val < 0) || (wholeNumber && val != Math.round(val))) {
      alert(msg) ;
      formElement.focus() ;
      return false ;
   }

   return true ;
}



function validateNumericFields(isMoney, allowNegative, wholeNumber)
{
   var fieldName = null, len = null ;
   var enterNumber = 'Please enter a valid number.';
   var enterPositiveNumber = 'Please enter a positive number.';
   var enterWholeNumber = 'Please enter a whole number.';
   var enterPositiveWholeNumbe = 'Please enter a positive whole number.';
   var msg;
   if (allowNegative) {
      if (wholeNumber)   msg = enterWholeNumber;
      else msg = enterNumber;
   } else {//only positive is acceptible
      if (wholeNumber) msg = enterPositiveWholeNumbe;
      else msg = enterPositiveNumber;
   }

   for (var i = 3; i < arguments.length; i++) {
      formElement = arguments[i] ;

      len = formElement.length ;

      if (len == null) {
         if (!validateNumericField(isMoney, allowNegative, wholeNumber, formElement))
            return false ;
      } else {
         for (var y = 0; y < len; y++)
            if (!validateNumericField(isMoney, allowNegative, wholeNumber, formElement[y]))
               return false ;
      }
   }

   return true ;
}



function validateMoneyField(formElement)
{
   var val = null  ;
   decallowed = 2;  // how many decimals are allowed?

   val = formElement.value.stringTrim() ;
   var fieldName = formElement.friendlyName ;

   // remove "$" and ","
   val = val.replace(/^\$/g, "").replace(/,/g, "") ;

   var msg = 'Please enter a valid number.';
   msg += ' ' + 'Do not include a currency symbol or thousandths delimiter.';
   if (isNaN(val) || val == "") {
      alert(msg);
      formElement.select();
      formElement.focus();

      return false ;
   } else {
      if (val.indexOf('.') == -1) val += ".";
      var  dectext = val.substring(val.indexOf('.')+1, val.length);

      if (dectext.length > decallowed) {
         var tmpMsg = 'Please enter a number with up to {0} decimal places.';
         tmpMsg = tmpMsg.replace(/\{0\}/g, decallowed);
         alert (tmpMsg);
         formElement.select();
         formElement.focus();

         return false ;
      }
   }

   return true ;
}


//  remove $ and , from a string
function filterNum(str) {
   re = new RegExp("^\$|,","g") ;

   // remove "$" and ","
   return str.replace(re, "");
}



function checkAllCheckboxes(checkboxField, img) {
   if (!checkboxField) return ;
   var value = img.src.indexOf("/selling/images/app/icon_check_all.gif") >= 0 ;

   img.src = (value?"/selling/images/app/icon_check_none.gif":
                     "/selling/images/app/icon_check_all.gif") ;


   if (checkboxField.length == null) checkboxField.checked = value ;

   for (i = 0; i < checkboxField.length; i++)
      checkboxField[i].checked = value ;
}

function setFocus(theForm, field)
{
   for (var i = 0; i < theForm.elements.length; i++)
   {
      if (theForm.elements[i].name == field) {
         theForm.elements[i].focus() ;
         return true ;
      }
   }

   return false ;
}

function clearForm(theForm) {
   if (confirm('Are you sure you want to clear all fields?')) {
      for (var i = 0; i < theForm.elements.length; i++ ) {

         if (theForm.elements[i].type != 'submit' &&
                  theForm.elements[i].type != 'button' &&
                  theForm.elements[i].type != 'hidden')
            theForm.elements[i].value = "" ;
      }
   }
}


function isDeleteOK(thelink, extraInfo, msg)
{
   if (msg == null)
      msg = 'Do you really want to delete this item?' ;

   var ok = confirm(msg) ;
   return ok ;
}



var reqFields = null ;

//  input - list of required fields in the form
//      field1ElementName, field1FriendlyName, field2ElementName, field2FriendlyName, ...
//    populates an array indexed by the form element name setting the value to the friendly name
function setRequiredFields() {
   var fieldCount = Math.round(arguments.length / 2) ;

   reqFields = new Array(fieldCount) ;
   for (var i = 0; i < fieldCount; i++) {
      reqFields[arguments[i*2]] = arguments[i*2+1] ;
   }

}


function fieldHasNoValue(formField) {

   if (formField.value == null) {

      return formField.selectedIndex == 0 ;
   }

   return (new String(formField.value)).stringTrim().length == 0 ;
}

function validateFormFields(theForm) {
   var reqFieldList = theForm._reqFields ;
   if (reqFieldList == null) reqFieldList = reqFields ;

   var fieldList = "" ;
   var focusField = null ;

   for (var i = 0; i < theForm.elements.length; i++ ) {

      var friendlyName = reqFieldList[theForm.elements[i].name] ;

      if (friendlyName != null && fieldHasNoValue(theForm.elements[i])) {

         fieldList += '   ' + friendlyName + '\n' ;

         if (focusField == null)
            focusField = theForm.elements[i] ;
      }

   }

   if (fieldList.length > 0)
      alert('You must provide a value for the following field(s):' + '\n\n' + fieldList) ;

   if (focusField != null)
      focusField.focus() ;

   return fieldList.length==0;
}

function setFormFieldNames(theForm) {
   if (!theForm) return ;

   var fieldCount = Math.round((arguments.length - 1) / 2), theField = null ;

   for (var i = 0; i < fieldCount; i++) {
      theField = theForm.elements[arguments[i*2+1]] ;
      if (theField != null) theField.friendlyName = arguments[i*2+2] ;
   }

}


function validateFormRequiredFields() {

   var fieldList = "", friendlyName = "" ;
   var focusField = null ;

   for (var i = 0; i < arguments.length; i++ ) {


      if (fieldHasNoValue(arguments[i])) {
         friendlyName = arguments[i].friendlyName || arguments[i].name ;
         fieldList += '   ' + friendlyName + '\n' ;

         if (focusField == null)
            focusField = arguments[i] ;
      }

   }

   if (fieldList.length > 0)
      alert('You must provide a value for the following field(s):' + '\n\n' + fieldList) ;

   if (focusField != null)
      focusField.focus() ;

   return fieldList.length==0;
}



function testInputString(pattern, field, fieldName,required)
{

   if (pattern == null)
       pattern = "[^$#{}+*<>()%/-A-Za-z0-9_]";

   var found = null;

   if (required && field != null && field.value.replace(/ /g, "") == "") {
      alert('Please input a string for the following field:' + fieldName) ;
      field.focus();
      return false ;
   }

   if (field != null && field.value.length != 0) {
      if (found = testInvalidChars(pattern ,field.value)) {
         invalidStr = new String(found);

         if (invalidStr.search(" ") != -1) {
            var tmpMsg = '{0} cannot contain spaces.';
            tmpMsg = tmpMsg.replace(/\{0\}/g, fieldName);
            alert(tmpMsg);
         } else {
            var tmpMsg = '{0} cannot contain the following string: {1}';
            tmpMsg = tmpMsg.replace(/\{0\}/g, fieldName);
            tmpMsg = tmpMsg.replace(/\{1\}/g, found);
            alert(tmpMsg);
         }
         field.focus() ;
         return false;
      }
   }

   return true;
}
function testInvalidChars(pattern,str)
{
   var found = null;
   var re = new RegExp(pattern, "ig");

   if (found = str.match(re))
      return found;
   else
      return null;
}


//  for the given select box, pass any number of values
//    all the option values matching a value passed in will be selected
function setSelectedOptions(selectBox)
{

   // I would just use arguments.slice(1) to remove first element,
   //   but the arguments object in IE is not an array object
   var valueList = new Array(arguments.length - 1) ;
   for(var i = 1; i < arguments.length; i++)
      valueList[i+1] = arguments[i] ;


   var valueListStr = "|" + valueList.join("|") + "|" ;


   with (selectBox)
      for (var i = 0; i < length; i++)
         if (valueListStr.indexOf("|" + options[i].value + "|") >= 0)
            options[i].selected = true ;
}

function validUSState(stateField, countryField)
{

   if (countryField == null || countryField.value != 'US' || stateField == null)
      return true;

   var states = new Array(56);
   states[0]  = "AK";
   states[1]  = "AL";
   states[2]  = "AR";
   states[3]  = "AS";
   states[4]  = "AZ";
   states[5]  = "CA";
   states[6]  = "CO";
   states[7]  = "CT";
   states[8]  = "DC";
   states[9]  = "DE";
   states[10] = "FL";
   states[11] = "FM";
   states[12] = "GA";
   states[13] = "GU";
   states[14] = "HI";
   states[15] = "IA";
   states[16] = "ID";
   states[17] = "IL";
   states[18] = "IN";
   states[19] = "KS";
   states[20] = "KY";
   states[21] = "LA";
   states[22] = "MA";
   states[23] = "MD";
   states[24] = "ME";
   states[25] = "MH";
   states[26] = "MI";
   states[27] = "MN";
   states[28] = "MO";
   states[29] = "MS";
   states[30] = "MT";
   states[31] = "NC";
   states[32] = "ND";
   states[33] = "NE";
   states[34] = "NH";
   states[35] = "NJ";
   states[36] = "NM";
   states[37] = "NV";
   states[38] = "NY";
   states[39] = "OH";
   states[40] = "OK";
   states[41] = "OR";
   states[42] = "PA";
   states[43] = "PR";
   states[44] = "RI";
   states[45] = "SC";
   states[46] = "SD";
   states[47] = "TN";
   states[48] = "TX";
   states[49] = "UT";
   states[50] = "VA";
   states[51] = "VI";
   states[52] = "WA";
   states[53] = "WI";
   states[54] = "WV";
   states[55] = "WY";
   for (var i = 0; i < 56; i++) {
      if (stateField.value.toUpperCase() == states[i])
         return true;
   }

   alert('Please enter a two characters valid state code.');
   stateField.focus();
   return false;

}

function isFormDeleteOK(theform, action, msg)
{
   if (msg == null)
      msg = 'Do you really want to delete this item?';

   var ok = confirm(msg) ;

   if (ok && theform != null)
      theform.action=action;

   return ok ;
}

/*  ================================================================
    FUNCTION:  isCreditCard(st)

    INPUT:     st - a string representing a credit card number

    RETURNS:  true, if the credit card number passes the Luhn Mod-10 test.
             false, otherwise

   Sample Numbers:

   Credit Card         Sample Number
   ---------------      ---------------------------
   Visa            4111 1111 1111 1111
   MasterCard         5500 0000 0000 0004
   American Express   3400 0000 0000 009
   Discover         6011 0000 0000 0004

    ================================================================ */

function isCreditCard(st) {
  // Encoding only works on cards with less than 19 digits
  if (st.length > 19)
    return (false);

  sum = 0; mul = 1; l = st.length;
  for (i = 0; i < l; i++) {
    digit = st.substring(l-i-1,l-i);
    tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }

  return ((sum % 10) == 0);
}

function removeSpace(st) {

   return st.replace(/ /g, "") ;

}



function isCreditCardNumber(card_number, showErrorMsg) {

  var ccn = removeSpace(card_number);
  if (showErrorMsg && (ccn.length == 0) ) {
     alert('Please enter a card number.');
     return false;
  }
  if ( !isCreditCard(ccn) ) {
    if (showErrorMsg){
      var tmpMsg = 'Card number:{0} is invalid.';
      tmpMsg = tmpMsg.replace(/\{0\}/g, ccn);
      alert(tmpMsg);
    }
    return false;
  }
  return true;
}

