
var init_done = false

var charexp = /./
var letterexp = /[a-z]/i
var numexp = /\d+/
var zipexp = /^\d{5}$|^\d{5}[\-\s]?\d{4}$|^[a-zA-Z0-9 \.-]+$/
var phoneexp = /^[0-9()\s-+]+$/
var emailexp = /^[a-z][a-z_0-9\.]+@[a-z_0-9\.]+\.[a-z]{2,3}(\.[a-z]{2})?$/i
var ynexp = /^[YNyn]$/
var yymmddhhmmexp = /^\d{10}$/
var aexp  = /^[a-zA-Z]+$/
var anexp = /^[a-zA-Z0-9]+$/
var txexp = /^[a-zA-Z0-9 \.-]+$/
var idexp = /^[a-zA-Z0-9]+$/
var phexp = /^[a-zA-Z0-9()]+$/
var flexp = /^[0-9]{1,4}[A-Z]?$/
var ccexp = /^[0-9]+$/
var rtexp = /^[1-7]$/
var mmmexp = /JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC/i
var rexp = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
var arcexp = /^[iobn]$/i
var uexp = /^[pnbx]$/i
var ppexp = /^qr_dlg|qr_sngl|trn_dlg|edi_intr|edi_btch$/i
var ddexp = /^\d\d$/

var reYYYYMMDD   = /^\d\d\d\d-\d\d-\d\d$/
var reCTY    = /^[A-Z]{3}$/i
var rePNR    = /^[A-Z0-9\?]{5}$/i
var reLoc   = /^[A-Z0-9]?$/i
var reTOP   = /^[A-Z0-9]{1,3}$/i
var wtexp = /^[0-9\.]+$/
var carriage_decl  = /^[0-9\.]{1,13}$|^NVD$/
var customs_decl   = /^[0-9\.]{1,13}$|^NCV$/
var insurance_decl = /^[0-9\.]{1,12}$|^XXX$/

function fldtypes (type) {
        if (type == "AN") { return "alphanumeric character(s) (A-Z,a-z,0-9)" }
   else if (type == "A") { return "alpha character(s) (A-Z,a-z)" }
   else if (type == "N") { return "numeric(s) (0-9)" }
   else if (type == "YN") { return "either y or n" }
   else if (type == "YYMMDDHHMM") { return "a date in YYMMDDHHMM format" }
   else if (type == "EMAIL") { return "a valid e-mail address" }
   else if (type == "ZIP") { return "either in ##### or #####-#### format" }
   else if (type == "PHONE") { return "a valid phone number" }
   else if (type == "TX") { return "valid text characters (A-Z,a-z,0-9,.,-, )" }
   else if (type == "ID") { return "text characters (A-Z,a-z,0-9)" }
   else if (type == "PH") { return "a valid phone number (A-Z,a-z,(),0-9)" }
   else if (type == "FL") { return "a valid flight number (0-9{1,4},A-Z))" }
   else if (type == "CC") { return "a valid credit card number (0-9)" }
   else if (type == "RT") { return "a valid Rate Line (1-7)" }
   else if (type == "MMM") { return "a valid month (ie. JAN, FEB, etc.)" }
   else if (type == "R") { return "numeric(s) (0-9)" }
   else if (type == "SC") { return "a valid service character" }
   else if (type == "ARC") { return "a valid archive (i,o,b,n)" }
   else if (type == "U") { return "a valid usage (p,n,b,x)" }
   else if (type == "PP") { return "a valid presentation protocol (QR_DLG,QR_SNGL,TRN_DLG,EDI_INTR,EDI_BTCH)" }
   else if (type == "YYYYMMDD") { return "a valid date (yyyy-mm-dd)" }
   else if (type == "PNR") { return "a valid PNR (5 alpha characters)" }
   else if (type == "CTY") { return "a valid City Code (3 alpha characters)" }
   else if (type == "LOC") { return "a valid loc (A-Z or 0-9)" }
   else if (type == "TOP") { return "a valid TOP code (3 alphanumerics)" }
   else if (type == "DD") { return "a valid day (2 numerics)" }
   else if (type == "WT") { return "a valid weight (0-9,.)" }
   else if (type == "CDI_car") {return "a valid declaration (NVD or numeric value)" }
   else if (type == "CDI_cus") {return "a valid declaration (NCV or numeric value)" }
   else if (type == "CDI_ins") {return "a valid declaration (XXX or numeric value)" }
   else                        {return ""}   
}

function isValid(pattern, str) {    return pattern.test(str)  }
function hasLetter(str)        {    return letterexp.test(str)}
function hasChar(str)          {    return charexp.test(str)  }
function hasNum(str)           {    return numexp.test(str)   }
function stripChars(pattern, str) { return str.replace(pattern,"")}
function stripNonDigits(str)   {    return str.replace(/[^0-9]/g,"")}
function isRequired(req)       {    if (req && req.match(/r|m/i)) {return true}
                                    else                           {return false}
}

function createRe(type) {
        if (type == "AN")      { return new RegExp("^\\w+$") }
   else if (type == "an")      { return anexp }
   else if (type == "a")       { return aexp }
   else if (type == "A")       { return aexp }
   else if (type == "N")       { return new RegExp("^\\d+$") }
   else if (type == "YN")      { return ynexp }
   else if (type == "YYMMDDHHMM") { return yymmddhhmmexp }
   else if (type == "EMAIL")   { return emailexp }
   else if (type == "R")       { return rexp }
   else if (type == "TX")      { return txexp }
   else if (type == "ID")      { return idexp }
   else if (type == "PH")      { return phexp }
   else if (type == "FL")      { return flexp }
   else if (type == "CC")      { return ccexp }
   else if (type == "MMM")     { return mmmexp }
   else if (type == "RT")      { return rtexp }
   else if (type == "ZIP")     { return zipexp }
   else if (type == "PHONE")   { return phoneexp }
   else if (type == "SC")      { return charexp }
   else if (type == "ARC")     { return arcexp }
   else if (type == "U")       { return uexp  }
   else if (type == "PP")      { return ppexp }
   else if (type == "YYYYMMDD"){ return reYYYYMMDD }
   else if (type == "PNR")     { return rePNR }
   else if (type == "CTY")     { return reCTY }
   else if (type == "LOC")     { return reLoc }
   else if (type == "TOP")     { return reTOP }
   else if (type == "DD")      { return ddexp }
   else if (type == "WT")      { return wtexp }
   else if (type == "CDI_car") { return carriage_decl }
   else if (type == "CDI_cus") { return customs_decl }
   else if (type == "CDI_ins") { return insurance_decl }   
   else                        { return ""}
}

function checkfield(f) {

      var msg = checkvalid(f);
      if (msg == "") { msg = checkrequ(f); }

      if (msg) {alert(msg + "Please enter a new value for this field.")
                f.focus()
                f.select()
                return false
      }
      return true
}

function ifFldVal(f , nameStr){

  if (f.elements[nameStr].name == nameStr) {
      var e = f.elements[nameStr];
      if ((e.type == "text") || (e.type == "textarea") || (e.type == "hidden")){
      	   if( e.type == "hidden" && e.value == "@") {return false;}
           if( e.value != null && e.value != "" ) { return true;}
           return false;
      }
      if ((e.type == "select-one")){
          if (e.selectedIndex < 0) { return false;}
          if (e.options[e.selectedIndex].value == "@") {return false;}
          return true;
      }
  }
  return false;
}

function setFldVal(f , nameStr, valStr){
  if (f.elements[nameStr].name == nameStr) { f.elements[nameStr].value = valStr; return;}
  return;
}

function getLstVal(f , nameStr){
  if (f.elements[nameStr].name == nameStr) {
    if (f.elements[nameStr].type == "select-one") {
      return f.elements[nameStr].options[f.elements[nameStr].selectedIndex].value;
    }
  }
  return(null);
}

function getFldVal(f, nameStr){
   var e = f.elements[nameStr];
   
   if (e.type == "text" || e.type == "textarea" || (e.type == "hidden")) {
   	if (e.name == nameStr) {
   		return e.value;
   	}
   }
   return(null);
}

function getFldRpt(f , nameStr){
  if (f.elements[nameStr].name == nameStr) {
    if (f.elements[nameStr].aRpt) {  return  f.elements[nameStr].aRpt; }
  }
  return nameStr;
}

function checkvalid(e) {
     var msg = ""
     if (!e.aTyp) return msg;

     if (e.type == "text" || e.type == "textarea" || (e.type == "hidden")) {
        var fldvalue = e.value;
        if (e.aStr) { fldvalue = stripChars(/\s/g,fldvalue) }
        if (e.aUp)  { fldvalue = fldvalue.toUpperCase() }

        e.value = fldvalue;

        if ( (/./.test(e.value)) ) {

            if (e.aRe  && !isValid(e.aRe,fldvalue)) {
               msg = e.aRpt + " should be " + fldtypes(e.aTyp) + ".\n"
            }
            if (e.aMin && !e.aMax &&  fldvalue.length < e.aMin) {
               msg = e.aRpt + " should be at least " + e.aMin + " " + fldtypes(e.aTyp) + ".\n"
            }
            if (e.aMin && e.aMax  && (fldvalue.length < e.aMin || fldvalue.length > e.aMax)) {
               msg = e.aRpt + " should be " + e.aMin + "-" + e.aMax + " " + fldtypes(e.aTyp) + ".\n"
            }
            if (e.aMin && e.aMax  && e.aMin==e.aMax && (fldvalue.length != e.aMin)) {
               msg = e.aRpt + " should be " + e.aMin + " " + fldtypes(e.aTyp) + ".\n"
            }
            if (!e.aMin && e.aMax &&  fldvalue.length > e.aMax) {
               msg = e.aRpt + " should be up to " + e.aMax + " " + fldtypes(e.aTyp) + ".\n"
            }
        }
     }
     return msg
}
function checkrequ(e) {
     var msg = ""

     if (!e.aReq) return msg;

     if (e.type == "text" || e.type == "textarea" || e.type == "hidden") {
        if ( (!(/./.test(e.value)) || (e.type == "hidden" && e.value == "@")) && isRequired(e.aReq)){
               msg = e.aRpt + " is required.\n"
        }
     }
     else  {
      if (e.type == "select-one") {
      
            if (isRequired(e.aReq) &&
                (e.selectedIndex == -1 || e.options[e.selectedIndex].value == '@')){
                     msg = e.aRpt + " is required.\n"
            }
      }
     }
     return msg
}

function checkcond(form,e){
     var msg = "";
     if ( (/./.test(e.value)) ) {
           if(e.aOr)   {
               if (!ifFldVal(form , e.aOr)){
                 msg += "- The field " + e.aRpt + " or " + getFldRpt(form, e.aOr) + " is required\n";
               }
           }
           if(e.aIf)  {
                 if (! ifFldVal(form,e.aIf)){
                    msg += "- " + e.aRpt + " may only be used if " + getFldRpt(form, e.aIf) + " is entered\n";
                 }
           }
           if(e.aAnd)  {
               if (! ifFldVal(form,e.aAnd)){
                  msg += "- The field " + getFldRpt(form, e.aAnd) + " is required if " + e.aRpt + " is entered\n";
               }
           }
           if(e.aXor){
                 if (  ifFldVal(form, e.aXor)){
                    msg += "- Either " + e.aRpt + " or " + getFldRpt(form, e.aXor) + " may be used\n";
                 }
           }
           if( (e.type == "select-one" || e.type == "hidden") && (e.value == "@") ) {
	           if(e.fAnd)  {
	               if ( ifFldVal(form , e.fAnd)){
	                  msg += "- The field " + e.aRpt + " is required if " + getFldRpt(form, e.fAnd) + " is used\n";
	               }
	           }          
           }
     } else {
           if(e.fAnd)  {
               if ( ifFldVal(form , e.fAnd)){
                  msg += "- The field " + e.aRpt + " is required if " + getFldRpt(form, e.fAnd) + " is used\n";
               }
           }
     }
     return msg
}

function checkform(form) {
        var invmsg = ""
        var reqmsg = ""
        var condmsg = ""
        var errcount = 0
        var reqerrcount = 0
        var range = ""
        var fstfld
        if (!init_done) { init_attr(form);}
        if (!form) {alert("Form?")}

        for(var i = 0; i < form.elements.length && errcount < 11; i++) {
           var e = form.elements[i]
           msg = checkvalid(e);
           if (msg != ""){
               if (errcount == 0) { fstfld = e;}
               invmsg += msg;
               errcount++
           }

           msg = checkrequ(e);
           if (msg != ""){
               if (errcount == 0) { fstfld = e;}
               reqmsg += msg;
               errcount++
           }

           msg = checkcond(form, e);

           if (msg != ""){
               if (errcount == 0) { fstfld = e;}
               condmsg += msg;
               errcount++
           }

       }

       if(document.Cargo_Update){ var num1; var num2;

         if(

            (hasChar(form.pcs1.value) && hasChar(form.tpcs1.value) && (( num1 = form.pcs1.value - 0) > (num2 = form.tpcs1.value - 0)) ) ||
            (hasChar(form.pcs2.value) && hasChar(form.tpcs2.value) && (( num1 = form.pcs2.value - 0) > (num2 = form.tpcs2.value - 0)) ) ||
            (hasChar(form.pcs3.value) && hasChar(form.tpcs3.value) && (( num1 = form.pcs3.value - 0) > (num2 = form.tpcs3.value - 0)) ) ||
            (hasChar(form.pcs4.value) && hasChar(form.tpcs4.value) && (( num1 = form.pcs4.value - 0) > (num2 = form.tpcs4.value - 0)) ) ||
            (hasChar(form.pcs5.value) && hasChar(form.tpcs5.value) && (( num1 = form.pcs5.value - 0) > (num2 = form.tpcs5.value - 0)) ) ||
            (hasChar(form.pcs6.value) && hasChar(form.tpcs6.value) && (( num1 = form.pcs6.value - 0) > (num2 = form.tpcs6.value - 0)) ) ||
            (hasChar(form.pcs7.value) && hasChar(form.tpcs7.value) && (( num1 = form.pcs7.value - 0) > (num2 = form.tpcs7.value - 0)) ) ||
            (hasChar(form.pcs8.value) && hasChar(form.tpcs8.value) && (( num1 = form.pcs8.value - 0) > (num2 = form.tpcs8.value - 0)) ) ||
            (hasChar(form.pcs9.value) && hasChar(form.tpcs9.value) && (( num1 = form.pcs9.value - 0) > (num2 = form.tpcs9.value - 0)) )    ){
              invmsg += "- Pieces must be less than Total Pieces\n";
         }

         for(var k = 1; k < 11 && errcount < 11; k++) {
           if ((getLstVal(form, "shp" + k) == "T") && getFldVal(form, "pcs" + k) != null &&
              ((num1 = getFldVal(form, "pcs" + k) - 0) != (num2 = getFldVal(form, "tpcs" + k) - 0))){
             invmsg += "- If Ship Code is Total(" + k + ") -  Pieces must be equal to Total Pieces\n";
           }
           if ( ( getLstVal(form, "shp" + k) == "P") && getFldVal(form, "pcs" + k) != null &&
              !(( num1 = getFldVal(form, "pcs" + k) - 0) < (num2 = getFldVal(form, "tpcs" + k) - 0))){
             invmsg += "- If Ship Code is Partial(" + k + ") -  Pieces must be less than Total Pieces\n";
           }
         }
       }

       if (invmsg || reqmsg || condmsg) {
          var $Alertmsg = '';
          if  (invmsg) {
              $Alertmsg += "Invalid Fields:\n" + invmsg + "\nPlease enter new values for these fields.\n"
          }
          if (reqmsg) {
              $Alertmsg += "\nRequired Fields:\n" + reqmsg + "\nPlease enter values for these fields.\n"
          }
          if (condmsg){
              $Alertmsg += "\nConditional Fields:\n" + condmsg + "\nPlease correct these related fields.";
          }

          alert ($Alertmsg);
          if (errcount != 0){
		if (fstfld.type!="hidden") {
	            fstfld.focus();
		    if (fstfld.type!="select-one") {
		            fstfld.select();
		    }
		}
          }
          return false;
       }
        return true
}

function init_form(f){


 if (!init_done)  {init_attr(f);}
 if (document.Cargo_Update) {init__attr(f);}
 
 
 for(var i = 0; i < f.elements.length; i++) {
    var e = f.elements[i];
    if ((e.type == "text") || (e.type == "textarea") || (e.type == "hidden")){
        if (e.value == "" && e.aVal && e.aVal != "") {e.value = e.aVal;}
    }
    else {
      if ((e.type == "select-one")) {
         if (e.aVal) {
           for (var j=0; j < e.length; j++){
            if (e.options[j].value == e.aVal){
                      e.options[j].selected = true;}
           }
         }
      }
    }
  }
 return true;
}

function add_attr(f ,  Req, Typ, Rpt, Min, Max, Flags) {
 if (f) { if (Req != "" )  { f.aReq = Req;}
          if (Typ != ""  ) { f.aTyp = Typ;}
          if (Rpt != ""  ) { f.aRpt = Rpt;}
          else             { f.aRpt = f.name}
          if (Min != ""  ) { f.aMin = Min;}
          if (Max != ""  ) { f.aMax = Max;}
          if (Flags != "") {
               if (Flags.match(/u/i)) {f.aUp = 1;}
               if (Flags.match(/s/i)) {f.aStr = 1;}
          }
          if (Typ != ""  ) { f.aRe  = createRe(f.aTyp);}

 }
 return;
}
function add_dflt(f , Dflt, Val) {
 if (f) { if (Dflt != ""  ) { f.aDft = Dflt;}
          if (Val  != ""  ) { f.aVal = Val ;} }
 return;

}

