//
//  Library containing CSFmt object
//
//  Author: Giles Mullen
//  Date:   08/24/2001
//
//  Requires: CS00_Lib_<Language> (i.e. CS00_Lib_English)
//            CS25_Lib_CSErr
//            CS30_Lib_CSDate
//            CS30_Lib_CSNum
//            CS30_Lib_CSTempl
//            CS30_Lib_CSTxt
//

//
//    CSFmt
//

CSFmt.ERR_FAM               = 0x8000;

CSFmt.ERR_INVLDFMTTYPE      = CSFmt.ERR_FAM | 0x0001;
CSFmt.ERR_INVLDFMTOBJ       = CSFmt.ERR_FAM | 0x0002;

//
//    move to CS00_Lib_English
//
CSFmt.ERR_INVLDFMTTYPE_STR  = CS_CSFMT_ERR_INVLDFMTTYPE_STR;
CSFmt.ERR_INVLDFMTOBJ_STR   = CS_CSFMT_ERR_INVLDFMTOBJ_STR;

function CSFmt_getErrStrStat( err )
{
  var ret = CSErr.ERR_UNDEFINED_STR;
  if (err.no == CSFmt.ERR_INVLDFMTTYPE)
    ret = CSFmt.ERR_INVLDFMTTYPE_STR;
  else if (err.no == CSFmt.ERR_INVLDFMTOBJ)
    ret = CSFmt.ERR_INVLDFMTOBJ_STR;
  return ret;
}

function CSFmt_getErrStr( o )
{
  var ret = CSErr.ERR_UNDEFINED_STR;
  do {
    if (o == null || o.err == null)
      break;
    var e = o.err;
    var fam = e.no & 0xF000;
    if (fam == CSErr.ERR_FAM) {
      ret = CSErr.getErrorString( e );
    } else if (fam == CSTxt.ERR_FAM) {
      ret = CSTxt.getErrorString( e );
    } else if (fam == CSDate.ERR_FAM) {
      ret = CSDate.getErrorString( e );
    } else if (fam == CSNum.ERR_FAM) {
      ret = CSNum.getErrorString( e );
    } else if (fam == CSTempl.ERR_FAM) {
      ret = CSTempl.getErrorString( e );
    } else if (fam == CSFmt.ERR_FAM) {
      ret = CSFmt.getErrorString( e );
    }
  } while (false);
  return ret;
}

function CSFmt_format( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    switch (o.fmt) {
      case "txt":
        CSFmt_fmttxt( o );
        break;
      case "dt":
        CSFmt_fmtdt( o );
        break;
      case "nmbr":
        CSFmt_fmtnmbr( o );
        break;
      case "tmpl":
        CSFmt_fmttmpl( o );
        break;
      default:
        o.err = new CSErr( CSFmt.ERR_INVLDFMTTYPE );
        break;
    }
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_validate( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null) {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;
    }
    switch (o.fmt) {
      case "txt":
        ret = CSFmt_vldtxt( o );
        break;
      case "dt":
        ret = CSFmt_vlddt( o );
        break;
      case "nmbr":
        ret = CSFmt_vldnmbr( o );
        break;
      case "tmpl":
        ret = CSFmt_vldtmpl( o );
        break;
      default:
        o.err = new CSErr( CSFmt.ERR_INVLDFMTTYPE );
        break;
    }
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_charsValid( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;
    switch (o.fmt) {
      case "txt":
        ret = CSFmt_chsvtxt( o );
        break;
      case "nmbr":
        ret = CSFmt_chsvnmbr( o );
        break;
      case "dt":
      case "tmpl":
        o.err = new CSErr( CSErr.ERR_SUCCESS );
        break;
      default:
        o.err = new CSErr( CSFmt.ERR_INVLDFMTTYPE );
        break;
    }
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_evldt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    o.err = new CSErr( CSErr.ERR_UNDEFINED );
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (o.fmt == null || o.fmtdt == null || o.fmtdt.tmpl == null) {
      o.err = new CSErr( CSFmt.ERR_INVLDFMTOBJ );
      break;
    }
    var dt = o.fmtdt;
    if (r.idt == null)
      r.idt = new CSDate();
    if (r.ta == null)
      r.ta = r.idt.parseTemplate( dt.tmpl );
    if (r.ta == null) {
      o.err = r.idt.err;
      break;
    }
    if (r.rgx == null)
      r.rgx = r.idt.buildRegExp( r.ta );
    if (r.rgx == null) {
      o.err = r.idt.err;
      break;
    }
    r.ival = r.idt.evaluate( r.rgx, r.ta, o.uval );
    if (r.ival == null) {
      o.err = r.idt.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_fmtdt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;
    o.uval = CSFmt_RplTrlWS( o.uval );
    if (o.uval == "") {
      o.dval = "";
      o.dvalex = new Array();
      o.dvalex[0] = "";
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    CSFmt_evldt( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.idt.err;
      break;
    }
    var dv = r.idt.format( r.ival, r.ta );
    if (dv == null) {
      o.err = r.idt.err;
      break;
    }
    o.dval = dv[0];
    o.dvalex = dv;     
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_vlddt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;
    o.uval = CSFmt_RplTrlWS( o.uval );
    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    CSFmt_evldt( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.idt.err;
      break;
    }
    if ( typeof( r.imnv ) == "undefined")
      r.imnv = o.fmtdt.mnv == null ? null : new CSDate( o.fmtdt.mnv );
    if ( typeof( r.imxv ) == "undefined")
      r.imxv = o.fmtdt.mxv == null ? null : new CSDate( o.fmtdt.mxv );
    if (!r.idt.validateRange( r.ival, r.imnv, r.imxv, r.ta )) {
      o.err = r.idt.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_evlnmbr( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    o.err = new CSErr( CSErr.ERR_UNDEFINED );
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (o.fmt == null || o.fmtnmbr == null) {
      o.err = new CSErr( CSFmt.ERR_INVLDFMTOBJ );
      break;
    }
    var fn  = o.fmtnmbr;
    r.ics   = fn.cs   == null ? ""    : fn.cs;
    r.ids   = fn.ds   == null ? "."   : fn.ds;
    r.iss   = fn.ss   == null ? ""    : fn.ss;
    r.idp   = fn.dp   == null ? 2     : fn.dp;
    r.iapp  = fn.app  == null ? false : fn.app;

    if (r.ifn == null)
      r.ifn = new CSNum();

    r.ival = r.ifn.evaluate( o.uval, r.ics, r.ids, r.iss, r.idp, r.iapp )
    if (r.ival == null) {
      o.err = r.ifn.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_fmtnmbr( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == "") {
      o.dval = "";
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    CSFmt_evlnmbr( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.ifn.err;
      break;
    }
    var dv = r.ifn.format( r.ival, r.ics, r.ids, r.iss, r.idp, r.iapp );
    if (dv == null) {
      o.err = r.ifn.err;
      break;
    }
    o.dval = dv;
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_vldnmbr( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    CSFmt_evlnmbr( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.ifn.err;
      break;
    }
    if (!r.ifn.validateRange( r.ival, o.fmtnmbr.mnv, o.fmtnmbr.mxv, 
                              r.ics, r.ids, r.iss, r.idp, r.iapp ))
    {
      o.err = r.ifn.err;
      break;
    }
    if (o.fmtnmbr.mxcl != null && o.fmtnmbr.mxcl > 0) {
      var dv = r.ifn.format( r.ival, r.ics, r.ids, r.iss, r.idp, r.iapp );
      if (dv == null) {

        o.err = r.ifn.err;
        break;
      }
      if (r.itxt == null)
        r.itxt = new CSTxt();
      if (!r.itxt.validate( dv, null, o.fmtnmbr.mxcl, true )) {
        o.err = r.itxt.err;
        break;
      }
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_chsvnmbr( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null || o.fmtnmbr == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (r.itxt == null)
      r.itxt = new CSTxt();
    if (!r.itxt.charsValid( o.uval, o.fmtnmbr.ac )) {
      o.err = r.itxt.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_evltmpl( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    o.err = new CSErr( CSErr.ERR_UNDEFINED );
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (o.fmt == null || o.fmt == null || o.fmttmpl.tmpl == null) {
      o.err = new CSErr( CSFmt.ERR_INVLDFMTOBJ );
      break;
    }
    var t = o.fmttmpl;
    if (r.it == null)
      r.it = new CSTempl();
    if (r.ta == null)
      r.ta = r.it.parseTemplate( t.tmpl );
    if (r.ta == null) {
      o.err = r.it.err;
      break;
    }
    if (r.rgx == null)
      r.rgx = r.it.buildRegExp( r.ta );
    if (r.rgx == null) {
      o.err = r.it.err;
      break;
    }
    r.ival = r.it.evaluate( r.rgx, r.ta, o.uval );
    if (r.ival == null) {
      o.err = r.it.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_RplTrlWS( str )
{
  var r = "";
  if (typeof( str ) == "string")
    r = str.replace( /\s*$/, "" );
  return r;
}

function CSFmt_fmttmpl( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;
    o.uval = CSFmt_RplTrlWS( o.uval );
    if (o.uval == "") {
      o.dval = "";
      o.dvalex = new Array();
      o.dvalex[0] = "";
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    CSFmt_evltmpl( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.it.err;
      break;
    }
    var dv = r.it.format( r.ival, r.ta );
    if (dv == null) {
      o.err = r.it.err;
      break;
    }
    o.dval = dv[0];
    o.dvalex = dv;     
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_vldtmpl( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    o.uval = CSFmt_RplTrlWS( o.uval );
    CSFmt_evltmpl( o );
    var r = o.rsvd;
    if (r.ival == null) {
      o.err = r.it.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_fmttxt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null || o.uval == "") {
      o.dval = "";
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (r.itxt == null)
      r.itxt = new CSTxt();
    var dv = r.itxt.format( o.uval, o.fmttxt.cc );
    if (dv == null) {
      o.err = r.itxt.err;
      break;
    }
    o.dval = dv;
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_vldtxt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null)
      return CSFmt.ERR_INVLDFMTOBJ;
    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (r.itxt == null)
      r.itxt = new CSTxt();
    if (!r.itxt.validate( o.uval, o.fmttxt.mncc, o.fmttxt.mxcc )) {
      o.err = r.itxt.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt_chsvtxt( o )
{
  var ret = CSErr.ERR_UNDEFINED;
  do {
    if (o == null || o.fmttxt == null)
      return CSFmt.ERR_INVLDFMTOBJ;

    if (o.uval == null || o.uval == "") {
      o.err = new CSErr( CSErr.ERR_SUCCESS );
      break;      
    }
    if (o.rsvd == null)
      o.rsvd = new Object();
    var r = o.rsvd;
    if (r.itxt == null)
      r.itxt = new CSTxt();
    if (r.ac == null) {
      r.ac = CSTxt.buildAllowedChars( o.fmttxt.acm );
      if (o.fmttxt.ac != null)
        r.ac += o.fmttxt.ac;
    }
    if (!r.itxt.charsValid( o.uval, r.ac, o.fmttxt.acm )) {
      o.err = r.itxt.err;
      break;
    }
    o.err = new CSErr( CSErr.ERR_SUCCESS );
  } while (false);
  ret = o.err.no;
  return ret;
}

function CSFmt()
{
}

CSFmt.format         = CSFmt_format;
CSFmt.validate       = CSFmt_validate;
CSFmt.charsValid     = CSFmt_charsValid;
CSFmt.getErrStr      = CSFmt_getErrStr;
CSFmt.getErrorString = CSFmt_getErrStrStat;
