var defaultEmptyOK = false;

var whitespace = " \t\n\r";
var nameDelimiters = "-_. ";
var idDelimiters = "_";
var htmlDelimiters = '!@#$%&*()-_+=[]:;"<>,./?';
var validHtmlChars = whitespace + htmlDelimiters;
var urlDelimiters = "/-_.";

function isEmpty(s) {
    return ((s == null) || (s.length == 0))
}

function isWhitespace(s) {
    var i;

    if (isEmpty(s)) return true;
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false; // not whitespace
    }
    return true;
}

function stripCharsInBag (s, bag){
    var i;
    var returnString = "";
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function warnInvalid (theField,s){
    theField.focus()
    theField.select()
    alert(s)
    return false
}

function makeTitleCase(s){
  if (isEmpty(s)) 
     if (makeTitleCase.arguments.length == 1) return defaultEmptyOK;
     else return (makeTitleCase.arguments[1] == true);
  count = 1;
  ws = 0;
  s = s.charAt(0).toUpperCase()+s.substring(1,s.length);
  while (count < s.length){
    if (isWhitespace(s.charAt(count)) || (s.charAt(count) == ".") || (s.charAt(count) == "-")) ws = 1;
    else if ((ws == 1) && (isLetter(s.charAt(count)))){
      s = s.substring(0,count)+s.charAt(count).toUpperCase()+s.substring(count+1,s.length);
      ws = 0;
    }
    count++;
  }
  return s;
}

function isLetter (c){
   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || (c == "*") )
}

function isDigit (c){
   return ((c >= "0") && (c <= "9"))
}

function isAlphabetic (s){
    var i;
    if (isEmpty(s)) 
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (!isLetter(c))
        return false;
    }
    return true;
}

function isAlphanumeric (s){
    var i;
    if (isEmpty(s)) 
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }
    return true;
}

function checkName(theField,fieldName,emptyOK){
    if (checkName.arguments.length == 2) emptyOK = defaultEmptyOK;
    if (isEmpty(theField.value)) return emptyOK;
    else {
        if (!isAlphabetic(stripCharsInBag(theField.value,nameDelimiters))){
          warnInvalid(theField,fieldName+" contains invalid characters");
          return false;
        }
        else {
          theField.value = makeTitleCase(theField.value);
          return true;
        }
    }
}

function checkId(theField,fieldName,emptyOK){
    if (checkId.arguments.length == 2) emptyOK = defaultEmptyOK;
    if (isEmpty(theField.value)) return emptyOK;
    else {
    	if (!isLetter(theField.value.charAt(0))) {
          warnInvalid(theField,"The first letter of "+fieldName+" should be alphabetic");
          return false;
    	}
        if (!isAlphanumeric(stripCharsInBag(theField.value,idDelimiters))){
          warnInvalid(theField,fieldName+" contains invalid characters");
          return false;
        }
        else {
          theField.value = theField.value.toUpperCase();
          return true;
        }
    }
}

function checkDescription(theField,fieldName,emptyOK){
    if (checkDescription.arguments.length == 2) emptyOK = defaultEmptyOK;
    if (isEmpty(theField.value)) return emptyOK;
    else {
        if (!isAlphanumeric(stripCharsInBag(theField.value,nameDelimiters))){
          warnInvalid(theField,fieldName+" contains invalid characters");
          return false;
        }
        else {
          theField.value = makeTitleCase(theField.value);
          return true;
        }
    }
}

function checkHtmlDesc(theField,fieldName,emptyOK){
    if (checkHtmlDesc.arguments.length == 2) emptyOK = defaultEmptyOK;
    if (isEmpty(theField.value)) return emptyOK;
    else {
        if (!isAlphanumeric(stripCharsInBag(theField.value,validHtmlChars))){
          warnInvalid(theField,fieldName+" contains invalid characters");
          return false;
        }
        else {
          return true;
        }
    }
}

function checkUrl(theField,fieldName,emptyOK){
    if (checkUrl.arguments.length == 2) emptyOK = defaultEmptyOK;
    if (isEmpty(theField.value)) return emptyOK;
    else {
        if (!isAlphanumeric(stripCharsInBag(theField.value,urlDelimiters))){
          warnInvalid(theField,fieldName+" contains invalid characters");
          return false;
        }
        else {
          return true;
        }
    }
}

function formatCurrency(num,htmlobject) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
   num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
   cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  htmlobject.innerText= '$' + num + '.' + cents + ((sign)?'':'-');
}

function formatCurrency2(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
   num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
   cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  document.write('$' + num + '.' + cents + ((sign)?'':'-'));
}

function formatCurrency3(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
   num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num*100+0.50000000001);
  cents = num%100;
  num = Math.floor(num/100).toString();
  if(cents<10)
   cents = "0" + cents;
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  formattedval = ('$' + num + '.' + cents + ((sign)?'':'-'));
  return formattedval;
}

function formatCount(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
   num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num+0.50000000001);
  num = Math.floor(num).toString();
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  //htmlobject.innerText= num + ((sign)?'':'-');
  formattednum = num + ((sign)?'':'-');
  document.write(formattednum);
}

function formatCount2(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
   num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num+0.50000000001);
  num = Math.floor(num).toString();
  for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
  num = num.substring(0,num.length-(4*i+3))+','+
  num.substring(num.length-(4*i+3));
  //htmlobject.innerText= num + ((sign)?'':'-');
  formattednum = num + ((sign)?'':'-');
  return formattednum;
}

   
   function ValidateDate(DateValue,DateFmt) {
   // This function validates any 8-digit date with no separators
   // in MMDDYYYY, DDMMYYYY, or YYYYMMDD format.  The date range
   // supported is January 1, 1 through December 31, 9999
   // The function returns true if the date is valid, false if not
   
    if (DateFmt == 'mdy') {
     var year = DateValue.substr(4,4);
     var month = DateValue.substr(0,2);
     var day = DateValue.substr(2,2);
    }
    else if (DateFmt == 'dmy') {
     var year = DateValue.substr(4,4);
     var month = DateValue.substr(2,2);
     var day = DateValue.substr(0,2);
    }
    else {
     var year = DateValue.substr(0,4);
     var month = DateValue.substr(4,2);
     var day = DateValue.substr(6,2);
    }
    var DaysInMonths = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var month_idx = month - 1;
    var divisor = 4;
    if (month < 1 || month > 12) return false;
    if (year == 0000) return false;
    if (year == 1582 && month == 10 && (day >= 5 && day <= 14)) return false; 
    if (year.substr(2,2) == 00) divisor = 400;
    if (year < 1600) divisor = 4;
    var remainder = year % divisor;
    if (remainder == 0) DaysInMonths[1] = 29;
    if (day < 1 || day > DaysInMonths[month_idx]) return false;
    return true;
   }
   
   function removeLeadingBlanks(value) { //This is the same as the trimL function below but it's still in use
    var returnvalue = "";
    for(count = 0; count < value.length-1 && value.charAt(count) == " "; count++);
    returnvalue = value.substr(count);
    if (returnvalue.length == 1 && returnvalue == " ") {
     return '';
    }
    else {
     return returnvalue; 
    }
   }
   
   function trim(value) {
    returnvalue = trimL(value);
    returnvalue = trimR(returnvalue);
    return returnvalue;
   }
   
   function trimL(value) {
    var returnvalue = "";
    for(count = 0; count < value.length-1 && value.charAt(count) == " "; count++);
    returnvalue = value.substr(count);
    if (returnvalue.length == 1 && returnvalue == " ") {
     return '';
    }
    else {
     return returnvalue; 
    }
   }
   
   function trimR(value) {
    var returnvalue = "";
    for(count = value.length-1; count > -1 && value.charAt(count) == " "; count--);
    returnvalue = value.substr(0,count+1);
    if (returnvalue.length == 1 && returnvalue == " ") {
     return '';
    }
    else {
     return returnvalue; 
    }
   }

   // Allow only digits and slashes ('/')
   function CheckDateKey(KeyCode,ShiftKey) { 
    if (CheckControlKey(KeyCode) || (KeyCode >= 96 && KeyCode <= 105) || ((KeyCode > 47 && KeyCode < 58) && ShiftKey == true) || KeyCode == 111 || KeyCode == 222) {
     return true;
    }
    else {
     return false;
    }
   }  

   // Allow only digits
   function CheckNumericKey(KeyCode,ShiftKey) { 
     //alert('CheckControlKey is ' + CheckControlKey(KeyCode));
    if (!CheckControlKey(KeyCode)) {
     //alert('Key pressed is ' + KeyCode + ' - Shift is ' + ShiftKey);
     if ((KeyCode >= 96 && KeyCode <= 105) || ((KeyCode > 47 && KeyCode < 58) && ShiftKey != true)) {
      return true;
     }
     else {
      return false;
     }
    }
    else {
     return true;
    }
   }  

   // Allow only digits and decimal point
   function CheckAmountKey(KeyCode,ShiftKey) { 
    if (!CheckControlKey(KeyCode)) {
     if ((KeyCode >= 96 && KeyCode <= 105) || KeyCode == 110 || (KeyCode == 190 && ShiftKey != true) || ((KeyCode > 47 && KeyCode < 58) && ShiftKey != true)) {   
      return true;
     }
     else {
      return false;
     }
    }
    else {
     return true;
    }
   }

   // Allow only digits and dash (57393 is Opera's code for the minus (-) key on the numeric keypad)
   function CheckPhoneKey(KeyCode,ShiftKey) { 
    //alert('KeyCode=' + KeyCode + ' ShiftKey=' + ShiftKey);
    if (!CheckControlKey(KeyCode)) {
     if ((KeyCode >= 96 && KeyCode <= 105) || KeyCode == 57393 || ((KeyCode == 189 || KeyCode == 109) && ShiftKey != true) || ((KeyCode > 47 && KeyCode < 58) && ShiftKey != true)) {   
      return true;
     }
     else {
      return false;
     }
    }
    else {
     return true;
    }
   }

   // Is the key pressed a control, function, or editing key?
   function CheckControlKey(KeyCode) { 
    if ((KeyCode >= 0 && KeyCode <= 31) || (KeyCode >= 33 && KeyCode <= 46) || (KeyCode >= 91 && KeyCode <= 93) || (KeyCode >= 112 && KeyCode <= 145)) {   
     //alert('KeyCode=' + KeyCode + ' - Is a control key');
     return true;
    }
    else {
     //alert('KeyCode=' + KeyCode + ' - Is NOT a control key');
     return false;
    }
   }
